Code: Alles auswählen.
"ALB-Dokument_Pfad anhand Importparameter aus Customizing_Tabelle lesen
SELECT *
FROM ziss_alb_pdf
INTO TABLE ta_alb_pdf
WHERE tariftyp EQ i_tariftyp
AND sparte EQ i_sparte
AND bukrs EQ i_bukrs.
IF sy-subrc EQ 0.
"Tabelle absteigend nach Datum_Ab sortieren, um aktuellesten Eintrag zu ermitteln
SORT ta_alb_pdf DESCENDING BY datum_ab.
"Ersten (aktuellsten) Eintrag lesen
READ TABLE ta_alb_pdf INTO wa_alb_pdf INDEX 1.
"PDF_Dokument aus Datenbak lesen
IF NOT wa_alb_pdf-pfad IS INITIAL.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = wa_alb_pdf-pfad
filetype = 'BIN'
* IMPORTING
* filelength =
TABLES
data_tab = li_content_bin_file
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
OTHERS = 10.
Genau das hast du doch schon erledigt - was soll denn jetzt noch passieren?Kenny hat geschrieben:Ich möchte einen Fuba schreiben, welcher mir anhand bestimmter Parameter aus einer Customizingtabelle ein Pdf-Dokument (bzw. den Pfad) liest und das entsprechende PDF zurückliefert.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Kenny
Unix-Datenbank = SAP-Datenbank?Kenny hat geschrieben:Eine Frage habe ich aber noch: Wenn ich nicht von meinem PC eine Datei auslesen möchte sondern aus einer Unix-Datenbank, wie mache ich dies bzw. gibt es dafür einen FUBA?
File-Arbeiten in ABAP auf dem AppServer: OPEN DATASET, TRANSFER, CLOSE DATASET (mehr dazu findest du in der F1-Hilfe).Kenny hat geschrieben:Gibt es einen FUBA ähnlich meinem benutztem dem ich einfach das Verzeichnis und meinen Pfad mitgebe oder wie läuft das?
JHM hat geschrieben:File-Arbeiten in ABAP auf dem AppServer: OPEN DATASET, TRANSFER, CLOSE DATASET (mehr dazu findest du in der F1-Hilfe).Kenny hat geschrieben:Gibt es einen FUBA ähnlich meinem benutztem dem ich einfach das Verzeichnis und meinen Pfad mitgebe oder wie läuft das?
Um sich die Files/Verzeichnisse auf dem AppServer anzuschauen kannst du die Transaktion AL11 verwenden.
Um aus ABAP heraus ein Verzeichnis einzulesen, kann der FuBa: EPS_GET_DIRECTORY_LISTING verwendet werden.
Evtl. solltest du dich auch mal mit der TA FILE aus einandersetzten. Damit kann man logische Filenamen erzeugen, die das Leben leichter machen. Hierfür solltest du aber eine Schulung bzw. ein Training von deinem AG bekommen.
black_adept hat geschrieben:Hallo Kenny,
1.) Wie du eine Datei benennst ist doch völlig egal - ob sie nun .pdf oder .bin oder .hugo heißt . Selbst in Windows kann man die meisten Dateien umbenennen auf irgendetwas mehr oder weniger Sinnvolles. Wichtig ist doch der Inhalt des Files
2.) Mit open Dataset liest du den Inhalt einer Datei. Hier musst du eigentlich nur wissen ob der File dir Binärdaten zurückliefern soll oder das Ganze zeilenweise passiert. Dafür bitte die F1-Hilfe zu open dataset lesen.
3.) Auf einmal willst du die Datei nicht nur lesen sondern auch ablegen. Und das auch noch auf dem(einem) Applikationsserver. Wenn ihr über mehr als einen AppServer verfügt und das Verzeichnis auf das du schreibst nicht über alle Appserver erreichbar ist wirst du Probleme bekommen. Aber es gibt diverse Stellen im SAP wo man recht einfach Daten hin verfrachten kann. Mein Lieblingsablageort ist z.B. das Business Object Repository ( BOR) welches über die Transaktion OAER ( oder OAOR ) erreicht und auch von einem Nicht-Programmierer bestückt/eingesehen werden kann.
Code: Alles auswählen.
DATA: li_content_bin_file TYPE solix_tab,
wa_content_bin_file LIKE LINE OF li_content_bin_file.
DATA: UX_FILE LIKE AUTHB-FILENAME Value '/home/test/testpdfgal.bin'.
IF wa_ziss_alb_pdf-pfad IS NOT INITIAL.
"Datei vom Präsentationsserver einlesen
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = wa_ziss_alb_pdf-pfad
filetype = 'BIN'
* IMPORTING
* filelength =
TABLES
data_tab = li_content_bin_file
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
OTHERS = 10.
IF sy-subrc EQ 0.
"Datei auf dem Applicationsserver speichern
OPEN DATASET ux_file FOR OUTPUT IN BINARY MODE.
LOOP AT li_content_bin_file INTO wa_content_bin_file.
TRANSFER wa_content_bin_file TO ux_file.
ENDLOOP.
CLOSE DATASET ux_file.
ELSE.
"Datei konnte nicht hochgeladen werden
MESSAGE text-005 TYPE 'S'.
ENDIF.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Kenny
Nein, natürlich funktioniert es nicht.black_adept hat geschrieben:Ob das geklappt hat kannst du recht leicht überprüfen.
Lege die Datei die du mit open dataset wegschreibst mal auf dem üblichen Temp-Verzeichnis des Applicationservers ab ( also ohne angabe von Pfadnamen ). Dann findest du die Datei auch in der AL11.
Danach kannst du die Datei von dort mit der Transaktion CG3Y oder CG3Z ( eine ist für Upload, eine für Download ) auch wieder auf deinen eigenen Rechner ziehen. Wenn sie danach noch als PDF aufgemacht werden kann hast du alles richtig gemacht.
Und noch ein Hinweis zu Transaktion OAER. Die Daten dort werden auch im SAP abgelegt. Nur dass man dort von allen einzelnen Applikationsservern darauf zugreifen kann und es halt ein wenig offizieller ist.
Code: Alles auswählen.
OPEN DATASET ux_file FOR OUTPUT IN BINARY MODE.
LOOP AT li_content_bin_file INTO wa_content_bin_file.
TRANSFER wa_content_bin_file TO ux_file.
ENDLOOP.
CLOSE DATASET ux_file.
Code: Alles auswählen.
DATA: ta_ziss_alb_pdf TYPE TABLE OF ziss_alb_pdf,
wa_ziss_alb_pdf LIKE LINE OF ta_ziss_alb_pdf,
v_pfad TYPE localfile,
tab TYPE TABLE OF tab_type, "löschen prüfen
wa_tab like line of tab,
v_file2 type string. "löschen prüfen
DATA: li_content_bin_file TYPE solix_tab,
wa_content_bin_file LIKE LINE OF li_content_bin_file.
*Data: ux_file like authb-filename.
DATA: t_imex LIKE bifmimex.
*&---------------------------------------------------------------------*
" Definition Selektionbild
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-010.
PARAMETERS: p_ttyp TYPE tariftyp, "Tariftyp
p_sparte TYPE sparte, "Sparte
p_bukrs TYPE bukrs. "Buchungskreis
PARAMETERS: p_date TYPE date. "AB_Datum
PARAMETERS: p_dname TYPE string. "Dateiname
SELECTION-SCREEN END OF BLOCK 1.
SELECTION-SCREEN BEGIN OF BLOCK 4 WITH FRAME TITLE text-040.
PARAMETERS p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK 4.
SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-020.
PARAMETERS: p_appli TYPE authb-filename OBLIGATORY DEFAULT '/HOME/T61FILES/'.
SELECTION-SCREEN END OF BLOCK 2.
SELECTION-SCREEN BEGIN OF BLOCK 3 WITH FRAME TITLE text-030.
PARAMETERS: p_check AS CHECKBOX DEFAULT 'X'. "Prüfen gegen Customizing
SELECTION-SCREEN END OF BLOCK 3.
"F4-Hilfe Dateiauswahl
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'F4_FILENAME'
IMPORTING
file_name = p_file.
START-OF-SELECTION.
v_pfad = p_appli.
TRANSLATE v_pfad TO UPPER CASE.
"Pfad erstellen
CONCATENATE v_pfad p_dname '.PDF' INTO v_pfad.
*&---------------------------------------------------------------------*
*Prüfung gegen Customizing
*&---------------------------------------------------------------------*
"ALB-Dokument_Pfad anhand Importparameter aus Customizing_Tabelle lesen
SELECT *
FROM ziss_alb_pdf
INTO TABLE ta_ziss_alb_pdf
WHERE tariftyp EQ p_ttyp
AND sparte EQ p_sparte
AND bukrs EQ p_bukrs
AND datum_ab EQ p_date
AND dateiname EQ p_dname
AND pfad EQ v_pfad.
IF sy-subrc <> 0.
"Eintrag noch nicht im Customizing Tabelle: ZISS_
MESSAGE text-001 TYPE 'S'.
ELSE.
"Prüfen, ob Testmodus
IF p_check EQ 'X'.
"Nur Testen, Meldung ausgeben, dass gespeichert werden kann
MESSAGE text-002 TYPE 'I'.
ELSE.
"Kein Testmodus, Datei auf dem Applikationsserver speichern
IF p_file IS NOT INITIAL.
"Datei vom Präsentationsserver einlesen
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
filename = p_file
filetype = 'BIN'
* IMPORTING
* filelength =
TABLES
data_tab = li_content_bin_file
EXCEPTIONS
conversion_error = 1
file_open_error = 2
file_read_error = 3
invalid_type = 4
no_batch = 5
unknown_error = 6
invalid_table_width = 7
gui_refuse_filetransfer = 8
customer_error = 9
OTHERS = 10.
IF sy-subrc EQ 0.
"Pfad erstellen
* TRANSLATE v_pfad to LOWER CASE.
DATA: ux_file LIKE authb-filename VALUE '/home/t61files/testdatei.bin'.
ux_file = v_pfad.
"Datei auf dem Applicationsserver speichern
OPEN DATASET ux_file FOR OUTPUT IN BINARY MODE.
* LOOP AT li_content_bin_file INTO wa_content_bin_file.
* TRANSFER wa_content_bin_file TO ux_file.
* ENDLOOP.
LOOP AT tab INTO wa_tab.
TRANSFER wa_tab TO ux_file.
ENDLOOP.
CLOSE DATASET ux_file.
IF sy-subrc <> 0.
MESSAGE text-003 TYPE 'I'.
ENDIF.
ELSE.
"Datei konnte nicht hochgeladen werden
MESSAGE text-005 TYPE 'S'.
ENDIF.
ENDIF. "Ende Prüfung, ob Tabelle in WA gelsen werden konnte
ENDIF. "Ende Prüfung, ob Testmodus
ENDIF. "Ende Prüfung, ob Customizing Eintrag vorhande
Code: Alles auswählen.
REPORT.
*----------------------------------------------------------------------*
* CLASS lcl_demo DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_demo DEFINITION.
PUBLIC SECTION.
METHODS: upload_from_frontend IMPORTING iv_filename_frontend TYPE clike,
save_to_backend IMPORTING iv_filename_backend TYPE clike.
DATA: gt_binary_data TYPE solix_tab,
gv_binary_data_length TYPE i.
ENDCLASS. "lcl_demo DEFINITION
DATA: go_demo TYPE REF TO lcl_demo.
PARAMETERS: p_file TYPE string OBLIGATORY DEFAULT 'c:\temp\test.pdf' LOWER CASE.
END-OF-SELECTION.
CREATE OBJECT go_demo.
go_demo->upload_from_frontend( p_file ).
go_demo->save_to_backend( 'Demo_to_backend.pdf' ).
*----------------------------------------------------------------------*
* CLASS lcl_demo IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_demo IMPLEMENTATION.
METHOD upload_from_frontend.
DATA: lv_filename TYPE string.
lv_filename = iv_filename_frontend.
cl_gui_frontend_services=>gui_upload(
EXPORTING
filename = lv_filename
filetype = 'BIN'
IMPORTING
filelength = me->gv_binary_data_length
CHANGING
data_tab = me->gt_binary_data
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
not_supported_by_gui = 17
error_no_gui = 18
OTHERS = 19 ).
ENDMETHOD. "upload_file
METHOD save_to_backend.
DATA: lv_remaining_bytes TYPE i.
FIELD-SYMBOLS: <binary_data> TYPE solix.
OPEN DATASET iv_filename_backend FOR OUTPUT IN BINARY MODE.
CHECK sy-subrc = 0.
lv_remaining_bytes = me->gv_binary_data_length .
LOOP AT me->gt_binary_data ASSIGNING <binary_data>.
IF lv_remaining_bytes >= 255.
TRANSFER <binary_data>-line TO iv_filename_backend.
ELSE.
TRANSFER <binary_data>-line(lv_remaining_bytes) TO iv_filename_backend.
ENDIF.
SUBTRACT 255 FROM lv_remaining_bytes.
ENDLOOP.
CLOSE DATASET iv_filename_backend.
ENDMETHOD. "save_to_backend
ENDCLASS. "lcl_demo IMPLEMENTATION
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Kenny