締切済み

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

  • 困ってます
  • 質問No.9417869
  • 閲覧数162
  • ありがとう数14
  • 気になる数0
  • 回答数13
  • コメント数0

お礼率 75% (337/446)

ACCESS2007を使っています。
・顧客マスタ
・売上伝票(ある日、特定顧客に何らかの商品が売れた)
・売上明細(上記売上伝票の詳細。商品名、個数など)
(他に商品マスタなど)
で構成したものがあります。

ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。(更新クエリで)
◆ここからが今の私の課題です。
その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。
これは、どうすればよいでしょうか。
(なお、それ以降は、その最終メンテ日から1年経った顧客に連絡するなどの部分を作る予定です)

・選択クエリ「集計」で、顧客IDで「グループ化」し、メンテ日で「最大値」を選択すれば、メンテ最終日は出ますが、その値を上記フィールドに入れる(更新していく)には、どうすればよいのでしょうか。あるいは全く違った方法があるのでしょうか?
よろしくお願いいたします。
通報する
  • 回答数13
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全13件)

  • 回答No.13
レベル12

ベストアンサー率 46% (170/363)

>コードをいれる場合、どこのどの部分に入れるのでしょうか?
コーディング画面(VBE画面)に入るにはデザインモードから入りますが
1.[デザインリボン]→[コードの表示]
2.[ボックス]→[プロパティー]→[イベントタグ]→[イベントの選択]
の2通りありますが、今回は1.で入って下さい。

VBEについて少し

VBEの上端2つのプルダウン窓があります
 左が配置されたボックス、フォーム等
 右が左の配置物の動作(イベント)
VBAは
 Private sub ボックス名 イベント()
  金額=数量*単価
 END SUB
と動作名の無い
 Private sub 処理名()
  処理
 END SUB
  • 回答No.12
レベル12

ベストアンサー率 46% (170/363)

随分違った方向へ来てしまった気がしいて、最初から見直しました。

・顧客マスタ
・売上伝票(ある日、特定顧客に何らかの商品が売れた)
・売上明細(上記売上伝票の詳細。商品名、個数など)
(他に商品マスタなど)
で構成したものがあります。

ここで、「機械のメンテナンス実施」という商品があります。それが売り上がると、「売上明細」のメンテ日というフィールドにその日付が入るように設定しました。
-------------------------------------------------------------------------
以下のコードを実行すれば顧客マスタの[最終メンテ日]が更新されます。

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

お礼率 75% (337/446)

ありがとうございます。コードをいれる場合、どこのどの部分に入れるのでしょうか?基本的なところが分かっていないで、一応、教えていただけるとありがたいです。
投稿日時 - 2018-02-03 16:15:55
  • 回答No.7
レベル12

ベストアンサー率 46% (170/363)

お待たせしました

>その日付は機械のメンテナンス実施ごとに入っているわけですが、その最大値(最終日)を、拾ってきて、顧客マスタのフィールドの「最終メンテ日」というフィールドに入れたいと思います。
これは、どうすればよいでしょうか。

売上伝票と売上明細レコードソースのテーブルはリレーションシップで繋がっていますね
また売上伝票と顧客マスタもリレーションシップは確立していますね
売上伝票登録フォーム(売上明細登録フォームがサブ)に組み込む。
売上伝票登録フォームの中に顧客マスタもレコードソースにする
少し面倒なのはサブフォームにある商品により更新するかどうかが決まる。
このため商品マスタに分類フィールド(一般商品、要保守商品、保守、点検)を追加し
商品の分類が "保守” 時に最終メンテ日を更新する

Private Sub 商品ID_Exit(Cancel As Integer)
If 分類 = "保守" Then
If Parent!最終メンテ日 < Parent!日付 Then
Parent!最終メンテ日 = Parent!日付
End If
End If
End Sub

★他のフォームのボックスを参照するにはForms!他のフォーム名!ボックス名とするが
 サブフォームからはParent!ボックス名とする。
 主フォームからサブフォームは参照出来ない

クエリでもワイルドマーク(*)使えます。抽出条件設定の為フィールドに入れるとワイルおマークと重複するので、表示行のチェックを外す。
  • 回答No.8
レベル12

ベストアンサー率 46% (170/363)

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

