0

Rechnung in XML Format

Hallo

Ich bin dabei eine komplette Rechnung in XML Fromat dar zu stellen und habe ein problem bei den Rechnung positionen. Hier sollte eine Schleife durchlaufen und alle benötigten informationen wie Artikelnamme, Preis, Menge usw auslesen und in der XML Datei ein zu tragen. Anbei ein Muster wie das etwa aussehen sollte.

Rechnungpositionen ist eine untertabelle von der Rechnungen Tabelle

Würde mich über Eure Unterstützung sehr freuen

Gruß Richard

'XML Lieferant / Empfaenger' := formatXML([{
            Empfaenger: {
                stadt : 'Dane Klienta'.'Miejscowość',
                strasse: 'Dane Klienta'.Ulica,
                firmenname: 'Dane Klienta'.'Nazwa pełna',
                plz: 'Dane Klienta'.'Kod pocztowy',
                land: 'Dane Klienta'.Kraj,
                stid: 'Dane Klienta'.NIP
            },
            Lieferant: {
                stadt2: ".....",
                strasse2: ".....",
                land2: "Polska",
                firmenname2: ".....",
                plz2: "......",
                stid2: "......."
            },
            for p in 'Rechnungspositionen' do

            ????????????????????????


            end
            }
        }])

21 Antworten

