私はStackOverflowと、MSAccessであらゆる種類の高度なプログラミングを行うことに非常に慣れていません。トレーディングカードコレクションをカタログ化するためのデータベースを作成しました(2000を超えるユニークなカードについて話しているので、Excelはそれをカットしていませんでした)。最初は単純なレコードのテーブルでしたが、今では検索フォームやクエリなどすべてを備えた本格的なデータベースになりました。
私が今やろうとしているのは、プロセスを少し合理化することです。Accessに実行させたい非常に具体的なことがあります。私がやりたいことはすべてVBAで行わなければならないことはほぼ確実であり、私は自分がやりたいことを行うのに十分な知識がありません。
私がしたいことはこれです:新しいレコードが入力されるときはいつでも、それがレコードをDBに保存する前にレコードをチェックしたいです(私は「更新前」イベントを使用する必要があるとかなり確信していますこれ)、「Sort ID」フィールド(私が作成した自動計算フィールド)に重複が含まれていないことを確認します(自動計算フィールドにはインデックスを付けることができないため、クエリを使用する必要がある可能性が高いと思います) )。プログラムが重複を検出した場合、重複レコードを入力しようとしていることを示すメッセージボックスを生成し、新しいレコードを作成するのではなく、既存のレコードの「所有番号」フィールドを更新するかどうかを尋ねます。 、そして肯定的な応答で問題の記録に私を連れて行ってください。
私が現在持っているのは、インデックス(ソートIDを生成するフィールドで構成される)を使用する検証ルールです。これは、「エラー時」イベントで次のVBAコードを使用してカスタムエラーメッセージを生成します。
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Const conErrRequiredData = 3022
If DataErr = conErrRequiredData Then
MsgBox ("Duplicate Sort ID. Please update the 'number owned' field on the existing record instead.")
Response = acDataErrContinue
Else
Response = acDataErrDisplay
End If
End Sub
このコードは正常に機能しますが、何もできないポップアップエラー以上のものが必要です。クエリウィザードを使用して作成した「CheckDuplicateSortID」というタイトルのクエリがあり、「Sort ID」フィールドに重複がないかチェックしますが、それは私がなんとか取得できた範囲です。このサイトの例は、私が探しているものに最も近いものを見つけることができましたが、与えられたコードサンプルは、説明がほとんどないため、理解するのが非常に困難です。私はAccessVBAに精通していないため、どの部分が重要なコードであり、どの部分が彼の特定のものであるかを知ることができません。フィールド名およびその他の変数。そのサンプルコードから何を変更する必要があり、何に変更する必要があるのかを理解しようとしても困惑しているため、エラーメッセージは表示されません。
編集:ただ、明確化のために、解決策はありません持っているソートIDフィールドが関与します。これを作成したので、プログラムが指すことができるフィールドが1つあります。しかし、現在の検証ルールに使用しているインデックス(上記のコードによって生成されたエラーメッセージを含む)を使用する方が簡単な場合は、それも受け入れます。
かなりの苦労の末、私は実際に自分でこれに対する解決策を見つけることができましたが、おそらく不必要に複雑です(誰かがあれば、もっと簡単な解決策を絶対に受け入れます)。
実際のSortIDフィールドを使用するのではなく、OPのコードを次のように変更しました。
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Dim strMsg As String
Dim iResponse As Integer
'The text to be displayed in the message prompt.
strMsg = "Unable to save record. The values you have entered would generate a duplicate." & Chr(10)
strMsg = strMsg & "Would you like to clear this form and edit the existing record instead?"
'Calls for the yes/no message prompt specifically when the no-duplicate
'validation rule is violated (error 3022).
Const conErrRequiredData = 3022
If DataErr = conErrRequiredData Then
iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Invalid Sort ID")
Response = iResponse
If iResponse = vbYes Then
'Calls a custom function that opens the record in question for editing.
UpdateOnError
Else
'Cancels the operation on a negative response and does not clear the form.
Cancel = True
End If
Else
Response = acDataErrDisplay
End If
End Sub
上記のコードからわかるように、イベントはカスタム関数を呼び出します。カスタム関数は次のようにコード化されています。
Function UpdateOnError()
On Error GoTo UpdateOnError_Err
Dim UpdateGoToID As Variant
'Selects the Sort ID in question for the purpose of opening the existing record.
UpdateGoToID = Forms![Card List Entry Form]!txtSortID
'Clears the invalid form.
DoCmd.RunCommand acCmdUndo
'Opens the existing record the user attempted to duplicate.
DoCmd.OpenForm "Card List Entry Form", acNormal, "", "[Sort ID]=" & "'" & UpdateGoToID & "'", , acNormal
UpdateOnError_Exit:
Exit Function
UpdateOnError_Err:
MsgBox Error$
Resume UpdateOnError_Exit
End Function
私が言ったように、これはおそらく実際に必要なステップよりもはるかに多くのステップですが、私が望むように機能します:ユーザーが重複レコードを入力しようとすると、既存のレコードを更新するかどうかを尋ねるエラーメッセージがポップアップします。はいの場合、既存のレコードに移動します。いいえの場合、フォームをクリアしたりレコードを保存したりせずにエラーメッセージを閉じます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加