• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS 追加クエリでレコード数の指定したい)

ACCESS 追加クエリでレコード数の指定したい

このQ&Aのポイント
  • ACCESSにおいて、追加クエリを使用してレコード数を指定する方法について教えてください。
  • 伝票明細クエリを使用したフォームで、30行のレコードを保存する必要がない場合、最終レコードまでのみ保存する方法はありますか?
  • 内容フィールドが空白の場合、伝票明細テーブルに追加しない方法はありますか?

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No2です。 もし、以下のテーブルで 行番号    内容        数量  1     オイル交換      3.0  2  3     タイヤ交換       4.0 レコードに記入があるとき、「内容」というフィールドは 必ず記入がある、ということならば、すべてのフィールドに 抽出条件を設定する必要はないので、元のクエリは INSERT INTO 伝票明細テーブル ( 内容, 数量 ) SELECT TOP 3 伝票明細テーブルW.内容, 伝票明細テーブルW.数量 FROM 伝票明細テーブルW WHERE ((Not (伝票明細テーブルW.内容) Is Null)) OR (((伝票明細テーブルW.内容) Is Null)); のようにWHERE以下を設定できます。したがって、No2の二番目のコードのSQL文は、     strSQL = "INSERT INTO 伝票明細テーブル ( 内容, 数量 ) " & _         "SELECT TOP " & i & " 伝票明細テーブルW.内容, 伝票明細テーブルW.数量 " & _         "FROM 伝票明細テーブルW " & _         "WHERE ((Not (伝票明細テーブルW.内容) Is Null)) OR (((伝票明細テーブルW.内容) Is Null));" のようにWHERE以下を設定することができます。 なお、このSQL文はTOP値のを取り出すときの性質を 利用しています。 No2では元のクエリのTOP値を4としていましたが、 質問の内容からすると3としたほうが誤解がないので No2のTOP値は3とします。したがって、 INSERT INTO 伝票明細テーブル ( 内容, 数量 ) SELECT TOP 3 伝票明細テーブルW.内容, 伝票明細テーブルW.数量 のように TOP 3 と訂正しておきます。

ey2eizs
質問者

お礼

返答ありがとうございます。 piroin654 の読み通りフィールド数が多いので記述のしやすいDAOのコードで 試させて頂ました。 バッチリ!理想通りにレコード追加できました。 丁寧かつ早急な対応ありがとうございました! また機会がありましたら宜しくお願い致します。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

追加クエリ単独では出来ないのでは、と思いますが。 以下のコードの中身をボタンクリックのイベントに 貼り付け、実行してみてください。 なお、DAOを使っているので、 コード表のツール→参照設定から、 Microsoft DAOxx Object Libraryにチェックを 入れてください。xxは3.6のような数字です。 なお、他に追加するフィールドがある場合は   rs2.AddNew     rs2!内容 = Nz(rs1!内容)     rs2!数量 = Nz(rs1!数量)   rs2.Update のところに、   rs2.AddNew     rs2!内容 = Nz(rs1!内容)     rs2!数量 = Nz(rs1!数量)     rs2!名前 = Nz(rs1!名前)     rs2!住所 = Nz(rs1!住所)   rs2.Update のように、同じ書式で追加してください。 Sub test()   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim i As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("伝票明細テーブルW")   Set rs2 = db.OpenRecordset("伝票明細テーブル", dbOpenDynaset)   If rs1.RecordCount > 0 Then     '最後のレコードの位置の取得     rs1.MoveLast     Do Until rs1.BOF       If rs1!内容 <> "" Then         i = rs1!行番号         Exit Do       End If       rs1.MovePrevious     Loop     'テーブルへの書き込み     rs1.MoveFirst     Do Until rs1.EOF       rs2.AddNew         rs2!内容 = Nz(rs1!内容)         rs2!数量 = Nz(rs1!数量)       rs2.Update       '最終レコードかの確認       If i = rs1!行番号 Then         MsgBox "処理が完了しました。"         Exit Do       End If       rs1.MoveNext     Loop   End If   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing End Sub あるいは、コード中で追加クエリのSQL文を使って、 Sub test()   Dim db As DAO.Database   Dim rs As DAO.Recordset   Dim strSQL As String   Dim i As Long   Set db = CurrentDb   Set rs = db.OpenRecordset("伝票明細テーブルW")   If rs.RecordCount > 0 Then     '最後のレコードの位置の取得     rs.MoveLast     Do Until rs.BOF       If rs!内容 <> "" Then         i = rs!行番号         Exit Do       End If       rs.MovePrevious     Loop     strSQL = "INSERT INTO 伝票明細テーブル ( 内容, 数量 ) " & _         "SELECT TOP " & i & " 伝票明細テーブルW.内容, 伝票明細テーブルW.数量 " & _         "FROM 伝票明細テーブルW " & _         "WHERE ((Not (伝票明細テーブルW.内容) Is Null) AND (Not (伝票明細テーブルW.数量) Is Null)) OR (((伝票明細テーブルW.内容) Is Null) AND ((伝票明細テーブルW.数量) Is Null));"     'レコードの追加     DoCmd.SetWarnings False     DoCmd.RunSQL strSQL     MsgBox "処理が完了しました。"     DoCmd.SetWarnings True   End If   rs.Close: Set rs = Nothing   db.Close: Set db = Nothing End Sub のような、方法もあります。 上記のSQL文の元は、たとえばレコードを4つ追加するクエリを質問の状況に合わせて、 INSERT INTO 伝票明細テーブル ( 内容, 数量 ) SELECT TOP 4 伝票明細テーブルW.内容, 伝票明細テーブルW.数量 FROM 伝票明細テーブルW WHERE ((Not (伝票明細テーブルW.内容) Is Null) AND (Not (伝票明細テーブルW.数量) Is Null)) OR (((伝票明細テーブルW.内容) Is Null) AND ((伝票明細テーブルW.数量) Is Null)); のように作ったものを元にしたSQL文でTOP 4 のところを少し小細工して最後の レコードの行番号に置き換えたものが二番目のコードということです。 なお、一番目のコードと同じように追加するフィールドが他にある場合は SQL文の内容を追加訂正する必要があります。 わからないところがあれば補足してください。

すると、全ての回答が全文表示されます。
  • aoyama984
  • ベストアンサー率45% (253/561)
回答No.1

追加クエリに条件を付けてはどうですか 内容 数量 が空欄でないもの のみを追加 または 実テーブルの実フィールドを入力には使わない など

ey2eizs
質問者

お礼

返答遅くなりましてすいません。 早急な返答ありがとうございます。 >内容 数量 が空欄でないもの のみを追加 複数の作業項目がある場合に一行空白を設けたいので、 クエリの条件にIs Nullを使うと中間の空白行が無くなってしまいますので使えません。 >または 実テーブルの実フィールドを入力には使わない など この件につきましてはもう少し詳しく教えて頂ければと思います。 理想は 行番号      内容      数量・・・  1      オイル交換     3.0  2     3      タイヤ交換     4.0 の場合、行番号2を空白で残したいので内容フィールドがNot Nullの最終レコードである 行番号3までの3レコードをテーブルに追加し、残り27レコードは追加しない方法をとりたいのですが・・・  アドバイス宜しくお願い致します。  

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう