BAPI_ALM_ORDER_MAINTAIN
本BAPI是维护性BAPI,一般维护性BAPI,会包括创建、修改、删除、释放等功能,本BAPI也不例外,它能实现的功能和事务代码IW31、IW32、IW33的作用类似,通过传入工单的相关信息,包括工序、组件、结算规则、合作伙伴等,对工单进行创建、修改或者删除等。
BAPI的使用有通用的规则,比如BAPI在生成对象时,有最小的满足条件,即至少传入某些字段的值,才能保证生成相应的对象,上述表格中添加了黄色着色的字段的为本BAPI必须要传入的信息或者重要的传出信息;另外BAPI调用后,往往会至少返回一些个消息结构或者消息内表,这里需要根据返回的消息进行相应的处理:如果BAPI调用成功,则提交BAPI;如果BAPI调用失败,则回滚BAPI。
另外BAPI的执行,也会遵守业务顾问给予BAPI对应的前台业务事务代码操作中的一些限制和校验规则,比如字段的必输、字段合法性检查等,因此,BAPI传入的参数往往也需要根据规则来进行传数和校验,才能正常执行。当然,编程过程中不考虑这些也可以,只需要将BAPI执行的结果返回给用户,用户也能根据BAPI执行的错误消息,来检查传入BAPI的数据的合规性,不过这样会降低用户的体验。
本BAPI使用时,需要将处理方法和处理对象进行匹配使用,处理对象的每一行都需要有对应的操作方法,二者通过操作方法的参考码字段与操作对象的内表的行号进行关联。
比如新建的工单中有两行组件,那么METHOD操作集中,需要APPEND进两行类型为COMPONENT,方法为CREATE的操作指令,这两行的指令的参照码即为下方传入的COMPONENT的内表的行号(SY-TABIX)。尤其是当指令混合使用的时候,比如操作指令,一部分为CREATE,一部分为UPDATE的时候,尤其要注意操作指令的参照码要和下面内表中的数据的行号进行匹配,否则会导致错误。
另外,对于那些成对出现的参数组合,比如IT_HEADER和IT_HEADER_UP,IT_PARTNER和IT_PARTNER_UP等等,这种带有_UP后缀的参数组,和前面的对象的参数组的成员一模一样,只不过成员的数据类型都变成XFELD类型,用于标记是否更新该字段,空表示不更新,“X”表示更新。如果操作指令的方法为UPDATE的参数,则必须同步设置XXX_UP参数组,并传入BAPI,才能进行数据更新。对于其他操作方法:比如CREATE和DELETE、RELEASE等,则无需设置XXX_UP参数组,只需要设置前面的主参数组即可。
最后需要向操作指令集中APPEND进一个SAVE方法,来保存所有的数据。
下面将分别用实例代码来说明如何使用本BAPI进行基本的工单创建、修改和下达。
4.1 工单创建示范代码
本BAPI在创建工单时,既可以指定工单号,也可以不指定工单号,如果不指定工单号,则使用“%00000000001”替代临时工号,本例中将使用不指定工单号的方式来创建工单。具体见如下代码:
"BAPI相关参数定义
DATA: LS_RETURN TYPE BAPIRET2,
LT_RETURN TYPE TABLE OF BAPIRET2. "BAPI调用返回消息
DATA: LS_NUMBERS TYPE BAPI_ALM_NUMBERS,
LT_NUMBERS TYPE TABLE OF BAPI_ALM_NUMBERS. "BAPI返回的工单号
DATA: LS_METHOD TYPE BAPI_ALM_ORDER_METHOD,
LT_METHOD TYPE TABLE OF BAPI_ALM_ORDER_METHOD, "BAPI操作方法
LS_HEADER TYPE BAPI_ALM_ORDER_HEADERS_I,
LT_HEADER TYPE TABLE OF BAPI_ALM_ORDER_HEADERS_I, "头部信息
LS_OPERATION TYPE BAPI_ALM_ORDER_OPERATION,
LT_OPERATION TYPE TABLE OF BAPI_ALM_ORDER_OPERATION, "工序信息
LS_SRULE TYPE BAPI_ALM_ORDER_SRULE,
LT_SRULE TYPE TABLE OF BAPI_ALM_ORDER_SRULE, "结算规则,与工单下达相关
LS_COMPONENT TYPE BAPI_ALM_ORDER_COMPONENT,
LT_COMPONENT TYPE TABLE OF BAPI_ALM_ORDER_COMPONENT. "组件
DATA: EV_TYPE TYPE BAPI_MTYPE, "消息类型
EV_MESSAGE TYPE BAPI_MSG. "消息文本
CLEAR: EV_TYPE,EV_MESSAGE,
LS_RETURN,LS_NUMBERS,LS_METHOD,LS_HEADER,LS_OPERATION,LS_SRULE,LS_COMPONENT,
LT_RETURN,LT_NUMBERS,LT_METHOD,LT_HEADER,LT_OPERATION,LT_SRULE,LT_COMPONENT.
*-----1 准备BAPI传入的参数
"头部信息
"***HEADER METHOD
LS_METHOD-REFNUMBER = 1 .
LS_METHOD-OBJECTTYPE = 'HEADER' .
LS_METHOD-OBJECTKEY = '%00000000001'.
LS_METHOD-METHOD = 'CREATE' .
APPEND LS_METHOD TO LT_METHOD .
CLEAR LS_METHOD .
"***HEADER DATA
*LS_HEADER-ORDERID = '%00000000001'. "订单号
LS_HEADER-ORDER_TYPE = 'PM01'. "订单类型,该订单类型限制为外部给号
LS_HEADER-PLANPLANT = '2800'. "维护计划工厂
LS_HEADER-BUS_AREA = '0001'. "业务范围
LS_HEADER-MN_WK_CTR = 'ZPMZ01'. "维护任务的工作中心
LS_HEADER-START_DATE = SY-DATUM. "开始日期
LS_HEADER-FINISH_DATE = SY-DATUM. "完成日期
APPEND LS_HEADER TO LT_HEADER.
CLEAR: LS_HEADER.
"工序信息
*------------------循环准备工序数据-----------------------------------*
"***OPERATION METHOD
LS_METHOD-REFNUMBER = 1 .
LS_METHOD-OBJECTTYPE = 'OPERATION' .
LS_METHOD-OBJECTKEY = '%00000000001'.
LS_METHOD-METHOD = 'CREATE' .
APPEND LS_METHOD TO LT_METHOD .
CLEAR LS_METHOD .
LS_METHOD-REFNUMBER = 2 .
LS_METHOD-OBJECTTYPE = 'OPERATION' .
LS_METHOD-OBJECTKEY = '%00000000001' .
LS_METHOD-METHOD = 'CREATE' .
APPEND LS_METHOD TO LT_METHOD .
CLEAR LS_METHOD .
"***SETTLEMENT RULES DATA
LS_SRULE-LFDNR = 1. "分配规则号
LS_SRULE-COMP_CODE = '1000'. "公司代码
LS_SRULE-GL_ACCOUNT = '1404010000'. "总账科目
LS_SRULE-SETTL_TYPE = 'FUL'. "结算类型
LS_SRULE-PERCENTAGE = '100.00' . "百分比
APPEND LS_SRULE TO LT_SRULE.
CLEAR: LS_SRULE.
*------------------循环准备结算规则数据结束-----------------------------*
"METHOD SAVE
LS_METHOD-OBJECTKEY = '%00000000001' .
LS_METHOD-METHOD = 'SAVE' .
APPEND LS_METHOD TO LT_METHOD .
CLEAR LS_METHOD .
*-----2 调用BAPI创建工单
CALL FUNCTION 'BAPI_ALM_ORDER_MAINTAIN'
TABLES
IT_METHODS = LT_METHOD
IT_HEADER = LT_HEADER
IT_OPERATION = LT_OPERATION
IT_COMPONENT = LT_COMPONENT
IT_SRULE = LT_SRULE
RETURN = LT_RETURN
ET_NUMBERS = LT_NUMBERS.
*-----3 根据BAPI执行结果,返回结果处理
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'EA'.
IF EV_MESSAGE IS INITIAL.
EV_MESSAGE = LS_RETURN-MESSAGE.
ELSE.
CONCATENATE LS_RETURN-MESSAGE '/' EV_MESSAGE INTO EV_MESSAGE."拼接输出的失败消息
ENDIF.
ENDLOOP.
IF SY-SUBRC = 0.
EV_TYPE = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. "回滚BAPI
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "提交BAPI
EXPORTING
WAIT = 'X'.
EV_TYPE = 'S'. "将输出的消息类型设置为S
CLEAR: LS_NUMBERS.
READ TABLE LT_NUMBERS INTO LS_NUMBERS INDEX 1.
CONCATENATE '工单' LS_NUMBERS-AUFNR_NEW '创建成功!' INTO EV_MESSAGE.
MESSAGE EV_MESSAGE TYPE 'I'.
ENDIF.