プロが教える店舗&オフィスのセキュリティ対策術

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を保持する形にしたいのですが、何か用意方法はないでしょうか?

※データベースはマーケティング用のもので通常の商品管理とは少し用途が違います。

A 回答 (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)
    • good
    • 0

    strSQL = Replace(strSQL, 'ZZ', Trim(Str(I)))



は、ミスです。
コピペして修正するのを忘れていました。
ただ、どのようであるかは質問からは不明。
適当に適正化されてください。
    • good
    • 0

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行目になって最後が追加されるという感じ。
伝票行などではこういう処理が必須ですので、それに準じたやり方でも良いと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!