- ベストアンサー
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を保持する形にしたいのですが、何か用意方法はないでしょうか? ※データベースはマーケティング用のもので通常の商品管理とは少し用途が違います。
- みんなの回答 (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)
strSQL = Replace(strSQL, 'ZZ', Trim(Str(I))) は、ミスです。 コピペして修正するのを忘れていました。 ただ、どのようであるかは質問からは不明。 適当に適正化されてください。
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行目になって最後が追加されるという感じ。 伝票行などではこういう処理が必須ですので、それに準じたやり方でも良いと思います。