Programmierung

Druck-Objekte (Teil I)

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 Kommentare

7 Kommentare “Druck-Objekte (Teil I)”

  1. @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.

  2. @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

  3. @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.

  4. 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.

Kommentar abgeben