• ベストアンサー

access IDの振り直しについて

皆さん、明けましておめでとうございます。今年もいろいろとお世話になりますm(_ _)m さて、accessに挑戦しているところですが、データをいろいろいじくっているうちに、オートナンバー型のIDが不整列となってしまいました。そこで、いったん「デザイン」からIDを削除し、再び「行の挿入」でIDを作成したところ、今度はまたIDが別の形で(飛び番=例えば、100の次に1000が来て、1100の次に101が来るというような)不整列となりました。 テーブルのフィールドには「No」というのを設けてあり、これはデータのレコード番号なのですが、それとIDが一致するようにするつもりでした。 このような場合、IDの「振り直し」はどのようにやれば出来るのでしょうか? もう一つお尋ねです。最終「No」とレコード数は一致するはずなのですが、レコードが1個足りません。このような場合、何番のレコード(No)が抜けているのか知るには、どのようにすればよろしいでしょうか? access初心者ですので、いろんなところでつまづいてしまいます。どうかご教示のほどよろしくお願いしますm(_ _)m xp+office2003です。

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

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

こんにちは 前にも述べましたが、 オートナンバーは一意の番号を得るためのものであって連番の為のものではありません。 一時的な「連番」はこのようなクエリで求められます。 テーブル名を T1 としています。 新規SQLビューに貼り付けてみて下さい。 SELECT T1.ID, CLng(DCount([ID],"T1","ID<=" & [ID])) AS 連番 FROM T1 ORDER BY T1.ID; ど~~~~しても連番にしたい欠番も嫌!という場合はオートナンバー型を止めて 長整数型にしてフォームのイベントでVBAにて付与するしかありません。 が・・・一意である ID の値がコロコロ変わると他のテーブルとリンクしていた場合に 別の問題が発生しそうです。 なのでオートナンバー型の連番にこだわっても『労多くして功少なし』です。    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ところで欠番レコードを求めるためには連番のあるテーブルが必要なのですが エクセル2003まででは65536までしか求められないので テーブルを新規作成し、名前をTR、フィールド名を連番とします。 連番フィールドに、0から9 まで番号を手入力します (10レコード出来上がります) このテーブルを使ってクエリを作ります。 SQLビューだと SELECT TR.連番, TR_1.連番, TR_2.連番, TR_3.連番, TR_4.連番, TR_5.連番, [TR].[連番] & [TR_1].[連番] & [TR_2].[連番] & [TR_3].[連番] & [TR_4].[連番] & [TR_5].[連番] AS 仮番, CLng([TR].[連番] & [TR_1].[連番] & [TR_2].[連番] & [TR_3].[連番] & [TR_4].[連番] & [TR_5].[連番]) + 1 AS 新番 FROM TR, TR AS TR_1, TR AS TR_2, TR AS TR_3, TR AS TR_4, TR AS TR_5 ORDER BY CLng([TR].[連番] & [TR_1].[連番] & [TR_2].[連番] & [TR_3].[連番] & [TR_4].[連番] & [TR_5].[連番]) + 1; 同じテーブルをクエリのデザインビューにドラッグするたびに添え字が_1 _2 _3 と自動的に付きます。 で10万レコードまでの「連番」が出来ますがご参考までに。 (かなり重たいですPentium 2.8Ghzで20秒弱掛かります) これを元に不一致クエリを作成すれば欠番は出せますが、止まったのかと思える位相当重いはずです。 ※万が一を考えてバックアップは取ってから試して下さい。

prairie-gentian
質問者

補足

ご返事が遅くなりましたm(_ _)m 詳細なアドバイスを頂きまして、落ち着いたときにトライしてみようと思います。これまで時間のない時に焦っていじくるうちに、ドジッた経験が何度もありますので・・・(^^;) >なのでオートナンバー型の連番にこだわっても『労多くして功少なし』です ありがとうございます。初心者なので、なんか連番でないとまずいような(何の根拠もない・・・)気持ちに囚われていたんです。 最近では、「まっ、いいか!」という気分です。いろいろご教示いただき、ありがとうございました。m(_ _)m

