2011-08-02 23 views
0

私は主キーのオートナンバーシーケンスの次の番号をプログラマチックに取得しようとしています。そして、次のレコードに移動するには、データベースを伝えるために次のレコード番号(PK)はどのように決定されますか?

docmd.RunCommand acCmdRecordsGoToNew 

、および:表の最後の数は10だった場合たとえば、私はのようなものを使用することになり、それは前に11を返す必要があります私は彼らが現在入力しているレコードをユーザーに示すフォームのコントロールに割り当てます。問題は、プロパティウィンドウでプロパティを「いいえ」に設定してナビゲーションボタンを無効にしたときにこの機能が機能しなくなることです。ナビゲーションバーを有効にしないでvbaで次のレコードを取得するにはどうすればよいですか?

+1

ADOXを使用して、次の自動番号の値を判断することができます(http://stackoverflow.com/questions/6498221/retreve-next-autonumber-for-access-table/6499393#6499393を参照)。欲しいです。しかし、あなたの質問は、あなたが本当に望むかもしれないことが "新しい"レコードに移動することを示唆しています。それは別の質問です。 – HansUp

+0

Ctrl +やPage Downを押しながらレコードを追加できるので、コントロールを削除するだけでは一般的には不十分です。 Allow Additionプロパティも無効にしましたか?それはあなたのRunCommandがもはや動かない理由を説明します。 –

+0

@hans、実際には新しいレコードに移動する必要はありませんでした。このシナリオでは、単にinsertコマンドを実行するだけで同じことができました。 – Sinaesthetic

答えて

1

はあなたのオートナンバー列のシード値をルックアップする必要があり、実際の次の値が何であるかを知っている:適用することができ、where句もあります。あなたはたくさんのそれを呼び出すするつもりなら、あなたはおそらく、あなたがこの関数を呼び出すたびに、ADOX Catalogオブジェクト変数をキャッシュするのではなく、再初期化することだろう

Public Function GetSeedValue(strTable As String, strColumn As String) As Long 
    Dim cnn As Object 'ADODB.Connection 
    Dim cat As Object ' New ADOX.Catalog 
    Dim col As Object ' ADOX.Column 

    Set cnn = CurrentProject.Connection 
    Set cat = CreateObject("ADOX.Catalog") 
    cat.ActiveConnection = cnn 

    Set col = cat.Tables(strTable).Columns(strColumn) 
    GetSeedValue = col.Properties("Seed") 

    Set col = Nothing 
    Set cat = Nothing 
    Set cnn = Nothing 
    End Function 

:このコードは、ことを行います。

マルチユーザー環境では、使用したときに別のユーザーによって更新された可能性があるため、正確ではない可能性があります。ただし、Max()+ 1が持つことができるAutonumber値をスキップするのに問題はありません。

次のAutonumber値を気にすると、誤って使用していることに注意してください。オートナンバーの値はサロゲートキーなので、値が何であるかは決して気にしないでください。

0

データベースとやりとりして実際に値を返すVBA関数があることが分かります。これは私が次のレコード番号を得るためにやったことです:

Dim nextRecord As Integer 
nextRecord = DMax("ID", "my_table") + 1 

私の単一のクライアントの状況のた​​めに、しかし、効果的です。

Dim nextRecord As Integer 
nextRecord = DMax("ID", "my_table", "field = value") 
+2

実際には正しい値を生成しません。最後の値が10であるかどうかを検討します。新しいレコード11を挿入してから削除します。新しいレコードを追加すると、その値はDMax()が返すように11ではなく12になります。 –

+0

さて、私はまだ別の解決策を見ていません。私はoracleで知っていますが、これは本当に簡単です。シーケンスオブジェクトにnexvalを使用するだけです。なぜ私はアクセスのための答えを見つけるのに苦労しているのかわかりません... – Sinaesthetic

+0

解決策があります - あなたはSeedValueを探します。私はこのコードを使って答えを投稿します。 –