ZMLSCP1_FR0013 合肥美菱采購訂單下傳SRM系統(send)
FUNCTION zmlscp1_fr0013.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" POHDEAR STRUCTURE ZSMLPO_HDR OPTIONAL
*" POITEMS STRUCTURE ZSMLPO_ITEM OPTIONAL
*" RET_MSGS STRUCTURE ZSMLPO_MSG1 OPTIONAL
*"----------------------------------------------------------------------
*data definition
DATA: error TYPE REF TO cx_ai_system_fault.
DATA: prxy TYPE REF TO zco_request_handle_mlpurchase."Proxy Name
DATA: z_in TYPE zrequest8."request in
DATA: z_out TYPE zresponse8."request out
DATA: lv_aufnr TYPE aufnr.
DATA: lv_cy_seqnr TYPE cy_seqnr."生産訂單配置設定标簽上字段螢幕順序号
* 傳回封包内表
DATA: BEGIN OF basereturnheader OCCURS 0,
hresv1 TYPE c LENGTH 20,"采購訂單号
hresv2 TYPE c LENGTH 20,"行項目号
hresv3 TYPE c LENGTH 20,
hresv4 TYPE c LENGTH 20,
hresv5 TYPE c LENGTH 20,
returnmsg TYPE c LENGTH 200,"消息文本
status TYPE c LENGTH 20,"消息狀态(S或E)
uuid TYPE c LENGTH 30,"ID"
END OF basereturnheader.
DATA: basereturnitem LIKE basereturnheader OCCURS 0 WITH HEADER LINE.
DATA: lo_oref TYPE REF TO cx_st_error.
*clear return parameters
CLEAR ret_msgs.
*delete lines where ebeln is null
DELETE pohdear WHERE ebeln IS INITIAL.
DELETE poitems WHERE ebeln IS INITIAL.
*check input data
IF pohdear[] IS INITIAL OR poitems[] IS INITIAL.
ret_msgs-msgty = 'E'.
ret_msgs-msgtx = '傳入參數POHDEAR或POHDEAR不能為空'.
APPEND ret_msgs.
EXIT.
ENDIF.
* Get filed value
LOOP AT poitems.
* 需求跟蹤号存的值為生産訂單号,根據生産訂單取物料代碼+描述
IF NOT poitems-bednr IS INITIAL.
CLEAR lv_aufnr.
* 采購訂單上的需求跟蹤号長度10,而生産訂單長度12
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = poitems-bednr
IMPORTING
output = lv_aufnr.
SELECT SINGLE matnr FROM afpo INTO poitems-co_matnr WHERE aufnr EQ lv_aufnr.
IF sy-subrc EQ 0.
SELECT SINGLE maktx FROM makt INTO poitems-co_matxt WHERE matnr EQ poitems-co_matnr
AND spras EQ sy-langu.
* 物料主資料SCP供應鍊字段擷取
SELECT SINGLE zcbwl zjit zctwl zzdzd zjmwl zbbwl INTO
(poitems-zcbwl,poitems-zjit,poitems-zctwl,poitems-zzdzd,poitems-zjmwl,poitems-zbbwl) FROM zmlscpzsj
WHERE matnr EQ poitems-co_matnr
AND werks EQ poitems-werks.
* 生産訂單配置設定标簽上的螢幕配置設定号字段
CLEAR lv_cy_seqnr.
SELECT SINGLE cy_seqnr INTO lv_cy_seqnr FROM afko WHERE aufnr EQ lv_aufnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = lv_cy_seqnr
IMPORTING
output = poitems-backup1.
ENDIF.
ENDIF.
* Set canOntime(業務狀态:是否可以按時交貨)
* Set noR3Receive(R3未收貨數量)
MODIFY poitems.
CLEAR poitems.
ENDLOOP.
CLEAR: xmlstr,z_in,z_out.
*generate xml string
CONCATENATE '<?xml version="1.0" encoding="utf-8"?>' xmlstr INTO xmlstr.
append_data_to_xml 'handleMLPurchaseOrderService' '' 'B'.
append_data_to_xml 'in0' '' 'B'.
append_data_to_xml 'pos' '' 'B'.
LOOP AT pohdear.
append_data_to_xml 'Po' '' 'B'.
append_data_to_xml 'poHeader' '' 'B'.
append_data_to_xml 'aedat' pohdear-aedat 'A'.
append_data_to_xml 'backup1' '' 'A'.
append_data_to_xml 'backup2' '' 'A'.
append_data_to_xml 'backup3' '' 'A'.
append_data_to_xml 'backup4' '' 'A'.
append_data_to_xml 'backup5' '' 'A'.
append_data_to_xml 'backup6' '' 'A'.
append_data_to_xml 'bedat' pohdear-bedat 'A'.
append_data_to_xml 'bsart' pohdear-bsart 'A'.
append_data_to_xml 'bukrs' pohdear-bukrs 'A'.
append_data_to_xml 'ebeln' pohdear-ebeln 'A'.
append_data_to_xml 'ekgrp' pohdear-ekgrp 'A'.
append_data_to_xml 'ekorg' pohdear-ekorg 'A'.
append_data_to_xml 'elikz' pohdear-elikz 'A'.
append_data_to_xml 'ernam' pohdear-ernam 'A'.
append_data_to_xml 'frggr' pohdear-frggr 'A'.
append_data_to_xml 'frgsx' pohdear-frgsx 'A'.
append_data_to_xml 'iresv1' pohdear-iresv1 'A'.
append_data_to_xml 'iresv10' '' 'A'.
append_data_to_xml 'iresv2' '' 'A'.
append_data_to_xml 'iresv3' '' 'A'.
append_data_to_xml 'iresv4' '' 'A'.
append_data_to_xml 'iresv5' '' 'A'.
append_data_to_xml 'iresv6' '' 'A'.
append_data_to_xml 'iresv7' '' 'A'.
append_data_to_xml 'iresv8' '' 'A'.
append_data_to_xml 'iresv9' '' 'A'.
append_data_to_xml 'lifnr' pohdear-lifnr 'A'.
append_data_to_xml 'loekz' pohdear-loekz 'A'.
append_data_to_xml 'waers' pohdear-waers 'A'.
append_data_to_xml 'zterm' pohdear-zterm 'A'.
append_data_to_xml 'poHeader' '' 'E'.
append_data_to_xml 'poItem' '' 'B'.
LOOP AT poitems WHERE ebeln EQ pohdear-ebeln.
append_data_to_xml 'PoItem' '' 'B'.
append_data_to_xml 'backup1' poitems-backup1 'A'.
append_data_to_xml 'backup2' poitems-backup2 'A'.
append_data_to_xml 'backup3' poitems-backup3 'A'.
append_data_to_xml 'backup4' poitems-backup4 'A'.
append_data_to_xml 'backup5' poitems-backup5 'A'.
append_data_to_xml 'backup6' poitems-backup6 'A'.
append_data_to_xml 'bednr' poitems-bednr 'A'.
append_data_to_xml 'canOntime' poitems-canontime 'A'.
append_data_to_xml 'charg' poitems-charg 'A'.
append_data_to_xml 'co_matnr' poitems-co_matnr 'A'.
append_data_to_xml 'co_matxt' poitems-co_matxt 'A'.
append_data_to_xml 'ebeln' poitems-ebeln 'A'.
append_data_to_xml 'ebelp' poitems-ebelp 'A'.
append_data_to_xml 'eindt' poitems-eindt 'A'.
append_data_to_xml 'ekgrp' poitems-ekgrp 'A'.
append_data_to_xml 'elikz' poitems-elikz 'A'.
append_data_to_xml 'isShouHuo' '' 'A'.
append_data_to_xml 'knttp' poitems-knttp 'A'.
append_data_to_xml 'lgort' poitems-lgort 'A'.
append_data_to_xml 'loekz' poitems-loekz 'A'.
append_data_to_xml 'matkl' poitems-matkl 'A'.
append_data_to_xml 'matnr' poitems-matnr 'A'.
append_data_to_xml 'meins' poitems-meins 'A'.
append_data_to_xml 'menge' poitems-menge 'A'.
append_data_to_xml 'mfrnr' poitems-mfrnr 'A'.
append_data_to_xml 'mwskz' poitems-mwskz 'A'.
append_data_to_xml 'noR3Receive' poitems-nor3receive 'A'.
append_data_to_xml 'pstyp' poitems-pstyp 'A'.
append_data_to_xml 'repos' poitems-repos 'A'.
append_data_to_xml 'susr1' poitems-susr1 'A'.
append_data_to_xml 'susr10' poitems-susr10 'A'.
append_data_to_xml 'susr11' poitems-susr11 'A'.
append_data_to_xml 'susr12' poitems-susr12 'A'.
append_data_to_xml 'susr13' poitems-susr13 'A'.
append_data_to_xml 'susr14' poitems-susr14 'A'.
append_data_to_xml 'susr15' poitems-susr15 'A'.
append_data_to_xml 'susr2' poitems-susr2 'A'.
append_data_to_xml 'susr3' poitems-susr3 'A'.
append_data_to_xml 'susr4' poitems-susr4 'A'.
append_data_to_xml 'susr5' poitems-susr5 'A'.
append_data_to_xml 'susr6' poitems-susr6 'A'.
append_data_to_xml 'susr7' poitems-susr7 'A'.
append_data_to_xml 'susr8' poitems-susr8 'A'.
append_data_to_xml 'susr9' poitems-susr9 'A'.
append_data_to_xml 'uebto' poitems-uebto 'A'.
append_data_to_xml 'untto' poitems-untto 'A'.
append_data_to_xml 'webre' poitems-webre 'A'.
append_data_to_xml 'werks' poitems-webre 'A'.
append_data_to_xml 'xersy' poitems-xersy 'A'.
append_data_to_xml 'zbbwl' poitems-zbbwl 'A'.
append_data_to_xml 'zcbwl' poitems-zcbwl 'A'.
append_data_to_xml 'zctwl' poitems-zctwl 'A'.
append_data_to_xml 'zjit' poitems-zjit 'A'.
append_data_to_xml 'zjmwl' poitems-zjmwl 'A'.
append_data_to_xml 'zzdzd' poitems-zzdzd 'A'.
append_data_to_xml 'PoItem' '' 'E'.
CLEAR poitems.
ENDLOOP.
append_data_to_xml 'poItem' '' 'E'.
append_data_to_xml 'Po' '' 'E'.
CLEAR pohdear.
ENDLOOP.
append_data_to_xml 'pos' '' 'E'.
append_data_to_xml 'in0' '' 'E'.
append_data_to_xml 'handleMLPurchaseOrderService' '' 'E'.
z_in-request_data = xmlstr.
* 發送前記錄發送的訂單資料,狀态Y
DATA: itab_zmlscp_log01 TYPE zmlscp_log01 OCCURS 0 WITH HEADER LINE.
DATA: lv_ztime LIKE zmlscp_log01-ztime.
lv_ztime = sy-datum && sy-uzeit.
LOOP AT pohdear.
CLEAR itab_zmlscp_log01.
itab_zmlscp_log01-ebeln = pohdear-ebeln.
itab_zmlscp_log01-msgty = 'Y'.
itab_zmlscp_log01-msgtx = '已發送,等待SRM傳回處理結果'.
itab_zmlscp_log01-ztime = lv_ztime.
itab_zmlscp_log01-uname = sy-uname.
APPEND itab_zmlscp_log01.
CLEAR pohdear.
ENDLOOP.
INSERT zmlscp_log01 FROM TABLE itab_zmlscp_log01.
* COMMIT WORK AND WAIT.
*send data to srm via cis(soa)
CLEAR error.
TRY.
CREATE OBJECT prxy
EXPORTING
logical_port_name = 'ZMLSCP_SEND_PO'.
CALL METHOD prxy->request
EXPORTING
input = z_in
IMPORTING
output = z_out.
CATCH cx_ai_system_fault INTO error.
ret_msgs-msgty = 'E'.
ret_msgs-msgtx = error->errortext.
APPEND ret_msgs.
EXIT.
ENDTRY.
* 傳回封包解析(XML字元串解析)
IF z_out-return_code EQ 'S'."CIS轉發成功
IF z_out-return_data IS NOT INITIAL."業務系統傳回封包不為空
TRY .
BREAK-POINT.
REFRESH: basereturnheader,basereturnheader.
CALL TRANSFORMATION zml_xml_trans01
SOURCE XML z_out-return_data
RESULT basereturnheader = basereturnheader[]
basereturnitem = basereturnitem[].
CATCH cx_st_error INTO lo_oref .
ret_msgs-msgty = 'E'.
ret_msgs-msgtx = lo_oref->get_text( ) .
APPEND ret_msgs.
ENDTRY.
* deal with logs only headers
LOOP AT basereturnheader.
CLEAR ret_msgs.
ret_msgs-eblen = basereturnheader-hresv1.
IF basereturnheader-status EQ 'S'.
ret_msgs-msgty = 'S'.
ELSE.
ret_msgs-msgty = 'E'.
ENDIF.
ret_msgs-msgtx = basereturnheader-returnmsg.
ret_msgs-msgid = lv_ztime.
APPEND ret_msgs.
* SRM傳回結果更新日志表
CLEAR itab_zmlscp_log01.
itab_zmlscp_log01-ebeln = ret_msgs-eblen.
itab_zmlscp_log01-ztime = ret_msgs-msgid.
itab_zmlscp_log01-uname = sy-uname.
itab_zmlscp_log01-msgty = ret_msgs-msgty.
itab_zmlscp_log01-msgtx = ret_msgs-msgtx.
APPEND itab_zmlscp_log01.
CLEAR basereturnheader.
ENDLOOP.
IF NOT itab_zmlscp_log01[] IS INITIAL.
UPDATE zmlscp_log01 FROM TABLE itab_zmlscp_log01.
ENDIF.
ELSE.
ret_msgs-msgty = 'E'.
ret_msgs-msgtx = 'CIS傳回字段return_data為空'.
APPEND ret_msgs.
ENDIF.
ELSE.
ret_msgs-msgty = 'E'.
ret_msgs-msgtx = 'CIS傳回字段return_code不等于S'.
APPEND ret_msgs.
ENDIF.
ENDFUNCTION.