SAP :ZINBOUND IDOC

29 篇文章 0 订阅

 

上传文件,产生IDOC

 

table: ZIDOC_INBOUND   Inbound IDOC background program

MANDT MANDT
PROGNAME PROGNAME

 

table: ZEDI_MAILLIST   Mail address for EDI

MANDT MANDT
SEQNO COMT_COUNTER
CUSTCODE KUN16
CUSTNAME AD_NAME1
EDITYPE /BCV/SIN_CHAR010
MAILADDR AD_SMTPADR
INPATH ESEFTAPPL
OUTPATH ESEFTAPPL
 

*&---------------------------------------------------------------------*
*& Report  ZINBOUND
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zinbound NO STANDARD PAGE HEADING LINE-SIZE 250 MESSAGE-ID zsd.

TABLES: ZEDI_MAILLIST,
        EDIDS.

DATA: l_dirname LIKE epsf-epsdirnam,
      l_filemask LIKE epsf-epsfilnam,
      complete_filename LIKE edi_path-pthnam,
      portname          LIKE edipo-port.

DATA: v_subrc TYPE c,
      v_msg TYPE text100,
      v_wait TYPE c.
DATA: v_program TYPE zidoc_inbound-progname.

DATA: it_dirlist LIKE epsfili OCCURS WITH HEADER LINE.

DATA: BEGIN OF it_file OCCURS 0,
        file(75),
        filename(100),
      END OF it_file.

DATA: p_ucode.

*DATA: log TYPE string.
DATA: SO_Num TYPE string.
*DATA: IDOC_Num TYPE string.
DATA: IDOC_Num LIKE edids OCCURS WITH HEADER LINE.
DATA: WA_IDOC_NUM LIKE LINE OF IDOC_NUM.

*DATA: SO_Num TYPE TABLE OF EDIDS WITH HEADER LINE.

PARAMETERS: p_s RADIOBUTTON GROUP rad DEFAULT 'X'.
PARAMETERS: p_path_s LIKE epsf-epsdirnam
                   DEFAULT '/sapmnt/DEV/global/interface/edi/lotus/GNN/850sap/850.txt' OBLIGATORY.
PARAMETERS: p_p RADIOBUTTON GROUP rad.
PARAMETERS: p_path LIKE epsf-epsdirnam
                   DEFAULT '/sapmnt/DEV/global/interface/edi/lotus/GNN/850sap/' OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERS: p_pathbk LIKE epsf-epsdirnam
                   DEFAULT '/sapmnt/DEV/global/interface/edi/lotus/GNN/850sap/Backup/'.
PARAMETERS: p_port LIKE edipo-port DEFAULT 'SALESORDER'
                   MATCHCODE OBJECT cpediportd.

START-OF-SELECTION.

  PERFORM check_lock.
  IF p_p 'X'.
    PERFORM get_file_list.
  ELSE.
    it_file-filename p_path_s.
    APPEND it_file.
  ENDIF.
  PERFORM exec_edi.
  PERFORM data_transfer.

  LOOP AT  IDOC_Num.

    CLEAR SO_Num.
*    wait up to 2 SECONDS.
    SELECT SINGLE STAPA2 INTO SO_Num FROM edids  WHERE DOCNUM IDOC_Num-DOCNUM AND STATUS '53'.

    if SO_Num ''.
      SO_Num 'ERROR: Fail to find the SO#'.
    endif.

    PERFORM Send_Mail.
  ENDLOOP.
*&---------------------------------------------------------------------*
*&      Form  CHECK_LOCK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM check_lock.
  v_program 'ZINBOUND'.
  v_wait space.

  PERFORM do_lock USING v_program v_wait CHANGING v_subrc v_msg.
  IF v_subrc <> 0.
    WRITE: v_msg.
    STOP.
  ENDIF.
ENDFORM.                    "CHECK_LOCK

*&---------------------------------------------------------------------*
*&      Form  GET_FILE_LIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_file_list.
*  L_FILEMASK = '*.TXT'.
  l_dirname p_path.
  CLEAR: it_dirlist,it_file.
  REFRESH: it_dirlist,it_file.

  WRITE: 'Start reading inbound IDOC file:' COLOR COL_HEADING.
  ULINE.
  CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
    EXPORTING
      dir_name               l_dirname
    TABLES
      dir_list               it_dirlist
    EXCEPTIONS
      invalid_eps_subdir     1
      sapgparam_failed       2
      build_directory_failed 3
      no_authorization       4
      read_directory_failed  5
      too_many_read_errors   6
      empty_directory_list   7
      OTHERS                 8.
  IF sy-subrc <> 0.
    WRITE: 'Invalid directory!!!'.
    STOP.
  ELSE.
    LOOP AT it_dirlist.
      CHECK it_dirlist-name <> '.' AND it_dirlist-name <> '..'.
      it_file-file it_dirlist-name.
      CONCATENATE l_dirname it_dirlist-name INTO it_file-filename.
      APPEND it_file.
    ENDLOOP.

    IF it_file[] IS INITIAL.
      WRITE: 'No file exist in directory!!!'.
      STOP.
    ENDIF.
  ENDIF.

  SKIP.

