- Sie verwendet keine generischen Typen: Der Dateiname muss immer erst
in ein Feld vom Typ STRING konvertiert werden, wenn man die Methode
GUI_UPLOAD aufrufen will. Dies obwohl es schon lange den Typ CSEQUENCE
gibt, der sich abwärtskompatibel in der Schnittstelle verwenden
liesse...
- Sie liefert das gelesene File nicht als XSTRING zurück, sondern als
DATA_TAB. DATA_TAB muss eine interne Tabelle mit einem RAW-Zeilentyp
fester Länge sein. Man muss sich daraus den XSTRING selbst
zusammenbauen!
- Sie verwendet klassische Exceptions statt ausnahmebasierter
Exceptions, die man fürs Fehlerhandling in einer langen Liste alle
einzeln abfangen müsste. Ausserdem enthalten nicht einmal die
Systemfelder sy-msgid, sy-msgno etc. immer eine passende Nachricht mit
Hinweis auf das Fehlersymptom. So dass also jeder Aufrufer jeden
Exception-Fall mit einer eigenen Fehlernachricht versehen müsste!
Wenigstens die ersten beiden dieser Probleme werden durch die Routine
read des folgenden self-contained Reports gelöst: Generische
Schnittstelle und XSTRING als Rückgabewert.
Wer Zeit und Lust hat, kann sich die Routine zur Grundlage einer
wiederverwendbaren Methode machen und sie noch um den dritten Punkt
ergänzen, das saubere Fehlerhandling: Ein für allemal alle möglichen
Fehlersymptome mit einem Text versehen und diesen Text (oder diese
T100-Nachricht) als Attribute einer passenden Ausnahme
ZCX_UPLOAD_ERROR mitgeben.
* --------------------------------------------------------------
* Upload in eine Binärdatei
* --------------------------------------------------------------
report zz_test_upload.
* Ausnahmeklasse für Upload
class lcx_upload_error definition inheriting from cx_static_check.
endclass.
parameters: p_path type c length 132 lower case
* In Systemen mit Anwendungskomponenten ist meist
* auch folgende Suchhilfe vorhanden (File mit
* File-Open-Dialog suchen), aus der INSURANCE-Komponente
* Wenn SH nicht vorhanden, folgende Zeile aussternen
matchcode object icl_diagfilename
.
start-of-selection.
perform test_file_upload.
form test_file_upload.
data: lv_data type xstring.
try.
perform read using p_path changing lv_data.
* Hier kann man lv_data betrachten...
break-point.
catch lcx_upload_error.
message 'Upload Error' type 'I'.
endtry.
endform.
* --- Eine Binärdatei in einen XSTRING einlesen
form read using iv_path type csequence
changing ev_data type xstring
raising lcx_upload_error.
data: lt_file type standard table of bin1024,
lv_file type xstring,
lv_filename type string,
lv_length type i.
field-symbols: <lv_line> type bin1024.
lv_filename = p_path.
call method cl_gui_frontend_services=>gui_upload
exporting
filename = lv_filename
filetype = 'BIN'
importing
filelength = lv_length
changing
data_tab = lt_file
exceptions
others = 1.
if sy-subrc <> 0.
raise exception type lcx_upload_error.
else.
clear ev_data.
loop at lt_file assigning <lv_line>.
concatenate ev_data <lv_line> into ev_data in byte mode.
endloop.
if lv_length > 0.
ev_data = ev_data(lv_length).
endif.
endif.
endform.