2014-09-10 21 views
0

花了很多小时试图解决此问题后,我不知道如何继续。我试图将电子表格中的数据添加到Access表中,但我不希望表中有任何重复项,并且希望现有行的更新版本替换现有行。我觉得我已经用尽了与互联网有关的问题。我使用了以下Stack Overflow链接(How to check for record by using ID, then if record exists update if not add new record)中的线程来帮助我解决很多问题,但是我对代码的理解并没有做到我所需要的。我没有语法错误;但是我的SQL语句(通过确定电子表格数据是否与当前数据库条目匹配来过滤记录集)是在数据库表中每个电子表格条目至少有5个完全相同的副本时返回空记录集。我完全陷入了这个问题。以下是我的代码:RecordSet过滤不检测重复项或修改现有行

Public Sub ADOFromExcelToAccess() 
    'Variable definition 
    InputDate = Tracking.Sheets("P&Q Weekly Summary").Range("E3").Value 
    Call SetDataConnection 
    Set DataRecordset = New ADODB.Recordset 
    With DataRecordset 
     For DataRowCount = 2 To TrackingLastRow 
      Part_Number = Tracking.Sheets("Operator Data").Range("A" & DataRowCount).Value 
      Week_Day = Tracking.Sheets("Operator Data").Range("B" & DataRowCount).Value 
      Weekday_Name = WeekdayName(Weekday(Week_Day)) 
      Quantity = Tracking.Sheets("Operator Data").Range("C" & DataRowCount).Value 
      Machine = Tracking.Sheets("Operator Data").Range("G" & DataRowCount).Value 
      'Attempting to find duplicate entry 
      SQLCmd = "SELECT * FROM Raw_Data WHERE [Part] = '" & Part_Number & "' AND [Day] = " & Week_Day & " AND [Quantity] = " & Quantity & " AND [Machine] = '" & Machine & "';" 
      .Open Source:=SQLCmd, ActiveConnection:=DBConnection, CursorType:=adOpenDynamic, LockType:=adLockOptimistic, Options:=adCmdText 
      If (.BOF) Or (.EOF) Then 
       MsgBox .RecordCount 
       'No match found; add new record 
       .AddNew 
       .Fields("Part") = Part_Number 
       .Fields("Week") = InputDate 
       .Fields("Day") = Week_Day 
       .Fields("Weekday") = Weekday_Name 
       .Fields("Quantity") = Quantity 
       .Fields("Adjusted Quantity") = Tracking.Sheets("Operator Data").Range("D" & DataRowCount).Value 
       .Fields("Sample") = Tracking.Sheets("Operator Data").Range("E" & DataRowCount).Value 
       .Fields("Rejected") = Tracking.Sheets("Operator Data").Range("F" & DataRowCount).Value 
       .Fields("Machine") = Machine 
       .Fields("Cycle") = Tracking.Sheets("Operator Data").Range("H" & DataRowCount).Value 
       .Fields("Operator") = Tracking.Sheets("Operator Data").Range("I" & DataRowCount).Value 
       .Update 
       DataRowCount = DataRowCount + 1 
      'If current line already exists in database 
      Else 
       .Fields("Part") = Part_Number 
       .Fields("Week") = InputDate 
       .Fields("Day") = Week_Day 
       .Fields("Weekday") = Weekday_Name 
       .Fields("Quantity") = Quantity 
       .Fields("Adjusted Quantity") = Tracking.Sheets("Operator Data").Range("D" & DataRowCount).Value 
       .Fields("Sample") = Tracking.Sheets("Operator Data").Range("E" & DataRowCount).Value 
       .Fields("Rejected") = Tracking.Sheets("Operator Data").Range("F" & DataRowCount).Value 
       .Fields("Machine") = Machine 
       .Fields("Cycle") = Tracking.Sheets("Operator Data").Range("H" & DataRowCount).Value 
       .Fields("Operator") = Tracking.Sheets("Operator Data").Range("I" & DataRowCount).Value 
       .Update 
       DataRowCount = DataRowCount + 1 
      End If 
      .Close 
     Next DataRowCount 
    End With 
    Set DataRecordset = Nothing 
    DBConnection.Close 
    Set DBConnection = Nothing 
End Sub 

谢谢你的帮助。我非常感谢。

+0

我想尝试从WHERE子句中删除条件,然后一次添加一个,并查看在哪一点上,您将丢失所有记录。那么至少你可以仔细检查该字段的数据。 – Rory 2014-09-10 12:22:55

+0

根据Rory的回答,除了我通常使用调试来获取SQLCmd值,并将其放入SQL视图中的新查询中,然后切换回设计视图。正如Rory所说,删除每个标准直到找到问题。通常你会在设计视图中发现问题。 – maxhugen 2014-09-10 13:05:37

+0

谢谢你的建议,它帮助了很多。除了使用WHERE [Day] =“&Week_Day&”之外,所有字段和组合都不会生成重复项。这是我的问题标准。在Access中,[日期]列处于常规日期格式。 Excel电子表格中的相应列也是日期格式。不知何故,这两列不能识别我猜对方的相应格式。关于具体可能出错的任何想法?谢谢。 – jlynn303 2014-09-10 14:59:12

回答

0

我的SQL语句中的问题是日期标准。显然,每个MSDN的日期和时间标准都需要特殊的语法(http://msdn.microsoft.com/en-us/library/dd627355(v=office.12).aspx#Access2007BuildingSQLStatements_UsingDateTimeCriteria)。

WHERE [Day] = " & Week_Day & " 

下面的代码反映了变化,特别是必要的#的:不要使用以下WHERE子句的

WHERE [Day] = #" & Week_Day & "# 

上面的链接说明了这一点相当清楚。如果不通过我的WHERE语句解析,我不会发现这一点。除了具有日期标准的那个之外,其他所有的都很好。问题解决了。