ENDFORM.                    "GET_FILE_LIST

*&---------------------------------------------------------------------*
*&      Form  EXEC_EDI
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM exec_edi.

  DATA: lv_subrc LIKE sy-subrc.
  DATA: str TYPE string.

  WRITE: 'Start processing inbound IDOC file:' COLOR COL_HEADING.
  ULINE.

  IF p_ucode 'X'.
    portname p_port.
  ELSE.
    portname p_port.
  ENDIF.

  LOOP AT it_file.
*   Assign values to an actual parameter
    complete_filename it_file-filename.

    PERFORM move_file USING it_file-file it_file-filename
                      CHANGING lv_subrc.

*   Call FM
*    SET UPDATE TASK LOCAL.
*    CALL FUNCTION 'EDI_DATA_INCOMING'
*      EXPORTING
*        PATHNAME = COMPLETE_FILENAME
*        PORT     = PORTNAME
*      EXCEPTIONS
*        OTHERS   = 1.
    WRITE: 'File name:', complete_filename.

    CALL FUNCTION 'IDOC_INBOUND_FROM_FILE'
      EXPORTING
        file_name            complete_filename
        port                 portname
      EXCEPTIONS
        file_open_failed     1
        marker_to_be_deleted 2
        read_file_failed     3
        idoc_not_stored      4
        file_delete_failed   5
        marker_modify_failed 6
        event_create_failed  7
        first_record_invalid 8
        invalid_record       9
        OTHERS               10.
* commit work and wait.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        INTO str.
*      log = str.
      WRITE: 'Failed:',str.
    ELSE.
      MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        INTO str.
*      log = str.
      WRITE: 'Success:',str.
    ENDIF.
*    IDOC_Num = sy-msgv1.
    WA_IDOC_NUM-STATXT it_file-file+21(7).
    WA_IDOC_NUM-DOCNUM sy-msgv1.
    APPEND WA_IDOC_NUM TO IDOC_Num.


  ENDLOOP.

ENDFORM.                    "EXEC_EDI

FORM Send_Mail.
*  DATA: IT_MAILIST LIKE STANDARD TABLE OF ZEDI_MAILLIST WITH HEADER LINE.
  DATA: Send_to LIKE SOMLRECI1 OCCURS WITH HEADER LINE.

  DATA: E_MAIL_SUBJECT TYPE SO_OBJ_DES.
  DATA: OBJTXT   LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.
  DATA: OBJKEY   TYPE SWO_TYPEID.
  DATA: OBJTYP   TYPE SWO_OBJTYP.


  DATA: t_type  TYPE char3.
  DATA: t_Num   TYPE char10.
*Mail Subject
  if p_port 'SALESORDER'.
    t_type '850'.
*    E_MAIL_SUBJECT = 'New PO(EDI850)#'IDOC_Num-STATXT' from GNN'.
    CONCATENATE 'New PO(EDI850)#'IDOC_Num-STATXT' from GNN' INTO E_MAIL_SUBJECT.
  else.
    t_type '860'.
*    E_MAIL_SUBJECT = 'New PO change(EDI860)#'IDOC_Num-STATXT' from GNN'.
    CONCATENATE 'New PO change(EDI860)#'IDOC_Num-STATXT' from GNN' INTO E_MAIL_SUBJECT.
  endif.

* Mail Body
  OBJTXT 'Dear All:'.
  APPEND OBJTXT.
  OBJTXT 'Please find the sales order in sap.'.
  APPEND OBJTXT.
  OBJTXT ''.
  APPEND OBJTXT.
  OBJTXT 'Sales Order:'.
  APPEND OBJTXT.
  OBJTXT SO_Num.
  APPEND OBJTXT.
  OBJTXT ''.
  APPEND OBJTXT.
  APPEND OBJTXT.
  OBJTXT 'IDOC Number: '.
  APPEND OBJTXT.
  OBJTXT IDOC_Num-DOCNUM.
  APPEND OBJTXT.

  IF SO_Num <> 'ERROR: Fail to find the SO#'.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  SO_Num
      IMPORTING
        output t_Num.

    OBJKEY t_Num.
    OBJTYP 'BUS2032'.

  ENDIF.



