プロが教えるわが家の防犯対策術!

またもや行き詰りましたので再度質問させてください。勉強不足ですいません。

以下のような2つのテーブルがあり、フィールドAに日付を入力すると、テーブルYのレコードを以下のように1年分追加して、さらにフィールドCの規定値を設定することは可能でしょうか?

テーブルX
ID フィールドA
001 2015/05/01

テーブルY
ID フィールドB  フィールドC
001  1     フィールドAの1ヵ月後
001  2     フィールドAの2ヶ月後
001  3     フィールドAの3ヵ月後
・・・
001  10     フィールドAの10ヵ月後
001  11     フィールドAの11ヵ月後
001  12     フィールドAの12ヵ月後

質問者からの補足コメント

  • ShowMeHowさん、ご回答ありがとうございます。

    説明を補足させて頂くと、
    テーブルYを作成するタイミングは、できれば、フィールドAに日付を入力したときを希望です。その時点では必ずテーブルXのIDは付与されています。

    テーブルを作る必要性に関しては、詳細には以下のようなことをやろうとしております。
    実は特許年金の履歴データを作成したく、
    特許が登録された日付を入力した時点で、次の年金期限を発生させたいのです。
    そして、テーブルYには年金を支払った日付も入力できるようにして、毎年の期限と支払日を残し、さらには次の年金期限を発生させるというような感じです。
    さらに悩ましいのは、1~3年目のフィールドCはフィールドAではない日付(テーブルXのフィールドZとしましょうか)を元に決定されます

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/05/21 15:20

A 回答 (3件)

特許年金について詳しくないので、わかりきったことを難しく考えているのかもしれませんが、


一度にこの先何回分発生させるかというのは、もう少し考える必要があるかもしれませんが、、、
100年先まで考えるのか、10年先で十分なのか、1ヶ月先のだけわかれば良いのか、、、
これは、一年分の支払い合計額を知りたいのか、レコードの追加はあるとして、
継続中止はあるのかなどなどを考えながら、テーブルの構造をかんがえてつくらないと、
あとから、難しいことをやらなくちゃいけなくなる可能性が出てきますね。

まずは、特許案件を個別に管理するテーブルと、支払い履歴を管理するテーブルが必要と
いう結論に達したのは間違っていないと思います。 これで、将来の支払いスケジュールを
管理するのであれば、どのタイミングでこの先何回分のレコードを作製させるのかを
決めなくてはいけません。 どのタイミングでが、御提示の案によると新規レコードの発生と
ともに、ということであれば、3年分作ることもできますが、じゃあ、3年後はどうするの
かなど、あらかじめ考えておく必要があります。 それは、10年にすれば問題が解決するのか、
というはなしでもあります。 長期間になると、10年後も支払い金額が同じなのかなど、
不確定な要素も出てくるかもしれません。

まあ、いろいろ心配していても何も進みませんね。
具体的アドバイスには、まだ至れないですが、
質問者様の質問は、大きく分けてふたつあると考えます。
①手入力によらない方法で新規レコードはどのようにして作るのか?
②複数の値より、一つの結果を求めたい場合はどのようにするのか?
これを双方理解できないと、解決しにくい問題だと思います。

①はアクセスのクエリ機能を使うか、VBAを使ってレコードを作製する、VBAでSQLを実行させるなどいくつか方法があります。
②に関しては、VBAでファンクションを作るというのが現実的です。

ので、順番的には①が先なのですが②から説明したほうがよいかと思います。
とはいえ、こんなところで私が書くよりネット上により詳しく丁寧な説明があると思うので、まずはそのあたりを一読してみて、全体の雰囲気を掴んでみてください。
http://vba.officehp.com/article/97483290.html

で、②についてですが
・fieldAの値
・fieldZの値
・xカ月先の支払い
の三つの値から、 
・xヶ月先の支払い日
を特定したいということでよいでしょうか?

基本的には、以下のような形で求めることができます。 現在ではただxヵ月後の日付を求めているだけです。 これだけであれば、別にファンクションを利用する理由はありませんが、その他の条件が詳しくわかれば、それに対応したコーディングすることもできると思います。

function DateofP(fieldA,fieldZ,x) as date
DateofP = dateadd("m",x,filedA)
end function


で、このファンクションは、クエリからも引用できますし、多分フォーム上からも使うことができるんじゃないかと思います。 で、必要であれば、この先はこのファンクションを訂正し、fieldZの値にも対応できるようにすることと、実際にレコードを作製する方法を提示していきたいと思います。 世の中にはいろいろな方法がありますので、私の提示しているのが最善の方法というわけではありませんし、もっとわかりやすい方法もあるかもしれません。 とりあえず、こんな方法でよければコメントをください。 時間はかかるかもしれませんが、可能な限り私の考えを提示します。
    • good
    • 0
この回答へのお礼

確認しきれていないのですが、今後ファンクションを作るというやり方を確認していこうと思っています。私の勉強不足で今回は時間がなくなってしまいましたので、また、相談させてください。
色々と教えて頂きありがとうございました!

お礼日時:2015/05/25 17:40

「可能ですか」と聞かれれば、「可能です」が答えになりますが、、、



このようなデータは、いつでも同じものがつくれるので、作る意味が少ないと思います。
(帳票用に、値がない場合でも、行を作りたい場合などあらかじめ作っておくようなことも
たまにはしますが、その場合でも1~12までの値を入れておくだけで十分です)

どうしても作らなくてはいけないというのであれば、どのように作るのかのはなしをする前に、
やはり、どのタイミングで作るのかの話しをしないといけません。 

テーブルXのID001のレコードが作られたタイミングで作りたいなら(アクセスには
トリガーがないので)VBAで連続してSQLを発行するなどしたほうが、不整合が
起こりにくいのかなと思います。 ただ、そのような方法をとろうとすると連結フォームを
使わないほうが簡単にできるということになり、さらに、IDに関しては自動採番にしておいて、
テーブルX書き込み後、テーブルYを書く前に値をとってくるなどのめんどくさいことを
しなくてはいけなくなる可能性もあり、複数端末からのデータ作成の可能性などを考えると、
一筋縄では行かなくなる可能性があります。

なので、本当にこのテーブルは作る必要があるのか?
というか、何のためにこのレコードを使いたいのかがわかれば、
他のやり方をアドバイスできるかもしれません。

ちなみに、一ヵ月後は
dateadd("m",1,日付)
で、できます。
この回答への補足あり
    • good
    • 0

VBA抜きでしたら、


連番用のテーブルを作成します。
T連番
フィールド名を番号にします。
番号(長整数型)
1
2
3

11
12
と12まで入力しておきます。

クエリを作成することにします。
いま作ったT連番とテーブルXをウィンドウにドラッグし、
結合線は引きません。
デザイングリッドに
フィールド|   ID |フィールドA|番号 |フィールドC:dateadd("m",番号,フィールドA)
テーブル |テーブルX| テーブルX|T連番
とします。
テーブルXに複数レコードが入っていて対象となるものだけを抜き出したい場合は
IDの抽出条件欄に記入します。

データシートビューに切り替えて正しくできていたら
もう一度デザインビューに切り替え、リボンの『テーブルの作成』をクリック、
テーブル名を聞いてくるので、テーブルY にします。
このクエリを適当な名前で保存。
ダブルクリックでクエリが実行され、テーブルY が作成されます。

テーブルYに追加したい場合は、クエリの種類を『追加』にして保存し、実行します。
    • good
    • 0
この回答へのお礼

テーブル作成・更新クエリを使ったやり方では上手くできました
ありがとうございました!

お礼日時:2015/05/25 17:29

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