0

捕獲された動物に既存の 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
4

1 に答える 1

0

最初に条件を文字列変数に構成することをお勧めします。そこで、Debug.Print を介してその内容を印刷し、問題の原因を確認できます。

検査だけでは問題を特定できない場合は、生成された文字列を適切なクエリの Sql ビューに貼り付けて、Access がデザイン ビューへの切り替えに関する役立つ情報を提供するかどうかを確認します。

于 2013-11-14T18:03:41.157 に答える