ODATA接收更改命令
Head

CostItem
BomItem




java
METHOD /iwbep/if_mgw_appl_srv_runtime~create_deep_entity.
**TRY.
*CALL METHOD SUPER->/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY
* EXPORTING
** IV_ENTITY_NAME =
** IV_ENTITY_SET_NAME =
** IV_SOURCE_NAME =
* IO_DATA_PROVIDER =
** IT_KEY_TAB =
** IT_NAVIGATION_PATH =
* IO_EXPAND =
** IO_TECH_REQUEST_CONTEXT =
** IMPORTING
** ER_DEEP_ENTITY =
* .
** CATCH /IWBEP/CX_MGW_BUSI_EXCEPTION.
** CATCH /IWBEP/CX_MGW_TECH_EXCEPTION.
**ENDTRY.
DATA:BEGIN OF wa_datain.
INCLUDE TYPE zcl_z_up_costbom_mpc_ext=>ts_head.
DATA: bomitemset TYPE STANDARD TABLE OF zcl_z_up_costbom_mpc_ext=>ts_bomitem WITH DEFAULT KEY.
DATA: costitemset TYPE STANDARD TABLE OF zcl_z_up_costbom_mpc_ext=>ts_costitem WITH DEFAULT KEY.
DATA END OF wa_datain.
DATA:wa_message TYPE scx_t100key.
DATA:lv_objnr TYPE aufk-objnr.
DATA:lt_status TYPE TABLE OF jstat.
DATA t_stpo TYPE STANDARD TABLE OF stpo_api02.
DATA i_stpo TYPE STANDARD TABLE OF stpo_api02.
DATA d_stpo TYPE STANDARD TABLE OF stpo_api02.
DATA s_stpo TYPE stpo_api02.
DATA t_stko TYPE STANDARD TABLE OF stko_api02.
DATA t_stpo_up TYPE STANDARD TABLE OF stpo_api03.
DATA i_stko TYPE stko_api01.
DATA o_stko TYPE stko_api02.
DATA fl_warning TYPE capiflag-flwarning.
DATA:BEGIN OF ls_stpo,
stlal TYPE stalt,
aennr TYPE aennr,
END OF ls_stpo.
DATA:return(220) TYPE c.
DATA:lv_werks TYPE t001w-werks VALUE '1110'.
io_data_provider->read_entry_data( IMPORTING es_data = wa_datain ).
IF wa_datain-bomitemset IS NOT INITIAL OR wa_datain-costitemset IS NOT INITIAL."判断传值是否OK
DATA:gs_logging TYPE zcm_logging.
DATA:lv_json_str TYPE string.
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = wa_datain
RECEIVING
r_json = lv_json_str.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_x16
RECEIVING
uuid = gs_logging-zuuid.
gs_logging-zstate = '3'. "接口状态 1 推送 2 创建 3 修改 4 接口不通
gs_logging-ztcode = 'Z_COSTBOM_UP'. "接口模块
gs_logging-zmsgty = 'S'. "是否成功
gs_logging-zfunction = 'Z_COSTBOM_UP' . "函数名
gs_logging-zdate = sy-datum. "创建日期
gs_logging-ztime = sy-uzeit. "创建时间
gs_logging-zuser = sy-uname. "创建用户
* gs_logging-zname = gv_last && gv_first. "用户姓名
* gs_logging-zetim = s1 && '秒'.. "执行时间
gs_logging-zmsgtxt = '成功接收对应数据!'. "消息文本
gs_logging-zdatagram = lv_json_str . "报文
gs_logging-zwith = 'PID拆分接收数据'. "程序标题
INSERT zcm_logging FROM gs_logging.
* SELECT * FROM zbomcost_job
* WHERE ztype IN (' BOM' , 'COST' )
* AND verid = @wa_datain-verid
* AND matid = @wa_datain-matid
* AND zold <> 'X'
* INTO TABLE @DATA(lt_zbomcost_job).
*
* IF lt_zbomcost_job IS NOT INITIAL.
* READ TABLE lt_zbomcost_job INTO DATA(ls_zbomcost) WITH KEY zflag = 'E'.
* IF sy-subrc <> 0.
*
* wa_message-msgid = '000'.
* wa_message-msgno = '00'.
* wa_message-attr1 = '版本已存在,请升版版号重新下发!'.
** 错误消息返回
* RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
* EXPORTING
* textid = wa_message.
*
* ELSE.
* "检索到有就全部失效掉
* LOOP AT lt_zbomcost_job INTO ls_zbomcost.
* ls_zbomcost-zold = 'X'.
* MODIFY lt_zbomcost_job FROM ls_zbomcost.
* ENDLOOP.
*
* MODIFY zbomcost_job FROM TABLE lt_zbomcost_job.
* IF sy-subrc = 0.
* COMMIT WORK.
* ENDIF.
* CLEAR:lt_zbomcost_job.
*
* ENDIF.
*
* ENDIF.
DATA:lt_opr TYPE TABLE OF capp_opr,
lt_com TYPE TABLE OF capp_com,
lv_flag_bar TYPE i.
SELECT * FROM mapl WHERE matnr = @wa_datain-matid
AND werks = @lv_werks
AND loekz <> 'X'
INTO TABLE @DATA(lt_mapl).
READ TABLE lt_mapl INTO DATA(ls_mapl) INDEX 1.
SELECT COUNT(*) FROM ztaufnr_afvc WHERE matnr = @wa_datain-matid
AND werks = @lv_werks.
IF sy-subrc <> 0.
CALL FUNCTION 'CARO_ROUTING_READ'
EXPORTING
date_from = sy-datum
plnty = 'N'
plnnr = ls_mapl-plnnr
plnal = ls_mapl-plnal
matnr = wa_datain-matid
buffer_del_flg = 'X'
TABLES
opr_tab = lt_opr
com_tab = lt_com
EXCEPTIONS
not_found = 1
ref_not_exp = 2
not_valid = 3
no_authority = 4
OTHERS = 5.
DATA:lt_ztaufnr_afvc TYPE TABLE OF ztaufnr_afvc.
DATA:ls_ztaufnr_afvc TYPE ztaufnr_afvc.
LOOP AT lt_opr INTO DATA(ls_opr).
CLEAR:ls_ztaufnr_afvc.
MOVE-CORRESPONDING ls_opr TO ls_ztaufnr_afvc.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = ls_ztaufnr_afvc-zuuid.
CATCH cx_uuid_error.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDTRY.
SELECT SINGLE arbpl FROM crhd WHERE objid = @ls_opr-arbid INTO @ls_ztaufnr_afvc-arbpl.
ls_ztaufnr_afvc-matnr = wa_datain-matid.
ls_ztaufnr_afvc-aufnr = '1'.
ls_ztaufnr_afvc-upnum = '0001'.
ls_ztaufnr_afvc-crdate = sy-datum.
ls_ztaufnr_afvc-crtime = sy-uzeit.
APPEND ls_ztaufnr_afvc TO lt_ztaufnr_afvc.
ENDLOOP.
MODIFY ztaufnr_afvc FROM TABLE lt_ztaufnr_afvc.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
ENDIF.
"寻找对应的订单是否存在
"获取TECO技术性关闭标识代码
SELECT SINGLE istat
FROM tj02t
INTO @DATA(lv_tj02t)
WHERE txt04 = 'TECO'
AND spras = 'E'.
SELECT a~matnr,
a~aufnr,
a~psmng,
b~werks,
b~objnr
FROM afpo AS a
INNER JOIN aufk AS b ON a~aufnr = b~aufnr
WHERE a~matnr = @wa_datain-matid
AND b~werks IN ( '1110','1199' )
AND b~loekz <> 'X'
INTO TABLE @DATA(it_aufk_all).
IF it_aufk_all IS NOT INITIAL.
LOOP AT it_aufk_all ASSIGNING FIELD-SYMBOL(<fs_aufk_all>).
"通过生产对象号获取订单状态
lv_objnr = <fs_aufk_all>-objnr.
"结果存放在STATUS表中
CALL FUNCTION 'STATUS_READ'
EXPORTING
client = sy-mandt "当前客户端
objnr = lv_objnr "生产订单对象号
TABLES
status = lt_status "返回订单的状态
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
READ TABLE lt_status INTO DATA(ls_status) WITH KEY stat = lv_tj02t inact = ''.
IF sy-subrc = 0.
DELETE it_aufk_all[].
ENDIF.
READ TABLE lt_status INTO ls_status WITH KEY stat = 'I0046' .
IF sy-subrc = 0.
DELETE it_aufk_all[].
ENDIF.
CLEAR:lt_status[],ls_status.
ENDIF.
ENDLOOP.
ENDIF.
IF it_aufk_all IS NOT INITIAL.
"检查订单是否报工
SELECT aufnr,vornr
FROM afru
FOR ALL ENTRIES IN @it_aufk_all
WHERE stokz = ''
AND stzhl = ''
AND aufnr = @it_aufk_all-aufnr
INTO TABLE @DATA(lt_afru).
SELECT a~aufnr,
b~vornr
FROM afpo AS a
INNER JOIN ztaufnr_afvc AS b ON a~matnr = b~matnr
FOR ALL ENTRIES IN @it_aufk_all
WHERE a~aufnr = @it_aufk_all-aufnr
INTO TABLE @DATA(lt_check).
LOOP AT lt_check INTO DATA(ls_check).
DELETE lt_afru WHERE aufnr = ls_check-aufnr
AND vornr = ls_check-vornr.
ENDLOOP.
IF lt_check IS NOT INITIAL.
LOOP AT lt_check INTO ls_check.
wa_message-attr1 = wa_message-attr1 && |{ ls_check-aufnr } - { ls_check-vornr }/ |.
ENDLOOP.
wa_message-attr1 = wa_message-attr1 && '存在报工无法修改!'.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
* 错误消息返回
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
ENDIF.
ENDIF.
* IF it_aufk_all IS INITIAL.
* 没有在制订单
* wa_message-msgid = '000'.
* wa_message-msgno = '00'.
* wa_message-attr1 = '没有在制订单无法修改'.
*
* 错误消息返回
* RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
* EXPORTING
* textid = wa_message.
*
* ELSE.
"先直接修改BOM或者工序
"获取第一次是否直接修改过
SELECT *
FROM ztaufnr_bom
WHERE matnr = @wa_datain-matid
AND werks = @lv_werks
INTO TABLE @DATA(lt_ztaufnr_bom).
SELECT SINGLE stlal
FROM mast
WHERE matnr = @wa_datain-matid
AND werks = @lv_werks
INTO @ls_stpo-stlal.
"获取BOM清单
CALL FUNCTION 'CSAP_MAT_BOM_READ'
EXPORTING
material = wa_datain-matid
plant = lv_werks
bom_usage = '1'
alternative = ' '
TABLES
t_stpo = t_stpo
t_stko = t_stko
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc = 0.
"重新建立
READ TABLE t_stko INTO DATA(s_stko) INDEX 1.
MOVE-CORRESPONDING s_stko TO i_stko.
MOVE-CORRESPONDING t_stpo TO i_stpo.
MOVE-CORRESPONDING t_stpo TO d_stpo.
IF lt_ztaufnr_bom IS NOT INITIAL. "不是第一次
"全部标记删除
LOOP AT t_stpo INTO s_stpo.
READ TABLE lt_ztaufnr_bom INTO DATA(ls_ztaufnr_bom) WITH KEY idnrk = s_stpo-component
posnr = s_stpo-item_no.
IF sy-subrc <> 0 .
s_stpo-fldelete = 'X'.
MODIFY t_stpo FROM s_stpo.
ENDIF.
ENDLOOP.
ENDIF.
MOVE-CORRESPONDING t_stpo TO d_stpo.
DELETE d_stpo WHERE fldelete = 'X'.
"重新写入数据
LOOP AT wa_datain-bomitemset INTO DATA(ws_bomitemset).
CLEAR:s_stpo.
* SELECT SINGLE lgpro FROM marc
* WHERE werks = @lv_werks
* AND matnr = @ws_bomitemset-custlotid
* INTO @s_stpo-issue_loc.
s_stpo-item_no = lines( d_stpo ) * 10 + sy-tabix * 10.
s_stpo-item_no = |{ s_stpo-item_no ALPHA = IN }|.
s_stpo-item_categ = 'L'.
s_stpo-component = ws_bomitemset-custlotid. "组件
s_stpo-comp_qty = ws_bomitemset-zqty. "数量
s_stpo-sortstring = ws_bomitemset-sortlbom. "排序字符串
s_stpo-rel_cost = ws_bomitemset-costflag. "成本
s_stpo-bulk_mat = ws_bomitemset-bulkcargo. "散料
APPEND s_stpo TO t_stpo.
ENDLOOP.
MOVE-CORRESPONDING t_stpo TO t_stpo_up.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
material = wa_datain-matid
plant = lv_werks
bom_usage = '1'
alternative = ls_stpo-stlal
change_no = ls_stpo-aennr
i_stko = i_stko
fl_commit_and_wait = 'X'
fl_bom_create = 'X'
fl_new_item = 'X'
fl_default_values = ''
IMPORTING
fl_warning = fl_warning
o_stko = o_stko
TABLES
t_stpo = t_stpo_up.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF lt_ztaufnr_bom IS INITIAL.
LOOP AT i_stpo INTO DATA(is_stpo).
"参数写入第一次修改成功后直接写入
CLEAR :ls_ztaufnr_bom.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = ls_ztaufnr_bom-uuid.
CATCH cx_uuid_error.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDTRY.
ls_ztaufnr_bom-aufnr = '1'.
ls_ztaufnr_bom-werks = lv_werks.
ls_ztaufnr_bom-matnr = wa_datain-matid.
ls_ztaufnr_bom-idnrk = is_stpo-component.
ls_ztaufnr_bom-posnr = is_stpo-item_no.
ls_ztaufnr_bom-menge = is_stpo-comp_qty.
ls_ztaufnr_bom-lgort = is_stpo-issue_loc.
ls_ztaufnr_bom-sortf = is_stpo-sortstring.
ls_ztaufnr_bom-sanka = is_stpo-rel_cost.
ls_ztaufnr_bom-schgt = is_stpo-bulk_mat.
ls_ztaufnr_bom-alpgr = is_stpo-ai_group.
ls_ztaufnr_bom-alprf = is_stpo-ai_prio.
ls_ztaufnr_bom-alpst = is_stpo-ai_strateg.
ls_ztaufnr_bom-ewahr = is_stpo-usage_prob.
ls_ztaufnr_bom-upnum = '0001'.
ls_ztaufnr_bom-crdate = sy-datum.
ls_ztaufnr_bom-crtime = sy-uzeit.
APPEND ls_ztaufnr_bom TO lt_ztaufnr_bom.
ENDLOOP.
MODIFY ztaufnr_bom FROM TABLE lt_ztaufnr_bom.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = return.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
wa_message-attr1 = return.
* 错误消息返回
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
CHECK wa_message IS NOT INITIAL.
ENDIF.
"直接修改工序
SUBMIT zca02_split
WITH p_mo = 'D'
WITH p_matnr = wa_datain-matid
WITH p_werks = lv_werks
WITH p_plnnr = ls_mapl-plnnr
AND RETURN.
DATA:
lt_return TYPE STANDARD TABLE OF bapiret2,
lt_opera TYPE STANDARD TABLE OF cps_task_list_maint_opr,
lt_operax TYPE STANDARD TABLE OF cps_task_list_maint_opr_x,
ls_opera TYPE cps_task_list_maint_opr,
ls_operax TYPE cps_task_list_maint_opr_x,
ls_task TYPE cps_task_list_maint_tsk,
ls_taskx TYPE cps_task_list_maint_tsk_x,
lv_message TYPE string.
DATA: lv_flag TYPE cp_task_list_maint_pointer.
lv_flag = lv_flag + 0000000001.
SELECT SINGLE meins FROM mara
WHERE matnr = @wa_datain-matid
INTO @DATA(ls_meins).
CLEAR:lt_opera ,
lt_operax.
"获取第一次的数据据添加进去
SELECT * FROM ztaufnr_afvc WHERE matnr = @wa_datain-matid INTO TABLE @lt_ztaufnr_afvc.
LOOP AT lt_ztaufnr_afvc INTO ls_ztaufnr_afvc.
CLEAR:ls_opera,ls_operax.
ls_opera-maintain_mode = 'C'. "更改模式
ls_opera-flag_bar_pointer = lv_flag."必要
ls_opera-activity = ls_ztaufnr_afvc-vornr.
ls_opera-activity = |{ ls_opera-activity ALPHA = IN }|.
ls_opera-activity_old = ls_opera-activity.
ls_opera-work_cntr = ls_ztaufnr_afvc-arbpl."工作中心
ls_opera-plant = lv_werks.
ls_opera-standard_text_key = ''.
ls_opera-description = ls_ztaufnr_afvc-ltxa1.
IF ls_meins = 'Z3'.
ls_opera-base_quantity = '1000'.
ELSE.
ls_opera-base_quantity = '1'.
ENDIF.
ls_opera-std_value_01 = ls_ztaufnr_afvc-vgw01.
ls_opera-std_value_02 = ls_ztaufnr_afvc-vgw02.
ls_opera-std_value_03 = ls_ztaufnr_afvc-vgw03.
ls_opera-std_value_04 = ls_ztaufnr_afvc-vgw04.
ls_opera-std_value_05 = ls_ztaufnr_afvc-vgw05.
ls_opera-acttype_01 = 'AT01'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT02'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT03'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT04'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT05'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-control_key = ls_ztaufnr_afvc-steus.
ls_opera-sorted_by = ls_ztaufnr_afvc-sortl.
ls_opera-sequence_no = '000000'. "排序号
ls_opera-obj_id = '00000000'.
ls_opera-operation_measure_unit = ls_meins.
ls_opera-denominator = 1.
ls_opera-nominator = 1.
APPEND ls_opera TO lt_opera.
ls_operax-activity = 'X'.
ls_operax-work_cntr = 'X'.
ls_operax-standard_text_key = 'X'.
ls_operax-description = 'X'.
ls_operax-base_quantity = 'X'.
ls_operax-control_key = 'X'.
ls_operax-obj_id = 'X'.
ls_operax-operation_measure_unit = 'X'.
ls_operax-denominator = 'X'.
ls_operax-nominator = 'X'.
ls_operax-std_value_01 = 'X'.
ls_operax-std_value_02 = 'X'.
ls_operax-std_value_03 = 'X'.
ls_operax-std_value_04 = 'X'.
ls_operax-std_value_05 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-sorted_by = 'X'.
APPEND ls_operax TO lt_operax.
ENDLOOP.
LOOP AT wa_datain-costitemset INTO DATA(ws_costitemset).
CLEAR:ls_opera,ls_operax.
ls_opera-maintain_mode = 'C'. "更改模式
ls_opera-flag_bar_pointer = lv_flag."必要
ls_opera-activity = lines( lt_opera ) * 10 + 10.
ls_opera-activity = |{ ls_opera-activity ALPHA = IN }|.
ls_opera-activity_old = ls_opera-activity.
ls_opera-work_cntr = ws_costitemset-arbpl."工作中心
ls_opera-plant = lv_werks.
ls_opera-standard_text_key = ''.
ls_opera-description = ws_costitemset-ltxa1.
IF ls_meins = 'Z3'.
ls_opera-base_quantity = '1000'.
ELSE.
ls_opera-base_quantity = '1'.
ENDIF.
ls_opera-std_value_01 = ws_costitemset-vgw01.
ls_opera-std_value_02 = ws_costitemset-vgw02.
ls_opera-std_value_03 = ws_costitemset-vgw03.
ls_opera-std_value_04 = ws_costitemset-vgw04.
ls_opera-std_value_05 = ws_costitemset-vgw05.
ls_opera-acttype_01 = 'AT01'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT02'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT03'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT04'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-acttype_01 = 'AT05'.
ls_opera-std_unit_01 = 'MIN'.
ls_opera-control_key = ws_costitemset-steus.
ls_opera-sorted_by = ws_costitemset-Sortlcost.
ls_opera-sequence_no = '000000'. "排序号
ls_opera-obj_id = '00000000'.
ls_opera-operation_measure_unit = ls_meins.
ls_opera-denominator = 1.
ls_opera-nominator = 1.
APPEND ls_opera TO lt_opera.
ls_operax-activity = 'X'.
ls_operax-work_cntr = 'X'.
ls_operax-standard_text_key = 'X'.
ls_operax-description = 'X'.
ls_operax-base_quantity = 'X'.
ls_operax-control_key = 'X'.
ls_operax-obj_id = 'X'.
ls_operax-operation_measure_unit = 'X'.
ls_operax-denominator = 'X'.
ls_operax-nominator = 'X'.
ls_operax-std_value_01 = 'X'.
ls_operax-std_value_02 = 'X'.
ls_operax-std_value_03 = 'X'.
ls_operax-std_value_04 = 'X'.
ls_operax-std_value_05 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-acttype_01 = 'X'.
ls_operax-std_unit_01 = 'X'.
ls_operax-sorted_by = 'X'.
APPEND ls_operax TO lt_operax.
ENDLOOP.
CALL FUNCTION 'CPCC_S_TASK_LIST_MAINTAIN'
EXPORTING
change_no = ls_mapl-aennr
key_date = ls_mapl-datuv
task_list_type = ls_mapl-plnty
task_list_group = ls_mapl-plnnr
group_counter = ls_mapl-plnal
material = wa_datain-matid
plant = lv_werks
TABLES
operations = lt_opera
operations_x = lt_operax
return = lt_return.
LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E' OR type = 'A'.
IF lv_message IS INITIAL.
lv_message = ls_return-message.
ELSE.
CONCATENATE lv_message
ls_return-message
INTO lv_message
SEPARATED BY '/'.
ENDIF.
ENDLOOP.
IF lv_message IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
wa_message-attr1 = lv_message.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
ENDIF.
IF it_aufk_all IS NOT INITIAL.
"创建后台程序修改对应的工单数据
DATA jobname TYPE bapixmjob-jobname.
DATA external_user_name TYPE bapixmlogr-extuser VALUE 'DS4_INTFACE'.
DATA jobclass TYPE bapixmjob-jobclass VALUE 'A'.
DATA jobcount TYPE bapixmjob-jobcount.
DATA lv_return TYPE bapiret2.
DATA target_server TYPE bapixmjob-execserver.
DATA target_group TYPE bpgrp0101-srvgrp.
DATA:lv_uuid TYPE uuid.
DATA:lv_crdate TYPE sy-datum.
DATA:lv_crtime TYPE sy-uzeit.
DATA:lv_crname TYPE sy-uname.
TRY.
CALL METHOD cl_system_uuid=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = lv_uuid.
CATCH cx_uuid_error.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDTRY.
lv_crdate = sy-datum.
lv_crtime = sy-uzeit.
lv_crname = sy-uname.
LOOP AT it_aufk_all INTO DATA(is_aufk_all).
CLEAR:jobname.
jobname = 'MO:' && |{ is_aufk_all-aufnr ALPHA = OUT }| && ',BOM修改!' && wa_datain-Verid.
CONDENSE jobname NO-GAPS.
" 1. 创建作业
CALL FUNCTION 'BAPI_XBP_JOB_OPEN'
EXPORTING
jobname = jobname " 作业名称,最长32字符
jobclass = jobclass " 作业类别:A-高优先级, B-中优先级, C-低优先级
external_user_name = external_user_name " 外部用户名(可选)
IMPORTING
jobcount = jobcount " 作业编号(8位字符,唯一标识)
return = lv_return. " 返回信息结构
IF lv_return-type CA 'AE'.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
wa_message-attr1 = '作业创建失败!'.
"错误消息返回
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
EXIT.
ENDIF.
DATA:ls_zbomcost_job TYPE zbomcost_job.
CLEAR:ls_zbomcost_job.
ls_zbomcost_job-ztype = 'BOM'.
ls_zbomcost_job-jobcount = jobcount.
ls_zbomcost_job-jobname = jobname.
ls_zbomcost_job-jobclass = jobclass.
ls_zbomcost_job-external_user_name = external_user_name.
ls_zbomcost_job-zflag = ''.
ls_zbomcost_job-aufnr = is_aufk_all-aufnr.
ls_zbomcost_job-matid = wa_datain-matid.
ls_zbomcost_job-werks = lv_werks.
ls_zbomcost_job-verid = wa_datain-verid.
ls_zbomcost_job-uuid = lv_uuid .
ls_zbomcost_job-crdate = lv_crdate .
ls_zbomcost_job-crtime = lv_crtime .
ls_zbomcost_job-crname = lv_crname .
INSERT zbomcost_job FROM ls_zbomcost_job.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
SUBMIT ztest01
WITH p_name = jobname
WITH p_count = jobcount
WITH p_type = 'BOM'
AND RETURN.
"删除BOM及新增数据
"删除工序及新增数据
CLEAR:jobname.
jobname = 'MO:' && |{ is_aufk_all-aufnr ALPHA = OUT }| && ',工序修改!' && wa_datain-Verid.
CONDENSE jobname NO-GAPS.
" 1. 创建作业
CALL FUNCTION 'BAPI_XBP_JOB_OPEN'
EXPORTING
jobname = jobname " 作业名称,最长32字符
jobclass = jobclass " 作业类别:A-高优先级, B-中优先级, C-低优先级
external_user_name = external_user_name " 外部用户名(可选)
IMPORTING
jobcount = jobcount " 作业编号(8位字符,唯一标识)
return = lv_return. " 返回信息结构
IF lv_return-type CA 'AE'.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
wa_message-attr1 = '作业创建失败!'.
"错误消息返回
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
EXIT.
ENDIF.
CLEAR:ls_zbomcost_job.
ls_zbomcost_job-ztype = 'COST'.
ls_zbomcost_job-jobcount = jobcount.
ls_zbomcost_job-jobname = jobname.
ls_zbomcost_job-jobclass = jobclass.
ls_zbomcost_job-external_user_name = external_user_name.
ls_zbomcost_job-zflag = ''.
ls_zbomcost_job-aufnr = is_aufk_all-aufnr.
ls_zbomcost_job-matid = wa_datain-matid.
ls_zbomcost_job-werks = lv_werks.
ls_zbomcost_job-verid = wa_datain-verid.
ls_zbomcost_job-uuid = lv_uuid .
ls_zbomcost_job-crdate = lv_crdate .
ls_zbomcost_job-crtime = lv_crtime .
ls_zbomcost_job-crname = lv_crname .
INSERT zbomcost_job FROM ls_zbomcost_job.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
SUBMIT ztest01
WITH p_name = jobname
WITH p_count = jobcount
WITH p_type = 'COST'
AND RETURN.
"删除工序及新增数据
ENDLOOP.
DATA:lv_zbomcost_ver TYPE zbomcost_ver.
lv_zbomcost_ver-verid = wa_datain-verid.
lv_zbomcost_ver-matnr = wa_datain-matid.
* LV_ZBOMCOST_VER-ZFLAG =
lv_zbomcost_ver-uuid = lv_uuid .
lv_zbomcost_ver-crdate = lv_crdate .
lv_zbomcost_ver-crtime = lv_crtime .
lv_zbomcost_ver-crname = lv_crname .
INSERT zbomcost_ver FROM lv_zbomcost_ver.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
copy_data_to_ref( EXPORTING is_data = wa_datain
CHANGING cr_data = er_deep_entity ).
ENDIF.
ELSEIF wa_datain-bomitemset IS INITIAL AND wa_datain-costitemset IS INITIAL.
wa_message-msgid = '000'.
wa_message-msgno = '00'.
wa_message-attr1 = '传入的BOM和工序为空无法更改!'.
"错误消息返回
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = wa_message.
ENDIF.
ENDMETHOD.
作业生成程序
java
*&---------------------------------------------------------------------*
*& Report ZTEST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest01.
DATA jobname TYPE bapixmjob-jobname.
DATA external_user_name TYPE bapixmlogr-extuser VALUE 'DS4_INTFACE'.
DATA jobclass TYPE bapixmjob-jobclass VALUE 'A'.
DATA jobcount TYPE bapixmjob-jobcount.
DATA return TYPE bapiret2.
DATA target_server TYPE bapixmjob-execserver.
DATA target_group TYPE bpgrp0101-srvgrp.
PARAMETERS:p_name TYPE bapixmjob-jobname.
PARAMETERS:p_count TYPE bapixmjob-jobcount.
PARAMETERS:p_type TYPE string.
jobname = p_name .
jobcount = p_count.
IF p_type = 'BOM'.
" 2. 添加ABAP步骤
CALL FUNCTION 'BAPI_XBP_JOB_ADD_ABAP_STEP'
EXPORTING
jobname = jobname
jobcount = jobcount
external_user_name = external_user_name
abap_program_name = 'ZUP_AUFNR_BOM' " 要执行的ABAP程序名
* variant_name = '' " 程序变式(可选)
sap_user_name = sy-uname " SAP用户名
language = sy-langu " 语言
IMPORTING
return = return.
ELSE.
" 2. 添加ABAP步骤
CALL FUNCTION 'BAPI_XBP_JOB_ADD_ABAP_STEP'
EXPORTING
jobname = jobname
jobcount = jobcount
external_user_name = external_user_name
abap_program_name = 'ZUP_AUFNR_AFVC' " 要执行的ABAP程序名
* variant_name = '' " 程序变式(可选)
sap_user_name = sy-uname " SAP用户名
language = sy-langu " 语言
IMPORTING
return = return.
ENDIF.
" 3. 关闭并释放作业
CALL FUNCTION 'BAPI_XBP_JOB_CLOSE'
EXPORTING
jobname = jobname
jobcount = jobcount
external_user_name = external_user_name
IMPORTING
return = return.
" 4. 启动作业
CALL FUNCTION 'BAPI_XBP_JOB_START_ASAP'
EXPORTING
jobname = jobname
jobcount = jobcount
external_user_name = external_user_name
target_server = target_server
target_group = target_group
IMPORTING
return = return.
IF return-type CA 'AE'.
MESSAGE '作业启动失败' TYPE 'E'.
ELSE.
MESSAGE '作业已成功创建并启动' TYPE 'S'.
ENDIF.
.
BOM修改执行程序
java
*&---------------------------------------------------------------------*
*& Report ZUP_AUFNR_BOM
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zup_aufnr_bom.
WAIT UP TO 10 SECONDS.
SELECT * FROM zbomcost_job WHERE zflag = '' AND ztype = 'BOM' INTO TABLE @DATA(lt_zbomcost_job).
READ TABLE lt_zbomcost_job INTO DATA(ls_zbomcost_job) INDEX 1.
SELECT * FROM ztaufnr_bom WHERE matnr = @ls_zbomcost_job-matid
AND werks = @ls_zbomcost_job-werks
INTO TABLE @DATA(lt_bom).
*PERFORM get_up_bom. "更改BOM数据
IF lt_zbomcost_job IS NOT INITIAL.
PERFORM get_dl_bom. "删除BOM数据
PERFORM get_ad_bom. "新增BOM数据
PERFORM zup_wait_time.
PERFORM djob.
ENDIF.
*&---------------------------------------------------------------------*
*& Form get_up_bom
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_up_bom .
*
* DATA:lv_number TYPE bapi_network_list-network,
* lt_detail TYPE TABLE OF bapi_network_comp_detail,
* lt_remove TYPE TABLE OF bapi_network_comp_id,
* ls_remove TYPE bapi_network_comp_id,
* lt_message TYPE TABLE OF bapi_meth_message,
* ls_message TYPE bapi_meth_message.
*
* DATA:lv_check TYPE char1,
* lv_message TYPE char255.
*
* lv_number = ls_zbomcost_job-aufnr."工单号
*
**--------------获取工单组件明细-------------------------------*
* CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
* EXPORTING
* number = lv_number
* TABLES
* e_components_detail = lt_detail.
**--------------获取工单组件明细-------------------------------*
*
*
**--------------工单组件删除-------------------------------*
* "此处使用查询BAPI得到的组件列表,赋值给移除内表
* DATA: lt_components_change TYPE TABLE OF bapi_network_comp_change,
* ls_components_change TYPE bapi_network_comp_change,
* lt_components_change_update TYPE TABLE OF bapi_network_comp_cng_upd,
* ls_components_change_update TYPE bapi_network_comp_cng_upd,
* ls_return TYPE bapiret2.
* LOOP AT lt_detail INTO DATA(ls_detail).
* CLEAR ls_components_change.
* ls_components_change-component = ls_detail-component. " BAPI获取到的组件唯一标识
* ls_components_change-stge_loc = ls_detail-stge_loc. "库存地点
* ls_components_change-entry_quantity = '200'. "需求数量(备选数量修改不了)
* ls_components_change-sort_string = ls_detail-sort_string. "排序字符串
* ls_components_change-cost_relevant = ls_detail-cost_relevant."成本相关
* ls_components_change-bulk_mat = ls_detail-bulk_mat. "散装物料
*
* APPEND ls_components_change TO lt_components_change.
*
* CLEAR:ls_components_change_update.
* ls_components_change_update-component = ls_detail-component.
* ls_components_change_update-stge_loc = 'X'. "库存地点
* ls_components_change_update-entry_quantity = 'X'. "需求数量
* ls_components_change_update-sort_string = 'X'. "排序字符串
* ls_components_change_update-cost_relevant = 'X'. "成本相关
* ls_components_change_update-bulk_mat = 'X'. "散装物料
*
* APPEND ls_components_change_update TO lt_components_change_update.
* ENDLOOP.
*
* CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
* CALL FUNCTION 'BAPI_NETWORK_COMP_CHANGE'
* EXPORTING
* number = lv_number
* IMPORTING
* return = ls_return
* TABLES
* i_components_change = lt_components_change
* i_components_change_update = lt_components_change_update
* e_message_table = lt_message.
*
* LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
* lv_check = 'E'.
* lv_message = lv_message && ls_message-message_text.
* ENDLOOP.
*
* IF lv_check = 'E'.
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
* ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = abap_true.
* ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_dl_bom
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_dl_bom .
DATA:lv_number TYPE bapi_network_list-network,
lt_detail TYPE TABLE OF bapi_network_comp_detail,
lt_remove TYPE TABLE OF bapi_network_comp_id,
ls_remove TYPE bapi_network_comp_id,
lt_message TYPE TABLE OF bapi_meth_message,
ls_message TYPE bapi_meth_message.
DATA:lv_check TYPE char1,
lv_message TYPE char255.
lv_number = ls_zbomcost_job-aufnr."工单号
*--------------获取工单组件明细-------------------------------*
CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
EXPORTING
number = lv_number
TABLES
e_components_detail = lt_detail.
*--------------获取工单组件明细-------------------------------*
DELETE lt_detail WHERE status_text CA '删除'.
*--------------工单组件删除-------------------------------*
"此处使用查询BAPI得到的组件列表,赋值给移除内表
LOOP AT lt_detail INTO DATA(ls_detail).
CLEAR ls_remove.
READ TABLE lt_bom INTO DATA(ls_bom) WITH KEY posnr = ls_detail-item_number idnrk = ls_detail-material.
IF sy-subrc <> 0.
ls_remove-component = ls_detail-component.
APPEND ls_remove TO lt_remove.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_NETWORK_COMP_REMOVE'
EXPORTING
number = lv_number
TABLES
i_components_remove = lt_remove
e_message_table = lt_message.
LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
lv_check = 'E'.
lv_message = lv_message && ls_message-message_text.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_zbomcost_job-zflag = 'E'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ls_zbomcost_job-zflag = 'S'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ENDIF.
**--------------工单组件删除-------------------------------*
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_ad_bom
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_ad_bom .
*--------------工单组件新增-------------------------------*
DATA:lt_components TYPE TABLE OF bapi_network_comp_add,
ls_components TYPE bapi_network_comp_add.
DATA:lv_check TYPE char1,
lv_message TYPE char255,
lv_number TYPE bapi_network_list-network,
lt_message TYPE TABLE OF bapi_meth_message,
ls_message TYPE bapi_meth_message.
CLEAR:lt_message.
lv_number = ls_zbomcost_job-aufnr."工单号
SELECT SINGLE psmng FROM afpo INTO @DATA(lv_menge) WHERE aufnr = @lv_number.
SELECT a~stlnr,
b~posnr,
b~idnrk,
b~pswrk,
b~sortf,
b~menge,
b~schgt,
b~sanka
FROM mast AS a
INNER JOIN stpo AS b ON a~stlnr = b~stlnr AND stlty = 'M'
WHERE a~matnr = @ls_zbomcost_job-matid
AND a~werks = @ls_zbomcost_job-werks
INTO TABLE @DATA(lt_stpo).
READ TABLE lt_stpo INTO DATA(s_stpo) INDEX 1.
IF sy-subrc = 0.
SELECT SINGLE bmeng
FROM stko WHERE stlnr = @s_stpo-stlnr
AND stlty = 'M'
INTO @DATA(lv_bmeng).
ENDIF.
LOOP AT lt_stpo INTO DATA(ls_stpo).
CLEAR:ls_components.
READ TABLE lt_bom INTO DATA(ls_bom) WITH KEY idnrk = ls_stpo-idnrk posnr = ls_stpo-posnr.
IF sy-subrc <> 0.
ls_components-item_number = ls_stpo-posnr."项目编号
ls_components-activity = '0010'."必输 作业
ls_components-material = ls_stpo-idnrk."物料
ls_components-plant = ls_stpo-pswrk."工厂
ls_components-sort_string = ls_stpo-sortf. "排序字符
ls_components-bulk_mat = ls_stpo-schgt."散装
ls_components-cost_relevant = ls_stpo-sanka."成本
SELECT SINGLE meins INTO ls_components-base_uom FROM mara WHERE matnr = ls_components-material.
SELECT SINGLE beskz INTO ls_components-type_of_pur_resv FROM marc WHERE matnr = ls_components-material AND werks = '1110'.
IF ls_components-material CA 'WF'.
ls_components-entry_quantity = ls_stpo-menge."数量
ELSE.
ls_components-entry_quantity = lv_menge * ls_stpo-menge / lv_bmeng."数量
ENDIF.
ls_components-item_cat = 'L'."项目类别
APPEND ls_components TO lt_components.
ENDIF.
ENDLOOP.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
EXPORTING
number = lv_number
TABLES
i_components_add = lt_components
e_message_table = lt_message.
LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
lv_check = 'E'.
lv_message = lv_message && ls_message-message_text.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_zbomcost_job-zflag = 'E'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ls_zbomcost_job-zflag = 'S'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ENDIF.
*--------------工单组件新增-------------------------------*
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zup_wait_time
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM zup_wait_time .
"检查是否锁表
DO 9999 TIMES.
DATA: lv_garg TYPE seqg3-garg. "锁参数
DATA: lt_enq TYPE TABLE OF seqg7. "锁信息内表
"锁定参数构成规则:集团 + 订单号
"假设订单号为 10000001,注意总长度和填充方式需参考SM12
lv_garg = sy-mandt && ls_zbomcost_job-aufnr.
"调用函数读取锁信息
CALL FUNCTION 'ENQUE_READ2'
EXPORTING
gclient = sy-mandt
gname = 'AUFK'
garg = lv_garg
TABLES
enq = lt_enq.
.
IF lt_enq IS NOT INITIAL.
" 内表非空,说明当前订单已被锁定
WAIT UP TO 5 SECONDS.
ELSE.
" 内表为空,未被锁定,可以安全操作
EXIT.
ENDIF.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DJOB
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM djob .
DATA:ls_zbomall TYPE zbomall_log.
DATA:lt_zbomall TYPE TABLE OF zbomall_log.
SELECT * FROM zbomall_log INTO CORRESPONDING FIELDS OF TABLE @lt_zbomall WHERE zaufnr = @ls_zbomcost_job-aufnr AND zmsgty = 'S'.
LOOP AT lt_zbomall INTO ls_zbomall .
ls_zbomall-zcdate = sy-datum.
ls_zbomall-zctime = sy-uzeit.
ls_zbomall-zcuser = sy-uname.
ls_zbomall-zmsgty = 'E'.
ls_zbomall-zmsgtxt = '重新下发'.
MODIFY lt_zbomall FROM ls_zbomall.
ENDLOOP.
MODIFY zbomall_log FROM TABLE lt_zbomall.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
RANGES:s_aufnr FOR afko-aufnr.
RANGES:s_werks FOR mseg-werks.
CLEAR:s_aufnr,s_werks.
s_aufnr-sign = 'I'.
s_aufnr-option = 'EQ'.
s_aufnr-low = ls_zbomcost_job-aufnr.
APPEND s_aufnr.
s_werks-sign = 'I'.
s_werks-option = 'EQ'.
s_werks-low = '1110'.
APPEND s_werks.
SUBMIT zppc009
WITH s_werks IN s_werks
WITH s_aufnr IN s_aufnr
AND RETURN.
ENDFORM.
修改工序生成程序
java
*&---------------------------------------------------------------------*
*& Report ZUP_AUFNR_AFVC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zup_aufnr_afvc.
DATA:lt_ztaufnr_afvc TYPE TABLE OF ztaufnr_afvc.
DATA:ls_ztaufnr_afvc TYPE ztaufnr_afvc.
SELECT * FROM zbomcost_job WHERE zflag = '' AND ztype = 'COST' INTO TABLE @DATA(lt_zbomcost_job).
READ TABLE lt_zbomcost_job INTO DATA(ls_zbomcost_job) INDEX 1.
SELECT * FROM ztaufnr_afvc WHERE matnr = @ls_zbomcost_job-matid INTO TABLE @lt_ztaufnr_afvc.
IF lt_zbomcost_job IS NOT INITIAL.
PERFORM zup_wait_time.
PERFORM zup_aufnr_dl. "删除
PERFORM zup_wait_time.
PERFORM zup_aufnr_ad. "新增
PERFORM zup_wait_time.
PERFORM zuo_aufnr_rel. "订单下单
PERFORM zup_wait_time.
PERFORM zuo_aufnr_up. "重新填写站点
PERFORM zup_wait_time.
PERFORM djob.
*PERFORM zup_aufnr_up. "修改
ENDIF.
**&---------------------------------------------------------------------*
**& Form ZUP_AUFNR_UP
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**& --> p1 text
**& <-- p2 text
**&---------------------------------------------------------------------*
FORM zup_aufnr_ad .
DATA: lv_aufnr TYPE aufnr,
ls_return TYPE bapiret2,
lt_routing TYPE cose_t_opr_create,
ls_routing TYPE cose_s_opr_create.
* lv_aufnr = '000001146943'. "订单号
* ls_routing-vornr = '0190'. "新增序号
* ls_routing-arbpl = '121070'. "工作中心
* ls_routing-ltxa1 = '新增测试'."工序短文本
* ls_routing-steus = 'ZP01'. "工序码
* ls_routing-bmsch = '1000'. "基本数量
* ls_routing-vgw01 = 66. "人工成本
* ls_routing-vgw02 = 66. "折旧成本
* ls_routing-vgw03 = 66. "机物料消耗
* ls_routing-vgw04 = 66. "能源费用
* ls_routing-vgw05 = 66. "其他制造费用
* ls_routing-vgw06 = 66. "外协
* APPEND ls_routing TO lt_routing.
CLEAR: lt_routing.
SELECT mapl~matnr, "物料号"
mapl~plnnr, "工艺路线号"
mapl~plnal, "组计数器"
plpo~vornr, "工序号"
plpo~ltxa1, "工序描述"
crhd~arbpl, "工作中心名称"
plpo~steus,
plpo~bmsch,
plpo~vgw01,
plpo~vgw02,
plpo~vgw03,
plpo~vgw04,
plpo~vgw05,
plpo~vgw06,
plpo~vge01,
plpo~vge02,
plpo~vge03,
plpo~vge04,
plpo~vge05,
plpo~vge06,
plpo~sortl
FROM mapl
INNER JOIN plko ON plko~plnty = mapl~plnty
AND plko~plnnr = mapl~plnnr
AND plko~plnal = mapl~plnal
INNER JOIN plas ON plas~plnty = plko~plnty
AND plas~plnnr = plko~plnnr
AND plas~plnal = plko~plnal
INNER JOIN plpo ON plpo~plnty = plas~plnty
AND plpo~plnnr = plas~plnnr
AND plpo~plnkn = plas~plnkn
AND plpo~zaehl = plas~zaehl
LEFT JOIN crhd ON crhd~objid = plpo~arbid
WHERE mapl~matnr = @ls_zbomcost_job-matid
AND mapl~werks = @ls_zbomcost_job-werks
AND plas~loekz = ''
INTO TABLE @DATA(lt_plpo). "过滤掉被删除的工序关联"
SELECT SINGLE MAX( vornr ) AS vornr
FROM afko AS a
INNER JOIN afvc AS b ON a~aufpl = b~aufpl
WHERE a~aufnr = @ls_zbomcost_job-aufnr
INTO @DATA(lv_vornr).
DATA:lv_sum TYPE char05.
LOOP AT lt_plpo INTO DATA(ls_plpo).
CLEAR:ls_routing.
MOVE-CORRESPONDING ls_plpo TO ls_routing.
READ TABLE lt_ztaufnr_afvc INTO ls_ztaufnr_afvc WITH KEY sortl = ls_plpo-sortl.
IF sy-subrc <> 0.
lv_sum = lv_sum + 1.
ls_routing-vornr = lv_vornr + 10 * lv_sum.
ls_routing-vornr = |{ ls_routing-vornr ALPHA = IN }|.
APPEND ls_routing TO lt_routing.
ENDIF.
ENDLOOP.
lv_aufnr = ls_zbomcost_job-aufnr.
CALL FUNCTION 'CO_SE_PRODORD_OPR_CREATE'
EXPORTING
iv_order_number = lv_aufnr
it_opr_create = lt_routing
* it_user_stat =
iv_refresh = 'X'
iv_order_post = 'X'
iv_commit = 'X'
IMPORTING
es_return = ls_return.
IF ls_return-type = ''.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ls_zbomcost_job-zflag = 'S'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_zbomcost_job-zflag = 'E'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ENDIF.
ENDFORM.
**&---------------------------------------------------------------------*
**& Form zup_aufnr_DL
**&---------------------------------------------------------------------*
**& text
**&---------------------------------------------------------------------*
**& --> p1 text
**& <-- p2 text
**&---------------------------------------------------------------------*
FORM zup_aufnr_dl .
DATA: lv_aufnr TYPE aufnr,
ls_return TYPE bapiret2,
lt_routing TYPE cose_t_opr_delete,
ls_routing TYPE cose_s_opr_delete.
CLEAR: lt_routing.
SELECT b~vornr,b~objnr
FROM afko AS a
INNER JOIN afvc AS b ON a~aufpl = b~aufpl
WHERE a~aufnr = @ls_zbomcost_job-aufnr
INTO TABLE @DATA(lt_afvc).
LOOP AT lt_afvc INTO DATA(ls_afvc).
READ TABLE lt_ztaufnr_afvc INTO ls_ztaufnr_afvc WITH KEY vornr = ls_afvc-vornr.
IF sy-subrc <> 0.
SELECT stat FROM jest
WHERE objnr = @ls_afvc-objnr
INTO TABLE @DATA(lt_stat).
READ TABLE lt_stat INTO DATA(ls_stat) WITH KEY stat = 'I0013'.
IF sy-subrc <> 0.
ls_routing-vornr = ls_afvc-vornr.
APPEND ls_routing TO lt_routing.
ENDIF.
ENDIF.
ENDLOOP.
lv_aufnr = ls_zbomcost_job-aufnr.
IF lt_routing IS NOT INITIAL.
CALL FUNCTION 'CO_SE_PRODORD_OPR_DELETE'
EXPORTING
iv_order_number = lv_aufnr
it_opr_delete = lt_routing
* it_user_stat =
iv_refresh = 'X'
iv_order_post = 'X'
iv_commit = 'X'
IMPORTING
es_return = ls_return.
IF ls_return-type = ''.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ls_zbomcost_job-zflag = 'S'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ls_zbomcost_job-zflag = 'E'.
MODIFY zbomcost_job FROM ls_zbomcost_job.
EXIT.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zuo_aufnr_rel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM zuo_aufnr_rel .
DATA: lwa_aufnr TYPE ord_pre,
lwa_tca11 TYPE tca11,
lwa_caufvd TYPE caufvd,
lt_aufnr TYPE STANDARD TABLE OF ord_pre.
lwa_aufnr-aufnr = ls_zbomcost_job-aufnr.
APPEND lwa_aufnr TO lt_aufnr.
lwa_tca11-flg_alt =
lwa_tca11-flg_seq =
lwa_tca11-flg_opr =
lwa_tca11-flg_sop =
lwa_tca11-flg_aob =
lwa_tca11-flg_fhm =
lwa_tca11-flg_mst =
lwa_tca11-flg_phas = 'X'.
CALL FUNCTION 'CO_ZF_ORDER_READ'
EXPORTING
flg_dialog = space
flg_enqueue = 'X'
objects_imp = lwa_tca11
flg_prot_imp = 'X'
TABLES
aufnr_tab_imp = lt_aufnr
EXCEPTIONS
order_not_found = 1
release_no_change = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION 'CO_BT_CAUFV_READ_WITH_KEY'
EXPORTING
aufnr_act = lwa_aufnr-aufnr
no_dialog_info = 'X'
IMPORTING
caufvd_exp = lwa_caufvd
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc EQ 0.
CALL FUNCTION 'CO_ZR_HEADER_RELEASE_NEW'
EXPORTING
caufvd_imp = lwa_caufvd
prot_init_imp = 'X'
write_prot_imp = 'X'
no_dialog_imp = 'X'
no_avail_check_imp = 'X'
IMPORTING
caufvd_exp = lwa_caufvd
EXCEPTIONS
free_failed = 1
end_task = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zup_wait_time
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM zup_wait_time .
"检查是否锁表
DO 9999 TIMES.
DATA: lv_garg TYPE seqg3-garg. "锁参数
DATA: lt_enq TYPE TABLE OF seqg7. "锁信息内表
"锁定参数构成规则:集团 + 订单号
"假设订单号为 10000001,注意总长度和填充方式需参考SM12
lv_garg = sy-mandt && ls_zbomcost_job-aufnr.
"调用函数读取锁信息
CALL FUNCTION 'ENQUE_READ2'
EXPORTING
gclient = sy-mandt
gname = 'AUFK'
garg = lv_garg
TABLES
enq = lt_enq.
.
IF lt_enq IS NOT INITIAL.
" 内表非空,说明当前订单已被锁定
WAIT UP TO 5 SECONDS.
ELSE.
" 内表为空,未被锁定,可以安全操作
EXIT.
ENDIF.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zuo_aufnr_UP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM zuo_aufnr_UP .
SELECT b~aufpl,
b~aplzl,
b~vornr,
b~sortl
FROM afvc AS b
INNER JOIN afko AS a ON a~aufpl = b~aufpl
WHERE a~aufnr = @ls_zbomcost_job-aufnr
INTO TABLE @DATA(lt_afvc).
SELECT mapl~matnr, "物料号"
mapl~plnnr, "工艺路线号"
mapl~plnal, "组计数器"
plpo~vornr, "工序号"
plpo~ltxa1, "工序描述"
crhd~arbpl, "工作中心名称"
plpo~steus,
plpo~bmsch,
plpo~vgw01,
plpo~vgw02,
plpo~vgw03,
plpo~vgw04,
plpo~vgw05,
plpo~vgw06,
plpo~vge01,
plpo~vge02,
plpo~vge03,
plpo~vge04,
plpo~vge05,
plpo~vge06,
plpo~sortl
FROM mapl
INNER JOIN plko ON plko~plnty = mapl~plnty
AND plko~plnnr = mapl~plnnr
AND plko~plnal = mapl~plnal
INNER JOIN plas ON plas~plnty = plko~plnty
AND plas~plnnr = plko~plnnr
AND plas~plnal = plko~plnal
INNER JOIN plpo ON plpo~plnty = plas~plnty
AND plpo~plnnr = plas~plnnr
AND plpo~plnkn = plas~plnkn
AND plpo~zaehl = plas~zaehl
LEFT JOIN crhd ON crhd~objid = plpo~arbid
WHERE mapl~matnr = @ls_zbomcost_job-matid
AND mapl~werks = @ls_zbomcost_job-werks
AND plas~loekz = ''
INTO TABLE @DATA(lt_plpo). "过滤掉被删除的工序关联"
SORT lt_afvc BY vornr DESCENDING.
LOOP AT lt_afvc INTO DATA(ls_afvc).
IF ls_afvc-sortl IS INITIAL.
READ TABLE lt_plpo INTO DATA(ls_plpo) INDEX lines( lt_plpo ) - sy-tabix + 1.
IF sy-subrc = 0.
UPDATE afvc SET sortl = ls_plpo-sortl WHERE aufpl = ls_afvc-aufpl
AND aplzl = ls_afvc-aplzl.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form djob
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM djob .
DATA:ls_zprocess_mes TYPE zprocess_mes.
DATA:lt_zprocess_mes TYPE TABLE OF zprocess_mes.
SELECT * FROM zprocess_mes INTO CORRESPONDING FIELDS OF TABLE @lt_zprocess_mes WHERE zaufnr = @ls_zbomcost_job-aufnr AND zmsgty = 'S'.
LOOP AT lt_zprocess_mes INTO ls_zprocess_mes .
ls_zprocess_mes-zcdate = sy-datum.
ls_zprocess_mes-zctime = sy-uzeit.
ls_zprocess_mes-zcuser = sy-uname.
ls_zprocess_mes-zmsgty = 'E'.
ls_zprocess_mes-zmsgtxt = '重新下发'.
MODIFY lt_zprocess_mes FROM ls_zprocess_mes.
ENDLOOP.
MODIFY zprocess_mes FROM TABLE lt_zprocess_mes.
IF sy-subrc = 0.
COMMIT WORK.
ENDIF.
RANGES:s_aufnr FOR afko-aufnr.
RANGES:s_werks FOR mseg-werks.
CLEAR:s_aufnr,s_werks.
s_aufnr-sign = 'I'.
s_aufnr-option = 'EQ'.
s_aufnr-low = ls_zbomcost_job-aufnr.
APPEND s_aufnr.
s_werks-sign = 'I'.
s_werks-option = 'EQ'.
s_werks-low = '1110'.
APPEND s_werks.
SUBMIT zppc006
WITH s_werks IN s_werks
WITH s_aufnr IN s_aufnr
AND RETURN.
ENDFORM.
接口回传MES
java
*&---------------------------------------------------------------------*
*& Report ZBOMCOST_VER_JOB
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zbomcost_ver_job.
DATA:gt_zbomcost_ver TYPE TABLE OF zbomcost_ver.
DATA:gs_zbomcost_ver TYPE zbomcost_ver.
DATA:gt_zbomcost_up TYPE TABLE OF zbomcost_ver.
DATA:gs_zbomcost_up TYPE zbomcost_ver.
DATA:lv_flag.
SELECT * FROM zbomcost_ver
WHERE zflag = ''
INTO CORRESPONDING FIELDS OF TABLE @gt_zbomcost_ver.
IF gt_zbomcost_ver IS NOT INITIAL.
SELECT * FROM zbomcost_job
FOR ALL ENTRIES IN @gt_zbomcost_ver
WHERE uuid = @gt_zbomcost_ver-uuid
AND zflag IN ( '' , 'E' )
INTO TABLE @DATA(lt_zbomcost_job).
ENDIF.
LOOP AT gt_zbomcost_ver INTO gs_zbomcost_ver.
READ TABLE lt_zbomcost_job INTO DATA(ls_result) WITH KEY uuid = gs_zbomcost_ver-uuid.
IF sy-subrc <> 0.
CLEAR:gs_zbomcost_up.
MOVE-CORRESPONDING gs_zbomcost_ver TO gs_zbomcost_up.
APPEND gs_zbomcost_up TO gt_zbomcost_up.
ENDIF.
ENDLOOP.
IF gt_zbomcost_up IS NOT INITIAL.
"调用接口UP MES表
PERFORM post_url.
"最后参数写入
IF lv_flag = 'X'.
PERFORM modify_table.
ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*& Form post_url
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM post_url .
*{
* "items": [
* {
* "sql": ""
* }
* ]
*}
*BEGIN
* UPDATE SWEEPCODE_COPY SET crdata = '99260226' WHERE uuid = '7e24d721-c9fe-43c4-be4d-af776ec51fcc';
* UPDATE SWEEPCODE_COPY SET crdata = '99260226' WHERE uuid = '0965ac36-0afb-482b-ad15-5796793c3497';
* COMMIT;
*END;
"code": 0,
"message": null,
"data": null
DATA:BEGIN OF es_out,
code TYPE string,
message TYPE string,
data TYPE string,
END OF es_out.
DATA:lv_string TYPE string.
DATA: len TYPE i, "发送报文长度"
len_string TYPE string,
url TYPE string, "接口地址
http_client TYPE REF TO if_http_client, "http客户端
post_string TYPE string,
result TYPE string.
DATA: it_header TYPE tihttpnvp,
gv_json_in TYPE string VALUE ''.
LOOP AT gt_zbomcost_up INTO gs_zbomcost_up.
DATA(lv_version) = |{ gs_zbomcost_up-verid ALPHA = OUT }|.
CONDENSE lv_version NO-GAPS.
lv_string = lv_string && `UPDATE ATESTPIDVER SET IS_SAP_TO_MES = 'Y' WHERE PID =` && GS_ZBOMCOST_UP-MATNR && `AND VERSION = ` && lv_version && `;`.
lv_string = lv_string && `UPDATE ATESTPIDDEF SET IS_SAP_TO_MES = 'Y' WHERE PID =` && GS_ZBOMCOST_UP-MATNR && `AND VERSION = ` && lv_version && `;`.
ENDLOOP.
lv_string = `{"items": [{"sql": "` && 'BEGIN' && ` ` && lv_string && ' COMMIT;END;"}]}'.
url = '*****'.
"创建http客户端
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = url
IMPORTING
client = http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
"调取方式:get 或者为 post"
http_client->request->set_content_type( content_type = 'text/html; charset=utf-8' ).
http_client->request->set_method( if_http_request=>co_request_method_post ).
"http_client->request->set_method( if_http_request=>co_request_method_get ).
"---设置要传输内容
len = strlen( lv_string ).
CALL METHOD http_client->request->if_http_entity~set_cdata
EXPORTING
data = lv_string
offset = 0
length = len.
"发送
CALL METHOD http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
"接收
CALL METHOD http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
CLEAR result.
result = http_client->response->get_cdata( )."提取返回字符串
/ui2/cl_json=>deserialize( EXPORTING json = result
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = es_out ).
IF es_out-code = 0 .
lv_flag = 'X'.
ENDIF.
"关闭接口
CALL METHOD http_client->close.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form modify_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM modify_table .
LOOP AT gt_zbomcost_up INTO gs_zbomcost_up.
gs_zbomcost_up-zflag = 'X'.
MODIFY gt_zbomcost_up FROM gs_zbomcost_up.
ENDLOOP.
MODIFY zbomcost_ver FROM TABLE gt_zbomcost_up.
ENDFORM.
上述内容为笔记内容 本人记录自用