[英]Sum Quantity and Price On Specific Condition
我正在嘗試在excel文件中進行價格和數量的總和,並將它們存儲在數據庫表中。 因此,這里是(我自己嘗試學習)-假設這些是excel文件數據:
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 'These should be merged with the above one as they have the same invoice, product id and date time
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
我的要求是,如果有任何具有相同發票和發票日期時間的產品ID,則應合並這些結果,數據庫表中的輸出如下:
ProductId - Invoice No - Invoice Date - Price - Quantity - Auto No
101 - Inv-1000 - 7/10/2017 10:00 - 1000 - 10 - 1
101 - Inv-1000 - 7/10/2017 10:30 - 600 - 6 - 2 'Finally merged
102 - Inv-1000 - 7/10/2017 10:30 - 400 - 20 - 1
101 - Inv-1001 - 7/11/2017 10:30 - 300 - 5 - 1
102 - Inv-1001 - 7/11/2017 10:30 - 200 - 5 - 1
因此,我嘗試使用以下代碼在sql查詢中驗證發票編號,產品ID和發票日期時間來進行嘗試:
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)
但是在WHERE子句中,我得到了這些錯誤- 條件表達式中的數據類型不匹配 。
出現錯誤消息后,我確實只使用了帶有產品ID的發票號來檢查是否可行,並且確實如此(對於發票'Inv-1000'和產品ID 101)如此,但其余的excel數據均未加載-
Excel數據:
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
注意:還有一件事,如果完成了總和,我再次想檢查或驗證該特定發票編號,產品ID和發票日期不應兩次輸入總和(我已經在示例中完成了驗證項目,但總和來說,驗證有效嗎?)。
這是完整的代碼(使用TextBox並將excel文件保留在D目錄中,最后將其寫在TextBox中-D:\\ SampleExcel.xlsx):
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**
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
因此,您可以遍歷此行以導入您的發票。
關於檢查已導入的數據:
支票的行為應與之前相同,您仍然可以跳過兩次導入相同的數據,只是對支票使用相同的查詢-因為我們按唯一的發票日期進行分組,所以整個分組也具有唯一性。
恕我直言,我相信,使用這種分組方式的唯一區別是,您還需要檢查Excel文件中的數量總和是否與導入表中已經存在的數量相同。 然后,您可以決定用新值更新數量總和,跳過導入或引發錯誤。
嘗試創建可獲取條件並計算結果的sql函數。 SQL函數是為不同類型的輸出提供動態結果的最佳方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.