Sql 检查-因为我们是按唯一发票日期分组的,所以也会授予整个分组的唯一性

Sql 检查-因为我们是按唯一发票日期分组的,所以也会授予整个分组的唯一性,sql,vb6,sql-server-2000,Sql,Vb6,Sql Server 2000,IMHO,我相信,使用这种分组的唯一区别是,您还需要检查Excel文件中的数量总和是否与导入表中已有的数量总和相同。然后,您可以决定使用新值更新数量之和、跳过导入或引发错误。TBH,我没有尝试运行您的查询,因此我无法说明您的错误。但是,这里的问题是: strQuery = "SELECT [Invoice No],[invoice Date],[ProductId]," strQuery += "SUM(Price) AS Price,SUM(Quantity) as Quantity" str

IMHO,我相信,使用这种分组的唯一区别是,您还需要检查Excel文件中的数量总和是否与导入表中已有的数量总和相同。然后,您可以决定使用新值更新数量之和、跳过导入或引发错误。

TBH,我没有尝试运行您的查询,因此我无法说明您的错误。但是,这里的问题是:

strQuery = "SELECT [Invoice No],[invoice Date],[ProductId],"
strQuery += "SUM(Price) AS Price,SUM(Quantity) as Quantity"
strQuery += " FROM [" & strSheet & "$]"
strQuery += " GROUP BY [Invoice No],[invoice Date],[ProductId]"
将生成以下行:

Inv-1000    2017-07-10 10:00:00 101 1000 10
Inv-1000    2017-07-10 10:30:00 101  600  6
Inv-1000    2017-07-10 10:30:00 102  400 20
Inv-1001    2017-07-11 10:30:00 101  300  5
Inv-1001    2017-07-11 10:30:00 102  200  5
因此,您可以迭代这些行以导入发票

关于检查已导入的数据:

检查的行为应该与以前一样,您可以跳过导入相同的数据两次,只需对检查使用相同的查询-因为我们是按唯一发票日期分组的,所以整个分组的唯一性也被授予


IMHO,我相信,使用这种分组的唯一区别是,您还需要检查Excel文件中的数量总和是否与导入表中已有的数量总和相同。然后,您可以决定使用新值更新数量之和、跳过导入或引发错误。

尝试创建获取条件和计算结果的sql函数。
SQL函数是为不同类型的输出提供动态结果的最佳方式。

尝试创建SQL函数,获取条件并计算结果。
SQL函数是为不同类型的输出提供动态结果的最佳方法。

a好的,函数一次返回一个值。那么,在上面的场景@Qaiser Mehmood中,这会起作用吗?谢谢回复。AFAIK,函数一次返回一个值。那么,在上面的场景@Qaiser Mehmood中,这会起作用吗?谢谢你的回复。来吧@deblocker。你又抓住我了,这很简单。再次感谢您的时间和努力。顺便说一句,简单的事情会让人更加困惑:pCome on@deblocker。你又抓住我了,这很简单。再次感谢您的时间和努力。顺便说一句,简单的事情会让人更加困惑:p
str = "SELECT IIF(SUM([Price]) IS NULL, 0, SUM([Price])) AS SumPrice, IIF(SUM([Quantity]) IS NULL, 0, SUM([Quantity])) AS SumQuantity FROM [" & strSheet & "$]" & _
      " WHERE [Invoice No] = '" + InvNo + "'" & _
      " AND [ProductId] = '" + ProductId+ "'" & _
      " AND [Invoice Date] = '" + strDate + "'"

Set rs = con.Execute(str)
ProductId - Invoice No - Invoice Date - Price - Quantity
101 - Inv-1000 - 7/10/2017 10:00 - 1000 - 10
101 - Inv-1000 - 7/10/2017 10:30 - 200 - 2 
101 - Inv-1000 - 7/10/2017 10:30 - 400 - 4 
102 - Inv-1000 - 7/10/2017 10:30 - 400 - 20
101 - Inv-1001 - 7/11/2017 10:30 - 300 - 5
102 - Inv-1001 - 7/11/2017 10:30 - 200 - 5
ProductId - Invoice No - Invoice Date - Price - Quantity - Auto No
101 - Inv-1000 - 7/10/2017 10:00 - 1600 - 16 - 1
Dim recordCount As Integer 'Variable to get record count
Dim i As Integer

Private Sub btnUpload_Click()
   LoadExcelSheet
End Sub

'**Method To Upload Excel File - Starts**
Public Sub LoadExcelSheet()
Dim con As ADODB.Connection
Dim conn As ADODB.Connection

'**Record Set To Check Table Records - Starts**
Dim rs As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim rs3 As ADODB.Recordset
'**Record Set To Check Table Records - Ends**

Dim i As Long

Dim strQuery As String
Dim str As String
Dim str2 As String
Dim strQuery2 As String
Dim strQuery3 As String

Dim strFile As String
Dim strSheet As String


Set con = New ADODB.Connection
Set conn = New ADODB.Connection

