現在、「送付状作成ボタン」を押すと
「案件テーブル」の今月分の一部フィールドを「送付状テーブル」に追加する追加クエリを作っており、「送付状フォーム」では今月分のデータのみ表示されるようにしています。
その際、「送付状テーブル」の「案件ID」にインデックスをつけて
データが被らないようにしています。
しかし、毎回ボタンを押すたびに追加クエリのメッセージ(追加クエリで全てのデータを追加できません・・・・といった内容)がでるのがユーザーを不安にさせると思っています。
このメッセージを表示させないために、何かいい方法はありませんでしょうか?
メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう
メッセージそのものを出したくないのならメッセージ表示の設定を切り替えればいいです
オブジェクトの削除とアクションクエリの確認メッセージを有効または無効にする
早速のご回答ありがとうございます。
①>メッセージの内容が不安なら追加クエリできちんと追加できるデータだけに絞り込めばいいでしょう
おっしゃるとおりで、そうしたいと思っていたのですがうまくできずインデックスに頼った次第です。
追加クエリ「案件ID」フィールドの抽出行に「<>[T_送付]![送付用案件ID]」と入れたところパラメータの入力ボックスが表示されました。それ以外にも、クエリの上の画面に2つのテーブルを表示させ、外部の3パターンでつないでみたり色々試してみたのですが、望みの結果が得られませんでした…
どうすれば案件IDが重複しないように追加クエリを実行することができるのでしょうか。
②追加の質問ですみません。今月データを抽出する際、日付の入ったフィールドのクエリの抽出行に「Like Left(Date(),7) & "*"」と記載しても「Left(Date(),7)」と記載しても結果が同じで不思議に思っています・・なぜなのでしょうか。
※補足
>2つのテーブル
案件テーブルと送付テーブルになります。
>外部の3パターン
結合の3パターンの間違いです。
とりあえず
のほうへの回答ですが、
Date()
は今日の日付を表す日付型のデータですね。めんどくさい言い方をすると、1899/12/31を1として、今日まで1日ごとに1を加算した数値を返します。これを何らかの方法で日付として表示すると2020/09/01のように画面上では見えるわけですLeft()
は文字列に対して左からn文字を取り出す関数ですね。Date()
は文字列ではないので自動の型変換が起こります結果どうなるかというと、
Left(Date(),7)
はLeft("44075",7)
(Date()=2020/09/01の場合)として処理されます。クエリの結果が同じになるのはたまたまですが、「今月のデータを抽出したい」という要求を満たせないのは一目両全ですね日付型は人間にわかりやすい見た目をしていても内部では数値で扱われているということを覚えましょう
日付型のフィールドで具体的に「今月」で抽出するなら
と、期間指定で抽出する形になります
よく理解できました。ウッカリしておりました…ありがとうございます。
メッセージを表示しないようにするは簡単ですが、
「追加クエリで全てのデータを追加できません」が発生する原因を特定して、それが発生しないようにすべきだと思いますがどうでしょうか。
原因がわかっていて、別に影響かないことを確認済みならいいですが。
対症療法て症状を見えないよう(メッセージ非表示)にして、気が付かないうちに病理が進行していてとんでもないことになっていないか不安です。
ありがとうございます。
基本的に毎回フォームを開く際に追加クエリが起動しているので
重複データがあってのメッセージなのですが、
やはり非表示にはしないほうがいいですよね…
この先は実際のクエリを提示してもらわないと何ともですが、
「案件テーブルの案件ID」と「送付状テーブルの案件ID」を一対多で結合して、[送付状テーブル].[案件ID]フィールドの抽出条件を「
Is Null
」とすればいいのではないかと思いますクエリは[ホーム]タブの[表示]からSQLビューとデザインビューが切り替えられるので、SQLビューに切り替えて表示されるテキストをコピペすると話がスムーズに進みますよ
スミマセン、うまくいかないのでコピペします。
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 INNER JOIN T_送付 ON T_案件.案件NO = T_送付.送付用案件NO
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1));
実際のSQLから不要なところを抜いていますので、もしかするとおかしなことになっているかもしれません。気を付けたつもりなのですが、その際は申し訳ありません。
ごめんなさい。一部うつしまちがっていました。
こちらでお願いいたします。
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 INNER JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.月)<DateSerial(Year(Date()),Month(Date())+1,1));
結合の設定が正しくできてないですね
結合プロパティで「'T_案件'の全レコードと'T_送付'の同じ結合フィールドのレコードだけを含める。」にチェックを入れましょう
INSERT INTO T_送付 ( 送付用案件ID, 得意先ID, 月 )
SELECT DISTINCT T_案件.案件ID, T_案件.得意先ID, T_案件.月
FROM T_案件 LEFT JOIN T_送付 ON T_案件.案件ID = T_送付.送付用案件ID
WHERE (((T_案件.月)=DateSerial(Year(Date()),Month(Date()),1) And T_送付.送付用案件ID Is Null;
「月」フィールドについて
日付型にしたフィールドで「2020/09」のように「(年)月」だけを保存しようとすると、データとしてはその月の1日とした日付で保存されます(厳密に「月」だけを指定したデータとしては保存できません)
この仕様のもとデータ管理が完璧なら抽出条件は上に挙げたように
(T_案件.月)=DateSerial(Year(Date()),Month(Date()),1)
だけで満たせますが、「日付型」にしたフィールドで指定していない日付部分はどうなってるかわからない的な怖さがあるのでちゃんと範囲指定してあげたほうがいいと思います(T_案件.月)>=DateSerial(Year(Date()),Month(Date()),1) And (T_案件.処理月)<DateSerial(Year(Date()),Month(Date())+1,1))
確かに「>」が抜けてました(うっかりミスです。)…ご指摘いただき助かりました。
その他の部分もあれこれやってもうまくいかず悶々としておりましたが、これでスッキリしました!