0

Rechnung per PDF erstellen (Schaltfläche) aus Vorlage "Rechnungen" erzeugt bei mir plötzlich eine leere Seite

Hallo an Alle,

 

Ich habe nun mehrfach den Code überprüft, kopiert, angepasst udn komme einfach nicht weiter, obwohl vorher alles bestens war. Mit 'vorher' meine ich entweder vor Ninox update heute morgen oder bevor ich die Datenbank neu importiert habe. Vielleicht ist ja dabei ein Fehler passiert.

Wie in der Überschrift erwähnt, nutze ich die Vorlage "rechnungen". Ich habe diese noch ein wenig angepasst und erweitert.

Unten kann man, wie in der Vorlage, per Befehlsschaltfläche eine PDF-DAtei erzeugen und die RG, dann löschen oder spreichern.

Bildschirmfoto 2020-03-06 um 09.36.27

 

Wenn ich auf  'PDF erstellen klicke', dann passiert folgendes:

Die Seite ist leer. Vorher sah man die Rechnungsvorlage, die man im Drucklayout erstellt hat. Im Drucklayout funktioniert alles ok.

 

Bildschirmfoto 2020-03-06 um 09.36.44

 

Versuche ich die Datei zu speichern, kommt folgende Meldung:

 

Bildschirmfoto 2020-03-06 um 09.32.13

 

Folgenden Code habe ich in der Befehlsschaltfläche 'PDF erstellen' stehen:

 

let myFileName := "Rechnung_" + 'Id-Nummer' + "_vom_" + format(if Rechnungsdatum then Rechnungsdatum else today() end, "YYYY-MM-DD") + ".pdf";
importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName);
Rechnung := myFileName

 

HAt jemand eine Idee, was ich falsch gemacht haben könnte?

 

Vielen Dank im Voraus!

 

Gruß

Kruna

