• ベストアンサー

更新クエリの日付抽出方法について

Access2003を使用しています。 受注一覧DBを作成しています。 受注入力から請求書発行までを行いたいとおもっています。 テーブル:受注 クエリ:請求書発行検索 フォーム:受注入力,請求書発行検索 テーブル受注には、受注期間(開始日:2006/3/1~終了日:2006/4/30) 請求予定月2006年3月 というフィールドがあります。  請求書発行検索フォームでは、検索テキストボックスに 2006/3 と入力すると対象データがを 抽出するようにしています。 請求書発行は、受注期間中の毎月月末です。 3/1-4/30の契約だと、3/31と4/30の2回発行することになります。現状は月末請求後に 手入力で請求月を入力していますが、更新クエリで自動入力することはできるでしょうか?? 「更新クエリ実行日が受注終了日よりも前ならば、請求予定月に1月足す」 かつ、「請求予定日が今月となっているときはそのままにする」 といったイメージです。。 いろいろと調べたのですが、書き方がわからなかったのです。 どうぞよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • process9
  • ベストアンサー率29% (81/272)
回答No.7

process9です。 蛇足かもしれませんが、もう1つやり方があったので。。。 ****締め日を指定して更新するクエリ***** UPDATE 受注 SET 請求予定月 = DateAdd("m",1,[請求予定月]) WHERE [受注期間開始日]<=CDATE([締め日]) And CDATE([締め日])<=[受注期間終了日] And FORMAT([請求予定月],"yyyymm")=FORMAT(CDATE([締め日]),"yyyymm") And FORMAT([受注期間終了日],"yyyymm")>FORMAT(CDATE([締め日]),"yyyymm"); ****締め日を指定して更新するクエリの試験用SQL***** SELECT * FROM 受注 WHERE [受注期間開始日]<=CDATE([締め日]) And CDATE([締め日])<=[受注期間終了日] And FORMAT([請求予定月],"yyyymm")=FORMAT(CDATE([締め日]),"yyyymm") And FORMAT([受注期間終了日],"yyyymm")>FORMAT(CDATE([締め日]),"yyyymm"); 上記の更新SQL(選択SQLもですが)であれば、 締め日を実行日でなく、締め日を指定できます。 実行すると 締め日の入力を求められます。 そこで 2006/3/31(3月締め) や 2006/4/30(4月締め) などの締め日を入力すると その月の締め日に指定した月で更新されますよ。 必ず末日又は翌月中に実行するなら、前のSQLの方が入力がない分 簡便ですし、誤入力(締め日とは違う日付でも実行されちゃう)も防げます。

ichigobana
質問者

お礼

重ね重ねご丁寧に教えていただき、本当に ありがとうございます! 教えていただきました、 「請求処理日を実行日の前月の末日とする」更新クエリを使用させていただきました。 これ、これです!!やりたかったことが(涙) なんだかすきっとして気持ちいいいです(^^) 他のやりかたも教えていただき、感激しております。 何度もありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • process9
  • ベストアンサー率29% (81/272)
回答No.6

