Post on 13-Jan-2015
description
transcript
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Eigene Funktionen / Custom Functions
Von den Grundlagen zufortgeschrittenen Programmiertechniken
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
• Diplom-Ingenieur der Technischen Informatik
• 6½ Jahre in den USA als IT Manager
• Seit 2006 Entwicklung mit FileMaker
• 25 Jahre Datenbankerfahrungen: Access, Oracle, MySQL, u. a.
• Hohe Aufmerksamkeit auf Usability und Design
• Regelmäßiger Autor im FileMaker Magazin
Zu meiner Person
Theoretische Betrachtungen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Eigene Funktionen• Was ist eine Funktion?
„Eine vordefinierte, benannte Formel, die eine spezielle Berechnung durchführt und einen eindeutigen einzelnen Wert liefert.“ (FileMaker Pro 11, Hilfe, Glossar)
• Wieso »Eigene« Funktion?
Es gibt drei verschiedene Gruppen von Funktionen:
‣ FileMaker Funktionen sind im Programm direkt eingebaut
‣ Externe Funktionen als Schnittstelle zu Plugins
‣ Eigene Funktionen vom Entwickler frei programmiert
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Eigene FunktionenEine Eigene Funktion …
• ist eine gespeicherte Formel
• hat keinen, einen oder mehrere Eingabewerte (Parameter)
• gibt genau einen Wert zurück
• wird wie eine normale FileMaker Funktion verwendet
• ist nur im verwendeten Modul bekannt
• kann zwischen Modulen kopiert werden
• kann in FileMaker Pro aufgerufen, aber nur mit FileMaker Pro Advanced erstellt und modifiziert werden
• kann im Zugriff beschränkt sein (Anwenderrechte)
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Aufbau einer Funktion
• Funktionsname
• Funktionsparameter
• Funktionscode
• Funktionsergebnis
NullWert( Wert; Null )Wenn( IstLeer( Wert );! Null;// Sonst! Wert)
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionsname • Der Name muss eindeutig sein
• Darf nicht länger als 100 Zeichen sein
• Darf bestimmte Zeichen nicht enthalten: + - * / ^ & = ≠ < > ≤ ≥ ( , ; ) [ ] " :: $ }
• Darf Leerzeichen enthalten
• Darf nicht mit einer Ziffer, Punkt oder Leerzeichen beginnen
• Darf nicht UND, ODER, XODER, NICHT enthalten
• Darf nicht den gleichen Namen wie eine Funktion, ein Parameter der aktuellen Funktion oder ein Schlüsselwort sein
• Vorsicht bei mehrsprachigen Arbeitsumgebungen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionsparameter• Es muss kein Parameter angegeben werden
• Der Parametername unterliegt den gleichen Beschränkungen wie der Funktionsname
• Die Reihenfolge der Parameter hat Bedeutung
• Es gibt keine optionalen Parameter, d. h. definierte Parameter müssen im Funktionsaufruf berücksichtigt werden
• Die Parameter müssen im Funktionscode nicht vorkommen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionscode und Rückgabewert• Es ist keine Programmiersprache.
• Der Code besteht aus einer einzigen Formel.
• Das Ergebnis der Formel ist der Rückgabewert der Funktion.
FileMaker Dialoge
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Dialog: Funktionen verwalten• Aufruf: Ablage > Verwalten > Eigene Funktionen…
Funktionen aus anderenModulen importieren
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Dialog: Funktionen importieren• Aufruf: Ablage > Verwalten > Eigene Funktionen… > Importieren
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionen importieren• Es werden nur Funktionen importiert, keine Bezugsobjekte, etc.
• FileMaker überwacht und „korrigiert“ Funktionen beim Import
• Es wird eine Importzusammenfassung und Protokoll erzeugt
• Gleichheit im Funktionsnamen wird durch einen Zähler ausgeglichen
• Verweise auf andere EigeneFunktionen werden zuerst aufdie gleichzeitig importiertenFunktionen angewand, sonstauf schon existierende CFs
• Bei fehlenden Verweisen wird der gesamte Code in einen Kommentar umgewandelt
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Dialog: Funktionen bearbeiten
Parameter hinzufügen
Parameter umbenennen
Parameter löschen
Programmierung von Eigenen Funktionen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Übersicht Programmierung• Kommentare
• Operatoren
• Funktionsumfang
• Variablen und deren Gültigkeitsbereiche (Scope)
• Spezielle Funktion: SetzeVars
• Fortgeschrittene Programmiertechniken‣ Funktionskapselung‣ Optionale Parameter‣ Mehrere Rückgabewerte
• Komplexe Funktionsstrukturen‣ Rekursion‣ Schleifen‣ Wechselseitiger Funktionsaufruf
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Kommentare• Zeilenkommentare
‣ Vom // bis zum Zeilenende
• Blockkommentare
‣ Vom /* bis zum entsprechenden */
‣ Kann sich über mehrere Zeilen erstrecken
‣ Blockkommentare können verschachtelt werden
• Auswertungspriotität von Zeilen- und Blockkommentaren ist abhängig von der Verarbeitungsreihenfolge
Hole( LetzteFehlerNr ) = 109 // Berechtigung fehlt
Auswahl( x; "" /* Null */; 100; 250; 333; 500; 750 )
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Operatoren• Alle bekannten Operatoren aus FileMaker
Standarddialogen können verwendet werden
• Rechenoperatoren: + - * / ^
• Textoperatoren: " " & ¶
• Klammern: ( )
• Vergleichsoperatoren: = ≠ > < ≥ ≤
• Logische Operatoren: UND ODER XODER NICHT
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionsumfang• Fast alle internen FileMaker Funktionen
‣ Ausnahme: Selbst
‣ Landesspezifische Sprache und immer Englisch
• Alle Externen Funktionen (von Plug-ins)
• Alle Eigenen Funktionen
‣ Einschließlich sich selbst (Rekursion)
• Alle Tabellenfelder, die im Modul definiert bzw. referenziert sind
‣ Keine Eingabehilfe für die Feldauswahl im Dialog
‣ Wenn Bezüge bei Funktionsaufruf nicht bestehen, dann gibt die Funktion einen Fehler zurück.
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
SetzeVars• SetzeVars erlaubt die Zusammenfassung mehrerer Ausdrücke
‣ Um wiederholte Berechnungen zu vermeiden
‣ Um Ausdrücke übersichtlicher zu strukturieren
• Mit SetzeVars können Variablen definiert werden
‣ Globale Variablen
‣ Lokale Variablen
‣ Einfache Variablen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
SetzeVars
• SetzeVars erlaubt die Deklaration von einer oder mehreren Variablen
• SetzeVars erwartet einen Ausdruck, dessen Ergebnis der Rückgabewert der Funktion ist
SetzeVars( [! $$GLOBAL = "globale Variable";! $Lokal = "lokale Variable";! _Einfach = "einfache Variable"];! "Heute ist der "! & Hole( SystemDatum ))
Variablendeklarationen
Ausdruck mit Rückgabewert
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
SetzeVars Beispiel
• Wiederholte Berechnung
• Optimierung möglich für schneller Berechnung und geringere Speicherauslastung
Wenn( HoleNtenDatensatz( Test::Ergebnis; $X ) < 1,0 ODER HoleNtenDatensatz( Test::Ergebnis; $X ) > 1,8);! "Ergebnis ausserhalb Testbereich")
SetzeVars( [! Ergebnis = HoleNtenDatensatz( Test::Ergebnis; $X )];! Wenn( Ergebnis < 1,0 ODER Ergebnis > 1,8);! ! "Ergebnis ausserhalb Testbereich"! ))
Variablen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Globale und lokale Variablen• Globale Variable: $$Variable
• Lokale Variable: $Variable
• Variablen müssen nicht definiert werden
• Variablen werden durch Wertzuweisung bekannt gemacht
• Durch Zuweisung von "" wird die Variable wieder entfernt
• Variablen können Wiederholungen haben
‣ Anzahl der Wiederholungen müssen nicht definiert werden
• Variablen können direkt in der Datenanzeige überwacht und auch verändert werden
‣ Lokale Variablen nur während der Laufzeit eines Scripts
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Einfache Variablen• Werden in SetzeVars definiert
• Müssen definiert werden, bevor sie verwendet werden
• Können keine Wiederholungen haben
• Können nur per Überwachung in der Datenanzeige dargestellt, aber nicht verändert werden
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Gültigkeitsbereich von VariablenModul A
Script 1
Script 1-1
Script 1-2
Script 2
Script 2-1
Modul B
Script 3
$$X = "global"
Globale Variablen
• Im gesamten Modul bekannt, in dem sie definiert werden
• Können überall im Modul geändert werden; neuer Wert ist im gesamten Modul sichtbar
• Unbekannt in anderen Modulen
$$X = "global"
$$X = "global"
$$X = "global"
$$X = "global"
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Gültigkeitsbereich von VariablenModul A
Script 1
Script 1-1
Script 1-2
Script 2
Script 2-1
Modul B
Script 3
$X = "lokal"
Lokale Variablen
• Nur in dem Script bekannt, in dem sie definiert werden
• Untergeordnete Scripts können eine Variable mit dem gleichen Namen definieren, ohne dadurch den Wert der anderen Variable zu verändern
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Script 1
Gültigkeitsbereich von Variablen Einfache Variablen
• Werden in der Funktion SetzeVars erstellt
• Sind nur im gleichen oder untergeordneten SetzeVars-Konstrukten bekannt
• Untergeordnete SetzeVars-Konstrukte können zeit-weilig den Wert ändern, aber der ursprüngliche Wert wird beim Verlassen wieder hergestellt
SetzeVars
SetzeVars
SetzeVars
SetzeVars
_X = "einfach"
_X = "temp"
FortgeschritteneProgrammiertechniken
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionskapselung• Aufgaben einer Funktionskapselung:
‣ Vereinfachung des Funktionsaufrufs
‣ Funktionssicherheit
• Vergleichbar mit einer Black Box
‣ Eingabewerte und Ausgabewerte sind kontrollierbar
‣ Änderungen in der Black Box dringen nicht nach außen
• Empfohlen für Externe Funktionen (Plug-ins)
‣ Wechsel des Plug-ins erfordert anderen Funktionsaufruf
‣ Neue Plug-in Version verändert die erforderlichen Parameter
‣ Standardaufruf erfordert nur wenige Parameter
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Funktionskapselung
DoSQL Plug-in • mFMb_DoSQL( sqlString {; executeOnIdle } ) • mFMb_DoSQL_SetColumnSeparator( unicodeNumber ) • mFMb_DoSQL_SetRowSeparator( unicodeNumber )
FMSQL Plug-in • qFMSQL_ExecuteSQL( Query {; ColumnSeparator_ASCIINumber ; RowSeparator_ASCIINumber } )
FileMaker Pro 12 • ExecuteSQL( sqlQuery; fieldSeparator; rowSeparator {; arguments ... } )
SQL( query )! qFMSQL_ExecuteSQL( query )
SQL( query )! qFMSQL_ExecuteSQL( query )
SQL( query )! mFMb_DoSQL( query )
SQL( query )! ExecuteSQL( query; "{Tab}"; ¶ )
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
FunktionskapselungFMSQL Plug-in • qFMSQL_ExecuteSQL( Query {; ColumnSeparator_ASCIINumber ; RowSeparator_ASCIINumber } )
SQL( query )! qFMSQL_ExecuteSQL( query )
SQL( query )Let( [! _result = qFMSQL_ExecuteSQL( query );! _error = Position( _result; "Query ERROR:"; 1; 1 ) > 0;! $$SQL.ERROR.MSG = If( _error; _result );! $$SQL.ERROR.NO = Left( _result; 7 );! $$SQL.ERROR.QUERY = If( _error; query; "" )];! If( _error; "?"; _result ))
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Optionale Parameter• Optionale Parameter müssen nicht angegeben werden
• Wenn nicht angegeben, wird intern ein Vorgabewert verwendet
• Vorteile von optionalen Parametern:
‣ Vereinfachung (kürzerer Aufruf im Standardfall)
‣ Fehlerverringerung (weniger Angaben = weniger Fehler)
‣ Flexiblere Funktionen, da vielseitiger nutzbar
• FileMaker interne Funktionen und Externe Funktionen kennen optionale Parameter, Eigene Funktionen leider nicht
FensterNamen( {Dateiname} )Wenn( Bedingung; ErgebnisWennWahr {; ErgebnisWennFalsch} )Liste( Feld {; Feld...} )Austauschen( Text; [Suche1; Ersatz1] {; [Suche2; Ersatz2]; ...} )SetzeVars( {[} Var1 = Term1 {; Var2 = Term2... ]}; Rechenanweisung )
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Optionale Paramter bei Eigenen Funktionen• Reguläre Parameter
‣ Bei Standardaufruf wird ein Leertext übergeben
• Option Parameter
‣ Ein Text übernimmt beliebig viele zusammensetzte Optionen
• Lokale oder globale Variablen
Alpha( Notwendig; {Optional} )Aufruf: Alpha( "Lorem ipsum"; _ )
Beta( Notwendig; {Optionen} )Aufruf: Beta( 475/12; "Einheit=€ Genauigkeit=2" )
Gamma( Notwendig )Aufruf: SetzeVars( $Gamma.Option = "xyz"; _ ) & Gamma( “LiLaLu” )
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Mehrere Rückgabewerte• Lokale oder globale Variablen
• Geeignete Namen wählen: z. B. $CFName.Ergebnis
• Variablen können auch Wiederholungen haben$$CF.Name[1], $$CF.Name[2], …
• Variablen sollten immer in der Funktion initialisiert werden
Rekursionen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Rekursion• Rekursion bedeutet, die Funktion ruft sich selbst auf
• Direkter oder indirekt Aufruf (Funktion A ruft Funktion B auf, die wiederum Funktion A aufruft)
• Eine Abbruchbedingung ist erforderlich, um die Rekursion abzubrechen
• FileMaker: max. insgesamt 50.000 rekursive Aufrufe max. 10.000 Aufrufe in einem Call Stack
• Rekursionen potenzieren die Möglichkeiten von Funktionen
‣ Programm- und Zahlschleifen
‣ Listen- und Kettenverarbeitungen
‣ Komplexe „Programmierungen“ innerhalb einer Funktion
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel RekursionAufgabe: Ein Text soll beliebig oft wiederholt werdenName: WiederholenParameter: Text (Text) Der zu wiederholende Text Anzahl (Zahl) Anzahl der WiederholungenRückgabe: (Text) Der wiederholte Text
Rekursion: Text ausgebenAbbruch: Nach der n-ten Wiederholung → Schleifenzähler → Initialisierung, Inkrementierung, ÜberprüfungInitialisierung: Autom. beim Funktionsaufruf (Parameterübergabe)Inkrement: Beim rekursiven Funktionsaufruf: Anzahl - 1Überprüfung: Anzahl < 1
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel RekursionWiederholen( Text; Anzahl )
• Text ist ein gültiger Variablenname
• Anzahl ist in einer deutscher Arbeitssumgebung nicht erlaubt
• In einer englischen Umgebung kann dagegen Anzahl als Parametername verwendet werden
‣ Beim Wechsel in eine deutsche Umgebung arbeitet die Eigene Funktion weiterhin korrekt
‣ Sie kann dann aber nicht mehr leicht geändert werden
• Empfehlung: Parameter und einfache Variablen sollten daher in einer Funktion immer mit einem Unterstrich beginnen
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel RekursionWiederholen( _Text; _Anzahl )
_Text & Wiederholen( _Text; _Anzahl - 1 )
• Statt einer Abbruchbedingung kann man auch eine Rekursionsbedingung schreiben
Wiederholen( _Text; _Anzahl )Wenn( _Anzahl ) < 1;! // Abbruch der Rekursion// Sonst! _Text & Wiederholen( _Text; _Anzahl - 1 ))
Wiederholen( _Text; _Anzahl )Wenn( _Anzahl ≥ 1;! _Text & Wiederholen( _Text; _Anzahl - 1 ))
Kein Abbruch
Abbruchbedingung
Rekursionsbedingung
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Endrekursion / Tail Recursion• FileMaker ist Endrekursion-optimiert
• Endrekursionen erhöhen nicht den Aufrufstapel (call stack)
• Endrekursiv bedeutet, der rekursive Funktionsaufruf ist die letzte Aktion zur Berechnung des Funktionswertes
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel Endrekursion SumN( n )
Wenn( n = 0;!0; n + SumN( n - 1 ) )
SumN(3) !SumN(3) = 3 + SumN(2)! SumN(2) = 2 + SumN(1)! ! SumN(1) = 1 + SumN(0)! ! ! SumN(0) = 0! ! SumN(1) = 1 + 0 = 1! SumN(2) = 2 + 1 = 3SumN(3) = 3 + 3 = 6
Keine Endrekursion
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel Endrekursion SumN( n )
AddSumN( 0; n )
SumN(3) !SumN(3) = AddSumN( 0; 3 ) = AddSumN( 3; 2 ) = AddSumN( 5; 1 ) = AddSumN( 6; 0 ) = 6
AddSumN( m; n )Wenn( n = 0;!m; AddSumN( m + n; n - 1 ) )
Praxisbeispiele
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Beispiel Summenfunktion SumN( n )
AddSumN( 0; n )
SumN( n )( n * ( n + 1 ) ) / 2
AddSumN( m; n )Wenn( n = 0;!m; AddSumN( m + n; n - 1 ) )
SumN( n; m )Wenn( n = 0;! m;// Sonst! SumN( n - 1; GetAsNumber( m ) + n ))
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustom Functions / Eigene Funktionen
Die einfachste Eigene Funktion
• Die einfachste Funktion besteht aus einem einzigen Zeichen
• Der Name ist notwendig; der Unterstrich gehört zu den erlaubten Zeichen
• Kein Parameter erforderlich
• Kein Funktionscode erforderlich
• Der Rückgabewert der Funktion: eine leere Zeichenfolge
• Einsatzgebiete dieser Funktion:‣ Als Platzhalter für „optionale“ Funktionsparameter‣ Erleichterung im Einsatz mit FileMaker Funktion Berechne
_( )
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustomer Functions / Eigene Funktionen
Vielen Dank für Ihre Aufmerksamkeit
FileMaker Konferenz 2012 Salzburgwww.filemaker-konferenz.com
Dipl.-Ing. Arnold KegebeinCustomer Functions / Eigene Funktionen
Vielen Dank unseren Sponsoren
Danke für das Bewerten dieses Vortrages