How-to: Speichern von Projektdateien in einer Datenbank

Der folgende Artikel beschreibt, wie man vorgeht, wenn Berichtsdefinitionen nicht in einer Datei, sondern in einer Datenbank gespeichert werden sollen.

Verwendung der .NET-Komponente

Ab Version 22

Seit Version 22 von List & Label steht eine Programmierschnittstelle zur Verfügung, die ein virtuelles Dateisystem, genannt Repository, simuliert und vollständig streambasiert arbeitet. Es unterstützt auch die Verwendung von Dateien, die mit einer Projektdatei verbunden sind, wie z. B. Drilldown-Berichte, beliebige dateibasierte Objekte wie Bilder oder PDF-Dokumente, Bausteine usw. und ist besonders für den Einsatz von List & Label in Web-Anwendungen zu empfehlen. Weitere Details finden sich im Artikel Verwenden des Repository-Modes der .NET-Hilfe.

Ab Version 16

Ab der Version 16 von List & Label konnten bereits Stream-Objekte für die Methoden .Design() und .Print() verwendet werden, um darüber Projektdateien zu nutzen. Während der Designzeit werden dabei die Menüpunkte Datei > Neu, Datei > Öffnen und Datei > Speichern unter automatisch deaktiviert. Daher sind keine zusätzlichen Aufrufe von ProhibitAction notwendig. Und wenn die DOM-API verwendet wird, können dort auch Stream-Objekte verwendet werden. Damit ist es nicht mehr notwendig, Projektdateien aus der Datenbank temporär ins Dateisystem zu “puffern”. Weitere Informationen und bekannte Einschränkungen dazu finden sich in der .NET-Hilfe unter Projektdateien in Datenbank halten. Achtung: diese Variante unterstützt keine abhängigen Dateien.

Verwendung mit anderen Komponenten oder der nativen API

Grundsätzlich verwendet List & Label immer eine Datei zum Lesen oder Schreiben des Berichts. Dieser Dateiname wird an die entsprechenden Methoden übergeben, die für den Aufruf des Designers zur Erstellung/Änderung von Berichten zuständig sind, sowie an die Methoden, die für den Ausdruck verantwortlich sind. Zwei Beispiele sind LlDefineLayout() und LlPrintWithBoxStart().

Wenn also ein Bericht aus einer Datenbank abgerufen werden soll, muss eine temporäre Datei erstellt werden, in der die Berichtsinformationen gespeichert werden können (die aus einem BLOB- oder MEMO-Feld gelesen werden).

Das bedeutet, dass die Anwendung zunächst alle verfügbaren Berichte in einer Liste anbietet und dem Anwender:in die Wahl lassen muss, welcher Bericht verwendet werden soll. Nennen wir diesen Dialog Berichtsauswahldialog. Danach erstellt die Anwendung eine temporäre Datei mit dem Inhalt des ausgewählten Berichts.

Nun muss aber noch verhindert werden, dass der Designer diesen temporären Dateinamen in seiner Titelleiste anzeigt (was nicht nur ärgerlich wäre, sondern auch ziemlich unprofessionell aussehen würde). Dies kann erreicht werden, indem der Parameter für den Projekttyp von LlDefineLayout() mit LL_NONAMEINTITLE “ODER”-verknüpft wird.

Außerdem muss vermieden werden, dass die Menüpunkte Öffnen, Neu und Speichern unter verwendet werden können, da dies dazu führen würde, dass das Ergebnis im Designer nicht in unserer temporären Datei gespeichert werden würde.

Dies kann durch Ausblenden der Menüpunkte mittels LlDesignerProhibitAction() vor dem Starten des Designers erreicht werden:

...
// hide/disable menu items
::LlDesignerProhibitAction(hJob, 524);
::LlDesignerProhibitAction(hJob, 519);
::LlDesignerProhibitAction(hJob, 515);

// start/open the Designer
::LlDefineLayout(
				hJob, 
				hWnd, 
				"Designer", 
				LL_PROJECT_LIST | LL_NONAMEINTITLE , 
				szTempFile
				);
...

Nach dem Schließen des Designers muss dann nur noch die temporäre Datei berücksichtigt werden und deren Inhalt in die Datenbank übertragen werden. Dann kann die temporäre Datei abschließend gelöscht werden.

Sie können auch die Erstellung neuer Berichte erlauben:

  • Der Berichtsauswahldialog erhält einen zusätzlichen Eintrag/Schaltfläche Neuer Bericht in seiner Liste der Berichte. Dabei erstellt die Anwendung dann einen temporären, nicht vorhandenen Dateinamen (ohne die Datei selbst zu erstellen) und verwendet den oben gezeigten Code.

  • Wenn die Anwender:innen in der Lage sein sollen, neue Berichte zu erstellen, bei dem bestehende Berichte als Vorlage verwendet werden, könnte auch noch ein Eintrag/Schaltfläche Neuer Bericht aus Vorlage... ergänzt werden.

Hinweis: Der Designer speichert automatisch den Dateinamen des zuletzt gespeicherten Berichts in der Registry unter HKEY_CURRENT_USER\Software\combit\cmbtll\<Modulname>\LastFile (wobei <Modulname> dem Modulnamen der Anwendung entspricht). Dies kann sehr nützlich sein, wenn die/der Anwender:in die Möglichkeit haben soll Speichern unter zu wählen, aber diese Datei dann anschließend verarbeitet werden soll.