• 締切済み

ACCESS2007最大値を得て別項目更新

ACCESS2007を使っています。 ・顧客マスタ ・売上伝票(ある日、特定顧客に何らかの商品が売れた) ・売上明細(上記売上伝票の詳細。商品名、個数など) (他に商品マスタなど) で構成したものがあります。 ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。(更新クエリで) ◆ここからが今の私の課題です。 その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。 これは、どうすればよいでしょうか。 (なお、それ以降は、その最終メンテ日から1年経った顧客に連絡するなどの部分を作る予定です) ・選択クエリ「集計」で、顧客IDで「グループ化」し、メンテ日で「最大値」を選択すれば、メンテ最終日は出ますが、その値を上記フィールドに入れる(更新していく)には、どうすればよいのでしょうか。あるいは全く違った方法があるのでしょうか? よろしくお願いいたします。

みんなの回答

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.13

>コードをいれる場合、どこのどの部分に入れるのでしょうか? コーディング画面(VBE画面)に入るにはデザインモードから入りますが 1.[デザインリボン]→[コードの表示] 2.[ボックス]→[プロパティー]→[イベントタグ]→[イベントの選択] の2通りありますが、今回は1.で入って下さい。 VBEについて少し VBEの上端2つのプルダウン窓があります  左が配置されたボックス、フォーム等  右が左の配置物の動作(イベント) VBAは  Private sub ボックス名 イベント()   金額=数量*単価  END SUB と動作名の無い  Private sub 処理名()   処理  END SUB

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.12

随分違った方向へ来てしまった気がしいて、最初から見直しました。 ・顧客マスタ ・売上伝票(ある日、特定顧客に何らかの商品が売れた) ・売上明細(上記売上伝票の詳細。商品名、個数など) (他に商品マスタなど) で構成したものがあります。 ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。 ------------------------------------------------------------------------- 以下のコードを実行すれば顧客マスタの[最終メンテ日]が更新されます。 Private Sub 最終メンテ日更新_Click() DoCmd.RunSQL ("UPDATE 顧客マスタ INNER JOIN (売上伝票 INNER JOIN 売上明細 " _ & " ON 売上伝票.ID = 売上明細.売上伝票ID) ON 顧客マスタ.ID = 売上伝票.顧客ID set 最終メンテ日 = メンテ日 " _ & " WHERE ( 最終メンテ日 < メンテ日) and (((メンテ日) Is Not Null)) ;") End Sub このコードを必要な処理の前に組み込むと良いでしょう -------------- Private Sub 最終メンテ日更新RTN() DoCmd.RunSQL ("UPDATE 顧客マスタ INNER JOIN (売上伝票 INNER JOIN 売上明細 " _ & " ON 売上伝票.ID = 売上明細.売上伝票ID) ON 顧客マスタ.ID = 売上伝票.顧客ID set 最終メンテ日 = メンテ日 " _ & " WHERE ( 最終メンテ日 < メンテ日) and (((メンテ日) Is Not Null)) ;") End Sub ---------------- Private Sub 最終メンテ日降順表_Click() 最終メンテ日更新RTN DoCmd.OpenReport "顧客マスタ(最終メンテ日降順)", acViewPreview End Sub -------------- この処理は過去のデータにも通用します。 テーブルも少し変わりました、添付画像確認してください

spongetak
質問者

お礼

ありがとうございます。コードをいれる場合、どこのどの部分に入れるのでしょうか?基本的なところが分かっていないで、一応、教えていただけるとありがたいです。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.11

>・売上伝票のテーブルに売上金額を作るのは理想的だとは思いましたが、そのようにすることもできるのですね。売上明細での計算 その通りです。 売上伝票登録の過程で売上金額、メンテ最終日を更新します。 売上登録(添付図)で 黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。 売上明細の金額が1行確定の都度合計金額を更新します。 他のフォームの項目はForms![フォーム名]!項目名 としますが サブフォームから主フォームの時はParentを使います。 Private Sub Form_DblClick(Cancel As Integer) If 売上fg = True Then If Parent!最終メンテ日 < Parent!日付 Then Parent!最終メンテ日 = Parent!日付 End If End If End Sub ---------------------------------------------------------------------- 売上金額の更新は重複していますが Private Sub 合計_AfterUpdate() Parent!売上金額 = 合計 End Sub Private Sub 合計_Click() Parent!売上金額 = 合計 End Sub Private Sub 明細金額_Exit(Cancel As Integer) Parent!売上金額 = 合計 End Sub 黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.10

前から気になっていたことですが、主キーはIDはオートナンバー型にして下さい。 こうすることで、主キーの管理はCPにお任せになり、主キーの運用管理から解放されます。試しにウィザード作成したフォームのIDを削除してもシステムに不都合は起こりません。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.9

