- ベストアンサー
Access2007での商品修理受付状態管理について
- Access2007を使用して、商品の修理受付状態を管理するデーターベースを作成している初心者です。商品ごとに異なる管理番号を取得し、重複登録のない設定もしたいです。
- 現在、作成したテーブルとフォームは機能していません。修理受付入力と修理受付明細、作業完了入力、作業完了明細のフォームを作成予定です。
- 修理受付明細フォームでの明細行番号の表示方法、現在の状態と修理回数の自動表示方法がわかりません。ご教授いただければ幸いです。
- みんなの回答 (37)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1~#4です サンプルDBを試作してみましたが、結構面倒で、それ以上に説明は大変そうです。と云うことで取り敢えず簡単なことから。 >1つのフォームに、1つのテーブルが必要と思っておりました。 一般的にはフォームにテーブルをそのまま対応させることはありません。クエリーを介在させます。例えば一覧表示するとき、アイウエオ順や年月日順に表示しようとすればクエリー介在が必要です。またテーブルはレコードの並び順を保証しませんから、いつ利用しにくい並びになるか判らないからです >受付フォームにて、受付をし、作業が完了した際には、再度、受付フォームを開いて、完了日を入力すれば良いのですよね?! これでも良いですが、クエリーを使用すれば、完了日未記入のものだけを一覧表示して処理するようなこともできます。どちらかというとその方が良いでしょう >顧客名さえあれば電話番号や住所等はこのシステムでは必要ないので、顧客ID(オートナンバー)顧客名、ふりがな、備考のみで良いことになります。 他のDBに顧客名関連の情報がある場合は、それとリンクして使用します。ですから当該DBでは顧客参照IDだけで済ませます。リレーショナルDBでは同じデータの複数登録はできる限り避けるべきです。入力手間が増える弊害もさることながら、入力回数が増えれば、誤りの発生もほぼそれに正比例するためです >コンボボックスで選択 コンボボックスの選択も便利ですが、選択対象がせいぜい10くらいまで、無理しても20以下にしたいです。それ以上では選択が大変です。その場合は一覧表示し、そこから選択して処理の流れになります。さらにレコード数が多いときはグループ分け、さらには「大分類」「中分類」「小分類」のような仕掛けも必要になります。 以上もふまえサンプルDBの仕様ですが 1.商品一覧表示フォームから当該商品を選択し、この商品の管理番号一覧フォームを開く 2.管理番号一覧フォームで目的とする管理番号を選択し、修理履歴フォームを開く 3.管理番号一覧フォームは新しい管理番号を追加でき、これはそれまでの最大プラス1になる 4.修理履歴テーブルは管理番号ごとに連番をもつ 5.修理履歴フォームから個々の修理明細フォームを開ける 6.修理明細フォームは上記の流れ以外、現在対象絞り込み(完了日未記入だけを絞り込む)からも開けるようにする ざっとこんな感じでしょうか?よろしいか、あるいは仕様変更を補足してください。
その他の回答 (36)
迂回でVBA実行ができるようなので、先に進めましょう。ただ先々不都合も考えられるので、プロトタイプが一応完成した時点で、もう一度マイクロソフトの有償サポートを検討してみては? ともかくこれで#5に書いた工程表の1.がようやく終わった状態です。 次は 1.管理台帳フォームを作成する。データのSQL文は SELECT 管理テーブル.管理ID, 管理テーブル.管理番号, 管理テーブル.商品ID, 管理テーブル.顧客ID, 顧客テーブル.顧客名, 管理テーブル.登録日, 商品テーブル.商品名 FROM (管理テーブル LEFT JOIN 顧客テーブル ON 管理テーブル.顧客ID = 顧客テーブル.顧客ID) LEFT JOIN 商品テーブル ON 管理テーブル.商品ID = 商品テーブル.商品ID ORDER BY 管理テーブル.管理番号; 2.メニューバーの「表示」から「フォームヘッダー/フッター」を表示するようにする 3.ヘッダーにはフィールドリストから「商品ID」「商品名」「管理ID」を貼り付ける 4.詳細にフィールドリストから「管理番号」を貼り付ける 5.詳細にツールボタンからコンボボックスを貼り付け、コントロールソースを「顧客ID」、値集合タイプを「テーブル/クエリ」値集合ソースのSQL文を SELECT 顧客テーブル.顧客名, 顧客テーブル.顧客ID FROM 顧客テーブル; とする 6.商品一覧フォームをデザインモードで開き、商品名の右側にボタンを、適当な場所に「商品ID」テキストボックス追加する 7.「商品ID」テキストボックスは書式で「可視」を「いいえ」にする 8.ボタンを押すと管理フォームが開くようにし、「特定のレコードを表示する」で「商品ID<->商品ID」とする。これはVBAで設定しても、マクロでやっても構わない 9.このボタンを押したとき、以下のコードが実行されるようにする 実行して、商品に対応した管理番号と顧客の組み合わせが表示されることを確認。もちろん、これに先立ち「管理テーブル」と「顧客テーブル」には、適切な値がはいっているものとする
補足
>8.ボタンを押すと管理フォームが開くようにし、「特定のレコードを表示する」で「商品ID<->商品ID」とする。これはVBAで設定しても、マクロでやっても構わない についてですが、VBAでした場合、下記の内容で間違いないでしょうか。。 Dim stDocName As String Dim stLinkCriteria As String stDocName = "管理番号フォーム" stLinkCriteria = "[商品ID]=" & Form_商品一覧フォーム![商品ID] DoCmd.OpenForm stDocName, , , stLinkCriteria 昨晩、どちらも試してみたのですが、マクロですると、パラメータの入力をもとめられたり、VBAですると、入力内容が間違っているようで、うまくいかず、悪戦苦闘していました(汗)
>やはり、確認をした方が、この先の作業のためには良いでしょうか 良いと思いますが、有料と云うことでは難しいですね。 別の方法を試してみましょう 1.モジュールの作成 2.Module1がほとんど空白の状態で開くので、ツールバーの左から二番目のボタンを利用し、プロシージャの追加をします 3.名前は(適当でよいのですが)「中分類選択フォームOpen」種類は「function」後はディフォルトで 4.空白のファンクション中身に以下をコピーペースト Dim stDocName As String Dim stLinkCriteria As String stDocName = "中分類選択フォーム" stLinkCriteria = "[中分類ID]=" & Form_中分類一覧フォーム![中分類ID] DoCmd.OpenForm stDocName, , , stLinkCriteria 5.中分類一覧フォームをデザインモードで開き、ボタンを追加し、ウィザードはキャンセル 6.プロパティで「クリック時」の右「...」ボタンを押し、マクロビルダを起動 6.マクロのアクションをプロシージャの実行にし、下方のプロシージャ名テキストボックスに「中分類選択フォームOpen () 」 7.上記6.の作業はテキストボックス右側の「...」式ビルダボタンを押して、関数の「+」ボタンで中身を展開し、当該データベース名のmodule1の中から選択でできます これでマクロ経由のVBA実行ができるはずですがどうでしょうか?
補足
早速のご回答ありがとうございます!! いきなりで申し訳ないのですが、 >2.Module1がほとんど空白の状態で開くので、ツールバーの左から二番目のボタンを利用し、プロシージャの追加をします 上記の「ツールバーの左から二番目のボタンを利用し、プロシージャの追加をします」がわかりません(汗) ツールバーのボタンって、どれでしょうか??(大汗) ほんとうに、すみません。。
#14を書いたつもりでいましたが、上手くアップロードされなかったようです。 >#7まで完了した状態になりましたので、恐れ入りますが、続きを と云うことですが、マイクロソフトに質問できるのであれば、「#12のVBAは何故機能しないか?」を確認できないでしょうか。管理番号の自動生成など、どうしてもVBAによる記述が必要になります。マクロからさらにVBAを起動する方法もあるでしょうが、例えばボタンを押したとき、VBAで全て記述した方が自然ですし、メンテナンスも楽でしょう。
補足
先日は、マイクロソフトの無償サポートにて、確認をしました。 そこへ、早速、再度、#12のVBAについて確認をしようとしたのですが、VBAに関しては、有償サポートになるとのことで、確認できませんでした。。 やはり、確認をした方が、この先の作業のためには良いでしょうか。
弱りましたね(^^; あとは「中分類一覧フォーム」の「コマンドボタン28」のプロパティが添付画像のようになっているか?ウィンドウタイトルは違っていて仕方ありません。
補足
ご連絡、遅くなりました!! コマンドボタンのウィザードについて、マイクロソフトに確認したところ、やはり、希望の動きができないみたいなので、マクロで開く方法を教わり、「商品中分類一覧フォーム」から、希望の「商品中分類名称」をクリックすると、商品中分類選択フォームを絞り込んで表示することができました。(ボタンはつけていません) ちなみに、マクロは、 「フォームを開く」と「再クエリ」をアクションに入れ、「フォームを開く」でのWhere条件式は下記の通りです。 [商品中分類テーブル]![商品中分類ID]=[Forms]![商品大分類選択フォーム]![商品中分類一覧フォーム].[Form]![商品中分類ID] ほんとうに、お手数をお掛けして、申し訳ございませんでした。 ということで、#7まで完了した状態になりましたので、恐れ入りますが、続きをご教授くださいますようお願い申し上げます。 どうぞ、よろしくお願いいたします。
>何か、方法はございますでしょうか 1.確認。コピー・ペースとした結果は、下記のようなPrivate Subになっているか。 Private Sub コマンド9_Click() '←ここの数字は違っていても良い Dim stDocName As String Dim stLinkCriteria As String stDocName = "中分類選択フォーム" stLinkCriteria = "[中分類ID]=" & Me![中分類ID] DoCmd.OpenForm stDocName, , , stLinkCriteria End Sub 2.ブレークポイントの設定 stDocName = "中分類選択フォーム" 'この行にカーソルを合わせて、F9キー その行が茶色く反転され、ブレークポイントが設定される。この状態でフォームをアクティブにし、当該ボタンを押してみる。正常に動作すればブレークポイントで黄色く反転してプログラムの実行が都丸。
補足
早速のご連絡、ありがとうございます。 コピーペーストした内容は下記のとおりです。 Private Sub コマンド28_Click() Dim stDocName As String Dim stLinkCriteria As String stDocName = "中分類選択フォーム" stLinkCriteria = "[中分類ID]=" & Me![中分類ID] DoCmd.OpenForm stDocName, , , stLinkCriteria End Sub >2.ブレークポイントの設定 についてですが、ご指定の行で茶色く反転しましたが、黄色に反転せず、やはりフォームは開かない状態です。。。 きっと、とても簡単なことなのだろうに、つまずいてすみません。。
>上記、完璧にできていますが、ボタンを押すと、フォームは開くのに、絞込みだけができないです ウーン、良く判りません。以前提示された、埋め込みマクロの内容もおかしくないし。仕方ないので、強引にVBAを書く方法で試してみては? 1.ボタンを貼り付け、ウィザードが起動したら、すぐにキャンセルボタンを押す 2.当該ボタンのプロパティで、イベントを見て、クリック時(多分空白になっている)の右側にある「...」ボタンを押す 3.ビルダの選択で「コードビルダ」を選択 4.以下のようなコード(コマンド9の数字は色々)が生成されたら(バージョンが違うので、異なるコードが生成されるかも) Private Sub コマンド9_Click() End Sub 4.中間の空白部分に、下記をコピー・ペーストする Dim stDocName As String Dim stLinkCriteria As String stDocName = "中分類選択フォーム" stLinkCriteria = "[中分類ID]=" & Me![中分類ID] DoCmd.OpenForm stDocName, , , stLinkCriteria 5.これを実行するとどうなるでしょうか?
補足
早速のご回答、ありがとうございます。 VBAをコピペして試してみましたが、まったく中分類選択フォームが開かず、無反応です。 何か、方法はございますでしょうか。。
埋め込みマクロはAccess2007の新機能なんですね。こちらで試験ができないので弱りました(^^; >中分類一覧フォームから中分類IDで関連づけるフォームは中分類選択フォームですよね ちょっと私の方で混乱していました。結論から云うと、「中分類選択フォーム」はなくても商品を絞り込むことができます。#9に着けたのはその画像でした。しかし「中分類選択フォーム」を介在させた方が、中分類名称を表示しながら、商品の絞り込みができます。ともかく以下は確認ですが 1.#9画像のようなところで「中分類ID<->中分類ID」とできたか? 2.「中分類選択フォーム」の「移動ボタン」を「はい」に替え、レコードの移動はできるか? 3.レコードが移動できたら、それに従い商品の絞り込みは変化するか?
補足
やっぱり、Accessのバージョンの違いだったのですね。 中分類選択フォームについては、了解しました!! また、下記の件ですが、 >1.#9画像のようなところで「中分類ID<->中分類ID」とできたか? できました!!ばっちり同じ画面が出てきて、まったく同じ作業ができました!! >2.「中分類選択フォーム」の「移動ボタン」を「はい」に替え、レコードの移動はできるか? できます!! >3.レコードが移動できたら、それに従い商品の絞り込みは変化するか? 絞込み内容も完璧に変化しています!! 上記、完璧にできていますが、ボタンを押すと、フォームは開くのに、絞込みだけができないです。。
>「商品選択」ボタンについては、あれから何度かやり直したりしてみましたが、やはり、うまく動作しません ボタンを貼り付けてから、ウイザードの各段階をキチンとチェックしてください。とくに「関連づけるフィールド」を指定する段階。関連づけが正しくできれば、下の方に表示される「関連づけるフィールド」の右側に「中分類ID<->中分類ID」が出現します。 またボタン作成後、そのボタンのプロパティで「イベント」の「クリック時」を見て、右の方にある「...」ボタンを押すと、以下のようなコードが見えるはずです On Error GoTo Err_コマンド6_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "商品一覧フォーム" stLinkCriteria = "[中分類ID]=" & Me![中分類ID] DoCmd.OpenForm stDocName, , , stLinkCriteria Exit_コマンド6_Click: Exit Sub Err_コマンド6_Click: MsgBox Err.Description Resume Exit_コマンド6_Click
補足
すみません、何度も最初から見直し、「商品選択」ボタンを試みているのですが、やはりうまくいきません。 なお、確認なのですが、中分類一覧フォームから中分類IDで関連づけるフォームは中分類選択フォームですよね?!商品一覧フォームですか? ただ、現時点では、どちらにしても絞り込まれません。 また、ボタンのプロパティで「イベント」の「クリック時」を見て、右の方にある「...」ボタンを押しても、ご連絡いただいたコードはみえません。 ウィザードでボタンを作成した後、「イベント」の「クリック時」の「...」を押して表示されているものは、以下の通りです。 「アクション」 フォームを開く 「フォーム名」 =ChrW(20995) & ChrW(20855) & ChrW(20013) & ChrW(20998) & ChrW(-26530) & ChrW(-28552) & ChrW(25246) & ChrW(12501) & ChrW(12457) & ChrW(12540) & ChrW(12512) 「ビュー」 フォーム ビュー 「フィルタ名」 空白 「Whrer条件式」 "[中分類ID]=" & [中分類ID] 「データモード」 空白 「ウィンドウモード」 標準 また、コマンドボタンウィザードの最終段階、「ボタン名を指定してください」にて、 「注意:このウィザードでは、Access2003、およびそれ以前のバージョンでは実行と編集ができない埋め込みマクロが作成されます。」 と書かれています。何か関係ありますでしょうか。 ちなみに、ボタン作成後、プロパティの「イベント」「クリック時」には、「埋め込みマクロ」と記載されます。 恐れ入りますが、間違っている箇所お分かりになりますでしょうか。 ほんとうに、お手数をお掛けいたしまして、申し訳ございません。。
>大分類や中分類の選択フォームにて、選択のテストをする際、名称欄の内容を手打ちで入力し直した場合には、テーブルのレコード内容が書き換えられてしまうのですが、手打ちで入力してテストすることは間違ってるのでしょうか 間違っています。必ずレコードの移動でやってください。親子フォームのリンクはIDによってなされています(そうでなければ修正してください)。レコードを移動すると、ユーザーから理解しやすい名称で確認しながら、リンク自体は確実なIDによってなされます。この仕組みを利用すれば、同じ名称があっても、備考で区別してリンクすることも可能になります。 現在作成中のプロトタイプはともかく、最終的に現場で使って貰うものは、フォーム自体を「更新の許可」を「いいえ」にするなど、データ保護の必要があります。そうしないとDBが収拾不能の混乱に陥ります。
補足
早速のご回答、ありがとうございます。 やっぱりそうですよね。。なんか変だなと思いつつ、やり過ごすところでした。 お伺いすることができて、ほんとうに良かったです。 ちなみに、当然でしょうが、レコードの移動で選択すると、レコード内容が書き換えられることはありませんでした。 小さいながら、重要な疑問が解決され、とてもスッキリしました。ありがとうございました。 なお、「商品選択」ボタンについては、あれから何度かやり直したりしてみましたが、やはり、うまく動作しません。 また、お時間がございます時に、ご教授くださいますよう、よろしくお願い申し上げます。 いつも、ほんとうにほんとうに、ありがとうございます。
補足
貴重なお時間をたくさん、たくさんさいていただき、また、いろいろとお考えいただき、ほんとうにほんとうに心より感謝申し上げます。 早速ですが、 >>受付フォームにて、受付をし、作業が完了した際には、再度、受付フォームを開いて、完了日を入力すれば良いのですよね?! >これでも良いですが、クエリーを使用すれば、完了日未記入のものだけを一覧表示して処理するようなこともできます。どちらかというとその方が良いでしょう につきましては、fuuten_no_nekoさまがおっしゃられるように、完了日未記入のものだけを一覧表示して処理する方法が私にもできるようであれば、是非そうしたいです!! 次に、顧客名についてですが、私の書き方が悪かったのですが、他のDBに存在するというのは、Accessではなく、全く異なったソフトにて売り上げ管理は行っておりますので、とりあえず、今回、顧客ID(オートナンバー)顧客名、ふりがな、備考のテーブルは必要になるかと思います。合ってますでしょうか? >>コンボボックスで選択 につきましては、ご指摘のように、商品の種類はコンボボックスで表示できる限界の10~20以上を裕に越し、現時点で数百ありますので、ご提案のグループ分け、さらには「大分類」「中分類」「小分類」の方法を取りたいと思います。 DBの仕様についてですが、 私にできるようであれば、ご提案の1~6の内容は最高!!です。 ただ、 >3.管理番号一覧フォームは新しい管理番号を追加でき、これはそれまでの最大プラス1になる の「最大プラス1になる」についてですが、 現在、すでに管理番号を取得している商品があり、それは、初めて受付をした日プラス2桁の連番を取っております。 例えば、商品Aを2009年3月11日に3点新規受付したとすると、管理番号は 商品A 09031101 商品A 09031102 商品A 09031103 となり、同じ、2009年3月11日に商品Bを3本新規受付すれば、 商品B 09031101 商品B 09031102 商品B 09031103 となっております。また、現場の人間に確認をしたところ、管理番号の取得形式は上記のとおりしたいとのことですので、なんとか、このような取得方法はできますでしょうか。 ほんとうに厚かましく申し訳ないのですが、どうかよろしくお願い申し上げます。