ABAP之生产订单CO01/CO02/CO03/CO10等增强点

445 阅读4分钟

最近公司新增了PS模块用于技术部门研发使用。

涉及到后续业务部门一系列的操作,文章就是说一下关于PS模块下生产订单做的增强操作。

因为不是标准的业务流程,新产品研发可能需要多次试验以及物料不确定的情况,研发的生产订单需要研发人员自己下达。为了防止研发人员操作的时候没有维护"结算规则",会导致后续财务结算问题,可以做一下增强校验。

增强校验判断研发工单是否有对应的"结算规则" 。

1. 选择无销售订单的生产订单CO01或者无物料的CO07,如下图所示:

image.png 填写相关信息后回车该生产订单直接下达,接着点击保存按钮。 image.png 没有去维护"结算规则",则报如下错误。 image.png

接着去到"抬头"-->"结算规则",进行结算规则的维护。 image.png 物料的自动带出,我们需要填写WBS元素方便后续去归结费用。 接着返回之后保存就完成啦。 image.png 那么我们需要做的增强点校验如下: 前往T-CODE:SMOD--PPCO0007(保存前触发的增强)我多方认证以及debug的出来的结果有误请纠正谢谢!

点击"显示":

image.png 点击"组件" image.png 这就是出口,也就是我们需要找到的增强点。 image.png image.png 校验判断的逻辑如下:

TYPES: BEGIN OF ty_cobra_buf.  
           INCLUDE STRUCTURE cobra.  
           TYPES:   uflag LIKE dkobr-upd_flag,  
         END OF ty_cobra_buf.  
  TYPES: ty_t_cobra_buf TYPE ty_cobra_buf OCCURS 10.  
  TYPES: BEGIN OF ty_cobrb_buf.  
           INCLUDE STRUCTURE cobrb.  
           TYPES:   uflag LIKE dkobr-upd_flag,  
         END OF ty_cobrb_buf.  
  TYPES: ty_t_cobrb_buf TYPE ty_cobrb_buf OCCURS 10.  
  DATA: gt_cobra_buf TYPE ty_t_cobra_buf.  
  DATA: gt_cobrb_buf TYPE ty_t_cobrb_buf.  
  DATA:  
    lv_found    TYPE abap_bool,  
    l_mem_cobra LIKE gt_cobra_buf[],  
    l_mem_cobrb LIKE gt_cobrb_buf[].  
  " 判断是否是研发工单类型 
  IF  header_imp-auart = 'S06' OR header_imp-auart = 'S07' .  
    CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'  
      EXPORTING  
        i_mode     = 'EX'  
      EXCEPTIONS  
        wrong_mode = 1  
        OTHERS     = 2.  
    IF sy-subrc = 0.  
      l_mem_cobra[] = gt_cobra_buf[].  
      l_mem_cobrb[] = gt_cobrb_buf[].  
      IMPORT l_mem_cobra l_mem_cobrb FROM MEMORY ID 'K_SRULE'.  
      LOOP AT l_mem_cobrb INTO DATA(ls_cobrb). 
      " 判断有无WBS元素
        IF ls_cobrb-konty = 'PR' AND ls_cobrb-prozs <> 0.  
          lv_found = abap_true.  
          EXIT.  
        ENDIF.  
      ENDLOOP.  
    ENDIF.  
    IF lv_found <> abap_true..  
      MESSAGE e001(00) WITH '研发工单结算规则有误,请修改!'.  
    ENDIF.  
  ENDIF.

保存激活后。 前往TODE:CMOD,创建新项目并填写相关信息后,进行增强分配。 image.png 保存并激活即可处于活动状态。 image.png

研发工单自动填入对应的"结算规则" 。

2. 选择需要输入WBS以及物料的生产订单CO10,如下图所示:

image.png

填写好相关信息后,分配这里会自动来出创建的时候输入的WBS元素。 image.png这时候点击保存按钮image.png,保存前触发增强会自动将在创建的时候的WBS元素填充到"结算规则"中,这样可以降低使用复杂度。

增强还是上面的PPCO0007具体的代码逻辑如下:

TYPES: BEGIN OF ty_cobra_buf.  
           INCLUDE STRUCTURE cobra.  
           TYPES:   uflag LIKE dkobr-upd_flag,  
         END OF ty_cobra_buf.  
  TYPES: ty_t_cobra_buf TYPE ty_cobra_buf OCCURS 10.  
  TYPES: BEGIN OF ty_cobrb_buf.  
           INCLUDE STRUCTURE cobrb.  
           TYPES:   uflag LIKE dkobr-upd_flag,  
         END OF ty_cobrb_buf.  
  TYPES: ty_t_cobrb_buf TYPE ty_cobrb_buf OCCURS 10.  
  DATA: gt_cobra_buf TYPE ty_t_cobra_buf.  
  DATA: gt_cobrb_buf TYPE ty_t_cobrb_buf.  
  DATA:  
    lv_found    TYPE abap_bool,  
    l_mem_cobra LIKE gt_cobra_buf[],  
    l_mem_cobrb LIKE gt_cobrb_buf[].    
  IF header_imp-auart = 'S06' OR header_imp-auart = 'S07' .."增加WBS结算规则  
    DATA:it_objnr TYPE STANDARD TABLE OF ionrb WITH HEADER LINE.  
    it_objnr-objnr = header_imp-objnr.  
    APPEND it_objnr.  
  
    LOOP AT l_mem_cobrb ASSIGNING FIELD-SYMBOL(<l_mem_cobrb>) WHERE konty = 'MA'.  
      <l_mem_cobrb>-prozs = 0.  
    ENDLOOP.  
    DATA:ls_ty_cobrb_buf TYPE ty_cobrb_buf.  
    CLEAR:ls_ty_cobrb_buf.  
    ls_ty_cobrb_buf-objnr = it_objnr-objnr.  
    ls_ty_cobrb_buf-lfdnr = '2'.  
    ls_ty_cobrb_buf-extnr = '2'.  
    ls_ty_cobrb_buf-perbz = 'PER'.  
    ls_ty_cobrb_buf-prozs = 100.  
*    ls_ty_cobrb_buf-avorg = 'KOAO'.  
    ls_ty_cobrb_buf-konty = 'PR'.  
    ls_ty_cobrb_buf-ps_psp_pnr = header_imp-projn.  
    ls_ty_cobrb_buf-rec_objnr1 = ls_ty_cobrb_buf-konty && ls_ty_cobrb_buf-ps_psp_pnr.  
    ls_ty_cobrb_buf-uflag = 'I'.  
    APPEND ls_ty_cobrb_buf TO l_mem_cobrb.  
  
    EXPORT l_mem_cobra[] l_mem_cobrb[] TO MEMORY ID 'K_SRULE'.  
  
    CALL FUNCTION 'K_SETTLEMENT_RULE_REFRESH'  
     EXPORTING  
*       ALL_REFRESH       = ' '  
       objnr             = it_objnr-objnr.  
  
    CALL FUNCTION 'K_SRULE_EXPORT_IMPORT'  
     EXPORTING  
       i_mode           = 'IM'  
     EXCEPTIONS  
       wrong_mode       = 1  
       OTHERS           = 2  
              .  
    IF sy-subrc <> 0.  
* Implement suitable error handling here  
    ENDIF.  
  
  ENDIF.

各位大神有问题请指正,谢谢!