spaLOGICng
Member
- Local time
- Today, 14:00
- Joined
- Jul 27, 2012
- Messages
- 163
Avoid using DLookups.Well after investigating the entire VBA code I discovered that the part which is slowing the processing is only the lookup which taking too much time to read the above code
Here is the DLookup
Code:Private Sub CmdCwrite_Click() On Error GoTo Err_Handler Dim Cancel As Integer If IsNull(Me.txtEsDFinInvoice) Then Beep MsgBox "Please select the invoice to sign on", vbOKOnly, "Data is required here" Cancel = True Exit Sub End If Dim db As DAO.Database Dim rs As DAO.Recordset Dim fld As DAO.Field Dim qdf As DAO.QueryDef Dim prm As DAO.Parameter Dim root As Dictionary Dim transaction As Dictionary Dim transactions As Collection Dim item As Dictionary Dim items As Collection Dim Tax As Collection Dim i As Long Dim j As Long Dim t As Long Dim itemCount As Long Dim taxCount As Long Dim strTaxes As Boolean Dim invoiceCount As Long Dim json As Object Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4 Dim lngStatus As Long Dim strError As String Dim strData As String Dim Details As Variant Dim n As Integer Dim s As String Dim Z As Long Set root = New Dictionary Set transactions = New Collection Set db = CurrentDb Set qdf = db.QueryDefs("QryJson") For Each prm In qdf.Parameters prm = Eval(prm.Name) Next prm Set rs = qdf.OpenRecordset(dbOpenSnapshot, dbSeeChanges) Set qdf = Nothing rs.MoveFirst Do While Not rs.EOF Set transaction = New Dictionary transaction.Add "PosVendor", "Nector Prime Accounting Solutions" transaction.Add "PosSoftVersion", "2.0.0.1" transaction.Add "PosModel", "Cap-2017" transaction.Add "PosSerialNumber", DLookup("PosSerialNumber", "tblEFDs", "ID = 1") transaction.Add "IssueTime", DateAdd("n", 120, Now()) transaction.Add "TransactionType", DLookup("ReceiptType", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "PaymentMode", 3 transaction.Add "SaleType", 1 transaction.Add "LocalPurchaseOrder", DLookup("LocalPurchaseOrder", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "Cashier", DLookup("Cashier", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "BuyerTPIN", DLookup("BuyerTPIN", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "BuyerName", DLookup("BuyerName", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "BuyerTaxAccountName", DLookup("BuyerTaxAccountName", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "BuyerAddress", DLookup("BuyerAddress", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "BuyerTel", DLookup("BuyerTel", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "OriginalInvoiceCode", DLookup("OrignalInvoiceCode", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "OriginalInvoiceNumber", DLookup("OrignalInvoiceNumber", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "Memo", DLookup("TheNotes", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "Currency-Type", DLookup("MoneyType", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) transaction.Add "Conversion-Rate", DLookup("FCrate", "tblCustomerInvoice", "[InvoiceID]= " & Me.CboEsdInvoices) '--- loop over all the items itemCount = Me.txtinternalaudit Set items = New Collection For i = 1 To itemCount Set item = New Dictionary item.Add "ItemId", i item.Add "Description", DLookup("ProductName", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) item.Add "BarCode", DLookup("BarCode", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) item.Add "Quantity", DLookup("Quantity", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) item.Add "UnitPrice", DLookup("UnitPrice", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) item.Add "Discount", 0 '--- loop over all the taxes taxCount = 1 Set Tax = New Collection strTaxes = DLookup("CGControl", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) '--- loop over all the invoices invoiceCount = 1 For j = 1 To invoiceCount For t = 1 To taxCount Next t item.Add "TaxLabels", Tax Tax.Add DLookup("TaxClassA", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) If Len(Trim(Nz(DLookup("TourismClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), ""))) > 0 Then Tax.Add Nz(DLookup("TourismClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), "") End If If Len(Trim(Nz(DLookup("InsuranceClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), ""))) > 0 Then Tax.Add Nz(DLookup("InsuranceClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), "") End If If Len(Trim(Nz(DLookup("ExciseClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), ""))) > 0 Then Tax.Add Nz(DLookup("ExciseClass", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)), "") End If item.Add "TotalAmount", DLookup("TotalAmount", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) item.Add "IsTaxInclusive", strTaxes item.Add "RRP", DLookup("RRP", "QryJson", "InvoiceID =" & Me.CboEsdInvoices & " AND ItemesID =" & CStr(i)) Next j items.Add item Next i transaction.Add "Items", items rs.MoveNext Loop root.Add "", transaction On Error Resume Next intPortID = Forms!frmLogin!txtFinComPort.value Call CommFlush(intPortID) If lngStatus <> 0 Then Application.Quit ElseIf lngStatus = 0 Then End If ' Write data to serial port. ' Build data packet to transmit (passing command code, and data to package) strData = BuildData(JsonConverter.ConvertToJson(transaction, Whitespace:=3)) 'Here the chief auditor down confirmed the slowness above n = FreeFile() Open "C:\Users\chris.hankwembo\Desktop\Testing\test.txt" For Output As #n Print #n, strData Close #n MsgBox "strData:" & vbCrLf & ShowHex(strData) ' Send the data packet and check for error lngStatus = CommWrite(intPortID, strData) If lngStatus <> Len(strData) Then Beep MsgBox "There is no data to write", vbOKOnly, "Data is required here" Application.Quit ' Handle error. lngStatus = CommGetError(strError) MsgBox "COM Error: " & strError End If rs.Close Set rs = Nothing Set db = Nothing Set json = Nothing Set transaction = Nothing Set transactions = Nothing Set item = Nothing Set items = Nothing Set Tax = Nothing Set fld = Nothing Set root = Nothing Set qdf = Nothing Set prm = Nothing Set Details = Nothing Exit Sub Exit_CmdCwrite_Click: Exit Sub Err_Handler: MsgBox Err.Number & Err.Description, vbExclamation, "Error" Resume Exit_CmdCwrite_Click End Sub
The above is reading the data from the code below:
Code:SELECT tblCustomerInvoice.InvoiceID, tblLineDetails.ItemesID, tblProducts.ProductName, tblProducts.ProductID, tblLineDetails.Quantity, tblLineDetails.UnitPrice, tblLineDetails.Discount, tblLineDetails.IsTaxInclusive, tblLineDetails.RRP, tblLineDetails.VAT, ((([Quantity]*[UnitPrice]))) AS TotalAmount, tblLineDetails.TaxClassA, tblLineDetails.TourismClass, tblLineDetails.ExciseClass, tblLineDetails.InsuranceClass, IIf([IsTaxInclusive]<0,"True","False") AS CGControl, tblProducts.BarCode, tblLineDetails.ESDPrice, tblCustomerInvoice.FCRate, tblLineDetails.Duty FROM tblCustomerInvoice INNER JOIN (tblProducts INNER JOIN tblLineDetails ON tblProducts.ProductID = tblLineDetails.ProductID) ON tblCustomerInvoice.InvoiceID = tblLineDetails.InvoiceID WHERE (((tblCustomerInvoice.InvoiceID)=[Forms]![frmCustomerInvoice]![CboEsdInvoices]));
The problem here is how to do away with DLookup
I am also not sure why you are making this more complicated than it needs to be. You do not need JSON to insert Records into a Cloud MS SQL Server DB.
Make sure your DB has a Link to the Table that you are wanting to Insert into, then just use an Action Query that is filtered to the specific record and INSERT. You could literally use 1/8th of the amount of code to accomplish the same thing and eliminate the need for the DLookups at the same time.