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

Bu blogdaki popüler yayınlar

Transaction Code assignment for Query created in SQVI - SQVI Raporu Tcode Bağlanması