• ベストアンサー

ACCESS 参照合性?

ACCESSでデータベースを作成したのですが、 どうにも使いにくくて困っています。 一つの主なIDに対して必ず10品の決まった商品枠を作りたいのですが 主ID_商品ID_商品比率 のようにテーブルを作成すると、例えば主ID10に対して入力ミス等で、 10品の項目がなければならない所9品のIDしかテーブルにない状態が出来てしまいます。 主ID_商品ID_商品比率 10_1_50 10_2_50 10_3_0 10_4_0 10_5_0 10_6_0 10_7_0 10_8_0 10_10_0 (商品9が抜けている状態) このようなことを防ぐために一つの主IDに対してかならず商品ID1~10を保持する形にしたいのですが、何か用意方法はないでしょうか? ※データベースはマーケティング用のもので通常の商品管理とは少し用途が違います。

質問者が選んだベストアンサー

  • ベストアンサー
  • noah7150
  • ベストアンサー率46% (116/251)
回答No.3

足らないレコードを追加するクエリーを流しましょう たとえば書かれてるテーブルを 比率TBL(主ID,商品ID,商品比率) 商品が入っているテーブルを 商品TBL(商品ID)とします INSERT INTO 比率TBL(主ID,商品ID,商品比率) SELECT TBLA.主ID,TBLA.商品ID,0 FROM (SELECT DISTINCT 比率TBL.主ID,商品TBL.商品ID FROM 比率TBL, 商品TBL WHERE 商品TBL.商品ID BETWEEN 1 AND 10) AS TBLA WHERE NOT EXISTS(SELECT * FROM 比率TBL AS TBLB WHERE TBLA.主ID = TBLB.主ID AND TBLA.商品ID = TBLB.商品ID)

その他の回答 (2)

noname#140971
noname#140971
回答No.2

    strSQL = Replace(strSQL, 'ZZ', Trim(Str(I))) は、ミスです。 コピペして修正するのを忘れていました。 ただ、どのようであるかは質問からは不明。 適当に適正化されてください。

noname#140971
noname#140971
回答No.1

1、自動発生させる。 2、中途削除があればリナンバー機能も必要。 Const conIDINSERTSQL="INSERT・・・・'XX_YY_ZZ'" Private Sub XXXXXXXXXXXXX()   Dim isOK  As Boolean   Dim I   As integer   Dim strSQL AS String   For I=1 To 10     strSQL = Replace(conIDINSERTSQL,'XX', 主ID)     strSQL = Replace(strSQL, 'YY', Trim(Str(I)))     strSQL = Replace(strSQL, 'ZZ', Trim(Str(I)))     isOK=XXXExecute(strSQL)     If Not isOK Then   MsgBox "続行不能の致命的エラーが発生しましたので処理を中断します!"       Exit For     End If   Next I   End Sub XXXExecute(SQL文)は、DoCmd.SQL でも良いとおもいますが関数化した方がスッキリすると思います。 自動発生するのは、こんな感じでよいと思います。 リナンバー機能は、順次に読み込んで更新・追加することになると思います。 3行目を削除したら、4行目が3行目になって5行目が4行目になって最後が追加されるという感じ。 伝票行などではこういう処理が必須ですので、それに準じたやり方でも良いと思います。

関連するQ&A