Solved Challenges with Json against VBA (1 Viewer)

nector

Member
Local time
Today, 10:34
Joined
Jan 21, 2020
Messages
368
Using the instruction I got here a few days ago I followed the instructions but I keep on getting the following:

(1) Line product is being repeated twice which is not correct


(2) If you check carefully, you will find that Dictionary number 2 has no name and is empty, how can name it to hold customer details information and insert customer details it


Code:
{
   "PosVendor": "Nector Prime Accounting Solutions",
   "PosSoftVersion": "2.0.0.1",
   "PosModel": "Cap-2017",
   "PosSerialNumber": "18000032693",
   "IssueTime": "20231218123609",
   "TransactionType": 0,
   "PaymentMode": 3,
   "SaleType": 1,
   "TaxLabels": "B",
   "LocalPurchaseOrder": null,
   "Cashier": "Admin Manager",
   "OriginalInvoiceCode": null,
   "OriginalInvoiceNumber": null,
   "Memo": null,
   "Currency-Type": "ZMW",
   "Conversion-Rate": 1,
   "Receipts": {
   },
   "itemlist": [
      {
         "ItemId": 1,
         "Description": "MIRINDA FRUITY CAN 330 ML 24",
         "BarCode": "001",
         "Quantity": 1,
         "UnitPrice": 63,
         "Discount": 0,
         "TotalAmount": 63
      }
   ],
   "ItemList": [
      {
         "ItemId": 1,
         "Description": "MIRINDA FRUITY CAN 330 ML 24",
         "BarCode": "001",
         "Quantity": 1,
         "UnitPrice": 63,
         "Discount": 0,
         "TotalAmount": 63
      }
   ]
}




Public Sub CmdCwrite_Click()
    Dim Cancel As Integer
    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 ItemId As Long
    Dim Data As Dictionary
    Dim transaction As Dictionary
    Dim InvoiceData As Collection
    Dim item As Dictionary
    Dim i As Long
    Dim n As Integer
    Dim strdata As String
    Dim itemCount As Long
    Set Data = New Dictionary
    Set InvoiceData = 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", "18000032693"
        transaction.Add "IssueTime", DateAdd("n", 120, Now())
        transaction.Add "TransactionType", rs!ReceiptType.value
        transaction.Add "PaymentMode", rs!PaymentMode.value
        transaction.Add "SaleType", rs!SalesType.value
        transaction.Add "TaxLabels", rs!TaxClassA.value
        transaction.Add "LocalPurchaseOrder", rs!LocalPurchaseOrder.value
        transaction.Add "Cashier", rs!Cashier.value
        transaction.Add "OriginalInvoiceCode", rs!OrignalInvoiceCode.value
        transaction.Add "OriginalInvoiceNumber", rs!OrignalInvoiceNumber.value
        transaction.Add "Memo", rs!TheNotes.value
        transaction.Add "Currency-Type", rs!Moneytype.value
        transaction.Add "Conversion-Rate", rs!FCRate.value
        transaction.Add "Receipts", Data
        transaction.Add "itemlist", InvoiceData
        
        '--- loop over all the items
        itemCount = Me.txtinternalaudit
        For i = 1 To itemCount
            Set item = New Dictionary
            InvoiceData.Add item
            item.Add "ItemId", i
            item.Add "Description", rs!ProductName.value
            item.Add "BarCode", rs!BarCode.value
            item.Add "Quantity", rs!Quantity.value
            item.Add "UnitPrice", rs!UnitPrice.value
            item.Add "Discount", 0
            item.Add "TotalAmount", rs!TotalAmount.value
    
                        
        Next i
    
transaction.Add "ItemList", InvoiceData

rs.MoveNext

strdata = JsonConverter.ConvertToJson(transaction, Whitespace:=3)

Loop

n = FreeFile()
Open "C:\Users\chris.hankwembo\Desktop\Testing\test.txt" For Output As #n
Print #n, strdata
Close #n
rs.Close

   Set rs = Nothing
    Set db = Nothing
    Set transaction = Nothing
    Set InvoiceData = Nothing
    Set item = Nothing
    Set fld = Nothing
    Set Data = Nothing
    Set qdf = Nothing
    Set prm = Nothing
    
