捕獲された動物に既存の WHno があるかどうかを確認するように設計されたデータ入力フォーム (Access 2007) があります。残念ながら、データは乱雑であり、これらは単一の一意の識別子ではないため、検索を絞り込むためにいくつかのテストを実行する必要があります.
動物は、データベース内での動物の存在を識別するのに役立つ 1 ~ 10 の異なる情報を持つことができます。(スクリプトは、これまでのところそれらの約半分のみをテストしています) これを行う最善の方法は、ユーザーが選択したフィールドに基づいて DCount および/または SQL ステートメントを「構築」することだと考えていました。特定のテキスト フィールド ボックス (バインドされていない) が入力されているかどうかをテストし、入力されている場合は、コードのそのセクションを DCount/SQL ステートメントに連結し、次のテキスト フィールド ボックスに移動してテストしたいと考えています。
ステートメントが完全に作成されたら、カウント/選択されたレコードの数をテストしたいと思います。1件のレコードが選択されている場合、FormAで結果を表示したい。2 つ以上のレコードが見つかった場合、テストされていないが FormB に表示されている追加情報に基づいて、ユーザーが正しい動物を選択できる複数リスト フォーム (FormB) にレコードを表示したいと考えています。レコードが見つからない場合は、フォームに入力されたデータをテーブルに更新して新しいレコードを作成したいと考えています。
私が今苦労しているハードルは、DCount ステートメントを作成することです。構文エラーが発生し続けます。構文が不完全であるため、関数が爆破されたときにこれを少しずつまとめる方法がわかりません (これは、「構築」を完了するまで続きます)。
データがめちゃくちゃなのはわかっています。フィールドの外のシーンは混沌としており、さまざまな人々がさまざまな種類の情報を収集しており、紙のフォームに入力する必要があるすべてのデータが完全に記入されているわけではありません。データ収集手順がすぐに変更される可能性はほとんどありません。
アイデア?異なるがより簡単なアプローチのアイデアも歓迎します。これは初めてで、すべてのプログラミングオプションがわかりません。
また、この声明が爆発するまでにどれくらいの時間がかかりますか?
これまでのコード:
Private Sub GenerateWHno_Click()
Dim rs As DAO.Recordset
If IsNull(Forms!F_HotelEntry!txtSpecies) Or (Forms!F_HotelEntry!txtSpecies) = "" Then
MsgBox "Species is a required field. Please enter a species"
Exit Sub
End If
MsgBox txtSpecies
' Each line of code below indicates a data entry field(s) that needs testing and appended to SpeciesCount if "true". The first line is unchanging and is declared upfront.
'SpeciesCount = DCount("[Species]", "AnimalInfo", "(nz([Status])= '' OR [Status] = 'Alive' OR [Status] = 'Unknown') AND ([Species]= '" & txtSpecies & "')" _
' & "AND (((nz([L_ET_Color1])= '" & Nz(txtL_ET_Color1) & "' AND nz([L_ET_No1])= '" & nz(txtL_ET_No1) & "')" _
' & "AND (((nz([R_ET_Color1])= '" & Nz(txtR_ET_Color1) & "' AND nz([R_ET_No1])= '" & nz(txtR_ET_No1) & "')" _
' & "AND nz([L_ET_No2])= '" & nz(txtL_ET_No2) & "')" _
' & "AND nz([R_ET_No2])= '" & nz(txtR_ET_No2) & "')" _
' & "")
'If txtL_ET_Color Is Not Null Or txtL_ET_No Is Not Null Then
'LET1 = & "AND (((nz([L_ET_Color1])= '" & Nz(txtL_ET_Color1) & "' AND nz([L_ET_No1])= '" & nz(txtL_ET_No1) & "')" _
'Species Count = SpeciesCount & LET1
'End If
'If txtR_ET_Color Is Not Null Or txtR_ET_No Is Not Null Then
'RET1 = & "AND (((nz([R_ET_Color1])= '" & Nz(txtR_ET_Color1) & "' AND nz([R_ET_No1])= '" & nz(txtR_ET_No1) & "')" _
'Species Count = SpeciesCount & RET1
'End If
'If txtL_ET_No2 Is Not Null Then
'LET2 = AND nz([L_ET_No2])= '" & nz(txtL_ET_No2) & "')" _
'Species Count = SpeciesCount & LET2
'End If
'If txtR_ET_No2 Is Not Null Then
'RET2 = AND nz([R_ET_No2])= '" & nz(txtR_ET_No2) & "')" _
'Species Count = SpeciesCount & RET2
'End If
'There are about 4 more options/fields to add to the script but you get the idea.
'Thus: If user selected Species, and filled out L_ET_Color1 and/or L_ET_No1, the final concatenation (DCount statement)would look like this:
SpeciesCount = DCount("[Species]", "AnimalInfo", "([Status]= 'Alive' OR [Status] = 'Unknown' OR nz([Status]) = '') AND [Species]= '" & txtSpecies & "' AND (nz([L_ET_Color1])= '" & Nz(txtL_ET_Color1) & "' AND nz([L_ET_No1])= '" & Nz(txtL_ET_No1) & "')")
If SpeciesCount > 1 Then
MsgBox SpeciesCount & " Greater than 1. Please select correct animal"
'Create SQL statement that mimics DCount statement and display all fields from AnimalInfo table as multilisting to select from
ElseIf SpeciesCount = 0 Then
MsgBox "You need a new WHno"
WHno = Nz(DMax("WHno", "AnimalInfo")) + 1
MsgBox WHno
Set rs = CurrentDb.OpenRecordset("AnimalInfo")
rs.AddNew
rs!WHno = WHno
rs!Species = txtSpecies
rs!L_ET_Color1 = txtL_ET_Color1
rs!L_ET_No1 = txtL_ET_No1
rs.Update
rs.Close
Else
'Create SQL statement that mimics DCount statement and display all fields from AnimalInfo table as single listing in a form.
MsgBox "You're WHno is " & WHno & " Is this the correct WHno?"
End If
Forms!F_HotelEntry!txtSpecies = ""
Forms!F_HotelEntry!txtL_ET_Color1 = ""
Forms!F_HotelEntry!txtL_ET_No1 = ""
End Sub