Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1228 / 2272 ツリー ←次へ | 前へ→

【8071】クエリの式 あおぎん 06/6/27(火) 19:17 質問[未読]
【8073】Re:クエリの式 クロ 06/6/28(水) 9:11 回答[未読]
【8074】Re:クエリの式 小僧 06/6/28(水) 10:04 発言[未読]
【8098】小僧さんへ あおぎん 06/6/30(金) 10:56 質問[未読]
【8100】Re:小僧さんへ 小僧 06/6/30(金) 12:06 回答[未読]
【8106】小僧さんへ あおぎん 06/6/30(金) 15:41 質問[未読]
【8108】クロス集計クエリの横計を出す方法…かな 小僧 06/6/30(金) 15:52 回答[未読]
【8111】クロス集計クエリの横計を出す方法…です あおぎん 06/6/30(金) 18:23 質問[未読]
【8123】Re:クロス集計クエリの横計を出す方法…で... 小僧 06/7/3(月) 10:29 回答[未読]
【8128】Re:クロス集計クエリの横計を出す方法…で... あおぎん 06/7/3(月) 14:28 質問[未読]
【8144】Re:クロス集計クエリの横計を出す方法…で... 855 06/7/3(月) 17:14 発言[未読]
【8146】Re:クロス集計クエリの横計を出す方法…で... 小僧 06/7/3(月) 17:28 発言[未読]
【8149】Re:クロス集計クエリの横計を出す方法…で... あおぎん 06/7/3(月) 18:22 お礼[未読]
【8097】Re:クエリの式 あおぎん 06/6/30(金) 10:30 お礼[未読]

【8071】クエリの式
質問  あおぎん  - 06/6/27(火) 19:17 -

引用なし
パスワード
   いつもお世話になっています。

学期ごとに給付する費用の振込用にデータベースを作っていますが、行き詰まってしまいました。

給付内容Tに[1学期分A額]、[1学期分B額]、[2学期分額]、[3学期分額]、[1学期分A支給日]、[1学期分B支給日]、[2学期分支給日]、[3学期分支給日]・・というフィールドを作成し、支給日で抽出して振込データを作成し、振込依頼書を作ろうとしています。

学期ごとのデータを抽出して作れれば簡単なのですが、同じ学期分でも支給が別の日になる対象者もいるので、支給日によってデータを抽出したいのです。

今のところ、クエリで、

[1学期分A支給日]が振込データ作成フォームで指定したものと一致すれば、[1学期分A額]をそうでなければ0を出力するという式
『IIf([1学期分A支給日]=[Forms]![F_振込データ作成]![振込年月日],[1学期分A額],0)

を作成し、それを[振込1A額]として(以下各学期分同様に算出)、算出したそれぞれの額の合計額を[支出額]として出力しています。


このデータをもとにR振込依頼書やR振込通知書を作ろうとしたとき、[支出額]が0のデータは要らないので、[支出額]の条件を>0としたところ、『パラメータの入力[振込1A額]』との表示が出てうまく抽出できません。

通常ならクエリの式で作成したデータでも条件式で抽出できるので、式に問題があるとは思うのですが、どう修正したらよいのか・・。
ご教示をお願いします。

また、振込日によるデータの抽出でほかによい方法がありましたら、教えていただけるとたいへんありがたいです。

よろしくお願いします。

【8073】Re:クエリの式
回答  クロ  - 06/6/28(水) 9:11 -

引用なし
パスワード
   おはようございます。

支出額の算出の仕方が
[振込1A額]+[振込1B額]+[振込2額]+[振込3額]
のようになってませんか?
これはクエリ内で仮想的に出来ているフィールド名なので
パラメータを聞いてくるのではないかと思います。

支出額の「:」後を
IIf([1学期分A支給日]=[Forms]![F_振込データ作成]![振込年月日],[1学期分A額],0)+IIf([1学期分B支給日]=[Forms]![F_振込データ作成]![振込年月日],[1学期分B額],0)+IIf([2学期分支給日]=[Forms]![F_振込データ作成]![振込年月日],[2学期分額],0)+IIf([3学期分支給日]=[Forms]![F_振込データ作成]![振込年月日],[3学期分額],0)
のように書き換えてみてはどうでしょうか?

【8074】Re:クエリの式
発言  小僧  - 06/6/28(水) 10:04 -

引用なし
パスワード
   ▼あおぎんさん、クロ さん:
おはようございます。

