こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Access2002でレポート(納品書)に連番を打ち出したい

色々検索したのですが、なかなかヒットせず、質問させていただくことにしました。

要望は単純です。でも、私に回答を導くことはできませんでした。

一般的な「納品書」をレポートで印刷する際、連番(ユニークであればなんでもかまいませんが)を振って、印刷したいのです。

裏にあるテーブルやクエリには連番フィールドがないので、困っています。と申しますか、フィールドをどこかに作ろうと思っても、リレーションをつなぐ相手がいないのです。
「注文」に紐付けるにも、納品書は複数の「注文」から成り立っているので、相手が複数になりますし、「顧客」に紐付けると、今度はユニークにならず。。。

「連番テーブル」みたいなものを独立させ、クエリを実行するたびに[番号+1]のような処理をさせようかとも考えましたが、独立したテーブルを作ってクエリに紐付けると、Accessから怒られまして。。。

文房具店に売っているような納品書には最初から連番が振ってあるものがありますよね?あのイメージです。

どなたか解決策をお持ちの方がいらっしゃれば、是非ご教授お願いいたします。

投稿日時 - 2009-08-28 16:23:03

QNo.5243829

困ってます

質問者が選んだベストアンサー

#6です
>>新規作成→オートナンバーで連番が自動作成される
>これはどういう操作でしょうか?
新規作成は、「納品書新規作成」のつもりでした。#6に書いたような構造を持つ、「納品書テーブル」の存在が前提です。このテーブルに「納品書ID:オートナンバー」が存在しなければならないですが、「その作り方も判らない」ようであれば、入門書などで勉強してください。

>>新規レコード追加→親子の関連づけにより「注文テーブル」の「納品書ID」に親フォームの「納品書ID」が記載される
>この「関連付け」はどこでなされているのでしょうか?

「親子の関連づけ」が正しくされていれば、アクセスが面倒を見てくれます(自動的に記入してくれる)。

投稿日時 - 2009-09-02 09:17:53

補足

ご回答、ありがとうございます。

テーブル作成、関連付け、フォームの作成、レポートの作成、まで順調にきました。

あとは、(これは極めて初歩的なのでしょうけれど)改ページです。

社員ごとに納品書を打ち出したいのですが、ツールボックスの「改ページ」をどこに入れてもうまくいきません。

タイトル
----------------------------------
納品書番号
社員番号(顧客番号)、名前
----------------------------------
注文(納品)明細

というくくりにしておりますが、普通に印刷しようとすると、

タイトル
----------------------------------
納品書番号
社員番号(顧客番号)、名前
----------------------------------
注文(納品)明細
:::::::::::::::::
納品書番号
社員番号(顧客番号)、名前
----------------------------------
注文(納品)明細


:(続く)

となり、顧客ごとのレポートになってくれません。
(タイトル「納品書」が最初に1つしか表示されない)

本題からは外れますが、どういう処理をすれば、望みどおりのレポートになりますでしょうか?

ヘルプで検索しても、「ForceNewPage」関数?のトピックしか出てこないのです。

すみませんが教えてください。

投稿日時 - 2009-09-02 09:44:29

お礼

ネットで検索しておりましたところ、似たような悩みを持たれているかたがいらっしゃったようで、自己解決できました。

・氏名でグルーピング>フッタを「はい」>できたフッタで「セクションの後で改ページ」

で、できました。

どうも色々ありがとうございました。

投稿日時 - 2009-09-02 10:30:27

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(7)

#1、#3です。補足された内容が良く理解できません。なので
>という流れでしょうか?
にまともな回答はできないのですが、どうも誤解されているようです。どこが?と云う前に順を追って

1.テーブル設計
「納品書テーブル」
納品書ID:オートナンバー
納品日付:日付時刻
顧客ID:整数

「顧客テーブル」
顧客ID:オートナンバー
顧客名:テキスト

「注文テーブル」
注文ID:オートナンバー
納品書ID:数値型
商品ID:数値型
数量:数値型
摘要:テキスト

2.処理の流れ
予め、顧客データや商品データは登録済みだとして
「納品書作成」
親(メイン)フォームで
・新規作成→オートナンバーで連番が自動作成される
・日付や、納品先(顧客ID)選択
子(サブ)フォームで
・新規レコード追加→親子の関連づけにより「注文テーブル」の「納品書ID」に親フォームの「納品書ID」が記載される
・納品する商品(ID)選択
・数量、摘要記入
・必要に応じて複数回繰り返す

「納品書印刷」
前記「納品書作成」で入力したデータや自動作成(記入)されたデータに基づき、親子レポートで#3の回答で示したような納品書が印刷される

投稿日時 - 2009-09-01 11:28:43

補足

ありがとうございます。
ようやく、見えてきました。

ご教授いただいたとおり、やっているのですが、いくつか不明な点がございます。

>・新規作成→オートナンバーで連番が自動作成される
これはどういう操作でしょうか?
ウィザードでしかフォームを作成したことがないものでして。。。

>・新規レコード追加→親子の関連づけにより「注文テーブル」の「納品書ID」に親フォームの「納品書ID」が記載される

この「関連付け」はどこでなされているのでしょうか?

なんか。。。手取り足取りみたいになってまいりましたが、ご教授願えれば幸いです。

投稿日時 - 2009-09-01 14:57:46

お礼

すみません。
まだはまっております。

テストDBでうまくいったので、本番DBに構造を移してみたのですが、うまくいきません。

