Publicité

FMK2022 Drucken über Dateigrenzen hinweg von Philipp Puls

Verein FM Konferenz
28 Jun 2022
Publicité

Contenu connexe

Similaire à FMK2022 Drucken über Dateigrenzen hinweg von Philipp Puls(20)

Plus de Verein FM Konferenz(20)

Publicité

FMK2022 Drucken über Dateigrenzen hinweg von Philipp Puls

  1. www.filemaker-konferenz.com FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 … oder: Wie druckt man in einer vertikalen Lösung Philipp A. Puls 72solutions GmbH Drucklayouts über Dateigrenzen hinweg…
  2. 10. FileMaker Konferenz | Hamburg | 16.-19. Oktober 2019 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu 1992 – 1999 – 2002 – 2003 – _ 2011 – 2012 – _ 2013 – _ _ _ _ 2015 – 2018 – Zertifiziert für: Mag. Philipp A. Puls Geschäftsführender Gesellschafter der 72solutions GmbH Erste kommerzielle FileMaker Datenbank Event-Sponsoring, Marketing & PR Gründungseigentümer RADIX Group GmbH Uni Wien, Abschluss des Studiums der theoretischen Physik Verkauf der Anteile an der Radix Group Mitglied im Führungsteam der Stefan Pusch Unternehmensberatungs KG (base72) Gesellschafter der 72solutions GmbH, (vormals base72) Jährliche Vorträge auf der dot[x]FMP Regelmäßige Vorträge auf der FMK
  3. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu FileMaker kann doch drucken, oder? Also, wo ist da bitte das Problem? • Layouts sind Struktur-getrieben • … aber das ist doch ok für das User Interface • … aber es ist Mist für Drucklayouts • weil sie eben Struktur-getrieben sind Aber…
  4. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Wozu führt das Was schief gehen kann, wird auch schief gehen! • Verwendet man das FMDMT für Updates, werden damit alle nicht-Standard Kunden-Drucklayouts zerstört • Alle Drucklayouts aller Kunden in einer Lösung zu sammeln wirkt unsicher • Druck-Layouts werden mit kundenspezifischen Daten erst vernünftig erstellbar, die Daten fehlen aber in den Development-Umgebungen
  5. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Die klassische Lösung Man baut einfach ein Ducklayout-File mit externen Datenquellen in alle Dokumente … + Absurd schnell – Bricht, wenn sich die Struktur der angebundenen Lösungen ädert – Jeder Benutzer, der Layout-Access in dieser Druckdatei hat, hat Zugang zu allen Daten – ? Mit einem solchen Zugang könnte auch ein Button angelegt werden, der ein Script in einer verbundenen Datei aufruft.
  6. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Der neue Weg Unsere Zielsetzung : • Ein Benutzer startet ein Script, wo immer er dazu berechtigt ist • Dieses Script sammelt die Daten, die benötigt werden, um den Datensatz zu drucken. • Die Daten werden an das Druckfile übergeben • Das Druckfile sollte so wenig wie möglich von dem Daten-Quellfile wissen • Jeder Administrator sollte technisch in der Lage sein, die Drucklayouts selbst, oder mit Unterstützung durch einen beliebigen FM-Partner abzuändern • Das Druckfile sollte ohne Ruheverschlüsselung auskommen können • Die Daten im Druckfile sollten nie auf der Festplatte ankommen
  7. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Was haben wir (nur) getan! … um das möglich zu machen: • Wir verwenden die MBS("QuickList") Funktion, um die Daten über die Filegrenzen hinweg zu transportieren • Wir verwenden separate Listen für Text, Zahlen und Datumsformate • Wir verwenden JSON Data-Struktur um diese Listen lesbar zu halten • Wir verwenden MagicalValueLists in der Druckdatei um das JSON wieder aufzulösen • Wir verwenden Wiederholfelder, um nur 6 Formelfelder synchronisiert zu halten, anstatt 300!
  8. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Probleme, auf die wir gestoßen sind … und wie wir sie gelöst haben. • JSON wird in FileMaker alphabetisch sortiert. Eine Umbenennung würde also die Reihenfolge zerstören. Stellt man dem Feldnamen jedoch die FeldID voran, dann klappt das immer! • Wir teilen die QuickLists nach Datentyp, damit auch ordentliche Feldformatierung in den Layouts funktionieren. • Um den Überblick zu behalten bauen wir nicht 3 sondern 6 Listen, in den Zusätzlichen finden sich die Feldnamen. • Man kann also Felder wiederverwenden, aber nie den Datentyp ändern! • Wenn man per PSOS drucken will, muss man die QuickLists im Namen durch UUIDs erweitern — sonst könnten die Daten von parallelen Serverprozessen gemischt werden.
  9. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu So ist das nun … • Wir haben mit einer CF angefangen ( GibDatensatzAlsJSON) und das Ergbnis in eine MBS(“QuickList”) gestopft.
  10. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu //================= // Autor: 72solutions (PAP) // 30.04.2020 // Gibt einen Datensatz als JSON //// Parameter: // [x] NormalCalculated // Values: "Normal,Calculated" | "Normal" | "Calcualted" // defines, what classes of fields should be included //// [x] includeBinaryData // Values: 1 | "" | 0 // if set to 1, a container Fld will be base64 encoded, otherwise only // the name of the file will be included //================= While ([ $_class = NormalCalculatedGlobal ; $_includeBinaryData = includeBinaryData ; $_TO = Case( PatternCount( Get ( LayoutTableName ); "_oB"); "ALL"; "" ) ; $_table = Substitute ( Get ( LayoutTableName ); "_oB"; ""); $_FldList = ExecuteSQL ( " SELECT DISTINCT f.BaseTableName , f.FieldName, f.FieldClass , f.FieldType, f.FieldReps FROM FileMaker_BaseTableFields f WHERE f.BaseTableName = '"& $_table &"' AND '"& $_class &"' LIKE '%'+f.FieldClass+'%' AND f.FieldType NOT LIKE 'global%' "; "•" ; "¶" ) ; $_FLDcount = ValueCount ( $_FldList) ; $_jsontext = ""; $_count = 1 ]; $_count < $_FLDcount + 1 ; [ $_FLDline = Substitute ( GetValue( $_FldList; $_count ); "•"; "¶"); $_FLDclass = GetValue ($_FLDline ; 3) ; $_FLDtype = GetValue ($_FLDline ; 4) ; $_FLDreps = GetAsNumber( GetValue ($_FLDline ; 5)) ; $_FLDtalbe = GetValue ($_FLDline ; 1) & Case( $_TO = "ALL";"_oB"; "") ; $_FLDname = GetValue ($_FLDline ; 2) ; $_json = While ( [ _FLDclass = $_FLDclass ; _FLDtype = $_FLDtype ; _FLDreps = $_FLDreps ; _FLDtalbe = $_FLDtalbe ; _FLDname = $_FLDname ; _rep = GetAsNumber(1) ; _jsontext = $_jsontext ] ; _rep < _FLDreps + 1 ; [ _RepString = Case( _FLDreps > 1; "[" & _rep & "]" ; ""); _repMinEins = Case( _FLDreps > 1; "[" & _rep - 1 & "]" ; ""); // tbc …  // … continued _filename = Evaluate ( Case( (PatternCount ( _FLDtype; "binary") and $_includeBinaryData); _FLDtalbe &"::"& _FLDname & _RepString; "" ) ) ; _FLDvalue = Case( (PatternCount ( _FLDtype; "binary") and $_includeBinaryData and IsEmpty (Evaluate ( _FLDtalbe &"::"& _FLDname & _RepString)) ); Substitute( JSONSetElement ( "" ; ["FileData" ; "null" ; JSONNull ]; ["FileName" ; "null" ; JSONNull ] ) ;[""{"; "{"];["}""; "}"] ) ; (PatternCount ( _FLDtype; "binary") and $_includeBinaryData); Substitute( JSONSetElement ( "" ; ["FileData" ; Evaluate ( "Base64Encode( " & _FLDtalbe & "::" & _FLDname & _RepString &")" ) ; JSONString ]; ["FileName" ; _filename ; JSONString ] ) ;[""{"; "{"];["}""; "}"] ) ; Evaluate ( _FLDtalbe &"::"& _FLDname & _RepString) ) ; _jsonTYPE = Case( IsEmpty ( _FLDvalue ); "JSONNull"; PatternCount ( _FLDtype; "varchar" ); "JSONString"; PatternCount ( _FLDtype; "date" ); "JSONString"; PatternCount ( _FLDtype; "decimal" ); "JSONNumber"; (PatternCount ( _FLDtype; "binary") and $_includeBinaryData); "JSONObject"; PatternCount ( _FLDtype; "binary" ); "JSONString"; "JSONString" ); _json = JSONSetElement ( $_json ; $_FLDid &"•"&_FLDname & _repMinEins ; Case( IsEmpty ( _FLDvalue ); _FLDvalue; PatternCount ( _FLDtype; "varchar" ) ; MBS( "Text.Serialize"; _FLDvalue) ; _FLDvalue ) ; Evaluate(_jsonTYPE) ); _rep = _rep + 1 ] ; _json ) ; $_count = $_count + 1 ]; // tbc …  // … continued Let( [ §_json = $_json; $_json = ""; $_class = "" ; $_includeBinaryData = "" ; $_TO = ""; $_table = ""; $_FldList = ""; $_FLDcount = ""; $_jsontext = ""; $_count = ""; $_FLDline = ""; $_FLDclass = ""; $_FLDtype = ""; $_FLDreps = ""; $_FLDtalbe = ""; $_FLDname = "" ]; §_json ) )
  11. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu So ist das nun … • Dann haben wir verstanden, dass wir die Struktur separat auslesen können, um sie für die Datennahme wiederverwenden zu können.
  12. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu //================= // Autor: 72solutions (PAP) // 30.04.2020 // Gibt einen Datensatz als JSON Struktur // // Parameter: // [x] NormalCalculated // Values: "Normal,Calculated" | "Normal" | "Calcualted" // defines, what classes of fields should be included // // [x] FeldTyp // Values: "varchar,decimal,date" | "Normal" | "Calcualted" // defines, what classes of fields should be included// //================= Let ([ §_class = NormalCalculated ; §_Type = Lower( VarcharDecimalDate ); §_table = Substitute ( Get ( LayoutTableName ); "_oB"; ""); §_FldList = ExecuteSQL ( " SELECT DISTINCT f.BaseTableName , f.FieldName, f.FieldClass , f.FieldType, f.FieldReps,f.FieldID FROM FileMaker_BaseTableFields f WHERE f.BaseTableName = '"& §_table &"' AND f.FieldType='" & §_Type & "' AND '"& §_class &"' LIKE '%'+f.FieldClass+'%' "; "•" ; "¶" ) ; §_VarName = "$$_FldList_" & Substitute ( §_Type & §_class; ","; "" ); §_result = Evaluate ( "Let ( " & §_VarName & " = " & Quote( §_FldList) & " ; 1 ) " ) ]; §_result )
  13. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu So ist das nun … • Jetzt können wir diese Strukturinformation aus der global-Variablen wiederholt verwenden, um die Daten auszulesen.
  14. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu //================= // Autor: 72solutions (PAP) // 30.04.2020 // Gibt einen Datensatz als JSON Data // // Parameter: // [x] NormalCalculated // Values: "Normal,Calculated" | "Normal" | "Calcualted" // defines, what classes of fields should be included // // [x] FeldTyp // Values: "varchar,decimal,date" | "Normal" | "Calcualted" // defines, what classes of fields should be included// //================= While ([ $_FldList = Evaluate( "$$_FldList_" & Substitute ( VarcharDecimalDate & NormalCalculated; ","; "" ) ) ; $_TO = Case( PatternCount( Get ( LayoutTableName ); "_oB"); "ALL"; "" ) ; $_FLDcount = ValueCount ( $_FldList) ; $_jsontext = ""; $_count = 1 ]; $_count < $_FLDcount + 1 ; [ $_FLDline = Substitute ( GetValue( $_FldList; $_count ); "•"; "¶"); $_FLDclass = GetValue ($_FLDline ; 3) ; $_FLDtype = GetValue ($_FLDline ; 4) ; $_FLDreps = GetAsNumber( GetValue ($_FLDline ; 5)) ; $_FLDtalbe = GetValue ($_FLDline ; 1) & Case( $_TO = "ALL";"_oB"; "") ; $_FLDname = GetValue ($_FLDline ; 2) ; $_FLDid = Right( "0000" & GetValue ($_FLDline ; 6);4) ; // … the rest is the same as in the first CF
  15. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu So ist das nun … • Auf der Empfängerseite kalkulieren wir den Feldwert in Wiederholfeldern nach folgendem Muster (Beispiel hier das Textfeld):
  16. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Case( Extend (VirtualListChild_VirtualList::ID) > MBS( "QuickList.Count"; "Text"& Case (Length ($$uuid); "_"&$ $uuid; "") ) ; ""; Let([ §id = Extend (VirtualListChild_VirtualList::ID) - 1; §ListTyp = "Text"& Case (Length ($$uuid); "_"&$$uuid; ""); §rn = Get ( CalculationRepetitionNumber ); §json = MBS( "QuickList.GetValue"; §ListTyp; §id ) ; §jsonKeys= JSONListKeys ( MBS( "QuickList.GetValue"; §ListTyp; §id );"") ; §listCount = MBS( "QuickList.Count"; §ListTyp ) ; §key = GetValue ( §jsonKeys ; §rn ) ; §Value = Case( (§id > §listCount) ; ""; Length ( §key )<1 ; ""; GetAsText( JSONGetElement ( §json ; §key )) ) ]; Case( Length( §Value) >0; MBS( "Text.Deserialize"; §Value ); "" ) ) )
  17. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Schauen wir uns das gemeinsam an…
  18. FileMaker Konferenz | Hamburg | 22.-24. Juni 2022 Drucken über Dateigrenzen hinweg — Philipp A. Puls - Philipp A. Puls - 72solutions.eu Vielen Dank unseren Sponsoren
Publicité