お礼率 75% (337/446)

メンテ日1ヶ月前にご案内をするシステムが作れれば、どのような形でもよいです
投稿日時 - 2018-01-22 22:30:25
  • 回答No.9
レベル12

ベストアンサー率 46% (170/363)

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

ベストアンサー率 46% (170/363)

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

ベストアンサー率 22% (790/3514)

Q、あるいは全く違った方法があるのでしょうか?
A、幾つかあると思います。

1、そもそもフィールド[最終メンテ日]なんてのは用意しない。
2、仮に用意する場合には、SQL文実行関数にて参照する。
(例)DBLookup(SQL文)
 ADOを利用してSQL文の実行結果を返す関数を用意しておけば、フィールドの定義に上述のように書くだけ済みます。しかし、そもそもフィールド[最終メンテ日]を用意する必要があるかどうか疑問です。
お礼コメント
spongetak

お礼率 75% (337/446)

ADOについてはほとんど分かりませんが、DLookup(列名,レコードセット名[,条件])を使うのですね。ありがとうございます。
あとMaxの関数とか、顧客IDごとのグループ化とかからむと思いますが、これから勉強して検討します。SQLもまだよくわからないので。参考にさせていただきます。
投稿日時 - 2018-01-13 14:00:29
  • 回答No.2
レベル9

ベストアンサー率 27% (9/33)

最大値がメンテ途中の場合、どこで判断するのですか?
それとも、1機械1メンテなのでしょうか。
補足コメント
spongetak

お礼率 75% (337/446)

1機械1メンテ、です。
投稿日時 - 2018-01-15 07:49:32
お礼コメント
spongetak

お礼率 75% (337/446)

量も大量ではなく、ほとんど途中のケースはないので、個別に識別でき、問題ないです。
投稿日時 - 2018-01-15 07:49:01
  • 回答No.3
レベル12

ベストアンサー率 46% (170/363)

>あるいは全く違った方法があるのでしょうか?

違った流れを提案させていただきます。
画像を複数個添付したいので3回に分けて説明させて頂きます

1.テーブルの見直し
2.顧客マスタの初期更新
 顧客マスタに追加した「最終メンテ日」を約10年前に更新する
3.顧客マスタの「最終メンテ日」を売上伝票の日付により更新する

1-1.テーブルの確認
★そちらのテーブルに以下の項目が抜けていればフィールドを追加してください

・顧客マスタ
 ID(主キー オートナンバー)
 顧客名
 住所
 最終メンテ日(日付型)

・商品マスタ
 ID(主キー オートナンバー)
 商品名

・売上伝票
 ID(主キー オートナンバー)
 日付(日付型 規定値 DATE())
 顧客ID (数値型 規定値 0 顧客マスタをルックアップ)
 売上金額(数値型 規定値 0)

・売上明細
 ID(主キー オートナンバー)
 売上伝票ID(数値型)
 商品ID(数値型 商品マスタをルックアップ)
 数量(数値型 規定値 0)
 明細金額 (数値型 規定値 0)
 メンテFg(yes/No 型)

※このシステムに限らず、
テーブルとリレーションシップはAccessの入り口です。
ここをきっちり抑えて下さい
「主キー、規定値、インデックス(重複の有無)ルックアップ
 、リレーションシップ
添付はどのテーブルも1:∞で結ばれていますね!これがポイントです。
お礼コメント
spongetak

お礼率 75% (337/446)

リアルに作っていただき誠にありがとうございます。
大体はそのようになっています。
・売上伝票のテーブルに売上金額を作るのは理想的だとは思いましたが、そのようにすることもできるのですね。売上明細での計算から、更新してテーブルに入れたりするのでしょうか(ここでの本題ではないのですが、単に興味で)
投稿日時 - 2018-01-22 22:15:04
  • 回答No.11
レベル12

ベストアンサー率 46% (170/363)

>・売上伝票のテーブルに売上金額を作るのは理想的だとは思いましたが、そのようにすることもできるのですね。売上明細での計算
その通りです。
売上伝票登録の過程で売上金額、メンテ最終日を更新します。
売上登録(添付図)で
黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。
売上明細の金額が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

黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。
13件中 1~10件目を表示
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