• ベストアンサー

Accessで契約更新日を出したい

テーブルに「契約日」と「契約期間」フィールドがあります。 「契約日」が「2003/7/8」、「契約期間」が「6」(月数)だとすると、今日現在では次回の「契約更新日」は「2003/1/8」となります。 このように、今日現在における、次回の「契約更新日」が算出されるには、どういう式をクエリなどで立てたらよいでしょうか? Access2000です

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

ある2つの日時の差を取得するにはDateDiff関数を使用します。 ただし、2003/7/1と2000/8/31の差も、2003/7/31と2000/8/1の差も、月数で求めると1になるところに注意が必要な関数です。 つまり、 1.契約日と今日の差を月数で求める。 2.求まった月数を契約日に足し、今日より大きかったら1で求めた月数を、今日より小さかったら1で求めた月数から1引いた月数を経過月数とする。 3.経過月数を契約期間で割り、更新回数を求める。 4.(更新回数+1)*契約期間を契約日に足すことで、次回の契約更新日が求まる。 となります。 ひとつの式で書けないこともないですが、メンテナンスのことを考えて、クエリーで計算項目を追加したら、さらにそのクエリーを元にしたクエリーを作成していくことをお勧めします。 1の値 = DateDiff("m", [契約日], Date()) 2の値 = Iif(DateAdd("m", 1の値, [契約日]) < Date(), DateAdd("m", 1の値, [契約日]), DateAdd("m", 1の値, [契約日]) - 1) 3の値 = Int(2の値 / [契約期間]) 次回契約更新日 = DateAdd("m", (3の値 + 1) * [契約期間], [契約日]) となります。 #試してないんで間違ってるかも・・・

kalmit
質問者

お礼

ありがとうございます。 「2の値」の式の2番目と3番目のDateaddを「1の値」の式(Datediff)に変えるとうまくいきました。 経過月数と更新回数を算出する、という考え方を教えていただき、本当に助かりました お礼が遅くなりましたが、ありがとうございました。

その他の回答 (2)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>今日現在における、次回の「契約更新日」 契約更新日は経過すると更新してあるという前提であれば 次回契約更新日として =IIf([契約更新日]>=Date(),[契約更新日],DateAdd("m",[契約期間],[契約更新日])) で次回契約更新日を取得できます。

kalmit
質問者

お礼

ありがとうございます。 契約更新日を更新しておく、という操作は今はしておりませんが、参考にさせていただきます。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

DateAdd関数を使用します。 DateAdd("m", [契約期間], [契約日])

kalmit
質問者

補足

ありがとうございます。 説明不足ですみません。 「契約期間」が「6」の場合、6ヶ月ごと(6,12,18…ヶ月ごと)に契約を更新するということになります。 教えていただいた式ですと、第1回目の更新日のみとなりますよね。それを過ぎた半年後以降は、次回の更新日がでてくるようにしたい、という意味でした。

