0

PDF generieren in einer Schleife

Hallo,

ich denke ich komme jetzt ganz gut klar mit ninox. Macht wirklich Spaß damit zu arbeiten. Meine Ferienhausverwaltung ist auch fast fertig jetzt hänge ich noch an einem Problem. Ich verusche in einer Schleife (in der ich Rechnungen generiere) automatisch auch die PDF Datei zu erzeugen und in ein Feld des Rechnungsformulars zu packen. Das klappt aber leider nicht und ich hab keine Ahnung was ich falsch mache. Ich schätze mal ich hab da irgendwas falsch verstanden, hängt sicherlich wieder an irgend einer Kleinigkeit. Hat vielleicht jemand einen Tipp? Danke!

 

for a in select Positions do

let newInv := (create Rechnungen);

let newPos := (create Positionen);

newPos.(Rechnungen := newInv);

let myFileName := format(today(), “DD-MM-YYYY”) + “.pdf”;

importFile(newInv, printAndSaveRecord(newInv, “Rechnung”), myFileName);

newInv.(Rechnung := myFileName)

end

15 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo, wenn “Rechnung” ein Bildfeld ist, würde ich es mal so versuchen (letzte Zeile):

     

    newInv.(Rechnung := file(newInv, myFileName))

     

    Davon abgesehen: Soll es so sein, dass für jeden Eintrag in “Positions” jeweils 1 Rechnung mit jeweils 1 Position erstellt wird?

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke für deine Rückmeldung. Funktioniert so leider auch nicht. Blöderweise gibt es leider auch keine Fehlermeldung es passiert einfach nichts. Wenn ich den Code unten für die Erzeugung der Datei raus nehme wir die Rechnung korrekt erzeugt. Kann man so nen Code irgendwo testen und debuggen? Dürfte doch nichts exotisches sein die PDF“s automatisch zu erzeugen oder?

    Ist korrekt, es soll für jede Position eine eigene Rechnung erstellt werden. Position ist da wohl der falsche Name aber das hab ich einfach so aus einer Excelliste übernommen damit ich da nicht durcheinander komme :)

    • Torsten_Stang.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo,

     

    mit Copytexter“s Ergänzung (newInv.(Rechnung := file(newInv, myFileName))) sollte es IMHO eigentlich klappen - ich würde allerdings vermuten, dass sich Ninox insbesondere in der Schleife selbst überholt. D.h. das File ist noch nicht erstellt, aber das Skript will”s schon in“s Bildfeld schieben.

     

    Wie wär”s nach dem importFile()-Part testweise mal einen alert(“Weiter?”) einzufügen, um eine Pause zu erzwingen?

     

    lg, Torsten

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Oder die beiden letzten Zeilen gleich zusammenfassen?

     

    newInv.(Rechnung := importFile(newInv, printAndSaveRecord(newInv, “Rechnung”), myFileName))

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hab ich gerade auch mal versucht, der Alert kommt leider nicht. Wenn ich die import Geschichte rausnehme erscheint der Alert daher vermute ich mal dass dort das Problem liegen müsste ich sehe aber in der Zeile absolut keinen Fehler. newInv ist ja der Verweis auf die erstellte Rechhnung, printAndSAveRecord hat ebenso den Verweis auf den Datensatz sowie auf das Drucklayout und am Ende kommt dann noch der Dateiname.

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Beide Zeilen zusammenfassen hilft leider auch nicht. Macht es vielleicht was aus dass ich das Script in einer anderen Tabelle ausführe? Ich habe mir eine Tabelle angelegt bei der das Script bei einem neuen Datensatz ausgeführt wird. Hintergrund ist der dass ich wenn es läuft über die API da neue Datensätze per Cron anlegen will damit das Script dann regelmäßig ausgeführt wird.

    • Torsten_Stang.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hm, wie wär“s denn, das Skript mit do as server ... end auf dem Server laufen zu lassen? Da das PDF-Rendering ja auf dem Server statt findet würde ich meine Timing-Problem-Mutmaßung untermauern.

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Habt ihr mal statt des alert() die sleep()-Funktion getestet, wenn das Script in der Cloud läuft?
    Ich dnke auch, dass es es Timing-Problem mit dem laden des Files ist.

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Also mit der do as Server Geschichte erzeugt er zumindest die Rechnung allerdings ohne PDF oder importierte Datei. Klappt übrigens auch nur im Webinterface am Mac in der App oder am iPad in der App wird die Rechnung nicht erzeugt. Wie benutze ich denn die Sleep Funktion? einfach ein Intervall übergeben? Leider nichts in der Dokumentation zu finden. Vielen Dank für eure Mühe!

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich glaube ich komme der Lösung näher. mit Sleep habe ich es jetzt immerhin  geschafft dass ein PDF angehangen wird. Allerdings bekomme ich im Bildfeld nur ein PDF Icon und beim klicnen die Meldung “failed to load PDF”. Irgendwas scheint also beim erzeugen der PDF noch schief zu laufen. Ich hab das sleep jetzt vor jeden Schritt gemacht und mit 10 sekunden pro schritt getestet also erstmal 10 sekunden warten dann printAndSaveRecord, dann 10 Sekunden warten importFile dann 10 Sekunden warten und zuordnung zum Bildfeld. Insgesamt also 30 Sekunden für einen Datensatz.

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo.

    Die Zeitangabe in sleep() ist in Millisekunden.

    Für eine Sekunde Verzögerung lautet die Funktion sleep(1000)

    • SebMeg
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke das hatte soweit funktioniert mit dem Sleep die Verzögerung passt nur leider wird kein PDF Erzeugt bzw. ein defektes. Irgendwo muss also noch ein Fehler vorhanden sein.

    • titanium_banana
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Es lag offenbar wirklich an der Schnelligkeit. Ich konnte das Problem lösen indem ich zwei verschiedene schleifen gebaut habe, in der ersten werden die Rechnungen erzeugt und in der zweiten die PDF“s generiert. Das habe ich dann auch nicht nacheinander angelegt sondern mit einer IF Abfrage. Ich mache quasi zunächst in einer Log Tabelle einen Eintrag mit der Art 1 dann werden die Rechnungen generiert und 30 min später mache ich einen Eintrag mit Art 2 sodass die PDF”s generiert werden. So funktioniert es dann ohne Probleme. Könnte man natürlich wenn man es manuel machen möchte auch einfach auf 2 Buttons legen die Funktionen dann sollte es auch funktionieren.

    • titanium_banana
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Vielleicht versuchst du das bei dir auch mal ;)

    • Benjamin_Kunzmann_pr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo SebMeg,

    bei der Meldung “failed to load PDF” kann es auch sein dass dein erzeugte Dateiname ungültige Sonderzeichen enthält und dann deshalb nicht angezeigt wird. Ich hatte schonmal den gleichen Fall.

    Weil sich bei mir die Dateinamen aber auf Basis von Benutzereingaben erstellen, habe ich mir ein Skript gebaut welches automatisch alle Sonderzeichen aus dem "myFileName" entfernt.

    Wenn das Skript jemand haben möchte, kann ich es hier gerne posten.

    LG

    Benny :-)

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 15Antworten
  • 1142Ansichten