目录
开发类型:
新增客户订单下发接收接口
开发申请:
虽然开发申请上面只写了表数据,没有写导出参数,但是大多数情况下是需要导出参数的,方便判断该接口是否执行成功,或是失败以及失败的消息返回。需要开发人员和业务顾问沟通,确认一下开发申请里的参数。
沟通后,我们加上了这样的两个导出参数。
开发步骤:
因为开发申请上面已经预定了该接口的名称,我们直接使用SE37新建接口就好了。
新建好接口后,就可以开始填充导入参数、导出参数、表等参数信息。(本次开发的这个接口,没有导入参数)
这里参数T_HEADER和T_ITEMS分别参考了两个结构,建立表参考的结构:使用SE11,在数据类型栏位下,建立结构
选择结构
将描述和字段添加进去
注意:当数据类型为CURR时,需要参考其他表的字段(QUAN、CURR等数据类型都需要参考其他表和字段)
点击检查按钮,选择相应模块,进行保存和激活
激活成功后,可以在接口中参考
同样的操作,将T_ITEMS也关联上一个关联类型
点击源代码,就可以看到系统已经自动生成注释,介绍了该接口的参数
这是日志记录代码(各个公司会自行开发并封装好,意在调用这个接口就会生成一个消息记录,方便后期运维查询)
在接口中,不用再次声明导入参数、导出参数、表等变量,都可以直接使用
将代码逻辑写入即可检查、激活、测试、上线,以上就是普遍的RFC的接口创建方式。外围系统调用的话,要将接口设置为远程启用的模块。
代码在测试时,如下截图:
代码如下:
FUNCTION ZZSD_ORDERERECEIVE_FROM_ZT.
*"----------------------------------------------------------------------
*"*"本地接口:
*" EXPORTING
*" VALUE(E_RTYPE) TYPE BAPI_MTYPE
*" VALUE(E_RTMSG) TYPE BAPI_MSG
*" TABLES
*" T_HEADER STRUCTURE ZSSD0184
*" T_ITEMS STRUCTURE ZSSD0185
*"----------------------------------------------------------------------
MACRO_SAVE_LOG_BEFORE_PROC.
MACRO_SAVE_LOG_AFTER_PROC 'IN'."日志记录传入数据
DATA:LS_ZTSD0146 TYPE ZTSD0146.
DATA:GT_ZTSD0146 TYPE TABLE OF ZTSD0146.
DATA:GS_ZTSD0146 TYPE ZTSD0146.
DATA:GS_ZTSD0145 TYPE ZTSD0145.
DATA FLAG VALUE 0."校验通过
* 1.核对采购订单界面加锁,校验采购订单是否正在处理,若正在处理则报错"采购订单xxx正在被用户xxx处理,请稍后再推送。"
"判断是否被锁定
LOOP AT T_HEADER.
DATA(LV_PURCHASENO) = T_HEADER-PURCHASENO.
T_HEADER-PURCHASENO = T_HEADER-CONTRACTNUMBER."采购订单号等于中台传输的CONTRACTNUMBER字段
T_HEADER-CONTRACTNUMBER = LV_PURCHASENO.
CLEAR:LV_PURCHASENO.
* 如果用户的采购订单号为空,直接报错退出
IF T_HEADER-CONTRACTNUMBER IS INITIAL.
E_RTYPE = 'E'.
E_RTMSG = |采购订单:{ T_HEADER-CONTRACTNUMBER } 的合同号:{ T_HEADER-PURCHASENO } 为空,请重新确认。|.
ELSE.
IF T_HEADER-PURCHASENO IS NOT INITIAL.
CALL FUNCTION 'ENQUEUE_EZ_ZTSD0145'
EXPORTING
MODE_ZTSD0145 = 'X'
MANDT = SY-MANDT
PURCHASENO = T_HEADER-PURCHASENO
X_PURCHASENO = ' '
_SCOPE = '1'
_WAIT = ' '
_COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
E_RTYPE = 'E'.
E_RTMSG = '采购订单' && T_HEADER-CONTRACTNUMBER && '合同号' && T_HEADER-PURCHASENO && '正在被用户处理,请稍后再推送。'.
ENDIF.
ENDIF.
IF E_RTYPE <> 'E'.
IF T_HEADER-PUSHTYPE <> '1' AND T_HEADER-PUSHTYPE <> '3'.
E_RTYPE = 'E'.
E_RTMSG = '只允许推送类型为"1 新增"或"3 删除"'.
* 若不为3
ELSEIF T_HEADER-PUSHTYPE = '1'."创建
SELECT RESULTTYPE,CRDAT,CRTIM,GUID,PUSHTYPE
FROM ZTSD0147
* INNER JOIN ZTSD0147 ON ZTSD0147~GUID = ZTSD0145~GUID
INTO TABLE @DATA(LT_ZTSD0147)
WHERE ZTSD0147~BSTKD = @T_HEADER-PURCHASENO
AND RESULTTYPE = '1'.
* WHERE ZTSD0145~PURCHASENO = @T_HEADER-PURCHASENO.
SORT LT_ZTSD0147 BY CRDAT DESCENDING CRTIM DESCENDING.
READ TABLE LT_ZTSD0147 INTO DATA(LS_ZTSD0147) INDEX 1.
IF SY-SUBRC = 0 AND LS_ZTSD0147-PUSHTYPE = '1'.
E_RTYPE = 'E'.
E_RTMSG = '采购订单' && T_HEADER-CONTRACTNUMBER && '合同号' && T_HEADER-PURCHASENO && '推送类型“' && T_HEADER-PUSHTYPE && ' 新增”HKC已核对为确认,请联系HKC销售处理'.
ELSE.
FLAG = 1."校验通过
E_RTYPE = 'S'.
E_RTMSG = '采购订单' && T_HEADER-CONTRACTNUMBER && '合同号' && T_HEADER-PURCHASENO && '传输成功!'.
ENDIF.
* 若为3
ELSEIF T_HEADER-PUSHTYPE = '3'."删除
* SELECT LIKP~UVWAK ,LIKP~VBELN
* FROM ZTSD0035
* INNER JOIN ZTSD0036 ON ZTSD0036~VBELN = ZTSD0035~VBELN_DH
* INNER JOIN VBAP ON VBAP~ZZCFDH = ZTSD0035~ZCFDH AND VBAP~ZZCFHH = ZTSD0035~POSNR
* INNER JOIN LIPS ON VBAP~VBELN = LIPS~VGBEL AND VBAP~POSNR = LIPS~VGPOS
* INNER JOIN LIKP ON LIPS~VBELN = LIKP~VBELN
* INTO TABLE @DATA(LT_LIKP)
** WHERE ZTSD0035~VBELN_DH = @T_HEADER-PURCHASENO
* WHERE ZTSD0036~BSTKD = @T_HEADER-PURCHASENO
* AND LIKP~WBSTK = 'C'.
*
* READ TABLE LT_LIKP INTO DATA(LS_LIKP) WITH KEY UVWAK = 'C'.
* IF SY-SUBRC = 0.
* E_RTYPE = 'E'.
* E_RTMSG = '采购订单' && T_HEADER-CONTRACTNUMBER && '合同号' && T_HEADER-PURCHASENO && '已有交货单' && LS_LIKP-VBELN && '过账,请联系HKC销售处理'.
* ELSE.
FLAG = 1."校验通过
E_RTYPE = 'S'.
E_RTMSG = '采购订单' && T_HEADER-CONTRACTNUMBER && '合同号' && T_HEADER-PURCHASENO && '传输成功!'.
* ENDIF.
ENDIF.
ENDIF.
IF FLAG = 1.
*更改ZTSD0145
SELECT *
FROM ZTSD0145
INTO TABLE @DATA(LT_ZTSD0145)
WHERE PURCHASENO = @T_HEADER-PURCHASENO.
SORT LT_ZTSD0145 BY CRDAT DESCENDING CRTIM DESCENDING.
READ TABLE LT_ZTSD0145 INTO DATA(LS_ZTSD0145) INDEX 1.
IF SY-SUBRC <> 0 .
CLEAR: LS_ZTSD0145.
* 生成UUID 创建人
CALL FUNCTION 'GUID_CREATE'
IMPORTING
EV_GUID_32 = LS_ZTSD0145-UUID.
MOVE-CORRESPONDING T_HEADER TO LS_ZTSD0145.
LS_ZTSD0145-CRDAT = SY-DATUM.
LS_ZTSD0145-CRTIM = SY-UZEIT.
LS_ZTSD0145-CRNAM = SY-UNAME.
MODIFY ZTSD0145 FROM LS_ZTSD0145.
*ZTSD0146
LOOP AT T_ITEMS INTO DATA(LS_ITEM).
* 生成UUID 创建人
MOVE-CORRESPONDING LS_ITEM TO LS_ZTSD0146.
LS_ZTSD0146-UUID = LS_ZTSD0145-UUID.
LS_ZTSD0146-PURCHASENO = T_HEADER-PURCHASENO.
LS_ZTSD0146-CRDAT = SY-DATUM.
LS_ZTSD0146-CRTIM = SY-UZEIT.
LS_ZTSD0146-CRNAM = SY-UNAME.
MODIFY ZTSD0146 FROM LS_ZTSD0146.
CLEAR: LS_ZTSD0146.
ENDLOOP.
ELSEIF SY-SUBRC = 0 AND LS_ZTSD0145-GUID IS NOT INITIAL.
CLEAR: LS_ZTSD0145.
* CALL 随机数.UUID 创建人
CALL FUNCTION 'GUID_CREATE'
IMPORTING
EV_GUID_32 = LS_ZTSD0145-UUID.
MOVE-CORRESPONDING T_HEADER TO LS_ZTSD0145.
LS_ZTSD0145-CRDAT = SY-DATUM.
LS_ZTSD0145-CRTIM = SY-UZEIT.
LS_ZTSD0145-CRNAM = SY-UNAME.
MODIFY ZTSD0145 FROM LS_ZTSD0145.
*ZTSD0146
LOOP AT T_ITEMS INTO LS_ITEM.
* 生成UUID 创建人
MOVE-CORRESPONDING LS_ITEM TO LS_ZTSD0146.
LS_ZTSD0146-UUID = LS_ZTSD0145-UUID.
LS_ZTSD0146-PURCHASENO = T_HEADER-PURCHASENO.
LS_ZTSD0146-CRDAT = SY-DATUM.
LS_ZTSD0146-CRTIM = SY-UZEIT.
LS_ZTSD0146-CRNAM = SY-UNAME.
MODIFY ZTSD0146 FROM LS_ZTSD0146.
CLEAR: LS_ZTSD0146.
ENDLOOP.
ELSEIF SY-SUBRC = 0 AND LS_ZTSD0145-GUID IS INITIAL.
* 更改人.
CLEAR: GS_ZTSD0145.
GS_ZTSD0145-UUID = LS_ZTSD0145-UUID.
GS_ZTSD0145-CRDAT = LS_ZTSD0145-CRDAT.
GS_ZTSD0145-CRTIM = LS_ZTSD0145-CRTIM.
GS_ZTSD0145-CRNAM = LS_ZTSD0145-CRNAM.
CLEAR: LS_ZTSD0145.
MOVE-CORRESPONDING GS_ZTSD0145 TO LS_ZTSD0145.
MOVE-CORRESPONDING T_HEADER TO LS_ZTSD0145.
LS_ZTSD0145-CHDAT = SY-DATUM.
LS_ZTSD0145-CHTIM = SY-UZEIT.
LS_ZTSD0145-CHNAM = SY-UNAME.
MODIFY ZTSD0145 FROM LS_ZTSD0145.
*ZTSD0146
SELECT *
FROM ZTSD0146
INTO TABLE GT_ZTSD0146
WHERE UUID = LS_ZTSD0145-UUID.
*DELETE 删除ZTSD0146所有已经核对的UUID数据-
DELETE ZTSD0146 FROM TABLE GT_ZTSD0146.
LOOP AT T_ITEMS INTO LS_ITEM.
* 修改人
READ TABLE GT_ZTSD0146 INTO GS_ZTSD0146 WITH KEY PURCHASENO = T_HEADER-PURCHASENO PURCHASELINENO = LS_ITEM-PURCHASELINENO.
IF SY-SUBRC = 0.
LS_ZTSD0146-CRDAT = GS_ZTSD0146-CRDAT.
LS_ZTSD0146-CRTIM = GS_ZTSD0146-CRTIM.
LS_ZTSD0146-CRNAM = GS_ZTSD0146-CRNAM.
ELSE.
LS_ZTSD0146-CRDAT = SY-DATUM.
LS_ZTSD0146-CRTIM = SY-UZEIT.
LS_ZTSD0146-CRNAM = SY-UNAME.
ENDIF.
MOVE-CORRESPONDING LS_ITEM TO LS_ZTSD0146.
LS_ZTSD0146-UUID = LS_ZTSD0145-UUID.
LS_ZTSD0146-PURCHASENO = T_HEADER-PURCHASENO.
LS_ZTSD0146-CHDAT = SY-DATUM.
LS_ZTSD0146-CHTIM = SY-UZEIT.
LS_ZTSD0146-CHNAM = SY-UNAME.
MODIFY ZTSD0146 FROM LS_ZTSD0146.
CLEAR: GS_ZTSD0146,LS_ZTSD0146,LS_ITEM.
ENDLOOP.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
MACRO_SAVE_LOG_AFTER_PROC 'OUT'."日志记录传出数据
ENDFUNCTION.