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

MS-ACCESS(Ver2003)で売上進捗システムを作っているのですが、以下のように日付フィールドが5つあり、最終対応日に最新日が反映されるようにしたいのですが、どなたか詳しい方いらっしゃいましたら、御教授願います。クエリで何かの条件式を使うのでしょうか?
(テーブル構造)イメージです
対応日((1))対応日((2))対応日((3)) 対応日((4))最終対応日                                                 2007 05 14  未入力   未入力    未入力  2007 05 14
2007 06 102007 09 20  未入力    未入力  2007 09 20
2007 07 202007 10 102007 10 30  未入力  200710 30
2007 08 022007 09 152007 10 222007 11 15 2007 11 15

A 回答 (7件)

直してみました。


以下のコードに全て入れ替えて下さい。
その上で、
1.更新クエリの「抽出条件」欄をクリアします。
2.更新クエリの「レコードの更新」欄を
 fncGetMaxDate([テーブル名]![対応日1],[テーブル名]![対応日2],>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日])
とし変更して下さい。(パラメータが追加になっているので...)

今回の変更は、全てのレコードに対して更新がかかります。
パラメータに「最終対応日」を追加しました。
対応日1~4の中から最新の日付を取り出し、それが現在の最終対応日より新しい日付なら置き換えています。
そうでない場合は、現在の最終対応日にもう一度置き換えます。
無駄のように見えますが、更新クエリを使うので、とにかく何らかのデータで置き換わります。
現在の最終対応日が最新であったとしても、もう一度同じ値を書き込む必要が有るからです。

Public Function fncGetMaxDate(paraDate1, paraDate2, paraDate3, paraDate4, paraDateLast) '最後にparaDateLastが追加されています。
Dim datDate As Date
Dim datDate1 As Date
Dim datDate2 As Date
Dim datDateLast as Date '2007/12/2 追加

datDateLast = Nz(paraDateLast,0)
datDate1 = Nz(paraDate1, 0)
datDate2 = Nz(paraDate2, 0)

If datDate1 >= datDate2 Then
datDate = datDate1
Else
datDate = datDate2
End If

datDate1 = Nz(paraDate3, 0)
datDate2 = Nz(paraDate4, 0)

If datDate1 > datDate Then
datDate = datDate1
End If
If datDate2 > datDate Then
datDate = datDate2
End If

'2007/12/2 追加/変更--ここから
If datDate > datDateLast Then
fncGetMaxDate = datDate
Else
fncGetMaxDate = datDateLast
End If
'2007/12/2 追加/変更--ここまで

End Function
    • good
    • 0
この回答へのお礼

vizzar様。miffyです。
いろいろお手間をおかけしております。
・更新クエリを1,2の順序で変更しました。
・標準モジュールの記述をすべて直しました。

更新クエリを実行したところ、以下のエラーメッセージが出てしまいます。
”クエリ式'fncGetMAxDate([テーブル名]![対応日1],[テーブル名]![対応日2]>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日])の関数で使用されてる引数の数が正しくありません”
テーブル名と対応日はこちらの名前に合わせました。
なぜでしょう?

お礼日時:2007/12/02 18:56

> クエリ式'fncGetMAxDate([テーブル名]![対応日1],[テーブル名]![対応日2]>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日])



[テーブル名]![対応日2]>[テーブル名]![対応日3],

「>」が入っています。
多分「,」を入れようとしてミスタイプしたのでしょう。
従って、パラメータの数が少なく認識されてしまっています。
クエリの「>」を「,」に直して下さい。
    • good
    • 0
この回答へのお礼

vizzarさん。
うまくいきました!

これでひとつの機能をやっと実現できました。
御丁寧にいろいろ教えていただきまして、本当に有難うございました。

お礼日時:2007/12/02 19:50

#4への補足に対する回答です。


#4を書いている最中に、ご質問の内容も頭によぎったのですが、
却って混乱させてしまうかと思い、敢えて書きませんでした。

解決策は、
クエリの「条件抽出」欄に「Is Null OR 0」とすればOKでしょう。