21 Antworten

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

    Hallo Kruna, einige Benutzer berichten von Problemen mit komplexeren format()-Konstruktionen. Ich weiß nicht, ob es tatsächlich daran liegt, aber einen Versuch wäre es wert:

    let myprintDate := if Rechnungsdatum then Rechnungsdatum else today() end;
    let myFileName := "Rechnung_" + 'Id-Nummer' + "_vom_" + format(myprintDate, "YYYY-MM-DD") + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName);
    Rechnung := myFileName

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

    Quatsch, die letzte Zeile muss natürlich weg, sorry: 

     

    let myprintDate := if Rechnungsdatum then Rechnungsdatum else today() end;
    let myFileName := "Rechnung_" + 'Id-Nummer' + "_vom_" + format(myprintDate, "YYYY-MM-DD") + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,

    vielen Dank für den Ansatz. Leider hat es nicht funktioniert. Durch Weglassen der letzten Zeile passiert nichts. Dann habe ich es doch mal mit der letzten Zeile versucht, mit dem Ergebnis, dass die Seite immer noch leer bleibt.

    Das komische ist ja, dass alles wunderbar lief. Ich weiss nur nicht, ob es am update lag oder an meiner 'herumbastelei', wobei ich nichts an den Codes geändert habe. Lediglich habe ich versucht, die DAtenbank quasi ohne  Inhalt zu exportieren und importieren (Daten und Dateien war nicht markiert). Viellecht habe ich dabei einen Fehler gemacht.

    Komisch ist auch, dass in meiner 'Hauptdatenbank' es plötzlich auch nicht mehr funktioniert, also liegt es vllt doch am Update.

    Wenn ich jedoch die Vorlage RG aufrufe, klappt es bei der Vorlage einwandfrei. Und wenn ich die Codes genau übernehme, dann klappt es wieder nicht! "DAs ist zum Kühe-melken...."

     

    Gruß

    Kruna

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

    Seltsam. Die letzte Zeile mit "Rechnung := [...]" bewirkt lediglich, dass das generierte Dokument direkt in ein Bildfeld namens "Rechnung" geladen wird. Das sollte so funktionieren und funktioniert bei mir auch (Cloud). Ich würde noch mal alle beteiligten Felder, deren Formate und aktuellen Werte beim Generieren des Dateinamens ("let myFileName := [...]") überprüfen. Also: Ist 'Rechnungsdatum' wirklich ein Feld von Typ 'Datum', welchen Datentyp hat 'ID-Nummer ...?

    Oder der Vollständigkeit halber als Variante auch noch mal:

    let myDate := if Rechnungsdatum then date(Rechnungsdatum) else today() end;
    let myPrintDate := format(myDate, "YYYY-MM-DD");
    let myFileName := "Rechnung_" + 'Id-Nummer' + "_vom_" + myPrintDate + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    Ansonsten hätte ich so auf die Schnelle keine Idee, waran es sonst liegen könnte. Vielleicht jemand anderes? Falls die Überprüfung nichts bringt, am besten mal an den Support wenden.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,

     

    leider auch hier ohne Erfolg.

    Diese letzte Zeile funktioniert in meinem Fall leider nicht mehr. DAs generierte Dokument wird zwar in das Bildfeld geladen, aber das Dokument ist leer oder weiss. Wenn ich die letzte Zeile weglasse, passiert leider nichts bzw wird kein Dokument generiert.

     

    Wohl oder übel, werde ich die Vorlage der RG neu importieren und anpassen müssen.

    Komischerweise funktionert die Vorlage einwandfrei und ich habe alle Codes exakt kopiert und nur die Tabellennamen ausgetauscht.

     

    TRotzdem tausend DAnk für Deine Hilfe.

     

    Gruß

    Kruna

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

    Klar, die letzte Zeile enthält ja das "printAndSaveRecord", mit dem die Datei generiert wird, wenn man die weglässt, passiert gar nix. Wenn aber eine weiße Seite in das Bildfeld geladen wurde, dann bedeutet das ja, dass die Datei generiert wurde. Nur eben ohne Inhalt. Sehr seltsam. Falsches Drucklayout?

     

    Was man auch noch hätte machen können: Da der Code ja mit einer Schaltfläche ausgeführt wird, zur Überprüfung einzelner Ergebnisse alert() oder dialog() einbauen. Zum Beispiel nach der Zeile "let myFileName := [...]"

     

    dialog("Check", "myFileName = " + myFileName, ["Ok"]);

     

    Aber okay, wenn du's jetzt anders gelöst hast, ist es ja erledigt.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,die letzte Zeile, die ich weggelassen habe, war:

     

    Rechnung := myFileName

    und  dann passierte nichts, die musste ich wieder hinzufügen.

    dialog einbauen führte dazu:

    Bildschirmfoto 2020-03-06 um 12.53.10

    läuft dann in einer Schleife.

    NUn, Die Vorlage neu anpassen zu müssen, möchte ich lieber vermeiden, da das sehr viel Arbeit ist. Ich ahtte gehofft, dass es nur eine 'Kleinigkeit' ist, die ich eventuell übersehen habe.

    Was meinst Du mit 'falsches Drucklayout? Wo/Wie kann ich das überprüfen?

    Ich habe bisher nur zwei Layouts und die werden auch einwandfrei angezeigt, nur eben seit heute morgen nicht mehr, wenn ich es über den Button versuche.

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

    Filename sieht doch korrekt aus. Aber wieso "läuft dann in einer Schleife"? Das verstehe ich nicht. Die Funktion dialog() wird doch nur einmal ausgeführt und hält die weitere Ausführung des Codes an, bis man "Ok" klickt. Oder ist noch weiterer Code drumherum, den du hier weggelassen hast? Kommt mir alles irgendwie "spanisch" vor.

    Das "Rechnung := myFileName" kam in meinen Code-Vorschlägen gar nicht mehr vor. Die Zeile

    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    bewirkt dasselbe wie die beiden Zeilen

    importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName);
    Rechnung := myFileName

    Zum "Drucklayout": Man kann ja mehrere Drucklayouts anlegen. Wenn man beim printAndSaveRecord() gar keines oder ein nicht vorhandenes angibt, dann greift Ninox m. W. auf das erste zu. Ich würde also mal mit dem Druckersymbol in den Drucklayout-Editor wechseln und prüfen, ob es dort überhaupt ein Drucklayout namens "Rechnung" gibt und was da drin steht. Und was passiert, wenn du die Datei auf diesem Wege erzeugst? Oder ist der Druck an bestimmte Bedignungen geknüpft? Man weiß ja nie ...

    Vielleicht habe ich Tomaten auf den Augen, aber ich sehe sonst keinen Grund, warum der oben gepostete Code  (10:49 Uhr) nicht funktionieren sollte. Zumal der Dateiname der dialog()-Meldung zufolge ja offenbar korrekt erzeugt wird. Hier ist er noch mal, auch nur der Vollständigkeit halber:

    let myDate := if Rechnungsdatum then date(Rechnungsdatum) else today() end;
    let myPrintDate := format(myDate, "YYYY-MM-DD");
    let myFileName := "Rechnung_" + 'Id-Nummer' + "_vom_" + myPrintDate + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    Ansonsten kann ich wie gesagt nur empfehlen, den Support zu kontaktieren. Die wissen in der Regel doch mehr als wir normalen Foristen hier (von Leo mal abgesehen), kennen viele Fehler und haben auch tiefere Einblicke.

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

    Ach so, du könntest die Datenbank auch irgendwo zum Download ins Netz stellen (mit Demodaten), dann könnte man mal direkt reinschauen. Das erleichtert die Fehlersuche in der Regel sehr.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hmmm!! Ich bin nun auch etwas verwirrt! Ich sitze nun den ganzen TAg, um irgendwie diesen Fehler zu beheben und sehe wahrscheinlich auch den Wald vor lauter Bäumen nicht mehr.

    DAnke Dir nochmals, dass Du Dich da so mit 'reinhängst'!

    Also, Ich habe gerade Deinen Code eingegeben und es passiert nichts, d.h. kein Dokument wird generiert und auch das 'Bildfeld', welches die RG in PDF zeigt, öffnet sich nicht. HAst Du eine Idee, woran, das liegen könnte?

    Füge ich jedoch Deinem Code zum Schluß Rechnung := myFileName hinzu, dann wird diese leere Seite erzeugt.

    Zum Thema Drucklayout: Ich habe zunächst zwei Layouts und als noch alles funktionierte, je nachdem, welches LAyout angeklickt war, wurde dieses per Befehlsschaltfläche generiert, obwohl keines von beiden Drucklayouts 'Rechnung' hieß.

    So, habe ich nun für noch mehr Verwirrung gesorgt?

     

    Ich schaue mal, wie ich die Datenbank hochgeladen bekomme.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Interessant ist ja folgendes:

    Ich habe zu jeder Rechnung noch ein Begleitschreiben, quasi ein 'Anschreiben'. Dieses erstelle ich in einer Untertabelle der Kundentabelle. Dort habe ich auch eine BEfehlsschaltfläche erstellt, die ich aus dem gleichen Code der Rechnung entnommen habe und dementsprechend angepasst habe. Da funktioniert alles prima.

     

    let myFileName := "Anschreiben_" + Vertragsdatum + "_vom_" + format(if Vertragsdatum then Vertragsdatum else today() end, "YYYY-MM-DD") + ".pdf";
    importFile(this, printAndSaveRecord(this, "Anschreiben"), myFileName);
    Anschreiben := myFileName

     

    Nun habe ich die Vorlage 'Rechnungen'neu gemacht und bis zu den letzten Anpassungen war alles ok und nun funktioniert es wieder nicht. Ich bin fix und foxi.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Soooooo, was immer auch passiert ist, ich verstehe es nicht.

    Nun habe ich mal den Code vom 'Anschreiben' genommen und ihn in die Befehlsschaltfläche von Rechnungen kopiert und dementsprechend angepasst...und siehe da, jetzt funktioniert es!!!

     

    let myFileName := "Rechnung_" + Kunde.'Kunden-Nr.' + "_vom_" + format(if Rechnungsdatum then Rechnungsdatum else today() end, "YYYY-MM-DD") + ".pdf";
    importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName);
    Rechnung := myFileName

     

    Nochmals vielen Dank für die Hilfe all die Bemühunungen, eine Lösung zu finden.

    Gruß

    Kruna

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Also,

    es scheint irgendeine Konflikt mit der 'Id-Nummer' zu geben. Ich habe eben richtigkeithalber die 'Id-Nummer' anstelle der Kunde.'Kunden-Nr.' eingeben und es finktioniert wieder nicht. Woran könnte das nun liegen?

    Sorry für alle die Posts hintereinander, aber ich bin einfach ratlos und versuche nur wiederzugeben bzw auszuprobieren woran es liegen könnte.

    Gruß

    Kruna

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

    Datenbank? Download? Reingucken? ...

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Sorry, dass es hat ein wenig gedauert bis ich die DB im webinar hochgeladen habe. Ich bin noch recht neu hier und noch nicht so vertraut mit ninox.

    Jetzt hat es aber geklappt, es ist die TestDB_mtom. Ich hoffe, dass ich alles soweit richtig gemacht habe.

    Danke Dir!

    Gruß

    Kruna

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Es sind die Querstrieche in dem Dateinamen (ID_Nummer). Ninox verträgt diese nicht. habe jetzt den Kode geändert:

    ---

    let myFileName := "Rechnung_" + replace('Id-Nummer', "/", "_") + "_vom_" + format(if Rechnungsdatum then Rechnungsdatum else today() end, "YYYY-MM-DD") + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    ---

    Leo

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

    👍 Stimmt. Im Screenshot des dialog()-Fensters (12:13 Uhr) hätte man's erkennen können. Dann kann ich mir die weitere Suche ja sparen. Danke!

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Es hat funktioniert!!! Vielen tausend Dank für den Code, Leo und für die ganze Mühe und den ganzen Aufwand, Copytexter!!

    Ich bin euch wirklich sehr, sehr dankbar!

    Ninox ist echt absolute Klasse und der Support hier und alles...einfach toll!!!

    Wünsche euch noch ein schönes Wochenende!

     

    Gruß

    Kruna

    • Markus.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

    ich muss da nochmal nachfragen, was den Code von Leo angeht:

    let myFileName := "Rechnung_" + replace(Rechnungsnummer, "/", "_") + "_vom_" + format(if Rechnungsdatum then Rechnungsdatum else today() end, "YYYY-MM-DD") + ".pdf";
    Rechnung := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName) := importFile(this, printAndSaveRecord(this, "Rechnung"), myFileName)

    Welchen Bezug hat das Feld „Rechnung" in der letzten Zeile? Bei mir wird die Tabellenspalte Rechnung nicht gefunden

    Sonnige Grüße
    Markus

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

    Hallo Markus, in der Zeile >>Rechnung := importFile(...)<< steht 'Rechnung' für den Namen des Bildfeldes, in dem das PDF-Dokument dargestellt werden soll. Beim >>printAndSaveRecord(this, "Rechnung")<< ist ein Drucklayout dieses Namens gemeint.

    • Markus.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

    jetzt wird mir das Ganze auch klar - danke für die Aufklärung 👍🏼, werde ich heute Nachmittag mal direkt testen

    Viele Grüße
    Markus