PS 模块BAPI新建修改项目、WBS、网络、作业 (一)

6 篇文章 2 订阅

新公司有上线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.

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值