null
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wie soll das Ergebnis der Schleife (JSON-Objekt) aussehen? Bspw. für 3 Rechnungspositionen.

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe

    Das sollte etwa so aussehen:

    <Invoice-Lines>
        <Line>
        <Line-Item>
        <LineNumber>1</LineNumber>
        <OrderLineNumber>123</OrderLineNumber>
        <EAN>1111111111111</EAN>
        <BuyerItemCode>BuyerItemCode_1</BuyerItemCode>
        <SupplierItemCode>SupplierItemCode_1</SupplierItemCode>
        <ManufacturerItemCode>122</ManufacturerItemCode>
        <SerialNumber>GINBN</SerialNumber>
        <CustomsCode>CustomsCode</CustomsCode>
        <ItemDescription>ItemDescrip
        </Line>
    </Invoice-Lines>
    
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das ist das XML.
    Wie soll das JSON-Objekt aussehen, das aus der Schleife entstehen soll?

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe

    Etwa so:

    [
      {
        "position_1": {
          "menge": "artikelmenge",
          "name": "artikelname",
          "preis": "artikelpreis"
        },
        "position_2": {
          "menge": "artikelmenge",
          "name": "artikelname",
          "preis": "artikelpreis"
        }
      }
    ]
    
    usw.
    
    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo

    Kann niemand hier helfen?

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Du möchtest ein variables JSON-Objekt mit der Anzahl X Key's erstellen, welche auch noch JSON-Objekte als Value enthalten.
    Ein JSON Objekt zu erstellen, dessen Anzahl an Key's variabel erstellt wird kann man mit Ninox Bordmitteln und einigen Zwischenschritten schon schaffen.
    Es wird in diesem Fall daran scheitern, daß die Values der Key's wiederum JSON-Objekte sind.
    Wenn die Value's nur einfacher Text wären ist es mit Ninox Bordmitteln machbar.
    Ich habe sowas schon mal gebaut, indem ich aus Ninox-Daten ein csv erstellt habe, bei dem die erste Zeile die Key's und die zweite Zeile die Value's beinhaltete. Aus der csv konnte ich ein funktionierendes JSON-Objekt erstellen.

    Momentan fällt mir keine Möglichkeit ein, wie man dieses spezielle Objekt nur mit Ninox-Bordmitteln erstellt.
    Eine Möglichkeit, die man ausprobieren könnte, wäre diese Art Array mit die REST-Api über n8n zu erstellen.

    • ⭐ Ninox Partnerin - Kennes Digital
    • Stefanie_K
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hast du es schon so probiert?

    Positionen: for i in 'Rechnungspositionen' do
        {
            Position: i.Position,
            Artikelname: i.Artikelname,
            Preis: {
                Waehrung: "EUR",
                Netto: i.Nettopreis,
                Brutto: i.Bruttopreis,
                MwSt: i.MwSt
                }
            Menge: i.Menge
        }
    

     

    Ich mache es ähnlich wie du zur Erstellung einer SEPA. Zuerst lasse ich die Daten mit JSON übermitteln und daraus dann eine XML erzeugen. Auch für die Übertragung von Rechnungspositionen zu LexOffice klappt es wie oben angegeben.

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Es fehlt noch ein Komma hinter der } und vor "Menge"

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Stefanie Kennes Hallo Stefanie:
      Laut Ryszard Anforderung sollen die Schlüsselnamen (KeyNames) des JSON Objekt variabel erstellt werden und lauten unterschiedlich. Aus der Untertabelle soll die entsprechende Anzahl von Records in einem JSON-Objekt erstellt werden, bei dem immer ein anderer Schlüsselname verwendet wird und der entsprechende Record der Untertabelle als JSON-Objekt dieses Schlüssels als Wert zugeordnet ist.

      Schlüsselnamen bei 2 Records 'Position1','Position2'
      Wenn ein dritter Record vorhanden ist kommt noch 'Position3' dazu usw.

      Das kann mit deinem Script und auch mit normalen Ninox-Bordmitteln leider nicht erzeugt werden. Man kann die JSON-Schlüsselnamen nicht als Variable deklarieren.

      Bsp:
      let vKeyName := "Position1",
      {vKeyName : {"Menge".10, "Name":"Test"}

      ergibt:

      {vKeyName : {"Menge".10, "Name":"Test"}

      und nicht:

      {Position1 : {"Menge".10, "Name":"Test"}

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Man könnte die Durchnummerierung der Rechnungspositionen doch direkt in Ninox in ein Zahlenfeld hinterlegen. Immer wenn einer RG eine neue Position hinzugefügt wird, wird das Feld "Rechnungsposition" automatisch mit der nächsthöheren Zahl befüllt. So mache ich es zumindest.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Stefanie Kennes Das ist leider nicht die Anforderung von Ryszard. Deshalb hatte ich gefragt, wie das JSON-Objekt aussehen soll.
      Schau dir nochmal Ryszard's Antwort an. Man kann diese spezielle Anforderung wie das JSON-Objekt auszusehen hat leider nicht innerhalb Ninox erzeugen. Mir ist jedenfalls keine Möglichkeit bekannt. Die Schlüsselwörter innerhalb des JSON-Objektes variieren und das soll auch noch dynamisch erzeugt werden. Mit viel Tüfteln und vielleicht dem Einsatz von eval()/Textumwandlungen und parsen kann man vielleicht sowas bauen.

      • ⭐ Ninox Partnerin - Kennes Digital
      • Stefanie_K
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Diesbzgl bist du hier unser Profi-Tüftler und findest sicher, wie schon so oft, eine hilfreiche Lösung für Ryszard Paluch.

      Ich frage mich nur: Warum so kompliziert, wenn es auch einfacher geht, und wollte eine alternative Lösung aufzeigen :-)

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Stefanie Kennes Deine Lösung ist super und funktioniert auch. Nur in diesem Fall scheint die Anforderung an das XML etwas spezieller zu sein.
      Ich kann mich aber auch irren und leite aus der Antwort von Ryszard Paluch die falschen Schlüsse ab.
      Aber ein JSON, das wie folgt aussieht funktioniert nicht, da man nicht mehr auf die einzelnen Objekte gezielt zugreifen kann.
       

      [
        {
          "position": {
            "menge": "artikelmenge",
            "name": "artikelname",
            "preis": "artikelpreis"
          },
          "position": {
            "menge": "artikelmenge",
            "name": "artikelname",
            "preis": "artikelpreis"
          }
        }
      ]

      Im Endeffekt weiß nur Ryszard, wie das XML aussieht und wie ein JSON-Objekt für das Parsen nach XML aussehen muss.

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Stefanie, Hallo Uwe

    Vielen Dank für Eure Rückmeldung. Das scheint sehr kompliziert zu sein.

    Stefanie bei Deine Lösung bekomme ich eine Fehlermeldung das "Der Ausdruck liefert mehrfach Ergebnisse zurück"

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Ryszard Paluch Wenn du eine fertige XML-Rechnung hast, Wandel sie doch einfach mal in ein JSON-Objekt um. Dann sieht man wie der Teil mit den Einzelposten der Rechnung auszusehen hat. Möglicherweise ist dann der Weg von Stefanie der Richtige.

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe

    Wie das XML aussehen sollte steht unten. Hier ist eine Position (Line) von der Rechnung abgebildet: LineNumber1, LineNumber2 usw.

    <Invoice-Lines>
        <Line>
        <Line-Item>
        <LineNumber>1</LineNumber>
        <OrderLineNumber>123</OrderLineNumber>
        <EAN>1111111111111</EAN>
        <BuyerItemCode>BuyerItemCode_1</BuyerItemCode>
        <SupplierItemCode>SupplierItemCode_1</SupplierItemCode>
        <ManufacturerItemCode>122</ManufacturerItemCode>
        <SerialNumber>GINBN</SerialNumber>
        <CustomsCode>CustomsCode</CustomsCode>
        <ItemDescription>ItemDescrip
        </Line>
    </Invoice-Lines>
    
    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    So sollte etwa die XML aussehen:

    <?xml version="1.0" encoding="UTF-8"?>
    <array>
        <string>Invoice-Lines</string>
        <dict>
            <key>Line1</key>
            <dict>
                <key>Brutto</key>
                <integer>0</integer>
                <key>Menge</key>
                <integer>0</integer>
                <key>Name</key>
                <string></string>
                <key>Netto</key>
                <integer>0</integer>
                <key>Preis</key>
                <integer>0</integer>
                <key>VAT</key>
                <integer>0</integer>
            </dict>
            <key>Line2</key>
            <dict>
                <key>Brutto</key>
                <integer>0</integer>
                <key>Menge</key>
                <integer>0</integer>
                <key>Name</key>
                <string></string>
                <key>Netto</key>
                <integer>0</integer>
                <key>Preis</key>
                <integer>0</integer>
                <key>VAT</key>
                <integer>0</integer>
            </dict>
            <key>Line3</key>
            <dict>
                <key>Brutto</key>
                <integer>0</integer>
                <key>Menge</key>
                <integer>0</integer>
                <key>Name</key>
                <string></string>
                <key>Netto</key>
                <integer>0</integer>
                <key>Preis</key>
                <integer>0</integer>
                <key>VAT</key>
                <integer>0</integer>
            </dict>
        </dict>
    </array>

    Und so die Json nach umawndlung von XML nach Json:

    {
      "array": {
        "string": "Invoice-Lines",
        "dict": {
          "key": [
            "Line1",
            {
              "#item": {
                "dict": {
                  "key": [
                    "Brutto",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Menge",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Name",
                    {
                      "#item": {
                        "string": {
                        }
                      }
                    },
                    "Netto",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Preis",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "VAT"
                  ],
                  "integer": "0"
                }
              }
            },
            "Line2",
            {
              "#item": {
                "dict": {
                  "key": [
                    "Brutto",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Menge",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Name",
                    {
                      "#item": {
                        "string": {
                        }
                      }
                    },
                    "Netto",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "Preis",
                    {
                      "#item": {
                        "integer": "0"
                      }
                    },
                    "VAT"
                  ],
                  "integer": "0"
                }
              }
            },
            "Line3"
          ],
          "dict": {
            "key": [
              "Brutto",
              {
                "#item": {
                  "integer": "0"
                }
              },
              "Menge",
              {
                "#item": {
                  "integer": "0"
                }
              },
              "Name",
              {
                "#item": {
                  "string": {
                  }
                }
              },
              "Netto",
              {
                "#item": {
                  "integer": "0"
                }
              },
              "Preis",
              {
                "#item": {
                  "integer": "0"
                }
              },
              "VAT"
            ],
            "integer": "0"
          }
        }
      }
    }
    
    • Leonid_Semik
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Ryszard, schlechte Nachricht: mit Ninox eigenen XML Funktionien wird es leider nicht funktionieren weil du bei <dict>  ein Object mit gleichnamigen Werten schreiben muss. Das ist gegen JSON Konzept. Also es bleibt nur die XML direkt zu schreiben. Für Lines wäre es etwa so:

    let myNumder:=0;
    let myVALUE:=
    ---
    <?xml version="1.0" encoding="UTF-8"?>
    <array>
    <string>Invoice-Lines</string>
    <dict>
    --- +
    
    join(for i in Rechnungspositionen do
    myNumber:=myNumber+1;
    ---
    <key>Line{myNumber}</key>
    <dict>
    <key>Brutto</key>
    <integer>{i.Bruttopreis}</integer>
    <key>Menge</key>
    <integer>{i.Menge}</integer>
    <key>Name</key>
    <string>{i.Artikelname}</string>
    <key>Netto</key>
    <integer>{i.Nettopreis}</integer>
    <key>Preis</key>
    <integer>{i.Artikelpreis}</integer>
    <key>VAT</key>
    <integer>{i.Mehrwertsteuer}</integer>
     </dict>
    ---
    end,"
    ")+"
    </dict>
    </array>";
    createTextFile(this,myValue,"Recnung.xml")
    
    
    Grüße
    Leo
    
    
    
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Ryszard
    Gut, daß Leo eine Lösung gefunden hat. 
    Die Begründung, weshalb es mit der Ninox eigenen XML-Funktion nicht funktionieren kann ist plausibel.
    Mit XML-Rechnungen hatte ich noch nie zu tun und da fehlt mir einfach das Wissen.
    Ich habe hier wieder etwas dazu gelernt.

    Was ich aber zwischenzeitlich aufgrund dieses Beitrages gelöst habe, ist ein dynamisches JSON-Objekt mit variablen Schlüsselnamen zu erzeugen.
    Dafür auch nochmal Dank für die Herausforderung, da ich dies bei der Erstellung von PDF's mit der Carbone Translation-Möglichkeit verwenden kann.

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Leo

    Vielen Dank erstmal.

    Ich werde es testen und melde mich noch.

    Was soll hier deklariert werden?: let myVALUE:=

    let myNumder:=0 sollte bestimmt let myNumber:=0 sein

    • Ryszard_Paluch
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Acha

    Jetzt verstehe ich es: myValue ist alles was drunten steht.

    Ich bekomme am ende in der letzte Zeile die Meldung dass die Tabellenspallte myValue nich vorhanden ist.

    Hier: createTextFile(this, myValue, "Rechnung.xml")