- ベストアンサー
Access2002で連番のついた納品書を出力したい
- Access2002で複数の注文をまとめ、ユニークな連番を振った納品書を出力したい方法を教えてください。
- 現在、フォームを使って納品書番号をオートナンバーで振ることは成功していますが、納品対象の注文を選択する方法がわかりません。
- 納品書の基本単位は従業員ごとで、納品がバラバラに行われることが多いので、注文情報から注文番号で選択してレポートに出力したいです。
- みんなの回答 (18)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
だんだん回答することに疲れてきました。もう少し解決するための努力をして欲しいです。当方に依存してばかりでは技術者(プログラマー)として自立できません。 と、これだけでもなんなので。 問題をできるだけ切り分ける(以前にも書いたはず) 1.当該SQL文からクエリを作成し、直接実行する 2.変化がない(0件のレコードが更新されます)ならば、選択クエリに変更して、なぜ0件なるかしらべる 3.クエリが有効ならばVBAが確実に実行されているか、ブレークポイントを設けたり、ステップインで実行してみる
その他の回答 (17)
>D)納品書に記載したい注文にチェックをつけ終了 これでは不充分です。 #10で回答した >>4.そこでコマンドボタンを押下すると、親子とも空白になる このステップがないと必要な書き換えが発生しません >4.に、 >「これで新規納品書作成後に「納品書番号(選択)」を閉じると、最新の納品書が表示されます」 >これがうまく行きません。 >選択のほうを閉じても、呼び出した側の「納品書番号」の表示が変わらないのです。書いていただいたとおりに作業したのですが。。 書き換えが発生していないので、当然ですね
補足
早速のご回答、ありがとうございます。 コマンドボタンは押下しました。 コマンドボタンの裏のコードは下記のとおりです。 Me.注文テーブルのサブフォーム(選択).Requery DoCmd.SetWarnings False DoCmd.RunSQL "UPDATE 注文テーブル SET 注文テーブル.納品書ID = [Forms]![納品書(選択)]![納品書ID] WHERE (((注文テーブル.納品書ID)=0) AND ((注文テーブル.選択)=True) AND ((注文テーブル.顧客ID)=[Forms]![納品書(選択)]![顧客ID]));" DoCmd.SetWarnings True Me.Requery コマンドボタンを押下しても、納品書番号(選択)、納品書番号ともに表示は変更されません。 一度、納品書テーブルの全レコードを削除し、注文テーブル内の「納品書IDフィールドを全て「0」にしました。 そこで「納品書番号」フォームを起動すると、親も子も何も表示されません(「選択」を呼び出すコマンドボタンすら表示されません)。 「納品書番号(選択)」、を起動し、顧客IDを選択すると、納品書番号が付与され、子フォームにその顧客の注文情報が全て表示されます。 その上で、打ち出したいレコードのチェックボタンにチェックをつけ、コマンドボタンを押下しても、表示は変わりません。 また、その状態で注文テーブルを確認すると、チェックを入れたレコードにチェックは入っていますが、肝心の納品書Noが書き換えられておりません。(「選択」フォームを終了させても書き換えは起こりませんでした) 上記コードの他に、何かご提示すべきものがございましたら、ご指示くださいませ。 よろしくお願いします。
>>3.ウィザードが起動したら >の意味が分かりません。 ツールボックスで、上から2番目の「コントロールウィザード」がオンになっていれば、ボタンをフォーム上に配置した瞬間に「コマンドボタンウィザード」が起動します
補足
お手数をおかけしております。 また、不愉快な思いばかりさせてしまい、申し訳ないです。 下記ご回答で頂いた手順に沿い、作業を進めております。 いくつか確認させていただきたい部分がございますので、記述させていただきます。 1.この手順どおりにDBを作成すれば、使用者は次のような手順で操作することになるのでしょうか? A)注文情報の打ち込み(既存と同じ) B)「納品書番号」フォームを開く C)「納品書番号」の中のコマンドボタンで「納品書番号(選択)を開く D)納品書に記載したい注文にチェックをつけ終了 E)「納品書番号」フォームの中のレコードが変更され(印刷したいものだけになっている?)、フォームの中のコマンドボタンでレポートを表示させ、印刷する この認識で間違っていないでしょうか? 2. 4.に、 「これで新規納品書作成後に「納品書番号(選択)」を閉じると、最新の納品書が表示されます」 これがうまく行きません。 選択のほうを閉じても、呼び出した側の「納品書番号」の表示が変わらないのです。書いていただいたとおりに作業したのですが。。。 「納品書番号」のほうは、納品書番号が振られた注文、振られていない注文、どちらも全て表示されています(顧客IDに紐づいたもの全て)。「納品書番号(選択)」でチェックをし、保存した後終了させても同じです。 この後、続けて質問しようかと思いましたが、恐らく2.が解決しないと 前に進んでもFuutenさんを混乱させるだけだと思いますので、ここで一旦区切らせていただきたく存じます。 よろしく願いします。
改めて、「新規質問」にしてください。理由は以前に書いたこともあるのですが、それ以外に、「このままでは情報が共用されない」と云うことがあります。レポートに関心がある人で、このスレッドに辿り着く人はいないでしょう。と云うことで、一応これまでの総括的なことを 1.納品書の一覧 以前作成した「納品書番号」のレコードソースを SELECT 納品書テーブル.納品書ID, 納品書テーブル.納品日付, 納品書テーブル.顧客ID FROM 納品書テーブル ORDER BY 納品書テーブル.納品書ID DESC; に変更して、新しいものが先に見えるようにします 2.フォームのプロパティで「データ」の「追加の許可」を「いいえ」にします。 3.ウィザードが起動したら「フォームの操作」「フォームを開く」と進み、「納品書番号(選択)」を開くようにします。これでいつでも新規納品書を作成できます 4.「納品書番号」フォームのイベントで「アクティブ時」を「[イベント プロシージャ]」にし編集ボタン(…)を押して、以下のようにします Private Sub Form_Activate() Me.Requery End Sub これで新規納品書作成後に「納品書番号(選択)」を閉じると、最新の納品書が表示されます 5.レポート「納品書」の作成 レコードソースは SELECT 納品書テーブル.納品書ID, 納品書テーブル.納品日付, 従業員マスタ.従業員名 FROM 従業員マスタ INNER JOIN 納品書テーブル ON 従業員マスタ.従業員ID = 納品書テーブル.顧客ID WHERE (((納品書テーブル.納品書ID)=[Forms]![納品書番号]![納品書ID])); 6.レポートにフィールドリストから「納品書ID」「従業員名」などを貼り付けます 7.「納品書番号」をデザインモードで開き、ボタンを追加し「納品書」レポートをプレビューで開くようにします。これで任意の納品書が印刷できるようになります 8.実際のレポートは納品書番号に対応するアイテムが並ぶ必要がありますが、これはレコードソース(クエリ)を拡張することでもできるし、親子レポートにすることでも可能です。色々試してください
補足
お言葉に従い、新規質問を立ち上げました。 http://oshiete1.goo.ne.jp/qa5299784.html 現在、頂いた回答に基づいて作業しておりますが、 >3.ウィザードが起動したら の意味が分かりません。 どういうタイミングで起動するのでしょうか? 基本的なことなのかもしれませんが、どうぞよろしくお願いいたします。
>追加で質問ですが、 これも前に同じようなことを書きましたが、新たな質問として出してください。理由はその時書きました。 と、これだけでもなんなので >今回のようなちょっと特異な(?) 特異とは思いません >納品書を打ち出す際、クエリを新たに準備してレポートで印刷すべきなのか、 レポートをお奨めします。「クエリを新た」と云うか、レポートに埋め込まれたクエリ(レコードソースに書かれたSQL文)をお奨めします。レポートに限らず、フォームでも同じ事ですが
補足
新たに質問を設けることも考えましたが。。。 すみません、ここで続けさせてください。 理由は、細切れのQAが並んでも、第三者が見て理解できないと思ったからです。(だったら最初から質問を分けるな!と叱られそうですが) レポートに埋め込まれたクエリをお奨め、とのことですが、さっぱり分からないのが現状です。 (格闘したのですが・・・) レポートにのレコードソースを転記して実行すると、エラーになります。 注文テーブルを元に、納品書テーブルや顧客マスター、商品マスターからデータをつなげてクエリを作成し、それを元にレポートを作っても、「選択」のチェックが無視され、1顧客に紐づいた注文情報が全件出力されます。 もう少しお付き合い願えますか?
>しかし、フォームで顧客IDを選択し、「選択」もチェックを入れた上でクエリを実行しても「0件のレコードが更新されます」となり、テーブルのUPDATEが行なわれていない様子です。 当該更新クエリをデーターシートビューで見ると、選択結果を見られます。現状では0件。 で、今ある3条件を一つずつ外してみる。何故0件になるか判るでしょう。 それでも判らない場合は、当該更新クエリのSQL文を補足提示してください。
補足
なるほど、連動してSQLが更新されていき、条件を削るとヒットするデータが増えていきますね。 勉強になりました。 ありがとうございました。 ちなみに、該当SQLは下記のものです。 ------------------------------------------------------------- UPDATE 注文テーブル SET 注文テーブル.納品書ID = Forms!納品書(選択)!納品書ID WHERE (((注文テーブル.納品書ID)=0) And ((注文テーブル.選択)=True) And ((注文テーブル.顧客ID)=Forms!納品書(選択)!顧客ID)); ------------------------------------------------------------- 追加で質問ですが、今回のようなちょっと特異な(?)納品書を打ち出す際、クエリを新たに準備してレポートで印刷すべきなのか、フォームの体裁を納品書のものにし、直接印刷すべきかで悩んでいます。 お勧めの方法はありますでしょうか?
#11で書き忘れましたが、クエリを試験するときは「納品書番号(選択)」がアクティブになっていないと駄目です。
補足
ありがとうございます。 先ほど、補足で書きましたクエリで入力を求められる件は、こういうからくりだったのですね。失礼しました。 フォームを起動した上でクエリを実行すると、入力を求められることはなくなりました。 しかし、フォームで顧客IDを選択し、「選択」もチェックを入れた上でクエリを実行しても「0件のレコードが更新されます」となり、テーブルのUPDATEが行なわれていない様子です。
>5.納品書IDと、顧客IDの入力を求められます >6.表示されている納品書IDと顧客IDを入力 この状態では、私がユーザーならば怒ります。5.6.のステップなしで動作しなければ。 上手く行かない原因は更新クエリの不具合です。多分「ID」が全角か半角かと云った問題でしょう。対策ですがSQL文からクエリを作成し、デザインビューで修正を試みるのが楽でしょう。 1.当該クエリを作り、デザインビューで開く 2.「顧客ID」の「抽出条件」を空白にする 3.そのテキストボックスでマウス右ボタンをクリックし、ドロップダウンメニューから「ビルド」を選択 4.左下のツリー構造で、「フォーム」左の「+」をダブルクリック 5.「全てのフォーム」左の「+」をダブルクリック 6.「納品書番号(選択)」を選択 7.中下のボックスから「顧客ID」を選択し、「貼り付け」ボタンをおす 8.「OK」ボタンを押す 9.同様にして「納品書ID」の「レコードの更新」も修正する 10.動作することが確認できたならば、SQL文にしてVBAコードの当該部分を修正する 以上です。ちなみに#9で示したSQL文は、上記3.以降を実行した結果です。
補足
おっしゃるとおり、クエリの不具合でした。 自己嫌悪に陥っております。 (ちょっとMSに文句が言いたいのは、SQL等を記述した際、存在しないテーブルやフィールドを指定しても、警告やエラーメッセージが出ないことです。今回のように実行して気がつく場合はいいのですが、裏で動き、UIのないものはとても困りますね。。。) さて、修正した結果、メッセージボックスは表示されなくなり、注文テーブル、納品書テーブル共にレコードが正常に更新していることを確認いたしました。 ありがとうございました。 今後、フォームで絞り込んだレコードをレポートに落とし込む作業にうつります。 まず自分でやってみようと思っておりますが、注意点などございましたらご教授いただけると幸いです。 また、クエリの方も勉強します。 (ちなみに、修正したフォームからSQLを抜き出し、クエリに貼り付けて実行してみたのですが、納品書IDと顧客IDの入力を求められます。不思議です) 今後もご指導、よろしくお願いします。
>1.フォームを開くと親子ともに空白のフォームが表示 >2.コマンドボタンを押下しても、各テーブルに変化なし >3.フォーム上で顧客IDを選択すると、紐づいた注文データが表示される ちょっと一言忘れていました(^^; 3.5納品書に取り込みたいアイテムの「選択」チェックボックスを「チェック」する >4.そこでコマンドボタンを押下すると、親子とも空白になる >5.注文、納品テーブルを確認 これでどうでしょう?もし変化がないならば DoCmd.SetWarnings Fals を頭に「'」を付けて 'DoCmd.SetWarnings Fals としてから、もう一度1.~5.を試験してください。 >実行すると、納品書IDと、顧客IDの入力を求められます。 これも一言忘れていました(^^; フォーム「納品書番号(選択)」を実行し、顧客を選んだ状態で試してください
お礼
お世話になっております。 色々いじったり、確認しながら進んでいるわけですが、上記、5~8の部分を自動化できずにいます。 顧客IDを選択し、どの注文を納品書として表示するのかを選択し(チェックボタン)、納品番号はオートナンバーで振られているのに、なぜメッセージボックスから「顧客ID」と「納品書番号」を入力しなければいけないのでしょうか? 少なくとも親フォームと子フォームはリンケージされていると思っておりますので、解決策がございましたらご教授願いたく存じます。
補足
お礼とご回答が入れ違いになりましたね(^^ 先ほどお礼で報告した実行時のエラーは、注文情報と、注文テーブルの誤記でした。(凡ミスの嵐・・・) 修正すると、うまく動きました。 状況は、下記のとおりです。 1.起動するとすべて空白 2.顧客を選択すると紐づいた注文情報表示 3.納品したい注文にチェック 4.コマンドボタン押下 5.納品書IDと、顧客IDの入力を求められます 6.表示されている納品書IDと顧客IDを入力 7.空白ページに戻る 8.納品書と注文テーブルの納品書IDが更新、追記されている ここまでの動作でOKでしょうか?
>名称は単なる識別子だと思っていましたが、参照するときに使っていたんですね ここら辺はアクセスのいい加減なところで、バグの温床だと思います。私は嫌いですね。リンクするところで選択肢として出しておいて、「実は違う」は酷いと思います。だからマイクロソフトは嫌いです。 ともかく本題に。若干VBAも使用します 1.サブフォームにチェックボックスを追加し、コントロールソースを「選択」(追加したyes/noフィールド)にする 2.メインフォームにコマンドボタンを貼り付ける 3.コマンドボタンのプロパティでイベントのクリック時右の…をクリックしコードビルダを選択 4.VBエディターが起動されるので下記を貼り付ける Me.注文情報のサブフォーム.Requery DoCmd.SetWarnings False DoCmd.RunSQL "UPDATE 注文テーブル SET 注文テーブル.納品書ID = [Forms]![納品書番号(選択)]![納品書ID] WHERE (((注文テーブル.納品書ID)=0) AND ((注文テーブル.選択)=True) AND ((注文テーブル.顧客ID)=[Forms]![納品書番号(選択)]![顧客ID]));" DoCmd.SetWarnings True Me.Requery 以上で試験してください。上手く行けば納品書番号(選択)フォームとサブフォームから全てのデータがなくなります。さらに「注文テーブル」を開いて、納品書番号が正しく入っていることも確認してください。以下は当該VBAの簡単な解説です Me.注文情報のサブフォーム.Requery 最後にチェックした「選択」をDBに書き込みます。カレントレコードを移動しても同じようなことが起こります。 DoCmd.SetWarnings False これをやらないと、更新クエリ実行時に警告が表示されます DoCmd.RunSQL "UPDATE 注文テーブル SET 注文テーブル.納品書ID = [Forms]![納品書番号(選択)]![納品書ID] WHERE (((注文テーブル.納品書ID)=0) AND ((注文テーブル.選択)=True) AND ((注文テーブル.顧客ID)=[Forms]![納品書番号(選択)]![顧客ID]));" ””の中身(SQL文)を適当なクエリに貼り付けて、意味を確認してください DoCmd.SetWarnings True 警告が表示されるように戻します Me.Requery 新しい納品書作成のスタンバイに移行します
お礼
おそらく呆れてしまわれていると思います。 凡ミスが発覚しましたので、ご報告しなおします。 まず、凡ミスですが、IDとIDを思い違いしていました。 こちらはすぐ修正いたしました。テーブルでは納品書IDのみ半角「ID」になっていましたので、テーブルのほうを「納品書ID」としました。 (他にもIDを使っているフィールドがあり、統一させるためです) それと、SQLに Me.注文情報のサブフォーム.Requery を入れ忘れていました。すみません。 ここで質問なのですが、この文中の「注文情報のサブフォーム」は「注文情報のサブフォーム(選択)」ではないでしょうか?(結果は下記のとおり同じでしたが・・・) さて、上記を修正し、実行してみましたところ、コンパイルエラーが発生します。 「メソッドまたはデータメンバが見つかりません」とメッセージが出て、 Me.注文情報のサブフォーム.Requery の「注文情報のサブフォーム」部分にフォーカスが当たっています。 SQLは下記のとおりです Private Sub コマンド7_Click() Me.注文情報のサブフォーム.Requery DoCmd.SetWarnings False DoCmd.RunSQL "UPDATE 注文テーブル SET 注文テーブル.納品書ID = [Forms]![納品書番号(選択)]![納品書ID] WHERE (((注文テーブル.納品書ID)=0) AND ((注文テーブル.選択)=True) AND ((注文テーブル.顧客ID)=[Forms]![納品書番号(選択)]![顧客ID]));" DoCmd.SetWarnings True Me.Requery End Sub 「注文情報のサブフォーム」を「注文情報のサブフォーム(選択)」に変更しても同じです。
補足
早朝からのご回答、ありがとうございます。 早速試してみましたところ、下記のような状態です。 1.フォームを開くと親子ともに空白のフォームが表示 2.コマンドボタンを押下しても、各テーブルに変化なし 3.フォーム上で顧客IDを選択すると、紐づいた注文データが表示される 4.そこでコマンドボタンを押下すると、親子とも空白になる 5.注文、納品テーブルを確認しても、変化なし ちなみに、注文テーブル上の納品書IDは、すべて「0」にしてあります。 また私の凡ミスなのかもしれませんが。。。 コードは下記のとおりです。 こちらの環境に合わせて「ID」を「ID」に変更しました。 Private Sub コマンド7_Click() DoCmd.SetWarnings False DoCmd.RunSQL "UPDATE 注文テーブル SET 注文テーブル.納品書ID = [Forms]![納品書(選択)]![納品書ID] WHERE (((注文テーブル.納品書ID)=0) AND ((注文テーブル.選択)=True) AND ((注文テーブル.顧客ID)=[Forms]![納品書(選択)]![顧客ID]));" DoCmd.SetWarnings True Me.Requery End Sub あと、「””の中身(SQL文)を適当なクエリに貼り付けて、意味を確認してください」とのお言葉にしたがって、クエリにSQLを貼り付け、実行すると、納品書IDと、顧客IDの入力を求められます。
だいぶポイントが絞られてきたので、こちらでも似たような状況が再現できました。これが原因だと良いのですが。 メインフォームのコンボボックス(顧客選択用)の「名前」(コントロールソースではない)は何になっているでしょうか。「従業員ID」のままでは?もしそうであれば「顧客ID」に修正してください。
お礼
記入する箇所がここにしかございませんでしたので、ここにてご連絡させていただきます。 その後も色々試行錯誤した結果、メッセージボックスで記入を求められる原因が判明しました。 SQLで指定しているテーブル名称が違っていたためでした。 おそらく先のお礼以降、調べていただいているかと存じますが、大変申し訳なく存じます。 どうもすみませんでした。 修正した結果、メッセージボックスは表示されなくなり、注文テーブル、納品書テーブル共にレコードが正常に更新していることを確認いたしました。 今後、フォームで絞り込んだレコードをレポートに落とし込む作業にうつります。 まず自分でやってみようと思っておりますが、注意点などございましたらご教授いただけると幸いです。 (クエリからレポートを作成した経験しかございませんので、前途多難です) 今後もご指導、よろしくお願いします。
補足
ありがとうございます。 早速調べました。 「コンボ2」になっていました。。。。。。 盲点でした。 名称は単なる識別子だと思っていましたが、参照するときに使っていたんですね。 持っているテキストにも書かれていない新事実でした。 修正したところ、コンボボックスで選択した顧客コードに紐づいた注文テーブルのレコードがサブフォームに表示されました! それにしてもfuuten_no_nekoさん、すごい技術をお持ちですね! 貴殿の回答履歴を拝見いたしましたが、ジャンルも多岐に渡っていて、尊敬します。 お忙しいこととは存じますが、引き続き「選択したものを表示させる」という課題に関しましても、よろしくお願いいたします。
- 1
- 2
お礼
大変長らくのお付き合い、ありがとうございました。 なんとか自力でレポートの出力までこぎつけました。 リンクさせるフィールド(納品書番号)をサブレポートのSELECT文の中に埋め込み、リンクさせ、あとは必要なフィールドを貼り付けるだけでうまく行きました。もちろん。グルーピングなども設定いたしました。 途中、大変不愉快な思いもさせてしまい、申し訳ありませんでした。 今後はこのようなことのないよう、気をつけます。 どうもありがとうございました。
補足
大変ご迷惑をおかけし、申し訳ないです。 このご回答を頂き、自己解決しようと、テストDBを作り、うまく動作したので本番のDBに移しこみ、納品書フォームからレポートを呼び出し、そこには ・顧客名 ・納品日付 ・納品書番号 が表示できるようになりました。 その後、注文の詳細情報をレポートに表示させようと、サブレポートに注文テーブルのサブフォームを貼り付けたりしているのですが、どうもうまく行きません。 親子リンクをうまく設定できずにいます。と申しますか、フォームの親子は「顧客ID」が双方にあったのですんなりいったのですが、レポートはリンクを張るための一致するフィールドがないのです。 なにかお知恵かヒントを拝借したいのですが。。。 何卒よろしくお願いします。