- ベストアンサー
【続】Access2002でレポート(納品書)に連番を打ち出したい
前質問:http://oshiete1.goo.ne.jp/kotaeru.php3?q=5243829 回答を締め切ったにも関わらず、まだハマっています。 前回の質問で、回答を得、テストDBではうまく行ったのですが、本番DBに移行してみると、うまく動いてくれません。 本番DBの構造は以下のとおりです。 (注文入力の裏にあるクエリの構造です) これを実行させようとすると、「あいまいな・・・」という例のメッセージが出て、うまくいきません。 私の経験不足が主な原因とは存じますが、解析可能な方がいらっしゃれば、幸いです。 また、「ここはどうなっているの?」という逆質問にも積極的にお答えしますので、何卒よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#7の補足を読むと、当該フォームは概ね私の意図したとおりに動き、そしてそれはcamo-tさんの望むものとは違うようです。 そもそも誤解の始まりは「質問番号:5243829」です。質問文の意味がはっきり読み取れなかったのですが、「文房具店に売っているような納品書には最初から連番が振ってあるものがありますよね?あのイメージです」だけを根拠として回答してきました。「最初から連番」がオートナンバーで振られる番号で、文房具店の納品書が動的に動かないように、従業員(コード)が変わっても、連番が変わることはありません。 ともかく本件はそろそろ打ち止めにしたいです。私が回答するかどうかは別にして、そもそもの仕様やテーブルの構造、相互の関係などを明確にした質問文を新規作成することを強くお奨めします。
その他の回答 (7)
#6です。 納品書番号(テーブル)の構造を確認してください。 納品書番号:オートナンバー(主キー) 従業員コード:整数(インデックスを着けるならば「重複あり」)
補足
早速のご回答ありがとうございます。 納品賞番号テーブルはいたって簡単に作っております。 納品書番号:オートナンバー 従業員コード:テキスト(従業員マスタテーブルの型がテキストのため)インデックスは「はい(重複あり)にしてあります 主キーが「従業員コード」になっていましたので、訂正しました。 結果、下記のような動作になっております。 ・フォームをオープンすると、カナで一番最初の従業員の従業員コードと、それに紐づいている納品書番号が表示される ・コンボボックスで従業員コードを選択しても、納品書番号は変わらない(そのまま終了させると、従業員テーブルの内容が、フォームの最終状態(たとえば、納品書番号:2、従業員コード:123だったものを、納品書番号:2、従業員コード:456、に変更して終了))で保存されてしまう(納品書テーブルの中身が書き換わっています) ・新規レコードの入力状態(►*を押下)にすると、 納品書番号:(オートナンバー) 従業員コード:空白 となり、その後コンボボックスから従業員コードを選択すると、紐づいた納品書番号が表示されるが、一度選択すると、従業員コードを再選択しても、納品書番号は変わらない(従業員コードを選択すると、納品書テーブルで紐づいている納品書番号が表示されますが、再選択しても納品書番号は変わりません) という状況です。
#5です。 (かねがね感じていたことですが)もう少し回答をキチンと呼んで欲しいです。例えば >1.▼をクリックし、出てきた従業員コードの一覧を選択しても、それが反映されない状況です。 わたしが1.で問題にしたのは「コントロールソース」です。なぜならば「#Name?」が出る原因の一つとして、コントロールソースが正しくない場合が考えられるからです。実行時のコンボボックスの▼ではなく、「コントロールソース入力テキストボックス右側の▼」です。 同じように2.で「全てのSQL文」が提示されることを要望しましたが、結果は「コンボボックスの値集合ソース」だけでした。さらにこれも「コンボボックスのコントロールソース」と誤って標記されています。もし誤りでなくコンボボックスのコントロールソースがこうなっているならば、根本的に間違っています。 このようにちぐはぐな「回答」と「補足」が続くと、これ以上回答を続ける意欲がなくなります。
お礼
訂正いたします。 ------------------------------------------------------ コンボボックスのコントロールソースは下記のとおりです。 SELECT 従業員マスタ.従業員コード, 従業員マスタ.従業員名, 従業員マスタ.従業員名カナ FROM 従業員マスタ ORDER BY 従業員マスタ.従業員名カナ; ------------------------------------------------------ と記述しましたが、正確には、 コンボボックスの「値集合ソース」が上記SELECT文になります。 すみませんでした。 ちなみにコンボボックスのレコードソースは「従業員コード」としております。 よろしくお願いいたします。
補足
大変不愉快な思いをさせてしまい、申し訳ないです。 1.ですが、▼で、コントロールソースを「従業員コード」にしましたところ、「#Name?」は出なくなり、リストボックスから選択すると、きちんと従業員コードが表示されるようになりました。 2.ですが、納品書番号は連動しません。 フォームのレコードソースは下記のとおりです。 SELECT 納品書番号.納品書番号, 納品書番号.従業員コード FROM 納品書番号 ORDER BY 納品書番号.納品書番号 コンボボックスのコントロールソースは下記のとおりです。 SELECT 従業員マスタ.従業員コード, 従業員マスタ.従業員名, 従業員マスタ.従業員名カナ FROM 従業員マスタ ORDER BY 従業員マスタ.従業員名カナ; 上記のとおり、問題がございます。 フォームでコンボボックスで従業員を選択し(納品書番号は自動的には変更されません)、保存しようといたしますと、下記のメッセージが出て、保存できません。 「インデックス、主キー、またはリレーションシップで値が重複しているので、テーブルを変更できませんでした。重複する値のあるフィールドの値を変更するか、インデックスを削除してください。または重複する値を使用できるように再定義してください。」 ちょっと迷路に入ってしまっているようです。。。すみません。
#4です。状況がはっきり把握できないのでいくつかアドバイス的に 1.コントロールソース 「#Name?」はコントロールソースが正しくない場合などに表示されます。タイプミスを避け、かつ効率よく指定するためには、コントロールソース入力テキストボックス右側の▼を利用します 2.SQL文 当該フォームにはレコードソースのSQL文とコンボボックスの値集合ソースのSQL文が関係します。キチンと提示してください 3.問題を切り分け トラブルが発生するときは、なるべく問題を単純にして、それから積み上げてゆきましょう。当該フォームではテーブル一つだけのクエリで、フィールドも三つぐらいのものに絞り込んでみましょう 4.新たに質問 質問したい内容が変わったときは、補足ではなく、新たに質問した方が良い場合が多いです。回答者の幅が広がるし、画像も新たに添付できます
補足
1.▼をクリックし、出てきた従業員コードの一覧を選択しても、それが反映されない状況です。 2.下記に納品書フォームのコンボボックスのコントロールソースをご提示いたします。 最初にクエリの関連図をご提示させていただきましたが、その テーブル名に変更しております。 ---------------------------------------------------------------- SELECT 従業員マスタ.従業員コード, 従業員マスタ.従業員名, 従業員マスタ.従業員名カナ ---------------------------------------------------------------- 3.そうですね。今作っているフォームは、「納品書番号」テーブルと、「従業員マスタ」テーブルの二つを参照する作りになっています。です。 ただ、上記のとおり、問題のコンボボックスは「従業員マスタ」のみ参照しています。 4.この問題につきましては、今後、配慮します。ご指摘ありがとうございました。
顧客を選択できる納品書(登録)フォームの作り方 1.新規フォームを作成(納品書フォーム) 2.フォームのレコードソースを SELECT 納品書テーブル.納品書ID, 納品書テーブル.納品日付, 納品書テーブル.顧客ID FROM 納品書テーブル ORDER BY 納品書テーブル.納品書ID; とする 3.フィールドリストから「納品書ID」と「納品日付」をフォームにドロップする 4.「顧客テーブル」に「フリガナ:テキスト型」を追加しておく 5.ツールボックスでコンボボックスを選び、フォームの適当な位置にボックスを描く 6.コンボボックスのコントロールソースを「顧客ID」にする 7.コンボボックスの値集合ソースを SELECT 顧客テーブル.顧客ID, 顧客テーブル.顧客名, 顧客テーブル.フリガナ FROM 顧客テーブル ORDER BY 顧客テーブル.フリガナ; にする 7.コンボボックスの連結列を1にする 8.コンボボックスの列数を3、列幅を0cm;2.501cm;2.501cm、幅を5cmにする 以上を実行すると、新しいレコードで顧客をドロップダウンリストから選択でき、連番は自動的に振られてゆくことが確認できるでしょう。納品書の各アイテムは次回、子フォームを貼り付けたサンプルを提示します 留意点:ドロップダウンリストからの選択はせいぜい20件以内が実用的です。それ以上から選択しなければならないときは、別の仕掛けを考えましょう。 7.
補足
遅くなりました。 また、丁寧に教えていただき、ありがとうございます。 こちらの実際のテーブル名、フィールド名に合わせて、SQLを書き直し、フォームを作りました。 実行させますと、なぜかコンボボックスに「#Name?」と表示されてしまいます。 ドロップダウンリストは社員番号が入ったリストが出ますが、選択しても「#Name?」のままです。 SQLに間違いはないはずなのですが。。 これだけの情報で伝わりますでしょうか? (画像を貼り付けられないのがもどかしいです)
#2です。提示されたSQLは試験再現するのに、まずテーブル設計の変更が大変で、とても着手する気になれません。そもそもこのようなSQL文が必要なのか疑問です。#2に書いたような方針ならばクエリは非常に単純で済みます。 1.新規注文書(納品書にも使う)→オートナンバーで連番取得 2.担当者や日付その他を入力 3.複数項目(商品)入力 上記のような流れで良ければサンプルを提示できます
補足
ご回答ありがとうございます。 まず、SQL文ですが、クエリ作成の際、自動生成されたものですので、手の出しようがありませんでした。私自身、長いと感じますが、そもそもSQL文の知識が乏しく、簡潔にできないのが実情です。 GUIが便利だからといって、D&D等で作成すると、やはりこうなっちゃうんですね。 次に、サンプルですが、お手数でなければご提示いただければ幸いです。例があると、いじって何とかなるかもしれません。 今までのDBの構造にこだわらず、新しいDBに作り変えてもいい、位の思いです。
質問が曖昧で、回答しにくいです。何をやろうとしてどこでエラーするのか? SQL文も最初から表示して欲しかったですが、質問では「「あいまいな・・・」という例のメッセージが出て、うまくいきません」が、補足では「クエリの実行時にはエラーは出ないものの、実行結果は空白」となっています。ひょっとしてその空白状態で入力しすると「あいまいな・・・」となる? 別の角度から。 納品書(注文書)の構造は下記のようなものでしょうか? ヘッダ的に 発注者/年月日など一意のデータ これにぶら下がる、複数の項目 商品名、単価、数量、etc これで良いならば親子フォームの使用がお奨めです。
お礼
補足の補足です。(お礼欄にしか記述できないんですね) すみません。 ちょっと様子が変わっています。 昨日、色々弄くっていたときは、上記補足のような「結果が空白」だったのですが、今、データベースを一旦元に戻し、新しく納品書テーブルを作り直し、中に従業員IDデータを入力した上でクエリを起動したところ、従業員:納品書番号=1:1、で納品書番号が自動生成されました。 しかし、このままですと、ある従業員に対する納品書は、常に同じ納品書番号になってしまうことになります。 ここを解決したいのですが。。。 念のため、もう一度SQLを掲載いたします。 SELECT 注文テーブル.受付年月日, 注文テーブル.控除年月, 注文テーブル.現金入金, 注文テーブル.従業員コード, 商品マスタ.契約番号, 納品書番号.納品書番号, 注文テーブル.商品コード, 注文テーブル.数量, 商品マスタ.ポイント, 従業員マスタ.従業員名, 商品マスタ.商品名名, 商品マスタ.サイズ, 商品マスタ.色, 商品マスタ.商品グループコード, 商品マスタ.控除区分, 商品マスタ.単価 FROM (事業所マスタ RIGHT JOIN ((商品マスタ RIGHT JOIN 注文テーブル ON 商品マスタ.商品コード = 注文テーブル.商品コード) LEFT JOIN 従業員マスタ ON 注文テーブル.従業員コード = 従業員マスタ.従業員コード) ON 事業所マスタ.事業所コード = 従業員マスタ.事業所コード) INNER JOIN 納品書番号 ON 注文テーブル.従業員コード = 納品書番号.従業員コード WHERE (((商品マスタ.控除区分)="0")) ORDER BY 注文テーブル.受付年月日, 注文テーブル.控除年月, 注文テーブル.現金入金, 注文テーブル.従業員コード; 長きに渡ってお手数をおかけしますが、何卒よろしくお願いします。
補足
大変申し訳ないです。 まず、やろうとしていることをまとめます。 ・注文入力(これは一般的なものと考えていただいて結構です) ・クエリで、従業員IDと注文IDを選択し、納品書の元データを作る (どの従業員に対し、何が納品されたかを打ち出したい) ・納品書を打ち出す際、従業員や注文に関係なく、ユニークな番号を つけたい (これが大元の要望です) 次に、「あいまいな・・・」の件ですが、一旦納品書テーブルからデータをなくしてみたら(つまり「納品書番号(オートナンバー)」と従業員ID(テキスト)が一切入っていない状態)、エラーは出なくなりました。が、クエリの実行結果には何も入っていない状態です。 従業員IDや注文IDを指定しても、しなくても、結果は空白です。 納品書の構造は、おっしゃるとおりで行きたいと思っております。
- nda23
- ベストアンサー率54% (777/1416)
(1)INNER JOIN と LEFT JOIN が混在している (2)「従業員コード」のように同名のフィールドがあるのに修飾がない 以上の原因が考えられます。SQLビューで、SQL全文を掲載した方が 良いでしょう。
補足
前の質問に引き続き、ありがとうございます。 現在の状況ですが、クエリの実行時にはエラーは出ないものの、実行結果は空白(なにもデータが表示されない)状態です。 クエリの裏のSQLをそのまま載せてみます。 よろしくお願いします。 --------------------------------------------------------------- SELECT 注文テーブル.受付年月日, 注文テーブル.控除年月, 注文テーブル.現金入金, 注文テーブル.従業員コード, 商品マスタ.契約番号, 納品書番号.納品書番号, 注文テーブル.商品コード, 注文テーブル.数量, 商品マスタ.ポイント, 従業員マスタ.従業員名, 商品マスタ.商品名名, 商品マスタ.サイズ, 商品マスタ.色, 商品マスタ.商品グループコード, 商品マスタ.控除区分, 商品マスタ.単価 FROM (事業所マスタ RIGHT JOIN ((商品マスタ RIGHT JOIN 注文テーブル ON 商品マスタ.商品コード = 注文テーブル.商品コード) LEFT JOIN 従業員マスタ ON 注文テーブル.従業員コード = 従業員マスタ.従業員コード) ON 事業所マスタ.事業所コード = 従業員マスタ.事業所コード) INNER JOIN 納品書番号 ON 注文テーブル.従業員コード = 納品書番号.従業員コード WHERE (((商品マスタ.控除区分)="0")) ORDER BY 注文テーブル.受付年月日, 注文テーブル.控除年月, 注文テーブル.現金入金, 注文テーブル.従業員コード;
お礼
了解いたしました。 そもそも、私の質問の仕方、データの提示の仕方が悪かったと反省しております。 今までいただいた多くのヒントを元に、一からテストDBを作成し、問題点をきちんと整理したうえで、おっしゃるとおり、新しい質問に切り替えます。 今まで長くの間、ありがとうございました。