新公司有上线PS模块,其实也不能算完全上线吧,外部用的是oracle的PS系统,数据存储和立项又在SAP上操作,新公司挺多模块都是这么做的,对我们这个ABAP真的是难受,面对那些陌生的BAPI老是在查找问题和报错。
实现对项目、WBS、网络、作业和预算的创建和状态的修改。
首先无论是项目、WBS、网络的新增还是修改都需要进行一次预校验,由于项目和WBS的修改都是通过不同的BAPI来的,同样在完成之后分别 commit work 或者 rollback,所以在不使用update function保证二者的一致性的时候,需要先做一次预校验(预校验中没有单独修改某个项目或者WBS对象的属性全面)。
DATA : lv_vernr TYPE tcj04-vernr,
ls_wbs TYPE zspomp_ps10,
ls_network TYPE zspomp_ps11,
ls_activity TYPE zspomp_ps11,
lv_idx TYPE sy-tabix,
lv_flag,
lv_aufnr TYPE aufnr.
DATA : ls_return TYPE zspomp_return,
ls_ztpomp_msnm TYPE ztpomp_msnm,
ls_prodef TYPE bapi_project_definition,
ls_prodef_upd TYPE bapi_project_definition_up,
ls_wbs_new TYPE bapi_wbs_element,
lt_wbs_new TYPE TABLE OF bapi_wbs_element,
ls_wbs_upd TYPE bapi_wbs_element_update,
lt_wbs_upd TYPE TABLE OF bapi_wbs_element_update,
lt_wbs_pos TYPE TABLE OF bapi_wbs_hierarchie,
ls_wbs_pos TYPE bapi_wbs_hierarchie,
lt_net_new TYPE TABLE OF bapi_network,
ls_net_new TYPE bapi_network,
lt_act_new TYPE TABLE OF bapi_network_activity,
ls_act_new TYPE bapi_network_activity,
lt_act_upd TYPE TABLE OF bapi_network_activity_up,
ls_act_upd TYPE bapi_network_activity_up,
ls_method TYPE bapi_method_project,
lt_method TYPE TABLE OF bapi_method_project.
REFRESH : gt_methrest.
CLEAR : gs_bapiret1,
gs_methrest.
SORT it_network BY posid vornr.
*&-------------------------------------------------------------------*
*& 项目定义
*&-------------------------------------------------------------------*
* 这个项目编号赋值前置,后续所有的操作都需要赋值
ls_prodef-project_definition = is_proj-pspid. "项目编号
* 项目负责人
* 根据负责人姓名取负责人编号
CLEAR : lv_vernr.
SELECT SINGLE vernr
FROM tcj04
INTO lv_vernr
WHERE verna = is_proj-verna.
IF is_proj-operation = gcon_opr_create.
ls_prodef-description = is_proj-post1. "PS: 短描述 (第一行文本)
ls_prodef-responsible_no = lv_vernr. "负责人编号
ls_prodef-start = is_proj-plfaz. "开始日期
ls_prodef-finish = is_proj-plsez. "完成日期
ls_prodef-comp_code = is_proj-vbukr. "项目的公司代码
ls_prodef-profit_ctr = is_proj-prctr. "利润中心
ls_prodef-project_profile = is_proj-profl. "项目参数文件
ls_prodef-plant = is_proj-werks. "工厂
CLEAR : ls_method.
ls_method-refnumber = '000001'.
ls_method-objecttype = 'PROJECTDEFINITION'.
ls_method-method = 'CREATE'.
ls_method-objectkey = is_proj-pspid.
APPEND ls_method TO lt_method.
ELSEIF is_proj-operation = gcon_opr_change.
IF is_proj-post1 IS NOT INITIAL. "PS: 短描述 (第一行文本)
ls_prodef-description = is_proj-post1.
ls_prodef_upd-description = 'X'.
ENDIF.
IF lv_vernr IS NOT INITIAL. "负责人编号
ls_prodef-responsible_no = lv_vernr.
ls_prodef_upd-responsible_no = 'X'.
ENDIF.
IF is_proj-plfaz IS NOT INITIAL. "开始日期
ls_prodef-start = is_proj-plfaz.
ls_prodef_upd-start = 'X'.
ENDIF.
IF is_proj-plsez IS NOT INITIAL. "完成日期
ls_prodef-finish = is_proj-plsez.
ls_prodef_upd-finish = 'X'.
ENDIF.
IF is_proj-vbukr IS NOT INITIAL. "项目的公司代码
ls_prodef-comp_code = is_proj-vbukr.
ls_prodef_upd-comp_code = 'X'.
ENDIF.
IF is_proj-prctr IS NOT INITIAL. "利润中心
ls_prodef-profit_ctr = is_proj-prctr.
ls_prodef_upd-profit_ctr = 'X'.
ENDIF.
IF is_proj-profl IS NOT INITIAL. "项目参数文件
ls_prodef-project_profile = is_proj-profl.
ls_prodef_upd-project_profile = 'X'.
ENDIF.
IF is_proj-werks IS NOT INITIAL. "工厂
ls_prodef-plant = is_proj-werks.
ls_prodef_upd-plant = 'X'.
ENDIF.
CLEAR : ls_method.
ls_method-refnumber = '000001'.
ls_method-objecttype = 'PROJECTDEFINITION'.
ls_method-method = 'UPDATE'.
ls_method-objectkey = is_proj-pspid.
APPEND ls_method TO lt_method.
ENDIF.
*&-------------------------------------------------------------------*
*&WBS
*&-------------------------------------------------------------------*
CLEAR : lv_idx.
LOOP AT it_wbs INTO ls_wbs WHERE operation = gcon_opr_change.
*** LV_FLAG - WBS是否有修改的标识
CLEAR : lv_flag.
* 项目负责人
* 根据负责人姓名取负责人编号
CLEAR : lv_vernr.
SELECT SINGLE vernr
FROM tcj04
INTO lv_vernr
WHERE verna = ls_wbs-verna.
CLEAR : ls_wbs_new,
ls_wbs_upd.
ls_wbs_new-project_definition = is_proj-pspid. "项目定义
ls_wbs_new-wbs_element = ls_wbs-posid. "WBS 元素
* ls_wbs_upd-project_definition = 'X'. "项目定义
* ls_wbs_upd-wbs_element = 'X'. "WBS 元素
IF ls_wbs-post1 IS NOT INITIAL. "短描述
ls_wbs_new-description = ls_wbs-post1.
ls_wbs_upd-description = 'X'.
lv_flag = 'X'.
ENDIF.
IF lv_vernr IS NOT INITIAL. "负责人编号
ls_wbs_new-responsible_no = lv_vernr.
ls_wbs_upd-responsible_no = 'X'.
lv_flag = 'X'.
ENDIF.
IF ls_wbs-prctr IS NOT INITIAL. "利润中心
ls_wbs_new-profit_ctr = ls_wbs-prctr.
ls_wbs_upd-profit_ctr = 'X'.
lv_flag = 'X'.
ENDIF.
IF ls_wbs-prart IS NOT INITIAL. "项目类型
ls_wbs_new-proj_type = ls_wbs-prart.
ls_wbs_upd-proj_type = 'X'.
lv_flag = 'X'.
ENDIF.
IF ls_wbs-belkz IS NOT INITIAL. "标志:科目分配元素
ls_wbs_new-wbs_account_assignment_element = ls_wbs-belkz.
ls_wbs_upd-wbs_account_assignment_element = 'X'.
lv_flag = 'X'.
ENDIF.
IF ls_wbs-fakkz IS NOT INITIAL. "标识符: 开票元素
ls_wbs_new-wbs_billing_element = ls_wbs-fakkz.
ls_wbs_upd-wbs_billing_element = 'X'.
lv_flag = 'X'.
ENDIF.
IF ls_wbs-usr00 IS NOT INITIAL. "业务类别
ls_wbs_new-user_field_char20_1 = ls_wbs-usr00.
ls_wbs_upd-user_field_char20_1 = 'X'.
lv_flag = 'X'.
ENDIF..
IF ls_wbs-usr01 IS NOT INITIAL. "CRM 商机编码
ls_wbs_new-user_field_char20_2 = ls_wbs-usr01.
ls_wbs_upd-user_field_char20_2 = ls_wbs-usr01.
lv_flag = 'X'.
ENDIF.
IF lv_flag EQ 'X'.
*** 该LV_IDX的值不可清空,承接给上部分创建的
lv_idx = lv_idx + 1.
APPEND ls_wbs_new TO lt_wbs_new.
APPEND ls_wbs_upd TO lt_wbs_upd.
* 因为有WBS创建,需要传输整个的WBS结构。所以当WBS的基本信息没有改动,是不需要
* 且也不可以传输UPDATE状态
CLEAR : ls_method.
ls_method-refnumber = lv_idx.
ls_method-objecttype = 'WBS-ELEMENT'.
ls_method-method = 'UPDATE'.
ls_method-objectkey = ls_wbs-posid.
APPEND ls_method TO lt_method.
ENDIF.
ls_wbs_pos-wbs_element = ls_wbs-posid.
ls_wbs_pos-project_definition = is_proj-pspid.
ls_wbs_pos-up = ls_wbs-up_posid.
ls_wbs_pos-down = ls_wbs-down_posid.
ls_wbs_pos-left = ls_wbs-left_posid.
ls_wbs_pos-right = ls_wbs-right_posid.
APPEND ls_wbs_pos TO lt_wbs_pos.
ENDLOOP.
LOOP AT it_wbs INTO ls_wbs WHERE operation = gcon_opr_create.
lv_idx = lv_idx + 1.
* 项目负责人
* 根据负责人姓名取负责人编号
CLEAR : lv_vernr.
SELECT SINGLE vernr
FROM tcj04
INTO lv_vernr
WHERE verna = ls_wbs-verna.
ls_wbs_new-project_definition = is_proj-pspid. "项目定义
ls_wbs_new-wbs_element = ls_wbs-posid. "工作分解结构元素 (WBS 元素)
ls_wbs_new-description = ls_wbs-post1. "PS: 短描述 (第一行文本)
ls_wbs_new-responsible_no = lv_vernr. "负责人编号
ls_wbs_new-profit_ctr = ls_wbs-prctr. "利润中心
ls_wbs_new-proj_type = ls_wbs-prart. "项目类型
ls_wbs_new-wbs_account_assignment_element = ls_wbs-belkz. "标志:科目分配元素
ls_wbs_new-wbs_billing_element = ls_wbs-fakkz. "标识符: 开票元素
ls_wbs_new-user_field_char20_1 = ls_wbs-usr00. "业务类别
ls_wbs_new-user_field_char20_2 = ls_wbs-usr01. "CRM 商机编码
APPEND ls_wbs_new TO lt_wbs_new.
ls_wbs_pos-wbs_element = ls_wbs-posid.
ls_wbs_pos-project_definition = is_proj-pspid.
ls_wbs_pos-up = ls_wbs-up_posid.
ls_wbs_pos-down = ls_wbs-down_posid.
ls_wbs_pos-left = ls_wbs-left_posid.
ls_wbs_pos-right = ls_wbs-right_posid.
APPEND ls_wbs_pos TO lt_wbs_pos.
CLEAR : ls_method.
ls_method-refnumber = lv_idx.
ls_method-objecttype = 'WBS-ELEMENT'.
ls_method-method = 'CREATE'.
ls_method-objectkey = ls_wbs-posid.
APPEND ls_method TO lt_method.
ENDLOOP.
IF sy-subrc EQ 0.
CLEAR : ls_method.
ls_method-objecttype = 'WBS HIERARCHY'.
ls_method-method = 'CREATE'.
APPEND ls_method TO lt_method.
ENDIF.
*&-------------------------------------------------------------------*
*& 网络
*&-------------------------------------------------------------------*
IF it_network[] IS NOT INITIAL.
* 最外层的WBS元素创建一个网络 ,依情况定
SELECT SINGLE aufnr
INTO lv_aufnr
FROM afko
JOIN proj
ON afko~pronr = proj~pspnr
WHERE proj~pspid = is_proj-pspid.
IF sy-subrc NE 0.
lv_aufnr = 'TEMP' && sy-datum && sy-uzeit.
READ TABLE it_network INTO ls_network INDEX 1.
READ TABLE it_wbs INTO ls_wbs WITH KEY up_posid = ''.
* 创建网络
CLEAR : ls_net_new.
ls_net_new-network = lv_aufnr.
ls_net_new-project_definition = is_proj-pspid. "项目定义
ls_net_new-wbs_element = ls_wbs-posid. "工作分解结构元素 (WBS 元素)
ls_net_new-plant = ls_network-werks. "工厂
ls_net_new-mrp_controller = ls_network-dispo. "MRP控制者
APPEND ls_net_new TO lt_net_new.
CLEAR : ls_method.
ls_method-refnumber = '000001'.
ls_method-objecttype = 'NETWORK'.
ls_method-method = 'CREATE'.
ls_method-objectkey = lv_aufnr.
APPEND ls_method TO lt_method.
ENDIF.
ENDIF.
*&-------------------------------------------------------------------*
*& 作业
*&-------------------------------------------------------------------*
CLEAR : lv_idx.
LOOP AT it_network INTO ls_activity WHERE operation = gcon_opr_change.
****该LV_IDX的值不可清空,承接给上部分创建的
lv_idx = lv_idx + 1.
CLEAR : ls_act_new,
ls_act_upd.
ls_act_new-network = lv_aufnr. "网络
ls_act_new-activity = ls_activity-vornr. "在网络和库网络中的作业编号
ls_act_new-project_definition = is_proj-pspid. "项目定义
IF ls_activity-ltxa1 IS NOT INITIAL. "工序短文本
ls_act_new-description = ls_activity-ltxa1.
ls_act_upd-description = 'X'.
ENDIF.
IF ls_activity-steus IS NOT INITIAL. "控制码-内协(ZPS1)和成本(ZPS3)
ls_act_new-control_key = ls_activity-steus.
ls_act_upd-control_key = 'X'.
ENDIF.
IF ls_activity-posid IS NOT INITIAL. "工作分解结构元素 (WBS 元素)
ls_act_new-wbs_element = ls_activity-posid.
ls_act_upd-wbs_element = 'X'.
ENDIF.
IF ls_activity-arbpl IS NOT INITIAL. "工作中心
ls_act_new-work_cntr = ls_activity-arbpl.
ls_act_upd-work_cntr = 'X'.
ENDIF.
IF ls_activity-arbei IS NOT INITIAL. "工作(时间单位H)
ls_act_new-work_activity = ls_activity-arbei.
ls_act_upd-work_activity = 'X'.
ENDIF.
IF ls_activity-indet IS NOT INITIAL. "用于计算的码
ls_act_new-activity_costs = ls_activity-indet.
ls_act_upd-activity_costs = 'X'.
ENDIF.
IF ls_activity-larnt IS NOT INITIAL. "活动类型
ls_act_new-acttype = ls_activity-larnt.
ls_act_upd-acttype = 'X'.
ENDIF.
IF ls_activity-sakto IS NOT INITIAL. "成本要素编码
ls_act_new-cost_elem = ls_activity-sakto.
ls_act_upd-cost_elem = 'X'.
ENDIF.
IF ls_activity-prctr IS NOT INITIAL. "利润中心
ls_act_new-profit_ctr = ls_activity-prctr.
ls_act_upd-profit_ctr = 'X'.
ENDIF.
IF ls_activity-prkst IS NOT INITIAL. "作业中的成本
ls_act_new-activity_costs = ls_activity-prkst.
ls_act_upd-activity_costs = 'X'.
ENDIF.
APPEND ls_act_new TO lt_act_new.
APPEND ls_act_upd TO lt_act_upd.
CLEAR : ls_method.
ls_method-refnumber = lv_idx.
ls_method-objecttype = 'NETWORKACTIVITY'.
ls_method-method = 'UPDATE'.
ls_method-objectkey = ls_act_new-wbs_element && ls_act_new-activity.
APPEND ls_method TO lt_method.
ENDLOOP.
LOOP AT it_network INTO ls_activity WHERE operation = gcon_opr_create.
lv_idx = lv_idx + 1.
CLEAR : ls_act_new.
ls_act_new-network = lv_aufnr. "在网络和库网络中的作业编号
ls_act_new-activity = ls_activity-vornr. "在网络和库网络中的作业编号
ls_act_new-description = ls_activity-ltxa1. "工序短文本
ls_act_new-control_key = ls_activity-steus. "控制码-内协(ZPS1)和成本(ZPS3)
ls_act_new-project_definition = is_proj-pspid. "工作分解结构元素 (WBS 元素)
ls_act_new-wbs_element = ls_activity-posid. "工作分解结构元素 (WBS 元素)
ls_act_new-work_cntr = ls_activity-arbpl. "工作中心
ls_act_new-work_activity = ls_activity-arbei. "工作(时间单位H)
ls_act_new-activity_costs = ls_activity-indet. "用于计算的码
ls_act_new-acttype = ls_activity-larnt. "活动类型
ls_act_new-cost_elem = ls_activity-sakto. "成本要素编码
ls_act_new-profit_ctr = ls_activity-prctr. "利润中心
IF ls_activity-steus EQ 'ZPS1'.
ls_act_new-user_field_curr1 = ls_activity-prkst. "作业中的成本
ELSE.
ls_act_new-activity_costs = ls_activity-prkst. "作业中的成本
ENDIF.
APPEND ls_act_new TO lt_act_new.
CLEAR : ls_method.
ls_method-refnumber = lv_idx.
ls_method-objecttype = 'NETWORKACTIVITY'.
ls_method-method = 'CREATE'.
ls_method-objectkey = ls_act_new-wbs_element && ls_act_new-activity.
APPEND ls_method TO lt_method.
ENDLOOP.
*&-------------------------------------------------------------------*
*& 添加以下代码后,会直接执行保存或修改等操作 - 不要删
*&-------------------------------------------------------------------*
* CLEAR : ls_method.
* ls_method-method = 'SAVE'.
* APPEND ls_method TO lt_method.
CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
EXPORTING
i_project_definition = ls_prodef
i_project_definition_upd = ls_prodef_upd
IMPORTING
return = gs_bapiret1
TABLES
i_method_project = lt_method
i_wbs_element_table_update = lt_wbs_upd
i_wbs_element_table = lt_wbs_new
i_wbs_hierarchie_table = lt_wbs_pos
i_network = lt_net_new
i_activity = lt_act_new
i_activity_update = lt_act_upd
e_message_table = gt_methrest.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
此时若无错误信息,则进行下面的创建和修改逻辑。
创建项目、WBS、网络、作业、下达预算。(注:所有PS模块的BAPI在使用之前都需要BAPI_PS_INITIALIZATION,完成之后PS_FLAG_INIT_GLOBAL_FLAGS,BAPI_PS_PRECOMMIT最后才是提交和回滚BAPI_TRANSACTION_ROLLBACK / BAPI_TRANSACTION_COMMIT)
gs_proj_bus2001_new-project_definition = is_proj-pspid. "项目编号
gs_proj_bus2001_new-description = is_proj-post1. "PS: 短描述 (第一行文本)
gs_proj_bus2001_new-responsible_no = lv_vernr. "负责人编号
gs_proj_bus2001_new-start = is_proj-plfaz. "开始日期
gs_proj_bus2001_new-finish = is_proj-plsez. "完成日期
gs_proj_bus2001_new-company_code = is_proj-vbukr. "项目的公司代码
gs_proj_bus2001_new-profit_ctr = is_proj-prctr. "利润中心
gs_proj_bus2001_new-project_profile = is_proj-profl. "项目参数文件
gs_proj_bus2001_new-plant = is_proj-werks. "工厂
IF is_proj-func_area IS NOT INITIAL.
gs_proj_bus2001_new-func_area = is_proj-func_area. "功能控制范围
ENDIF.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_BUS2001_CREATE'
EXPORTING
i_project_definition = gs_proj_bus2001_new
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ENDIF.
CHECK sy-subrc NE 0.
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = gs_bapiret2.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = gs_bapiret2.
ev_pspid = is_proj-pspid.
* 项目定义创建成功
ls_return-status = gcon_suc.
READ TABLE gt_pomp_msnm INTO DATA(ls_ztpomp_msnm) WITH KEY mesnum = lc_mesnum11
BINARY SEARCH.
CONCATENATE ls_ztpomp_msnm-mesnum '-' ls_ztpomp_msnm-message INTO ls_return-message.
APPEND ls_return TO et_return.
ENDIF.
同理接下来是WBS的新建:
LOOP AT it_wbs INTO gs_wbs.
CLEAR : gs_wbs_bus2054_new.
gs_wbs_bus2054_new-wbs_element = gs_wbs-posid. "工作分解结构元素 (WBS 元素)
gs_wbs_bus2054_new-description = gs_wbs-post1. "PS: 短描述 (第一行文本)
gs_wbs_bus2054_new-responsible_no = lv_vernr. "负责人编号
gs_wbs_bus2054_new-profit_ctr = gs_wbs-prctr. "利润中心
gs_wbs_bus2054_new-proj_type = gs_wbs-prart. "项目类型
gs_wbs_bus2054_new-wbs_account_assignment_element = gs_wbs-belkz. "标志:科目分配元素
gs_wbs_bus2054_new-wbs_billing_element = gs_wbs-fakkz. "标识符: 开票元素
gs_wbs_bus2054_new-wbs_left = gs_wbs-left_posid."左侧WBS
gs_wbs_bus2054_new-wbs_up = gs_wbs-up_posid. "上级WBS
gs_wbs_bus2054_new-user_field_char20_1 = gs_wbs-usr00. "业务类别
gs_wbs_bus2054_new-user_field_char20_2 = gs_wbs-usr01. "CRM 商机编码
gs_wbs_bus2054_new-user_field_char10_1 = 'X'. "产品
gs_wbs_bus2054_new-statistical = gs_wbs-xstat. "统计
gs_wbs_bus2054_new-wbs_cctr_posted_actual = gs_wbs-kostl. "CCtr 过账
APPEND gs_wbs_bus2054_new TO gt_wbs_bus2054_new.
ENDLOOP.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
EXPORTING
i_project_definition = iv_pspid
TABLES
it_wbs_element = gt_wbs_bus2054_new
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ENDIF.
CHECK sy-subrc NE 0.
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = gs_bapiret2.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = gs_bapiret2.
* WBS元素创建成功
ls_return-status = gcon_suc.
READ TABLE gt_pomp_msnm INTO DATA(ls_ztpomp_msnm) WITH KEY mesnum = lc_mesnum14
BINARY SEARCH.
CONCATENATE ls_ztpomp_msnm-mesnum '-' ls_ztpomp_msnm-message INTO ls_return-message.
APPEND ls_return TO et_return.
ENDIF.
网络的新建:
CLEAR : gs_net_bus2002_new.
gs_net_bus2002_new-project_definition = is_network-pspid. "项目定义
gs_net_bus2002_new-wbs_element = is_network-posid. "工作分解结构元素 (WBS 元素)
gs_net_bus2002_new-short_text = is_network-ktext. "描述
gs_net_bus2002_new-plant = is_network-werks. "工厂
gs_net_bus2002_new-mrp_controller = is_network-dispo. "MRP控制者
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_BUS2002_CREATE'
EXPORTING
i_network = gs_net_bus2002_new
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ENDIF.
CHECK sy-subrc NE 0.
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = gs_bapiret2.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = gs_bapiret2.
READ TABLE gt_bapiret2 INTO gs_bapiret2 WITH KEY id = 'CNIF_PI'
number = '003'.
IF sy-subrc EQ 0.
ev_aufnr = gs_bapiret2-message_v2.
ENDIF.
* 网络创建成功
ls_return-status = gcon_suc.
READ TABLE gt_pomp_msnm INTO DATA(ls_ztpomp_msnm) WITH KEY mesnum = lc_mesnum17
BINARY SEARCH.
CONCATENATE ls_ztpomp_msnm-mesnum '-' ls_ztpomp_msnm-message INTO ls_return-message.
APPEND ls_return TO et_return.
ENDIF.
作业活动的新建:
REFRESH : gt_act_bus2002_new,
gt_bapiret2.
LOOP AT it_activity INTO gs_activity.
CLEAR : gs_act_bus2002_new.
gs_act_bus2002_new-activity = gs_activity-vornr. "在网络和库网络中的作业编号
gs_act_bus2002_new-description = gs_activity-ltxa1. "工序短文本
gs_act_bus2002_new-control_key = gs_activity-steus. "控制码-内协(ZPS1)和成本(ZPS3)
gs_act_bus2002_new-wbs_element = gs_activity-posid. "工作分解结构元素 (WBS 元素)
gs_act_bus2002_new-work_cntr = gs_activity-arbpl. "工作中心
gs_act_bus2002_new-work_activity = gs_activity-arbei. "工作(时间单位H)
*-------------MOD ON 20200423--------Begin-----------------------------------
* gs_act_bus2002_new-calculation_key = gs_activity-indet. "用于计算的码
IF gs_activity-steus = 'ZPS1' AND gs_activity-arbei IS INITIAL.
gs_act_bus2002_new-calculation_key = 0. "用于计算的码
ELSE.
gs_act_bus2002_new-calculation_key = gs_activity-indet. "用于计算的码
ENDIF.
*-------------MOD ON 20200423--------End-------------------------------------
gs_act_bus2002_new-acttype = gs_activity-larnt. "活动类型
gs_act_bus2002_new-cost_elem = gs_activity-sakto. "成本要素编码
gs_act_bus2002_new-profit_ctr = gs_activity-prctr. "利润中心
IF gs_activity-steus EQ 'ZPS3'.
gs_act_bus2002_new-activity_costs = gs_activity-prkst. "作业中的成本
* ELSE.
* gs_act_bus2002_new-user_field_curr1 = gs_activity-prkst. "用户字段 - 值3
ENDIF.
APPEND gs_act_bus2002_new TO gt_act_bus2002_new.
ENDLOOP.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_BUS2002_ACT_CREATE_MULTI'
EXPORTING
i_number = iv_aufnr
TABLES
it_activity = gt_act_bus2002_new
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ENDIF.
CHECK sy-subrc NE 0.
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = gt_bapiret2.
LOOP AT gt_bapiret2 INTO gs_bapiret2 WHERE type CA 'AE'.
ls_return-status = gcon_err.
MESSAGE ID gs_bapiret2-id TYPE gs_bapiret2-type NUMBER gs_bapiret2-number
INTO ls_return-message
WITH gs_bapiret2-message_v1 gs_bapiret2-message_v2
gs_bapiret2-message_v3 gs_bapiret2-message_v4.
APPEND ls_return TO et_return.
ENDLOOP.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
IMPORTING
return = gs_bapiret2.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
IMPORTING
return = gs_bapiret2.
* 作业创建成功
ls_return-status = gcon_suc.
READ TABLE gt_pomp_msnm INTO DATA(ls_ztpomp_msnm) WITH KEY mesnum = lc_mesnum20
BINARY SEARCH.
CONCATENATE ls_ztpomp_msnm-mesnum '-' ls_ztpomp_msnm-message INTO ls_return-message.
APPEND ls_return TO et_return.
ENDIF.
预算的下达和发布:(这里是选择使用BDC的方式去做的,分别使用CJ32和CJ30)
* BDC录屏
REFRESH : gt_bdcdata.
**************设置成本控制范围 - 不能少了此项
SET PARAMETER ID 'CAC' FIELD con_coarea.
* 查询屏幕
PERFORM bdc_dynpro USING 'SAPMKBUD' '0200'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'PROJ-PSPID' iv_pspid
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=EINF'
CHANGING gt_bdcdata.
* 预算-全选
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=MRKA' "全选
CHANGING gt_bdcdata.
* 预算-复制视图
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=KOPS' "复制视图
CHANGING gt_bdcdata.
* 弹框-选择计划总计
* 为兼顾调减情形,不能从预算来算发布金额
PERFORM bdc_dynpro USING 'SAPLSPO5' '0130'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'SPOPLI-SELFLAG(01)' ' ' "取消默认选项
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'SPOPLI-SELFLAG(05)' 'X' "选择"计划总计"
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=OK'
CHANGING gt_bdcdata.
** 弹框-选择预算
* PERFORM bdc_dynpro USING 'SAPLSPO5' '0130'
* CHANGING gt_bdcdata.
*
* PERFORM bdc_field USING 'SPOPLI-SELFLAG(01)' ' ' "取消默认选项
* CHANGING gt_bdcdata.
*
* PERFORM bdc_field USING 'SPOPLI-SELFLAG(08)' 'X' "选择预算
* CHANGING gt_bdcdata.
*
* PERFORM bdc_field USING 'BDC_OKCODE' '=OK'
* CHANGING gt_bdcdata.
* 弹框-100%
PERFORM bdc_dynpro USING 'SAPLKBPP' '0706'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BPDY-COPY_REPL' 'X' "选择“百分比”
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BPDY-COPY_PERC' iv_percen
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTE'
CHANGING gt_bdcdata.
* 预算-保存
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=POST'
CHANGING gt_bdcdata.
CLEAR : ls_opt.
ls_opt-dismode = lv_bdc_mode. "A:调试 N:不显示 E:错误时调试
ls_opt-updmode = lv_bdc_upd.
ls_opt-cattmode = lv_bdc_cmode.
CALL TRANSACTION 'CJ32'
USING gt_bdcdata
OPTIONS FROM ls_opt
MESSAGES INTO lt_messtab.
* BDC录屏
REFRESH : gt_bdcdata.
**************设置成本控制范围 - 不能少了此项
SET PARAMETER ID 'CAC' FIELD 'IFLY'.
* 查询屏幕
PERFORM bdc_dynpro USING 'SAPMKBUD' '0200'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'PROJ-PSPID' iv_pspid
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=EINO'
CHANGING gt_bdcdata.
* 预算-全选
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=MRKA' "全选
CHANGING gt_bdcdata.
* 预算-复制视图
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=KOPS' "复制视图
CHANGING gt_bdcdata.
* 弹框-选择计划总计
PERFORM bdc_dynpro USING 'SAPLSPO5' '0130'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'SPOPLI-SELFLAG(01)' ' ' "取消默认选项
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'SPOPLI-SELFLAG(05)' 'X' "选择“计划总计”
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=OK'
CHANGING gt_bdcdata.
* 弹框-100%
PERFORM bdc_dynpro USING 'SAPLKBPP' '0706'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BPDY-COPY_REPL' 'X' "选择“百分比”
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BPDY-COPY_PERC' '100.00'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTE'
CHANGING gt_bdcdata.
* 预算-保存
PERFORM bdc_dynpro USING 'SAPLKBPP' '0320'
CHANGING gt_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE' '=POST'
CHANGING gt_bdcdata.
CLEAR : ls_opt.
ls_opt-dismode = lv_bdc_mode. "A:调试 N:不显示 E:错误时调试
ls_opt-updmode = lv_bdc_upd.
ls_opt-cattmode = lv_bdc_cmode.
* ls_opt-racommit = lv_bdc_commit.
CALL TRANSACTION 'CJ30'
USING gt_bdcdata
OPTIONS FROM ls_opt
MESSAGES INTO lt_messtab.
也可以尝试使用function来下达预算,
CALL FUNCTION 'KBPP_EXTERN_UPDATE_CO'
EXPORTING
i_budget_activity = iv_act
i_commit_all = 'Y'
IMPORTING
e_errors_found = lv_err
TABLES
it_bpak = lt_bpak
it_return = gt_bapiret2
EXCEPTIONS
no_update = 1
OTHERS = 2.