Bekannte Komplikationen beim dynamischen Druck (Dynamic Print) und wie man sie umgehen kann
Viele Nutzer haben seit der Einführung mit der Version 3.7 große Erfolge mit dem dynamischen Druck via Carbone.io verzeichnen können, da sich hierin verschiedene Individualisierungen umsetzen lassen welche dem Ninox-eigenen Druckeditor noch fehlen.
Leider kommt es hierbei aber auch manchmal zu intransparenten Fehlern die das Drucken erschweren oder verhindern. Folgend werden sowohl das Problem als auch ein bewährter Lösungsweg beleuchtet.
Carbone bietet im Grunde zwei Möglichkeiten die für den Druck benötigten Daten aus Ninox auszulesen.
1. In der vereinfachten Form wird die Vorlage so verfasst, dass lediglich die Feldbezeichnungen in der Ninox-Tabelle als Referenz genutzt werden, so kann man z. B. das Textfeld „Kundenname“ und das Zahlenfeld „Preis Gesamt“ in der Word-Datei als {d.Kundenname} und {d.Preis_Gesamt} anführen.
Wichtig ist hierbei, dass Ninox in diesem Fall nicht nur die in der Vorlage erwähnten Datenfelder übernimmt, sondern pauschal den gesamten Inhalt des Ninox-Datensatzes inkl. etwaiger verknüpfter Datensätze aus 1:N- und N:1-Beziehungen. Das alles wird in ein großes JSON-Objekt verpackt und so an den Dienstleister Carbone.io übergeben. Dazu gehören auch z. B. die Inhalte von Bildfeldern, sofern vorhanden.
Das kann dazu führen, dass die zu übertragende Datenmenge das arbiträr festgelegte Größenlimit von 60 MB überschreitet. Dieses wurde implementiert, um zu massive Anfragen an Carbone abzufangen. Ninox zeigt dann standardmäßig die in dieser Interaktion von Carbone ausgeworfene Fehlermeldung an. Manchmal kann es aber auch sein, dass zwar nicht die Speichergrenze erreicht wurde aber eine im JSON-Objekt übergebene und möglicherweise irrelevante Information von Carbone nicht korrekt verarbeitet werden kann. In dem Fall geschieht beim Auslösen des Drucks lediglich gar nichts und es erscheint auch keine Fehlermeldung.
Treten die hier genannten Symptome auf, ist die nachfolgend beschriebene Vorgehensweise oft eine mögliche Lösung.
2. Ruft man das entsprechende dynamische Layout im Druckeditor auf erscheint im Optionsmenü rechts „Benutzerdefinierte JSON“. Diese ist standardmäßig deaktiviert. Klickt man sie an erscheint ein Skriptfeld „JSON-Dateneingabe“ direkt darunter. Durch dieses kann man explizit definieren welche Daten an Carbone weitergegeben werden, anstatt des kompletten Datensatzes.
Um das Beispiel von eben fortzuführen müssten wir zuerst den Referenzen in der Vorlagedatei abweichende Bezeichnungen geben – z. B. {d.vKundenname} statt {d.Kundenname} usw. – und dann in „JSON-Dateneingabe“ das benötigte JSON-Objekt definieren, in etwa so:
{
vKundenname: Kundenname,
vPreis_Gesamt: 'Preis Gesamt'
}
Der Druckvorgang sollte somit alle im ersten Punkt angesprochenen Probleme umgehen können.
Weiterführende Beispiele, u. a. wie man Untertabellen und Bildfelder hierin korrekt integriert, werden zukünftig unter Tipps&Tricks als Beispiel-Datenbanken veröffentlicht. In diesen werden dann auch anhand von speziellen Skriptstrukturen Lösungen zu anderen alltäglichen Problemstellungen beim dynamischen Druck demonstriert.
Im Prozess unsere Dokumentation von Grund auf zu aktualisieren planen wir das hierin weitergegebene Wissen und Hilfestellungen ebenfalls unterzubringen.
3 Antworten
-
said:
Wichtig ist hierbei, dass Ninox in diesem Fall nicht nur die in der Vorlage erwähnten Datenfelder übernimmt, sondern pauschal den gesamten Inhalt des Ninox-Datensatzes inkl.Klasse und vielen Dank für die Info, das hatte ich bisher vage vermutet.
Jetzt weiß ich Bescheid und werde den ein oder anderen „Benutzerdefinierte JSON“ bauen ;-) -
Auch von mir vielen Dank für die Klarstellung. Ich hatte dazu tatsächlich unlängst eine Anfrage an den Support gestellt, welche auch umgehend so beantwortet wurde.
Dazu kann man noch sagen, dass das rendern des PDFs mit Benutzerdefiniertem JSON gefühlt ein Drittel der Zeit in Anspruch nimmt!
Übrigens lassen sich verknüpfte Tabellen und Verknüpfungen innerhalb einer Untertabelle auch ansprechen.
Nehmen wir als Beispiel einen Datensatz aus Tabelle "Rechnungen" (wo man Rechnungsdatum, Kunde usw. definiert) mit einer Verknüpfung auf "Mitarbeiter" und mit einer Untertabelle "Artikelliste" (wo man Menge usw. definiert) und darin jeweils einer Verknüpfung auf "Artikel" (wo Daten wie Artikelnummer, Name, Preis und Gewicht angegeben sind).Das JSON sähe dann so aus:
{
vRechnungsDatum: text(Datum),
vKundennummer: text(Kundennummer),
vMitarbeiter: Mitarbeiter.{
vVorname: Vorname,
vNachname: Nachname
},
vArtikelliste: Artikelliste.{
vPos: Pos,
vMenge: Menge,
vEinheit: text(Einheit),
vArtikel: Artikel.{
vArtikelnummer: Artikelnummer,
vArtikelname: Artikelname,
vPreis: Preis
}
}
}So kann man dann im Drucktemplate über vArtikelliste[i] und folgend vArtikelliste[i+1] durch die Untertabelle iterieren...
-
Hallo, ich bin relativ hier bei Ninox. Aber durch eure Tipps schon sehr weit gekommen. Im Augenblick scheitere ich an folgender Idee. Ich habe in meiner Tabelle Rechnungspositionen ein Datumstart und ein Datumende. Ich möchte das je nach Situation sich die Formartierung ändert, also wenn nur das Datumstart eingetragen ist soll sich nichts ändern und das Datum wird so ausgegeben wie es ist. Wenn Start und Ende vergeben sind dann soll Formartiert werden. zb. 21.02. - 22.02.2024.
if Rechnungspositionen.DatumEnde > 0 then
{
vDatumstart: Rechnungspositionen.format(DatumStart, "DoMM."),
vMinus: "-",
vDatumende: Rechnungspositionen.text(DatumEnde),
vFirmenname: 'Auftraggeber / Kunden'.Firmenname,
vStrasse: 'Auftraggeber / Kunden'.Strasse,
vOrt: 'Auftraggeber / Kunden'.PLZ + " " + 'Auftraggeber / Kunden'.Stadt,
vRechnungsdatum: text(Rechnungsdatum),
vRechnungsnummer: 'RE NR.',
vProduktion: Produktion,
vPos: Rechnungspositionen.'POS.',
vPosition: Rechnungspositionen.Position,
vAnzahl: Rechnungspositionen.Anzahl,
vTP: Rechnungspositionen.text('Summe TP')
}
else
{
vDatumstart: Rechnungspositionen.text(DatumStart),
vFirmenname: 'Auftraggeber / Kunden'.Firmenname,
vStrasse: 'Auftraggeber / Kunden'.Strasse,
vOrt: 'Auftraggeber / Kunden'.PLZ + " " + 'Auftraggeber / Kunden'.Stadt,
vRechnungsdatum: text(Rechnungsdatum),
vRechnungsnummer: 'RE NR.',
vProduktion: Produktion,
vPos: Rechnungspositionen.'POS.',
vPosition: Rechnungspositionen.Position,
vAnzahl: Rechnungspositionen.Anzahl,
vTP: Rechnungspositionen.text('Summe TP')
}
endDas ist mein Json und es funktioniert auch mit folgendem im Drucklayout.
{d.vDatumstart[i=0]} {d.vMinus} {d.vDatumende[i=0]}
aber nur in der ersten Zeile. Sobald ich Datum in der zweiten Zeile eintragen dfunktioniert das nicht mehr.
Ist mein Ansatz richtig?
Content aside
-
5
„Gefällt mir“ Klicks
- vor 9 MonatenZuletzt aktiv
- 3Antworten
- 472Ansichten
-
6
Folge bereits