2016-08-15 39 views
0

我有一个Access应用程序为每个记录使用一个UID,但它不匹配到SQL中的记录顺序。 (即我的12845的UID对应于Access中的记录号码12834)访问 - 在记录中查找字符串,然后转到该记录

我有一个搜索框,我已经创建了应该搜索Access DB并拉起记录,找到匹配的UID,但是,我编写代码的方式是它将记录与UID匹配的记录编号(因此它将使用UID 12845获得记录号12845而不是记录12834)。

我一直坐在这上几天,我找不到解决办法。搜索互联网并没有什么帮助。如果任何人有一个想法,如何可以匹配一个字符串,并转到记录与试图解析自己的记录信息,那就太好了。

以下是我使用的代码示例。它需要一个日期字符串,并在记录查找字符串,获取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

Wow其他块只能通过跳转到标签才能到达。我不知道以前我见过这个。无法想象它永远是可取的。 –

+0

因此,您在ID表中查找ID并在ID表中搜索该ID时,ID实际上并不相同。我很困惑你如何期望它从SQL ID转换到Access ID。让我们回去吧。在英文中,如果我们手动查看打印的表格,我们将如何知道哪个Access记录与给定的SQL记录一起使用? –

回答

1

首先,尝试添加-11到UID:

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,而后者更小。 –

1

请勿使用DoCmd.FindRecord。使用Form.RecordsetClone第二个例子中显示的技术,例如

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