> 給付内容Tに[1学期分A額]、[1学期分B額]、[2学期分額]、[3学期分額]、
> [1学期分A支給日]、[1学期分B支給日]、[2学期分支給日]、[3学期分支給日]・・
> というフィールドを作成し

この辺に今回の様な問題が発生する原因があるのかもしれませんね。

あおぎんさんがお作りになっているテーブル構成ですと
どうしてもクエリを使う際に制約ができてしまいます。

今回の場合は項目が増えていく訳ではない
( 4学期、5学期と追加されて行くわけではない)ため
テーブル構成そのものを否定するわけではないのですが、
ご提示の様に「支給日」でデータを抜き出したい場合などは不便ですよね。

以下一案です。

T_給付内容
SEQ    名前    項目    金額      日付
1    Aさん    学期1_A   \10,000    2006/04/01
2    Bさん    学期1_A   \8,000     2006/04/02
3    Cさん    学期1_A   \12,000    2006/04/01
4    Aさん    学期1_B   \10,000    2006/06/01
5    Bさん    学期1_B   \8,000     2006/06/01
6    Cさん    学期1_B   \12,000    2006/06/01
7    Aさん    学期2    \20,000    2006/09/01
8    Bさん    学期2    \16,000    2006/09/01
9    Cさん    学期2    \24,000    2006/09/04


以下をクエリのSQLビューに貼り付けて実行されてみて下さい。

TRANSFORM Max(P.金額) AS 金額の最大
SELECT P.名前
FROM [
SELECT T_給付内容.名前, T_給付内容.項目 & "_金額" AS 集計, T_給付内容.金額
FROM T_給付内容
UNION ALL
SELECT T_給付内容.名前,T_給付内容.項目 & "_日付" AS 集計, T_給付内容.日付
FROM T_給付内容
]. AS P
GROUP BY P.名前
PIVOT P.集計
IN ("学期1_A_金額","学期1_A_日付",
  "学期1_B_金額","学期1_B_日付",
  "学期2_金額","学期2_日付",
  "学期3_金額","学期3_日付");


上記の様なテーブル構成ですクエリでの抽出を行い易くなるのですが、
一覧表などを出す際にはいちいちクロス集計クエリにしなければなりませんので
一長一短だと思います。

クエリで色々とデータを抽出したいのでしたら
こういったテーブル構成を考えてみるのも手かもしれませんね。

※ フィールド名の先頭に半角数字があると、たまに誤作動の元になります。
 (不自然な 学期_1 という名前はそのためです。)

 ミオナさんという方のサイトが解り易くまとまっていますので
 ご参考にされてみてください。

 Miona's Square
 フィールド、コントロール、オブジェクトや変数などに付ける「名前」について
 http://ww3.tiki.ne.jp/~kaya/Ac_tips.html#Tips0_001

【8097】Re:クエリの式
お礼  あおぎん  - 06/6/30(金) 10:30 -

引用なし
パスワード
   ▼クロ さん:
おはようございます。
お礼が遅くなって申し訳ありません。

>支出額の算出の仕方が
>[振込1A額]+[振込1B額]+[振込2額]+[振込3額]
>のようになってませんか?
>これはクエリ内で仮想的に出来ているフィールド名なので
>パラメータを聞いてくるのではないかと思います。

そのようにしていました。
通常の式で作ったフィールドとは違うのですね。
勉強になりました。

ご提示のとおり書き換えてみましたら、>0 で抽出できました!
ほんとうにありがとうございました。

【8098】小僧さんへ
質問  あおぎん  - 06/6/30(金) 10:56 -

引用なし
パスワード
   ▼小僧 さん:
おはようございます。
お礼が遅くなって申し訳ありません。

ご提示の方法をやってみました。
これだと、項目が増えていく場合に便利なんですね!
教えていただいてありがとうございます。

少し質問させてください。

ご提示のクエリを実行したところ、うまくいって、名前ごとに学期ごとの金額や日付が表示されて、こういう形のデータが出せることに驚いたのですが、それから、該当の日付のデータだけを抽出したい場合はどうすればよいのでしょうか??

さらにクエリの条件を入れるのかと考え、デザインビューにしてみたのですが、そののちまたデザインビューに戻そうとすると、
『列見出しとして使うフィールドでは集計行をグループ化に設定する必要あり』
というエラーが出てしまいました。

これはデザインビューにしてはいけなかったのでしょうか??

クロス集計クエリを殆ど使いこなせてない状態なので、まだまだ勉強しないとですね。


>※ フィールド名の先頭に半角数字があると、たまに誤作動の元になります。
> (不自然な 学期_1 という名前はそのためです。)
>
> ミオナさんという方のサイトが解り易くまとまっていますので
> ご参考にされてみてください。
>
> Miona's Square
> フィールド、コントロール、オブジェクトや変数などに付ける「名前」について
> http://ww3.tiki.ne.jp/~kaya/Ac_tips.html#Tips0_001

ありがとうございます。参考にいたします。
アクセス初心者用の本から勉強を始めたけど、こういう名前の付け方のことってあまり頭に入ってなかったりしています^^;

【8100】Re:小僧さんへ
回答  小僧  - 06/6/30(金) 12:06 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

> これはデザインビューにしてはいけなかったのでしょうか??

当方の環境でも再現しました。
何か自動修正が入ってしまうようですね…。

という事でまず下記SQLを保存して下さい。

TRANSFORM Max(P.金額) AS 金額の最大
SELECT P.名前
FROM [
SELECT T_給付内容.名前, T_給付内容.項目 & "_金額" AS 集計,
T_給付内容.金額, T_給付内容.日付 AS 抽出
FROM T_給付内容
UNION ALL SELECT T_給付内容.名前,T_給付内容.項目 & "_日付" AS 集計,
T_給付内容.日付, T_給付内容.日付 AS 抽出
FROM T_給付内容
WHERE T_給付内容.日付
]. AS P
WHERE (((P.抽出)=#2006/06/01#))
GROUP BY P.名前
PIVOT P.集計;

保存したクエリをクエリデザインで開き、
フィールド名:[集計] の行で右クリックから [プロパティ]
[クエリの列見出し] に 改行せずに

"学期1_A_金額","学期1_A_日付","学期1_B_金額","学期1_B_日付",
"学期2_金額","学期2_日付","学期3_金額","学期3_日付"

と記入し実行されてみて下さい。


あとはWhere条件を
[Forms]![F_振込データ作成]![振込年月日]
に変えればうまくいく…はずです。

【8106】小僧さんへ
質問  あおぎん  - 06/6/30(金) 15:41 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは。
さっそくお返事ありがとうございます。

ご提示の方法でうまくいきました!ありがとうございます。

質問ばかりで申し訳ないですが、あともう少し質問させてください。

教えていただいたクエリで、指定日の振込金額の算出ができました。
で、これを使って振込依頼書を作ろうとした場合、名前ごとの合計が必要になります。
集計クエリのルールがいまひとつわからないので(あれこれやってみましたが)、レポートで合計額を出そうとしたのですが、振込日が指定の日付でない場合は、対応する金額フィールドがNull値なので合計ができません。Nz関数を使うのかなと思ったのですが、クエリのどこに入れたらいいのか・・。

もしよろしければ、ご回答をお願いします。

【8108】クロス集計クエリの横計を出す方法…かな
回答  小僧  - 06/6/30(金) 15:52 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

> レポートで合計額を出そうとしたのですが、
> 振込日が指定の日付でない場合は、対応する金額フィールドがNull値なので
> 合計ができません。
> Nz関数を使うのかなと思ったのですが、クエリのどこに入れたらいいのか・・。

ちょっとイメージが湧きにくいのですが、
クロス集計の横計を出したい、という事なのでしょうか。

もしそのようでしたら、レポート側で処理できそうですね。

テキストボックス名:txt合計
コントロールソース:
=Nz([学期1_A_金額])+Nz([学期1_B_金額])+Nz([学期2_金額])+Nz([学期3_金額])

【8111】クロス集計クエリの横計を出す方法…です
質問  あおぎん  - 06/6/30(金) 18:23 -

引用なし
パスワード
   ▼小僧 さん:
こんばんわ。
お返事ありがとうございます。

またまたご質問を・・。

>ちょっとイメージが湧きにくいのですが、
>クロス集計の横計を出したい、という事なのでしょうか。

わかりにくくてすみません。
Aさんに学期1_A_金額 と学期1_B_金額の2種類を同じ日に支払うとした場合、振込依頼書(銀行指定のものがあります。)にはAさんの合計額が必要になるのです。
Aさんのが2種類あって、それぞれの額を2件として処理してもよいのですが、今作ったクエリだと、横に2件並ぶので(わかりにくいですね^^;)振込依頼書の形式にはまらないのです。

>もしそのようでしたら、レポート側で処理できそうですね。
>
>テキストボックス名:txt合計
>コントロールソース:
>=Nz([学期1_A_金額])+Nz([学期1_B_金額])+Nz([学期2_金額])+Nz([学期3_金額])

Aさんの[学期1_A_金額]が10000円、[学期2_金額]が10000円として、振込日を同じ日にして、ご提示の方法を試してみたところ、txt合計『1000010000』と表示されてしまいました。
もともとの金額フィールドは数値型で作っているのですが、クエリで抽出するとき、テキスト型になってしまっているのでしょうか?

いろいろ聞いて申し訳ないですが、よろしくお願いします。

【8123】Re:クロス集計クエリの横計を出す方法…で...
回答  小僧  - 06/7/3(月) 10:29 -

引用なし
パスワード
   ▼あおぎん さん:
おはようございます。

> >=Nz([学期1_A_金額])+Nz([学期1_B_金額])+Nz([学期2_金額])+Nz([学期3_金額])

Nz([学期1_A_金額],0) のようにNull値を 0 にするのを明記しなければ
いけませんでした。すみません。

>振込依頼書の形式にはまらないのです。

基のテーブルから抽出するのはどうでしょうか。

SELECT T_給付内容.名前, T_給付内容.項目, T_給付内容.金額, T_給付内容.日付
FROM T_給付内容
WHERE (((T_給付内容.日付)=CDate([Forms]![F_振込データ作成]![振込年月日])))
ORDER BY T_給付内容.名前, T_給付内容.項目;

こんな感じのクエリを基にレポートを作成し、
[名前] でグループ化して、
グループフッターに =Sum([金額]) のような作りでいけそうですね。

【8128】Re:クロス集計クエリの横計を出す方法…で...
質問  あおぎん  - 06/7/3(月) 14:28 -

引用なし
パスワード
   ▼小僧 さん:
こんにちわ。
お手間を取らせてます。申し訳ありません。

>Nz([学期1_A_金額],0) のようにNull値を 0 にするのを明記しなければ
>いけませんでした。

=NZ([学期1_A_金額],0)+Nz([学期1_B_金額],0)+NZ([学期2_金額],0)+Nz([学期3_金額],0)
というように、0 を入れてみたのですが、やはり 1000010000 と表示されました。
何かほかに原因が考えられますか?テーブルの作り方がまずいのでしょうか・・。

長々とおつきあいいただいて恐縮ですが、よろしくお願いします。

>SELECT T_給付内容.名前, T_給付内容.項目, T_給付内容.金額, T_給付内容.日付
>FROM T_給付内容
>WHERE (((T_給付内容.日付)=CDate([Forms]![F_振込データ作成]![振込年月日])))
>ORDER BY T_給付内容.名前, T_給付内容.項目;
>
>こんな感じのクエリを基にレポートを作成し、
>[名前] でグループ化して、
>グループフッターに =Sum([金額]) のような作りでいけそうですね。

名前でグループ化して集計を出し、詳細を不可視にしてみたら、必要なデータのみを表示することができました。
ありがとうございました^^

【8144】Re:クロス集計クエリの横計を出す方法…で...
発言  855  - 06/7/3(月) 17:14 -

引用なし
パスワード
   クエリで抽出するとき「学期1_A_金額」などの金額をCcur関数で囲ってみたらどうでしょう?

Ccur(Nz(学期1_A_金額,0))

【8146】Re:クロス集計クエリの横計を出す方法…で...
発言  小僧  - 06/7/3(月) 17:28 -

引用なし
パスワード
   ▼あおぎんさん、855 さん:
こんにちは。

855 さん、フォローありがとうございます。

こちらの環境(WinXP Pro、Ac2003)ですと特に問題なく表示されたので
色々と他に原因がないかを調べていたのですが…。

>Ccur(Nz(学期1_A_金額,0))

恐らく855さんの方法で解決できると思われます。
もしできない様したら原因を探ってみましょう。

【8149】Re:クロス集計クエリの横計を出す方法…で...
お礼  あおぎん  - 06/7/3(月) 18:22 -

引用なし
パスワード
   ▼小僧 さん 855 さん:
こんばんは。


>Ccur(Nz(学期1_A_金額,0))

ご提示の方法で無事解決できました。
ありがとうございました。

こちらの環境は、Win2000,Ac2000です。
最初にバージョンをお知らせしないとでした。
申し訳ありませんでした。

いろいろとありがとうございました。

1228 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078226
(SS)C-BOARD v3.8 is Free