REFLEX Standard-Report Ladeliste: Unterschied zwischen den Versionen

Aus GEVITAS
Wechseln zu: Navigation, Suche
(= Datei:3.png MasterKoptext)
Zeile 264: Zeile 264:
 
</code>
 
</code>
  
 
 
 
==== ChildGroupHeader1 ====
 
 
für den Text der Positionen. Ein Child-Band deshalb, weil das Band ausgeblendet wird, wenn gar kein Text angegeben wurde. Deshalb gibt es im Ereignis '''ChildGroupHeader1OnBeforePrint''' diesen Code:
 
 
<code>
 
procedure ChildGroupHeader1OnBeforePrint(Sender: TfrxComponent);
 
begin
 
  // Unterdrücken, wenn kein Zusatztext vorhanden ist:
 
  if <Positionen."TextPosition"> = '' then
 
    ChildGroupHeader1.Visible := False
 
  else
 
    ChildGroupHeader1.Visible := True;
 
end;
 
</code>
 
  
  
Zeile 295: Zeile 278:
 
   // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band
 
   // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band
 
   // ausgegeben wird.
 
   // ausgegeben wird.
 
Im Code werden Felder auf unsichtbar ("<code>Visible=False</code>") gestellt, abhängig von bestimmten Werten.
 
Weil das die Abfragen einfacher macht, werden erst einmal '''alle betroffenen''' Objekte auf '''Sichtbar''' ("<code>Visible=True</code>") gestellt:
 
 
  // Grundeinstellung: Erst mal alles einschalten, unten u.U. wieder aus:
 
  MemHeaderEinzPreis.Visible      := True;
 
  memoHeaderRabattTitel.Visible    := True;
 
  memoHeaderGesPreis.Visible      := True;
 
  memoPositionenRabattProz.Visible := True;
 
 
  memoPosEinzelPreis.Visible      := True;
 
  memoPosGesBetrag.Visible        := True;
 
 
  AuftrStatistikSummeRabatt.Visible:= True;
 
 
 
Im weiteren Verlauf werden dann einige Objekte '''wieder auf unsichtbar''' ("Visible=False") zurückgestellt, wenn es erforderlich ist.
 
 
<big>Der Code der Positionen im Einzelnen:</big>
 
 
;Wenn das Kennzeichen 3 = Einzelpreise sichtbar Ja/Nein auf "Nein" steht:
 
:Preis- und Rabattfelder ausblenden::
 
 
  // Kennzeichen 3 = Einzelpreise sichtbar Ja/Nein:
 
  if <AuftragsKopf."KENNZ3"> = 'Nein' then
 
  begin
 
    MemHeaderEinzPreis.Visible    := False;
 
    memoHeaderRabattTitel.Visible := False;
 
    memoHeaderGesPreis.Visible    := False;
 
  end;
 
 
;Wenn der Gesamtpreis 0 ist (z.B. bei 100 % Rabatt):
 
:Den Einzelpreis unterdrücken:
 
 
  // Wenn der Gesamtpreis 0 ist, den Einzelpreis unterdrücken:
 
  // (z.B. bei 100 % Rabatt)
 
  if <Positionen."GesBetrag"> = 0 then
 
  begin
 
    memoPosEinzelPreis.Visible := False;
 
    memoPositionenRabattProz.Visible := False;
 
  end;
 
 
;Titel "Rabatt" in Überschrift:
 
:Unterdrücken, wenn keine Rabatt-Postion vorhanden ist:
 
 
  // Titel "Rabatt" in Überschrift unterdrücken, wenn keine Rabatt-Postion vorhanden ist.
 
  // (Hinweis: Hinter diesem Feld liegt ein leeres Textfeld, das den Rahmen anzeigt, wenn dieses Feld unsichtbar ist!)
 
  if <AuftrStatistik."AnzahlRabattPos"> = 0 then
 
    memoHeaderRabattTitel.Visible := False;
 
 
;Hinweis:
 
*Das Programm stellt das Feld <code><AuftrStatistik."AnzahlRabattPos"></code> zur Verfügung. In diesem Feld steht die Anzahl der Positionen, die einen Rabatt beihalten. Wenn hier 0 steht, gibt es '''keine Position''' mit Rabatt!
 
 
 
;Wenn das Kennzeichen 2 = Rabatt Ja/Nein auf "Nein" steht:
 
:Rabatt in den Positionen und im Fuss unterdrücken:
 
 
  // Kennzeichen 2 = Rabatt Ja/Nein
 
  if <AuftragsKopf."KENNZ2"> = 'Nein' then
 
  begin
 
    memoHeaderRabattTitel.Visible := False;
 
    memoPositionenRabattProz.Visible := False;
 
    AuftrStatistikSummeRabatt.Visible := False;
 
  end;
 
  
  
 
