0

API Response richtig mappen

Hi zusammen, 

ich stehe gerade vor einem Problem und hoffe auf eure Hilfe. 

Ich habe eine Tabelle Parts, unter anderem mit den Feldern Artikelnummer und Lagerbestand WooCommerce. In WooCommerce habe ich mir eine Schnittstelle gebaut, damit ich in Ninox die aktuellen Lagerbestände per POST Call abrufen kann. 

Auf einzelner Artikeleben funktioniert das per Button bereits hervorragend. Jetzt möchte ich aber, dass beim Start der Datenbank ein Array aus allen Artikelnummern an WooCommerce geschickt wird und sich die Bestände in Ninox dann entsprechend aktualisieren. 

Das Array, der Post Call und auch das Result funktionieren schon einwandfrei, allerdings habe ich gerade Schwierigkeiten das Result richtig zu mappen. 

Mein Code den ich bei Start der Datenbank ausführen lasse ist bis dato so. Wie kann ich jetzt bestimmen, dass er anhand der Artikelnummer (sku) das Feld Lagerbestand WooCommerce aktualisieren soll? Das Result habe ich mir mal testweise in eine alertbox schreiben lassen. 

 

let vArray := [];
let vArrayObj := [];
let vObj := {};
let vbody := [];
let myParts := (select Parts where Status = 1 or Status = 2);
for i in myParts do
    vObj := {
            sku: i.Artikelnummer
        };
    vArrayObj := [vObj];
    vArray := array(vArray, vArrayObj)
end;
let vbody := vArray;
let response := do as server
        http("POST", "https://www.woocommerceshop.com/wp-json/api/part?endpoint=stock_sku_get", {
            accesstoken: "xyz",
            'Content-Type': "application/json"
        }, vbody)
    end;
if response.error then
    alert(text(response.error))
else
    alert(response.result)
end

 

Als Result bekomme ich folgende Werte, die an und für sich ja richtig wären: 

Würde mich freuen, wenn ihr mir beim mappen helfen könntet. 

Vorab vielen Dank. 

LG, Andi

21 Antworten

