電子書籍の厳選無料作品が豊富!

初心者です。Access レポートで下記のように作成したいのですが、なんか重複データで引っかかってしまいました。

※(1)作成したいレポート

分類   名前     地名    小計   合計   総合計
--------------------------------------------------
果物   りんご   青森   100    170   1070
              千葉    50
              山梨   20
     バナナ   千葉   450    450
     みかん   栃木   300     450
                    150
----------------------------------------
ワイン   AAAA   ドイツ   500    800    1000
           イタリア   300
      BBBB    ドイツ   200   200
↓↓   ↓↓   ↓↓   ↓↓   ↓↓  ↓↓

※(2)クエリで下記のようなデータがあります。

分類   名前     地名    小計   合計   総合計
--------------------------------------------------
果物    りんご    青森    100    170    1070
果物   りんご    千葉    50    170    1070
果物   りんご   山梨   20   170   1070
果物   バナナ   千葉   450    450    1070
果物   みかん   栃木   300   450    1070
果物   みかん    栃木   150   450    1070
--------------------------------------------------
ワイン  AAAA  ドイツ   500    800    1000
ワイン  AAAA  イタリア  300   800   1000
ワイン  BBBB  ドイツ   200   200   1000
↓↓   ↓↓   ↓↓   ↓↓    ↓↓    ↓↓


(1)レポートで
     フィールド[分類]:重複非表示 [はい]
     フィールド[名前]:重複非表示 [はい]
     フィールド[合計]:重複非表示 [はい]
     フィールド[総合計]:重複非表示 [はい]にすると下記の様になってしまいしますが、

分類   名前     地名    小計   合計   総合計
--------------------------------------------------
果物   りんご   青森   100    170   1070
              千葉    50
              山梨   20
     バナナ   千葉   450    450
     みかん   栃木   300
                    150
----------------------------------------
ワイン   AAAA   ドイツ   500    800    1000
           イタリア   300
      BBBB    ドイツ   200   200
↓↓   ↓↓   ↓↓   ↓↓   ↓↓  ↓↓

結果的に上記(1)の様にしたいです。名前のフィルドにバナナ、みかんなどの合計はそれぞれ450と450を表示させたいのですが、たれかその方法は教えて頂けないでしょうか。よろしくお願いします。

A 回答 (10件)

忘れていました。


レポートのレコードソースにするのは、
#5で設定したTdataInです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
希望通りできました。
今後もよろしくお願いします。

お礼日時:2010/08/19 14:31

もう一つ追加です。


コードはDAOを使っているので、コード表で
ツールバーのツールから参照設定を選択し、
Microsoft DAO xx Object Library
の一番高いバージョンにチェックが
入っているか確認してください。
xxはたとえば、3.6のような感じです。
    • good
    • 0

追加です。

質問のクエリの名前を

Qdata

としています。
必要ならば、<その3>のcmdMkTableのコードの
最初の部分の、

Set db = CurrentDb
Set rs = db.OpenRecordset("Qdata")
Set rst = db.OpenRecordset("TdataIn", dbOpenDynaset)

のところに、Qdata としていますが、これを
実際のクエリの名前に書き換えて確認してみてください。
この場合、クエリは普通の選択クエリとしています。

また、<その1>でのテーブルは新規に作成しておいてください。
このテーブルレコードの並びを確保するためにオートナンバー
のIDを入れています。レコードを削除してオートナンバーを
また1からはじめるためには、レコードをすべて削除後にファイルを
最適化すれば1からはじまります。

なお、テーブルのレコードを削除するのは削除クエリを
作り、それを実行するのが一番手っ取り早いです。
    • good
    • 0

<その3>


<その2>と同じコード表に張り付けてください。

Sub cmdMkTable()
Dim db As Database
Dim rs As Recordset
Dim rst As Recordset

Dim psBunrui As Variant
Dim psNamae As Variant
Dim psChimei As Variant
Dim psShoukei As Variant
Dim psGoukei As Variant

Set db = CurrentDb
Set rs = db.OpenRecordset("Qdata")
Set rst = db.OpenRecordset("TdataIn", dbOpenDynaset)

rs.MoveFirst
Do Until rs.EOF
rst.AddNew
rst!分類 = funcJYUFUKU1(rs!分類)
rst!名前 = funcJYUFUKU2(rs!名前)
rst!地名 = funcJYUFUKU3(rs!地名)
rst!小計 = funcJYUFUKU4(rs!小計)

