プロが教えるわが家の防犯対策術!

<テーブル>
ID 取引先 状態 担当 担当2 担当3 担当4
1_A商事_継続_鈴木_山田
2_B商事_継続_山田
3_C商事_終了_田中_鈴木_山田_佐藤

というテーブルがあります。
コマンドボタン一つで担当者別にそれぞれの継続中のデータの一覧表を連続してレポートに印刷するマクロを作成することは可能でしょうか。

考えついた方法は,

(1)担当者別に人数分の抽出クエリを作成し,そのクエリをレポートソースとした担当者別のレポートを作成する
(2)そのレポートを順次印刷していくマクロを作成する

ですが,担当者が20人ほどいるので,20個のクエリを作成し,20個のレポートを作成しなければなりません。

また,担当,担当2,担当3全てに名前がある山田さんのような場合には,1~3全ての担当者として抽出したいと思います。
さらに,印刷するレポートのヘッダーに担当者の名前を表示させたいのですが,可能でしょうか。

初めは,パラメータークエリを利用してダイアログボックスに入力する値(担当者名)をレポートに取り込む方法を考えたのですが,毎月決まって打ち出したいレポートが5種類あるので,20人の担当者の分を出力する場合,5種類×20回=100回,パラメータークエリでの入力をすることになるので,あきらめました。

なんだか,欲張りな話ですが,良い方法があればご教示下さい。

A 回答 (6件)

なんかアクセスが出来るのか、クエリを勉強したいのかわからないが、そういう方法もあるが、難しい方法に首を突っ込んで、勉強の方向がそれているように思う。


下記がお勧め。
(1)データシートまたはそのコピーを作り、担当者でソートする。
(2)担当者が変わるまで、印刷シートに明細行部分に印刷項目データを、データシートから採ってきて代入する。
(3)所定行数を超えたら、印刷シートは印刷して、明細部や小計などはクリア、明細行のセットを明細最初行から続ける。
(4)ページ途中で担当者が変わったら、出来上がっている印刷シートは印刷して、明細部や小計などはクリア
その後、変わった担当者の明細で上記を繰り返す。
(5)データが終ったら出来上がっている印刷シートは印刷する。
こういうロジックは、昔は先輩から鍛えられたが、最近に独学した人は知らないようだ。
    • good
    • 0

unionクエリを使う。


クエリ1:SELECT テーブル1.ID, テーブル1.担当 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当) Is Not Null))
クエリ2:SELECT テーブル1.ID, テーブル1.担当2 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当2) Is Not Null))
クエリ3:SELECT テーブル1.ID, テーブル1.担当3 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当3) Is Not Null))
クエリ4:SELECT テーブル1.ID, テーブル1.担当4 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当4) Is Not Null))
クエリ5:SELECT クエリ1.* FROM クエリ1 UNION ALL SELECT クエリ2.* FROM クエリ2 UNION ALL SELECT クエリ3.* FROM クエリ3 UNION ALL SELECT クエリ4.* FROM クエリ4
このクエリ5が担当のどれかに名前があるIDのリストになる。
これを基に新たなクエリを作る。
クエリ6:SELECT クエリ5.担当者, クエリ5.ID FROM クエリ5 ORDER BY クエリ5.担当者, クエリ5.ID
とすると、担当者別のIDが求められる。
さらにこれを基にすれば、担当別一覧が作れる。

クエリ5を求めるのに、クエリ1からクエリ4を作らなくても、以下でもできる。
SELECT テーブル1.ID, テーブル1.担当 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当) Is Not Null))
UNION ALL SELECT テーブル1.ID, テーブル1.担当2 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当2) Is Not Null))
UNION ALL SELECT テーブル1.ID, テーブル1.担当3 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当3) Is Not Null))
UNION ALL SELECT テーブル1.ID, テーブル1.担当4 AS 担当者 FROM テーブル1 WHERE (((テーブル1.担当4) Is Not Null));
    • good
    • 0