自分はファイルを開いたとき最初に開くフォームをメニューと名付けて作成しています。 日付関連のボックスが沢山ありますね、左上の塊が基準日で規定値はDATE() エクセルのTODAY()です。マウス操作で日付を変えるためのボタン群でこれと連動して、月初日等計算しています。 ファイルを開いたときに開くフォームを定義するには 「ファイル」→「オプション」→「現代のデータベース」→【フォームの表示のプルダウンから一つを選ぶ]→「OK」以上です。 お付き合い、ありがとうございました。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.8

「最終メンテ日」を顧客マスタに置くのは納得出来ません。 売上げた物件(売上明細)に対してにメンテ履歴を残すべきではないでしょうか

spongetak
質問者

お礼

メンテ日1ヶ月前にご案内をするシステムが作れれば、どのような形でもよいです

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.7

お待たせしました >その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。 これは、どうすればよいでしょうか。 売上伝票と売上明細レコードソースのテーブルはリレーションシップで繋がっていますね また売上伝票と顧客マスタもリレーションシップは確立していますね 売上伝票登録フォーム(売上明細登録フォームがサブ)に組み込む。 売上伝票登録フォームの中に顧客マスタもレコードソースにする 少し面倒なのはサブフォームにある商品により更新するかどうかが決まる。 このため商品マスタに分類フィールド(一般商品、要保守商品、保守、点検)を追加し 商品の分類が "保守” 時に最終メンテ日を更新する Private Sub 商品ID_Exit(Cancel As Integer) If 分類 = "保守" Then If Parent!最終メンテ日 < Parent!日付 Then Parent!最終メンテ日 = Parent!日付 End If End If End Sub ★他のフォームのボックスを参照するにはForms!他のフォーム名!ボックス名とするが  サブフォームからはParent!ボックス名とする。  主フォームからサブフォームは参照出来ない クエリでもワイルドマーク(*)使えます。抽出条件設定の為フィールドに入れるとワイルおマークと重複するので、表示行のチェックを外す。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.6

「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。(更新クエリで) ◆ここからが今の私の課題です。 その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」 ------------------------------------------------------------------------------------------------------------ 確認ください ・売上伝票の登録フォームのレコードソースは売上伝票 ・売上明細の登録フォームのレコードソースは売上明細 ・売上伝票と売上明細のテーブルはリレーションで繋がっている(1:∞) これを次のように、「メンテ日」を入力した都度「最終メンテ日」更新する if [Parent]![最終メンテ日]<[メンテ日] then [Parent]![最終メンテ日]=[メンテ日] ・売上伝票の登録フォームのレコードソースは売上伝票と顧客マスタ ・売上明細の登録フォームのレコードソースは売上明細 ・売上伝票と売上明細のテーブルはリレーションで繋がっている(1:∞)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.5

いかがですか 最終メンテ日の更新は次で解決します。 最終メンテ日更新のラベルボックスをフォームに配置して、クリックイベントで起動して下さい Private Sub 最終メンテ日更新_Click() DoCmd.RunSQL ("update 顧客マスタ set 最終メンテ日 = (date() - 365 * 10) where 最終メンテ日 is null;") DoCmd.RunSQL ("update 顧客マスタ INNER JOIN 売上伝票 ON 顧客マスタ.ID = 売上伝票.顧客ID set 最終メンテ日=日付 WHERE (最終メンテ日<[日付]);") End Sub Docmd文は参考URLをご覧ください

参考URL:
http://www.geocities.jp/cbc_vbnet/kisuhen/docmd.html#sul
  • chayamati
  • ベストアンサー率41% (260/624)
回答No.4

1-2.顧客マスタの最終メンテ日の初期設定<  ※最終メンテ日は新規に追加した項目なので比較等でエラーになります  ・作成リボン  ・フォームデザイン  ・データタグのレコードソースの右端クりック  ・顧客マスタからテーブルの表示を閉じる  ・顧客名をフィールドへドラッグ  ・最終メンテ日をフィールドへドラッグ、抽出条件に「is null」  ・クエリを閉じる  ・プロパティの    データタグの追加の許可 いいえ    データタグの削除の許可 いいえ  ・デザインリボンの既存のフィールドの追加より顧客名と最終メンテ日を明細欄にドラッグ  ・明細欄の4つのボックスを囲んでアクティブにしてから配置リボンの表形式  ・ホームヘッダ,詳細、フォームフッタの幅を小さく  ・プロパティの書式タグの既定のビューで帳表フォーム  ・プロパティの最終メンテ日のフォーカス取得イベントで    Private Sub 最終メンテ日_GotFocus()     最終メンテ日 = Date - 10 * 365 '約10年前に設定    End Sub  ・プロパティのその他タグの    最終メンテ日のタブストップに「はい」    その他のフィールドのタブストップに「いいえ」 このフォームを開き、エンタキーを押し続けると最終メンテ日が10年前に更新される

関連するQ&A

専門家に質問してみよう