sf生成PDF至FTP

Z_06MM_FWYS_PRINT

FUNCTION z_06mm_fwys_print.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------
* 数据申明
  data:ET_ALV TYPE Z29MMTENTRYSHEET.
*  data:ET_LINES like TLINE.
  DATA:lt_number TYPE TABLE OF z06pms_not_number_i WITH HEADER LINE,
       ls_number TYPE z06pms_not_number_i.
  DATA: gt_alv    TYPE TABLE OF z29mmsentrysheet.
  DATA:gt_hs TYPE STANDARD TABLE OF tline  .
  DATA:gs_hs TYPE  tline  .
  RANGES:r_qmnum FOR qmel-qmnum.
  DATA:gs_alv TYPE z29mmsentrysheet.

  DATA:return_pdf TYPE TABLE OF z06pms_bapiret2 WITH HEADER LINE.

  DATA:lv_path TYPE z06pmepath,
       lv_filename TYPE z06pmefilename,
       lt_return TYPE TABLE OF z06pms_bapiret2 WITH HEADER LINE,
       ls_return TYPE z06pms_bapiret2.

  DATA:lv_msg TYPE string.

*      data :              gt_notif_otfdata_01 TYPE TABLE OF itcoo.
  "----------------------------------------------------------------------
* 数据初始化
  INCLUDE z06pm500_z01_notif_print_01.

  CLEAR:object_tab[],gs_notif_ssfcrescl,gt_notif_otfdata[],gs_notif_otfdata.

  CLEAR:lv_msg.

  CLEAR:return_pdf[].

  CLEAR:lv_path,lv_filename,lt_return[],ls_return.

  CLEAR:return_notif_print[],gs_return_notif_print.

*  gv_webusrid = i_webusrid.
*"----------------------------------------------------------------------
* 数据校验
*"----------------------------------------------------------------------
* 获取打印数据
*-------------------
  IF IV_ALV[] IS NOT INITIAL.
    PERFORM frm_print TABLES    IV_ALV
                                IV_LINES
                      CHANGING  ccc_ccc  .
  ELSE.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '093' INTO lv_msg.
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO lt_return.CLEAR:ls_return.
  ENDIF.
*"----------------------------------------------------------------------
* 处理打印返回参数
  APPEND LINES OF return_notif_print TO lt_return.

  LOOP AT lt_return TRANSPORTING NO FIELDS WHERE type CA 'EA'.
    EXIT.
  ENDLOOP.
*"----------------------------------------------------------------------
* SMARTFORMS生成PDF至FTP
  IF sy-subrc <> 0.
    IF gt_notif_otfdata_01[] IS NOT INITIAL.
      CALL FUNCTION 'Z_06PM_NOTIF_SF_TO_FTP'
        IMPORTING
          e_path     = lv_path
          e_filename = lv_filename
        TABLES
          it_otfdata = gt_notif_otfdata_01
          et_return  = return_pdf.

      APPEND LINES OF return_pdf TO lt_return.
    ELSE.
      MESSAGE ID 'Z06500' TYPE 'E' NUMBER '080' INTO lv_msg.
      ls_return-type = 'E'.
      ls_return-message = lv_msg.
      APPEND ls_return TO lt_return.CLEAR:ls_return.
    ENDIF.
  ENDIF.
*"----------------------------------------------------------------------
  e_path = lv_path.
  e_filename = lv_filename.
  et_return[] = lt_return[].
*"----------------------------------------------------------------------
ENDFUNCTION.

Z_06PM_NOTIF_SF_TO_FTP

FUNCTION z_06pm_notif_sf_to_ftp.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  EXPORTING
*"     VALUE(E_PATH) TYPE  Z06PMEPATH
*"     VALUE(E_FILENAME) TYPE  Z06PMEFILENAME
*"  TABLES
*"      IT_OTFDATA STRUCTURE  ITCOO
*"      ET_RETURN STRUCTURE  Z06PMS_BAPIRET2
*"----------------------------------------------------------------------
* 数据申明
  DATA:lt_otfdata TYPE TABLE OF itcoo WITH HEADER LINE.

  DATA:file_bin TYPE xstring,
       file_size(12) TYPE c.

  DATA:lv_hdl TYPE i,
       lv_command(255) TYPE c,
       lv_blength TYPE i,
       lv_num(100) TYPE i,
       lv_ftp_path TYPE z06pmepath,
       lv_path TYPE z06pmepath,
       lv_filename TYPE char1024,
       lv_comp_sizp TYPE i,
       lv_guid TYPE sysuuid_c32.

  DATA:lt_lines TYPE TABLE OF tline,
       ls_lines TYPE tline.

  TYPES:BEGIN OF ls_blob,
    line(1022) TYPE x,
  END OF ls_blob.

  DATA:lt_bindata TYPE STANDARD TABLE OF ls_blob,
       ls_bindata TYPE ls_blob.

  DATA:BEGIN OF it_result OCCURS 0,
    line(100) TYPE c,
  END OF it_result.

  DATA:ls_msgout TYPE LINE OF z10wfsket1,
       ls_return TYPE z06pms_bapiret2,
       lv_msg TYPE string,
       lv_oref TYPE REF TO cx_uuid_error,
       ls_ftp TYPE z06pmtftpcf.