あとは、ユーザー定義関数側で対応する方法もありますが、とりあえず上記の方法で試してみて下さい。
なお、何かの原因で最終応対日に中途半端なデータが入る恐れもあるので、
それに対応するにも関数側での対応になるでしょう。
    • good
    • 0
この回答へのお礼

vizzarさん。
miffyです。
解決しました。

ちなみに、対応日(1)にデータを入力→更新クエリ実行→最終対応日に対応日(1)のデータが反映→その後対応日(2)にデータを入力→最終対応日に対応日(2)に対応日(2)のデータが反映(対応日(1)のデータがそのまま)になっちゃうんですよね。まだ、試していませんが、そのときは抽出条件に<対応日(2) or <対応日(3) or <対応日(4)と書けばいいのですかね?

お礼日時:2007/12/02 10:25

> 最終対応日にデータがある場合の記述


これこそ、クエリの「抽出条件」欄を使います。
最終対応日に何も入っていないレコードだけに更新をかけたいわけですから、
「抽出条件」欄に
「Is Null」
と入れます。

この回答への補足

vizzarさん。
miffy123です。
万事うまく行ったかと思ったのですが、あるレコードが対応日(1)~対応日(4)まで未入力の場合は最終対応日は"0"になって、それはいいのですが、そのレコードの対応日(1)に日付を入力して、更新クエリを実行しても最終対応日が"0"のままなんですが・・・
どうしてでしょう?

補足日時:2007/12/01 22:02
    • good
    • 0
この回答へのお礼

vizzarさん。
今度はうまく表示できました。
度々、御回答いただきまして有難うございました。(^人^)感謝っっ♪
自分のDB全般のスキルを今後、高めていけるよう頑張ります。
またの機会がございましたら宜しくお願いいたします。

お礼日時:2007/12/01 15:58

> 抽出条件に、


> datDate=fncGetMaxDate(対応日1,対応日2,対応日3,対応日4)
> と入力して
「抽出条件」欄ではありません。
その更新クエリをデザインモードで開き、
1.「フィールド」欄に「最終対応日」フィールドをセット
2.その列の「レコードの更新」欄に
fncGetMaxDate([テーブル名]![対応日1],[テーブル名]![対応日2],>[テーブル名]![対応日3],[テーブル名]![対応日4])
として下さい。
「テーブル名」は、更新したいテーブルの名前に読み替えて下さい。
「対応日1」等はテーブルのフィールド名を入れて下さい。
当然、「抽出条件」欄はクリア
お解りとは思いますが、スペースを入れて消したつもりになっている人もいますが、
必ずバックスペースキーやDELキーでクリアして下さいね。

> コンパイルエラーがでる
これは、多分、
> 標準モジュールに新規に”fncGetMaxDate"という名前で作成して、
> 右側のコード欄に教えていただいた記述を一字一句いじらずにコピーしました。
と言われているので、
1.「標準モジュールに新規に」は左側でその名前(fncGetMaxDate)にしていませんか?
 (まあ、その名前のモジュール名でも構わないのですが...)
 (モジュール名はmdlGetMaxDateなどと、頭にmdlをつけるのが一般的です)
 (頭につけているfncは関数=Function意味で、「これは関数だよ」と一目で分かるようにつけています。)
2.「一字一句いじらずにコピー」ということは、
 Public Function fncGetMaxDate(paraDate1, paraDate2, paraDate3, paraDate4)
 や、一番下の、
 End Function
 が、それぞれ2行になっていませんか?

失礼ながら、データベースやVBAの基本を余り理解されておられないようなので、説明が難しいですね。
また、日本語自体が、物を説明するのには、非常に不得手な言語なのでなおさらです。

でも、最初は皆初心者なので、少しずつで解ってくるので心配なさらないように...

 
    • good
    • 0
この回答へのお礼

vizzarさん。
miffyです。
今度はエラーも出なくなり、テーブルデータを表示したら、ちゃんと
最終対応日にデータが入ってました。
誠に申し訳ありませんが、私の質問に不備がありました。
対応日(1)~対応日(4)が未入力で、最終対応日にデータがあるレコードがありまして、0になってしまいました。
最終対応日にデータがある場合の記述はどのようにしたら良いのでしょうか?(ACCESSの本を買って勉強し始めて、2週間足らずの初心者で、しかもつたない日本語で申し訳ありません。)