null
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Andi
    Du bekommst als Antwort ein Array mit x Objekten zurück.
    Wenn du auf das erste Objekt mit dem Wert von 'sku' zugreifen möchtest:
    item(response,0).sku
    Wenn du den gesamten Response durchlaufen möchtest, benötigst du eine Schleife.
    Bsp.
    for i in response do
    let vsku := item(response,i).sku;
    let vstock := item(responses).stock
    "Hier kannst du jetzt ein Script schreiben was du mit den Werten machen möchtest"
    Bsp.
    create TabellenName.sku := vsku
    end

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Fehler eingeschlichen: let vstock := item(response,i).stock

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Oder du schreibst dir eine Funktion und übergibst die Werte an diese Funktion und diese macht was du möchtest.
      bsp.
      function fx_MachWas(vsku:text, vstock:text) do
      first(select TabellenName [Artikelnummer = vsku]).Lagerbestand := vstock
      end;
      for i in response do
      let vsku := item(response,i).sku;
      let vstock := item(response,i).stock;
      fx_MachWas(vsku, vstock)
      end
      Wenn Lagerbestand ein Zahlenwert ist musst du noch den Text in eine Zahl umwandeln.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Noch eine Anmerkung: Wenn in dem Formular, welches das Script ausführt, eine Verknüpfung zu der entsprechenden Tabelle mit der Artikelnummer existiert, würde ich diese Verknüpfung statt select nutzen. Damit bist du schneller und Ninox hat keine Last die Ganze Tabelle mit den Artikelnummern zu durchsuchen.

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Hi Uwe, erstmal vielen Dank für deine Antworten. 

      Bei der foreach Schleife stimmt allerdings etwas noch nicht. 

      Wenn ich die so übernehme kommt immer der Fehler "Die Funktion ist nicht definiert: item(any, any)". Habe da jetzt stehen:

      for i in response.result do
              let vsku := text(item(response.result,i).sku);
              let vstock := number(item(response.result,i).stock);

      Und ich glaube daher funktioniert auch meine Funktion fx_mapping nicht: 

      function fx_mapping(vsku : text,vstock : number) do
              first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
      end;

      Wieso eigentlich das first? 

      Vorab vielen Dank. 

      LG, Andi

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 
      In deinem Fall ist eine Funktion eigentlich nicht zwingend notwendig, außer andere Tabellen könnten sie auch nutzen.
      Den Funktionsinhalt kannst du auch direkt in die Schleife schreiben:

      for i in response.result do
              let vsku := text(item(response.result,i).sku);
              let vstock := number(item(response.result,i).stock); 
               first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := number(vstock))
      end

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    1. Die Funktion muss vor der for-Schleife stehen. Sie muss immer zuerst deklariert werden und kann erst danach irgendwo im nachfolgenden Script aufgerufen werden. Oder sie wird als globale Funktion deklariert.
    2. Die Datentypen, die der Funktion übergeben werden, müssen stimmen.
    Schau dir mal in der 0001_Ninox-Reference den Beitrag zu 'function' an.
    3. Ich gehe davon aus, dass die Artikelnummer nur einmal in der Tabelle vorkommt. Deshalb das first um Mehrfachrecords zu vermeiden. Sollte die Artikelnummer mehrfach in der Tabelle vorkommen, musst du wieder mit eine Schleife arbeiten.  

    function fx_mapping(vsku : text,vstock : number) do
            first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
    end;
    for i in response.result do
            let vsku := text(item(response.result,i).sku);
            let vstock := number(item(response.result,i).stock); 
            fx_mapping(vsku, vstock)
    end

     

     

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Hi Uwe, 

      ja das ist mir so alles klar. Ich habe es genauso wie du hier eingebaut. 

      function fx_mapping(vsku : text,vstock : number) do
              first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
      end;
      for i in response.result do
              let vsku := text(item(response.result,i).sku);
              let vstock := number(item(response.result,i).stock); 
              fx_mapping(vsku, vstock)
      end

      Bei den beiden Zeilen "let vsku" und "let vstock" bekomme ich aber immer den Fehler "Die Funktion ist nicht definiert: item(any,any)". Ich glaube hieran scheitert es gerade noch. 

      Vorab vielen Dank. 

      LG, Andi

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 

      Kannst du bitte das komplette Script posten.

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Aber klar doch! 

       

      let vArray := [];
      let vArrayObj := [];
      let vObj := {};
      let vbody := [];
      let myParts := (select Parts where Status = 9);
      for i in myParts do
          vObj := {
                  sku: i.Artikelnummer
              };
          vArrayObj := [vObj];
          vArray := array(vArray, vArrayObj)
      end;
      let vbody := vArray;
      let response := do as server
              http("POST", "https://www.woocommerceshop.com/wp-json/api/part?endpoint=stock_sku_get", {
                  accesstoken: "xyz",
                  'Content-Type': "application/json"
              }, vbody)
              end;
      if response.error then
          alert(text(response.error))
      else
          function fx_mapping(vsku : text,vstock : number) do
              first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
          end;
          for i in response.result do
              let vsku := text(item(response.result,i).sku);
              let vstock := number(item(response.result,i).stock);
              fx_mapping(vsku, vstock)
          end;
      end
      

       

      LG, Andi

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 

      Probier bitte mal folgendes:
       

      let vsku := text(response.item(result,i).sku);
      let vstock := number(response.item(result,i).stock);
      first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce'
      
      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG 

      Und:
      for i in response do

       

      end

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Leider immer noch der gleiche Fehler: "Die Funktion ist nicht definiert: item(any,any)"

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 
      Wie sieht der komplette Response aus? ohne das .result
      Das ist für mich schwierig aus der Ferne da ich bei ähnliche Response-Antworten damit zum Ziel komme.
      Es muss also an dem Aufbau des Response liegen.
      Vielleicht, wenn ich mal direkt in die DB schauen kann.
      foren.uwe@gmx.de

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Vielen Dank für deine Bemühungen. Direkt in die Datenbank wird schwierig, da es sich um ein sehr Umfangreiches CRM/CMS/ERP System handelt mit vielen vertraulichen Daten. 

      Der komplette Response sieht so aus: 

      LG, Andi

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 
      Ich habe den Response-Text in einem Textfeld mal nachgebaut.
      mit let response:=parseJSON(Textfeld) erzeuge ich wieder ein Response-Objekt aus dem Textfeld.
      mit alert(response.item(result, 0).sku) erhalte ich den ersten Wert 'bp-c-baripants-anthracite-s'
      Wenn das nicht hinhaut, bin ich überfragt.

      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Sehr cool, das klappt bei mir auch. Ich glaube bei der Schleife ist die Position von dem i das Problem. Das lässt die Syntax an dieser Stelle nicht zu. 

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 

      OK. probieren wir einen anderen Weg:
       

      let vArray := [];
      let vArrayObj := [];
      let vObj := {};
      let vbody := [];
      let myParts := (select Parts where Status = 9);
      for i in myParts do
          vObj := {
                  sku: i.Artikelnummer
              };
          vArrayObj := [vObj];
          vArray := array(vArray, vArrayObj)
      end;
      let vbody := vArray;
      let response := do as server
              http("POST", "https://www.woocommerceshop.com/wp-json/api/part?endpoint=stock_sku_get", {
                  accesstoken: "xyz",
                  'Content-Type': "application/json"
              }, vbody)
              end;
      if response.error then
          alert(text(response.error))
      else
          let cItems := cnt(response.result);
          for i in range(0,cItems) do
              let vsku := text(item(response.result,i).sku);
              let vstock := number(item(response.result,i).stock);
              first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
          end;
      end;
      end
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wieder fehlerhaft durch copy/paste.
     

    if response.error then
        alert(text(response.error))
    else
        let cItems := cnt(response.result);
        for i in range(0,cItems) do
            let vsku := text(response.item(result,i).sku);
            let vstock := number(response.item(result,i).stock);
            first(select Parts[Artikelnummer = vsku]).('Lagerbestand WooCommerce' := vstock)
        end;
    end;
      • Andi_Neumaier
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Sehr geil Uwe! Funktioniert perfekt so! Vielen Dank. ;-)

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Andi Neumaier 

      Schwere Geburt, wenn man sich alles nur vorstellen kann.
      Freut mich daß es klappt.

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 21Antworten
  • 191Ansichten
  • 4 Folge bereits