Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Json mit ot4xb [erledigt]

Moderator: Moderatoren

Antworten
Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 637
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 53902 Bad Münstereifel
Kontaktdaten:

Json mit ot4xb [erledigt]

Beitrag von Bertram Hansen » Mi, 19. Jul 2017 10:45

Hallo zusammen,

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"
          }
        ]
      }
    ]
  }
]
Dazu habe ich das folgende Testprogramm geschrieben:

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
Wenn ich nun das Testprogramm mit dem Parameter 1 aufrufe, wird die Tour, der 1.Auftrag und zu dem ersten Auftrag die beiden Positionen erzeugt.
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. :banghead:

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"
            }
         ]
      }
   ]
}
]
Ergebnis mit Parameter 2:

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"
            }
         ]
      }
   ]
}
]
Zuletzt geändert von Bertram Hansen am Fr, 21. Jul 2017 13:56, insgesamt 1-mal geändert.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 637
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 53902 Bad Münstereifel
Kontaktdaten:

Re: Json mit ot4xb

Beitrag von Bertram Hansen » Do, 20. Jul 2017 15:11

Ich habe mich jetzt zusätzlich direkt an Pablo gewendet.
Vielleicht kann er mir helfen.
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Benutzeravatar
Bertram Hansen
1000 working lines a day
1000 working lines a day
Beiträge: 637
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 53902 Bad Münstereifel
Kontaktdaten:

Re: Json mit ot4xb

Beitrag von Bertram Hansen » Fr, 21. Jul 2017 9:24

Ich habe mittlerweile von Andreas Gehrs-Pahl die Lösung im Forum von http://www.xbwin.com/forum.html erhalten. :blob8:
Hätte ich eigentlich auch selber heraus bekommen können, aber die Bäume und der Wald...... man wird halt alt. #-o
:wave:
Gruß Bertram
http://www.tobax.de

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!

Antworten