[gelöst?] Excel Ausgabe Puffer Problem

23. Januar 2012 15:17

Im ExcelBuffer (Record auf ExcelBuffer) werden Werte gespeichert die zum Schluss nach Excel übergeben werden.

Bisher hatte ich immer nur Berichte auf denen die Zuordnung der Felder und Überschriften auf einem DataItem stattfanden. Jetzt habe ich einen Bericht mit 3 DataItems.
Auf dem 1. DataItem erzeuge ich mit
Code:

Job - OnPreDataItem()
RhePic.GET;
RhePic.CALCFIELDS(Picture);

Job.SETFILTER("Order Type Code",'Maschine');
Job.SETFILTER(Status,'Auftrag');
Job.SETFILTER(Blocked,'0');

IF Excel THEN BEGIN
ExcelBuffer.DELETEALL;
EnterCell(1, 1, FIELDCAPTION("Sell-to Customer Name"), '', TRUE, FALSE, FALSE);
EnterCell(1, 2, FIELDCAPTION("No."), '', TRUE, FALSE, FALSE);
EnterCell(1, 3, FIELDCAPTION(Description), '', TRUE, FALSE, FALSE);
EnterCell(1, 4, FIELDCAPTION("Description 2"), '', TRUE, FALSE, FALSE);
RowNo := 1;
END;
//Formatierung der Überschriften


Job - OnAfterGetRecord()

IF Excel THEN BEGIN
RowNo += 1;
//Nach jedem Datensatz "Springen in die nächste Zeile"
EnterCell(RowNo, 1, "Sell-to Customer Name", '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 2, "No.", '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 3, Description, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 4, "Description 2", '', FALSE, FALSE, FALSE);
//Definition der Felder
END;

diesem Code die Kopfinformationen.

Auf dem 3. DataItem erzeuge ich mit
Code:


Job Structure Line - OnPreDataItem()

IF Excel THEN BEGIN
ExcelBuffer.DELETEALL;
EnterCell(1, 5, FIELDCAPTION(Description), '', TRUE, FALSE, FALSE);
EnterCell(1, 6, FIELDCAPTION(Status), '', TRUE, FALSE, FALSE);
EnterCell(1, 7, FIELDCAPTION("Expected Ending date"), '', TRUE, FALSE, FALSE);
EnterCell(1, 8, FIELDCAPTION(Quantity), '', TRUE, FALSE, FALSE);
EnterCell(1, 9, FIELDCAPTION("Qty. Job usage"), '', TRUE, FALSE, FALSE);
EnterCell(1, 10, FIELDCAPTION("Entry No."), '', TRUE, FALSE, FALSE);

RowNo := 1;
END;
//Formatierung der Überschriften


Job Structure Line - OnAfterGetRecord()

IF Excel THEN BEGIN
RowNo += 1;
//Nach jedem Datensatz "Springen in die nächste Zeile"
EnterCell(RowNo, 5, Description, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 6, Status, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 7, FORMAT("Expected Ending date"), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 8, FORMAT(Quantity), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 9, FORMAT("Qty. Job usage"), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 10, FORMAT("Entry No."), '', FALSE, FALSE, FALSE);
//Definition der Felder
END;

diesem Code die Zeileninformationen.

Jetzt habe ich 2 Probleme (vorerst)
1) Wie durchlaufe ich jedes Projekt und dann die zugehörigen Zeilen nacheinander. Momentan werden erst alle Projektköpfe und dann alles Projektzeilen durchlaufen.
2) Die Variable ExcelBuffer wird nach dem Kopfdurchlauf wieder geleert und gibt dann nur die Zeileninformationen aus. Wie werden die Kopfinfos mit ausgegeben? Ich hatte schon bereits mehrere erfolglose Versuche mit der Positionierung von ExcelBuffer versucht, aber es half nichts.
Zuletzt geändert von misterelektro1981 am 24. Januar 2012 15:37, insgesamt 1-mal geändert.

Re: Excel Ausgabe Puffer Problem

23. Januar 2012 15:35

Zusammengehörende Daten (z.B. Kopf-Zeilen-Konstellation) werden in der Regel durch die Einrückung des DataItems mit der abhängigen Tabelle gelöst.

Die Gesamtausgabe eines (nach und nach) gefüllten ExcelBuffers kann man mit einem Dummy-DataItem (z.B. auf Integer) lösen.

Re: Excel Ausgabe Puffer Problem

23. Januar 2012 15:46

Danke Horst für deine Antwort, jedoch kann ich damit zum Teil nichts anfangen.

Wie soll ich denn die DataItems einrücken und wie genau soll das mit dem Dummy DataItem funktionieren.

Re: Excel Ausgabe Puffer Problem

23. Januar 2012 16:06