process9です。 >日付を入力する画面が出てくるのですが、 >これは、本日の日付を入力するものなのでしょうか? すみません。検証してなかったもんで・・・・。 単なるSQLの記述ミスです。 各SQLのDATEの後ろに()が抜けてました(DATE()は本日の日付を返す関数です。) あと、請求処理日を実行日の前月の末日として処理する更新クエリ (4月以降に3月の請求処理をする場合のSQL)にも間違いがあったので訂正してます。 各更新SQL毎に更新対象データの確認を行う試験用の選択クエリをつけてますので 確認してくださいね。 その選択内容であってなければ、更新対象データを決めるのに 条件が不足していること示してますので。。。。 なので、修正版SQL ***更新クエリ1**** UPDATE 受注 SET 請求予定月 = DateAdd("m",1,[請求予定月]) WHERE [受注期間開始日]<=DATE() And DATE()<=[受注期間終了日] And FORMAT([請求予定月],"yyyymm")=FORMAT(DATE(),"yyyymm") And FORMAT([受注期間終了日],"yyyymm")>FORMAT(DATE(),"yyyymm"); ****更新クエリで更新対象データを確認する試験用SQL*** SELECT * FROM 受注 WHERE (((受注.受注期間開始日)<Date()) AND ((受注.受注期間終了日)>Date()) AND ((Format([請求予定月],"yyyymm"))=Format(Date(),"yyyymm")) AND ((Format([受注期間終了日],"yyyymm"))>Format(Date(),"yyyymm"))); ****別(請求処理日を実行日の前月の末日として)更新クエリ*** UPDATE 受注 SET 請求予定月 = DateAdd("m",1,[請求予定月]) WHERE [受注期間開始日]<=DateAdd("d",(CInt(FORMAT(DATE(),"dd")))*-1,DATE()) And DateAdd("d",(CInt(FORMAT(DATE(),"dd")))*-1,DATE())<=[受注期間終了日] And FORMAT([請求予定月],"yyyymm")=FORMAT(DateAdd("m",-1,DATE()),"yyyymm") And FORMAT([受注期間終了日],"yyyymm")>FORMAT(DateAdd("m",-1,DATE()),"yyyymm"); ****別(請求処理日を実行日の前月の末日として)更新クエリで更新対象データを確認する試験用SQL*** SELECT * FROM 受注 WHERE (((受注.受注期間開始日)<=DateAdd("d",(CInt(Format(Date(),"dd")))*-1,Date())) AND ((DateAdd("d",(CInt(Format(Date(),"dd")))*-1,Date()))<=[受注期間終了日]) AND ((Format([請求予定月],"yyyymm"))=Format(DateAdd("m",-1,Date()),"yyyymm")) AND ((Format([受注期間終了日],"yyyymm"))>Format(DateAdd("m",-1,Date()),"yyyymm")));

全文を見る
すると、全ての回答が全文表示されます。
  • process9
  • ベストアンサー率29% (81/272)
回答No.5

process9です。リクエストがあったので回答しますね。 問題を整理します。 受注期間、請求予定月には必ずデータがセットされているもの(受注登録時にセットされる) という前提の上で、 更新対象データ  受注期間開始日<=実行日<=受注期間終了日で且つ請求予定月=実行日の月  且つ受注終了日の月>実行日の月の受注データ  意味:実行日が受注期間内の受注データのうち     請求予定月に実行日の月と同じ月が指定されていて且つ     受注期間終了日の月が実行日の月翌月以降に指定されている     受注データ     (注:更新クエリを実行した日=実行日) 更新内容  更新対象データの請求予定月に実行日の月に+1をセット。  意味:上記の更新対象の受注データの請求予定月に翌月を上書きする。   データ例 (実行前=請求処理前 実行日2006/03/31 のデータ状態)   受注番号   受注期間開始日 受注期間終了日 請求予定月   0001     2006/01/04   2006/02/27   2006/02   0002     2006/03/05   2006/05/05   2006/03   0003     2006/02/05   2006/03/20   2006/03   0004     2006/03/10   2006/04/20   2006/03   0005     2006/03/10   2006/05/20   2006/06   0006     2006/04/05   2006/05/05   2006/04 上記に従うと更新対象データは、以下の2レコード   0002、0004(翌月も請求の必要があるデータ)      以下は各理由のために更新対象とならない。   0001(既に終わってる受注)、0003(当月で請求が終了する受注)   0005(なんらかの理由で一括支払いのため、請求予定月が受注終了日の月に指定されている受注)   0006(まだ、始まっていない受注) 上記例のデータを更新内容に従って更新すると以下のようになる。   受注番号   受注期間開始日 受注期間終了日 請求予定月   0001     2006/01/04   2006/02/27   2006/02 (変化なし)   0002     2006/03/05   2006/05/05   2006/04 (請求予定月に翌月をセット)   0003     2006/02/05   2006/03/20   2006/03 (変化なし)   0004     2006/03/10   2006/04/20   2006/04 (請求予定月に翌月をセット)   0005     2006/03/10   2006/05/20   2006/06 (変化なし)   0006     2006/04/05   2006/05/05   2006/04 (変化なし) と考えていいですか?ここが合ってない場合は以下は無視してください。 そうであれば、このときのクエリ(SQL)は、 UPDATE [受注] SET [請求予定月]=DateAdd("m",1,[請求予定月]) WHERE [受注期間開始日] <= DATE AND DATE <= [受注期間終了日] AND FORMAT([請求予定月],"yyyymm") = FORMAT(DATE,"yyyymm") AND FORMAT([受注期間終了日],"yyyymm") > FORMAT(DATE,"yyyymm") になるかと思います。(検証してないので間違っている部分があるかも。) 試験として SELECT * FROM [受注] WHERE [受注期間開始日] < DATE AND [受注期間終了日] > DATE AND FORMAT([請求予定月],"yyyymm") = FORMAT(DATE,"yyyymm") AND FORMAT([受注期間終了日],"yyyymm") > FORMAT(DATE,"yyyymm") で思い通りの更新対象データが引っ張れているか試してくださいね。 ただし、これは、実行日が必ず請求月の末日に処理する前提です。 運用上、4月1日に3月の請求処理を行う場合には当てはまらないです。 そのときは別(請求処理日を実行日の前月の末日として)のSQLを発行する。 UPDATE [受注] SET [請求予定月]=DateAdd("m",1,[請求予定月]) WHERE [受注期間開始日] <= DateAdd("m",(CInt(FOMAT(DATE,"dd"))+1)*-1,DATE) AND DateAdd("m",(CInt(FOMAT(DATE,"dd"))+1)*-1,DATE) <= [受注期間終了日] AND FORMAT([請求予定月],"yyyymm") = FORMAT(DateAdd("m",-1,DATE),"yyyymm") AND FORMAT([受注期間終了日],"yyyymm") > FORMAT(DateAdd("m",-1,DATE),"yyyymm") どうでしょうか。