;Kapitel-Position ausblenden:
 
;Kapitel-Position ausblenden:
 
:Da die Kapitel-Positionen (1.0, 2.0, 3.0 usw.) im '''Gruppenkopf''' gedruckt werden, müssen sie hier im eigentlichen Positionsbereich '''unterdrückt''' werden.  
 
:Da die Kapitel-Positionen (1.0, 2.0, 3.0 usw.) im '''Gruppenkopf''' gedruckt werden, müssen sie hier im eigentlichen Positionsbereich '''unterdrückt''' werden.  
:Außerdem können die Positionen über das Kennzeichen 6  ("nur Kapitel drucken = Ja) komplett unterdrückt werden:
+
:Außerdem sollen Dienstleistung/Arbeitszeit komplett unterdrückt werden:
  
 
   // Kapitel-Position ausblenden:
 
   // Kapitel-Position ausblenden:
 
   // Kennzeichen "Nur Kapitel" = 'Ja': Positionen unterdrücken:
 
   // Kennzeichen "Nur Kapitel" = 'Ja': Positionen unterdrücken:
 
   if ( <Positionen."PosNr"> = 0  )
 
   if ( <Positionen."PosNr"> = 0  )
   or ( <AuftragsKopf."KENNZ6"> = 'Ja' ) then
+
   or ( <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> > 2 ) then   // Dienstleistung/Arbeitszeit unterdrücken!
  begin
+
     DetailPositionen.Visible := False
     DetailPositionen.Visible := False;
 
  end
 
 
   else
 
   else
 
     DetailPositionen.Visible := True;
 
     DetailPositionen.Visible := True;
  
 
;Rabatt % unterdrücken,
 
:wenn's keinen Rabatt-Betrag gibt:
 
 
  // Rabatt % unterdrücken, wenn's keinen Rabatt-Betrag gibt:
 
  if <Positionen."RabattBetrag"> = 0 then
 
    memoPositionenRabattProz.Visible := False;
 
 
 
;Einzelpreise
 
:sichtbar abhängig vom Kennzeichen 3:
 
 
  // Einzelpreise sichtbar abhängig vom Kennzeichen 3:
 
  if <AuftragsKopf."KENNZ3"> = 'Nein' then
 
  begin
 
    memoPosEinzelPreis.Visible := False;
 
    memoPositionenRabattProz.Visible := False;
 
    memoPosGesBetrag.Visible := False;
 
  end;
 
 
;Seitenwechsel
 
:Wenn das Kennzeichen "Seitenwechsel Vorher" in einer Auftragspositionen gesetzt wurde, muss ein Seitenwechsel durchgeführt werden. Das diese Abfrage auch in der Kapitel-Überschrift drin ist, darf sie hier nur gemacht werden, wenn es eine "normale" Position ist, also die Positionsnummer größer als 0 ist (<code><Positionen."PosNr"> > 0</code>:
 
 
  // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist:
 
  if <Positionen."PosNr"> > 0 then                                  // NICHT bei Kapitel-Position, das wird da schon gemacht!
 
    if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then
 
      Engine.NewPage;                                                // Neue Seite, Seitenkopf usw. drucken
 
 
==== Optionale Codierung in den DetailPositionen ====
 
 
Im Folgenden werden Codes beschrieben, die man '''optional''' in den Positionen verwenden kann. Diese sind im Standard-Formular '''nicht''' enthalten, können aber auf Wunsch verwendet werden. Dazu können Sie die hier aufgeführten Code-Teile einfach kopieren und ans Ende von '''<code>DetailPositionenOnBeforePrint</code>''' einfügen.
 
  
 
;Formatierungen für Sets und Zubehör:
 
;Formatierungen für Sets und Zubehör:
Zeile 416: Zeile 302:
 
:Erst einmal werden alle Felder auf den Standard positioniert:
 
:Erst einmal werden alle Felder auf den Standard positioniert:
  
  // Alle Schrift-Attribute erst mal auf den Standard setzen:
+
   MemoPositionenBezeichnung.Left := 0.2 * fr1cm;
   MemoPositionenBezeichnung.Font.Style := 0;
 
  memoPosMengeAuftrag.Font.Style := 0;
 
  memoPosEinzelPreis.Font.Style := 0;
 
  memoPositionenRabattProz.Font.Style := 0;
 
  memoPosGesBetrag.Font.Style := 0;
 
 
  // Einrücken erst mal zurücksetzen:
 
  MemoPositionenBezeichnung.Left := 1.3 * fr1cm;
 
 
   MemoPositionenBezeichnung.Width := 9.2 * fr1cm;
 
   MemoPositionenBezeichnung.Width := 9.2 * fr1cm;
  RichChildDetailPositionen.Left := 1.3 * fr1cm;
 
  
 
:Die cm-Angaben (1.3 und 9.2) müssten Sie u.U. an Ihre Positionen anpassen, wenn Sie die Felder verschoben haben!
 
:Die cm-Angaben (1.3 und 9.2) müssten Sie u.U. an Ihre Positionen anpassen, wenn Sie die Felder verschoben haben!
Zeile 438: Zeile 315:
 
     MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
 
     MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
 
     MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
 
     MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
    RichChildDetailPositionen.Left := 2.3 * fr1cm;
 
 
   end;
 
   end;
  
Zeile 448: Zeile 324:
 
   end;
 
   end;
  
 +
:Dann muss man aber oben den Font auf den Standard setzen:
 +
 +
    memoPosBezeichnung.Font.Style := 0;
  
  
Zeile 456: Zeile 335:
 
   begin
 
   begin
 
     MemoPositionenBezeichnung.Font.Style := fsBold;
 
     MemoPositionenBezeichnung.Font.Style := fsBold;
    memoPosMengeAuftrag.Font.Style := fsBold;
 
    memoPosEinzelPreis.Font.Style := fsBold;
 
    memoPositionenRabattProz.Font.Style := fsBold;
 
    memoPosGesBetrag.Font.Style := fsBold;
 
 
   end;
 
   end;
  
Zeile 469: Zeile 344:
 
   begin
 
   begin
 
     MemoPositionenBezeichnung.Font.Style := fsItalic;
 
     MemoPositionenBezeichnung.Font.Style := fsItalic;
    memoPosMengeAuftrag.Font.Style := fsItalic;
 
    memoPosEinzelPreis.Font.Style := fsItalic;
 
    memoPositionenRabattProz.Font.Style := fsItalic;
 
    memoPosGesBetrag.Font.Style := fsItalic;
 
 
   end;
 
   end;
  
Zeile 481: Zeile 352:
 
     MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
 
     MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
 
     MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
 
     MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
    RichChildDetailPositionen.Left := 2.3 * fr1cm;
 
 
   end;
 
   end;
  
  
<big>Alternative Positionen im Angebot:</big>
+
<big>Alternative Positionen im Auftrag:</big>
  
;Alternativ-Positionen werden mit einem "'''*'''" markiert und zusätzlich wird der Gesamtpreis grau gedruckt.
+
;Alternativ-Positionen darf es in einem bestätigten Auftrag eigentlich nicht geben. Deshalb werden solche Positionen mit einem '''*''' markiert und zusätzlich wird im Fuss ein entsprechende Hinweis gedruckt.
:Das geht dann in <code>PositionenGesBetragOnBeforePrint</code> z.B. so:
+
:Das geht dann in <code>MemoAlternativSternOnBeforePrint</code> z.B. so:
  
  procedure PositionenGesBetragOnBeforePrint(Sender: TfrxComponent);
+
  procedure MemoAlternativSternOnBeforePrint(Sender: TfrxComponent);
 
  begin
 
  begin
   // Alternativ-Position kennzeichnen:
+
   // Markierung mit " * " nur bei Alternativ-Position anzeigen
   // (Nicht beim Kapitel, das auch das Alternativ-Kennzeichen hat!)
+
   // (und nicht beim Kapitel, das auch das Alternativ-Kennzeichen hat!)
 
   if (<Positionen."Alternativ_0_1"> = 1) and (<Positionen."PosNr"> > 0 ) then
 
   if (<Positionen."Alternativ_0_1"> = 1) and (<Positionen."PosNr"> > 0 ) then
     memoPosGesBetrag.Font.Color := clWindowFrame
+
     MemoAlternativStern.Visible := True
 
   else
 
   else
     memoPosGesBetrag.Font.Color := clWindowText;
+
     MemoAlternativStern.Visible := False;
 
  end;
 
  end;
  
 +
:Die Markierung mit '''*''' wird nur bei Alternativ-Positionen angezeigt.
  
;Die Markierung mit "'''*'''"
 
:wird nur bei Alternativ-Positionen angezeigt:
 
  
  procedure MemoAlternativSternOnBeforePrint(Sender: TfrxComponent);
+
=== [[Datei:8.png]] Abweichendes Datum ===
 +
 
 +
Wenn in einer Position ein anderes Von- oder Bis-Datum steht als im Kopf (Dispo-Von und -Bis), wird dieser Bereich eingeblendet. Dazu gibt es in '''DetailPositionenChildOnBeforePrint''' diesen Code:
 +
 
 +
  begin
 +
  // Das Band zeigt ein abweichendes Pos.Datum zum Kopf-Dispo-Datum:
 +
  DetailPositionenChild.Visible := False;
 +
  if <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> = 1 then        // Nur bei Miete!
 +
  begin
 +
    if ( <AuftragsKopf."DispoDatumVon"> <> <Positionen."DatumVon"> )
 +
    or ( <AuftragsKopf."DispoDatumBis"> <> <Positionen."DatumBis"> ) then
 +
      DetailPositionenChild.Visible := True;
 +
  end;
 +
end;
 +
 
 +
 
 +
 
 +
=== [[Datei:8.png]] Abweichendes Datum ===
 +
 
 +
Wenn in einer Position ein anderes Von- oder Bis-Datum steht als im Kopf (Dispo-Von und -Bis), wird dieser Bereich eingeblendet. Dazu gibt es in '''DetailPositionenChildOnBeforePrint''' diesen Code:
 +
 
 
  begin
 
  begin
   // Markierung mit " * " nur bei Alternativ-Position anzeigen
+
   // Das Band zeigt ein abweichendes Pos.Datum zum Kopf-Dispo-Datum:
   // (und nicht beim Kapitel, das auch das Alternativ-Kennzeichen hat!)
+
  DetailPositionenChild.Visible := False;
   if (<Positionen."Alternativ_0_1"> = 1) and (<Positionen."PosNr"> > 0 ) then
+
   if <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> = 1 then        // Nur bei Miete!
    MemoAlternativStern.Visible := True
+
   begin
   else
+
    if ( <AuftragsKopf."DispoDatumVon"> <> <Positionen."DatumVon"> )
    MemoAlternativStern.Visible := False;
+
    or ( <AuftragsKopf."DispoDatumBis"> <> <Positionen."DatumBis"> ) then
 +
      DetailPositionenChild.Visible := True;
 +
   end;
 
  end;
 
  end;
  
  
  
=== [[Datei:9.png]] Fuss: Summen, Zahlung, Text ===
 
  
In diesem Bereich werden die Summen, Zahlungskonditionen usw. angezeigt.
+
=== [[Datei:6.png]] Bestellungen zu einer Auftragsposition ===
 +
 
 +
In diesem Bereich werden die Bestellungen zu einer Auftragsposition angezeigt, falls welche vorhanden sind. Das Programm sorgt dafür, dass alle Bestellungen (unabhängig von ihrem Status) abgerufen werden, die zu einer Auftragsposition gehören.
 +
 
 +
Dazu gibt es einen Subdetail-Bereich, der sozusagen unterhalb des Detail-Bereichs liegt:
 +
 
 +
 
 +
[[Datei:Ladeliste_Standard_05_PositionsBestellungen.png]]
 +
 
 +
 
 +
* Genau genommen, ist dieser Bereich Bestandteil der Positionen, auch wenn er im Designer unten dargestellt wird.
 +
 
 +
 
 +
 
  
* Genau genommen, ist dieser Bereich Bestandteil der Positionen, weil er als Footer (Fuss) der Positionen definiert ist.
 
  
[[Datei:Standard_AngebotAuftrag_05_Fuss.png]]
 
  
  
Hier stehen die Felder aus der Tabelle '''AuftragsFuss'''
 
  
 
==== Code ====
 
==== Code ====

Version vom 23. Dezember 2015, 18:44 Uhr

1 Allgemeines

Der Report "Ladeliste_Standard_Vxx.fr3" wird für den Druck einer Ladeliste aus der Auftragsverwaltung heraus verwendet. Er unterscheidet im Design zwischen Miete und Verkauf.


1.1 Verzeichnis, Basis-Report

Der Report befindet sich im Formular-Verzeichnis "Formular\Auftrag".

Der Report verwendet den Basis-Report nicht, da die Ladeliste eher ein internes Formular ist und die Geschäftsdaten nur Platz weg nehmen.


1.2 Auftragskennzeichen

Die Auftragskennzeichen, die für Angebot/Auftrag/Rechnung benutzt werden, werden in diesem Report nicht verwendet.


2 Vorschau

In der Vorschau sieht das Formular so aus:

Ladeliste Standard 01 Vorschau.png



3 Bereiche

3.1 1.png Seitenkopf

In diesem Bereich steht der Firmenname (formlos, weil die Liste eher intern verwendet wird).

Rechts wird die Auftragsnummer in Barcode-Form angedruckt. Es wird der Barcode-Type Code-39 verwendet, der universal und nicht längenabhängig ist.

  • Barcodes können direkt im Report eingefügt werden. FastReport unterstützt alle gängigen Barcodes.
  • QR-Code kann auch verwendet werden, dazu ist jedoch eine Zusatz-Lizenz erforderlich.

Der Barcode wird auf jeder Seite wiederholt. Grund: Wenn man die Option "Jedes Kapitel auf neue Seite" verwendet, um z.B. für jedes Gewerk ein anderes Team zum laden zu schicken, wäre nur auf der ersten Seite der Auftragsnummern-Barcode drauf.

Das Feld für den Formular-Titel hat folgenden Inhalt:

[Titel] Nr. [AuftragsKopf."AuftrNr"] vom [Date]


Feld Beschreibung
[Titel] Diese Variable wird vom Programm an den Report übergeben. Der Text dazu kommt aus den Programm-Parametern. Weitere Informationen dazu
[AuftragsKopf."AuftrNr"] Hier wird die Auftragsnummer ausgegeben
[Date] In dieser Systemvariable steht das aktuelle Tagesdatum.

Alternativ dazu könnte man auch das gespeichert Druckdatum benutzen. Das Feld würde dann so aussehen:

 [Titel] Nr. [AuftragsKopf."AuftrNr"] vom [AuftragsKopf."DruckDat"]
Hinweis
Der Titel für die Folgeseiten wird über den Header der Positionen HeaderPositionen ausgegeben.

Damit dieser Bereich auf der ersten Seite unterdrückt wird, gibt es diesen Code in HeaderPositionenOnBeforePrint:

procedure HeaderPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Auf der 1. Seite unterdrücken:
  if <Page#> = 1 then
  begin
    MemoAuftrNrTitelHeaderPositionen.Visible := False;
    HeaderSeitenNummer.Visible := False;
    HeaderPositionen.Visible := False;
  end
  else
  begin
    MemoAuftrNrTitelHeaderPositionen.Visible := True;
    HeaderSeitenNummer.Visible := True;
    HeaderPositionen.Visible := True;
  end;
end;

(Eigentlich gehört dieser Bereich nicht zum Kopf sondern zum Header über den Positionen)



3.1.1 Der Bereich

Ladeliste Standard 02 Seitenkopf.png


der Bereich hat keinen Code.


3.2 Der Auftragskopf

Die folgenden Bereiche gehören alle zum Auftragskopf.

Die Bänder haben alle das Dataset AuftragsKopf. Sie gehören zum Band-Typ MasterData, werden also nur ein mal ausgegeben!

Der Kopf ist in verschiedene Bereiche eingeteilt, die teilweise unter bestimmten Umständen unterdrückt werden.

Ladeliste Standard 03 Kopf.png


3.2.1 2.png Auftragsdaten im Kopf

3.2.1.1 Kunden-Adresse, Veranstaltungs- und Projektdaten

Die Kunden-Adresse liegt im Band MasterDataKopfMiete bzw. MasterDataKopfVerkauf. Diese beiden Bänder werden wechselweise ein- bzw. ausgeschaltet.

3.2.1.2 MasterDataKopfMiete

In diesem Bereich stehen die Kopfdaten für einen Miet-Auftrag.

Deshalb muss dieser Bereich ausgeblendet werden, wenn es um einen Verkaufs-Auftrag geht.

Dazu gibt es diesen Code in MasterDataKopfMieteOnBeforePrint:

procedure MasterDataKopfMieteOnBeforePrint(Sender: TfrxComponent);
begin
  if <AuftragsKopf."Bereich_1Verkauf_2Miete_3Mietverkauf"> <> 2 then
    MasterDataKopfMiete.Visible := False  // Es ist Verkauf, also Bereich ausschalten!
  else
  begin
    MasterDataKopfMiete.Visible := True;  // Es ist Miete, also Bereich einschalten!  
  end;
end;

Wenn im Feld <AuftragsKopf."Bereich_1Verkauf_2Miete_3Mietverkauf"> (es heißt wirklich so!) 1 steht, ist es ein Verkaufs-Auftrag, bei 2 ein Miet-Auftrag, bei 3 ein Mietartikel-Verkaufen-Auftrag.



3.2.1.3 MasterDataKopfVerkauf

In diesem Bereich stehen die Kopfdaten für einen Verkaufs-Auftrag.

Deshalb muss dieser Bereich ausgeblendet werden, wenn es um einen Miet-Auftrag geht. Dazu gibt es den Code in MasterDataKopfMieteOnBeforePrint, wie oben beschrieben.


3.2.1.4 MasterDataVARaum

In diesem Bereich stehen die Veranstaltungs-Raum und -VA-Ort (Kurzname) für einen Miet-Auftrag.

Dieser Bereich soll nur gedruckt werden, wenn es einen Raum oder VA-Ort-Namen gibt. Deshalb gibt es diesen Code in MasterDataVARaumOnBeforePrint:

procedure MasterDataVARaumOnBeforePrint(Sender: TfrxComponent);
begin
  // Wenn beide Felder leer sind: Ausblenden!
  if ( <AuftragsKopf."VA-OrtKurzname"> =  ) and ( <AuftragsKopf."VA-Raum"> =  ) then
    MasterDataVARaum.Visible := False;
end;

Hinweis
Der VA-Ort-Name wird im Auftragskopf unter dem VA-Ort optional angegeben.



3.2.2 3.png MasterKoptext

In diesem Bereich stehen die Ansprechpartner-Daten des Auftrags.

Er wird immer ausgegeben und hat keine Ereignisse.

Ansprechnpartner Kunde
Die Daten kommen aus den Kontakt-Stammdaten des Kunden bzw. Ansprechpartners. Weitere Informationen.
Ansprechnpartner Auftrag
Die Daten kommen aus den Personen-Stammdaten des Auftragsbearbeiters. Weitere Informationen.

3.2.3 4.png HeaderPositionen, Überschrift über die Positionen

Dieser Bereich beinhaltet den Titel über die Positionen. Dieser wird oben im Kopf beschrieben.

Wichtig ist die Eigenschaft (rechte Maustaste auf dem Bereich) Auf neuer Seite wiederholen. Diese legt fest, dass der Header auf jeder neuen Seite oben gedruckt wird!

Der Bereich hat ein Child (Kind) mit dem Namen "ChildHeaderPositionen", in den die Überschrift über den Positionen liegt.

Weil die Überschrift nicht gedruckt werden soll, wenn es auf der neuen Seite gar keine Positionen mehr gibt, wird dieser Code in ChildHeaderPositionenOnBeforePrint verwendet:

procedure ChildHeaderPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Überschriftszeile unterdrücken, wenn keine Positionen mehr kommen:
  if DetailPositionen.DataSet.EOF then
    ChildHeaderPositionen.Visible := False
  else
    ChildHeaderPositionen.Visible := True;
end;

Weitere Hinweise dazu



3.3 5.png Positionen

Zentrales Band der Positionen ist das Band DetailPositionen. Es gehört zum Band-Typ DetailData mit den Daten aus der Tabelle Positionen. Das bedeutet, dass dieser Bereich wiederholt ausgegeben wird, bis es keine Positionsdaten mehr gibt!

Um, dieses Band herum wurden andere Bänder gelegt:

  • Ein Header ("HeaderPositionen"), der den Titel über die Positionen beinhaltet. Dieser wird oben im Kopf beschrieben.
  • Ein GroupHeader ("GroupHeaderKapitel"), der die Kapitel-Bezeichnungen beinhaltet. Das bedeutet, dass in dem Report die Gruppierungs-Funktion benutzt wird. Gruppieren bedeutet, dass die Positionen nach der Kapitel-Nummer getrennt werden. Die Kapitel-Überschrift steht im GroupHeader, die eigentlichen Positionen im Band DetailPositionen.
  • Ein Child-Band ("ChildGroupHeader1") für den Hinweis auf abweichende Daten. Ein Child-Band deshalb, weil das Band ausgeblendet wird, wenn es keine Abweichung zwischen Kopf und Positionen gibt.
  • Ein Footer ("FussPositionen"), in dem Hinweise, Unterschriftenfelder usw. stehen. Dieser Bereich wird unten unter "Fuss" behandelt.


Ladeliste Standard 04 Positionen.png



3.3.1 GroupHeaderKapitel

Beinhaltet die Kapitel-Bezeichnungen. Das bedeutet, dass in dem Report die Gruppierungs-Funktion benutzt wird. Gruppieren bedeutet, dass die Positionen nach der Kapitel-Nummer getrennt werden. Die Kapitel-Überschrift steht im GroupHeader, die eigentlichen Positionen im Band DetailPositionen.

Es gibt diese Besonderheiten:

  • Wenn die Option "Jedes Kapitel auf neue Seite" (im Drucken-Fenster) gesetzt wurde, soll ein Seitenwechsel durchgeführt werden, bevor dieser Bereich gedruckt wird.
  • Wenn in Bezeichnung das Wort "Personal" steht, soll die Kapitelüberschrift unterdrückt werden.

Deshalb gibt es im Ereignis GroupHeaderKapitelOnBeforePrint diesen Code:

procedure GroupHeaderKapitelOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird.

  // Wenn in der Kapitel-Bezeichnung irgendwo 'Personal' steht: Unterdrücken!
  // (Groß- Kleinschreibung ist egal)
  if Pos('PERSONAL',  Uppercase( <Positionen."Bezeichnung">) ) > 0 then  // Pos( SuchenNach, SuchenIn ) sucht nach Texten und bring die Position zurück oder 0.
    GroupHeaderKapitel.Visible := False
  else
    GroupHeaderKapitel.Visible := True;
  // Wenn die Option "Jedes Kapitel auf neue Seite" im Druckfenster eingeschaltet ist.
  // Aber - Nicht bei dem 1. Kapitel!
  //      - Nicht wenn der Bereich unsichtbar ist!
  if ( <KapitelNeueSeite> = 1 )
  and ( <Positionen."Kapitel">  >  1 )
  and ( GroupHeaderKapitel.Visible ) then
    Engine.NewPage;   // Neue Seite, Seitenkopf usw. drucken
end;


3.3.2 DetailPositionen

In diesem Bereich werden die eigentlichen Auftragspositionen ausgegeben.

In DetailPositionenOnBeforePrint gibt es einigen Code, der das Verhalten der Objekte dieses Bereiches beeinflusst.

Er befindet sich nach

procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band
  // ausgegeben wird.


Kapitel-Position ausblenden
Da die Kapitel-Positionen (1.0, 2.0, 3.0 usw.) im Gruppenkopf gedruckt werden, müssen sie hier im eigentlichen Positionsbereich unterdrückt werden.
Außerdem sollen Dienstleistung/Arbeitszeit komplett unterdrückt werden:
 // Kapitel-Position ausblenden:
 // Kennzeichen "Nur Kapitel" = 'Ja': Positionen unterdrücken:
 if ( <Positionen."PosNr"> = 0  )
 or ( <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> > 2 ) then    // Dienstleistung/Arbeitszeit unterdrücken!
   DetailPositionen.Visible := False
 else
   DetailPositionen.Visible := True;


Formatierungen für Sets und Zubehör
Hier werden z.B. die Feld-Schrift-Styles geändert, wenn die Position einen Haupt-Set-Artikel oder -Zubehör-Artikel beinhaltet.
Außerdem wird gezeigt, wie man die Bezeichnungs- und Text-Felder für Set-Positionen einrücken kann.
  • Wichtig: Positionsangaben im Code werden in Pixeln gemacht! Damit man Pixel einfach in cm umrechnen kann, stellt FastReport eine Funktion namens fr1cm zur Verfügung. Die Umrechnung in cm wird mit einer Formel gemacht:
  • "xxx.Left := 1.3 * fr1cm;"
Standard-Einstellungen
Erst einmal werden alle Felder auf den Standard positioniert:
 MemoPositionenBezeichnung.Left := 0.2 * fr1cm;
 MemoPositionenBezeichnung.Width := 9.2 * fr1cm;
Die cm-Angaben (1.3 und 9.2) müssten Sie u.U. an Ihre Positionen anpassen, wenn Sie die Felder verschoben haben!
  • Bitte beachten: Kommstellen im Code werden mit dem Punkt angegeben!
Set-Position
werden eingerückt, also der Wert der Left-Eigenschaft der Felder wird verändert:
 if ( <Positionen."SetNr"> > 0 ) and ( <Positionen."SetNrHauptArtikel"> =   ) then
 begin
   MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
   MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
 end;
Alternativ dazu könnte man das Feld auch kursiv darstellen:
 if ( <Positionen."SetNr"> > 0 ) and ( <Positionen."SetNrHauptArtikel"> =   ) then
 begin
   memoPosBezeichnung.Font.Style := fsItalic;
 end;
Dann muss man aber oben den Font auf den Standard setzen:
   memoPosBezeichnung.Font.Style := 0;


Zubehör-Hauptartikel
Könnten z.B. in Fettschrift dargestellt werden:
 if <Positionen."ZubehoerKennzch_1Haupt_2Unter"> = 1 then
 begin
   MemoPositionenBezeichnung.Font.Style := fsBold;
 end;


Zubehör-Unterposition
Könnten z.B. kursiv darstellen:
 if <Positionen."ZubehoerKennzch_1Haupt_2Unter"> = 2 then
 begin
   MemoPositionenBezeichnung.Font.Style := fsItalic;
 end;
Alternativ könnten die Felder auch eingerückt werden:
 if <Positionen."ZubehoerKennzch_1Haupt_2Unter"> = 2 then
 begin
   MemoPositionenBezeichnung.Left := 2.3 * fr1cm;
   MemoPositionenBezeichnung.Width := 8.2 * fr1cm;
 end;


Alternative Positionen im Auftrag:

Alternativ-Positionen darf es in einem bestätigten Auftrag eigentlich nicht geben. Deshalb werden solche Positionen mit einem * markiert und zusätzlich wird im Fuss ein entsprechende Hinweis gedruckt.
Das geht dann in MemoAlternativSternOnBeforePrint z.B. so:
procedure MemoAlternativSternOnBeforePrint(Sender: TfrxComponent);
begin
  // Markierung mit " * " nur bei Alternativ-Position anzeigen
  // (und nicht beim Kapitel, das auch das Alternativ-Kennzeichen hat!)
  if (<Positionen."Alternativ_0_1"> = 1) and (<Positionen."PosNr"> > 0 ) then
    MemoAlternativStern.Visible := True
  else
    MemoAlternativStern.Visible := False;
end;
Die Markierung mit * wird nur bei Alternativ-Positionen angezeigt.


3.4 8.png Abweichendes Datum

Wenn in einer Position ein anderes Von- oder Bis-Datum steht als im Kopf (Dispo-Von und -Bis), wird dieser Bereich eingeblendet. Dazu gibt es in DetailPositionenChildOnBeforePrint diesen Code:

begin
  // Das Band zeigt ein abweichendes Pos.Datum zum Kopf-Dispo-Datum:
  DetailPositionenChild.Visible := False;
  if <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> = 1 then        // Nur bei Miete!
  begin
    if ( <AuftragsKopf."DispoDatumVon"> <> <Positionen."DatumVon"> )
    or ( <AuftragsKopf."DispoDatumBis"> <> <Positionen."DatumBis"> ) then
      DetailPositionenChild.Visible := True;
  end;
end;


3.5 8.png Abweichendes Datum

Wenn in einer Position ein anderes Von- oder Bis-Datum steht als im Kopf (Dispo-Von und -Bis), wird dieser Bereich eingeblendet. Dazu gibt es in DetailPositionenChildOnBeforePrint diesen Code:

begin
  // Das Band zeigt ein abweichendes Pos.Datum zum Kopf-Dispo-Datum:
  DetailPositionenChild.Visible := False;
  if <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> = 1 then        // Nur bei Miete!
  begin
    if ( <AuftragsKopf."DispoDatumVon"> <> <Positionen."DatumVon"> )
    or ( <AuftragsKopf."DispoDatumBis"> <> <Positionen."DatumBis"> ) then
      DetailPositionenChild.Visible := True;
  end;
end;



3.6 6.png Bestellungen zu einer Auftragsposition

In diesem Bereich werden die Bestellungen zu einer Auftragsposition angezeigt, falls welche vorhanden sind. Das Programm sorgt dafür, dass alle Bestellungen (unabhängig von ihrem Status) abgerufen werden, die zu einer Auftragsposition gehören.

Dazu gibt es einen Subdetail-Bereich, der sozusagen unterhalb des Detail-Bereichs liegt:


Ladeliste Standard 05 PositionsBestellungen.png


  • Genau genommen, ist dieser Bereich Bestandteil der Positionen, auch wenn er im Designer unten dargestellt wird.





3.6.1 Code

Der Code hier ist überschaubar und befindet sich im Ereignis FussPositionenOnBeforePrint:

Rabattfeld
optional ausschalten:
 // Kennzeichen 2 = Rabatt Ja/Nein
 if <AuftragsKopf."KENNZ2"> = 'Nein' then
 begin
   AuftrStatistikSummeRabatt.Visible:= False;
   MemoFooterGespreis.Visible:= False;
 end;


Wenn kein Mehrwertsteuer angegeben ist
Felder ausschalten:
 // Ohne Mwst.: Mwst-Felder unterdrücken:
 if <AuftragsFuss."MwstBetrag"> = 0 then
 begin
   AuftragsFussMwstBetrag.Visible:= False;
   AuftragsFussMwstSatzProzent.Visible:= False;
   memoFussGesamtbetragText.Visible:= False;
   AuftragsFussGesamtBetragBrutto.Visible:= False;
 end;
Hinweis
Das Feld mit der Mehrwertsteuer zieht sich bis ganz nach rechts. Grund: Das Feld hat oben und unten einen Rahmen, der als Striche zwischen den Zeilen genutzt wird.


Alternative Positionen im Angebot:

In einem Angebot kann es alternative Positionen geben, die im Gesamtpreis nicht eingerechnet sind! Diese sollten irgendwie gekennzeichnet werden.

Im Standard-Formular werden diese Positionen mit einem "*" gekennzeichnet.

Im Fuss gibt es einen Hinweis, dass Alternativen im Angebot vorhanden sind. Dieser Hinweis soll natürlich nur erscheinen, wenn es im Angebot überhaupt Alternativ-Positionen gibt.

Dazu stellt das Programm in der Tabelle AuftrStatistik das Feld "AnzahlAlternativPos" zur Verfügung. Steht dort eine Zahl größer als 0, gibt es eine entsprechende Anzahl von Alternativ-Positionen im Angebot.

Hinweis auf Alternativ-Positionen
Dieser wird nur angezeigt, wenn die Anzahl der Alternativ-Positionen > 0 ist.
Das Feld AuftrStatistikAnzahlAlternativPos wird sonst unterdrückt:
procedure AuftrStatistikAnzahlAlternativPosOnBeforePrint(Sender: TfrxComponent);
begin
  // Hinweis aus Alternativ-Positionen:
  if <AuftrStatistik."AnzahlAlternativPos"> = 0 then
       AuftrStatistikAnzahlAlternativPos.Visible := False
  else
      AuftrStatistikAnzahlAlternativPos.Visible := True;
end;

4 Links