文書番号: 287756 - 最終更新日: 2007年8月10日 - リビジョン: 9.1

Access データベースの最適化後オートナンバー型のフィールドがリセットされない

お知らせお使いのオペレーティング システムには適用しない情報が含まれている場合があります。
難易度 : 中。基本的なマクロ、コーディング、相互運用性に関する知識が必要です。

この資料は Microsoft Access データベース (.mdb または .accdb) および Microsoft Access プロジェクト (.adp) について記述したものです。

目次

すべて展開する | すべて折りたたむ

現象

オートナンバー型のフィールドを持つテーブルまたはフォーム内の最後のレコードを 1 つまたは複数個削除した後にそのデータベースを最適化した場合、新しいレコードを追加したときに、オートナンバー型のフィールドが次に大きい数値で始まりません。

原因

Microsoft Jet 4.0 Service Pack 4 (Msjet40.dll バージョン 4.00.2927.4) またはそれ以降をインストールしています。

解決方法

この問題を回避するには、以下の 2 つの方法のいずれかを使用します。

方法 1

新しいテーブルを作成し、そのテーブルに既存のレコードを追加します。このテーブルに新規追加されたレコードは、プログラムでインクリメント値を設定しない限り、オートナンバー型フィールドの値が 1 で始まります。

: 既存のレコードが不要な場合は、テーブルからレコードをすべて削除した後データベースを最適化して、オートナンバー型フィールドをリセットすることもできます。ただし、この方法を使用した場合、削除したレコードは復元できません。

Microsoft Access データベース (.mdb または .accdb) に新しいテーブルを作成し、そのテーブルに既存のレコードを追加するには、次の手順を実行します。
  1. データベース ウィンドウで、元のテーブルをクリックします。
  2. Ctrl + C キーを押します。
  3. Ctrl + V キーを押します。
  4. [テーブルの貼り付け] ダイアログ ボックスで、[テーブル構造のみ] をクリックし、テーブル名に tblNewTable と入力し [OK] をクリックします。
  5. Microsoft Office Access 2003 または Microsoft Access 2002 では、[表示] メニューの [データベース オブジェクト] をポイントし、[クエリ] をクリックします。[デザイン ビューでクエリを作成する] をダブルクリックします。

    Microsoft Office Access 2007 では、[作成] タブをクリックし、[その他] の [クエリ デザイン] をクリックします。
  6. [テーブルの表示] ダイアログ ボックスで、元のテーブルをクリックし、[追加] をクリックし、[閉じる] をクリックします。
  7. Access 2003 または Access 2002 では、[クエリ] メニューの [追加] をクリックします。

    Access 2007 では、[デザイン] タブで、[クエリの種類] の [追加] をクリックします。
  8. [追加] ダイアログ ボックスで、[テーブル名] ボックスの一覧の [tblNewTable] をクリックし、[OK] をクリックします。
  9. オートナンバー型フィールド以外のすべてのフィールドをクエリのデザイン グリッドに追加します。
  10. Access 2003 または Access 2002 では、[クエリ] メニューの [実行] をクリックして、新しいテーブルにレコードを追加します。

    Access 2007 では、[デザイン] タブで、[結果] の [実行] をクリックして、新しいテーブルにレコードを追加します。
  11. tblNewTable テーブルを開き、レコードを追加します。

    オートナンバー型フィールドの値が次に大きい数値になります。

方法 2

Microsoft Access データベース (.mdb または .accdb) で次の関数を使用すると、オートナンバー型フィールドのシード値をプログラムからリセットできます。この関数をモジュールに追加して、デバッグ ウィンドウで実行することも、コマンド ボタンやマクロから呼び出すこともできます。

: このコードを正しく実行するには、Microsoft ActiveX Data Objects 2.x Library および Microsoft ADO Ext 2.x for DDL and Security (2.x は 2.1 またはそれ以降) の両方を参照する必要があります。これを行うには、Visual Basic Editor の [ツール] メニューで [参照設定] をクリックします。[Microsoft ActiveX Data Objects 2.x Library] および [Microsoft ADO Ext 2.x for DDL and Security] の各チェック ボックスがオンになっていることを確認します。
Function ChangeSeed(strTbl As String, strCol As String, lngSeed As Long) As Boolean
'You must pass the following variables to this function.
'strTbl = Table containing autonumber field
'strCol = Name of the autonumber field
'lngSeed = Long integer value you want to use for next AutoNumber.

Dim cnn As ADODB.Connection
Dim cat As New ADOX.Catalog
Dim col As ADOX.Column

'Set connection and catalog to current database.
Set cnn = CurrentProject.Connection
cat.ActiveConnection = cnn

Set col = cat.Tables(strTbl).Columns(strCol)

col.Properties("Seed") = lngSeed
cat.Tables(strTbl).Columns.Refresh
If col.Properties("seed") = lngSeed Then
    ChangeSeed = True
Else
    ChangeSeed = False
End If
Set col = Nothing
Set cat = Nothing
Set cnn = Nothing

End Function
				

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

詳細

問題の再現手順

  1. Microsoft Jet 4.0 Service Pack 4 (SP4) またはそれ以降をインストールします。 Microsoft Jet の最新の Service Pack の入手方法の詳細を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
    239114? (http://support.microsoft.com/kb/239114/ ) Microsoft Jet 4.0 データベース エンジン用の最新の Service Pack の入手方法
  2. Access 2003 または Access 2002 で、新しいデータベースを作成します。
  3. 次のとおりテーブルを作成します。
    テーブル : tblExample
       ---------------------
    フィールド名 : ID
    データ型 : オートナンバー型
    
       
    フィールド名 : MyText
    データ型 : テキスト型
       
    テーブル プロパティ : tblExample
       ----------------------------
    主キー : ID
    					
  4. このテーブルを tblExample として保存します。
  5. [表示] メニューの [データシート ビュー] をクリックします。
  6. テーブルにレコードを 10 個追加します。
  7. テーブルに追加したレコードのうち、最後の 3 個を削除します。
  8. テーブルを閉じます。
  9. [ツール] メニューの [データベース ユーティリティ] をポイントし、[最適化/修復] をクリックします。
  10. tblExample テーブルを開きます。
  11. テーブルに新しいレコードを追加します。

    オートナンバー型フィールドの値が、期待した 8 ではなく 11 になります。
: Microsoft Access プロジェクト (.adp) のプロジェクトを最適化した後は、レコードを追加すると期待どおりの数値がオートナンバー型フィールドに表示されます。ただし、レコードを保存すると、オートナンバー型フィールドの値が変わります。この例では、レコードがコミットされるまでは 8 が表示されますが、その後数値は 11 に変わります。これは、レコードがコミットされた後に、サーバー上でオートナンバー型フィールドの値が割り当てられるためです。

関連情報

詳細を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
202121? (http://support.microsoft.com/kb/202121/ ) デフォルトのシード値とインクリメント値を UI で変更できない

この資料は以下の製品について記述したものです。
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
キーワード:?
kbprogramming kbado kbupdateissue kbbug kbnofix KB287756
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"