psBunrui = rst!分類
psNamae = rst!名前
psChimei = rst!地名
psShoukei = rst!小計

rs.MovePrevious
If rs.BOF Then
rs.MoveNext
myGoukei = funcJYUFUKU5(rs!合計)
rs.MovePrevious
Else
'分類が違う場合
If psBunrui <> rs!分類 Then
rs.MoveNext
myGoukei = rs!合計
rs.MovePrevious
'分類が同じ場合
Else
'分類が同じで名前が違う場合
If psNamae <> rs!名前 Then
rs.MoveNext
myGoukei = rs!合計
rs.MovePrevious
'分類が同じで名前が同じ場合
Else
myGoukei = Null
End If
End If
End If

rs.MoveNext
rst!合計 = myGoukei
rst!総合計 = funcJYUFUKU6(rs!総合計)
rst.Update
rs.MoveNext
Loop
rs.Close: Set rs = Nothing
rst.Close: Set rst = Nothing
db.Close: Set db = Nothing
End Sub


<その3>のcmdMkTableを標準モジュールの
イミディエイトウィンドウで実行してもいいですし、
フォームにボタンを貼り付けそのクリック時イベントで

Call cmdMkTable

とすれば、実行されます。
たとえば、以下のような感じ。

Private Sub ボタン0_クリック()
Call cmdMkTable
End Sub

上記のような感じで登録してください。

わからなことがあれば書き込んでください。
    • good
    • 0

<その2>


以下を標準モジュールに張り付けてください。

Dim varItem1 As Variant
Dim varItem2 As Variant
Dim varItem3 As Variant
Dim varItem4 As Variant
Dim varItem5 As Variant
Dim varItem6 As Variant
Dim myGoukei As Variant

Function funcJYUFUKU1(x As Variant)
If x = varItem1 Then
funcJYUFUKU1 = Null
Else
varItem1 = x
funcJYUFUKU1 = x
End If
End Function

Function funcJYUFUKU2(x As Variant)
If x = varItem2 Then
funcJYUFUKU2 = Null
Else
varItem2 = x
funcJYUFUKU2 = x
End If
End Function

Function funcJYUFUKU3(x As Variant)
If x = varItem3 Then
funcJYUFUKU3 = Null
Else
varItem3 = x
funcJYUFUKU3 = x
End If
End Function

Function funcJYUFUKU4(x As Variant)
If x = varItem4 Then
funcJYUFUKU4 = Null
Else
varItem4 = x
funcJYUFUKU4 = x
End If
End Function

Function funcJYUFUKU5(x As Variant)
If x = varItem5 Then
funcJYUFUKU5 = Null
Else
varItem5 = x
funcJYUFUKU5 = x
End If
End Function

Function funcJYUFUKU6(x As Variant)
If x = varItem6 Then
funcJYUFUKU6 = Null
Else
varItem6 = x
funcJYUFUKU6 = x
End If
End Function
    • good
    • 0

<その1>



なんとかレポートのレコードソースにできるものが
できました。実は勘違いと言うのは計算上は合計の
フィールドに数値を入れるかあるいはNullにするかは
32通りの場合分けが生じます。このことについて
すっかり忘れていたので、最初に提示したコードは
レポートのフィールドに「重複非表示」を設定したの
と同じことになってしまいました。
32通りというのは、対象となるレコードの一つ前の
レコードの、分類、名前、地名、小計、合計の
フィールドとの比較によって生じる場合分けです。

この32通りの場合分けには、実際には質問のクエリ
では起こりえないだろうというものも含まれています。
クエリのデータがどのようなものが存在するのか
その法則が分からない状態、すなわち何でもありの
状態での場合分けです。
実際には、クエリのフィールドにまったく同じデータが
存在したり、あるいは分類が違ってもあとはまったく
同じデータが存在する、といったことは無いのかもしれ
ませんが、これらのことを考えて少しこちらで推測で
場合分けを極小さくしてみました。
こちらで考えた場合分けには、小計のことについては
まったく考慮していません。小計は「重複非表示」の
設定と同じにしています。

場合分けはコードの中にコメントの形で書いています。

[仕様]について
質問のクエリをもとに、テーブルにデータを出します。
テーブルは、
テーブル名 TdataIn
ID(オートナンバー。主キーである必要はありません)
分類、名前、地名、小計、合計、総合計、の各フィールド
を作り、これらのフィールドのデータ型はテキスト型
としてください。

