2016-08-15 14 views
0

各レコードにUIDを使用するAccessアプリケーションがありますが、SQLのレコード順序と一致しません。 (すなわち、12845の私のUIDは、Accessのレコード番号12834に対応しています)アクセス - レコード内の文字列を見つけて、そのレコードに移動します

私はAccess DBを検索し、一致するUIDを見つけるレコードをプルするために作成した検索ボックスを持っていますが、私がコードを書いたやり方は、UIDと一致するレコード番号に行くということです(UID 12845を使用してレコード12834の代わりにレコード番号12845に移動します)。

私は数日間座っていましたが、周りに道を見つけることができません。インターネットを検索しても役に立つとは言えません。もし誰かが文字列にマッチして、そのレコードにどうやってレコード情報をパースしようとしているのかを知っていれば、それは素晴らしいでしょう。

以下は、使用しているコードの例です。これは、日付文字列を受け取り、レコード内の文字列を探し、UIDを取得し、その後、後藤に対応するレコードをしようとします:

Private Sub FindBarCodeDate_Click() 
Dim Barcode As String 
Dim EndDate As String 

If IsNull(BarcodeSearch.Value) Then 
    If IsNull(DateSearch.Value) Then 
     GoTo Done 
    Else 
     EndDate = DateSearch.Value 
    End If 
Else 
    If IsNull(DateSearch.Value) Then 
     Barcode = BarcodeSearch.Value 
    Else 
     Barcode = BarcodeSearch.Value 
     EndDate = DateSearch.Value 
    End If 
End If 

Dim rs As New ADODB.Recordset 
Dim strSql As String 
Dim TSD As String 

If Barcode <> "" Then 
    If EndDate <> "" Then 
     strSql = "SELECT [TSD ID] FROM dbo_barAdultCollectionData WHERE Barcode = '" & Barcode & "' AND [End Date] = '" & EndDate & "'" 
     On Error GoTo Done 
     rs.Open strSql, CurrentProject.Connection 
     TSD = rs.Fields.Item(0) 
     rs.Close 
     DoCmd.FindRecord TSD, acEntire, False, acSearchAll, False, acAll, True 
     Set rs = Nothing 
    Else 
     strSql = "SELECT [TSD ID] FROM dbo_barAdultCollectionData WHERE Barcode = '" & Barcode & "'" 
     On Error GoTo Done 
     rs.Open strSql, CurrentProject.Connection 
     TSD = rs.Fields.Item(0) 
     rs.Close 
     DoCmd.FindRecord FindWhat:=TSD, Match:=acEntire, MatchCase:=False, Search:=acSearchAll, SearchAsFormatted:=False, OnlyCurrentField:=acAll, FindFirst:=True 
     Set rs = Nothing 
    End If 
ElseIf Barcode = "" Then 
    If EndDate <> "" Then 
     strSql = "SELECT [TSD ID] FROM dbo_barAdultCollectionData WHERE [End Date] = '" & EndDate & "'" 
     On Error GoTo Done 
     rs.Open strSql, CurrentProject.Connection 
     TSD = rs.Fields.Item(0) 
     rs.Close 
     DoCmd.FindRecord FindWhat:=TSD, Match:=acEntire, MatchCase:=False, Search:=acSearchAll, SearchAsFormatted:=False, OnlyCurrentField:=acAll, FindFirst:=True 
     Set rs = Nothing 
    End If 
Else 
Done: 
    SearchError.Caption = "Invalid Search Term!" 
End If 
End Sub 

ありがとう!

+0

ラベルにジャンプすることによってのみ到達できるelseブロック。私はこれまでにそれを見たことがあるか分からない。それが賢明であると想像することはできません。 –

+0

したがって、IDが実際には同じでない場合は、SQLテーブルでIDを見つけて、そのIDをAccessテーブルで検索しています。私はあなたがSQL IDからAccess IDへの変換をどのように期待しているのか混乱しています。バックアップしましょう。英語で、テーブルを手動で調べると、どのAccessレコードが特定のSQLレコードにどのようになっているのか、どのようにわかりますか? –

答えて

1

まず、UIDに-11を追加してみてください:

TSD = CStr(Val(rs.Fields.Item(0).Value) - 11) 

はまた、あなたは文字列式としてあなたの日付値をフォーマットする必要があります。

EndDate = Format(DateSearch.Value, "yyyy\/mm\/dd") 

、その後:

strSql = "SELECT [TSD ID] FROM dbo_barAdultCollectionData WHERE [End Date] = #" & EndDate & "#" 
+0

あなたの「1を追加する」ための基礎は何ですか?ハックとしても、なぜそれがうまくいくのかわかりません。この特定のレコードの例をハックしようとすると、その差は11です。しかし、11を使用することは依然として危険なハックです。 –

+0

ありがとうございます。私は10を見逃しました。今修正しました。危険な?実際、これが機能するには、データが一貫していなければなりません。私は外部のUIDを持つフィールドを追加し、可能であればこれを更新すると思います。 – Gustav

+0

間違いなく外部キーフィールドにリンクする必要があります。もう一つ。私はかなりあなたが追加しないことを引き算する必要があると確信しています。私たちはSQL IDをAccess IDに変換しており、後者はAccess IDに変換しています。 –

1

DoCmd.FindRecordを使用しないでください。 Form.RecordsetCloneの2番目の例に示す手法を使用してください。

Dim rst As DAO.Recordset 

Set rst = Me.RecordsetClone 
rst.FindFirst "yourUIDcolumn = '" & TSD & "'" 
If rst.NoMatch Then 
    ' This should not happen 
    MsgBox "Record not found", vbCritical, "Panic!" 
Else 
    ' Set current record in form to found record 
    Me.Bookmark = rst.Bookmark 
End If 
rst.Close 
関連する問題