上传文件,产生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 0 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 0 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 0 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