• 締切済み

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

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

みんなの回答

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

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

  • chayamati
  • ベストアンサー率41% (254/607)
回答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% (254/607)
回答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% (254/607)
回答No.10

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

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

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

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

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

spongetak
質問者

お礼

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

  • chayamati
  • ベストアンサー率41% (254/607)
回答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% (254/607)
回答No.6

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

  • chayamati
  • ベストアンサー率41% (254/607)
回答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% (254/607)
回答No.4

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

関連するQ&A

  • ACCESSでデーフル作成入力フォームで入力しながら、クエリのデータを参照したい

    ACCESSで売上明細テーブルを作成し、入力用のフォームを作成しました。他に顧客マスタテーブルがあります。売上明細には顧客CDフィールドがありますが、顧客名等はマスターに存在するため設けてません。しかし売上明細入力時に顧客CDを入力した時点で顧客名の確認がしたいのです。そこで入力フォームの顧客CDの隣に非連結でテキストボックスを作り、そこに顧客名を表示したいのです。売上明細には顧客名のフィールドは追加したくありません。ただ参照したいだけです。顧客マスタと売上明細で顧客CDをキーにクエリを作成し、明細に対応する顧客情報は顧客情報検索というクエリで作成済みです。入力フォーム画面の非連結のフィールドのプロパティのコントロールソースに =DLookup("[顧客名]","顧客情報検索","[顧客CD] =" _ & Forms![売上明細入力Form]![顧客CD]) と表記しましたがエラーになります。 最初はコントロールソースに直接顧客情報検索クエリの顧客名フィールドを表記し、フォーカス取得時にクエリを開くマクロを実行していました。でもやはり表示されませんでした。 顧客名の設定をどのように設定すればいいのですか? コントロールソースでの設定だけでは無理なのでしょうか? よろしくお願いします。

  • [AC2k]レポートの詳細が逆に。。。

    Access2000のレポートについて、教えてください。 ---- フォーム:F_売上伝票,F_売上伝票明細 (伝票番号をキーにしてサブフォームにしています。) テーブル:T_売上伝票,T_売上伝票明細 クエリー:Q_売上伝票出力 レポート:R_売上伝票出力 ---- [F_売上伝票](F_売上伝票明細)で入力したデータは、 [T_売上伝票] 伝票番号| 売上日付 |顧客コード|・・・ ----+-----+-----+---   1001|2001/07/16|T20111  |・・・ [T_売上伝票明細] 伝票番号|商品コード|・・・ ----+-----+---   1001|1021   |・・・   1001|5545 |・・・   1001|3222 |・・・    1001|4665   |・・・  レポートのソースであるクエリーの結果は [Q_売上伝票出力] 伝票番号| 売上日付 |顧客コード|商品コード ----+-----+-----+-----   1001|2001/07/16|T2001 |   1021   1001|2001/07/16|T2001 |   5545   1001|2001/07/16|T2001 |   3222   1001|2001/07/16|T2001 |   4665 と素直に出てくれるのですが、 レポートの結果(詳細セクション)は 商品コード ----- 4665 3222 5545 1021 となってしまいます。 クエリーでソートしている訳でもありません。 お客様のご都合で、 ・商品コード順にソートする というクエリーは不可です。 レポートが、クエリー通りに出てくれる方法は 無いでしょうか? レポートを作り直したら出来るかもしれませんが、 原因を掴みたいので、ご教授願います。 よろしくお願い致します。 #プロポーショナルフォントは面倒です(;_;)

  • Accessのフォームでの合計欄を二つにわけたい

    テーブル1;売上明細T フィールド名;売上明細番号、商品コード、数量、摘要 テーブル2;商品T フィールド名;商品コード、商品名、単価 クエリで売上明細と商品Tをつなぎ、下記のように表示します。 商品コード 商品名 摘要  数量  単価 明細計                  (数量*販売単価) 001    物件1  作業代  1  500 500 002    物件2  作業代  2  400 800 051    物件51  作業代  1  500 500 051    物件51  交通費  1  350 350  上記クエリを元にフォームを作成(帳票形式)して、 テキストボックスで課税対象計(作業代計)と、非課税対象計(交通費計) のボックスをもちたいのですが可能でしょうか? 最終的には、売上伝票フォームに売上明細フォームをサブフォームで 取り込み、売上伝票上で合計金額を表示させたいと思っています。 よろしくお願いします。

  • クエリーの条件設定、誰か教えて下さいお願いします。

    売上伝票と顧客マスター テーブルからのクエリー作成で 以下条件を設定したいのですが・・・ 売上日がDate()で 伝票番号Mod 2 <>0 の条件で 顧客マスターの1フィールド(S、Y、SL、YL、余白で文字無し) の5通りが入力されているフィールドから Like "Y"と Not Like "S"の条件を満たすクエリー作成は? よろしくお願いします。

  • ACCESSで複数条件でデータ抽出するフォームの作成

    ACCESS2000で複数の条件を入力し、該当するデータを抽出するフォームを作成しています。どんな方法がありますか?簡単に出来る方法をお教えください。 具体的には、売上明細データを検索します。あらかじめ テーブル:売上明細データ をいろいろなマスタを参照している クエリ:売上明細クエリ を元に抽出します 条件は売上日付の日付1と日付2の項目と、伝票区分の項目です。 フォームの頭にテキストボックスを3つ作成し、日付1~日付2までの売上日付で 入力された伝票区分のもののみを表示させたいのです。 検索というコンボボタンを配置し、クリック時にその下にクエリからの必要な表示項目を売上明細クエリから配置しています。 抽出する方法(条件の与え方)を教えてください。よろしくお願いいたします。

  • Accessで複数テーブルのJoin

    次のようなテーブル(T1~T4)とクエリ(Q1~Q2)があります。 クエリの表で囲っているものはAccessのQBEを表しています。 その下はAccessが自動生成したSQLです。 Accessがある場合はいいのですが、ない場合、いきなりSQLを 書かないといけないわけですが、どのような順番に並べていって いいのか整理がつきません。 4つ以上になるとさっぱりです。 何かヒントをいただけませんでしょうか? T1:売上表[売上No、日付、顧客CD] T2:顧客表[顧客CD、顧客名] T3:売上明細[ID、売上No、連番、商品CD、数量] T4:商品表[商品CD、商品名、単価] Q1: ┌────────────────┐ │日付 │ 商品名│単価 │数量 │ ├────────────────│ │売上表│商品表│商品表│売上明細│ └────────────────┘ SELECT 売上表.日付, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM 商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD; Q2: ┌────────────────────┐ │日付 │ 顧客名│商品名│単価 │数量 │ ├────────────────────│ │売上表│顧客表│商品表│商品表│売上明細│ └────────────────────┘ SELECT 売上表.日付, 顧客表.顧客名, 商品表.商品名, 商品表.単価, 売上明細.数量 FROM (商品表 INNER JOIN (売上表 INNER JOIN 売上明細 ON 売上表.売上No = 売上明細.売上No) ON 商品表.商品CD = 売上明細.商品CD) INNER JOIN 顧客表 ON 売上表.顧客CD = 顧客表.顧客CD;

  • Access 項目ごとにフォールド全データ表示

    Access2010で質問です。 よろしくお願いいたします。 Tabにある顧客番号フィールド全てに対して、 商品番号ごとに、実績が無いデータも表示させたいです。 --------------------- ・Tab(顧客情報テーブル) 顧客番号 顧客名 ・Q1(売上実績クエリ) 顧客番号, 商品名(抽出条件 Forms![フォーム1]![商品番号] Or Forms![フォーム1]![商品番号2] ) 売上実績 ・Q2(完成クエリ) 顧客番号,商品名,売上実績 1 ,商品A ,0 2 ,商品A ,2 3 ,商品A ,10 1 ,商品B ,1 2 ,商品B ,0 3 ,商品B ,5 --------------------- 選択クエリでTabフィールドを全て表示させるように結合させると、 --------------------- ・Q2(完成クエリ) 顧客番号,商品名,売上実績 1 ,商品B ,1 2 ,商品A ,2 3 ,商品A ,10 3 ,商品B ,5 --------------------- という表示になりますが、 顧客番号×商品数(A、B)のデータ数を出したいです。 単純に商品名ごとにTabとQ2結合クエリを作成し、 後でまとめるという方法もありますが、 Q1「商品名」の抽出条件は今後増える予定があるため、 できるだけ少ない数のクエリで処理できるようにしたいと思っています。 もしお分かりになれば、教えていただけないでしょうか。 どうぞよろしくお願いいたします。

  • access2003

    2000種ほどの商品を扱っています。商品コードひとつにつき、仕入先・取引先が1箇所ずつ決まっていて、値段の変化もあまりありません。伝票を見ながら、フォームから直接売上入力を行い、請求処理と売上分析に利用したく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 入力の効率化を図るため、1部品1取引先であることを利用して、親フォームで取引先を選択することで商品を絞り込み、子フォームの商品選択コンボボックスにはその取引先の商品だけが表示させるようにしたいと思います。どのような方法が考えれるでしょうか? クエリを使うのだと思いますが、いろいろ試しても失敗してしまいます。 また、その上でさらなる絞込みとして、明細の各行で各商品を選択する際に、商品コードの一部を入れたり、仕入先名を入れると部品が絞り込めるようにできないでしょうか? アドバイス、参考資料、なんでもお寄せください! どうぞよろしくお願いいたします。

  • ACCESSで

    まず始めに。 私はAccess初心者なので、何をどう質問して良いかもはっきりは分かりません。何か、足りない部分があれば書いて下さい。 喫茶店の売り上げ集計(メニュー別&顧客別)等のシステムをAccess2002で作っています。 と言っても、まだ始めのほうで詰まってしまっての質問です。 商品テーブル、商品の中分類テーブル、大分類テーブル、売上伝票テーブル、明細テーブルと在り、商品登録クエリ&フォーム、売り上げ登録クエリ&フォーム、明細登録クエリ&フォームがあります。 売り上げ登録フォームは、売り上げ伝票としています。 明細登録フォームは売り上げ登録フォーム(メイン)のサブフォームとしてあります。 メインフォーム上に入力日、販売日、顧客名(IDからクエリで引いてきます。)等をテキストボックスやコンボボックスなどで入力します。 伝票IDはオートナンバー型で指定し、それをサブフォーム上のIDに代入して登録しています。 大分類で飲み物と食べ物を分け、中分類で、『ホット系・アイス系・生ジュース系・カレー系・・・・軽食系・ケーキ系』等と分かれており、カレー系から軽食系までは、大盛小盛が指定出来るのですが、これを明細フォームでチェックボックスで入力しています。 問題はここからで、帳票形式の明細フォームで入力しているのですが、大盛、小盛が指定出来ない物の行のチェックボックスの『visible』を「false」にし、大盛、小盛が指定出来る物の行のチェックボックスの『visible』は「true」にしたいと想い、VBAで組みました。が、レコードセットを使わないとメインフォーム中の全ての行のチェックボックスの『visible』が同時に変わってしまいます。 windowsXPのコントロールパネルのODBCの設定もおかしいかもしれませんがどうしても分かりません。 基本的な事なのかもしれませんが、よろしくお願いします。

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

専門家に質問してみよう