Exit Sub
End Sub
 

theDBguy

I’m here to help
Staff member
Local time
Today, 00:34
Joined
Oct 29, 2018
Messages
21,473
Did you forget to attach a file?
 

nector

Member
Local time
Today, 10:34
Joined
Jan 21, 2020
Messages
368
Thank you the DBguy

After working tirelessly, I have finally gotten it right I'm now knocking below is the new VBA code:

Code:
Option Compare Database
Option Explicit
Private Sub CmdSales_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Company As New Dictionary
Dim strData As String
Dim n As Long
Dim Json As Object
Dim data As New Dictionary
Dim transactions As Collection
Dim itemCount As Long
Dim i As Long
Dim item As New Dictionary
Dim items As New Collection
Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef
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 data = New Dictionary
Set transactions = New Collection
Set Company = New Dictionary
        Company.Add "Tpin", "1002623668"
        Company.Add "bhfld", "00"
        Company.Add "InvoiceNo", 15
        Company.Add "receipt", data
        data.Add "CustomerTpin", "1001102603"
        data.Add "CustomerMblNo", Null
        Company.Add "itemList", transactions
             
    '--- loop over all the items
        itemCount = Me.txtProductcount
       
        For i = 1 To itemCount
            Set item = New Dictionary
            transactions.Add item
            item.Add "ItemId", i
            item.Add "Description", DLookup("Description", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
            item.Add "Qty", DLookup("Qty", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
            item.Add "UnitPrice", DLookup("UnitPrice", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
       
    Next i
strData = JsonConverter.ConvertToJson(Company, Whitespace:=3)
rs.MoveNext
Loop
n = FreeFile()
Open "C:\Users\chris.hankwembo\Desktop\Testing\test.txt" For Output As #n
Print #n, strData
Close #n
Set qdf = Nothing
Set prm = Nothing
End Sub


The final correct result is below:


Code:
{
   "Tpin": "1002623668",
   "bhfld": "00",
   "InvoiceNo": 15,
   "receipt": {
      "CustomerTpin": "1001102603",
      "CustomerMblNo": null
   },
   "itemList": [
      {
         "ItemId": 1,
         "Description": "Apple( 350 ML)",
         "Qty": 215,
         "UnitPrice": 41
      },
      {
         "ItemId": 2,
         "Description": "Orange (350 ML)",
         "Qty": 330,
         "UnitPrice": 41
      },
      {
         "ItemId": 3,
         "Description": "Lemonade (350 ML)",
         "Qty": 421,
         "UnitPrice": 41
      }
   ]
}
 

Minty

AWF VIP
Local time
Today, 08:34
Joined
Jul 26, 2013
Messages
10,371
I hate to break it you, but you've managed to open a recordset and loop through it again without ever using it....
Have you ever put a break point into your code, and then pressed F8 and walked through it?

Please show me in the code above where you are pulling anything from your recordset.

If you don't believe me try running the code below:

Code:
Private Sub CmdSales_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim Company As New Dictionary
    Dim strData As String
    Dim n As Long
    Dim Json As Object
    Dim data As New Dictionary
    Dim transactions As Collection
    Dim itemCount As Long
    Dim i As Long
    Dim item As New Dictionary
    Dim items As New Collection
    Dim prm As DAO.Parameter
    Dim qdf As DAO.QueryDef
    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 data = New Dictionary
        Set transactions = New Collection
        Set Company = New Dictionary
        Company.Add "Tpin", "1002623668"
        Company.Add "bhfld", "00"
        Company.Add "InvoiceNo", 15
        Company.Add "receipt", data
        data.Add "CustomerTpin", "1001102603"
        data.Add "CustomerMblNo", Null
        Company.Add "itemList", transactions
            
        '--- loop over all the items
        itemCount = Me.txtProductcount
      
        For i = 1 To itemCount
            Set item = New Dictionary
            transactions.Add item
            item.Add "ItemId", i
            item.Add "Description", DLookup("Description", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
            item.Add "Qty", DLookup("Qty", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
            item.Add "UnitPrice", DLookup("UnitPrice", "QryJson", "[INV] =" & Me.CboInv & " And ItemID = " & i)
      
        Next i
        strData = JsonConverter.ConvertToJson(Company, Whitespace:=3)
 '      rs.MoveNext
 '   Loop
    n = FreeFile()
    Open "C:\Users\chris.hankwembo\Desktop\Testing\test.txt" For Output As #n
    Print #n, strData
    Close #n
    Set qdf = Nothing
    Set prm = Nothing
End Sub
 

nector

Member
Local time
Today, 10:34
Joined
Jan 21, 2020
Messages
368
hate to break it you, but you've managed to open a recordset and loop through it again without ever using it....
Have you ever put a break point into your code, and then pressed F8 and walked through it?

For you to understand that the record set is used here just remove the code below and see if you get anywhere!

Code:
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
Rs.Movenext

Or simply delete entire the record set and what happens sir
 

Minty

AWF VIP
Local time
Today, 08:34
Joined
Jul 26, 2013
Messages
10,371
I'm sorry your reply makes no sense to me?
 

isladogs

MVP / VIP
Local time
Today, 08:34
Joined
Jan 14, 2017
Messages
18,221
Thank you the DBguy

After working tirelessly, I have finally gotten it right
The final correct result is below:

Code:
{
   "Tpin": "1002623668",
   "bhfld": "00",
   "InvoiceNo": 15,
   "receipt": {
      "CustomerTpin": "1001102603",
      "CustomerMblNo": null
   },
   "itemList": [
      {
         "ItemId": 1,
         "Description": "Apple( 350 ML)",
         "Qty": 215,
         "UnitPrice": 41
      },
      {
         "ItemId": 2,
         "Description": "Orange (350 ML)",
         "Qty": 330,
         "UnitPrice": 41
      },
      {
         "ItemId": 3,
         "Description": "Lemonade (350 ML)",
         "Qty": 421,
         "UnitPrice": 41
      }
   ]
}

I also hate to break it to you but I provided that exact output and the code to achieve it in a post to your earlier thread last Friday:

Looks like you didn't see my post!
 

nector

Member
Local time
Today, 10:34
Joined
Jan 21, 2020
Messages
368
High Minty

I understand what you are saying and what you wanted to see, but like I stated earlier the looping was quite difficult, and so I was doing it step by step. I can directly see what is in your picture right now, see the cold below except that I have not yet delt with DSum yet , but it will also be done in a moment:

Code:
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim Company As New Dictionary
Dim strData As String
Dim n As Long
Dim Json As Object
Dim data As New Dictionary
Dim transactions As Collection
Dim itemCount As Long
Dim i As Long
Dim item As New Dictionary
Dim items As New Collection
Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef
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 data = New Dictionary
Set transactions = New Collection
Set Company = New Dictionary
        Company.Add "Tpin", "1002623668"
        Company.Add "bhfld", "00"
        Company.Add "Total Count", Me.txtinternalaudit
        Company.Add "InvoiceNo", rs!InvoiceID.value
        Company.Add "Exchange Rate", rs!FCRate.value
        Company.Add "Tota Class B", DSum("TotalAmount", "QryJson", "[InvoiceID] =" & Me.CboEsdInvoices & "And [TaxClassA] = 'B'")
        Company.Add "Tota Class A", DSum("TotalAmount", "QryJson", "[InvoiceID] =" & Me.CboEsdInvoices & "And [TaxClassA] = 'A'")
        Company.Add "Tota Class D", DSum("TotalAmount", "QryJson", "[InvoiceID] =" & Me.CboEsdInvoices & "And [TaxClassA] = 'D'")
        Company.Add "Tota Class C1", DSum("TotalAmount", "QryJson", "[InvoiceID] =" & Me.CboEsdInvoices & "And [TaxClassA] = 'C1'")
        Company.Add "Tota Class C", DSum("TotalAmount", "QryJson", "[InvoiceID] =" & Me.CboEsdInvoices & "And [TaxClassA] = 'C'")
        Company.Add "receipt", data
        data.Add "Customer Name", rs!Company.value
        data.Add "Customer Tpin", rs!TPIN.value
        data.Add "Customer Phone Number", rs!Phone.value
        data.Add "Customer Email", rs!EMail.value
        data.Add "Customer Address", rs!Address.value
        data.Add "Customer Town", rs!Town.value
        data.Add "Customer Country", rs!Country.value
        Company.Add "itemList", transactions
           
    '--- loop over all the items
        itemCount = Me.txtinternalaudit
     
        For i = 1 To itemCount
            Set item = New Dictionary
            transactions.Add item
            item.Add "ItemId", i
            item.Add "Description", rs!ProductName.value
            item.Add "Qty", rs!Quantity.value
            item.Add "UnitPrice", rs!UnitPrice.value
            item.Add "Discount", rs!Discount.value
            item.Add "Tax Class", rs!TaxClassA.value
            item.Add "Total Amount", rs!TotalAmount.value

strData = JsonConverter.ConvertToJson(Company, Whitespace:=3)
rs.MoveNext
Next
Loop
n = FreeFile()
Open "C:\Users\chris.hankwembo\Desktop\Testing\test.txt" For Output As #n
Print #n, strData
Close #n
Set qdf = Nothing
Set prm = Nothing

Final & Correct results


Code:
{
   "Tpin": "1002623668",
   "bhfld": "00",
   "Total Count": 12,
   "InvoiceNo": 6,
   "Exchange Rate": 1,
   "Tota Class B": 2377.35,
   "Tota Class A": 541.82,
   "Tota Class D": 696,
   "Tota Class C1": null,
   "Tota Class C": null,
   "receipt": {
      "Customer Name": "MWIINDE",
      "Customer Tpin": "1008763003",
      "Customer Phone Number": null,
      "Customer Email": null,
      "Customer Address": null,
      "Customer Town": "LUSAKA",
      "Customer Country": "ZAMBIA"
   },
   "itemList": [
      {
         "ItemId": 1,
         "Description": "PARCKAGED WATER",
         "Qty": 5,
         "UnitPrice": 100,
         "Discount": 0,
         "Tax Class": "D",
         "Total Amount": 500
      },
      {
         "ItemId": 2,
         "Description": "MEAL MILL",
         "Qty": 2,
         "UnitPrice": 98,
         "Discount": 0,
         "Tax Class": "D",
         "Total Amount": 196
      },
      {
         "ItemId": 3,
         "Description": "RICE 5 KGS",
         "Qty": 4,
         "UnitPrice": 125.33,
         "Discount": 0,
         "Tax Class": "A",
         "Total Amount": 501.32
      },
      {
         "ItemId": 4,
         "Description": "LOAF OF BREAD",
         "Qty": 3,
         "UnitPrice": 13.5,
         "Discount": 0,
         "Tax Class": "A",
         "Total Amount": 40.5
      },
      {
         "ItemId": 5,
         "Description": "MILK PET 1000 ML 9",
         "Qty": 5,
         "UnitPrice": 167.86,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 839.3
      },
      {
         "ItemId": 6,
         "Description": "PEPSI MAX PET 500 ML 16",
         "Qty": 5,
         "UnitPrice": 79.21,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 396.05
      },
      {
         "ItemId": 7,
         "Description": "MIRINDA FRUITY PET 600 ML 12",
         "Qty": 1,
         "UnitPrice": 83,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 83
      },
      {
         "ItemId": 8,
         "Description": "MIRINDA ORANGE PET 600 ML 12",
         "Qty": 2,
         "UnitPrice": 65,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 130
      },
      {
         "ItemId": 9,
         "Description": "PEPSI PET 600 ML 12",
         "Qty": 3,
         "UnitPrice": 75,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 225
      },
      {
         "ItemId": 10,
         "Description": "7UP FREE PET 330ML 24",
         "Qty": 2,
         "UnitPrice": 66,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 132
      },
      {
         "ItemId": 11,
         "Description": "MIRINDA ORANGE FREE PET 330 ML 24",
         "Qty": 1,
         "UnitPrice": 68,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 68
      },
      {
         "ItemId": 12,
         "Description": "MIRINDA FRUITY CAN 330 ML 24",
         "Qty": 8,
         "UnitPrice": 63,
         "Discount": 0,
         "Tax Class": "B",
         "Total Amount": 504
      }
   ]
}
 
Last edited:

Users who are viewing this thread

Top Bottom