*"----------------------------------------------------------------------
* 数据初始化
  CLEAR:lt_otfdata[].

  CLEAR:file_bin,file_size.

  CLEAR:lv_hdl,lv_command,lv_blength,lv_num,lv_ftp_path,lv_filename,lv_comp_sizp,lv_guid.

  CLEAR:lt_lines[],ls_lines.

  CLEAR:lt_bindata[],ls_bindata.

  CLEAR:it_result[].

  CLEAR:ls_msgout,ls_return,lv_msg,lv_oref,ls_ftp.

  lt_otfdata[] = it_otfdata[].
* 查询FTP配置表
  SELECT SINGLE *
     INTO ls_ftp
     FROM z06pmtftpcf
     WHERE intid EQ 'PWPFTP'.

  lv_ftp_path = ls_ftp-folder_t."临时文件夹
*  lv_ftp_path = '/upload'.
*"----------------------------------------------------------------------
* OTF预览和转换
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      format                = 'PDF'
    IMPORTING
      bin_filesize          = file_size
      bin_file              = file_bin
    TABLES
      otf                   = lt_otfdata
      lines                 = lt_lines
    EXCEPTIONS
      err_max_linewidth     = 1
      err_format            = 2
      err_conv_not_possible = 3
      err_bad_otf           = 4
      OTHERS                = 5.

  IF sy-subrc <> 0.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '087' INTO lv_msg.
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ENDIF.
*"----------------------------------------------------------------------
* 数据二进制转换
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = file_bin
    IMPORTING
      output_length = lv_comp_sizp
    TABLES
      binary_tab    = lt_bindata.
##FM_SUBRC_OK
  IF sy-subrc <> 0.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '088' INTO lv_msg.
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ELSE.
    lv_blength = lv_comp_sizp.
  ENDIF.
*"----------------------------------------------------------------------
* 连接FTP
  CALL FUNCTION 'Z_06PM_FTP_CONNECT'
    IMPORTING
      e_hdl = lv_hdl
      e_msg = ls_msgout.

  IF ls_msgout-msgtyp CA 'EA'.
    ls_return-type = ls_msgout-msgtyp.
    ls_return-message = ls_msgout-msgtxt.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ENDIF.
*"----------------------------------------------------------------------
* 操作FTP
* 打开upload文件夹
  CLEAR:lv_command.

  CONCATENATE 'cd' lv_ftp_path INTO lv_command SEPARATED BY space.

  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = lv_hdl
      command       = lv_command
    TABLES
      data          = it_result
    EXCEPTIONS
      command_error = 1
      tcpip_error   = 2.

  IF sy-subrc <> 0.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '089' INTO lv_msg."FTP操作失败-打开根目录失败
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ENDIF.
* 打开临时文件夹
  CLEAR:lv_command.

  CONCATENATE 'cd' lv_ftp_path INTO lv_command SEPARATED BY space.

  CONCATENATE lv_command sy-datum INTO lv_command. "edit by pxmwyzh 20181014
*  CONCATENATE lv_command '/' sy-datum INTO lv_command.

  CALL FUNCTION 'FTP_COMMAND'
    EXPORTING
      handle        = lv_hdl
      command       = lv_command
    TABLES
      data          = it_result
    EXCEPTIONS
      command_error = 1
      tcpip_error   = 2.

  IF sy-subrc = 1.
* 如临时文件夹不存在,创建临时文件夹
    CLEAR:lv_command.

    CONCATENATE 'mkdir' sy-datum INTO lv_command SEPARATED BY space.

    CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
        handle        = lv_hdl
        command       = lv_command
      TABLES
        data          = it_result
      EXCEPTIONS
        command_error = 1
        tcpip_error   = 2.

    IF sy-subrc <> 0.
      MESSAGE ID 'Z06500' TYPE 'E' NUMBER '100' INTO lv_msg."FTP操作失败-创建子目录失败
      ls_return-type = 'E'.
      ls_return-message = lv_msg.
      APPEND ls_return TO et_return.CLEAR:ls_return.

      RETURN.
    ENDIF.
* 打开临时文件夹
    CLEAR:lv_command.

    CONCATENATE 'cd' lv_ftp_path INTO lv_command SEPARATED BY space.

    CONCATENATE lv_command sy-datum INTO lv_command. "edit by pxmwyzh 20181014
