Vba Access—在记录中查找字符串,然后转到该记录

Vba Access—在记录中查找字符串,然后转到该记录,vba,ms-access,Vba,Ms Access,我有一个Access应用程序,它为每条记录使用一个UID,但是它与SQL中的记录顺序不匹配。(即,我的UID为12845,对应Access中的记录号12834) 我有一个我创建的搜索框,用来搜索Access DB并调出它找到匹配UID的记录,但是,我编写代码的方式是,它将指向与UID匹配的记录编号(因此它将转到记录编号12845,而不是使用UID 12845的记录12834) 我已经在这上面坐了好几天了,我找不到解决的办法。事实证明,搜索互联网并没有什么帮助。如果有人知道如何匹配字符串并转到该记

我有一个Access应用程序,它为每条记录使用一个UID,但是它与SQL中的记录顺序不匹配。(即,我的UID为12845,对应Access中的记录号12834)

我有一个我创建的搜索框,用来搜索Access DB并调出它找到匹配UID的记录,但是,我编写代码的方式是,它将指向与UID匹配的记录编号(因此它将转到记录编号12845,而不是使用UID 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
Private子FindBarCodeDate_Click()
将条形码变暗为字符串
Dim EndDate作为字符串
如果IsNull(BarcodeSearch.Value),则
如果为null(DateSearch.Value),则
好了
其他的
EndDate=DateSearch.Value
如果结束
其他的
如果为null(DateSearch.Value),则
条形码=条形码搜索。值
其他的
条形码=条形码搜索。值
EndDate=DateSearch.Value
如果结束
如果结束
将rs设置为新ADODB.Recordset
作为字符串的Dim strSql
将TSD设置为字符串
如果条形码为“”,则
如果EndDate为“”,则
strSql=“从dbo_barAdultCollectionData中选择[TSD ID],其中条形码='”&Barcode&“,[End Date]=”&EndDate&“”
错误转到完成
打开strSql,CurrentProject.Connection
TSD=rs.Fields.Item(0)
rs.Close
DoCmd.FindRecord TSD,acEntire,False,acSearchAll,False,acAll,True
设置rs=无
其他的
strSql=“从dbo_barAdultCollectionData中选择[TSD ID],其中条形码=”&条形码&“
错误转到完成
打开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
设置rs=无
如果结束
ElseIf Barcode=”“然后
如果EndDate为“”,则
strSql=“从dbo_barAdultCollectionData中选择[TSD ID],其中[End Date]=”&EndDate&“”
错误转到完成
打开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
设置rs=无
如果结束
其他的
完成:
SearchError.Caption=“无效的搜索词!”
如果结束
端接头

谢谢

首先,尝试将-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 & "#"

首先,尝试将-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 & "#"

不要使用
DoCmd.FindRecord
。使用第二个示例中所示的技术,例如


不要使用
DoCmd.FindRecord
。使用第二个示例中所示的技术,例如


哇,一个只有跳转到标签才能到达的else块。我不确定我以前见过。想象不出这样做是明智的。因此,您在SQL表中查找ID,并在Access表中搜索该ID,而ID实际上并不相同。我不知道您希望它如何从SQL ID转换为Access ID。让我们备份一下。在英语中,如果我们手动查看打印出来的表,我们如何知道哪个访问记录与给定的SQL记录相匹配?哇,一个只有跳转到标签才能到达的else块。我不确定我以前见过。想象不出这样做是明智的。因此,您在SQL表中查找ID,并在Access表中搜索该ID,而ID实际上并不相同。我不知道您希望它如何从SQL ID转换为Access ID。让我们备份一下。在英语中,如果我们手动查看打印出来的表,我们如何知道哪个访问记录与给定的SQL记录匹配?您的“添加1”建议的依据是什么?即使是一个黑客,我也不明白为什么它会起作用。如果您试图破解这个特定的记录示例,那么区别是11。但是使用11仍然是一种非常危险的黑客行为。谢谢。我错过了10次。现在更正。危险的事实上,数据必须是一致的,才能起作用。我想我应该添加一个带有外键UID的字段,然后尽可能地更新它。当然应该链接到外键字段上。还有一件事。我很确定你需要减法而不是加法。我们正在将SQL ID转换为Access ID,后者更小。@MarkBalhoff:你可能是对的。我将把这留给提问者来更改…最初,SQL DB具有每个UID对应的确切记录数。(即第1行的UID为1,第2行的UID为2,等等)。一路上有人删除了一些记录,造成了不平衡。如我所述,SQL表中的第12834行现在对应于UID12845。在Access中,UID显示在每个记录上,这是我们希望搜索工作的方式;查找条件,获取UID,然后转到与该UID匹配的访问记录。显然,它是指向任何UID的记录编号,而不是指向包含UID的记录。您的“添加1”建议的依据是什么?即使是一个黑客,我也不明白为什么它会起作用。如果您试图破解这个特定的记录示例,那么区别是11。但是使用11仍然是一种非常危险的黑客行为。谢谢。我错过了10次。现在更正。危险的事实上,数据必须是一致的,才能起作用。我