mit Smartforms habe ich das schon gemacht.Funktionsbaustein FP_JOB_OPEN
Der Funktionsbaustein FP_JOB_OPEN öffnet einen Spoolauftrag.
Wird beim Aufruf des Funktionsbausteins FP_JOB_OPEN mit dem Parameter REQNEW explit mitgegeben, dass ein neuer Spoolauftrag geöffnet werden soll, wird ein neuer Spoolaufträge angelegt, in dem die Inhalte geschrieben werden.
Wurde ein alter Spoolauftrag abgeschlossen oder hat den Status "Fertig" oder "Error" ist es nicht mehr möglich in diesen Spoolauftrag zu schreiben
Wird ein Spoolauftrag beim Aufruf mit FP_JOB_OPEN nicht als "abgeschlossen" versehen mit dem Paramter REQFINAL und hat einen offenen Status, ist es auch nach Aufruf des Funktionsbausteins FP_JOB_CLOSE von anderen Programmen/oder beim erneuten Starten des Programms möglich weiterhin Inhalte in diesen Spool zu füllen
Code: Alles auswählen.
* Assign data in RSNAST00
* NAST
ASSIGN ('(RSNAST00)NAST') TO <ls_nast>.
CHECK <ls_nast> IS ASSIGNED.
MOVE-CORRESPONDING s_xnast TO <ls_nast>.
* TNAPR
ASSIGN ('(RSNAST00)TNAPR') TO <ls_tnapr>.
MOVE-CORRESPONDING s_tnapr TO <ls_tnapr>.
* RETURNCODE
ASSIGN ('(RSNAST00)RETURNCODE') TO <lv_rc>.
CLEAR <lv_rc>.
* Trigger processing in messaging
PERFORM programm_aufrufen
IN PROGRAM rsnast00
USING 'W'.
Code: Alles auswählen.
*----------------------------------------------------
* File 1:
*----------------------------------------------------
* Get XSTRING of file 1 by using spool-id
CALL FUNCTION 'ADS_RETURN_SPOOLJOB'
EXPORTING
rqident = ex_spoolid
IMPORTING
pdf = lv_file1_xstring
EXCEPTIONS
no_such_job = 1
no_permission = 2
internal_error = 3
not_supported = 4
empty_job = 5
wrong_doctype = 6
OTHERS = 7.
IF sy-subrc <> 0.
* TODO Implement suitable error handling here
ENDIF.
*----------------------------------------------------
* File 2:
*----------------------------------------------------
* Concatenate filename
CONCATENATE: ex_path ex_filename INTO lv_full_path.
CONDENSE: lv_full_path NO-GAPS.
* Check if desired file exists
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_full_path
RECEIVING
result = lv_file_existing
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
IF lv_file_existing = abap_false.
"TODO file not existing -> Error handling
ENDIF.
ENDIF.
* read 2nd file in binary mode
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = lv_drawings_path
filetype = 'BIN'
IMPORTING
filelength = lv_size
CHANGING
data_tab = lt_file
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.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* Convert binary to hex string
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_size
IMPORTING
buffer = lv_file2_xstring
TABLES
binary_tab = lt_file
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
* TODO Implement suitable error handling here
ENDIF.
*----------------------------------------------------
* Merge two files
*----------------------------------------------------
TRY.
DATA(lo_pdf_merger) = NEW cl_rspo_pdf_merge( ).
CATCH cx_rspo_pdf_merge INTO DATA(lo_rspo_pdf_merge).
MESSAGE lo_rspo_pdf_merge->get_text( ) TYPE 'E'.
ENDTRY.
* First add file 1 data to document
lo_pdf_merger->add_document( lv_file1_xstring ).
* Then add file 2 data to document
lo_pdf_merger->add_document( lv_file2_xstring ).
* Do actual merge
lo_pdf_merger->merge_documents( IMPORTING merged_document = DATA(lv_merged_data) ).