dポイントプレゼントキャンペーン実施中!

Access2003 オートナンバーの現在値取得方法

Access2003 VBAでDAO.DBEngineオブジェクトを使用して
テーブル定義の取得を行っています。
オートナンバー型のシーケンスの現在値を取得する方法はないでしょうか?
MAX関数で最大値を取得する方法は不可です。

A 回答 (3件)

http://msdn.microsoft.com/ja-jp/library/dd148542 …

「DAO から ADO への移植9」

「ADO、ADOX、および JRO の新機能」
の説明文に
「DAO では使用できません」と注意が書かれたうえで、Increment/Seedの使用方法を説明しています。

DAOは進化していないけどADOは進化しています。
その進化した機能部分に該当しているようですので、DAOでは出来ないと思います。



以前に載せたサンプルは、ADOXを利用しているけど、ADOもADOXも参照設定しない方法でのコードで載せています。

それがダメなのであれば、MSDNを見る限り実現不可能だと思います。

参考URL:http://msdn.microsoft.com/ja-jp/library/dd148542 …
    • good
    • 0

DAOだけ利用した方法は正直わかりません。



ADOXを利用すると取得出来ます。
(※「Microsoft ADO Ext. 2.8 for DDL and Security」を参照すると便利です。)


カラムのSeedとIncrementを参照します。
テーブルを開いていなければ、値の設定も行えます。


Sub 呼出()
  Dim l_lngNum  As Long
  Dim l_lngInc  As Long
  
  If GetAutoNum("テーブル名", "フィールド名", l_lngNum, l_lngInc) Then
    Call MsgBox("次の値は「" & l_lngNum & "」" & vbCrLf & "増減値は「" & l_lngInc & "」")
  End If
End Sub

Function GetAutoNum(ByVal p_strTbl As String, ByVal p_strFld As String, Optional p_lngAutoNum As Long, Optional p_lngInc As Long) As Boolean
  GetAutoNum = False

  Dim l_adoxCat  As Object 'As ADOX.Catalog
  Set l_adoxCat = CreateObject("ADOX.Catalog") 'New ADOX.Catalog
  l_adoxCat.ActiveConnection = Application.CurrentProject.Connection
  
  On Error Resume Next
  Dim l_adoxTbl  As Object 'As ADOX.Table
  Set l_adoxTbl = l_adoxCat.Tables(p_strTbl)
  If (l_adoxTbl Is Nothing) Then
    MsgBox "テーブル不明"
    Exit Function
  End If
  
  Dim l_adoxFld  As Object 'As ADOX.Column
  Set l_adoxFld = l_adoxTbl.Columns(p_strFld)
  If (l_adoxFld Is Nothing) Then
    MsgBox "フィールド不明"
    Exit Function
  End If
  On Error GoTo 0
  
  If Not CBool(l_adoxFld.Properties("AutoIncrement")) Then
    MsgBox "オートナンバーちゃう"
    Exit Function
  End If
  
  p_lngAutoNum = l_adoxFld.Properties("Seed")
  p_lngInc = l_adoxFld.Properties("Increment")

  GetAutoNum = True
End Function

この回答への補足

ADOじゃだめなのよね~

補足日時:2010/08/16 00:18
    • good
    • 0

回答ではありません。



そのようなこと(オートナンバの現在値=次の挿入で
割り当てられる数値)を知ってどうするのですか?

仮にそのような方法があったとして、レコードを挿入
しても、その値が使われる保証はありません。
参照から挿入までの間に他のプロセスにより挿入が
行われてしまう可能性があるからです。
「あてにならない」値を返してもらっても意味がある
とは思えないのですが…

因みにPostgresには調べる方法はあります。また、
値を任意の数値に変更する手段もあります。もっとも
あったからと言って、同じく用途は不明です。
Accessでリセットする方法は以下のURLにあります。

http://www.accessclub.jp/bbs/0066/beginers25257. …

リセットは意味があると思います。

この回答への補足

>そのようなこと(オートナンバの現在値=次の挿入で
>割り当てられる数値)を知ってどうするのですか?
ACCESS→ORACLEに移行するときに使います
リセットが目的ではありません

補足日時:2010/08/11 11:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています