Microsoft Access 掲示板

更新クエリでエラー

12 コメント
views

いつも有用に拝見させていただいています。

客先からの指定納期を、受注データに反映させたいと思っています。
指定納期を格納したテーブル T_指定日インポートと、
全ての受注データをためこんだクエリ Q_手配内訳2を、
発注番号フィールドで結合させました。

Q_手配内訳2の、予定1、製造オーダーフィールドを更新させたいのですが、
プロシージャ呼び出しが正しくありません
と表示されてしまい、実行できません。

Q_手配内訳2の発注番号フィールドは実データではなく、下記のようにあるフィールドから特定の条件に基づいて創出したフィールドになります。

発注番号: IIf(Left([機種],1)<>"○",IIf(Left([注文番号],1)="B",Mid([注文番号],2,InStr(12,[注文番号],"-",0)-2),Left([注文番号],InStr(11,[注文番号],"-",0)-1)),[注文番号])

このようなフィールドで結合した選択クエリを用いた更新クエリは行えないのでしょうか。
なお、選択クエリは正しく表示されています。

かーか
作成: 2025/07/10 (木) 11:11:21
最終更新: 2025/07/10 (木) 11:30:34
通報 ...
1
かーか 2025/07/10 (木) 11:12:38 843fa@63c3a

画像1

2
りんご 2025/07/10 (木) 21:46:23 935bc@0e907

発注番号フィールドは実データではなく、下記のようにあるフィールドから特定の条件に基づいて創出したフィールドになります。

 実データで持たせればいいんじゃないですか?T_指定日インポートの発注番号が実データになっているから。
 または、T_指定日インポートに注文番号を追加して、注文番号で結合するのはどうでしょう?

3
hiroton 2025/07/11 (金) 10:46:28 81690@f966d

発注番号がなにかエラーになっているようなレコードはないですか?

4
かーか 2025/07/11 (金) 16:43:03 d4638@63c3a

皆さま、アドバイスありがとうございます。このフィールドは最近追加したフィールドで、過去レコードにはデータが存在していません。手早く全部にデータを発生させるために式を使いましたが、りんごさんのおっしゃるとおり、結局実データを持つことにしました。そうしたらきちんと更新クエリが機能しました。
ただし、式を用いたフィールドをリレーションシップさせた場合に更新クエリが使えないのか、という疑問は残ったままです。

5

式を用いたフィールドをリレーションシップさせた場合に更新クエリが使えないのか

hiroton さんが指摘されているように、演算フィールド[発注番号]がエラー値を
返しているレコードが[Q_手配内訳2]に 1 件以上含まれている可能性が最も高いでしょう。

更新クエリに限らず、いずれかのレコードにおいてエラー値が返されている
演算フィールドを内部結合/外部結合のキーとして使用することは出来ません。
エラー値はあらゆるデータ型と一致しないからです。

Mid([注文番号],2,InStr(12,[注文番号],"-",0)-2)

  • 上記の式において InStr 関数の戻り値が 0 または 1 だった場合、その値から 2 を減じた結果( -2 または -1 )が Mid 関数の第 3 引数 Length に渡されることになる。

  • Mid 関数の第 3 引数 Length に負の整数を渡すことは出来ない(よって件のエラーが発生する)。

  • [注文番号]の値の 12 文字目以降に "-" が含まれていた場合、上記の InStr 関数の戻り値はその位置を示す 12 以上の整数となる( 1 ~ 11 になることはない)。

  • したがって、上記の InStr 関数の戻り値が 1 以下になるのは、[注文番号]の値の 12 文字目以降に "-" が含まれていない(戻り値が 0 である)場合である。

