1

MS Access 2013 には、[ID][Hashed ID]、および[Product Description]の 3 つの列のみで構成される[Serials]というテーブルがあります。

[ID] は増分整数自動番号であり、主キーです。[Hashed ID] は、[ID] に適用されたハッシュ関数の結果を保持します。最後に、[製品の説明] はユーザー入力を保持します (ハッシュ関数はパブリック関数として VBA モジュールに格納されます)。

[Serials] テーブルに行が挿入された後、フィールド [Hashed ID] が自動的に計算されるようにしたいと考えています。

秘訣は、このテーブルにイベント ドリブン データ マクロを正しく使用することにあると思いますが、既に挿入された行に対して「変更前」イベントを使用してのみ、この作業を行うことができました (したがって、 [ID] フィールド?) . 道に迷いました!!!

4

2 に答える 2

1

これは Access 2016 でテストされています。BeforeChange データ マクロ内のフィールドの読み取り中に NULL 値を取得する状況がわかりました。これは、そのフィールドが PRIMARY KEY である場合に発生します。オートナンバーではありません。したがって、この組み合わせがある場合に問題が発生します。

  1. BeforeChange イベント
  2. INSERT アクション (のみ)
  3. PRIMARY KEY フィールド

簡単な解決策は、PRIMARY KEY を UNIQUE に変更することです。

于 2016-11-09T23:20:38.713 に答える
0

さて、私は許容できる解決策を見つけることができました!

まず第一に、MS Access では、テーブルにイベント ドリブン データ マクロを使用する場合、 Autonumberフィールドの値が完全に挿入されて DB に保存されるまで、その値を直接参照することはできないようです (これ、他のフィールド タイプの場合)。パラメータとして渡されると、常にNULL VALUEが返されます。

そうは言っても、カスタム VBA 関数を使用して、Autonumber フィールドのCURRENT SEED NUMBERを引き続き参照できます( HansUp for This Postに感謝します)。

Public Function NEXTAUTONUM(ByVal pTable As String, ByVal pColumn as String) As Long

Dim CAT As Object
Set CAT = CreateObject("ADOX.Catalog")
Set CAT.ActiveConnection = CurrentProject.Connection
NEXTAUTONUM = CAT.Tables(pTable).Columns(pColumn).Properties("Seed")
Set CAT = Nothing

End Function

NEXTAUTONUM は、Access が次に [ID] フィールドに設定する Autonumber 値を返します。これは、HASH FUNCTION が入力パラメーターとして必要とするものです。これで、Before Change イベントでデータ マクロを作成できます。これは次のようになります。

If [IsInsert] = True Then
     Set Field
       Name  Hashed ID
       Value = HASHFUNCTION ( NEXTAUTONUM ( "Serials","ID" ) - 1 )
End If

さらに、NEXTAUTONUM 関数によって返された値から 1 を減算します。これは、次に作成される行ではなく、現在作業中の行の [ID] Autonumber 値が必要だからです。

これが誰かを助けることを願っています!

于 2015-03-05T22:42:06.937 に答える