ichigobana
質問者

お礼

詳しい説明どうもありがとうございます!!! まさにやりたいことを書いてくださって いましたので、一行ずつ首をかしげながら やっと理解できました!! できました!!! ただ、ひとつわからないところが ありまして、更新クエリを実行する際、 日付を入力する画面が出てくるのですが、 これは、本日の日付を入力するものなのでしょうか? 何度もずうずうしくお聞きしてすみません。 これからまたじっくり見てみます。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.4

#3のmshr1962です。すみません式を一箇所間違えました。 誤 フィールド欄「請求月:Format([請求予定月],"yyyymm")」抽出条件欄「<>Format(DateAdd("m",-1,Date),"yyyymm")」 正 フィールド欄「請求月:Format([請求予定月],"yyyymm")」抽出条件欄「Format(DateAdd("m",-1,Date),"yyyymm")」 <>があると請求予定月が先月でない場合になってしまいます。済みませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • mshr1962
  • ベストアンサー率39% (7418/18948)
回答No.3

それだけだと条件が足りないのでは? 現状だと「[受注終了日]<Date」で「Format([請求予定月],"yyyymm")<>Foramt(Date,"yyyymm")」で「DateAdd("m",1,[請求予定月])」ということですが 受注終了日が2ヶ月以上前で請求済みの場合、請求予定月は更新してもいいのでしょうか? また請求予定日が来月の場合、再来月になりますが... 「請求予定月が先月」かつ「受注終了日が今月以降」の場合なら フィールド欄「請求月:Format([請求予定月],"yyyymm")」抽出条件欄「<>Format(DateAdd("m",-1,Date),"yyyymm")」 フィールド欄「終了月:Format([受注終了日],"yyyymm")」抽出条件欄「>=Format(Date,"yyyymm")」 フィールド欄「請求予定月」レコードの更新欄「DateAdd("m",1,[請求予定月])」

全文を見る
すると、全ての回答が全文表示されます。
  • process9
  • ベストアンサー率29% (81/272)
回答No.2

process9です。 たぶん、できると思いますけど、 えっと、ちょっと不明確な部分があるので・・・ いくつか補足してもらえますか? 1.受注テーブルに受注期間開始日、受注期間終了日、請求予定月があるのですよね。各フィールドの型はなんでしょうか。 2. >請求書発行は、受注期間中の毎月月末です。 >3/1-4/30の契約だと、3/31と4/30の2回発行することになります。現状は月末請求後に >手入力で請求月を入力していますが、更新クエリで自動入力することはできるでしょうか?? 受注テーブルに請求月があるのでしょうか?あれば、フィールド型はなんでしょうか。 あるとすれば、 >「更新クエリ実行日が受注終了日よりも前ならば、請求予定月に1月足す」 >かつ、「請求予定日が今月となっているときはそのままにする」 が意味がわからないです。更新対象フィールドが請求予定月になっています。(請求予定日は請求予定月の間違いですよね・・・たぶん)

ichigobana
質問者

お礼

ご回答ありがとうございました! お礼が遅くなり申し訳ございません。 もしよろしければまた教えてください。 1.受注テーブルに受注期間開始日、受注期間終了日、請求予定月があるのですよね。各フィールドの型はなんでしょうか >フィールドの型は、日付/時刻型です。 ただ、請求予定月は、書式にyyyy\年m\月と指定しています。 2.受注テーブルに請求月があるのでしょうか?あれば、フィールド型はなんでしょうか。 >すみませんでした。請求月フィールドは、請求予定月の間違いでした。また、請求予定日も請求予定月の 誤りです。 わかりずらくてすみません。。 よろしくお願いいたします。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

請求予定月の日付のフィールドの持ち方にもよりますがyyyy/mm/dd(日付(S))の書式で入力はyyyy/mmで入力されている場合は2006/03と入力されていてもテーブル上は2006/03/01となっています。その辺が不明ですが・・。 下記で行けると思います。更新クエリ実行日を今日(Date())として IIf([受注終了日]<Date(),IIf(Format([請求予定月],"yyyy/mm")=Format(Date(),"yyyy/mm"),[請求予定月],DateAdd("m",1,[請求予定月]))) 一度テストで選択クエリを作りで試してみてください。 受注終了日と請求予定月のフィールドで 日付:IIf([受注終了日]<Date(),IIf(Format([請求予定月],"yyyy/mm")=Format(Date(),"yyyy/mm"),[請求予定月],DateAdd("m",1,[請求予定月]))) とでもして確認お願いします。 日付の表示がOKなら更新クエリの請求予定月のレコードの更新に先の記述で出来ます。

ichigobana
質問者

お礼

