REFLEX Standard-Report Ladeliste
Inhaltsverzeichnis
- 1 Allgemeines
- 2 Vorschau
- 3 Bereiche
- 4 Updates
- 5 Standard-Reports
- 6 Links
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\Ladeliste". Hinweis: Die Ladeliste wird in REFLEX in der Auftragsverwaltung mit dem Button Ladeliste (Umsch-F12) gedruckt, ein Angebot oder Auftrag aber mit dem Button Drucken (F12)!
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.
1.3 Sortierung
Eine Ladeliste wird standardmäßig sortiert nach der Option, die man im Druckprogramm eingestellt hat. Wenn man mehrere Ladelisten benutzt (z.B. eine nach Kapiteln sortiert und eine nach Lagerorten), muss man darauf achten, dass die Sortieren nach-Option zu dem ausgewählten Report passt. Damit die Sache etwas komfortabler wird, stellt das Druckprogramm die Sortieren nach-Option automatisch ein, wenn der Report-Name bestimmte Begriffe beinhaltet:
Begriff | Sortiert wird nach | Beispiel |
---|---|---|
"Kapitel" | Kapitel- und Positionssnummer aufsteigend. | Ladeliste_Kapitel_V09.fr3 |
"Lagerort" oder "StorageLocation" | Lagerort aufsteigend. Hinweis: Der Lagerort ist ein alphanumerisches Textfeld, also wird nach Buchstaben und Zahlen sortiert. Bitte auf eine einheitliche Schreibweise der Lagerort achten! Der Lagerort "C 5-1-01" (mit Leertaste) kommt vor dem Lagerort "C1-1-01" (ohne Leertaste)! | Ladeliste_Lagerort_V09.fr3
PackingList_StorageLocation_V09.fr3 |
Groß- und Kleinschreibung ist dabei nicht relevant.
2 Vorschau
In der Vorschau sieht das Formular so aus:
3 Bereiche
3.1 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
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.
3.2.1 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 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 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;
3.3 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.
3.3.1 Mengenfelder in den Positionen einer Packliste/Ladeliste
Für die Positionen bietet das Programm diese Mengenfelder an:
Feldname im Report (Positionen."xxx") | Beschreibung | Feld(er) in der Datenbank |
---|---|---|
Menge | Auftragsmenge lt. Auftragsposition | AUFTRMENGE |
MengeReserve | Reserve-Menge | RESERVEMENGE |
MengeFremd | Fremd-Menge | FREMDMENGE |
MengeAusgegeben | Menge derzeit ausgegeben | AKTAUSGMENGE |
MengeZurueck | Menge wieder zurückgebucht | BISHRUECKMENGE |
AusgabeMenge | Menge, die aktuell noch auszugeben ist. Für eine Packliste/Ladeliste ist das die richtige Menge in den Positionen! | AUFTRMENGE + RESERVEMENGE - AKTAUSGMENGE - BISHRUECKMENGE - AUSGFREMDMENGE |
MengeAusgegebenFremd | Menge ausgegeben Fremd | AUSGFREMDMENGE |
MengeRueckhol | Rückholmenge für das spezielle Modul "Langzeit-Miete" | RUECKHOLMENGE |
MengeRueckholZurueck | Menge Rückholung schon zurück für das spezielle Modul "Langzeit-Miete" | RUECKHOLZURUECK |
MengeFremdZurueck | Fremd-Menge zurückgebucht | BISHRUECKFREMDMENGE |
AbholMenge | Menge die (noch) vom Kunden abgeholt werden muss. | AKTAUSGMENGE - BISHRUECKMENGE + AUSGFREMDMENGE - BISHRUECKFREMDMENGE |
OriginalMenge | Für Modul "LagerLogistik" und das Modul "System-Boxen" (jeweils für andere Zwecke) | ORIGINALMENGE |
MengePackliste | Feld "Packlistenmenge" als Lagermenge verwenden. False=Konzernmenge (MultiLager) | PACKLISTMENGE |
ZentralLagerMenge | Für Modul "LagerLogistik" | ZentralLagerMenge |
KapitelAusgabeMenge | Enthält die Summe der AusgabeMenge des gesamten Kapitels. Kann z.B. verwendet werden, um eine Kapitelüberschrift zu unterdrücken, wenn in dem Kapitel gar nichts mehr auszugeben ist. | KapitelAusgabeMenge |
3.3.2 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.3 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.
3.3.3.1 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;
3.3.3.2 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;"
- Wichtig: Positionsangaben im Code werden in Pixeln gemacht! Damit man Pixel einfach in cm umrechnen kann, stellt FastReport eine Funktion namens
- 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!
3.3.3.3 Set-Position
werden eingerückt, also der Wert der Left-Eigenschaft der Felder wird verändert: Genau genommen muss man die Breite der Felder auch verändern:
- In jeder Position des Sets steht in in dem Feld STLISTKENNZ (im Report <Positionen."SetNr">) die Set-Nummer.
- Allerdings steht in der ERSTEN Position des Sets (also dem Häuptling) noch zusätzlich in dem Feld STLISTE <Positionen."SetNrHauptArtikel"> die Set-Nummer (aber in der übrigen Set-Positionen NICHT).
- So kann man der Häuptling ausmachen!
if ( <Positionen."SetNr"> > 0 ) and ( <Positionen."SetNrHauptArtikel"> = '' ) then begin MemoPositionenBezeichnung.Left := 2.3 * fr1cm; MemoPositionenBezeichnung.Width := 8.2 * fr1cm; end else begin MemoPositionenBezeichnung.Left := 1.3 * fr1cm; MemoPositionenBezeichnung.Width := 7.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;
3.3.3.4 Zubehör-Hauptartikel
- Könnten z.B. in Fettschrift dargestellt werden:
if <Positionen."ZubehoerKennzch_1Haupt_2Unter"> = 1 then begin MemoPositionenBezeichnung.Font.Style := fsBold; end;
3.3.3.5 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;
3.3.3.6 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.3.4 Optionen für die Positionen
3.3.4.1 Barcode von Mengenartikeln
Wenn auf der Ladeliste Barcodes drucken will, mit dessen Hilfe Mengenartikel per Barcode-Scanner erfasst werden können, stellt das Programm für jede Auftragsposition in der Tabelle "Positionen" das Feld "BarcodeNrMengenartikel" zur Verfügung (ab Rel. 160226). Dieses Feld ist der "Dummy-Eintrag" einer Inventarnummer in den Einzelartikel-Stammdaten (physisch das Feld "MArtEinz.InventarNr") mit der "LfdNr" = 1!
Beispiel:
Der Report-Abschnitt dazu:
Zum Unterdrücken des Barcodes beim Einzelartikeln und Nicht-Mietartikeln kann man diesen Code verwenden:
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent); begin // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band // ausgegeben wird. // Barcode nur für Miet-Mengenartikel: BarCodeMengenArtikel.Visible := ( <Positionen."Artikelart_1MT_2VK_3DL_4AZ"> = 1 ) and (<Positionen."Artikel_Einzelartikel"> = 0); end;
3.4 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:
Die Tabelle BestellPositionen stellt folgende Felder aus der Bestell-Position und dm zugehörigen Bestell-Kopf zur Verfügung:
3.5 Inhalt von Paket-Sets
Wenn zu einem Artikel in einer Position ein Inhalt von Paket-Set vorhanden ist, kann man die Inhalt von Paket-Set-Positionen auflisten.
Dazu gibt es einen Subdetail-Bereich, der sozusagen unterhalb des Detail-Bereichs liegt:
Die Tabelle StListenPakete stellt folgende Felder aus der Bestell-Position und dm zugehörigen Bestell-Kopf zur Verfügung:
3.6 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;
Alternative Positionen im Auftragt:
In einem Auftrag sollte es eigentlich keine alternativen Positionen mehr geben. Wenn doch, sollte ein Warnhinweis ausgegeben werden.
Im Standard-Formular werden diese Positionen mit einem "*" gekennzeichnet.
Im Fuss gibt es einen Hinweis, dass Alternativen vorhanden sind. Dieser Hinweis soll natürlich nur erscheinen, wenn es ü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;
3.7 Fuss
Im Fuss steht eine Tabelle zur händischen Erfassung der Tätigkeiten:
4 Updates
Version | Datum | Beschreibung |
---|---|---|