その他の回答 (4)

回答No.4

同じ構造のテーブルを作成して、ID以外のデータを貼りつけて、もとのテーブル名をつける・・・とかではだめでしょうか? 思いついただけなのですが・・・。

prairie-gentian
質問者

補足

ご回答ありがとうございますm(_ _)m 早速やってみたのですが、レコード数が66,000以上あって、エラーが出てしまいます(^^;) IDの“飛び番”にこだわりすぎかな?と半分諦めモードです。 またいいお知恵があればご教示下さい。

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

オートナンバーに関しては好きなのを選んでください (^^ゞ リンクが切れないと良いのですが・・ http://support.microsoft.com/search/default.aspx?catalog=LCID%3D1041&1041comm=1&1041mt=1&1033comm=1&spid=global&query=%E3%82%AA%E3%83%BC%E3%83%88%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC&pwt=false&title=false&kt=ALL&mdt=0&res=20&ast=1&ast=2&ast=3&ast=&ast=&mode=a&adv=1 65536レコードまでの欠番の探し方はExcelで連番を作成して、Accessにインポート。 で、そのテーブルとの不一致クエリで求められます。 「No」はAccessの予約語なので変更することをお勧めします。 http://support.microsoft.com/default.aspx?scid=kb;ja;286335 オートナンバーは一意(ユニーク)な番号を得るためにあるので 不連続となっていても気にすることはないです。 オートナンバーフィールドがクエリやりレーションシップのキーに使われていたりすると、 番号の振りなおしも難しくなりますし、レコードを削除すれば欠番もでます。 そもそも連番のためのデータ型ではありません。 またテーブルでは必ずしも入力順に並ぶ訳ではありませんし。

prairie-gentian
質問者

補足

ご回答、ありがとうございますm(_ _)m いいサイトをご紹介していただき、参考になりそうです。 #2の方の解答とあわせてトライしてみます。 >オートナンバーは一意(ユニーク)な番号を得るためにあるので 不連続となっていても気にすることはないです >そもそも連番のためのデータ型ではありません そんな仰っていただき、少し気が楽になりました。 >「No」はAccessの予約語なので変更することをお勧めします は知りませんでした(^^;) 早速これについては改めようと思います。

  • charlief
  • ベストアンサー率50% (2/4)
回答No.2

手元のパソコンにAccessが入ってないので、確認できませんが。オートナンバーフィールド挿入の方法を使うと、元のレコードの順番が不特定になります。定かではないですが、下記の様な方法で試してみてください。 1.元テーブルと同じテーブルを作成する 2.クエリーの新規作成で編集画面を開く 3.メニューバーで追加クエリーを選択、追加先テーブルをコピーしたテーブルに指定する 4.編集画面に元テーブルを追加する 5.オートナンバーフィールドを除くすべてのフィールドを一覧に追加する。 6.追加元テーブルフィールドの下方に追加先テーブルフィールドが表示されるので、一致であることを確認。一致でなければ、変更することもできる。 7.noフィールドの並び替えを上り順に指定する 8.クエリーを実行する。 9.レコードを確認。 10.問題がなければ、元のテーブルを削除して、新しいテーブルのテーブル名を元のテーブル名に変更する やり方がいろいろがあると思いますが、Accessクエリーの中身は、SQL文です。データーベースを扱うにはSQLが欠かせません。 欠番レコードを割り出し方法も、抽出クエリーでできるので、チャンレンジしてみてください。

prairie-gentian
質問者

補足

ご回答、ありがとうございますm(_ _)m #3の方のご回答とあわせてトライしてみます。

  • charlief
  • ベストアンサー率50% (2/4)
回答No.1

どのようにレコードを挿入しているかはわかりませんが、おそらく挿入元となるレコードがソートされていないです。クエリで挿入処理をしているのであれば、クエリの編集画面で、ソート順を指定できるので、やってみてはいかが? >もう一つお尋ねです。最終「No」とレコード数は一致するはずなのですが、レコードが1個足りません 元のレコード数は足りてますか?

prairie-gentian
質問者

補足

早速のご回答、ありがとうございますm(_ _)m どうも私の説明が不十分だったようですね(^^;) テーブルにレコードを挿入しているのではなく、テーブルのデザイン画面で「行の挿入」をしているのです。つまり、テーブルで言えば「ID」という名前の「フィールド」を挿入しているのです。 この「ID」が“飛び番”になってしまうので、いったん「ID」フィールドを削除し、改めて「ID」フィールドを設定しているわけです。 >>もう一つお尋ねです。最終「No」とレコード数は一致するはずなのですが、レコードが1個足りません >元のレコード数は足りてますか? レコード数が、65,000くらいあって、「ID」とは別に通し番号の「No」というフィールドを設けているのですが、レコードが欠けていないかぎり、「No」の最終値(最大値)とレコード数は一致するはずなのです。 それが1個足りません。65,000個の「No」を目で追ってゆくわけにも行かず、なんかクエリを利用してどの番号が欠けているか調べたいのですが・・・。EXCELなら簡単に出来るのですがね。1行前の「No」との“差”を計算して、これが「2」になっているところで、欠番が生じている事になります。 ACCESSで、一つ前の「No」との“差”を計算するということができればいいのですが・・・。

関連するQ&A

  • ACCESS2000のオートナンバー型について

    OSはWIN98です。ACCESS2000です。 ACCESS2000にてテーブルの主キーのフィールド(追番)に オートナンバー型を設定しました。 テーブルにデータを仮に100書きこんだとします。 その後に、その100個のデータを削除します。 そして、削除された後の最初のレコードにデータを 書きこもうとすると追番のフィールドが "101" に なってしまいます。新たに書きこむ時に追番を "1" にすることはできないでしょうか? 皆様よろしくお願いします。

  • アクセス2003でIDフィールドのデータをオート入力(規定値)したいのですが

    こんにちは。 教えてください。 オートナンバー型を利用せずに単票フォームからNOフィールドのデータを入力したいのです。  ↓こんな考え方で レコード新規作成時 : NO 規定値 総レコード件数+1 です。 オートナンバー型を利用するとたとえばNO10を後での削除をすると その10は欠番になり利用不可ですよね。 そこらへんは柔軟に必要があればいつでも欠番になっている10という値をNOフィールドに手入力で再利用したいのです。 いろいろ調べてみたのですがいい感じな方法が見つけられませんでした。 お願いします!!

  • アクセス2003 テーブルの操作についての質問です

    アクセス2003を使用しています。 たぶん初歩的な事だと思いますが、テーブルのなかの一つのフィールドを、オートナンバー型に設定していましたが、数値型になおして、修正しました。そして、オートナンバー型に変えようとしてもかわりません。どうやったら元のオートナンバー型に戻りますか?ちなみに、新しくオートナンバー型のフィールドをつくってみましたが、今日入力したレコードが一番に来てしまい、その次に旧レコードの1番がきてしまいます。なんとかもとに戻したいと思っています。

  • アクセスのIDをふり直したい

    アクセスで、管理をしています。  1~200のグループ、201~400のグループ、401~600のグループがあり、1~200のグループのデータをもう使用しないので、新しい200のデータに入れ替えたいのですが、IDのふり直しが簡単に出来ないようになっていますよね、アクセスって。 何か方法はありますでしょうか。教えてください。

  • アクセス作成について

     アクセスについて質問します。  フォームで入力する場合で、例えばテーブルのレコードを100までとし、101を超えた場合またレコード1にデータを入力することは可能でしょうか。 テーブル フィールド1 フィールド2  1       6  2       8   .      .   .      . 100       55 フィールド1は固定し、フィールド2にデータを入力していき101番目にデータを入力する時はまた1行目の6を上書きしてデータを更新していくようなことは可能でしょうか。(もちろんフィールド1、フィールド2を別テーブルとしクエリーを活用することでもok) アクセス初心者です。よろしくおねがいします。

  • Access2003 データ型 オートナンバーについて エクセルからテ

    Access2003 データ型 オートナンバーについて エクセルからテーブルをインポートする方法 主キーである、IDと名をつけたフィールドのデータ型は"オートナンバー"でレコード新規入力際、自動で番号がふられていくようにしています。 このテーブルにエクセルのレコードをインポートして追加したいのですが、インポートできません。 ※オートナンバーフィールドが原因と思われます。 どうすれば、エクセルからこのテーブルにレコードをインポートし、追加されたレコードにオートナンバーで番号を割り振る事が出来ますででしょうか? 最も、シンプルな方法をお教え願います。

  • Accessで連続データってできますか?

    Excelのオートフィルのように、Accessのレコードで連続データってできるんでしょうか?連続データ用のフィールドを一つ作って、日付順とか並び替えたあとにフィールドに更新をかけたいんですが・・・

  • アクセス 空フィールドのみ 別データー挿入

    アクセスの同テーブル内に下記レコード(1)(2)が有ります。 (1)レコードのフィールドにはほぼデータが入っていますがNULLのフィールドもあります。 (2)レコードのフィールドはほとんどNULLです。 (1)のレコードのフィールド、データーを取得して (2)のレコードのフィールドがNULLの場合は(1)のフィールドのデーターを貼付ける 例えば下記の(3)様にしたいです。 |数値型 |テキスト型 |日付型  |通貨型  |メモ型 |Yes/No型 | |ID    |名前     |入力日  |金額   |     |チェック   | (1)|01   | さる    |07/28 |1,000 |     |-1     | (2)|02   |とら     |       |      |     |       | (3)|02   |とら     |07/28 |1,000 |     |-1     | 自分なりに考えた所 DLookUp で一つ一つ(1)フィールドを取得して(2)フィールドNULLの場合は挿入し(3)にする方法を 考えましたが、フィールド数が実際には100ほど有り方法が良くないと思いました。 Cloneメソッドを使用して同じフォームに(1)と(2)データーを表示させて上手く出来ないか 考えたりもして見ましたが上手く行きません 良い方法が思いつきません こんな方法があるとか このサイトを参考にしなさいとか どなたかご教授頂けませんでしょうか よろしくお願い致します。

  • Accessでのエラー

    Access修行中の身で、勉強をかねて書類BOXのデータベースを作成中です。 親テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・・・、保存箱ID 子テーブルのフィールド  保存箱ID(主キー、オートナンバー)、保存箱名、・・・・ リレーション  親:保存箱ID-子:保存箱ID という構成です。 クエリで以下のような複合テーブルを作成し、 複合テーブルのフィールド  ID(主キー、オートナンバー)、タイトル名、・・・、保存箱名、・・・・ データを入力しようとすると、「レコードを追加できません。テーブルの結合キーがレコードセットにありません。」というエラーがでます。また、保存箱IDに入力のないレコードは、抽出されません。 どのようにしたいかというと、保存箱IDは入力しなくてもいいフィールド(関連させなくてもよいデータ)にしたく、複合テーブルで保存箱名を入れると、子テーブルに新たにレコードが追加されるようにしたいです。 できれば、SQLを使用せずに解決したいと甘えておりますが、無理でしょうか。

  • Access2003で

    Access2003で AテーブルとBテーブルがあります。 両テーブルにも、NOフィールドがあります。 両テーブルとも1からの数字を付与しています。 NOフィールドの他に名称などのフィールドがあります。 ここでお聞きしたいのですが、BテーブルのNOフィールドの2のレコードを、 AテーブルのNOフィールドの2のレコードに上書きしたいのですが、どうすれば良いでしょうか? ちなみにBテーブルには上書きしたいレコード(この例でいきますとフィールド2)だけが格納されています。 どうすれば良いでしょうか? よろしくお願いします。

専門家に質問してみよう