ご回答ありがとうございました。 返事が遅くなりまことに申し訳ございません。 請求予定月は、データ型→日付/時刻型 で、書式に、yyyy\年m\月としております。 上記で教えていただいたものを更新クエリの 請求予定月・レコードの更新に記述しましたら 請求予定月に1月たすことができました。 が、全ての対象データに1月たしてしまったので、 更に記述する必要がありました。(^^; 何をしたいか、を明確にしてからもう一度 お教えください。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メイン・サブフォームの内容を更新クエリで更新したい

    お世話になります。 現在、 tb受注日報(親)、tb受注伝票(子)で、受注伝票をサブフォームという形で組み込んだ【受注日報フォーム】と tb作業表(親)、tb作業表明細(子)で、作業表明細をサブフォームという形で組み込んだ【作業表フォーム】 があります。 【受注日報フォーム】上にあるコマンドボタンのマクロに、親同士、子同士での追加クエリを設定し、ボタンを押せば【受注日報フォーム】に入力した内容を【作業表フォーム】に反映させられるようにしています。 この要領でコマンドボタンを押せば以前に入力した【受注日報フォーム】の更新内容を【作業表フォーム】に反映させられるようにしたいと考えています。 そこで、親同士、子同士で更新クエリを作ってみた結果、親同士の更新は大丈夫でしたが、子同士の更新が一番目のレコードしか更新されませんでした。 更新クエリの抽出条件 親 フィールド 「識別番号」(オートナンバーです)   テーブル 「作業表」   抽出条件 [forms]![受注日報]![識別番号] 子 フィールド 「受注伝票番号」   テーブル 「作業表明細」   抽出条件 [forms]![受注日報]![受注伝票Sub].[form]![受注伝票番号] ちなみに親同士の追加クエリの抽出条件に使用した主キーは「識別番号」とは別の番号で、オートナンバーではなく、最大値に+1するやり方で振っている番号を使用していて、子同士の主キーは追加クエリも更新クエリもおなじ[受注伝票番号]を使用しています。 抽出条件かこの主キーの設定が問題なのかなあと思いますが、わからないのでどなたかご回答宜しくお願い致します。

  • Accessで期間抽出方法

    アクセスの検索フォームで 期間の抽出をしたいと思っています。 クエリではできるのですが、クエリではなく、コードビルダを使用しています。 「検索フォーム」で条件を入力し、「T_マスタテーブル」から作成した 「検索結果フォーム」に表示したいのです。 検索フォームの 「取得日1」に1999/3/6、「取得日2」に2002/4/25 と入力した場合、1999/3/6~2002/4/25の間が表示されるようにしたいのです。 どのように入力すればいいのでしょうか? 宜しくおねがいがします。 Ac2000

  • クエリーの抽出について

    今回初めて質問させていただきます。 所持しているゲームソフトが増えてきたので、ACCESSで管理したいと思いました。 テーブル、追加クエリー等は作成したのですが、フォーム上でメーカー名と頭文字という二つのテキストボックスを作成し、クエリーにて FORM!検索フォーム!テキストボックスという感じで作成し、抽出をしようとしたところ、両方のテキストボックスに検索条件を入力しないと抽出されないことに気づきました。 これを、一つの検索条件を入力した時にも抽出できるようにできませんか?説明がわかりにくいかもしれませんが、よろしくお願いします。

  • ACCESS2000 更新クエリで文字を追加・変更したい

    ACCESS2000のマクロでCSVファイルをインポートし、Excelに出力しています。 そこで途中に更新クエリを使い、文字の追加・変更を行いたいのですが何故かうまくいきません。。。 【テーブルA】 フィールド/受注番号(910004292) 【テーブルB】 フィールド/出荷番号(910005232)/製造番号(910005451) 【テーブルC】 フィールド/受注番号(910005232)/製造番号(910005451)/納期(1021) 受注、出荷、製造の各フィールドは先頭に"0"を追加したいです。 910004292→0910004292 納期は2009/10/21となるように、現在の西暦(できれば自動)/と3桁目にスラッシュを入れて、yyyy/mm/dd形式にしたいです。 更新クエリで フィールド:受注番号 テーブル:テーブルA レコードの更新:"0"&[受注番号] と入力してやるとうまくいきました。 同じように横のフィールドに フィールド:受注番号 受注番号 ・・・ テーブル:テーブルA テーブルB ・・・ レコードの更新:"0"&[受注番号] "0"&[受注番号] ・・・ と各テーブルの全てのフィールドを入力して更新すると、 レコードに物凄い数の"0"が追加されてしまいます。 例:0000000000000000910004292 何度も繰り返しているようなのですが、なぜなんでしょうか? 更新クエリを別々に作ればそれぞれうまくいきました。 ひとつのクエリに複数のテーブルのフィールドを入れると駄目です。 また、納期について1021→2009/10/21にうまく変更する方法はありますでしょうか? 分かりにくくて申し訳ありませんが宜しくお願いいたします。

  • フォーム入力、更新後処理で指定テーブルへのバックアップ方法

    受注DBを作成しています。 テーブル1:受注テーブル (受注日,受注訂正日,得意先名・・) テーブル2:受注テーブル履歴テーブル     (受注日,受注訂正日,得意先名・・) フォーム :受注入力フォーム があります。 受注を受けたら受注入力フォームへ入力します。 受注が変更になった場合、受注訂正日に入力後、 最初に入力したデータを受注テーブル履歴テーブル へ自動的にバックアップをとりたいと考えています。 更新後処理で、「値の代入」で処理するのでしょうか?イベントプロシージャーで入力するのでしょうか? バックアップは、初回受注入力フォームへ入力した データをすべてバックアップしておきたいと 考えております。 よろしくお願いいたします。

  • クエリで抽出したものに日付を入力して更新したい

    素人質問です。よろしくお願いします。 クエリで発注データを抽出し、それに対して入荷日などを入力し更新したいのですが、今の状況だとbefore updateなどで設定して更新しますか?とメッセージを出していますが、 たとえば5件抽出して5件入力が終わったところで「変更データがあります。更新してもよろしいですか?」とメッセージを出して更新するかしないか…と進めたいのですが、どうしていいかわかりません。 助けてください!よろしくお願いします。

  • 更新クエリがわからない

    windows-xp、Access2003を使っています。 参考書に載っている更新クエリは「同一のテーブル内でデータを更新する」という内容で載っているのを見ました。 が、そうではなく・・・ 更新クエリを作成すると「レコードの更新」という欄が出てくるのですが、そこに、別のテーブルや別のクエリのデータを”ビルド”で作成することはできないのでしょうか? 試みたのですが、”パラメータの入力”というものが出てきてしまいました。 ついでにおわかりになれば、これも教えてください。 ↓↓↓ テーブルAとテーブルB(或いはクエリB)に、同じIDをもつデータがあります。そこで、テーブルAの指定するフィールドへ、テーブルBの新しいデータを入れ込みたい(更新)させたい。 すみませんが、宜しくお願い致します。

  • Access2007 クエリが読み取り専用になってしまう

    Access初心者です。 3つのテーブルのデータ(全て)をクエリに抽出して、そのクエリからフォームを作成し、フォーム上からデータ入力をしていきたいと考えております。 しかし、上記方法で作成したフォームは入力ができなく、ヘルプで調べたらフォームが読み取り専用になっているようでした。 いろいろ検索したのですが、どうやら更新可能なクエリにする必要があるみたいなのですが、その方法が分かりません。 宜しくお願いします。

  • アクセスのクエリで更新できるようにしたいんですが、

    アクセス2000を使っています。クエリから、作ったフォームを更新したいのですが、できません。どなたか教えて下さい。 二つのテーブルがあります。 ・テーブル1=顧客番号、顧客名、初来店日、来店日2・・・ ・テーブル2=顧客番号、顧客名、アンケートの有無、カードの有無・・・ というようなもので、エクセルから外部データの取り込み→テーブルのリンクで作ってます。 この二つのテーブルから ・クエリ1=顧客番号(テーブル1)、顧客名(テーブル1)、初来日店(テーブ ル1)、アンケートの有無(テーブル2) を作り、これをもとにフォームを作ってフォーム上でアンケートの有無を更新できるようにしたいのですが・・・。 初心者で説明も上手くできなくてごめんなさい。 宜しくお願いいたします。

  • テーブル間の更新クエリにおいて

    Access2010で入力フォームを作成しています。 一時データとしてテーブルAを連結サブフォームとして編集します。保存ボタンをクリックするとメインのテーブルB(Aとフィールド構成は同じ)へA、Bのフィールド間で値が異なる場合、上書き保存をするという更新クエリを用意しています。 質問はテーブルAでフォーム上、オプショングループのラジオボタン(項目はテキスト型 値リストは0と1)に設定した項目が初期値のnullから入力したデータがメインのテーブルBに更新できないので困ってます。 連結フォームなので、テーブルAに値が入っており且つBと値が異なるのはデータビューで確認しています。ただ更新クエリでの選択(データビュー)に載ってこない。 この項目がテーブルBに反映されるのは予めインポートで0もしくは1が入力されていた状態から変更した場合と他の項目も合わせて値に変更があった場合のみでした。 クエリの抽出条件はテーブルA.項目<>テーブルB.項目としています。他の項目もor条件で同じ設定にしています。切り分けのため、このオプショングループの項目だけを変更した場合のクエリにしても反映はされませんでした。 考慮すべき点あればご教示ください。 よろしくお願いいたします。 どうかお助けくださいませm(__)m

専門家に質問してみよう