*    CONCATENATE lv_command '/' sy-datum INTO lv_command.

    CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
        handle        = lv_hdl
        command       = lv_command
      TABLES
        data          = it_result
      EXCEPTIONS
        command_error = 1
        tcpip_error   = 2.

    IF sy-subrc <> 0.
      MESSAGE ID 'Z06500' TYPE 'E' NUMBER '101' INTO lv_msg. "FTP操作失败-打开子目录失败
      ls_return-type = 'E'.
      ls_return-message = lv_msg.
      APPEND ls_return TO et_return.CLEAR:ls_return.

      RETURN.
    ENDIF.
  ELSEIF sy-subrc <> 0 AND sy-subrc <> 1.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '101' INTO lv_msg.
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ENDIF.
*"----------------------------------------------------------------------
* 获取GUID
  TRY.
      lv_guid = cl_system_uuid=>create_uuid_c32_static( ).
    CATCH cx_uuid_error INTO lv_oref.
      ls_return-type = 'E'.
      ls_return-number = '000'.
      ls_return-message =  lv_oref->get_text( ).
      APPEND ls_return TO et_return.CLEAR:ls_return.

      RETURN.
  ENDTRY.
*"----------------------------------------------------------------------
* 生成PDF文件
  CONCATENATE lv_guid '.pdf' INTO lv_filename.CONDENSE lv_filename NO-GAPS.

  CALL FUNCTION 'FTP_R3_TO_SERVER' "传输到FTP服务器
    EXPORTING
      handle        = lv_hdl
      fname         = lv_filename
      blob_length   = lv_blength
    TABLES
      blob          = lt_bindata
    EXCEPTIONS
      tcpip_error   = 1
      command_error = 2
      data_error    = 3.

  IF sy-subrc <> 0.
    MESSAGE ID 'Z06500' TYPE 'E' NUMBER '090' INTO lv_msg. "PDF文件生成失败
    ls_return-type = 'E'.
    ls_return-message = lv_msg.
    APPEND ls_return TO et_return.CLEAR:ls_return.

    RETURN.
  ENDIF.

  lv_num = strlen( lv_command ).

  lv_path = lv_command+2(lv_num).

  CONDENSE lv_path NO-GAPS.
*"----------------------------------------------------------------------
  e_path = lv_path.
  e_filename = lv_filename.
*"----------------------------------------------------------------------
ENDFUNCTION.

Z_06PM_FTP_CONNECT

FUNCTION z_06pm_ftp_connect.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  EXPORTING
*"     REFERENCE(E_HDL) TYPE  I
*"     REFERENCE(E_MSG) TYPE  Z10WFSKE01
*"----------------------------------------------------------------------

  DATA: lv_slen       TYPE i,
          lv_host(100)  TYPE c,
          lv_pwd(50)    TYPE c,
          ls_mess       TYPE z10wfske01,
          lv_hdl  TYPE i.
  DATA: ls_ftp TYPE z06pmtftpcf.
*查询配置表
  SELECT SINGLE *
     INTO ls_ftp
     FROM z06pmtftpcf
     WHERE intid EQ cns_intid .

* 生成FTP服务器地址
  CLEAR lv_host.
  CONCATENATE ls_ftp-ipadr ls_ftp-zport INTO lv_host SEPARATED BY space.
*  CONCATENATE cns_ip cns_port INTO lv_host SEPARATED BY space.
  CLEAR lv_slen.
  lv_slen = strlen( ls_ftp-paswd ).
*  lv_slen = strlen( cns_pass ).

* 将密码加密
  CLEAR lv_pwd.
  CALL FUNCTION 'HTTP_SCRAMBLE'
    EXPORTING
      source      = ls_ftp-paswd
*     source      = cns_pass
      sourcelen   = lv_slen
      key         = cns_key
    IMPORTING
      destination = lv_pwd.

* 连接到FTP服务器
  DO 3 TIMES.
    CLEAR lv_hdl.
    CALL FUNCTION 'FTP_CONNECT'
      EXPORTING
        user            = ls_ftp-usrid
*       user            = cns_user
        password        = lv_pwd
        host            = lv_host
        rfc_destination = cns_dest
      IMPORTING
        handle          = lv_hdl
      EXCEPTIONS
        not_connected   = 1.
    IF sy-subrc NE 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO ls_mess-msgtxt.
      ls_mess-msgtyp   = sy-msgty.
      ls_mess-msgno = sy-msgno.
      e_msg = ls_mess.
      RETURN.
    ENDIF.
  ENDDO.

  e_hdl = lv_hdl.


ENDFUNCTION.
原文地址:https://www.cnblogs.com/ckstock/p/10276905.html