Add PDF to Mail attachment from DMS File
*&---------------------------------------------------------------------*
*& Form prepare_dms_data_mail - DÜZELTME: PDF binary format
*& PDF açılmıyorsa sebep: sdokcntbin satır uzunluğu <> 255 byte.
*& Önce tabloyu XSTRING yap, sonra 255 byte'lık SOLIX'e çevir.
*&---------------------------------------------------------------------*
FORM prepare_dms_data_mail.
DATA: mt_drat TYPE TABLE OF drat,
mt_files TYPE TABLE OF cvapi_doc_file,
mt_components TYPE TABLE OF cvapi_doc_comp,
mt_accessinf TYPE STANDARD TABLE OF scms_acinf,
mt_bintab TYPE STANDARD TABLE OF sdokcntbin,
ms_bintab TYPE sdokcntbin,
ms_draw TYPE draw.
DATA: lt_pdf_content TYPE solix_tab,
ls_pdf_content LIKE LINE OF lt_pdf_content,
lv_subject TYPE so_obj_des,
lv_xstring TYPE xstring,
lv_offset TYPE i VALUE 0,
lv_total TYPE i,
lv_chunk TYPE i.
FIELD-SYMBOLS: <files> TYPE cvapi_doc_file.
DATA lv_atinn TYPE atinn.
CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
EXPORTING
input = 'ZPART'
IMPORTING
output = lv_atinn.
SELECT DISTINCT
drad~doknr,
MAX( drad~dokvr ) AS dokvr,
item~matnr AS matnr
FROM drad
INNER JOIN @gt_item AS item ON item~matnr EQ drad~objky
INNER JOIN ausp ON ausp~objek EQ item~matnr
AND ausp~atinn EQ @lv_atinn
AND ausp~atwrt EQ 'PC0041'
AND ausp~objek EQ drad~objky
AND drad~dokar EQ 'ZTK'
AND drad~doktl EQ '000'
GROUP BY drad~doknr, item~matnr
INTO TABLE @DATA(lt_documents).
LOOP AT lt_documents ASSIGNING FIELD-SYMBOL(<lfs_data>) WHERE doknr IS NOT INITIAL.
sy-langu = 'T'.
ms_draw-doknr = <lfs_data>-doknr.
ms_draw-dokar = 'ZTK'.
ms_draw-dokvr = <lfs_data>-dokvr.
ms_draw-doktl = '000'.
CLEAR: mt_files, mt_components, mt_drat.
CALL FUNCTION 'CVAPI_DOC_GETDETAIL'
EXPORTING
pf_dokar = ms_draw-dokar
pf_doknr = ms_draw-doknr
pf_dokvr = ms_draw-dokvr
pf_doktl = ms_draw-doktl
pf_read_drat = abap_true
pf_read_comp = abap_true
IMPORTING
psx_draw = ms_draw
TABLES
pt_drat = mt_drat
pt_files = mt_files
pt_comp = mt_components
EXCEPTIONS
not_found = 1
no_auth = 2
error = 3
OTHERS = 4.
IF sy-subrc <> 0 OR mt_files IS INITIAL.
CONTINUE.
ENDIF.
LOOP AT mt_files ASSIGNING <files>.
CLEAR: mt_accessinf, mt_bintab, lv_xstring, lt_pdf_content.
CALL FUNCTION 'SCMS_DOC_READ'
EXPORTING
stor_cat = <files>-storage_cat
doc_id = <files>-ph_objid
TABLES
access_info = mt_accessinf
content_bin = mt_bintab
EXCEPTIONS
bad_storage_type = 1
bad_request = 2
unauthorized = 3
comp_not_found = 4
not_found = 5
forbidden = 6
conflict = 7
internal_server_error = 8
error_http = 9
error_signature = 10
error_config = 11
error_format = 12
error_parameter = 13
error = 14
OTHERS = 15.
IF sy-subrc <> 0 OR mt_bintab IS INITIAL.
CONTINUE.
ENDIF.
" 1) sdokcntbin tablosunu XSTRING'e çevir (byte birleştirme)
CLEAR lv_xstring.
LOOP AT mt_bintab INTO ms_bintab.
lv_xstring = lv_xstring && ms_bintab-line.
ENDLOOP.
" Boş veya çok kısa içerik ekleme
lv_total = xstrlen( lv_xstring ).
IF lv_total < 10.
CONTINUE.
ENDIF.
" 2) XSTRING'i 255 byte'lık SOLIX satırlarına çevir (ana PDF ile aynı format)
CLEAR lt_pdf_content.
lv_offset = 0.
WHILE lv_offset < lv_total.
lv_chunk = 255.
IF lv_total - lv_offset < lv_chunk.
lv_chunk = lv_total - lv_offset.
ENDIF.
IF lv_chunk <= 0.
EXIT.
ENDIF.
CLEAR ls_pdf_content.
ls_pdf_content-line = lv_xstring+lv_offset(lv_chunk).
APPEND ls_pdf_content TO lt_pdf_content.
lv_offset = lv_offset + lv_chunk.
ENDWHILE.
IF lt_pdf_content IS INITIAL.
CONTINUE.
ENDIF.
CONCATENATE <lfs_data>-matnr 'Teknik resmi' INTO lv_subject SEPARATED BY space.
CALL METHOD lo_document->add_attachment
EXPORTING
i_attachment_type = 'PDF'
i_attachment_subject = lv_subject
i_att_content_hex = lt_pdf_content.
CLEAR lv_subject.
ENDLOOP.
ENDLOOP.
ENDFORM.
Yorumlar
Yorum Gönder