Left([注文番号],InStr(11,[注文番号],"-",0)-1)

  • 上記の式において InStr 関数の戻り値が 0 であった場合、その値から 1 を減じた結果( -1 )が Left 関数の第 2 引数 Length に渡されることになる。

  • Left 関数の第 2 引数 Length に負の整数を渡すことは出来ない(よって件のエラーが発生する)。

  • [注文番号]の値の 11 文字目以降に "-" が含まれていた場合、上記の InStr 関数の戻り値はその位置を示す 11 以上の整数となる( 1 ~ 10 になることはない)。

  • したがって、上記の InStr 関数の戻り値が 0 になるのは、[注文番号]の値の 11 文字目以降に "-" が含まれていない場合である。
     
    また、いずれの式についても InStr 関数の第 4 引数 Compare に 0 を渡している(=バイナリ比較方式となる)ため、半角文字の "-" と全角文字の "-" は明確に区別され、検索対象となるのは前者の文字のみとなります。

なお、選択クエリは正しく表示されています。

よって、今のところは「[Q_手配内訳2]が返した全てのレコードの[注文番号]および[発注番号]の値を再度確認して下さい」としか申し上げられません。
InStr 関数によって "-" が見つからなかった場合の扱いが不明ですし。

6
名前なし 2025/07/15 (火) 17:52:58 73cf0@63c3a

sk様

的確なご指摘ありがとうございます。
確かに "-" が見つからなかった場合の扱いは設定されておらず、結果演算フィールドは空のままです。
私はこれがエラーと認識できていなかったのが現実です。
選択クエリでデータシートが表示されていたので、大丈夫なものと思い込んでいました。
ある特定のフォーマットの注文番号だけ処理できていればそれでよかったので、浅はかでした。

今回は大変勉強になりました。
全ての条件でデータを発生させることができない演算フィールドの扱いには注意したいと思います。
皆さま、ご回答ありがとうございました。

8
sk 2025/07/16 (水) 09:24:20 修正 88328@64ac3 >> 6

確かに "-" が見つからなかった場合の扱いは設定されておらず、結果演算フィールドは空のままです。

演算フィールド[発注番号]が Null を返している場合については問題ないはずです。

IIf(Left([機種],1)<>"○",IIf(Left([注文番号],1)="B",Mid([注文番号],2,InStr(12,[注文番号],"-",0)-2),Left([注文番号],InStr(11,[注文番号],"-",0)-1)),[注文番号])

hiroton さんと私が指摘しているのは、[発注番号]が以下のような結果を返しているレコードが
[Q_手配内訳2]に 1 件以上含まれていないか、ということです。

画像1

  • [機種]の値が "○" でも Null でもなく、かつ次に示すいずれかの条件に該当する。
  1. [注文番号]の値が Null である(結果、Left 関数の第 2 引数に Null が渡されてエラーが発生する)。

  2. [注文番号]の値の最初の 1 文字が "B" ではなく、かつ 11 文字目以降に "-" が含まれていない(結果、Left 関数の第 2 引数に -1 が渡されてエラーが発生する)。

  3. [注文番号]の値の最初の 1 文字が "B" であり、かつ 12 文字目以降に "-" が含まれていない(結果、Mid 関数の第 3 引数に -2 が渡されてエラーが発生する)。

上記のケースに該当する場合に、エラー値が返されないように[発注番号]の式を組み直すか、[注文番号]の値を適切なものに書き換えるか、もしくは該当するレコード自体が[Q_手配内訳2]の結果に含まれないようになされば、[Q_手配内訳2]と[T_指定日インポート]を[発注番号]同士で結合できるようになるでしょう。

7
かーか 2025/07/15 (火) 17:54:05 73cf0@63c3a

上記の投稿は私です。名前入れるの忘れました。

10
かーか 2025/07/16 (水) 17:46:47 58908@63c3a

再びのご指摘ありがとうございます。
全てのレコードについて見直しましたら、ありました、ありました。
ご指摘の2番目、11文字目以降に"-"が含まれていない注文番号のデータがありました。
私の式が適切ではなく、条件に合致しないものがありました。
sk様、今回はご丁寧な解説ありがとうございました。
大変勉強になりました。
また、よろしくお願いいたします。

11
かーか 2025/07/16 (水) 18:00:38 58908@63c3a

画像1

12
かーか 2025/07/16 (水) 18:02:14 58908@63c3a

エラー行を全て削除し、更新クエリを実行したら、きちんと行えました。
誠にありがとうございました。