Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : Access 2010)
オートナンバーリセット目的でテーブルのコピー(構造のみ)
投稿日時: 19/07/24 13:31:17
投稿者: 滝沢

オートナンバーのリセット目的でテーブルの「構造のみコピー」をVBAで行ないたいです。
「オートナンバーのリセット」の方が簡単ならそっちの方がありがたいですが。
可能でしょうか。
よろしくお願い致します。
 
 
 
 
 
 

回答
投稿日時: 19/07/24 13:54:44
投稿者: sk

引用:
オートナンバーのリセット目的でテーブルの「構造のみコピー」をVBAで行ないたいです。

既存のレコードのオートナンバー型のフィールドの値を振り直したい」
という意味でおっしゃっているのか、
「オートナンバー型のフィールドのシード値を任意の整数に変更したい
(既存のレコードのオートナンバー型のフィールドの値はそのまま)」
という意味でおっしゃっているのか、どちらなのでしょうか。
 
もし後者の意味でおっしゃっているのであれば、
例えば次のようなデータ定義クエリを実行するなどの
方法が挙げられますが。
 
( SQL ビュー)
-------------------------------------------------------------------
 
ALTER TABLE [テーブル名] ALTER COLUMN [フィールド名] COUNTER(1,1);
 
-------------------------------------------------------------------

投稿日時: 19/07/24 14:35:32
投稿者: 滝沢

sk様
コメントありがとうございます。
> ALTER TABLE [テーブル名] ALTER COLUMN [フィールド名] COUNTER(1,1);
結論から言うと、この方法でうまくいきそうです。
 
データは追記ではなく、毎回空にしてから処理をしたい内容ですので
・削除クエリ実行
・ALTERクエリ実行
・追加クエリ実行
の順番で処理すればいけそうですね。
 
ちなみに試しにレコードがある状態でALTERクエリ実行→追加クエリ実行
してみたら、元のレコードと追加されたレコードでオートナンバーフィールドの値が重複しました。
なんとなくオートナンバーがダブることはありえないという思い込みがありましたが
「重複なし」に設定しているわけでもないので、ダブること自体に問題は無いという認識で良いものでしょうか。
 
よろしくお願い致します。

回答
投稿日時: 19/07/24 15:07:18
投稿者: sk

引用:
試しにレコードがある状態でALTERクエリ実行→追加クエリ実行
してみたら、元のレコードと追加されたレコードでオートナンバーフィールドの値が重複しました。

引用:
オートナンバーがダブることはありえないという思い込みがありましたが
「重複なし」に設定しているわけでもないので、ダブること自体に問題は無い
という認識で良いものでしょうか。

「値の重複を許容するか否か」は、フィールド定義によってではなく
インデックス定義によって決定される問題です。
そのフィールドが主キーでもユニークキーでもなければ、
どんなデータ型であるにせよ、値の重複が許容されます。
 
(内部形式上の表現で言えば、オートナンバー型とは
「自動インクリメント属性を付加した長整数型」である)
 
もっとも、オートナンバー型のフィールドは大抵の場合
それぞれのテーブルの主キー(本質的には「レコードが追加された順番」)
として用いられるため、運用上の観点で「値が重複しても問題ない」と
考えるユーザーはまずいないと思います。
(そういう場合は普通に長整数型のフィールドとして定義するはず)

回答
投稿日時: 19/07/24 16:24:07
投稿者: Suzu

こんにちは。
 

引用:
データは追記ではなく、毎回空にしてから処理をしたい内容ですので
・削除クエリ実行
・ALTERクエリ実行
・追加クエリ実行
の順番で処理すればいけそうですね。

 
を拝見すると、一時的に連番がつけば良い様に見えます。
 
並び順を一意に決めるフィールドが存在するのであれば
テーブルにレコードを入れなおさずとも、
 
クエリ演算フィールドで
DCount("*","テーブル名","並び順フィールド名<" & [テーブル名].[並び順フィールド名])+1
と言う方法もあります。
 
抽出条件があったり、複数列のフィールドで並び順を決める場合には
演算フィールドに、サブクエリを指定します。
(
  SELECT COUNT(*)
  FROM テーブル名 AS T
  WHERE
    抽出条件1
    AND
     T.[並び順フィールド名1] & T.[並び順フィールド名2]<
       [テーブル名].[並び順フィールド名1] & [テーブル名].[並び順フィールド名2]) + 1
)
 
これが、レポートに出力するのが目的なのであれば
テキストボックスを配し、コントロールソースに 「=1」、集計実行に「全体」 でも良いでしょう。

回答
投稿日時: 19/07/25 14:14:55
投稿者: よろずや

滝沢 さんの引用:
データは追記ではなく、毎回空にしてから処理をしたい内容ですので
・削除クエリ実行
・ALTERクエリ実行
・追加クエリ実行
の順番で処理すればいけそうですね。
アクセスファイルの破損を防ぐためにも、
・削除クエリ実行
・修復/最適化実行
・追加クエリ実行
の順番をお勧めします。

投稿日時: 19/07/25 16:45:09
投稿者: 滝沢

sk様
コメントありがとうございます。
「問題は無い」は「不具合じゃない」という意味合いで書きました。
わかりづらく申し訳ありません。
実際のところ、ユニークじゃないと困る内容で使用しますので主キーにします。
今まで、オートナンバーは便利なため気軽に使用していましたが主キーにはしていませんでした。
たまたま問題は起きていませんでしたが、今後は主キー等、設定をちゃんと確認して運用しようと思います。
 
Suzu様
コメントありがとうございます。
最初はご指摘の方法で頑張ろうと思ったんですが、私にはこっちの方がだいぶハードルが高くて
オートナンバーリセットという方向にしました。
ちゃんと理解すれば幅が広がりそうなので、勉強してみます。
 
よろずや様
コメントありがとうございます。
今回は複数人が同時使用しないファイルなので、この方法にしてみます。
 
 
皆様あらためてありがとうございます。