- 締切済み
ACCESS2007最大値を得て別項目更新
ACCESS2007を使っています。 ・顧客マスタ ・売上伝票(ある日、特定顧客に何らかの商品が売れた) ・売上明細(上記売上伝票の詳細。商品名、個数など) (他に商品マスタなど) で構成したものがあります。 ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。(更新クエリで) ◆ここからが今の私の課題です。 その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。 これは、どうすればよいでしょうか。 (なお、それ以降は、その最終メンテ日から1年経った顧客に連絡するなどの部分を作る予定です) ・選択クエリ「集計」で、顧客IDで「グループ化」し、メンテ日で「最大値」を選択すれば、メンテ最終日は出ますが、その値を上記フィールドに入れる(更新していく)には、どうすればよいのでしょうか。あるいは全く違った方法があるのでしょうか? よろしくお願いいたします。
- みんなの回答 (13)
- 専門家の回答
みんなの回答
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
随分違った方向へ来てしまった気がしいて、最初から見直しました。 ・顧客マスタ ・売上伝票(ある日、特定顧客に何らかの商品が売れた) ・売上明細(上記売上伝票の詳細。商品名、個数など) (他に商品マスタなど) で構成したものがあります。 ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。 ------------------------------------------------------------------------- 以下のコードを実行すれば顧客マスタの[最終メンテ日]が更新されます。 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 -------------- この処理は過去のデータにも通用します。 テーブルも少し変わりました、添付画像確認してください
- chayamati
- ベストアンサー率41% (260/624)
>・売上伝票のテーブルに売上金額を作るのは理想的だとは思いましたが、そのようにすることもできるのですね。売上明細での計算 その通りです。 売上伝票登録の過程で売上金額、メンテ最終日を更新します。 売上登録(添付図)で 黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。 売上明細の金額が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)
前から気になっていたことですが、主キーはIDはオートナンバー型にして下さい。 こうすることで、主キーの管理はCPにお任せになり、主キーの運用管理から解放されます。試しにウィザード作成したフォームのIDを削除してもシステムに不都合は起こりません。
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
- chayamati
- ベストアンサー率41% (260/624)
お待たせしました >その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。 これは、どうすればよいでしょうか。 売上伝票と売上明細レコードソースのテーブルはリレーションシップで繋がっていますね また売上伝票と顧客マスタもリレーションシップは確立していますね 売上伝票登録フォーム(売上明細登録フォームがサブ)に組み込む。 売上伝票登録フォームの中に顧客マスタもレコードソースにする 少し面倒なのはサブフォームにある商品により更新するかどうかが決まる。 このため商品マスタに分類フィールド(一般商品、要保守商品、保守、点検)を追加し 商品の分類が "保守” 時に最終メンテ日を更新する 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)
「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。(更新クエリで) ◆ここからが今の私の課題です。 その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」 ------------------------------------------------------------------------------------------------------------ 確認ください ・売上伝票の登録フォームのレコードソースは売上伝票 ・売上明細の登録フォームのレコードソースは売上明細 ・売上伝票と売上明細のテーブルはリレーションで繋がっている(1:∞) これを次のように、「メンテ日」を入力した都度「最終メンテ日」更新する if [Parent]![最終メンテ日]<[メンテ日] then [Parent]![最終メンテ日]=[メンテ日] ・売上伝票の登録フォームのレコードソースは売上伝票と顧客マスタ ・売上明細の登録フォームのレコードソースは売上明細 ・売上伝票と売上明細のテーブルはリレーションで繋がっている(1:∞)
- chayamati
- ベストアンサー率41% (260/624)
いかがですか 最終メンテ日の更新は次で解決します。 最終メンテ日更新のラベルボックスをフォームに配置して、クリックイベントで起動して下さい 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をご覧ください
- chayamati
- ベストアンサー率41% (260/624)
1-2.顧客マスタの最終メンテ日の初期設定< ※最終メンテ日は新規に追加した項目なので比較等でエラーになります ・作成リボン ・フォームデザイン ・データタグのレコードソースの右端クりック ・顧客マスタからテーブルの表示を閉じる ・顧客名をフィールドへドラッグ ・最終メンテ日をフィールドへドラッグ、抽出条件に「is null」 ・クエリを閉じる ・プロパティの データタグの追加の許可 いいえ データタグの削除の許可 いいえ ・デザインリボンの既存のフィールドの追加より顧客名と最終メンテ日を明細欄にドラッグ ・明細欄の4つのボックスを囲んでアクティブにしてから配置リボンの表形式 ・ホームヘッダ,詳細、フォームフッタの幅を小さく ・プロパティの書式タグの既定のビューで帳表フォーム ・プロパティの最終メンテ日のフォーカス取得イベントで Private Sub 最終メンテ日_GotFocus() 最終メンテ日 = Date - 10 * 365 '約10年前に設定 End Sub ・プロパティのその他タグの 最終メンテ日のタブストップに「はい」 その他のフィールドのタブストップに「いいえ」 このフォームを開き、エンタキーを押し続けると最終メンテ日が10年前に更新される
- 1
- 2
お礼
ありがとうございます。コードをいれる場合、どこのどの部分に入れるのでしょうか?基本的なところが分かっていないで、一応、教えていただけるとありがたいです。