* SEND TO
  SELECT MAILADDR FROM ZEDI_MAILLIST INTO TABLE Send_to WHERE CUSTCODE '0000000000203702' AND EDITYPE t_type.

*  Send_to = IT_MAILIST.

  CALL FUNCTION 'ZKZ_SEND_MAIL_WITH_BOR'
    EXPORTING
      MAIL_SUBJECT E_MAIL_SUBJECT
      P_OBJTYP     OBJTYP
      P_OBJKEY     OBJKEY
    TABLES
      MAIL_BODY    OBJTXT
      MAIL_SENDTO  Send_to.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  DATA_TRANSFER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM data_transfer.
  SUBMIT rbdapp01 WITH credat sy-datum AND RETURN .       "tcode:bd20

  PERFORM un_lock USING 'ZINBOUND'.
ENDFORM.                    "DATA_TRANSFER
*&--------------------------------------------------------------------*
*&      Form  do_lock
*&--------------------------------------------------------------------*
*       提交一个锁定
*---------------------------------------------------------------------*
*      -->PI_PROGNAME 程序名
*      -->PI_WAIT    是否等待
*      -->PI_SHOW_MSG 是否显示消息
*      -->PO_SUBRC 返回状态
*      -->PO_MSG     返回的消息
*---------------------------------------------------------------------*
FORM do_lock USING pi_progname TYPE progname
                                   pi_wait TYPE c      "X=waiting
                          CHANGING po_subrc TYPE c     "0=OK,非0=Error
                                   po_msg TYPE text100.
  CALL FUNCTION 'ENQUEUE_EZIDOC_INBOUND'
    EXPORTING
      mode_zidoc_inbound 'E'
      mandt              sy-mandt
      progname           pi_progname
      _wait              pi_wait
    EXCEPTIONS
      foreign_lock       1
      system_failure     2
      OTHERS             3.

  IF sy-subrc <> 0.
    po_subrc '4'.
    IF sy-subrc 4.
      CONCATENATE 'Program is running by' sy-msgv1 INTO po_msg SEPARATED BY space.
    ELSE.
      po_msg 'Error when locking'.
    ENDIF.
  ELSE.
    po_subrc '0'.
  ENDIF.
ENDFORM.                    "do_lock
*&--------------------------------------------------------------------*
*&      Form  release_lock
*&--------------------------------------------------------------------*
*       释放锁定
*---------------------------------------------------------------------*
*      -->PI_PROGNAME 程序名
*---------------------------------------------------------------------*
FORM un_lock USING pi_progname TYPE progname.
  CALL FUNCTION 'DEQUEUE_EZIDOC_INBOUND'
    EXPORTING
      mode_zidoc_inbound 'E'
      mandt              sy-mandt
      progname           pi_progname.

ENDFORM.                    "release_lock
*&---------------------------------------------------------------------*
*&      Form  MOVE_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_IT_FILE_FILENAME  text
*      <--P_LV_SURBC  text
*----------------------------------------------------------------------*
FORM move_file  USING    p_filename p_fullname
                CHANGING p_subrc TYPE sy-subrc.

  DATA: bak_filename TYPE string,
        filename TYPE string,
        path TYPE string.

  DATA: str TYPE string.

  filename p_fullname.
  CONDENSE filename.

  WRITE: 'Start moving file:'.

*  CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
*    EXPORTING
*      full_name     = p_filename
*    IMPORTING
*      stripped_name = filename
*      file_path     = path
*    EXCEPTIONS
*      x_error       = 1
*      OTHERS        = 2.
*  IF sy-subrc <> 0.
*    WRITE: 'Invalid file name', p_filename.
** Implement suitable error handling here
*  ELSE.
  CONCATENATE p_pathbk p_filename INTO bak_filename.

  OPEN DATASET p_fullname FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  IF sy-subrc 0.
    OPEN DATASET bak_filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
    IF sy-subrc 0.
      DO.
        READ DATASET p_fullname INTO str.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.

        TRANSFER str TO bak_filename.
      ENDDO.

      CLOSE DATASET bak_filename.
      WRITE: 'File', filename,'has been moved to',bak_filename.
    ELSE.
      WRITE: 'Backup directory is not valid'.
    ENDIF.
    CLOSE DATASET p_fullname.
  ENDIF.
*  ENDIF.

ENDFORM.                    " MOVE_FILE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值