ich muss Daten in Json erzeugen. Ich nutze dazu die ot4xb von Pablo Bottella. Aber nach anfänglichem Erfolg habe ich jetzt ein Problem. Ich muss 3 Ebenen erstellen. Die ersten Ebene sind Tourdaten (kommt nur einmal vor). Auf der zweiten Ebene sollen VK-Belege erscheinen (davon kann es mehrere geben). Und auf der dritten Ebene sollen pro VK-Belege die Belegpositionen erscheinen.
So soll das Ergebnis nachher aussehen:
Code: Alles auswählen
[
{
"OID": "{8BE0EE93-37xxE-4FA3-94F5-B50FFC2072}",
"CLIENT": "1273",
"TOURNAME": "Regensburg",
"TOURID": "8106",
"TOURNUMBER": 52,
"TOURDATE": "2015-12-15T00:00:00",
"TOURSTART": "2015-12-15T04:11:50",
"TOUREND": "2015-12-15T09:34:09",
"QUANTITY": 400,
"WEIGHT": 0,
"VOLUME": 2.2,
"VEHICLEID": "2840",
"DRIVERID": "101",
"CODRIVERID": "",
"itemList": [
{
"SEQUENCE": 100,
"STOPART": 1,
"DELIVERYID": 111,
"CUSTOMERIDNUM": 1462,
"NAME1": "Goldener Hirsch",
"NAME2": "Gasthaus",
"COUNTRY": "DE",
"POSTCODE": "93049",
"CITY": "Regensburg",
"STREET": "Großprüfening 21",
"QUANTITY": 400,
"WEIGHT": 0,
"VOLUME": 0,
"TIMEWINDOWFROM": "2015-12-15T02:00:00",
"TIMEWINDOWTO": "2015-12-15T17:00:00",
"INFO1": "",
"INFO2": "",
"INFO3": "",
"DELIVERYINFO1": "",
"DELIVERYINFO2": "An der Pforte melden, Unterschrift",
"DELIVERYINFO3": "2851261",
"EARNINGS": 15,
"DIRECTCOSTS": null,
"PROFIT": null,
"TELEPHONE": "06201-592413",
"MOBILE": null,
"RETOURCST": null,
"deliveryItemList": [
{
"OID": "{7496c802-5752-4945-89d4-b9f8c405ce07}",
"ARTICLENO": 4711,
"ARTICLENAME": "Kiste Artesia",
"UNITY": "Stück",
"QUANTITY": 300,
"WEIGHT": 0,
"PRICE": 15,
"INFO1": "MGBE leeren",
"INFO2": "VER00292|VERKAUF||"
},
{
"OID": "{7496c802-5752-4937-89d4-b9f8c405ce08}",
"ARTICLENO": 4712,
"ARTICLENAME": "Kiste Schlossbrau",
"UNITY": "STK",
"QUANTITY": 100,
"WEIGHT": 0,
"PRICE": 300,
"INFO1": "auf Palette",
"INFO2": "sonsiges"
}
]
},
{
"SEQUENCE": 101,
"STOPART": 1,
"DELIVERYID": 112,
"CUSTOMERIDNUM": 580,
"NAME1": "Gasthaus Röhrls ",
"NAME2": null,
"COUNTRY": "DE",
"POSTCODE": "93161 ",
"CITY": "Sinzing",
"STREET": "Regensburger Str. 3",
"QUANTITY": 1,
"WEIGHT": 0,
"VOLUME": 0,
"TIMEWINDOWFROM": "2015-12-15T02:00:00",
"TIMEWINDOWTO": "2015-12-15T17:00:00",
"INFO1": "",
"INFO2": "",
"INFO3": "",
"DELIVERYINFO1": "",
"DELIVERYINFO2": "Lieferschein fotografieren",
"DELIVERYINFO3": "2851261",
"EARNINGS": -137,
"DIRECTCOSTS": null,
"PROFIT": null,
"TELEPHONE": "06201-592413",
"MOBILE": null,
"RETOURCST": null,
"deliveryItemList": [
{
"OID": "{7496c802-5752-4937-89d4-b678ac405ce09}",
"ARTICLENO": 4717,
"ARTICLENAME": "Artesia Mond",
"UNITY": "STK",
"QUANTITY": 100,
"WEIGHT": 0,
"PRICE": -137.5,
"INFO1": "Einzelkasten",
"INFO2": "sonstige Kommentare"
}
]
}
]
}
]
Code: Alles auswählen
#include "common.ch"
#include "FileIO.CH"
#include "ot4xb.ch"
//----------------------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------------------
PROCEDURE main(cMaxPos)
LOCAL oJsonTour := NIL, oJsonAuf1 := NIL, oJsonPos1_1 := NIL, oJsonPos1_2 := NIL, oJsonAuf2 := NIL, oJsonPos2_1 := NIL
LOCAL lRecursion := NIL
LOCAL cOutputFile := "JsonMitPos1.txt"
LOCAL nHandle := 0
LOCAL cJson := ""
LOCAL aTour := {"{8BE0EE93-37xxE-4FA3-94F5-B50FFC2072}", "1273", "Regensburg", "8106", 52, "2015-12-15T00:00:00", "2015-12-15T04:11:50+0200", "2015-12-15T09:34:09+0200", 400, 0, 2.2, "2840", "101", " "}
LOCAL aAuf1 := {100, 1, 111, 1462, "Goldener Hirsch", "Gasthaus", "DE", "93049", "Regensburg", "Großprüfening 21", 400, 0, 0, "2015-12-15T02:00:00", "2015-12-15T17:00:00", " ", " ", " ", " ", "An der Pforte melden, Unterschrift", "2851261", 15, NIL, NIL, "06201-592413", NIL, NIL}
LOCAL aPos1 := {{"{7496c802-5752-4945-89d4-b9f8c405ce07}", 4711, "Kiste Artesia", "Stück", 300, 0, 15, "MGBE leeren", "VER00292|VERKAUF||"}, {"{7496c802-5752-4937-89d4-b9f8c405ce08}", 4712, "Kiste Schlossbrau", "STK", 100, 0, 300, "auf Palette", "sonstiges"}}
LOCAL aAuf2 := {101, 1, 112, 580, "Gasthaus Röhrls", NIL, "DE", "93161", "Sinzing", "Regensburger Str. 3", 1, 0, 0, "2015-12-15T02:00:00", "2015-12-15T17:00:00", " ", " ", " ", " ", "Lieferschein fotografieren", "2851261", -137, NIL, NIL, "06201-592413", NIL, NIL}
LOCAL aPos2 := {{"{7496c802-5752-4937-89d4-b678ac405ce09}", 4717, "Artesia Mond", "STK", 100, 0, -137.15, "Einzelkasten", "sonstige Kommentare"}}
DEFAULT cMaxPos TO "1"
IF ot4xb() < "001.006.000.018"
MSGBOX("ot4xb >= 001.006.000.018 required" )
QUIT
ENDIF
oJsonTour := JSON_Container():New()
oJsonTour:OID := aTour[01]
oJsonTour:CLIENT := aTour[02]
oJsonTour:TOURNAME := aTour[03]
oJsonTour:TOURID := aTour[04]
oJsonTour:TOURNUMBER := aTour[05]
oJsonTour:TOURDATE := aTour[06]
oJsonTour:TOURSTART := aTour[07]
oJsonTour:TOUREND := aTour[08]
oJsonTour:QUANTITY := aTour[09]
oJsonTour:WEIGHT := aTour[10]
oJsonTour:VOLUME := aTour[11]
oJsonTour:VEHICLEID := aTour[12]
oJsonTour:DRIVERID := aTour[13]
oJsonTour:CODRIVERID := aTour[14]
oJsonAuf1 := JSON_Container():New()
oJsonAuf1:MYSEQUENCE := aAuf1[01]
oJsonAuf1:STOPART := aAuf1[02]
oJsonAuf1:DELIVERYID := aAuf1[03]
oJsonAuf1:CUSTOMERIDNUM := aAuf1[04]
oJsonAuf1:NAME1 := aAuf1[05]
oJsonAuf1:NAME2 := aAuf1[06]
oJsonAuf1:COUNTRY := aAuf1[07]
oJsonAuf1:POSTCODE := aAuf1[08]
oJsonAuf1:CITY := aAuf1[09]
oJsonAuf1:STREET := aAuf1[10]
oJsonAuf1:QUANTITY := aAuf1[11]
oJsonAuf1:WEIGHT := aAuf1[12]
oJsonAuf1:VOLUME := aAuf1[13]
oJsonAuf1:TIMEWINDOWFROM := aAuf1[14]
oJsonAuf1:TIMEWINDOWTO := aAuf1[15]
oJsonAuf1:INFO1 := aAuf1[16]
oJsonAuf1:INFO2 := aAuf1[17]
oJsonAuf1:INFO3 := aAuf1[18]
oJsonAuf1:DELIVERYINFO1 := aAuf1[19]
oJsonAuf1:DELIVERYINFO2 := aAuf1[20]
oJsonAuf1:DELIVERYINFO3 := aAuf1[21]
oJsonAuf1:EARNINGS := aAuf1[22]
oJsonAuf1:DIRECTCOSTS := aAuf1[23]
oJsonAuf1:PROFIT := aAuf1[24]
oJsonAuf1:TELEPHONE := aAuf1[25]
oJsonAuf1:MOBILE := aAuf1[26]
oJsonAuf1:RETOURCST := aAuf1[27]
oJsonPos1_1 := JSON_Container():New()
oJsonPos1_1:OID := aPos1[01,01]
oJsonPos1_1:ARTICLENO := aPos1[01,02]
oJsonPos1_1:ARTICLENAME := aPos1[01,03]
oJsonPos1_1:UNITY := aPos1[01,04]
oJsonPos1_1:QUANTITY := aPos1[01,05]
oJsonPos1_1:WEIGHT := aPos1[01,06]
oJsonPos1_1:PRICE := aPos1[01,07]
oJsonPos1_1:INFO1 := aPos1[01,08]
oJsonPos1_1:INFO2 := aPos1[01,09]
oJsonPos1_2 := JSON_Container():New()
oJsonPos1_2:OID := aPos1[02,01]
oJsonPos1_2:ARTICLENO := aPos1[02,02]
oJsonPos1_2:ARTICLENAME := aPos1[02,03]
oJsonPos1_2:UNITY := aPos1[02,04]
oJsonPos1_2:QUANTITY := aPos1[02,05]
oJsonPos1_2:WEIGHT := aPos1[02,06]
oJsonPos1_2:PRICE := aPos1[02,07]
oJsonPos1_2:INFO1 := aPos1[02,08]
oJsonPos1_2:INFO2 := aPos1[02,09]
oJsonAuf1:deliveryItemList := {oJsonPos1_1, oJsonPos1_2}
oJsonTour:itemList := {oJsonAuf1}
IF VAL(cMaxPos) = 2
cOutputFile := "JsonMitPos2.txt"
oJsonAuf2 := JSON_Container():New()
oJsonAuf2:MYSEQUENCE := aAuf2[01]
oJsonAuf2:STOPART := aAuf2[02]
oJsonAuf2:DELIVERYID := aAuf2[03]
oJsonAuf2:CUSTOMERIDNUM := aAuf2[04]
oJsonAuf2:NAME1 := aAuf2[05]
oJsonAuf2:NAME2 := aAuf2[06]
oJsonAuf2:COUNTRY := aAuf2[07]
oJsonAuf2:POSTCODE := aAuf2[08]
oJsonAuf2:CITY := aAuf2[09]
oJsonAuf2:STREET := aAuf2[10]
oJsonAuf2:QUANTITY := aAuf2[11]
oJsonAuf2:WEIGHT := aAuf2[12]
oJsonAuf2:VOLUME := aAuf2[13]
oJsonAuf2:TIMEWINDOWFROM := aAuf2[14]
oJsonAuf2:TIMEWINDOWTO := aAuf2[15]
oJsonAuf2:INFO1 := aAuf2[16]
oJsonAuf2:INFO2 := aAuf2[17]
oJsonAuf2:INFO3 := aAuf2[18]
oJsonAuf2:DELIVERYINFO1 := aAuf2[19]
oJsonAuf2:DELIVERYINFO2 := aAuf2[20]
oJsonAuf2:DELIVERYINFO3 := aAuf2[21]
oJsonAuf2:EARNINGS := aAuf2[22]
oJsonAuf2:DIRECTCOSTS := aAuf2[23]
oJsonAuf2:PROFIT := aAuf2[24]
oJsonAuf2:TELEPHONE := aAuf2[25]
oJsonAuf2:MOBILE := aAuf2[26]
oJsonAuf2:RETOURCST := aAuf2[27]
oJsonPos2_1 := JSON_Container():New()
oJsonPos2_1:OID := aPos2[01,01]
oJsonPos2_1:ARTICLENO := aPos2[01,02]
oJsonPos2_1:ARTICLENAME := aPos2[01,03]
oJsonPos2_1:UNITY := aPos2[01,04]
oJsonPos2_1:QUANTITY := aPos2[01,05]
oJsonPos2_1:WEIGHT := aPos2[01,06]
oJsonPos2_1:PRICE := aPos2[01,07]
oJsonPos2_1:INFO1 := aPos2[01,08]
oJsonPos2_1:INFO2 := aPos2[01,09]
oJsonAuf2:deliveryItemList := {oJsonPos2_1}
oJsonTour:itemList := {oJsonAuf2}
ENDIF
cJson := json_serialize( oJsonTour , @lRecursion )
cJson := json_pretty_out( cJson ) // Formatiert die Zeichenkette
cJson := STRTRAN(cJson, "MYSEQUENCE", "SEQUENCE") // nachträglicher Austausch, weil SEQUENCE ein BEFEHL (Reserviert) ist
cJson := STRTRAN(cJson, '" "', '""') // nachträgliches kürzen von leeren String Informationen
cJson := "[" + cJson + CHR(13) + CHR(10) + "]" // setzt am Anfang und am Ende noch eine eckige Klammer
nHandle := FCREATE(cOutputFile, FC_NORMAL)
FWRITE(nHandle, cJson)
FCLOSE(nHandle)
RETURN
Aber wenn ich das Testprogramm mit dem Parameter 2 aufrufe, gelingt es mir nicht den zweiten Auftrag und die dazugehörende Position zusätzlich zu erzeugen. Bei meinem Code überschreibt der zweite Auftrag den ersten Auftrag.
Das hat auf jeden Fall etwas mit der Reihenfolge der Klasse JSON_Container():New() zu tun. Vielleicht hat ja einer von euch eine Idee.
Ergebnis mit Parameter 1
Code: Alles auswählen
[
{
"OID" : "{8BE0EE93-37xxE-4FA3-94F5-B50FFC2072}" ,
"CLIENT" : "1273" ,
"TOURNAME" : "Regensburg" ,
"TOURID" : "8106" ,
"TOURNUMBER" : 52 ,
"TOURDATE" : "2015-12-15T00:00:00" ,
"TOURSTART" : "2015-12-15T04:11:50+0200" ,
"TOUREND" : "2015-12-15T09:34:09+0200" ,
"QUANTITY" : 400 ,
"WEIGHT" : 0 ,
"VOLUME" : 2.200000 ,
"VEHICLEID" : "2840" ,
"DRIVERID" : "101" ,
"CODRIVERID" : "" ,
"itemList" :
[
{
"SEQUENCE" : 100 ,
"STOPART" : 1 ,
"DELIVERYID" : 111 ,
"CUSTOMERIDNUM" : 1462 ,
"NAME1" : "Goldener Hirsch" ,
"NAME2" : "Gasthaus" ,
"COUNTRY" : "DE" ,
"POSTCODE" : "93049" ,
"CITY" : "Regensburg" ,
"STREET" : "Großprüfening 21" ,
"QUANTITY" : 400 ,
"WEIGHT" : 0 ,
"VOLUME" : 0 ,
"TIMEWINDOWFROM" : "2015-12-15T02:00:00" ,
"TIMEWINDOWTO" : "2015-12-15T17:00:00" ,
"INFO1" : "" ,
"INFO2" : "" ,
"INFO3" : "" ,
"DELIVERYINFO1" : "" ,
"DELIVERYINFO2" : "An der Pforte melden, Unterschrift" ,
"DELIVERYINFO3" : "2851261" ,
"EARNINGS" : 15 ,
"DIRECTCOSTS" : null ,
"PROFIT" : null ,
"TELEPHONE" : "06201-592413" ,
"MOBILE" : null ,
"RETOURCST" : null ,
"deliveryItemList" :
[
{
"OID" : "{7496c802-5752-4945-89d4-b9f8c405ce07}" ,
"ARTICLENO" : 4711 ,
"ARTICLENAME" : "Kiste Artesia" ,
"UNITY" : "Stück" ,
"QUANTITY" : 300 ,
"WEIGHT" : 0 ,
"PRICE" : 15 ,
"INFO1" : "MGBE leeren" ,
"INFO2" : "VER00292|VERKAUF||"
} ,
{
"OID" : "{7496c802-5752-4937-89d4-b9f8c405ce08}" ,
"ARTICLENO" : 4712 ,
"ARTICLENAME" : "Kiste Schlossbrau" ,
"UNITY" : "STK" ,
"QUANTITY" : 100 ,
"WEIGHT" : 0 ,
"PRICE" : 300 ,
"INFO1" : "auf Palette" ,
"INFO2" : "sonstiges"
}
]
}
]
}
]
Code: Alles auswählen
[
{
"OID" : "{8BE0EE93-37xxE-4FA3-94F5-B50FFC2072}" ,
"CLIENT" : "1273" ,
"TOURNAME" : "Regensburg" ,
"TOURID" : "8106" ,
"TOURNUMBER" : 52 ,
"TOURDATE" : "2015-12-15T00:00:00" ,
"TOURSTART" : "2015-12-15T04:11:50+0200" ,
"TOUREND" : "2015-12-15T09:34:09+0200" ,
"QUANTITY" : 400 ,
"WEIGHT" : 0 ,
"VOLUME" : 2.200000 ,
"VEHICLEID" : "2840" ,
"DRIVERID" : "101" ,
"CODRIVERID" : "" ,
"itemList" :
[
{
"SEQUENCE" : 101 ,
"STOPART" : 1 ,
"DELIVERYID" : 112 ,
"CUSTOMERIDNUM" : 580 ,
"NAME1" : "Gasthaus Röhrls" ,
"NAME2" : null ,
"COUNTRY" : "DE" ,
"POSTCODE" : "93161" ,
"CITY" : "Sinzing" ,
"STREET" : "Regensburger Str. 3" ,
"QUANTITY" : 1 ,
"WEIGHT" : 0 ,
"VOLUME" : 0 ,
"TIMEWINDOWFROM" : "2015-12-15T02:00:00" ,
"TIMEWINDOWTO" : "2015-12-15T17:00:00" ,
"INFO1" : "" ,
"INFO2" : "" ,
"INFO3" : "" ,
"DELIVERYINFO1" : "" ,
"DELIVERYINFO2" : "Lieferschein fotografieren" ,
"DELIVERYINFO3" : "2851261" ,
"EARNINGS" : -137.000000 ,
"DIRECTCOSTS" : null ,
"PROFIT" : null ,
"TELEPHONE" : "06201-592413" ,
"MOBILE" : null ,
"RETOURCST" : null ,
"deliveryItemList" :
[
{
"OID" : "{7496c802-5752-4937-89d4-b678ac405ce09}" ,
"ARTICLENO" : 4717 ,
"ARTICLENAME" : "Artesia Mond" ,
"UNITY" : "STK" ,
"QUANTITY" : 100 ,
"WEIGHT" : 0 ,
"PRICE" : -137.150000 ,
"INFO1" : "Einzelkasten" ,
"INFO2" : "sonstige Kommentare"
}
]
}
]
}
]