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

アクセスでテーブルの空白テーブルの空白を指定した数字に置換するボタンが作りたいです。
テーブルが見積書明細です。見積書明細に見積書IDを割り振っています。
見積書IDが空白の時、指定した数字に置換したいのですが、下記エラーが出てしまいます。
実行時エラー 3075
クエリ式awhere 見積書ID is null の構文エラー 演算子が有りません

下記コードです。

Private Sub コマンド232_Click()

Dim db As DAO.Database
Dim vsql As String
Dim a As Variant

a = 10

vsql = "update T見積書明細 "
vsql = vsql & " set 見積書ID=a"
vsql = vsql & "where 見積書ID is null"

Set db = CurrentDb
db.Execute vsql, dbFailOnError
db.Close

End Sub

空白の標記方法を直せばよいと思うのですがうまくいきません。
どうすれば直りますでしょうか?
よろしくお願いします!

A 回答 (4件)

まず私は、サブフォームを使ったことがありませんので、リレーション(自動で作成さてれる?)がどうなっているのかが想像つかないので、明確な回答がしづらい状況です。



ここから先は憶測ですので、現状とかけ離れているのであれば、無視していただいたほうが、混乱を招かないかもしれません。基本的には、インデックスとなるフィールドの値(ID等)は、データを作成するときに同時に挿入しておくべきものです。

元のテーブル(見積?)のIDは、サブフォームのテーブル(見積もり明細?)に、見積IDとして入っているべきで、1:他ということで、別にID(明細ID)を設定すべき内容と思います。

顧客テーブル
[顧客ID],[顧客名],[カナ],・・・

見積テーブル
[見積ID],[顧客ID],[発行日],・・・

明細テーブル
[見積ID],[明細ID],[物品ID],[個数],・・・

ざっくばらんに言うと上記のような感じですかね。
リレーションは双方の[見積ID]に張ってあればよいわけで、[明細ID]と関連付ける必要もありませんし、個別の見積もりごとに1,2,3とつけて行っても良いですし、ぶっちゃけオートナンバーであっても問題はありません(明細書の品目の表示順に関してあとから入れ替えたいなどのこだわりがないのであれば)。

あまりお助けになれなくて申し訳ありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

お話頂いている内容で間違いございません。
少ない情報の中ご回答頂きありがとうございます。

通常入力する際は見積テーブル、明細テーブル両方ともIDが挿入されるようになっています。
ただ、今試しているやりたい動作がフォーム、サブフォームの複製で、新しいレコードに新しいIDを振りながらフォーム、サブフォームのコピペです。
サブフォームのコピペ→新しいIDの番号取得、サブフォームデータにID入力→フォームのコピペ の流れで作っています。
今回は上記流れの中のサブフォームデータにID入力をするにはどうするかが分からずに質問に至りました。
やっていくうちにリレーションの話にまでなってしまいややこしくて申し訳ないです…

もともとおっしゃるように見積テーブルの見積ID=明細テーブルの見積IDで作っていたのですが、名前が同じことでエラーが起きたので別々にしていました。
本当は同じ方が分かりやすくて良いのですが、それでは動作しなかったことがあり今の状態に落ち着いています。

とんでもないです!つたない質問に丁寧に対応していただきありがとうございます!

お礼日時:2022/07/08 15:39

maxnumber に何らかの数値を設定してください。

    • good
    • 0
この回答へのお礼

失礼しました!

Do Until rs.EOF = True
If rs!見積ID > maxnumber Then
maxnumber = rs!見積ID
End If
rs.MoveNext
Loop

今までの見積書IDはサブフォームで表示させていて、フォームの見積IDの最大値+1の値を見積書IDに反映させたくて今回の質問をしました。
今回教えて頂いた内容を踏まえて確認したところ、エラーが出てしまいました。
リレーションシップが設定されたレコードが必要なので、レコードの追加や変更を行うことができませんと出てきます。
見積IDが一、見積書IDが多のリレーションシップを組んでいます。
どう直せばよいでしょうか?
質問とずれてしまい申し訳ありません。よろしくお願いします。

お礼日時:2022/07/08 14:18

変数に対応させるためのものです。



もともとの形だと、SQL文は、
... set 見積書ID = a where ...
となってしまいますが、

見積書IDのデータ型が数値の場合は、
... set 見積書ID = 1 where ...
文字列の場合は、
... set 見積書ID = ’1’ where ...
となるべきです。

変数aの値を変えれば、SQL文も応じて変わるようになっています。
    • good
    • 1
この回答へのお礼

ご返信ありがとうございます!
ご回答を参考に変数に直してやってみたのですが上手くいかず…
エラーは出ないのですが、動作もしない状態です。
aの値が上手く取得できてないのかと思いメッセージボックスの表示をさせてみたのですが、こちらは正しく表示されました。
IDは数字としてみていますが、文字列で試してもダメでした。

Dim vsql As String
Dim a As Variant
Dim maxnumber As Integer

a = maxnumber + 1

MsgBox a

vsql = "update T見積書明細 "
vsql = vsql & " set 見積書ID=" & a
vsql = vsql & "where 見積書ID is null"

a =10の時はうまく動作したのですが上記だとダメでした。
どうすれば修正できるでしょうか?

お礼日時:2022/07/08 12:20

" set 見積書ID=a"



ID が数値なら、
" set 見積書ID=" & a

文字列なら
" set 見積書ID=’" & a & "'"

SQL実行する前に、debug.print vsql などして、SQL分を確認されるとよいかと思います。
    • good
    • 1
この回答へのお礼

早速のご回答ありがとうございます!
もう一つお聞きしたいです。
質問ではa=10としましたが、a = 変数の場合標記の仕方が異なるのでしょうか?

お礼日時:2022/07/08 11:48

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