===== Formularsteuerung mit Datenbank ===== ==== Anforderung ==== Für manche Anwendungen wäre es wünschenswert, wenn das Verhalten von (p2f) mittels einer meist bereits vorhandenen Datenbank beeinflusst werden könnte. Typisches Beispiel sind etwa kundenspezifische Formulare, die irgendwelche Besonderheiten des Kunden reflektieren und damit auch mehr Kundennähe signalisieren. Zum einen ist es natürlich möglich, die Zuordnung bestimmter Formulare zu bestimmten Kunden im (p2f)-System durch Formulierung entsprechender Bedingungen für das Einbinden von Formularen zu lösen. Diese Vorgehensweise gerät aber schnell an ihre Grenzen, wenn die Zahl der unterschiedlichen Formulare und/oder Kunden grösser wird. Hier wäre ein alternativer Lösungsansatz der, die Zuordnung von Kunden zu Formularen in einer Datenbank ausserhalb von (p2f) unterzubringen. \\ \\ ==== Realisierung ==== Der Zugriff auf externe Datenbanken ist in (p2f) innerhalb eines Formulares mittels sogenannter ODBC-Anfragefelder möglich. ODBC steht für 'Open Database Connectivity' und beschreibt eine normierte Datenbankschnittstelle. Im Windows-System können solche ODBC-Schnittstellen angelegt werden. Wie dies geht, ist in vielen Quellen beschrieben und soll deshalb hier nicht wiederholt werden. Für (p2f) ist lediglich wichtig, dass die Schnittstelle als //System-DSN// eingetragen werden muss, weil die (p2f)-Komponenten als Dienste laufen und sonst nicht auf die Schnittstelle zugreifen könnten. Hier soll angenommen werden, dass in der Datenbank eine Tabelle mit dem Namen 'Adressen' existiert, deren Datensätze ein Feld 'Debitor' für die Kundennummer und ein Feld 'Formular' mit dem Namen des zu verwendenden Formulars enthalten. \\ \\ Für die Realisation der Anforderung werden im (p2f)-Formular nur zwei Felder benötigt: * Ein ODBC-Anfragefeld, das die Kundennummer aus den Nutzdaten heraussucht und mittels einer SQL-Anweisung in der Datenbank den Namen des zu verwendenden Formulars ermittelt. Dieses ODBC-Anfragefeld soll den Namen ''Formularanfrage'' haben'. * Ein Ressourcefeld, was mit dem Formularnamen aus dem Ressourcen-Container die Druckdaten für das gewünschte Formular ausliest und druckt. Dieses Feld soll den Namen ''Formular'' haben. \\ \\ {{print2forms:tips:0015-1.png}} Das Entscheidende ist die SQL-Anweisung im ODBC-Anfragefeld. Die Referenz auf das Ergebnis der Feldauswahl wird durch ''%%\%%Formularauswahl:1'' erreicht. Statt dieser Referenz wird die jeweils gefundene Kundenummer in die Schablone eingesetzt und es ergibt sich eine vollständige, jetzt syntaktisch richtige SQL-Anweisung. SELECT Formular FROM Adressen WHERE Debitor = \Formularanfrage:1 Das Ergebnis dieser SQL-Anweisung steht jetzt unter dem Namen des ODBC-Anfragefeldes zur Verfügung. Im Ressourcefeld ''Formular'' wird das Ergebnis der SQL-Anweisung als Name einer Ressource verwendet. \\ \\ ~~NOCACHE~~ Nur ein wenig komplizierter wird es, wenn in der Datenbank nur bei den Kunden ein Formularname hinterlegt ist, die eine Sonderbehandlung verlangen. Dann muss ein quasi Standardformular für alle die Kunden verwendet werden, bei denen das Datenbankfeld leer ist. Dies lässt sich mit folgender Variante der SQL-Anweisung erreichen, bei der unterstellt wird, dass 'Standard' der Name des Standardformulars ist. SELECT IFNULL( (SELECT Formular FROM Adressen WHERE Debitor = \Formularanfrage:1), "Standard") FROM Adressen LIMIT 1 \\ ==== Bemerkungen ==== * Eine Besonderheit bei der Referenzierung der Ergebnisse von HTTP- und ODBC-Anfragefeldern innerhalb von Schablonen ist die Verwendung des Zeichens ''%%~%%'' statt ''%%\%%''. Diese Unterscheidung ist wichtig, weil ja eine Referenz mit ''%%\%%'' das Ergebnis der (gleichnamigen) Feldauswahl liefert. Deshalb wird hier einmal ''%%\%%Formularanfrage:1'' und einmal ''~Formularanfrage:1'' verwendet.