• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数フィールドからの最新抽出(ACCESS))

MS-ACCESSで売上進捗システムを作る方法

このQ&Aのポイント
  • MS-ACCESS(Ver2003)を使用して売上進捗システムを作成したい場合、日付フィールドの最新日を最終対応日に反映させる方法を知りたいです。クエリで条件式を使用する必要があるのでしょうか?
  • 売上進捗システムを作るためには、MS-ACCESS(Ver2003)を使用し、日付フィールドの最新日を最終対応日に反映させる方法を知る必要があります。クエリで条件式を使用することで可能です。
  • MS-ACCESS(Ver2003)を利用して売上進捗システムを構築する際には、日付フィールドの最新日を最終対応日に反映させる方法が必要です。クエリを使用して条件式を作成することで実現できます。

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

  • ベストアンサー
noname#79209
noname#79209
回答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

miffy123
質問者

お礼

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

その他の回答 (6)

noname#79209
noname#79209
回答No.7

> クエリ式'fncGetMAxDate([テーブル名]![対応日1],[テーブル名]![対応日2]>[テーブル名]![対応日3],[テーブル名]![対応日4],[テーブル名]![最終対応日]) の [テーブル名]![対応日2]>[テーブル名]![対応日3], に 「>」が入っています。 多分「,」を入れようとしてミスタイプしたのでしょう。 従って、パラメータの数が少なく認識されてしまっています。 クエリの「>」を「,」に直して下さい。

miffy123
質問者

お礼

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

noname#79209
noname#79209
回答No.5

#4への補足に対する回答です。 #4を書いている最中に、ご質問の内容も頭によぎったのですが、 却って混乱させてしまうかと思い、敢えて書きませんでした。 解決策は、 クエリの「条件抽出」欄に「Is Null OR 0」とすればOKでしょう。 あとは、ユーザー定義関数側で対応する方法もありますが、とりあえず上記の方法で試してみて下さい。 なお、何かの原因で最終応対日に中途半端なデータが入る恐れもあるので、 それに対応するにも関数側での対応になるでしょう。

miffy123
質問者

お礼

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

noname#79209
noname#79209
回答No.4

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

miffy123
質問者

お礼

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

miffy123
質問者

補足

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

noname#79209
noname#79209
回答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の基本を余り理解されておられないようなので、説明が難しいですね。 また、日本語自体が、物を説明するのには、非常に不得手な言語なのでなおさらです。 でも、最初は皆初心者なので、少しずつで解ってくるので心配なさらないように...  

miffy123
質問者

お礼

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

noname#79209
noname#79209
回答No.2

> このプロシージャを、フォーム上に貼り付けてボタンを押すことで  実行させたいのですが、プロシージャに記述すればいいのでしょうか? 先の回答で示したのは、ユーザー定義関数です。 Public関数として定義しているので、どのフォーム、レポート、クエリからでも使えます。 「ユーザー定義関数」を作っておけば、通常の関数と同様に使えます。 Publicタイプのユーザー定義関数は「標準モジュール」を新規作成し、そこに先のコード(関数)を入れます。 ご質問の様子では、更新クエリをお使いになるようだったので、 更新クエリの「最終対応日」フィールドの更新データとして使用します。 もちろんフォームでも使えますが、フォームのコマンドボタンのプロシージャには入れません(入れてはいけません)。 > fncGetMaxDateという関数で定義する、paraDate1, paraDate2・・・は  テーブルの名称の名称に合わせればいいのですよね? 違います。 このまま、一字一句いじらずに、「標準モジュール」に置いて下さい。 「テーブルの名称の名称に合わせれば」と言われているのは、例えば、 エクセルで用意されて関数の中身(マイクロソフトで作った中身のこと)をいじってしまうことと同じです。 使うときは、 日付型変数名=fncGetMaxDate(Me.対応日1,Me.対応日2,Me.対応日3,Me.対応日4) といった具合に使います。 なお、フィールド名やコントロール名に括弧を「対応日(1)」などと「()」を使うのは、避けた方がよいです。 プログラムでは「()」を使うことが多いので、誤動作の元になります。

miffy123
質問者

お礼

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

noname#79209
noname#79209
回答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 で最新日が算出できるのでは?

miffy123
質問者

お礼

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

関連するQ&A