新たに質問をアップしましたので、申し訳ないですが、もうしばらくお付き合い願えませんか?

質問のURLは下記のとおりです。
http://oshiete1.goo.ne.jp/qa5257035.html

よろしくお願いします。

投稿日時 - 2009-09-02 16:23:00

ANo.5

同じテーブルで結合するという意味です。
図で示すと、上の表は左側の注文IDが1です。右側で注文IDが1より
小さいレコードは無いので、COUNT関数の結果は0になります。
下表は左側の注文IDが2です。右側で注文IDが2より小さいレコードは
1件あるので、COUNT関数の結果は1になります。このようにして順位を
生成しているのです。「同じテーブル同士を結合する」「不等号の結合
条件」という発想が盲点になり易い所です。また、不等号なのでクエリ
ビルダーでは作成できず、SQLを直接書く必要があります。

>Int(COUNT(B.注文ID)/10)+1 AS 連番
1帳票あたり10行という単純な括りであると仮定した話です。
「COUNT(B.注文ID)」これが「IDが小さいレコードの数」です。
単に10で割って1を足すのだから、0~9は1、10~19は2となります。

未だ説明がありませんが、どの納品書に何と言う注文が記載されるか
という紐付けの方法が分かりません。よって、正解のSQLはここでは
記載できません。あくまで、考え方や、仮想の記述になります。

投稿日時 - 2009-09-01 09:54:56

ANo.4

仮定:納品書Xには注文A、注文B、注文Cがある。
>注文IDはありますが、納品書IDはありません。
どうやって仮定に示した納品書を形成するんですか?
単に帳票みたいな作りで、1ページ10行(注文)になってるとか・・・
上記想定だと次のようになります。
SELECT A.注文ID,(品名、数量、金額など),
Int(COUNT(B.注文ID)/10)+1 AS 連番
FROM 注文 AS A LEFT JOIN 注文 AS B ON A.顧客ID=B.顧客ID AND
A.注文ID>B.注文ID WHERE 条件 GROUP BY 顧客ID,その他

要点:注文テーブル同士を結合します。自分の注文IDより小さい
注文IDを持つレコードを数えます。最も小さいIDなら、自分より
小さいIDのレコード数は0、2番目なら1、3番目なら2、・・・
このようにして順位を付けます。抽出条件やグループ化項目は適当に
設定してください。但し、レポートに出力する並べ替え基準と同じ
であることが条件です。クエリは顧客ごとのIDを基準にしています。

投稿日時 - 2009-08-31 16:17:21

補足

ごめんなさい。

簡単なSQLすら全く経験がないので、ご説明の内容が理解できず。。。
撃沈しております。

投稿日時 - 2009-09-01 09:33:00

#1です。何か誤解されているようですね。

>1つの注文に納品書IDを振るということは、本意から外れて
違います。複数の注文に同じ「納品書ID」を割り付けるのです。親子フォームなどを利用すれば、割付はAccessが自動的にやってくれます。これで「1つの納品書で、複数注文」が関連づけられます。納品書印刷も、親子レポートを使えば簡単にできるでしょう。

投稿日時 - 2009-08-31 15:29:19

補足

お返事おそくなりました。

親子=サブ、でよろしいでしょうか?

1.「注文」テーブルに「納品書番号」フィールドを追加

2.クエリでメインのヘッダに「納品書番号」フィールドを作成し、オートナンバーで番号を振らせる。

3.そのクエリを背景にしたレポートを作成し、サブフォーム(レポート?)で注文明細の一覧を表示

4.印刷時に納品書番号が振られ、かつその番号が各注文に振られる

という流れでしょうか?

投稿日時 - 2009-09-01 09:27:21

ANo.2

>注文:納品書、=、多:1
注文テーブルには「納品書ID」、「注文ID」(一意キー)、がありますか?
あれば簡単です。

投稿日時 - 2009-08-31 13:58:48

補足

遅くなり、すみません。

注文IDはありますが、納品書IDはありません。

理由としては、上記「多:1」のせいで、
1つの納品書に複数の注文を掲載するため、
もし「納品書ID」フィールドを作ったとしても、どのIDを納品書に
記載するか、という判断ができないためです。

しかたがないので、担当者に納品書を打ち出すとき、納品書IDを
入力してもらおうか・・・と思っています。

ん~~~。
これではシステマティックではないですよね。。。

投稿日時 - 2009-08-31 14:52:09

ご要望をまとめれば、ずばり「納品書テーブル」を作成し、「納品書ID」をオートナンバー型にすればよいでしょう。その他フィールドとしては、納品先として顧客IDが入るようなフィールドでしょうか。複数の「注文」を処理するならば、逆に個々の注文に納品書IDを入れられるようにするなど。

投稿日時 - 2009-08-30 14:03:35

補足

ご回答ありがとうございます。

お答えの中では、後半の、「複数の注文に納品書IDを」という
事案に相当しますが、ちょっと厳しい感じです。

と申しますのは、1つの納品書で、複数注文を扱いますので、
1つの注文に納品書IDを振るということは、本意から外れて
しまうのです。

注文:納品書、=、多:1の関係にあります。

唯一、顧客IDのみ、顧客ID:納品書=1:1ですが、
これをやってしまうと、同じ顧客に納品書を出す際、
いつも同じ納品書番号になってしまうことになります。

ん~。
やはり難しいのでしょうか?

投稿日時 - 2009-08-31 08:55:08

あなたにオススメの質問