CONZEPT 16 bietet dem Entwickler eine Auswahl an verschiedenen Objekten für die Druckaufbereitung. Welches der Objekte zum Einsatz kommt, hängt im Wesentlichen von der Aufgabenstellung ab. In einer mehrteiligen Artikelserie wollen wir die Druck-Objekte vorstellen. Der erste Artikel beschäftigt sich mit dem Objekt PrintDocRecord.
Aufbau
Das PrintDocRord-Objekt ist für eine Ausgabe von Datensätzen in Tabellenform konzipiert. Ähnlich der Oberflächen-Objekte für die Listendarstellung, besteht das Objekt aus Zeilen und Spalten. Für eine variable Druckausgabe ist das PrintDocRord-Objekt in unterschiedliche Bereiche untergliedert:
- Tabellenkopf
Die Ausgabe des Tabellenkopfs erfolgt während des Druckens einmalig vor der Ausgabe aller anderen Bereiche - Seitenkopf
Die Ausgabe des Seitenkopf-Bereiches erfolgt während des Druckvorgangs auf jeder Seite vor der Ausgabe des Datenkopfes. - Datenkopf
Die Ausgabe des Datenkopf-Bereiches erfolgt während des Druckvorgangs vor der Ausgabe der Datenbereiche für die aktuelle Seite - Tabellenfuß
Der Tabellenfuß wird am Ende der Tabelle gedruckt. Der Ausdruck erfolgt nach dem Seitenfuß der letzten Seite. - Seitenfuß
Die Ausgabe des Seitenfuß-Bereiches erfolgt während des Druckvorgangs auf jeder Seite nach der Ausgabe der Datenbereiche für die Seite und des Datenfuß-Bereiches - Datenfuß
Die Ausgabe des Datenfuß-Bereiches erfolgt während des Druckvorgangs nach der Ausgabe der Datenbereiche für die aktuelle Seite - Datenbereich
Der Datenbereich enthält die Referenz auf die zu druckenden Datenbankfelder. Für jeden zu druckenden Datensatz wird automatisch eine Instanz des Datenbereichs erzeugt
Die Definition der Tabellen-Bereiche ist optional. Als Minimum muss der Datenbereich für die Datensatzausgabe vorhanden sein.
Nachfolgendes Bild zeigt den Entwurfsmodus eines PrintDocRecord
-Objekts bestehend aus den drei Tabellenbereichen Tabellenkopf (HdrTable) ,Seitenkopf (HdrPage) sowie den Datenbereich (Data).
Verarbeitung
Analog zu den Objekten RecList und RecView werden die auszugebenden Daten über die Eigenschaften ppDbFileNo
und ppDbLinkFileNo
bestimmt. Die Sortierung erfolgt über die Eigenschaft ppDbKeyNo
.
Um eine Liste aller Datensätze einer Tabelle auszugeben, muss das PrintDocRecord-Objekt lediglich geladen und gedruckt werden.
ErrTryCatch(_ErrHdlInvalid,true);
try
{
// Druckjob anlegen
tJob # PrtJobOpen('MyPrintDocRecord','',
_PrtJobOpenWrite |
_PrtJobOpenTemp,
_PrtTypePrintDocRecord);
// Druckjob schreiben
tJob->PrtJobWrite(_PrtJobDoc);
// Druckjob an den Drucker senden
tJob->PrtJobClose(_PrtJobPrint);
}
...
...
Das Lesen der Datensätze erfolgt automatisch und muss nicht vom Entwickler vorgenommen werden. Weiterhin besteht die Möglichkeit die Datensätze auf Basis einer Selektion oder eines Filters einzuschränken. Hierfür stehen die Eigenschaften ppDbSelection
und ppDbFilter
zur Verfügung.
Selektion
ErrTryCatch(_ErrHdlInvalid,true);
try
{
// Druckjob anlegen
tJob # PrtJobOpen('Tabelle','',
_PrtJobOpenWrite |
_PrtJobOpenTemp,
_PrtTypePrintDocRecord);
// PrintDocRecord-Objekt ermitteln
tObj # tJob->PrtInfo(_PrtFirst);
// Selektion lesen
tSelection->SelRead(tObj->ppDbfileNo,_SelLock,'MYSEL');
// Selektions-Handle übergeben
tObj->ppDbSelection # tSelection;
// Druckjob schreiben
tJob->PrtJobWrite(_PrtJobDoc);
// Druckjob an den Drucker senden
tJob->PrtJobClose(_PrtJobPrint);
}
...
...
Filter
ErrTryCatch(_ErrHdlInvalid,true);
try
{
// Druckjob anlegen
tJob # PrtJobOpen('Tabelle','',
_PrtJobOpenWrite |
_PrtJobOpenTemp,
_PrtTypePrintDocRecord);
// PrintDocRecord-Objekt ermitteln
tObj # tJob->PrtInfo(_PrtFirst);
// Filterkriterien definieren
tFilter # RecFilterCreate(tObj->ppDbfileNo,tObj->ppDbKeyNo);
tFilter->RecFilterAdd(1,_FltAND,_FltAboveEq,20030);
tFilter->RecFilterAdd(1,_FltAND,_FltBelowEq,20040);
// Filter-Handle übergeben
tObj->ppDbFilter # tFilter;
// Druckjob schreiben
tJob->PrtJobWrite(_PrtJobDoc);
// Druckjob an den Drucker senden
tJob->PrtJobClose(_PrtJobPrint);
}
...
...
Fazit
Das PrintDocRecord-Objekt eignet sich hervorragend für die schnelle Erstellung von Drucklisten und Reports. Der Aufwand seitens der Programmierung ist minimal.
7 Antworten
@Andreas
Danke, das ist somit wirklich eine gute Möglichkeit um einfach und schnell eine Übersichtsliste zu generieren.
Ich freue mich schon auf die Fortsetzung der Reihe.
@Klaus
Die einzelnen Datenbereiche können auch mehrzeilig sein. Die Vorgehensweise sieht wie folgt aus:
1)
Selektieren eines Zell-Objekts (PrtTblCell )
2)
Im Kontextmenü die Option "Selektion auf Zeile erweitern" anwählen. Es werden alle Spalten selektiert.
3)
Im Kontextmenü die Option "Zeile duplizieren" anwählen.
@Florian
Danke für den Hinweis zum Zeilenumbruch mit wpWordBreak. Ich habe mich aber unklar ausgedrückt. Eigentlich wollte ich wissen, ob mehrere Felder untereinander ausgeben werden können, was dann auch eine mehrzeilige Überschrift (Kopfbereich) erforderlich machen würde.
Bsp.
Zeile 1 : Firmenbezeichnung Strasse Plz Ort
Zeile 2 : email-Adresse Telefon Telefax
@Klaus
Vielen Dank für den Hinweis bezüglich der Beschreibung des Aufbaus. Wir haben dies korrigiert.
@Klaus:
Für einfache Zeilenumbrüche innerhalb einer Zelle genügt die Eigenschaft wpWordBreak bei einer Zelle zu setzen. Die Zeile wird dann automatisch höher, wenn ein Umbruch nötig ist.
@Th.Eichele:
Das PrintDocRecord-Objekt ist auf die reine und weitestgehened unveränderte Ausgabe von Datensätzen ausgelegt.
Für individuellere Darstellung können Sie aber das PrintFormList-Objekt verwenden und damit die Ausgabe selbst programmieren, müssen aber auch die Zeilen selbst hinzufügen und füllen.
Gibt es eine Möglichkeit Daten aus anderen Quellen mit auszudrucken ? (z.B. Klartext zu Kennziffer, Rechenfelder, Texte)
Also quasi ein DataInit
ein gutes Instrument um eine schnelle, einfache Liste zu erstellen.
Kann man damit aber auch mehrzeilige Datenbereiche realisieren ?
Übrigens ist in der Beschreibung des Aufbaus die Erläuterung vom Tabellenfuß und vom Datenfuß identisch und sollte korrigiert werden.