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

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

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

Win XP Access2003 見積伝票を作成しております。サブフォーム(帳票フォーム)の登録方法でご教授お願い致します。 "伝票明細テーブルW"(伝票番号,行番号,内容、数量、単価、・・・)を基にした "伝票明細クエリW"を作成し、入力しやすいようにフォームを開いた時に行番号(連番)を振り、30行表示するようになっています。 入力確認後に登録ボタンをクリックして追加クエリを開き"伝票明細テーブルW"から"伝票明細テーブル"に30件レコード保存するようになっているのですが、 場合によって内容が2~3行で終わる時があります。 このような時に無駄に30行のレコードを保存せず"内容"(フィールド)が入力されているの最終レコードまでで伝票明細テーブルに追加したいのですが、よい方法がありましたら宜しくお願い致します。 "内容"(フィールド)は途中に空白の時があります。 行番号    内容        数量  1     オイル交換      3.0  2  3     タイヤ交換       4.0

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

  • ベストアンサー
  • 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

  • Accessのクエリでレコード追加

    Access初心者です。 バージョンは2010をつかっています。 テーブルを14テーブル含み、フィールド数が100ほどある選択クエリを作りました。 抽出条件などは設定していません。 このクエリで新しくデータを入力、レコードを追加し、上書き保存した後クエリを閉じます。 それからまた、そのクエリを開くとレコードが追加されていません。 テーブルにはその入力したデータは追加されています。 このクエリにもそのデータを追加表示させるためにはどうすればいいですか? 表示されない原因はなんなのかお教えお願いします。

  • ACCESSクエリーについて

    ACCESSクエリーについてですが、複数列、行が ある顧客テーブルがあり、そのデータテーブルには、 伝票番号がレコード毎にふられています。 このレコードはお客様によっては、 複数行となることもあります。 その場合は、お客様に同じ伝票番号が 複数行にわたってふられるケースも あります。 目的はクエリーで伝票番号の先頭の 行だけを引っ張りたい、です。 単に伝票番号だけを引っ張るだけであれば、 簡単にプロパティの固定値をはいに変えるだけ でできますが、伝票番号が複数存在することが ありえるなかで、伝票番号の先頭のみの 行のみ抽出させることは可能でしょうか。

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • ACCESS2000 更新クエリで文字を追加・変更したい

    ACCESS2000のマクロでCSVファイルをインポートし、Excelに出力しています。 そこで途中に更新クエリを使い、文字の追加・変更を行いたいのですが何故かうまくいきません。。。 【テーブルA】 フィールド/受注番号(910004292) 【テーブルB】 フィールド/出荷番号(910005232)/製造番号(910005451) 【テーブルC】 フィールド/受注番号(910005232)/製造番号(910005451)/納期(1021) 受注、出荷、製造の各フィールドは先頭に"0"を追加したいです。 910004292→0910004292 納期は2009/10/21となるように、現在の西暦(できれば自動)/と3桁目にスラッシュを入れて、yyyy/mm/dd形式にしたいです。 更新クエリで フィールド:受注番号 テーブル:テーブルA レコードの更新:"0"&[受注番号] と入力してやるとうまくいきました。 同じように横のフィールドに フィールド:受注番号 受注番号 ・・・ テーブル:テーブルA テーブルB ・・・ レコードの更新:"0"&[受注番号] "0"&[受注番号] ・・・ と各テーブルの全てのフィールドを入力して更新すると、 レコードに物凄い数の"0"が追加されてしまいます。 例:0000000000000000910004292 何度も繰り返しているようなのですが、なぜなんでしょうか? 更新クエリを別々に作ればそれぞれうまくいきました。 ひとつのクエリに複数のテーブルのフィールドを入れると駄目です。 また、納期について1021→2009/10/21にうまく変更する方法はありますでしょうか? 分かりにくくて申し訳ありませんが宜しくお願いいたします。

  • access クエリ レコードの追加ボタン?

    クエリのデータシートビュー時の 最下部に現在の位置やレコード総数などを表示する場所がありますよね?そこに「一番下のレコードに移動する」ボタンがありますよね? (「>*」のような記号のボタンです。) このボタンを有効/無効にする設定はどこでできますか? このクエリは1つのテーブルから作っているので、普通に作成すれば、レコードの追加も、内容の変更も出来ます。 実は、偶然にも無効にしてしまっているで有効に直したいのです。 フォームでいうところの「追加の許可」みたいな「新規レコードの追加はできる/できない」みたいな機能です。 よろしくおねがいします。

  • アクセスの追加クエリで教えてください。

    非連結のフォームから、追加クエリを使ってテーブルにデータを追加したいのですが、 どうもうまくいきません。 具体的には、 履歴フォーム、というフォームで、 日付 施設名 内容 という項目があります。 追加クエリで、 [Forms]![履歴フォーム]![日付] のようにほかの項目も入力し、 その保存先は、 履歴テーブル、で、 項目は、履歴フォームと同じです。 履歴フォームにデータがまったく入っていない状態ですと、 追加クエリを実行した際、 0件のデータを追加します。となります。 自分でテーブルに直接データを何か入力すると、 次に追加クエリを実行した際、 1件のデータを追加します。となります。 続いて追加クエリ実行の際には2件、 その次は4件追加と、 テーブルに入っているデータの件数だけ、 そのときにフォームに入力されている情報が、追加されてしまいます。 どのような原因が考えられますでしょうか? お知恵を貸していただけたらと思います。 情報が不十分でしたらご指摘願います。 補足いたしますので。 それでは、よろしくお願いいたします。

  • パラメータクエリを一つにまとめたい

    クエリ1を基にフォーム1を作成、 クエリ2を基にフォーム2を作成、 クエリ1も2もパラメータクエリを使用していて フィールド名は「番号」データ型はテキスト型です。 そして新規にフォーム3を作成しフォーム1とフォーム2をドラッグしました。 この状態でフォーム3をダブルクリックすると パラメータの入力を2回求められますがどちらも同じ番号を入力しています。 (「001」などを2回入力) これを1回にすることは可能でしょうか? ・番号フィールドの基テーブルはクエリ1と2は違うテーブルです。 ・クエリ1と2は一つにまとめたくありません。 フォーム3上に別々に表示させたいです。 ・クエリ1には全ての番号がありますがクエリ2には抜けている番号があります。 「クエリ1の全レコードとクエリ2の同じ結合フィールドのレコードだけを含める。」で全ての番号を表示できる状態です。 説明が下手ですいません。 アドバイスお願い致します。

  • Accessでフォームからレコードの追加について

    Access2016をWindows10で利用しています。 あるテーブルの単票形式のフォームをフォームウィザードから作成しました。 入力規則などがテーブルの各列の設定に沿って作成されていてとても便利なのですが、フォームにいくつか値を入れた時点でレコードが新規追加されてしまいます。 レコードの追加を、すべての入力が終わって「新規追加」ボタン(あとから自分で作成)を押してから行いたいです。 レコードウィザードを使わずにフォームを作成し、フォームの値とクエリを結び付けてボタン押下時にクエリを実行する、というフォームにすれば実現できると思うのですが、それはなかなか手間がかかってしまうので出来るだけ簡便に実現できたらと考えています。 細かい話なので参考ページ、あるいはヒントになる検索キーワードを教えていただけないでしょうか m(‗ ‗)m ?

  • アクセスの追加クエリについて

    二つのテーブル間(AとB)を追加クエリを使い AからレコードをBに追加することは出来たんですが、 逆にBからAにレコードを追加しようと選択クエリを追加クエリに変更しようとしたんですが、ウィザードの追加先テーブル名にAのテーブル名が表れないですがその理由が全く分からないので分かる方教えていただけませんか? AとBのレコード内のフィールドは同じです。 AからBにレコードを移行する処理としてマクロを使いアクションとして ・クエリを開く(これは追加クエリです) ・SQLの実行(上と同じクエリを削除クエリに変更し、そのSQL文をSOLステートメントに貼り付けました) 上の処理は問題なく出来たので逆のBからAへレコード移行処理のマクロを作ろうとしたのですが、追加クエリの追加先テーブルにテーブルAの名前が出てこないので困っています。こういったAからB。BからAという処理は追加クエリで出来ないのでしょうか?

  • クエリ抽出条件を動的に変更したい

    Win XP Access2003 顧客情報を入力するメインフォーム1に商品明細を入力するサブフォーム(帳票)のある 伝票作成用のフォームを作っています。 (サブフォームは選択クエリが元になっています) 入力用にはフォーム1を使い、その後確定した伝票はメインフォーム2で扱いたいのです。 商品明細(帳票サブフォーム)の内容は同じなので、クエリの伝票番号(フィールド)の 抽出条件を フォーム1で開いた時に[forms]![フォーム1]![txt伝票番号] フォーム2で開いた時は[forms]![フォーム2]![txt伝票番号] の様に動的に変更したいのですが,よい方法がありましたら宜しくお願い致します。

専門家に質問してみよう