0

Speichern einer erstellten PDF

Super wäre es wenn ich eine Rechnung, Brief etc. erzeugt habe , das sich diese Datei automatisch im Datensatz abspeichert.

32 Antworten

null
    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Dieses Feature wird mit einem der kommenden Updates kommen - wir arbeiten bereits daran. - Mit anderen Worten: Derzeit ist es leider noch nicht möglich.

    Birger

    • freakey95
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Beim letzten Update kam diese Funktion nicht zufällig mit und ich habe sie übersehen?

    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Doch - jetzt gehts:

    let myLayout := "EinPribtlayout;
    met myFilename := "mypdf.pdf":
    let myTempFile := printAndSaveRecord(this, myLayout);
    importFile(this, myTempFile, myFilename);
    Birger

    • Pyromixer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ähm... Kann das mal genauer erklärt werden bitte? Das würde ich auch gut gebrauchen können.

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

    Hallo Pyromixer, ich versuch's mal: Um in Ninox ein Dokument zu erzeugen, z. B. eine Rechnung, und die betreffende PDF-Datei an den Datensatz anzuhängen, musste man bisher mehrere Schritte ausführen:

     

    1. PDF mit dem entsprechenden Layout drucken.
    2. Datei manuell benennen und lokal speichern.
    3. In "Anhänge" wechseln und die Datei wieder hochladen.

     

    Und wenn man die Datei per E-Mail versenden wollte, dann kamen noch ein paar Arbeitsschritte hinzu:

     

    4. E-Mail-Client auf dem eigenen Rechner öffnen.
    5. Betreffende Datei lokal auswählen und der Mail anhängen.
    6. Empfänger-Adresse angeben und Mail versenden.

     

    Seit dem letzten Update auf Version 2.4 lässt sich das per Script automatisieren:

     

    printAndSaveRecord() generiert die Datei.

    importFile() liest sie ein und speichert sie unter einem beliebigen Namen als Anhang eines Datensatzes.

    sendEMail() erzeugt und versendet aus Ninox eine Mail mit der Datei als Anhang.

     

    Angenommen, du hast eine Tabelle namens "Faktura" mit einem Drucklayout namens "Rechnung". Als Dateiname soll immer der Inhalt des (Text-) Feldes "RechnungsNr" verwendet werden. Dann kannst du  im Formular dieser Tabelle eine Schaltfläche "Rechnung generieren" o. ä. erstellen:

     

    importFile(this, printAndSafeRecord(this, "Rechnung"), RechnungsNr + ".pdf")

     

    Damit wären die Schritte 1 - 3 erledigt. Um die soeben erzeugte und angehängte Datei nun auch gleich noch aus Ninox heraus per E-Mail zu versenden (Schritte 4 - 6), kann das Script um sendEmail() ergänzt werden. Dann sähe es bspw. so aus:

     

    let DateiAnhang := importFile(this, printAndSafeRecord(this, "Rechnung"), RechnungsNr + ".pdf")

    sendEmail({

        from: "Deine.Mail@DeineDomain.tld",

        to: EMailKunde,

        cc: ""Deine.Mail@DeineDomain.tld",

        subject: "Rechnung " + DateiAnhang,

        text: "Moin, anbei meine Rechnung " + DateiAnhang + ". Noch mehr Text",

        attachments: DateiAnhang

        })

     

    Anmerkungen: Das 'this' steht immer für den aktuellen Datensatz. Die 'from'-Adresse muss die sein, mit der du bei Ninox registriert bist (bzw. die eines Team-Mitglieds). Das 'cc:' an die eigene E-Mail-Adresse ist optional, empfiehlt sich aber, da man sonst keinerlei Bestätigung hat, dass die Mail tatsächlich versendet wurde.

     

    Um versehentliches Versenden zu vermeiden, sollte man sinnvollerweise noch eine dialog()-Abfrage vorschalten, mit der sich der Vorgang auch noch abbrechen ließe.

     

    Disclaimer: Ich habe den Code jetzt als Trockenübung mehr oder weniger aus dem Kopf niedergeschrieben und hoffe, dass er so stimmt (falls nicht: Bitte korrigieren!). Wie immer gilt: Nach bestem Wissen und Gewissen, aber ohne Gewähr. ;)

    • Pyromixer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Vielen Dank für Deine Mühe. Aber dafür bin ich wohl zu blöd.

    Bei mir kommt die Meldung: Die Funktion ist nicht definiert: printAndSafeRecord(node,string) in Zeile 1, Spalte 52

    • freakey95
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Weil es soweit ich weiß saVe und nicht saFe heißt, also printAndSaveRecord :) 

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

    Dann versuch's mal mit Variablen, so wie in Birgers Beispiel weiter oben.

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

    Ja klar, es muss natürlich "save" heißen. War ja klar, dass ich da wieder einen blöden Fehler reinhaue ...

    • Pyromixer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hehe...

    Und prompt funktioniert was hier :-) Ich habs immerhin schon angehangen bekommen. Lag tatsächlich nur am Buchstaben "F" statt "V".

    Nun probiere ich mal das mit dem mailen... Danke auf jeden Fall für die sonntägliche Hilfe!

    • Pyromixer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Also wie gesagt, das anhängen der PDF funktioniert nun. Was ja schon mal ein grosser Fortschritt ist. Die erstellten Dokumente sind damit gleich dort wo sie hingehören, am dazugehörigen Datensatz.

    Das mit dem Mailing funktioniert allerdings nicht. Geht das nur mit der Cloud Version von Ninox?

    Wäre mir auch nicht so wichtig. Weil: Ich würde pro Woche nur die Datensätze mailen die ich in der Woche erledigt habe und da auch gleich alle Unterlagen auf einmal in Zip Dateien pro Job.

    Darum wäre für mich ein anderes Script passender: Die angehängten PDF auf Knopdruck in einen Ordner zu kopieren z.B. Also auch wenn mehrere PDFs am Datensatz hängen würden. Irgendwie sowas wäre toll.

    • Support
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo, 

    ja, das Versenden von E-Mails funktioniert nur aus einem Ninox Cloud-Team. 

    Das Zusammenfassen und/oder Speichern der PDF-Dateien in einem separaten Ordner sind schon häufig angefragte Features und werden sicherlich in einem der nächsten Releases verwirklicht werden.

    Gruß, Jörg

    • Pyromixer
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Super. Dann macht es umso mehr Sinn meine Anwendung nun langsam in die Ninox Welt umzusetzen. Das würde viele manuelle Arbeitsschritte sparen die ich zur Zeit - noch mit einer anderen Datenbank manuell erledigen muss.

    • Administrator
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Guten Abend zusammen.

    Mal wieder eine "blöde" Frage. Kann ich über printAndSafeRecord mehrere PDFs zu einer zusammenfassen?

    Ich habe 4 Drucklayouts und möchte daraus über eine Schaltfläche ein PDF erstellen.

     

    Vielen lieben Dank.

    Benny

    • Administrator
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Guten Abend zusammen.

    Mal wieder eine "blöde" Frage. Kann ich über printAndSafeRecord mehrere PDFs zu einer zusammenfassen?

    Ich habe 4 Drucklayouts und möchte daraus über eine Schaltfläche ein PDF erstellen.

     

    Vielen lieben Dank.

    Benny

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Benny,

    leider nein. printAndSaveRecord (bitte v statt f) produziert eine PDF-Datei, speichert diese temporär und gibt den Speicherort als Ergebnis. 

    Leo

    • Administrator
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    kennst du eine andere Möglichkeit? Primär geht es darum, dass mir eine Befehlsschaltfläche einen Vertrag erzeugen soll. Die erste Seite beinhaltet Daten aus einer Tabelle. Die zweite und dritte Seite sind statisch, d. h. der Inhalt ist immer gleich. Seite 4 und 5 müssen wieder Daten aus einer Tabelle enthalten, sprich Unterschriftsfelder und ein SEPA-Mandat. Ich suche eine Lösung, da der verarbeitende Mitarbeiter Zeit sparen und diese Verträge nicht manuell erstellen soll.

    Benny

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Benny,

    Fakt ist - Ninox kann keine mehrseitige Layouts erstellen. Entweder packst du alle Daten in ein Layout und lebst damit, dass die Anzahl der Seiten variabel ist oder, wenn du Cloud-Version hast, kannst du versuchen so eine Art Serienbrief mit Word zu erstellen und die Daten entweder über REST-Abfrage oder über eine freigegebene Ninox-Tabelle zu holen.

    Leo

    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wenn du mit Apple Arbeitest kannst du mittels des Automators deine PDF's zu einer PDF zusammenfassen. Serienbrief ist noch etwas umständlich in ninox aber es geht. Du muss im drucklayout menue auf alle klicken dann druckt er alle daten aus die du zuvor gefiltert hast. Und du müsstest wie Leo schon sagt alles in ein Layout packen.

     

    LG Basti

    • Firmeninhaber eines Dienstleistungsunternehmens (SHK)
    • Alexander_Prochnow
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo,

    bin leider nicht so geschickt mit dem Umgang mit der Eingabe der Anweisungen und hätte da noch einige Fragen.

    sendEmail({

        from: "Deine.Mail@DeineDomain.tld",

        to: EMailKunde,

        cc: ""Deine.Mail@DeineDomain.tld",

        subject: "Rechnung " + DateiAnhang,

        text: "Moin, anbei meine Rechnung " + DateiAnhang + ". Noch mehr Text",

        attachments: DateiAnhang

        })

    Das “DateiAnhang“ ist durch was zu ersetzen? Woher weiß die Anweisung, welchen Anhang, wenn mehrere vorhanden sind. 

    Frage zur Abfragefunktion, ob die Mail versendet werden soll... wie bewerkstellige ich dieses?

     

    mit bestem Dank

    • Birger_H
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ersetze DateiAnhang durch 

    –––
    file(Datensatz, Dateiname) 
    ...also etwa:
    file(this, "mypdf.pdf")
    –––

    Birger

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Nun habe ich die in die Produktivdatenbank eingebaut die Funktion mit dem automatischen abspeichern der PDF. Wird korrekt benannt und angehangen. Super. Vielen Dank an alle die geholfen haben.

    Da man nun hungrig auf mehr wird tüftel ich grad an einer Erweiterung:

    Ich habe in meiner Datenbank mehrere Karteireiter mit jeweils etlichen Feldern. Alles was unter einem Karteireiter steht wird auf einem dazugehörigen Drucklayout ausgedruckt. Ich habe es nun geschafft auch diese PDF Seiten mit ein und dem selben Button zu generieren, zu benennen und ebenfalls anzuhängen.

    Nun mein Problem: Nicht immer fülle ich die Felder dieser Karteireiter auch aus. Je nach Anwendungsfall mal nur einen, mal mehrere. Wenn ich nun aber keine Daten bei einigen Karteireitern in die Felder eingebe generiert er natürlich trotzdem ein oder mehrere PDF (ohne Daten drin). Ich hoffe es ist verständlich was ich meine.

    Wie kann ich es anstellen, dass er nur dann das PDF generiert und anhängt wenn mind. auch ein Feld in dem Karteireiter ausgefüllt wurde?

    • Support
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo, 

    das könntest du mit einer "if - then" -Klammer um die PDF-Erstellungsanweisung lösen. In der if - Bedingung dann meherer oder (or) für die Abfrage der einzelnen Felder. 

    Gruß, Jörg

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    OK. Wenn mir nun Programmierung liegen würde, würde ich das machen :-)

    Leider kann ich ohne Beispielzeile immer nichts zustande bringen. 

     

    Meine Testfunktion ist die folgende:

    importFile(this, printAndSaveRecord(this, "Mein-Drucklayout-01"), "MeinePDF01Bez." + AuftragsNr + ".pdf") + importFile(this, printAndSaveRecord(this, "Mein-Drucklayout-02"), "MeinePDF02Bez" + AuftragsNr + ".pdf")

     

    Drucklayout-02 wäre z.B. das PDF welches nur generiert und angehangen werden soll, wenn auch was ausgefüllt wurde was in diesem Layout enthalten ist.

    • Support
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo,

    das könnte dann so aussehen: 

     

    if Feld1 or Feld3 or Feld then

    importFile(this, printAndSaveRecord(this, "Mein-Drucklayout-01"), "MeinePDF01Bez." + AuftragsNr + ".pdf")

    end;

    if Feld 4 or Feld5 or Feld6 then

    importFile(this, printAndSaveRecord(this, "Mein-Drucklayout-02"), "MeinePDF02Bez" + AuftragsNr + ".pdf")

    end

     

    Das bedeutet: Ist Feld1, Feld2 oder Feld3 ausgefüllt, dann drucke Layout-01, ist Feld4, Feld5 oder Feld6 ausgefüllt, drucke Layout-02.

    Dabei reicht es, einfach den Feldnamen anzugeben, um prüfen zu lassen ob es einen Inhalt hat. Umgekehrt würde es heißen:

     

    if Feld1 = null ....

     

    , wenn man als Bedingung angeben wollte, dass Feld1 leer sein muss.

    Gruß, Jörg