ich habe die Aufgabe einen CSV-Report zu erstellen, in dem mehrere Tabellen zusammenkommen.
Wir haben also so eine Struktur und die Tabelle dazu.
types:begin of t_test,
mandt type vbak-mandt,
vbeln type vbak-vbeln,
erdat type vbak-erdat,
posnr type vbap-posnr,
matnr type vbap-matnr,
matkl type vbap-matkl,
vperdat type vbap-erdat,
end of t_test.
data: it_test type standard table of t_test.
Nachdem ich die Daten hole, verwende ich Folgendes:
types: ty_data type c length 4096.
data: lt_csv type standard table of ty_data.
call function 'SAP_CONVERT_TO_CSV_FORMAT'
exporting
i_field_seperator = ';'
tables
i_tab_sap_data = it_test "type standard table
changing
i_tab_converted_data = lt_csv.
if sy-subrc <> 0.
message 'Es gab einen Fehler beim Konvertieren der Datei.' type 'I'.
endif.
* Download Datei
call method cl_gui_frontend_services=>gui_download
exporting
filename = 'C:/temp/Z_TEST.csv' " Name der Datei
filetype = 'ASC'
changing
data_tab = lt_csv. " Übergabetabelle
if sy-subrc <> 0.
message 'Es gab einen Fehler beim Downloaden der Datei.' type 'I'.
endif.
Ich bekomme auch meine CSV-Datei, jedoch ohne Kopfzeile. Dazu habe ich schon mehrere Versionen probiert, aber immer nur die Feldnamen von internen Tabellen bekommen und nicht die zugehörigen zu meiner Struktur.
Vielleicht weiß jemand, wie ich eine Kopfzeile mit den Technischen Namen der Felder in die CSV bekomme.
Vorab: Ich wäre mit dem Begriff "Kopfzeile" im ABAP-Kontext sehr vorsichtig, das ist ein feststehender Begriff.
Dein erstes Problem ist, dass du für die Bezeichnungen (Feldnamen) eine andere Art von Tabelle brauchst, weil du in ein Betragsfeld nicht die Bezeichnung "Betrag" reinschreiben kannst. Im Zweifel ist das also eine Tabelle mit Feldern vom Typ STRING.
Das bedeutet wiederum, dass du alle Feldinhalte (also die richtigen aus deinen Tabellen) in Strings konvertieren musst, ehe du sie in die Tabelle reinschreibst. Damit z. B. im Feld ERDAT der 01.01.2022 steht und nicht 20220101.
Das Problem mit den Feldnamen ergibt sich aus der Deklaration -- natürlich heißen die wie die Feldnamen deiner internen Tabelle. Du erzeugst mit der Deklaration ein Feld eines Namens X, das die gleichen Eigenschaften hat wie das SAP-Tabellenfeld Y. Trotzdem heißt es X und dein Programm kann nicht mal so einfach den Namen von Y ermitteln. Dein TYPE VBAP-ERDAT z. B. sagt nur aus "mach mir ein Feld vom gleichen Typ wie VBAP-ERDAT". Es gibt aber zig Felder diesen Typs im DDIC.
Wie generisch muss das sein? Ich würde knallhart die Feldnamen als Literale in die erste Zeile (die du Kopfzeile nennst) reinschreiben.
Ralf
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag: kola
danke für deine Antwort.
Meine CSV Datei soll dann so aussehen, dass die Feldnamen die Kopfzeile ergeben.
Also MANDT, VBELN, ERDAT, usw. wie in types angegeben.
Ich habe es jetzt probiert über eine String Struktur, in die ich alles per Hochkommata reingeschrieben habe. Das hat aber leider nicht funktioniert. Ich habe jetzt einfach eine leere Zeile über den Daten.
danke für deine Nachricht, genau das habe ich versucht, aber es kommt eine leere Zeile über den Daten raus. Habe es nochmal angepasst, jetzt kommen die Überschriften alle in Spalte A aneinander gereiht.
Ich poste den Code mal:
data: begin of wa_header,
name type c length 30,
end of wa_header.
types:begin of t_test,
mandt type vbak-mandt,
vbeln type vbak-vbeln,
erdat type vbak-erdat,
posnr type vbap-posnr,
matnr type vbap-matnr,
matkl type vbap-matkl,
vperdat type vbap-erdat,
end of t_test.
data : it_test type t_test occurs 0 with header line.
data: t_header_test like table of wa_header.
append 'MANDT' to t_header_test.
append 'VBELN' to t_header_test.
append 'ERDAT' to t_header_test.
append 'POSNR' to t_header_test.
append 'MATNR' to t_header_test.
append 'MATKL' to t_header_test.
append 'ERDAT' to t_header_test.
Ich habe davor
at selection-screen.
if r1 = 'X'.
stehen, da es dort mehrere Optionen gibt, das Konstrukt funktioniert aber soweit.
Sy-Subrc liefert nie einen anderen Wert als 0....
Ich habe ja bisher auch immer eine Datei bekommen mit Werten. Nur eben ohne Überschriftenzeile, die aber benötigt wird..
Hallo,
>jetzt kommen die Überschriften alle in Spalte A aneinander gereiht.
>...
>append 'MANDT' to t_header_test.
>append 'VBELN' to t_header_test.
>...
da ist ja auch kein ';' enthalten.
Mit
append 'MANDT;' to t_header_test.
append 'VBELN;' to t_header_test.
...
sollte es funktionieren.
Folgende Benutzer bedankten sich beim Autor Shortcut IT für den Beitrag: kola
bei GUI_DOWNLOAD gibt es auch eine Variable WRITE_FIELD_SEPARATOR, da kann man das Trennzeichen z.b. ";" mitgeben und dann sollte es ohne manuelles hinzufügen von ";" bei HEADER und ohne die Daten vorher per SAP_CONVERT_TO_CSV_FORMAT zu konvertieren eigentlich funktionieren.