Die Aufgabenstellung des Kunden bestand darin, dass ein Druck einer Auftragsbestätigung ausgegeben werden sollte. Im Anschluss sollten im DMS abgelegte PDF Dokumente mit ausgegegeben werden.
Der erste Ansatz führte daher über die Funktionsbausteine CV120_DOC_CHECKOUT_VIEW und CV120_START_APPLICATION. Diese wurden nach dem Druck der AB angestoßen und führten dazu, dass die PDF Dokumente im Adobe Reader angezeigt und gedruckt werden konnten.
Dies war zum Einen sehr arbeitsintensiv für die Anwender, zum anderen war so nicht die Reihenfolge der Ausdrucke garantiert, da die Ausgabe auf einem Netzwerkdrucker erfolgen sollte.
Es musste also eine andere Lösung her. *hirn* *hirn* *google* *google*
Der zweite Ansatz führte zum Erfolg. Es musste ein PDF-Spoolauftrag erzeugt werden, der alle zu druckenden Dokumente aufnimmt. Vorraussetzung hierfür ist natürlich der Adobe Document Service. Nach etlichen Tagen war es dann vollbracht.
- Die Dokumente wurden gelesen.
*———————————————————————-
* Dokumentendatei lesen
*———————————————————————-CALL FUNCTION ‚CV120_KPRO_MASTER_DATA_GET‘
EXPORTING
pf_dokar = ls_draw–dokar
pf_doknr = ls_draw–doknr
pf_dokvr = ls_draw–dokvr
pf_doktl = ls_draw–doktl
* PF_ACTIVE_ONLY = ‚ ‚
* PF_ACTIVE_ATTR_ONLY = ‚ ‚
* PF_COMP_GET = ‚X‘
TABLES
ptx_data = lt_dms_tbl_file
EXCEPTIONS
not_found = 1
error = 2
OTHERS = 3.
IF sy–subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
- Die Daten der Dokumente wurden geladen.
*———————————————————————-
* Daten des Dokuments laden
*———————————————————————-
CLEAR ls_phio_object.SELECT SINGLE phio_id ph_class INTO (ls_phio_object–objid ,ls_phio_object–class)
FROM dms_ph_cd1
WHERE loio_id = ls_dms_phio–lo_objid.DATA:lv_xstr TYPE xstring,
ls_xmlr TYPE sdokcntbin,
lo_conv TYPE REF TO cl_abap_conv_obj.DATA lt_file_info TYPE TABLE OF sdokfilaci.
DATA ls_file_info TYPE sdokfilaci.CALL FUNCTION ‚SDOK_PHIO_LOAD_CONTENT‘
EXPORTING
object_id = ls_phio_object
client = sy–mandt
TABLES
file_content_binary = lt_file_content_binary
file_access_info = lt_file_info
EXCEPTIONS
not_existing = 1
not_authorized = 2
no_content = 3
bad_storage_type = 4
OTHERS = 5.
- Größe und Name ermitteln / Daten konvertieren
*———————————————————————-
* Größe des Dokuments ermitteln
*———————————————————————-
ls_dms_pdfstr–attsize = ls_file_info–file_size.CREATE OBJECT lo_conv.
LOOP AT lt_file_content_binary INTO ls_xmlr.
CALL METHOD lo_conv->convert
EXPORTING
inbuff = ls_xmlr
outbufflg = 25000
IMPORTING
outbuff = lv_xstr.
CONCATENATE lv_xstring lv_xstr INTO lv_xstring IN BYTE MODE.
ENDLOOP.*———————————————————————-
* Daten des Dokuments in XSTRING konvertieren
*———————————————————————-
CALL METHOD cl_bcs_convert=>xstring_to_solix
EXPORTING
iv_xstring = lv_xstring
RECEIVING
et_solix = ls_dms_pdfstr–solixtab.*———————————————————————-
* Name des Dokuments ermitteln
*———————————————————————-
SELECT SINGLE filename
INTO ls_dms_pdfstr–atttitle
FROM dms_doc_files
WHERE dokar = ls_draw–dokar
AND doknr = ls_draw–doknr
AND dokvr = ls_draw–dokvr
AND doktl = ls_draw–doktl.APPEND ls_dms_pdfstr TO e_dms_pdftab.
Dann musste das alles noch in den PDF Spoolauftrag gepackt werden:
************************************************
* ADS Spoolauftrag öffnen
************************************************
CALL FUNCTION ‚ADS_SR_OPEN‘
EXPORTING
dest = nast–ldest
* ldest = nast-ldest
name = nast–dsnam
suffix1 = nast–dsuf1
suffix2 = nast–dsuf2
copies = lv_copies
immediate_print = nast–dimme
auto_delete = nast–delet
titleline = nast–tdcovtitle
receiver = nast–tdreceiver
division = nast–tddivision
authority = nast–tdautority
append = abap_true
lifetime = ‚8‘
doctype = ‚ADSP‘
IMPORTING
handle = lv_handle
spoolid = lv_spoolid
partname = lv_partname
EXCEPTIONS
device_missing = 1
no_such_device = 2
operation_failed = 3
wrong_doctype = 4
wrong_devicetype = 5
OTHERS = 6.
IF sy–subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.CONCATENATE lv_partname ‚.pdf‘ INTO lv_filename.
…
* PDF in Spool schreiben
CALL FUNCTION ‚ADS_WRITE_TO_FILE‘
EXPORTING
filename = lv_filename
buffer = lv_xstring
append = ‚X‘
EXCEPTIONS
cannot_open_file = 1
open_dataset_no_authority = 2
open_dataset_internal_error = 3
open_dataset_too_many_files = 4
dataset_cant_close = 5
close_dataset_internal_error = 6
cannot_close_file = 7
cannot_transfer_data = 8
transfer_internal_error = 9
dataset_write_error = 10
OTHERS = 11.
IF sy–subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.* PDF Größe ermitteln
CLEAR: lv_size, lv_pages, lv_new_partname.
lv_size = xstrlen( lv_xstring ).
lv_pages = gv_result–tdpages.** ADS_CREATE_PDF_SPOOLJOB
* lv_total_pages = lv_total_pages + lv_pages.* Schreiben einer Zeile in einen offenen ADS Spoolauftrag
CALL FUNCTION ‚ADS_SR_CONFIRM‘
EXPORTING
handle = lv_handle
partname = lv_partname
size = lv_size
pages = lv_pages
IMPORTING
new_partname = lv_new_partname
EXCEPTIONS
handle_not_valid = 1
operation_failed = 2
OTHERS = 3.
IF sy–subrc NE 0.
ev_retcode = 4.
RETURN.
ENDIF.CONCATENATE lv_new_partname ‚.pdf‘ INTO lv_filename.
lv_partname = lv_new_partname.
…
CALL FUNCTION ‚ADS_SR_CLOSE‘
EXPORTING
handle = lv_handle
final = ‚X‘
EXCEPTIONS
OTHERS = 1.
Die Spooldatei mit mehreren Dokumenten konnte erfolgreich ausgegeben werden.