補足。



よく陥りやすいのですがこのような場合、顧客が3レコードしかないとMAX3レコードしか出力されないと勘違いしますがSQLの基本は掛け算です担当20名、顧客3件だと60レコードあると仮定されその中でWhere句条件に一致する物が出ます。
なので担当者を複数持つ顧客は先程のサンプルSQLで担当者の数だけ出力されますよ

質問の意図がよく見えなかったのですが多分欲しいのはサンプルのような事かな~と思ってね
    • good
    • 0

記入漏れ、Where句に AND 状態="継続" を書き忘れ

    • good
    • 0

質問の意図がよく見えませんねぇ?



担当者名テーブルは無いの?
無ければ作成したほうが良いでしょうね
それで現テーブルを顧客、担当者名テーブルを担当名と仮定して
先ほどと同じように

Select 担当名.担当, 顧客.ID, 顧客.取引先
From 顧客, 担当名
Where 担当名.担当 In (顧客.担当,顧客.担当2,顧客.担当3,顧客.担当4)

これをレポートで担当、IDでソート
担当ブレイクで改ページすれば良いのでは

この回答への補足

質問の仕方が適切でなく,お手間を取らせてすみません。アクセスに関しては,独学で学んでいるので,全くの素人だと想像して下さい(もう,してると思いますが…)。

やりたい事は,
「フォーム上にコマンドボタンを配置し,そのコマンドボタンをクリックすると,担当者別の継続中のデータの一覧表が印刷される」
ことです。そんなこと,無理だよ!ということであれば,そのように言って下されば,あきらめます。情報が足りないのであれば,足りないところを指摘していただけると助かります。

ご質問の件,担当者テーブルは,ありますが,仮に
<テーブル>
ID 取引先 状態 担当 担当2 担当3 担当4
1_A商事_継続_鈴木_山田
2_B商事_継続_山田
3_C商事_終了_田中_鈴木_山田_佐藤
のテーブルを〈テーブル1〉とします。
〈テーブル1〉の担当…担当4のフィールドには,〈担当者テーブル〉をデータ型のルックアップウィザードで表示される設定にしました(そもそも,この思考がおかしいのでしょうか?)。

記述していただいた
Select 担当名.担当, 顧客.ID, 顧客.取引先
From 顧客, 担当名
Where 担当名.担当 In (顧客.担当,顧客.担当2,顧客.担当3,顧客.担当4)
のどこをどうやって直して良いのか分かりません。お手数をおかけしますが,ご教示下さい。

補足日時:2008/06/17 10:50
    • good
    • 0

tab1:



[ID]_[取引先]_[状態]
__1___A商事____1
__2___B商事____1
__3___C商事____0

tab2:

[tab1_ID]_[区分]_[担当]
_______1______1___鈴木
_______1______2___山田
_______2______1___山田
_______3______1___田中
_______3______2___鈴木
_______3______3___山田
_______3______4___佐藤

クエリ1:

[ID]_[取引先]_[状態]_[担当]
__1___A商事_______1___鈴木
__1___A商事_______1___山田
__2___B商事_______1___山田
__3___C商事_______0___田中
__3___C商事_______0___鈴木
__3___C商事_______0___山田
__3___C商事_______0___佐藤

SELECT tab1.ID, tab1.取引先, tab1.状態, tab2.担当
FROM tab1 INNER JOIN tab2 ON tab1.ID=tab2.tab1_ID
ORDER BY tab2.区分;

[イミディエイト]
? DBSelect("SELECT * FROM [クエリ1] WHERE tab1.状態=1 Order BY tab2.担当, tab1.ID",,vbCrLF)
1;A商事;1;山田;
2;B商事;1;山田;
1;A商事;1;鈴木;

で、担当者別にそれぞれの継続中のデータの一覧を[イミディエイトウインドウ]に表示しています。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!