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
No.6ベストアンサー
- 回答日時:
直してみました。
以下のコードに全て入れ替えて下さい。
その上で、
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
vizzar様。miffyです。
いろいろお手間をおかけしております。
・更新クエリを1,2の順序で変更しました。
・標準モジュールの記述をすべて直しました。
更新クエリを実行したところ、以下のエラーメッセージが出てしまいます。
”クエリ式'fncGetMAxDate([テーブル名]![対応日1],[テーブル名]![対応日2]>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日])の関数で使用されてる引数の数が正しくありません”
テーブル名と対応日はこちらの名前に合わせました。
なぜでしょう?
No.7
- 回答日時:
> クエリ式'fncGetMAxDate([テーブル名]![対応日1],[テーブル名]![対応日2]>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日])
の
[テーブル名]![対応日2]>[テーブル名]![対応日3],
に
「>」が入っています。
多分「,」を入れようとしてミスタイプしたのでしょう。
従って、パラメータの数が少なく認識されてしまっています。
クエリの「>」を「,」に直して下さい。
vizzarさん。
うまくいきました!
これでひとつの機能をやっと実現できました。
御丁寧にいろいろ教えていただきまして、本当に有難うございました。
No.5
- 回答日時:
#4への補足に対する回答です。
#4を書いている最中に、ご質問の内容も頭によぎったのですが、
却って混乱させてしまうかと思い、敢えて書きませんでした。
解決策は、
クエリの「条件抽出」欄に「Is Null OR 0」とすればOKでしょう。
あとは、ユーザー定義関数側で対応する方法もありますが、とりあえず上記の方法で試してみて下さい。
なお、何かの原因で最終応対日に中途半端なデータが入る恐れもあるので、
それに対応するにも関数側での対応になるでしょう。
vizzarさん。
miffyです。
解決しました。
ちなみに、対応日(1)にデータを入力→更新クエリ実行→最終対応日に対応日(1)のデータが反映→その後対応日(2)にデータを入力→最終対応日に対応日(2)に対応日(2)のデータが反映(対応日(1)のデータがそのまま)になっちゃうんですよね。まだ、試していませんが、そのときは抽出条件に<対応日(2) or <対応日(3) or <対応日(4)と書けばいいのですかね?
No.4
- 回答日時:
> 最終対応日にデータがある場合の記述
これこそ、クエリの「抽出条件」欄を使います。
最終対応日に何も入っていないレコードだけに更新をかけたいわけですから、
「抽出条件」欄に
「Is Null」
と入れます。
この回答への補足
vizzarさん。
miffy123です。
万事うまく行ったかと思ったのですが、あるレコードが対応日(1)~対応日(4)まで未入力の場合は最終対応日は"0"になって、それはいいのですが、そのレコードの対応日(1)に日付を入力して、更新クエリを実行しても最終対応日が"0"のままなんですが・・・
どうしてでしょう?
vizzarさん。
今度はうまく表示できました。
度々、御回答いただきまして有難うございました。(^人^)感謝っっ♪
自分のDB全般のスキルを今後、高めていけるよう頑張ります。
またの機会がございましたら宜しくお願いいたします。
No.3
- 回答日時:
> 抽出条件に、
> 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の基本を余り理解されておられないようなので、説明が難しいですね。
また、日本語自体が、物を説明するのには、非常に不得手な言語なのでなおさらです。
でも、最初は皆初心者なので、少しずつで解ってくるので心配なさらないように...
vizzarさん。
miffyです。
今度はエラーも出なくなり、テーブルデータを表示したら、ちゃんと
最終対応日にデータが入ってました。
誠に申し訳ありませんが、私の質問に不備がありました。
対応日(1)~対応日(4)が未入力で、最終対応日にデータがあるレコードがありまして、0になってしまいました。
最終対応日にデータがある場合の記述はどのようにしたら良いのでしょうか?(ACCESSの本を買って勉強し始めて、2週間足らずの初心者で、しかもつたない日本語で申し訳ありません。)
No.2
- 回答日時:
> このプロシージャを、フォーム上に貼り付けてボタンを押すことで
実行させたいのですが、プロシージャに記述すればいいのでしょうか?
先の回答で示したのは、ユーザー定義関数です。
Public関数として定義しているので、どのフォーム、レポート、クエリからでも使えます。
「ユーザー定義関数」を作っておけば、通常の関数と同様に使えます。
Publicタイプのユーザー定義関数は「標準モジュール」を新規作成し、そこに先のコード(関数)を入れます。
ご質問の様子では、更新クエリをお使いになるようだったので、
更新クエリの「最終対応日」フィールドの更新データとして使用します。
もちろんフォームでも使えますが、フォームのコマンドボタンのプロシージャには入れません(入れてはいけません)。
> fncGetMaxDateという関数で定義する、paraDate1, paraDate2・・・は
テーブルの名称の名称に合わせればいいのですよね?
違います。
このまま、一字一句いじらずに、「標準モジュール」に置いて下さい。
「テーブルの名称の名称に合わせれば」と言われているのは、例えば、
エクセルで用意されて関数の中身(マイクロソフトで作った中身のこと)をいじってしまうことと同じです。
使うときは、
日付型変数名=fncGetMaxDate(Me.対応日1,Me.対応日2,Me.対応日3,Me.対応日4)
といった具合に使います。
なお、フィールド名やコントロール名に括弧を「対応日(1)」などと「()」を使うのは、避けた方がよいです。
プログラムでは「()」を使うことが多いので、誤動作の元になります。
vizzarさん。
miffy123です。
標準モジュールに新規に”fncGetMaxDate"という名前で作成して、
右側のコード欄に教えていただいた記述を一字一句いじらずにコピーしました。
そして、更新クエリの最終対応日のフィールド欄の抽出条件に、
datDate=fncGetMaxDate(対応日1,対応日2,対応日3,対応日4)
と入力して、更新クエリを実行したところ、コンパイルエラーがでるのですが、何が原因なんでしょうか?
当初フィールド名の対応日(1)→対応日1というふうに、他の対応日フィールド名称も()を取りました。
No.1
- 回答日時:
未入力もあるようなので、
ユーザー定関数をつくって(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
で最新日が算出できるのでは?
vizzar様。
miffy123です。お返事有難うございます。
質問のテーブル構造の1行目がずれてて申し訳ありません。
ACCESSの経験が浅いもので恐縮なんですが、何点か教えてください。
・このプロシージャを、フォーム上に貼り付けてボタンを押すことで
実行させたいのですが、プロシージャに記述すればいいのでしょうか?
・fncGetMaxDateという関数で定義する、paraDate1, paraDate2・・・は
テーブルの名称の名称に合わせればいいのですよね?
・最終対応日というフィールドに最新日付を反映させるのですが、”最終
対応日”とGetMaxDateの結びつきはどうすれば良いのでしょうか?
宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(クラウドサービス・オンラインストレージ) おすすめのパスワードマネージャは? 1 2023/02/28 20:09
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Access(アクセス) Accessフォーム 一部のレコードだけを抽出する方法について 1 2022/06/28 18:45
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Access(アクセス) accessの日付フィールドから前年度だけを取り出したい 3 2022/04/13 23:13
- モニター・ディスプレイ DisplayPort 入力のMSTハブ(Linux対応)を探しています。 Linux を2画面で作 1 2022/11/07 21:10
- UNIX・Linux DisplayPort 入力のMSTハブ(Linux対応)を探しています。 Linux を2画面で作 1 2022/11/07 20:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
ACCESS 売上管理 価格改定につ...
-
リンクテーブルを CopyObject ...
-
ツリー構造をRDBで表現するには?
-
SQLで条件指定結合をしたいがNU...
-
2つのmdb内にある同名テーブル...
-
SQL: SELECT UNIONすると文字数...
-
Accessでvlookupみたいなことは...
-
Accessでテーブルからテーブル...
-
ODBCで接続するとDBに変更/追加...
-
テーブル作成クエリで主キーを設定
-
ACCESSで同じテーブルに...
-
Accessの追加クエリで既存のテ...
-
access テーブル内のレコード...
-
Accessレコードの追加や変更が...
-
ファイルメーカー
-
ACCESSに同時アクセス(編集)を...
-
MS ACCESS でのメッ...
-
Accessクエリでの、LIKE条件
-
DAOのTableDefs("TblName").Con...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
access テーブル内のレコード...
-
SQLで日付を条件に削除したい
-
Accessでvlookupみたいなことは...
-
ACCESSで指定されたテーブルか...
-
Accessレコードの追加や変更が...
-
Accessでテーブルからテーブル...
-
Accessクエリでの、LIKE条件
-
ACCESSに同時アクセス(編集)を...
-
3つの表を1つに縦に連結する
-
ツリー構造をRDBで表現するには?
-
SQLで条件指定結合をしたいがNU...
-
2つのテーブルを比較して一致し...
-
Accessの追加クエリで既存のテ...
-
リンクテーブルを CopyObject ...
-
デザインビューで、連結式 を...
-
ODBCで接続するとDBに変更/追加...
-
Accessで、複数のテーブルで随...
-
時間の足し算
-
翌営業日までの日数をSQLで求め...
おすすめ情報