【问题标题】:Determining if Spreadsheet Entries Match Database Column Entries确定电子表格条目是否与数据库列条目匹配
【发布时间】:2014-08-08 19:44:17
【问题描述】:

我的项目的一个方面涉及将操作员输入的零件编号与数据库列中的预定零件编号列表进行比较。现在,我的程序告诉我,电子表格中输入的每个零件号 (50+) 都与数据库中的任何零件号都不匹配,我已验证这是不正确的。我检查了电子表格部件号和数据库部件号都是字符串数据类型。我已经仔细检查了我的循环逻辑是否良好,对我来说似乎它应该可以工作。据我所知,数据库单元格或电子表格单元格中没有隐藏字符。在这一点上,我完全不知道为什么我的程序没有检测到电子表格和数据库之间的任何匹配。下面是包含用于检查零件编号是否匹配的代码的 Sub:

Sub CheckPN()
  'Connect to the E2 database
   Call SetPNConnection
  'Open a recordset
   Set PNRecordset = New ADODB.Recordset
   PNRecordset.Open "EstimRpt", PNConnection, adOpenKeyset, adLockOptimistic, adCmdTable
   PNSQLCmd = "SELECT DISTINCT [PartNo] FROM EstimRpt;"
  'Loop through data, comparing part numbers to E2 database part number records
   TotalBadPNCount = 0
   With PNRecordset
      For DataRowCount = 2 To TrackingLastRow
         PNCount = 0
         Part_Number = Tracking.Sheets("Operator Data").Range("A" & DataRowCount).Value
        'MsgBox "The datatype for " & Part_Number & " is " & VarType(Part_Number) & "."
         Do Until .EOF
           'MsgBox "The datatype for " & .Fields("PartNo").Value & " is " & VarType(.Fields("PartNo").Value) & "."
            If Part_Number = .Fields("PartNo").Value Then
           'If .Fields("PartNo").Value = Part_Number Then
               MsgBox Part_Number & " is a match."
               PNCount = PNCount + 1
            End If
            .MoveNext
         Loop
         If PNCount < 1 Then
            MsgBox "The P/N " & Part_Number & " entered in cell A" & DataRowCount & " is incorrect.  Please correctly enter the P/N and re-run the program."
            TotalBadPNCount = TotalBadPNCount + 1
         End If
      Next DataRowCount
      If TotalBadPNCount >= 1 Then
         Exit Sub
      End If
   End With
   PNRecordset.Close
   Set PNRecordset = Nothing
   PNConnection.Close
   Set PNConnection = Nothing
End Sub

附带说明,如果零件号不匹配,我希望整个程序停止执行,而不仅仅是直接子。目前,只有这个子在没有零件号匹配时退出。

感谢您对这两个问题的帮助。

约旦

【问题讨论】:

    标签: sql excel ms-access-2007 vba


    【解决方案1】:

    我建议不要使用循环将用户提交的数据集中的记录与永久表进行比较。相反,将用户提交的数据集加载到数据库中的临时表中,并使用 SQL 比较这两个表。

    您可以尝试以下方法:

    'Load spreadsheet into temp table
    <your code here>
    
    'open recordset in order to compare PartNos
    Dim db As Database
    Set db = CurrentDb
    Dim rs As Recordset
    
    sSQL = "select count(*) as [count] from temp " _ 
            & " where temp.PartNo not in (select distinct EstimRpt.PartNo from EstimRpt)"
    Set rs = db.OpenRecordset(sSQL)
    
    ctRecords = rs![Count]
    
    'if records are found in temp table that do not exist 
    'in the perm table, then end execution of everything.
    if ctRecords > 0 then
        End
    else
        'run the rest of your code
        <your code here>
    end if
    
    'Drop temp table
    <your code here>
    

    【讨论】:

    • 将我的用户提交的 Excel 数据集中的记录与我的永久 Access 表进行比较不起作用是否有特殊原因?相对而言,这条路线的替代方案似乎相当麻烦。如果 Access 和 Excel 记录都是字符串类型,为什么那些应该匹配的不匹配呢?两条记录之间是否存在一些“隐藏”差异?感谢您的帮助。
    • 如果无法访问您的文件,我不知道为什么您当前的比较不起作用。如果 Excel / Access 版本之间存在任何兼容性问题,则在运行比较之前将 Excel 数据拉入 Access 将突出显示这些问题(将 Excel 列导入 Access 后检查它们的数据类型)。数据进入 Access 后,您可以在不使用 RBAR 的情况下运行基于集合的比较,这在您处理大型数据集时大大提高了性能。
    • 我正在读取的数据库是一个我必须不以任何方式更改/更改/修改的数据库(它是一个用于商店管理程序的相当大的数据库)。因此,我只想从中读取数据,而不是其他任何内容。因此,排除这一点,我再次确保两个值都是字符串,并且根据我的 excel 程序中的消息框,我的 excel 程序正在读取/解释数据库值,就像它们在 Excel 中编写的一样。这似乎表明我的数据很好,但我的循环有缺陷,但对我来说看起来不错。蚂蚁建议?
    • 好的——祝你好运!我无法提出任何建议,因为我看不到 Excel 和 Access 文件中“幕后”的实际情况。如果您不想在现有的 Access 数据库中创建任何新对象,您可以创建一个单独的数据库,从“主”数据库中提取数据并在其中进行比较。
    【解决方案2】:

    我终于找到了我的问题。数据库和电子表格之间的比较记录现在确实有效。我必须对我的代码进行以下更改:

    代替:

    Do Until .EOF
    

    我需要:

    Do Until .EOF = True
    

    我还需要在 For 循环声明之后添加以下内容:

    .MoveFirst
    

    现在我的代码可以正确循环了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      相关资源
      最近更新 更多