関連するQ&A

  • アクセスで日付計算

    アクセスで困ってます。 フィールドに装置名、更新日、周期、次回更新日があって装置名、更新日、周期を入力すれば次回更新日を自動的に計算させようとしてるんですが、なかなかうまくいきません。 クエリではできたのですが、それをテーブルに反映させることができません。 いい方法はありませんか? なんか、うまく説明出来ずにすいません・・・・

  • アクセスのクエリについて教えてください

    契約日付が数値になっているテーブルを更新クエリで日付形式にし、契約期間が1年未満のデータは削除したいと思っています。 例) (1)20110401 → 2011/04/01 Left(元データ,4)&"/"&Mid(元データ,2)&"/"&Right(元データ,2) という式で更新クエリを作り、契約開始日、終了日とも日付形式にしました。 (2)契約期間1年以上のデータを特定する 契約開始日<="2011/03/31"で契約終了日>="2012/03/31" というテーブル作成クエリを作りました。 しかし、契約終了日がブランクのデータがあり、そのデータも(2)に含めたいと思っています。 ただのブランクであれば、契約終了日の条件式にor Null でいいのかなと思ったのですが、 (1)で更新クエリを実行しているため、ブランクではなく「//」が入っています。 どのような式にすれば、「//」データも含むことができますか? アクセスに詳しくなく、わかりにくい説明で申し訳ありませんが、助けてください。

  • ACCESSのフィールドの更新

    マイクロソフトACCESSフォームAでテーブルBのCフィールドの更新は出来るのですが、フォームDから連結でテーブルBのCフィールドの更新が出来ません。(同じようにして2個作成したシステムのうち1個は出来たのですが、もう1個がどうしても出来ません:テーブル,クエリ,フサブフォーム,フォームの違いを捜しているのですが見当たりません。)

  • ACCESS【更新クエリの中断ができない】

    ACCESS初心者です。質問がわかりにくかったらすみません。 ACCESSの更新クエリで、レコードのカンマをスペースに置き換える式を作りました。 クエリを実行すると、 ”更新クエリを実行すると、テーブルのデータが更新されます” と、メッセージが表示され”はい”で次に進むと ”*件のレコードが更新されます。”と正確な件数が表示されます。 ただ、ここでやはり中断したいと思い、”いいえ”を選択しても、 レコードは更新されてしまいます。何故でしょうか?教えてください。 ______________________ フィールド:     型名 テーブル:      データ統合 レコードの更新:  Replace([型名],","," ") 抽出条件:     Like"*,*"

  • Access2003 更新クエリについてご教授下さい。

    初めまして。 今回、初めてご質問させていただきます。 Access2003の更新クエリについてご教授お願いします。 AテーブルとBテーブルがあります。 ■Aテーブル(ALLテーブル)  各フィールド名:  名前(テキスト型)/完了(Yes/No型)/備考欄(テキスト型) ■Bテーブル(更新させたいテーブル)  各フィールド名:  名前(テキスト型)/完了(Yes/No型)/備考欄(テキスト型)  (※Aテーブルと同じです。) Bテーブルの内容をAテーブルへ更新させたいのですが 名前/完了のフィールドは、更新クエリで完成出来ましたが 備考欄の更新が出来ません。 (※備考欄には、コメントがそれぞれ入っています。) どのような形でクエリを作成すれば Aテーブルへ更新が可能になるのでしょうか? 以上、ご教授お願い致します。

  • アクセスの更新クエリ

    私は以前に、アクセスの桁あわせについての質問をしたことがあるものです。その時は『Format関数』を利用してやる方法を教えていただいたのですが、新たに疑問が出たので質問をさせていただくことにしました。 状態としましては、今エクセルのシートを二つインポートし、片方は1~20の連番のフィールド(テキスト型)があります。もう一つは01~20の連番のフィールド(テキスト型)です。この二つのテーブルの間にリレーションシップをとりたいので型は揃えていないといけないので、『Format関数』を利用し、【Format(Val([code]),"00")】と入力し更新クエリを実行しました。 実際に処理をしていくと、フィールド名が同じのテーブルが幾つもある状態なのですが、この場合その都度更新クエリをテーブルの数だけ作成しなくてはいけないのでしょうか?それとも、フィールド名が同じの場合何か1つの更新クエリで桁をあわせることは可能なのでしょうか? 長くなってしまいましたが、どなたかご存知の方教えて下さい。お願いします。

  • ACCESSでテーブルのフィールドに一括で数値の代入する方法

    初心者なので、宜しくお願い申し上げます。 ACCESSでテーブルのフィールドに一括で数値の代入する方法を教えてください。 あるテーブルにあらたにフィールドを追加しました。 データ型は「数値型」で「長整数型」にしています。 このフィールドに一括で数値「0」を入れたいのですが、更新クエリーではできないのでしょうか? 更新クエリーで「レコードの更新」の式を *0 =0 +0 &0 などいろいろやっても何も更新されません。 どうか宜しくお願い申し上げます。

  • 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にうまく変更する方法はありますでしょうか? 分かりにくくて申し訳ありませんが宜しくお願いいたします。

  • Access 期日が迫った文書を表示させたい

    いつもお世話になっています。 Accessで業務文書のデータを取り扱っています。 テーブルには「提出期日」というフィールドがあり、提出期日の日の3日前以内になったレコードを表示させるクエリを作りたいのです。 クエリに「提出期日」と今日の日付を使って、式を作ればよいと思うのですが、どのように記述すればよいかわかりません教えてください。 テーブルに今日の日付というようなフィールドはありません。 よろしくお願いします

  • アクセス 指定日から将来の指定日までを算出する式を知りたい

    アクセス2000 職員の人事データ管理をしています。テーブルのフィールドに職員の生年月日や採用年月日を入力しています。 このフィールドをもとに、将来の指定日までの期間を算出したいのです。例えばS50年4月1日に採用された人が来年の平成16年3月31日現在での勤務年月を算出したいのです。 某QAサイトの類似質問に「12月31日現在の年齢の出し方がわからない。今日以降の年齢も算出できるのか?」というのがあり、その答えに「DateDiff("yyyy",[誕生日],Format(date,"yyyy")& "/12/31")」とありましたので、自分のテーブルをもとに、とりあえず今年の12月31日現在の勤務期間を出してみようと「DateDiff("yyyy",[採用年月日],Format(date,"yyyy")」& "/12/31")と入力したところ「パラメータの入力 採用年月日」というダイアログが出てしまいました。うーん、恥ずかしながらこの意味も分からない。 採用年月日などの過去の指定日から、年度末時など将来の指定日までの期間(年月)を算出するための式を教えていただけないでしょうか。

専門家に質問してみよう