Set rs = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
Set rs3 = New ADODB.Recordset

i = 0

strFile = txtFileName.Text
strSheet = "Sheet1"
con.Provider = "Microsoft.ACE.OLEDB.12.0"
con.ConnectionString = "Data Source = " & strFile & ";" & "Extended Properties = Excel 12.0;"

conn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Demo;Data Source=.;"
con.Open

strQuery = "SELECT * FROM [" & strSheet & "$]"
strQuery2 = "SELECT ProductId, [Invoice No], [Invoice Date] FROM DataExcel"
strQuery3 = "SELECT ProductId, [Invoice No], [Invoice Date], [Price], [Quantity] FROM DataExcel"

rs.Open strQuery, con, adOpenStatic, adLockOptimistic
rs2.Open strQuery2, conn, adOpenStatic, adLockOptimistic
rs3.Open strQuery3, conn, adOpenStatic, adLockOptimistic

strDate = Format(Now, "YYYY-MM-DD") + " 00:00:00"

If (rs2.recordCount > 1) Then
  MsgBox "Few or all records already exist! Check excel file."
ElseIf (rs.Fields(0).Name <> rs3.Fields(0).Name Or rs.Fields(1).Name <> rs3.Fields(1).Name Or rs.Fields(2).Name <> rs3.Fields(2).Name Or rs.Fields(3).Name <> rs3.Fields(3).Name Or rs.Fields(4).Name <> rs3.Fields(4).Name) Then
  MsgBox "Column names don't match! Please check excel file."
Else
    Do Until rs.EOF
    Dim InvNo As String
    InvNo = rs.Fields(1).Value

    Dim AutoNo As String
    Dim AutoNo2 As Integer

    Dim ProductId As String
    ProductId = rs.Fields(0).Value

    Dim ProductId2 As Integer
    ProductId2 = rs.Fields(0).Value

    Dim InvoiceDate As String
    InvoiceDate = Trim(rs.Fields(2).Value)

    Dim Price As String
    Price = Trim(rs.Fields(3).Value)

    Dim Quantity As String
    Quantity = Trim(rs.Fields(4).Value)

    strDate = Format(InvoiceDate, "YYYY/MM/DD hh:mm:ss")

    'This is what I am doing - Checking the same invoice no, product id and invoice date.
    'If any found in the excel file, then sum up the quantity and price
    str = "SELECT IIF(SUM([Price]) IS NULL, 0, SUM([Price])) AS SumPrice, IIF(SUM([Quantity]) IS NULL, 0, SUM([Quantity])) AS SumQuantity FROM [" & strSheet & "$]" & _
          " WHERE [Invoice No] = '" + InvNo + "'" & _
          " AND [ProductId] = 101" & _
          " AND [Invoice Date] = '" + strDate + "'"

    Set rs = con.Execute(str)

    Quantity = rs.Fields("SumQuantity").Value
    Price = rs.Fields("SumPrice").Value

    'Here is the trick - Initially passed the excel file data to verify
    'and checking if any product id exists with the same invoice number in the database table
    str = "SELECT ISNULL(MAX([Auto No]),0) AS AutoNo FROM DataExcel" & _
          " WHERE [Invoice No] = '" + InvNo + "'" & _
          " AND [ProductId] = '" + ProductId + "'"

    Set rs2 = conn.Execute(str) 'Gets the auto number

    AutoNo2 = rs2.Fields("AutoNo").Value + 1 'Increments the number by one if any duplicate exists
    AutoNo = AutoNo2 & ""

    str = "INSERT INTO DataExcel (" & _
          "[ProductId], " & _
          "[Invoice No], " & _
          "[Invoice Date], " & _
          "Price, " & _
          "Quantity, " & _
          "[Auto No]" & _
          ") VALUES (" & _
          "'" + ProductId + "'," & _
          "'" + InvNo + "'," & _
          "'" + InvoiceDate + "'," & _
          "'" + Trim(Price) + "'," & _
          "'" + Trim(Quantity) + "'," & _
          "'" + AutoNo + "')"
    conn.Execute (str) 'Finally stores data with tracking or serial numbers

  rs.MoveNext
Loop
End If

rs.Close

Set rs = Nothing

con.Close
conn.Close

Set con = Nothing
Set conn = Nothing
End Sub
'**Method To Upload Excel File - Ends**
strQuery = "SELECT [Invoice No],[invoice Date],[ProductId],"
strQuery += "SUM(Price) AS Price,SUM(Quantity) as Quantity"
strQuery += " FROM [" & strSheet & "$]"
strQuery += " GROUP BY [Invoice No],[invoice Date],[ProductId]"
Inv-1000    2017-07-10 10:00:00 101 1000 10
Inv-1000    2017-07-10 10:30:00 101  600  6
Inv-1000    2017-07-10 10:30:00 102  400 20
Inv-1001    2017-07-11 10:30:00 101  300  5
Inv-1001    2017-07-11 10:30:00 102  200  5