アクセス初心者ですが宜しくお願いします。
アクセス2002を使って在庫DBを作っています。
レコードセットで抽出集計した全レコードを、「帳票形式」のフォームにすべて表示させたいのですがうまくいきません。フォームのテキストボックスは全て非連結にしてあります。
考えているのは次のような手順です。
1.表示したい期間の「開始日付=kaisi」と「終了日付=owari」を入力
2.「在庫場所」コンボボックスで表示したい在庫場所コードを選択
3.選択された在庫場所コードによって、SELECT~CASEステートメントで該当する在庫場所テーブルからデータを抽出集計し、フォームに表示させる
コードは次の通りです。
Private Sub 在庫場所_AfterUpdate()
Dim cnc As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim zaiko As Variant
Dim kaisi, owari As Date
Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
kaisi = Me!期間開始
owari = Me!期間終了
zaiko = Me!在庫場所
Select Case zaiko
Case "1"
cmd.CommandText = "SELECT 物品ID, Sum(仕入) AS 仕入計, Sum(払出) AS 払出計 FROM T_薬局受払 " & "WHERE (日付) Between #" & kaisi & "# And #" & owari & "# " & "GROUP BY 物品ID;"
Set rst = cmd.Execute
Do Until rst.EOF
Me!物品ID = rst!物品ID
Me!受入計 = rst!仕入計
Me!払出計 = rst!払出計
rst.MoveNext
Loop
rst.Close: Set rst = Nothing
Case "2"・・・・・・・・・・
End Select
cnc.Close: Set cnc = Nothing
End Sub
実行しますと、フォームには「最後のレコード」しか表示されません。
フォームプロパティの「規定のビュー」は帳票になっています。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
[ID][数量]
1,100
2,200
3,300
というテーブル[Test]を<帳票フォーム>に表示させるのに、
Private Sub Form_Load()
Dim cnc As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
cmd.CommandText = "SELECT * FROM TEST;"
Set rst = cmd.Execute
With rst
Do Until .EOF
Me.ID = .Fields("ID")
Me.数量 = .Fields("数量")
.MoveNext
Loop
End With
rst.close
cnn.close
End Sub
というコードでは、当然のように最後のレコードしか表示されません。
原因は、フォームの最初のレコードに上書きしているからです。
そこで、最初のレコードを書き込んだら新規レコードに移動するようにコードを書き換えます。
Do Until .EOF
Me.ID = .Fields("ID")
Me.数量 = .Fields("数量")
SendKeys "+({+})", False
DoEvents
.MoveNext
Loop
結果は、
3,300
3,300
3,300
この場合は、非連結タイプに起因する不具合です。
以上のような検討の結果、一旦、Select文で取得した値を一時テーブルに書き込んで連結モードで表示するのが手であることが判ります。
Private Sub Form_Load()
Dim cnc As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Set cnc = CurrentProject.Connection
Set cmd.ActiveConnection = cnc
cmd.CommandText = "SELECT * FROM TEST;"
Set rst = cmd.Execute
With rst
cmd.CommandText = "DELETE FROM TEMP;"
cmd.Execute
Do Until .EOF
cmd.CommandText = "INSERT INTO TEMP " & _
"(ID, 数量) VALUES (" & _
.Fields("ID") & ", " & _
.Fields("数量") & ");"
cmd.Execute
.MoveNext
Loop
End With
Me.Requery
End Sub
これで、首尾よく、
1,100
2,200
3,300
と表示されます。
No.2
- 回答日時:
>フォームのテキストボックスは全て非連結にしてあります
>実行しますとフォームには「最後のレコード」しか表示されません。
根本的に非連結フォームの場合は詳細セクションは一つしかありません。そのため1レコード分のデータしか表示できません。
帳票・データシートのフォームに複数レコードを表示するには連結フォームでしか無理です。
質問の記述を見ると作り込んでやろうとしているので下記の仕様の説明で理解していただけると思いますが。
例えば別の方法として・・
期間開始・期間終了・在庫場所の抽出条件のコントロールをメインフォームに配置し抽出集計したレコードを表示するフォームをサブフォームとして配置してサブフォームのレコードセットにSelect Caseで分岐させ該当するSQLを代入するようにしてサブクエリをRequeryさせる仕様にするのはどうでしょうか。
質問にある宣言とstrSQLを追加して
Dim strSQL As String
strSQL = ""
strSQL = strSQL & "SELECT 物品ID, Sum(仕入) AS 仕入計・・・" 'SQLをセットします。
Set rst = cnc.Execute(strSQL)
Set Forms![メインフォーム名]![サブフォーム名].Form.Recordset = rst
サブフォームにRecordsetをすることによって連結フォームになりますのでWithを使い仕入計.ControlSource = "仕入計"と払出計.ControlSource = "払出計"としてコントロールソースもセットしサブフォームをRequeryする。
こんな感じではどうでしょうか。
回答いただきありがとうございます。
サブフォームも考えましたが、その方法がわからず行き詰まっていました。
じっくり解読させていただきトライしてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Access(アクセス) チェックボックスにチェックが入った後の挙動 1 2022/08/21 12:39
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
access サブフォームにリストを表示させたいが一件しかレコードが表示されない
Access(アクセス)
-
Access サブフォームでの選択行の取得
その他(データベース)
-
-
4
アクセスVBAのMe!と[ ]
Access(アクセス)
-
5
レコードを保存するコード アクセスvba
その他(Microsoft Office)
-
6
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
7
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
8
ADOでRecordsetオブジェクトをレコードソースに設定したい
その他(データベース)
-
9
テキストボックスにクエリ結果を表示させたい
その他(データベース)
-
10
親・子リンクフィールドの設定は、どうすればよいのでしょうか。
その他(Microsoft Office)
-
11
ラベルとテキストボックスのグループ化を解除したい
Access(アクセス)
-
12
Accessで別テーブルの値をフォームに表示したい
その他(データベース)
-
13
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
-
14
アクセスのfilter、複数条件の記述方法を教えてください。
Access(アクセス)
-
15
Accessを開きなおすとテキストボックスの値がエラー#Name?になる
その他(データベース)
-
16
新規レコード行を非表示にしたい
Access(アクセス)
-
17
Accessで、フォームからフォームへ値を引き継ぐやり方
Access(アクセス)
-
18
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
19
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
20
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのフォーム上にレコード...
-
「メソッドまたはデータメンバ...
-
アクセスでテーブルの変更内容...
-
ACCESSのフォームからデータの...
-
Access2002 フォームを閉じるた...
-
選択したチェックボックスのみ...
-
accessの自動更新処理をできな...
-
Access 別フォームへの再クエ...
-
Accessのフォームに表示...
-
Accessのハイパーリンクのパス...
-
アクセスのフォームのビューが...
-
アクセス2003サブフォームで選...
-
ACCESSでのテキストボックスの...
-
入力途中の入力した値をすべて...
-
Access コマンドボタンクリッ...
-
アクセス 0以外をカウントす...
-
ACCESS フォームにデータ入力で...
-
ADOでRecordsetオブジェクトを...
-
Accessフォームのテキストボッ...
-
他フォームのチェックボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのフォームからデータの...
-
Accessのフォーム上にレコード...
-
選択したチェックボックスのみ...
-
アクセスでテーブルの変更内容...
-
アクセスのフォームのビューが...
-
accessの自動更新処理をできな...
-
Access 別フォームへの再クエ...
-
Accessフォームのテキストボッ...
-
ACCESSで入力フォームをHTMLフ...
-
「メソッドまたはデータメンバ...
-
帳票フォームに全レコードを表...
-
テキストボックスの値をテーブ...
-
アクセス 0以外をカウントす...
-
テキストボックス(アクセス)内...
-
Access2002 フォームを閉じるた...
-
アクセスでの項目追加について...
-
Access フォーム上でコンボボッ...
-
Accessのフォームで作業領域を...
-
入力途中の入力した値をすべて...
-
ACCESSの表形式で、レコードを...
おすすめ情報