Download mit OPEN DATASET -> XLSX Datei korrupt

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von Romaniac (Specialist / 130 / 40 / 22 ) » 28.09.2017 14:00
Hallo zusammen,

Ich erstelle mit der Klasse ABAP2XLS ein XLSX Datei (gezippte XML Datei). Beim Download auf den PC ist die Datei korrekt, wenn ich die Datei allerdings auf de SAP Server stelle und dann mit der Transaktion CG3Y heruntelade kann sie mit Excel nicht geöffnet werden. Ich denke mal es liegt am Dateiformat, ich komme aber nicht dahinter.

Inhalt von s_xdata(xstring) = Daten der Exceldatei
504B03041400000008002069...

Inhalt(Auszug) von LT_RAWDATA (type solix_tab[X255)
1 504B03041400000008002069...
2 09C377521D373A50696C1AAB...
3 72D7C76C0A23640B9D6A7C46...



* <<< Download auf PC >>>

Code: Alles auswählen.

      lt_rawdata   = cl_bcs_convert=>xstring_to_solix( iv_xstring  = s_xdata ).
      DATA(li_bytecount) = xstrlen( s_xdata ).
      cl_gui_frontend_services=>gui_download(
      EXPORTING bin_filesize      = li_bytecount
                filename          = s_path
                filetype          = 'BIN'
                confirm_overwrite = abap_true
      CHANGING
                data_tab          = lt_rawdata
... --> Datei ist korrekt
Auszug aus Inhalt im Notepad:

PK ]Ž;K×\oJ Ž
,#F°~V*·…ü¢ù½hÞúíüåp4H[ÊÞL
ÒÂöx¿ƒõ†þy¿…÷÷ø «ÿä|:¶ðÁ?




* <<< Download auf SAP Server (AIX auf ORACLE) >>>

Code: Alles auswählen.

    CASE mv_open_mode. (in meinem Fall mc_binary, habe aber alle ausprobiert)
      WHEN mc_non_unicode.
        OPEN DATASET pv_filename FOR OUTPUT IN TEXT MODE
                  ENCODING NON-UNICODE IGNORING CONVERSION ERRORS.
      WHEN mc_unicode.
        OPEN DATASET pv_filename FOR OUTPUT IN TEXT MODE
                  ENCODING UTF-8       IGNORING CONVERSION ERRORS.
      WHEN mc_binary.
        OPEN DATASET pv_filename FOR OUTPUT IN BINARY MODE.
    ENDCASE.
Datei mit CG3Y heruntergeladen, BIN und ASC, gleiches Ergebnis, Datei ist korrupt:
Auszug aus Inhalt im Notepad:

Binär;
504B03041400000008002069...
09C377521D373A50696C1AAB...
72D7C76C0A23640B9D6A7C46...

Was fehlt mir noch beim Download auf den SAP Server? Warum ist das Dateiformat beim GUI_DOWNLOAD anders als bei OPEN DATASET?

Danke und Gruß,

Wolfgang
Geht nicht gibts nicht


Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von a-dead-trousers (Top Expert / 3558 / 118 / 926 ) » 28.09.2017 14:38
Ich würde mal vermuten, dass dir da irgendeine Codepage-Konvertierung reinpfuscht.
Wie schreibst du deine Datei (TRANSFER) auf den SAP Server?
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von black_adept (Top Expert / 3434 / 67 / 671 ) » 28.09.2017 16:06
Probier' doch mal eins der A2X-Demoprogramme wie z.B. ZDEMO_EXCEL1 aus, da diese auch die Downloadfähigkeit in des Defaultverzeichnis des Backend bieten. Wenn das auch korrupt ist fällt mir auch gerade nix ein, wenn es hingegen funktioniert solltest du so vorgehen wie in dem Demoprogramm

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Romaniac

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von fr-g (ForumUser / 58 / 6 / 20 ) » 28.09.2017 18:53
Das sieht in der Tat nach einem Codepage-Fehler aus.

Die Methode gui_download hat einen optionalen Parameter codepage, der by default auf die Codepage der SAP GUI gesetzt wird (unter Windows also z.B. ANSI).
Der xstring, den du in BINARY MODE speicherst, wird aber sehr wahrscheinlich anders kodiert sein....je nach Quelle. Du könntest versuchen, die Datei mit LEGACY BINARY MODE und Angabe der CODEPAGE zu schreiben (z.B. 1160)...

Folgende Benutzer bedankten sich beim Autor fr-g für den Beitrag:
Romaniac


Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von Romaniac (Specialist / 130 / 40 / 22 ) » 28.09.2017 19:29
Vielen Dank erst mal, die Codepage habe ich auch im Verdacht. Ich habe jetzt mal den Transfer debugged, in dieser Firma gibt es für Dateitransfer ein eigenes Tool das zu verwenden ist, der markierte Teil wird ausgeführt, also ein ganz normaler Transfer ohne Parameter:

Code: Alles auswählen.

METHOD ifs_dataset_transfer.

  TRY.
      IF pv_length IS INITIAL.
        TRANSFER pv_line TO pv_filename. ---> wird ausgeführt
      ELSE.
        TRANSFER pv_line TO pv_filename LENGTH pv_length.
      ENDIF.
    CATCH cx_sy_file_io.
*    Error while writing into file
      RAISE e_transfer_error.
    CATCH cx_sy_codepage_converter_init.
*    Conversion of codepage not supported
      RAISE e_transfer_error.
    CATCH cx_sy_conversion_codepage.
*    Internal conversion error
      RAISE e_transfer_error.
    CATCH cx_sy_file_authority.
*    No authority to open file
      RAISE e_transfer_error.
    CATCH cx_sy_file_open_mode.
*    File is not open
      RAISE e_transfer_error.
  ENDTRY.

ENDMETHOD.
Ich probier jetzt mal das Demoprogramm aus, gute Idee.
Aber den Transfer (also diese Methode von oben) kann ich nicht ändern, ich müsste also den xtring vorher schon mit der richtigen Codepage versorgen?
Geht nicht gibts nicht

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von a-dead-trousers (Top Expert / 3558 / 118 / 926 ) » 29.09.2017 08:28
moment mal: pv_line?
Überträgst du deine Datei "Zeile für Zeile"? (Aus der lt_rawdata)
Das könnte den Fehler erklären.
Versuche dein "s_xdata" aus dem ersten Post direkt mit TRANSFER zu schreiben ohne den Umweg über lt_rawdata.

EDIT: Alternativ müsstest du bei der letzten Zeile deiner "lt_rawdata" eine Länge mitgeben, damit die abchließenden Nullen aus der Tabellenzeile nicht mitgeschrieben werden.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von Romaniac (Specialist / 130 / 40 / 22 ) » 29.09.2017 10:16
Die Mehtode erwartet eine Tabelle, Type table of XTRING habe ich versucht, dumpt aber bei einem CAST.
Das Demoprogramm ZDEMO_EXCEL1 macht das auch über SOLIX:

Code: Alles auswählen.

    cl_output->t_rawdata = cl_bcs_convert=>xstring_to_solix( iv_xstring  = cl_output->xdata ).
    cl_output->bytecount = xstrlen( cl_output->xdata ).

METHOD download_backend.
    DATA: bytes_remain TYPE i.
    FIELD-SYMBOLS: <rawdata> LIKE LINE OF t_rawdata.

    OPEN DATASET p_backfn FOR OUTPUT IN BINARY MODE.
    CHECK sy-subrc = 0.

    bytes_remain = bytecount.

    LOOP AT t_rawdata ASSIGNING <rawdata>.

      AT LAST.
        CHECK bytes_remain >= 0.
        TRANSFER <rawdata> TO p_backfn LENGTH bytes_remain.
        EXIT.
      ENDAT.

      TRANSFER <rawdata> TO p_backfn.
      SUBTRACT 255 FROM bytes_remain.  " Solix has length 255

    ENDLOOP.

    CLOSE DATASET p_backfn.
Hier muss ich wohl doch den Transfer doch selbst programmieren oder die IFS Methode anpassen.

Hintergrund ist dass ein Job die Daten aus der Transaktion KSB1 (Kostenstellenbericht) als Excelddatei automatisch auf ein bestimmtes Laufwerk kopieren soll. Für dieses kopieren von Dateien gibt es eben bei dieser Firma ein einheitliches Verfahren IFS (Interface File Solution). Dort kann ich in einem Customizing einstellen wohin diese Datei dann kopiert werden soll.
Geht nicht gibts nicht

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von a-dead-trousers (Top Expert / 3558 / 118 / 926 ) » 29.09.2017 13:59
Wenn du dir das Coding von DOWNLOAD_BACKEND anschaust, steht da das bytes_remain drinnen. Das ist genau das was ich vorhin gmeint hab mit, dass "die abschließenden Nullen aus der Tabellenzeile nicht mitgeschrieben werden."
Das AT LAST wird nur bei der letzten Zeile ausgeführt. bytecount ist die Länge deines urspürnglichen XSTRING. Er zählt also solange um 255 Zeichen runter bis die letzte Zeile erreicht und schreibt von dieser nur noch was tatsächlich befüllt ist.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Romaniac

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von Romaniac (Specialist / 130 / 40 / 22 ) » 29.09.2017 15:03
ja das ist auch die Lösung, werd mal versuchen ob ich den Transfer irgendwo in dem Tool selber ausführen kann.

Danke alle und ein schönes Wochenende!

Gruß Wolfgang
Geht nicht gibts nicht

Re: Download mit OPEN DATASET -> XLSX Datei korrupt

Beitrag von Romaniac (Specialist / 130 / 40 / 22 ) » 18.07.2018 16:43
Hallo zusammen,

jetzt muss ich das Thema doch nochmal wiederbelegen. Der Download auf den (UNIX)SAP Server funktioniert jetzt, die XLSX Datei kann nach einem Download auf den PC ohne Fehler geöffnet werden.

Aber jetzt kommt das Firmeninterne File Tool ins Spiel, das soll die Datei vom SAP Server per OpenFT auf ein Verzeichnis des Fachbereiches schreiben. Das funktioniert zwar, aber die Exceldatei ist dann beschädigt, kann zwar von Excel repariert werden, aber das ist unschön. Wenn ich die beiden Dateien in Editor vergleiche fehlen der korrupten Variante hinten ein paar Bytes, siehe screenshot.
XLSX Datei Vergleich.jpg
Woran könnte das liegen? Der Kommandostring für den OpenFT sieht so aus:
'-bo /dfueM0D/out/GERM0D.GERM0D.CO.2.KSB1_EXPORT_20170722_104455.XLSX openft.euce.corp.xxxx.com!\\cdcna001\extxxxxx\temp\GERM0D.GERM0D.CO.2.KSB1_EXPORT_20170722_104455.XLSX dfueitsp

Danke und Gruß,

Wolfgang
Geht nicht gibts nicht

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Aktuelle Forenbeiträge

Last erzeugen im SAPGui?
vor 4 Stunden von tm987456 14 / 137
IDoc-Segmente löschen
vor 21 Stunden von littleJohn 2 / 72
Shortdump wegen Speicherüberlauf
vor 23 Stunden von chhe001 8 / 135

Vergleichbare Themen

Download aus TemSe mittels OPEN DATASET (oder Alternative?)
von h3ld » 25.04.2008 10:39
Datei anlegen mit Open Dataset
von ostpower » 22.10.2012 16:12
OPEN DATASET öffnet die Datei nicht
von Marwin » 20.04.2005 11:17
OPEN DATASET for Input einer CSV-Datei
von Tina » 20.06.2006 15:08
Mit Open Dataset eine CSV-Datei erstellen
von L0w-RiDer » 01.11.2019 09:38