締切済み

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

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

お礼率 72% (349/481)

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

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

・選択クエリ「集計」で、顧客IDで「グループ化」し、メンテ日で「最大値」を選択すれば、メンテ最終日は出ますが、その値を上記フィールドに入れる(更新していく)には、どうすればよいのでしょうか。あるいは全く違った方法があるのでしょうか?
よろしくお願いいたします。

回答 (全13件)

  • 回答No.13

ベストアンサー率 46% (171/369)

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

VBEについて少し

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

ベストアンサー率 46% (171/369)

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

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

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

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

お礼率 72% (349/481)

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

ベストアンサー率 46% (171/369)

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

黄色の部分が主フォーム(売上伝票)無地の部分がサブフォーム(売上明細)です。
  • 回答No.10

ベストアンサー率 46% (171/369)

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

ベストアンサー率 46% (171/369)

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

ベストアンサー率 46% (171/369)

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

お礼率 72% (349/481)

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

ベストアンサー率 46% (171/369)

お待たせしました

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

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

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

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

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

ベストアンサー率 46% (171/369)

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

ベストアンサー率 46% (171/369)

いかがですか
最終メンテ日の更新は次で解決します。
最終メンテ日更新のラベルボックスをフォームに配置して、クリックイベントで起動して下さい

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をご覧ください
  • 回答No.4

ベストアンサー率 46% (171/369)

1-2.顧客マスタの最終メンテ日の初期設定<
 ※最終メンテ日は新規に追加した項目なので比較等でエラーになります

 ・作成リボン
 ・フォームデザイン
 ・データタグのレコードソースの右端クりック
 ・顧客マスタからテーブルの表示を閉じる
 ・顧客名をフィールドへドラッグ
 ・最終メンテ日をフィールドへドラッグ、抽出条件に「is null」
 ・クエリを閉じる

 ・プロパティの
   データタグの追加の許可 いいえ
   データタグの削除の許可 いいえ
 ・デザインリボンの既存のフィールドの追加より顧客名と最終メンテ日を明細欄にドラッグ
 ・明細欄の4つのボックスを囲んでアクティブにしてから配置リボンの表形式
 ・ホームヘッダ,詳細、フォームフッタの幅を小さく
 ・プロパティの書式タグの既定のビューで帳表フォーム
 ・プロパティの最終メンテ日のフォーカス取得イベントで

   Private Sub 最終メンテ日_GotFocus()
    最終メンテ日 = Date - 10 * 365 '約10年前に設定
   End Sub

 ・プロパティのその他タグの
   最終メンテ日のタブストップに「はい」
   その他のフィールドのタブストップに「いいえ」

このフォームを開き、エンタキーを押し続けると最終メンテ日が10年前に更新される
13件中 1~10件目を表示
AIエージェント「あい」

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

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

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

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

特集


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

ピックアップ

ページ先頭へ