+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Howto: Reportdefinitionen in einer Datenbank halten

(combit Team) #1
Gilt ab List & Label 7
Folgender Artikel beschreibt die notwendige Vorgehensweise, um Reportdateien (also Etiketten-, Karteikarten- und Listenprojekte) nicht auf Dateibasis sondern in einer Datenbank zu speichern.

Grundlage für den Druck mit List & Label ist immer eine Reportdefinition in Form einer Datei. Diese Datei wird sowohl beim Aufruf des Designers zur Gestaltung von Reports als und auch beim eigtl. Druckvorgang an List & Label bei den entsprechenden Funktions-/Methodenaufrufen übergeben, stellvertretend seien hier LlDefineLayout() und LlPrintWithBoxStart() genannt.

Tipp für die .NET Komponente:
Seit der Version 16 von List & Label können Sie Reportdefinitionen mit Hilfe der .NET-Komponente auch direkt als Stream-Objekt für die Methoden '.Design()' und '.Print()' im datengebundenen Modus verwenden. Für den Design-Aufruf werden automatisch die Menüpunkte 'Datei > Öffnen', 'Datei > Speichern unter' sowie 'Datei > Neu' deaktiviert, so dass die Aufrufe von ProhibitAction nicht notwendig sind. Und wenn Sie mit der DOM-API arbeiten, können Sie auch hier als Reportdefinition ein Stream-Objekt verwenden. So ist es nicht mehr notwendig eine Reportdefinition aus einer Datenbank temporär zwischenzuspeichern, um diese auf Dateibasis verwenden zu können. Weitere Informationen dazu können Sie der mitinstallierten .NET Hilfe entnehmen.

Soll die Reportdefinition nun aus einer Datenbank kommen, so müssen wir also zunächst eine temporäre Datei erzeugen, in welcher wir die Reportinformation aus der Datenbank (dort wird sie vmtl. in einem BLOB- oder einem MEMO-Feld hinterlegt sein) hineinschreiben.

Das heisst, zunächst muss Ihre Anwendung dem Endanwender eine Liste der verfügbaren Reports anbieten, nennen wir ihn "Reportauswahldialog". Anschliessend erstellt Ihre Anwendung eine temporäre Datei mit dem ausgewählten Reportinhalt.

Um zu verhindern, dass der Designer nun Namen und Pfad dieser temporären Datei in seiner Titelzeile anzeigt (was nicht nur verwirrend sondern auch extrem unschön aussehen würde) müssen Sie beim Aufruf von LlDefineLayout() den Parameter für den Reporttyp (also bspw. LL_PROJECT_LIST) noch mit dem Wert LL_NONAMEINTITLE verODERn.

Desweiteren müssen wir verhindern, dass der Anwender im Designer über 'Öffnen', 'Neu' und 'Speichern unter' das Ergebnis seiner Änderungen nicht wieder in genau diese temporäre Datei sondern in eine andere speichert.

Dies erreichen wir durch Ausblenden dieser Menüpunkte per LlDesignerProhibitAction() bevor wir den Designer starten:
//"Datei > Neu" deaktivieren
LlDesignerProhibitAction(hJob, 524);
//"Datei > Öffnen" deaktivieren
LlDesignerProhibitAction(hJob, 519);
//"Datei > Speichern unter" deaktivieren
LlDesignerProhibitAction(hJob, 515);
LlDefineLayout(hJob, hWnd, "Designer", LL_PROJECT_LIST | LL_NONAMEINTITLE , szTempFile);


Nachdem der Designer geschlossen wurde, müssen wir nur noch die temporäre Datei in die Datenbank übertragen und danach löschen.

Sie können dem Benutzer auch das Anlegen neuer Reports erlauben:

Der “Reportauswahldialog” bekommt hierfür einen Eintrag “Neuer Report”, worauf Ihre Anwendung ein temporären Dateinamen generiert. Ansonsten verwenden Sie ebenfalls oben gezeigten Code und übergeben den temporären Dateinamen (ohne dass es die Datei bereits physikalisch gibt) dann bei LlDefineLayout().

Wenn der Anwender einen bestehender Report “als Vorlage” verwenden können soll, dann müsste dies der “Reportauswahldialog” noch nachbilden: "Neuer Report basierend auf…"

Tipp: Im Registry-Eintrag HKEY_CURRENT_USER\Software\combit\cmbtll<Modulname>\LastFile hinterlegt der Designer automatisch den Dateinamen der zuletzt abgespeicherten Reportdatei. entspricht dabei dem Dateinamen Ihrer Applikation. Dies ist dann hilfreich, wenn Sie ‘Speichern unter’ erlauben und dennoch hinterher die Reportdatei weiterverarbeiten möchten.

IDKBTD000592 KBTD000592