お礼日時:2007/12/01 14:55

> このプロシージャを、フォーム上に貼り付けてボタンを押すことで


 実行させたいのですが、プロシージャに記述すればいいのでしょうか?
先の回答で示したのは、ユーザー定義関数です。
Public関数として定義しているので、どのフォーム、レポート、クエリからでも使えます。
「ユーザー定義関数」を作っておけば、通常の関数と同様に使えます。
Publicタイプのユーザー定義関数は「標準モジュール」を新規作成し、そこに先のコード(関数)を入れます。
ご質問の様子では、更新クエリをお使いになるようだったので、
更新クエリの「最終対応日」フィールドの更新データとして使用します。

もちろんフォームでも使えますが、フォームのコマンドボタンのプロシージャには入れません(入れてはいけません)。

> fncGetMaxDateという関数で定義する、paraDate1, paraDate2・・・は
 テーブルの名称の名称に合わせればいいのですよね?
違います。
このまま、一字一句いじらずに、「標準モジュール」に置いて下さい。
「テーブルの名称の名称に合わせれば」と言われているのは、例えば、
エクセルで用意されて関数の中身(マイクロソフトで作った中身のこと)をいじってしまうことと同じです。
使うときは、
日付型変数名=fncGetMaxDate(Me.対応日1,Me.対応日2,Me.対応日3,Me.対応日4)
といった具合に使います。

なお、フィールド名やコントロール名に括弧を「対応日(1)」などと「()」を使うのは、避けた方がよいです。
プログラムでは「()」を使うことが多いので、誤動作の元になります。
    • good
    • 0
この回答へのお礼

vizzarさん。
miffy123です。

標準モジュールに新規に”fncGetMaxDate"という名前で作成して、
右側のコード欄に教えていただいた記述を一字一句いじらずにコピーしました。
そして、更新クエリの最終対応日のフィールド欄の抽出条件に、
datDate=fncGetMaxDate(対応日1,対応日2,対応日3,対応日4)
と入力して、更新クエリを実行したところ、コンパイルエラーがでるのですが、何が原因なんでしょうか?
当初フィールド名の対応日(1)→対応日1というふうに、他の対応日フィールド名称も()を取りました。

お礼日時:2007/12/01 09:49

未入力もあるようなので、


ユーザー定関数をつくって(fncGetMaxDate)とします。

Public Function fncGetMaxDate(paraDate1, paraDate2, paraDate3, paraDate4)
Dim datDate As Date
Dim datDate1 As Date
Dim datDate2 As Date

datDate1 = Nz(paraDate1, 0)
datDate2 = Nz(paraDate2, 0)

If datDate1 >= datDate2 Then
datDate = datDate1
Else
datDate = datDate2
End If

datDate1 = Nz(paraDate3, 0)
datDate2 = Nz(paraDate4, 0)

If datDate1 > datDate Then
datDate = datDate1
End If
If datDate2 > datDate Then
datDate = datDate2
End If

fncGetMaxDate = datDate

End Function

で最新日が算出できるのでは?
    • good
    • 0
この回答へのお礼

vizzar様。
miffy123です。お返事有難うございます。
質問のテーブル構造の1行目がずれてて申し訳ありません。
ACCESSの経験が浅いもので恐縮なんですが、何点か教えてください。
・このプロシージャを、フォーム上に貼り付けてボタンを押すことで
 実行させたいのですが、プロシージャに記述すればいいのでしょうか?
・fncGetMaxDateという関数で定義する、paraDate1, paraDate2・・・は
 テーブルの名称の名称に合わせればいいのですよね?
・最終対応日というフィールドに最新日付を反映させるのですが、”最終
 対応日”とGetMaxDateの結びつきはどうすれば良いのでしょうか?

宜しくお願いいたします。
 

お礼日時:2007/11/30 21:27

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

関連するカテゴリからQ&Aを探す