Guck dir mal Report 206 an. Dort findest du sowohl die Einrückung als auch die Verwendung von Integer als DataItem zur Ausgabe von einer temporären Tabelle. Außerdem bin ich mir sicher, daß hier im Forum ebenfalls eine Menge Informationen dazu zu finden sind.

Re: Excel Ausgabe Puffer Problem

24. Januar 2012 12:40

Da ich kein Entwickler/Programmierer bin fällst es mir schwer den Bericht 206 im Detail zu verstehen, z.B. das mit der temporären Tabelle usw.

Ich habe daher den Bericht nun umgebaut, so dass nun die Daten aus dem 1.DataItem mit den Daten des 3. DataItem zusammen ausgegeben werden.
Dann habe ich zwar die Info aus dem 1. DataItem genau so oft wie ich die Information des 3. DataItems habe, ist aber nicht so schlimm.

Momentan gibt er mir mir diesem Code:
Code:

IF Excel THEN BEGIN
ExcelBuffer.DELETEALL;
EnterCell(1, 1, V, '', TRUE, FALSE, FALSE);
EnterCell(1, 2, N, '', TRUE, FALSE, FALSE);
EnterCell(1, 3, B, '', TRUE, FALSE, FALSE);
EnterCell(1, 4, B2, '', TRUE, FALSE, FALSE);
EnterCell(1, 5, FIELDCAPTION(Description), '', TRUE, FALSE, FALSE);
EnterCell(1, 6, FIELDCAPTION(Status), '', TRUE, FALSE, FALSE);
EnterCell(1, 7, FIELDCAPTION("Expected Ending date"), '', TRUE, FALSE, FALSE);
EnterCell(1, 8, FIELDCAPTION(Quantity), '', TRUE, FALSE, FALSE);
EnterCell(1, 9, FIELDCAPTION("Qty. Job usage"), '', TRUE, FALSE, FALSE);
EnterCell(1, 10, FIELDCAPTION("Entry No."), '', TRUE, FALSE, FALSE);

RowNo := 1;
END;

//Formatierung der Überschriften


Job Structure Line - OnAfterGetRecord()
IF Excel THEN BEGIN
RowNo += 1;
//Nach jedem Datensatz "Springen in die nächste Zeile"
EnterCell(RowNo, 1, "Job"."Sell-to Customer Name", '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 2, "Job"."No.", '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 3, "Job".Description, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 4, "Job"."Description 2", '', FALSE, FALSE, FALSE);

EnterCell(RowNo, 5, Description, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 6, Status, '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 7, FORMAT("Expected Ending date"), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 8, FORMAT(Quantity), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 9, FORMAT("Qty. Job usage"), '', FALSE, FALSE, FALSE);
EnterCell(RowNo, 10, FORMAT("Entry No."), '', FALSE, FALSE, FALSE);
//Definition der Felder
END;

immer nur das letzte Projekt (die letzten Projektstrukturzeilen sowie die Projektstrukturkopf Daten) nach Excel aus.

Kurz nochmal der Aufbau des Berichts:
1. Ebene: Job
2. Ebene: Job Structure Header
3. Ebene: Job Structure Line

Wie stelle ich es an, dass mir alles nacheinnader nach Excel übergeben wird.

Ich hatte es hinbekommen, dass mir für jede Projektstruktur eine Excelliste erstellt wurde, das soll aber nicht so sein. Es soll alles in eine Liste übergeben werden.

EDIT: In Job=> OnPost TRigger wird das ExcelMappe erstellt momentan.

Re: Excel Ausgabe Puffer Problem

24. Januar 2012 12:59

Wenn der Aufbau deines Reports so ist:
Code:
Job
  Job Structure Header
    Job Structure Line
,
fügst du die obersten Überschriften im OnPreDataItem von Job ein, da diese Section nur einmal durchlaufen wird.

Soll noch eine Überschriftszeile über jedem Job stehen, fügst du die im OnAfterGetRecord von Job ein (wahlweise auch OnPreDataItem von "Job Structure Header").

Falls Daten aus jedem Job Structure Header in der Exceltabelle landen sollen, fügst du sie im OnAfterGetRecord dieses DataItems ein.

Die Daten aus den Zeilen fügst du im OnAfterGetRecord von "Job Structure Line" ein.

Nach jeder eingefügten Zeile zählst du die Zeilennummer hoch.

Im OnPostDataItem von Job lässt du abschließend das Excel-Blatt erstellen.

Ein Deleteall benötigst du nicht, da du die Variable auf die Tabelle "Excel Buffer" hoffentlich als eine temporäre angelegt hast. Falls nicht, solltest du das tun. Und am Ende von allem solltest du diese Variable noch mit CLEAR zerstören, weil sonst der Excel-Task weiter existiert.

Re: Excel Ausgabe Puffer Problem

24. Januar 2012 15:36

Danke nochmals für dein Bemühen, aus Zeitgründen werde ich es nicht mehr testen können....