いちばん最後のレコードに値の追加ができません

このQ&Aのポイント
  • ある条件を基に複数のテーブルを参照しデータ加工を行った後に、レポート作成用テーブルのいちばん最後のレコードに必ず追加登録をしたいのですが、結果が異なるため困っています。
  • RecordsetオブジェクトはテーブルタイプとAddnew、Updateメソッドで追加登録していましたが、思うように動作せず、ダイナセットタイプに変更しても変わりませんでした。
  • 参考書にはダイナセットタイプのRecordsetオブジェクトは必ずいちばん最後のレコードに追加されると記載されていましたが、実際にはうまくいかず困っています。
回答を見る
  • ベストアンサー

いちばん最後のレコードに値の追加ができません。

ACCESSで、何週間も原因がどうしても解らず困っております。お助けください。 ある条件を基に複数のテーブルを参照しデータ加工を行った後に、レポート作成用テーブルのいちばん最後のレコードに必ず追加登録をしたいのですが、いちばん最後のレコードに登録できたり、既に登録されているレコードの間に割り込んで登録されたり処理の検証を行うたびに結果が異なるのです。 何度もデバッグを行いましたが、レポート作成用テーブルへUPDATEするまでの処理及びデータには間違いありません。レポート作成用テーブルで勝手にデータ入れ替わっているとしか思えないのですが・・・・・・ 最初はRecordsetオブジェクトはテーブルタイプを指定し、Addnew及びUpdateメソッドで追加登録していましたが、思うように動作しないためRecordsetオブジェクトをダイナセットタイプに変更してみましたが処理結果は変わりません。 ※RecordsetオブジェクトでIndexプロパティの設定はありません 参考書にダイナセットタイプのRecordsetオブジェクトは、設定されている並べ替え規則にかかわらず、必ずいちばん最後のレコードに追加されると記載されていたので試してみましたが駄目でした。 おおざっぱな説明で現状を理解して頂けるかわかりませんが宜しくお願いいたします。

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

レコードの並び順は保証されていません。 http://support.microsoft.com/kb/834927/ja http://www.naboki.net/access/achell/achell-03.html 指定してやる必要が有ります。 入力順などというプロパティは無いので、 入力順に並べたい場合は、オートナンバー型のフィールドを追加して そのフィールドを並び替えのキーに指定するとかではないですかね。

nodapapa
質問者

お礼

おかげさまで解決することができました。 教えて頂いたオートナンバー型のフィールドを追加しそのフィールドの並び替えを行った結果レポート作成テーブルは希望通りに作成できましたが、レポートを作成するとテーブルデータのレコード順に表示されなかったので少し悩んでしまいましたが、レポートにもオートナンバー型のフィールドを追加し並び替え指定を行ったら解決できました。 ほんとうに有難うございました。

nodapapa
質問者

補足

ご回答ありがとうございました。 回答を見た瞬間に  これだ!  と納得しました。 これから検証を行いたいと思いますが解決できそうな気がします。 前から気になっていたことがありますが、オートナンバー型のフィールドはデータを登録するたびにナンバーが加算されていきますが、限界値があれば限界値以降のナンバーはどうなるのでしょうか? また、テーブルデータを全て削除してもオートナンバーは削除する前の最終ナンバーから加算されていきますが初期値(1からスタート)に戻すことはできないのでしょうか? 今作成しているツールを何十年も使うことは無いとは思いますが気になります。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

オートナンバー型は長整数型です。 『4 バイトで、-2,147,483,648 ~ 2,147,483,647の範囲の整数を表すデータ型。Visual Basic では、キーワードは Long で、型宣言文字はアンパサンド (&) です』 限界に達したらどうなるかというと オートナンバー型フィールドが上限値を超えた場合はどうなる? http://www.ruriplus.com/msaccess/Exp/Exp0901.htm 負の数を使い始めたら入力の並び替えには使えませんね。 もっとも、その前にAccessでは重たくて。。。 道草ですが日付時刻型に時刻の部分も入れれば(Now()とかで)もっと使えます (^^ゞ データ型の限界の前にAccessが過労死するのは間違いないと思います。 『倍精度浮動小数点数型 (Double) の変数は、IEEE 64 ビット (8 バイト) の浮動小数点数の変数です。負の値は -1.79769313486231E308 ~ -4.94065645841247E-324、正の値は 4.94065645841247E-324 ~ 1.79769313486232E308 の範囲の値をとります。倍精度浮動小数点数型の型宣言文字はシャープ記号 (#) です。』 >初期値(1からスタート)に戻すこと 『Access オートナンバー リセット』でGoogleって見てください。 http://support.microsoft.com/kb/812718/ja テーブルのオートナンバーを振りなおす方法(β版) http://www.f3.dion.ne.jp/~element/msaccess/AcTipsTblReNumberAutoNumFld.html などなど。 AccessClub.jp さんが見えなくなってる?。

nodapapa
質問者

お礼

ありがとうございました。  とても勉強になりました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> ある条件を基に複数のテーブルを参照し キーの構成が気になりますね。主キーだったり、ソートしてませんか?