コードは#1で提示したコードも使いますが、分かりやすく
するためにもう一度同じものも掲示します。一部加えたものが
あります。
    • good
    • 0

参考になれば、



単なる合計450でなく、バナナの合計450、みかんの合計450、で判断してこそ重複非表示が活きてきます。名前と合計の連結した値で判断できれば、みかん450を表示できる判断材料になるのではないかと思います。判断はみかん450で印字は450みたいに。「〃」を印字させる手段にヒントがありそうです。

ほかには
クエリで同一グループ毎に連番付与し、1のとき、印字すべきタイミングのレコードか、判断し印字させるというのが考えられます。
    • good
    • 0

レイアウトが多少変わりますが、グループフッターで小計を印刷するのでは拙いでしょうか?



分類   名前     地名    小計   合計   総合計
--------------------------------------------------
果物   りんご   青森   100      
           千葉    50
           山梨   20
                    170 
     バナナ   千葉   450    
                    450
     みかん   栃木   300
                150 
                     450
                         1070
----------------------------------------
    • good
    • 0

すみません。

勘違いがあったので#1は一旦無しにしてください。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
#1の件了解しました。また宜しくお願いします。

お礼日時:2010/08/15 19:07

解決したでしょうか。


このような場合、レポートのテキストボックスの
「重複データ非表示」では列すべてが対象となるので
クエリでデータを整えて、それをレポートの
レコードソースにするのがいいのではと、思います。
そのためには、一工夫、あるいは二工夫必要です。
なお、レポートの「重複データ非表示」は「いいえ」
にしておきます。

クエリをQdataとします。SQL文は以下です。
質問の通りのデータの並びの順番は通し番号が
必要なので、一応ID(オートナンバー)を入れています。
このIDをを除けると並びは変わりますが、データは
希望通りになっていると思います。

SELECT Qdata.ID, Qdata.分類, Qdata.名前, Qdata.地名, Qdata.小計, Qdata.合計, Qdata.総

合計, funcJYUFUKU1([分類]) AS 分類表示, funcJYUFUKU2([名前]) AS 名前表示,

funcJYUFUKU3([地名]) AS 地名表示, funcJYUFUKU4([小計]) AS 小計表示, funcJYUFUKU5([合計

]) AS 合計表示, funcJYUFUKU6([総合計]) AS 総合計表示
FROM Qdata
GROUP BY Qdata.ID, Qdata.分類, Qdata.名前, Qdata.地名, Qdata.小計, Qdata.合計, Qdata.

総合計;

上記のSQL文を新規クエリのSQLビューに貼り付け保存してください。
このクエリの分類表示、名前表示、地名表示、小計表示、合計表示、
総合計表示をレポートのデータとして使います。

次に、以下のコードを標準モジュールに張り付けて、
保存してください。

Dim varItem1 As Variant
Dim varItem2 As Variant
Dim varItem3 As Variant
Dim varItem4 As Variant
Dim varItem5 As Variant
Dim varItem6 As Variant


Function funcJYUFUKU1(x As Variant)
If x = varItem1 Then
funcJYUFUKU1 = Null
Else
varItem1 = x
funcJYUFUKU1 = x
End If
End Function

Function funcJYUFUKU2(x As Variant)
If x = varItem2 Then
funcJYUFUKU2 = Null
Else
varItem2 = x
funcJYUFUKU2 = x
End If
End Function

Function funcJYUFUKU3(x As Variant)
If x = varItem3 Then
funcJYUFUKU3 = Null
Else
varItem3 = x
funcJYUFUKU3 = x
End If
End Function

Function funcJYUFUKU4(x As Variant)
If x = varItem4 Then
funcJYUFUKU4 = Null
Else
varItem4 = x
funcJYUFUKU4 = x
End If
End Function

Function funcJYUFUKU5(x As Variant)
If x = varItem5 Then
funcJYUFUKU5 = Null
Else
varItem5 = x
funcJYUFUKU5 = x
End If
End Function

Function funcJYUFUKU6(x As Variant)
If x = varItem6 Then
funcJYUFUKU6 = Null
Else
varItem6 = x
funcJYUFUKU6 = x
End If
End Function

以上です。何かあれば質問してください。
    • good
    • 0

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