パソコンのトラブル、インターネットのトラブル、中古パソコンの購入など、自分の体験した物から、調べたことをまとめています。

TopAccess【ACCESS】追加クエリ 追加されるレコードが多すぎる

【ACCESS】追加クエリ 追加されるレコードが多すぎる

今どういう事をやっているかというと、デザイナーの作った作品を管理するシステムを作っています。 illustratorなどの作品データとそれに使った素材のデータとその保存場所などをテーブルに保存していきます。

保存場所がパソコン内のドライブであったり、外付けハードディスクだったり、DVDだったりするのですが、これを1つずつキーボードで文字入力するのは面倒です。(面倒なシステムは使わなくなります。)しかも、ドライブやディスクには複数の作品データが保存されるので重複するデータになります。

だから、保存場所マスタを作成し、そこから保存場所のデータを引っ張ってきて入力しようとしています。

単純に結合させなかったのは、1つの作品データが複数の場所に保存される場合があるので、作品テーブルと保存場所マスタはリレーションシップを結びませんでした。
別に保存場所テーブルを作成し、そこに作品データ番号のフィールドを儲けこれを外部キーにして、作品データと結合します。
これで、1つの作品に複数の保存場所があることを記録できます。
しかし、作品データを入力する際に保存場所も入力するのですが、保存場所マスタのレコードを作品入力フォーム内にリストボックスで表示します。
リストから、保存場所を選択し、コマンドボタンをクリックしたら、保存場所サブフォームに値が代入できるようにします。既に保存場所マスタにデータがあるときはいいですが、ない場合は新しく入力しなければなりません。
保存場所マスタの入力フォームを作って、それを開いて入力するのは面倒です。だから、リストボックスの下に保存場所のデータを仮表示する非連結のテキストボックスを作って、リストボックスをクリックするとそこに一旦値が代入されるようにします。
リストに保存場所がない場合は、仮のテキストボックスの値を書き換えます。その後、コマンドボタンをクリックします。コマンドボタンをクリックイベントプロシージャを作成します。

Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strCriteria As String
Dim NewData As String, Response As Integer

Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset '保存場所マスタテーブルのレコードセットを作ります。
rs.Open "保存場所マスタ", cnn, adOpenKeyset, adLockOptimistic     
'仮のテキストボックスに代入された値と同じレコードが保存場所マスタに存在するか調べます。
rs.Find "種別='" & Me!テキスト11 & "'"
rs.Find "ドライブ名='" & Me!テキスト12 & "'"
rs.Find "フォルダ名='" & Me!テキスト13 & "'"

If rs.EOF Then ' レコードがない場合の処理です 'メッセージボックスを表示します。    
  MsgBox "該当レコードが見つかりません" & _ "新規に登録し保存しますか?"
  '既定のメッセージを表示せずに処理を継続します。
   Response = acDataErrContinue
    If 1 = MsgBox(strmsg, 17) Then 'メッセージボックスで「はい」を選択した場合の処理です
      '警告メッセージを無効にします。
      DoCmd.SetWarnings False '新規語句を追加するクエリ。
      DoCmd.OpenQuery "保存場所追加クエリ" 'ここで使う追加クエリがうまくいかない
      '警告メッセージを有効に戻します。
      DoCmd.SetWarnings True
      MsgBox "登録が完了しました。"
      Me!リスト保存場所.Requery
      'この後保存場所サブテーブルに新規登録した値を代入できるようにしたいけど、まだ出来てません。
     End If
      Response = acDataErrAdded Else
       '保存場所マスタにレコードがある場合、つまり仮テキストボックスの値を変更しなかった場合
      '保存場所サブフォームの新規レコードに値を代入します。
      Me!保存場所C.Form!保存場所番号 = Me!リスト保存場所.Column(3)
     End If
     rs.Close: Set rs = Nothing
     cnn.Close: Set cnn = Nothing

うまくいかない追加クエリについてはここが参考になるhttp://penhagi.com/access/ota2003/3162.htm

投稿日:2007年04月12日|カテゴリー:Access このエントリーをはてなブックマーク

関連記事はカテゴリー・アーカイブから→ カテゴリー「Access」のアーカイブ
追記1

レコードセットを作ったんだから、クエリなんか使わずに、
AddNewメソッドとUpdateメソッドを使ったほうが早い。
訂正線部は以下のように修正

rs.AddNew
rs!種別 = Me!テキスト11
rs!ドライブ名 = Me!テキスト12
rs!フォルダ名 = Me!テキスト13
rs.Update

Sponcerd Link

免責事項

当サイトに掲載されている情報に関しては、正確な情報になるよう細心の注意を払っておりますが、その信用性、正確性、妥当性等について保証するものではありません。当サイトおよびそのリンク先のサイトに掲載されている情報等により生じたトラブル並びに被った損害については、当サイトは一切の責任を負いかねます。