nodapapa
質問者

お礼

おかげさまで解決することができました。 ありがとうございました。 ACCESSではレコードの並び順は保障されていないのですね! レポート作成テーブルにオートナンバー型のフィールドを追加しそのフィールドの並び替えを行うことで解決できました。

nodapapa
質問者

補足

さっそくのご回答ありがとうございます。 ご指摘のキーの構成ですが、レポート作成用のテーブル及び参照しているテーブルには主キーの設定はありません。 参照しているテーブルには一部インデックスの設定がありレポートデータの編集処理で並び替え処理を行っていますが、デバック時に並び替えルーチンを通らないようダミーデータで試してみましたが結果は同じでした。 デバック時にレポート作成用テーブルに登録するデータをUPDATEする前にフォーム上に表示させ確認しましたが、フォームに表示されるデータは期待する順番で表示されるのですが、登録処理完了後にレポート作成用テーブルを見てみるとフォームで確認した順番で登録されていません。(処理を行うたびに登録順が異なり規則性が無い。ただし、正常に登録されることもある)

関連するQ&A

  • C# mdb レコード追加

    お世話になります。 C#の超初心者です。よろしくお願いします。 開発環境 Microsoft Visual C# 2005 mdbはaccess2000です。 現在、C#を使用してmdbに追加を行おうとしていますが、出来ません。 データテーブルまでは、追加は確認されたのですが、 その後updateメソッドを使用して追加を試みているですがエラーが返ってきます。 アダプターオブジェクトは、データセットのアダプターを使用しています。自動で作成される物です。 データセット.xsd内に作成されています。 内容は、 データアダプター名.Update(データセット名,データテーブル名);です。 これを実行すると、 『引数を2個指定できるメソッドUpdateのオーバーロードではありません。』 のエラーがでます。 参考書等見ているのですが、皆目検討もつかない状態です。 分かりづらい質問で大変恐縮ですが、何卒よろしくお願い致します。

  • レコードセットに新規追加する

    Access2013 VBAで ■テーブルa ・id ・名前 ・id2 とあり このテーブルのレコードセットを以下のように作ります。 dim Rec = dao.Recordset Set Db = CurrentDB set Rec = Db.OpenRecordset("Select * from [テーブルa] where id2 = " & 2, dbOpenDynaset) この時、このテーブルにid2=2のレコードが何もない場合、この生成したRecで、 Rec.AddNew Rec.Fields("名前").value = "名前" Rec.Update と出来ますでしょうか? よろしくお願いします。

  • 1つのフォームから複数のテーブルにレコード追加をやってみました。

    1つのフォームから複数のテーブルにレコード追加をやってみました。 そこで疑問があるのですが、Connectionは1つでRecordsetは追加するテーブルの数だけOpenが必要なのですか? 一応下記のコードで2つのテーブルにレコードを追加出来たのですが、素人の推測でやってみたので間違っている所がないか見て頂きたいです。 返答よろしくお願いします。 Dim cn As ADODB.Connection Dim rs1 As New ADODB.Recordset Dim rs2 As New ADODB.Recordset Set cn = CurrentProject.Connection Set rs1 = New ADODB.Recordset Set rs2 = New ADODB.Recordset Beep If MsgBox(Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しますか?", 33, "確認! 登録") = vbOK Then rs1.Open "T車検証", cn, adOpenKeyset, adLockPessimistic rs2.Open "T所有者", cn, adOpenKeyset, adLockPessimistic rs1.AddNew rs1!車両コード = Me.txt車両コード rs1!登録番号 = Me.txt登録番号 rs1!交付年月日 = Me.txt交付年月日 rs1!初度年月 = Me.txt初度年月 rs1.Update rs2.AddNew rs2!車両コード = Me.txt車両コード rs2!所有者 = Me.txt所有者 rs2.Update rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing cn.Close: Set cn = Nothing MsgBox Format(txt車両コード, "000000") & " " & txt登録番号 & Chr(13) & "を登録しました。", 64, "確認! 登録" End If End Sub

  • ダイナセットタイプのレコードセットオブジェクトの作成時

    ダイナセットタイプのレコードセットオブジェクトの作成時、 引数にdbInconsistentという定数を使用できるようなのですが、 (例)Set rs = db.OpenRecordset("テーブル名", dbOpenDynaset, dbInconsistent) dbInconsistentの説明として参考URLのところで 「矛盾を含んでいる場合でもレコードセットの更新が可能になります。 テーブル間のリレーション関係に矛盾が生じる場合でも、 それぞれそのテーブルデータを更新します。」 というようにかかれていました。この 「矛盾を含んでいる場合」 「テーブル間のリレーション関係に矛盾が生じる場合」 とはどういう場合なのかよく分からないのですが 具体的にどういう場合をいうのでしょうか? ご存知の方いましたらよろしくお願い致します。 参考URL)http://www.accessclub.jp/dao/07.html

  • 抽出条件のあるクエリにADOで新規にレコードを追加

    抽出条件のあるクエリにADOで新規にレコードを追加する事は不可能でしょうか? フォーム1にテキスト0を配置し SELECT テーブル1.色 FROM テーブル1 WHERE (((テーブル1.色)=[Forms]![フォーム1]![テキスト0])); というクエリを作成しました。 テーブル1のデータは 色 黄 黒 青 赤 です。 ADOでクエリにデータを追加したいのですが Public Sub Exsample() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM クエリ1" ここの時点で 「実行時エラー:'-2147217904 (80040e10)': 1つ以上の必要なパラメータの値が設定されていません。」 と表示されてしまいます。 「クエリ1」を「テーブル1」にしたらうまくいきます。 だったらテーブルに追加したら?と思われると思いますが 今回は例であり、実際はクエリに追加したいです。 回避方法があれば教えてください。 よろしくお願い致します。 (ヴァージョンはアクセス2003です)

  • Access 値を指定してレコード追加

    Accessのレコード追加時に、特定のフィールドに値を追加する方法が分からずに、困っております。 ご存じの方がいらっしゃいましたら、ご教授頂けましたら幸いです。 参考にしたサイト http://www.happy2-island.com/access/gogo03/capter00208.shtml バージョン Access2010 OS Windows7 Professional フォーム名:tmp税抜コンボ(テーブル名:tmp伝票No) サブフォーム:tmp税抜サブ(テーブル名:tmp税抜) 添付画像、tmp税抜コンビフォーム ◎目的 販売管理DB(SQLServer2008)からのリンクテーブルに、特定の得意先を抜出したデータに一部消費税が入っていないため消費税を入力し別のシステムへデータを渡す事が目的です。 ◎処理 可変値:納品日、伝票No、得意先CD、摘要、前のレコードからコピー 固定値:税区、商品名、数量は定数 消費税;手入力(InputBox) 上記のデータを新規で追加したいと考えており、下記のサイトを参考にしましたが、「オブジェクト変数または With ブロック変数が設定されていません」とのエラーが発生し追加出来ません。 【VBA】 Private Sub CmdB_copy_Click() 'レコードをコピーして、不要データ削除 '最後のレコードへ移動 DoCmd.GoToRecord , , acLast 'インプットボックスへ消費税額入力 Dim Tax As Long Tax = InputBox("消費税額を入力してください。") '現在のレコードから、伝票No、日付、得意先CDを取得 '変数定義 Dim rcDate As Date Dim rcDN_No As Long Dim rcTK_CD As Long '代入 rcDate = Me.納品日付 rcDN_No = Me.伝票NO rcTK_CD = Me.得意先CD Debug.Print rcDate Debug.Print rcDN_No Debug.Print rcTK_CD Debug.Print Tax 'レコードセットの定義 Dim oRS As DAO.Recordset With oRS .AddNew ←デバッグ画面では、ここでエラー表示 .Fields("納品日付").Value = rcDate .Fields("伝票No").Value = rcDN_No .Fields("得意先CD").Value = rcTK_CD .Fields("商品名").Value = "消費税" .Fields("数量").Value = 1 .Fields("単価") = Tax .Fields("税抜金額").Value = Tax oRS.Update End With Me.Requery MsgBox ("追加しました。") End Sub インティミディエイトウィンドを確認すると、納品日付、伝票No、得意先CD、消費税の値はちゃんと取得出来ているようですが、レコードセットの考え方、Withセクションの使い方、レコードの追加処理を全く理解できていないため、ご教授頂けたら幸いです。 もし、不足データがありましたら、お教え頂けたら出来る限りご提示いたします。  

  • VBで任意の複数レコードを追加・削除するには?

    VBで作成するアプリについて質問があります。 処理としては、追加するレコード数が実行毎に違っているデータを、 フォームの入力エリアに入力し、そのデータを使用してデータベースに データを登録する処理を想定しています。 上記を踏まえて、下記条件を同時に満たす操作を作成したいと思っています。 (1)「追加」ボタンをクリックすると、表示されている入力エリアが1行追加される (2)レコード毎に作成された「削除」ボタンをクリックすると、  任意の入力済みの行を削除出来る 最後の行に入力エリアを追加・削除することは出来たのですが、 (2)の「任意の行を削除する」処理が作成できていない状況です。 VBの経験が2週間で、下らない質問かもしれませんがよろしくお願いします。

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

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

  • Access2007 新規レコードに値のコピー

    いつもお世話になっております。 Access2007で、レポートを作成し、そのレポートからフォームを使ってレコードを追加する場合、レポートにある情報IDのフィールドの値を、新規追加するフォームにコピーすることはできますでしょうか? テーブルは[T_記録] : 記録ID、情報ID、日時、内容、記録日時、記録者 レポートは[R_記録] フォームは[F_記録] 宜しくお願いします。

  • Accessのテーブルのレコード追加について

    お世話になります。 テーブルのレコードをコピーして、別のテーブルに 「編集」の中の「追加貼り付け」でテーブルのレコードを 追加しました。 しかし、データ型をオートナンバーにしているフィールド があったのですが、追加したレコードの部分のナンバーが 連番になりません。 どの様にしたら、追加した分も連番になりますでしょうか。 お教え下さいます様、宜しくお願い致します。