PP: 批量维护生产订单结算规则

535 阅读3分钟

相关函数

  • K_SRULE_SAVE_UTASK批量更新结算规则
  • STATUS_UPDATE批量更新状态

代码如下

*&---------------------------------------------------------------------*  
*& Report ZPPRP001  
*&---------------------------------------------------------------------*  
*& 批量维护生产订单结算规则 
*&---------------------------------------------------------------------*
REPORT zpprp001.
TABLES: cobrb, aufk, cobra, afko.  
  
DATA: BEGIN OF gt_data OCCURS 0,  
        aufnr       LIKE aufk-aufnr,  
        auart       LIKE aufk-auart,  
        objnr       LIKE aufk-objnr,  
        aufnr_cobrb LIKE cobrb-aufnr,               "内部订单  
        prctr       LIKE cobrb-prctr,               "利润中心  
        kdauf       LIKE cobrb-kdauf,               "销售订单  
        kdpos       LIKE cobrb-kdpos,               "销售订单行项目  
        kostl       LIKE cobrb-kostl,               "成本中心  
        kokrs       LIKE cobrb-kokrs,               "成本控制范围  
        bukrs       LIKE cobrb-bukrs,               "公司代码  
        werks       LIKE cobrb-werks,               "工厂  
  
        bureg       LIKE cobrb-bureg,               "分配规则组  
        lfdnr       LIKE cobrb-lfdnr,               "分配规则的顺序号码  
        perbz       LIKE cobrb-perbz,               "结算类型  
        urzuo       LIKE cobrb-urzuo,               "源分配  
        prozs       LIKE cobrb-prozs,               "结算百分比率  
        dfreg       LIKE cobrb-dfreg,               "缺省规则  
        avorg       LIKE cobrb-avorg,               "结算业务  
        konty       LIKE cobrb-konty,               "科目分配种类  
        hkont       LIKE cobrb-hkont,               "总账科目编号  
        rec_objnr1  LIKE cobrb-rec_objnr1,          "结算接收方的对象号  
        extnr       LIKE cobrb-extnr,               "分配规则号  
      END OF gt_data.  
  
DATA: gt_fcat TYPE lvc_t_fcat,  
      gs_fcat TYPE lvc_s_fcat,  
      go_alv  TYPE REF TO cl_gui_alv_grid.  
  
  
  
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.  
SELECT-OPTIONS: s_aufnr FOR aufk-aufnr,  
                s_auart FOR aufk-auart,  
                s_gltrp FOR afko-gltrp,  
                s_gstrp FOR afko-gstrp.  
  
SELECTION-SCREEN END OF BLOCK b1.  
  
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.  
PARAMETERS: p1 TYPE c RADIOBUTTON GROUP g1 USER-COMMAND g1 DEFAULT 'X',  
            p2 TYPE c RADIOBUTTON GROUP g1.  
SELECTION-SCREEN END OF BLOCK b2.  
  
  
  
START-OF-SELECTION.  
  PERFORM get_data.  
  PERFORM display_alv.  
  
  
*&---------------------------------------------------------------------*  
*& Form GET_DATA  
*&---------------------------------------------------------------------*  
*& text  
*&---------------------------------------------------------------------*  
*& -->  p1        text  
*& <--  p2        text  
*&---------------------------------------------------------------------*  
FORM get_data .  
  
  IF p1 = 'X'.  
  
    SELECT k~aufnr k~auart k~objnr k~bukrs k~werks k~kokrs k~kdauf k~kdpos  
      INTO CORRESPONDING FIELDS OF TABLE gt_data  
      FROM aufk AS k  
      INNER JOIN afko AS o ON o~aufnr = k~aufnr  
      WHERE NOT EXISTS ( SELECT * FROM cobrb WHERE objnr = k~objnr )  
        AND k~aufnr IN s_aufnr  
        AND k~auart IN s_auart  
        AND k~auart IN ('JQ04', 'JQ05', 'JQ11', 'JQ15')  
        AND o~gltrp IN s_gltrp  
        AND o~gstrp IN s_gstrp.  
  
  ELSE.  
  
    SELECT k~aufnr k~auart k~objnr  
           b~aufnr AS aufnr_cobrb b~prctr b~kdauf b~kdpos  
           b~kostl b~bukrs b~werks b~kokrs  
           b~bureg b~lfdnr b~perbz b~urzuo b~prozs  
           b~dfreg b~avorg b~konty b~hkont b~rec_objnr1  
           b~extnr  
      INTO CORRESPONDING FIELDS OF TABLE gt_data  
      FROM aufk AS k  
      INNER JOIN afko AS o ON o~aufnr = k~aufnr  
      INNER JOIN cobrb AS b ON k~objnr = b~objnr  
      WHERE k~aufnr IN s_aufnr  
        AND k~auart IN s_auart  
        AND k~auart IN ('JQ04', 'JQ05', 'JQ11', 'JQ15')  
        AND o~gltrp IN s_gltrp  
        AND o~gstrp IN s_gstrp.  
  
  ENDIF.  
  
ENDFORM.  
*&---------------------------------------------------------------------*  
*& Form DISPLAY_ALV  
*&---------------------------------------------------------------------*  
*& text  
*&---------------------------------------------------------------------*  
*& -->  p1        text  
*& <--  p2        text  
*&---------------------------------------------------------------------*  
FORM display_alv .  
  DATA: lv_layout TYPE lvc_s_layo,  
        lt_event  TYPE slis_t_event,  
        ls_event  TYPE slis_alv_event.  
  
  
*  lv_layout-cwidth_opt = 'X'.  
  lv_layout-sel_mode = 'A'.  
  
  ls_event-name = slis_ev_caller_exit_at_start.  
  ls_event-form = slis_ev_caller_exit_at_start.  
  APPEND ls_event TO lt_event.  
  
  ls_event-name = slis_ev_data_changed.  
  ls_event-form = slis_ev_data_changed.  
  APPEND ls_event TO lt_event.  
  
  IF p1 = 'X'.  
    PERFORM init_fieldcat USING 'AUFNR'          '生产订单'           ''  ''  '11' '' '' ''      'AUFK'.  
    PERFORM init_fieldcat USING 'AUART'          '订单类型'           ''  ''  '9'  '' '' ''      'AUFK'.  
    PERFORM init_fieldcat USING 'AUFNR_COBRB'    '订单号'             ''  'X' '12' '' '' 'AUFNR' 'COBL'.  
    PERFORM init_fieldcat USING 'PRCTR'          '利润中心'           ''  'X' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KOSTL'          '成本中心'           ''  'X' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KDAUF'          '销售订单'           ''  'X' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KDPOS'          '销售订单行项目'     ''  'X' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KOKRS'          '成本控制范围'       ''  'X' '11' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'BUKRS'          '公司代码'           ''  'X' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'WERKS'          '工厂'               ''  'X' '8'  '' '' ''      'COBRB'.  
  ELSE.  
    PERFORM init_fieldcat USING 'AUFNR'          '生产订单'            ''  '' '11' '' '' ''      'AUFK'.  
    PERFORM init_fieldcat USING 'AUART'          '订单类型'            ''  '' '8'  '' '' ''      'AUFK'.  
    PERFORM init_fieldcat USING 'OBJNR'          '对象号'              ''  '' '12' '' '' ''      'AUFK'.  
    PERFORM init_fieldcat USING 'BUREG'          '分配规则组'          ''  '' '9'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'LFDNR'          '分配规则的顺序号码'  ''  '' '15' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'PERBZ'          '结算类型'            ''  '' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'URZUO'          '源分配'              ''  '' '6'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'PROZS'          '结算百分比率'        ''  '' '10' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'DFREG'          '缺省规则'            ''  '' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'AVORG'          '结算业务'            ''  '' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KONTY'          '科目分配种类'        ''  '' '10' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KOKRS'          '成本控制范围'        ''  '' '11' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'WERKS'          '工厂'                ''  '' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'BUKRS'          '公司代码'            ''  '' '8'  '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'HKONT'          '总账科目编号'        ''  '' '10' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'PRCTR'          '利润中心'            ''  '' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KOSTL'          '成本中心'            ''  '' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'AUFNR_COBRB'    '订单号'              ''  '' '12' '' '' 'AUFNR' 'COBL'.  
    PERFORM init_fieldcat USING 'KDAUF'          '销售订单'            ''  '' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'KDPOS'          '销售订单行项目'      ''  '' '12' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'REC_OBJNR1'     '结算接收方的对象号'  ''  '' '15' '' '' ''      'COBRB'.  
    PERFORM init_fieldcat USING 'EXTNR'          '分配规则号'          ''  '' '9'  '' '' ''      'COBRB'.  
  
  ENDIF.  
  
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'  
    EXPORTING  
      i_callback_program       = sy-repid  
      i_callback_pf_status_set = 'FRM_STATUS'  
      i_callback_user_command  = 'FRM_USER_COMMAND'  
      is_layout_lvc            = lv_layout  
      it_fieldcat_lvc          = gt_fcat[]  
      i_save                   = 'A'  
*     IS_VARIANT               =  
      it_events                = lt_event[]  
    TABLES  
      t_outtab                 = gt_data[]  
    EXCEPTIONS  
      program_error            = 1  
      OTHERS                   = 2.  
ENDFORM.  
  
FORM caller_exit USING u_exit TYPE slis_data_caller_exit.  
  DATA: ls_f4 TYPE lvc_s_f4,  
        lt_f4 TYPE lvc_t_f4.  
  
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'  
    IMPORTING  
      e_grid = go_alv.  
  
* 设置回车事件  
  CALL METHOD go_alv->register_edit_event  
    EXPORTING  
      i_event_id = cl_gui_alv_grid=>mc_evt_enter  
    EXCEPTIONS  
      error      = 1  
      OTHERS     = 2.  
  
* 设置光标焦点移开被修改单元格后触发事件  
  CALL METHOD go_alv->register_edit_event  
    EXPORTING  
      i_event_id = cl_gui_alv_grid=>mc_evt_modified  
    EXCEPTIONS  
      error      = 1  
      OTHERS     = 2.  
  
ENDFORM.  
*&---------------------------------------------------------------------*  
*& Form INIT_FIELDCAT  
*&---------------------------------------------------------------------*  
*& text  
*&---------------------------------------------------------------------*  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&      --> P_  
*&---------------------------------------------------------------------*  
FORM init_fieldcat  USING p_fieldname  
                          p_fieldvalue  
                           p_checkbox  
                            p_edit  
                             p_len  
                              p_f4  
                               p_just  
                                p_field  
                                 p_table.  
  CLEAR gs_fcat.  
  gs_fcat-fieldname = p_fieldname.  
  gs_fcat-coltext = p_fieldvalue.  
  gs_fcat-scrtext_l = p_fieldvalue.  
  gs_fcat-scrtext_m = p_fieldvalue.  
  gs_fcat-scrtext_s = p_fieldvalue.  
  gs_fcat-checkbox = p_checkbox.  
  gs_fcat-edit = p_edit.  
  gs_fcat-outputlen = p_len.  
  gs_fcat-f4availabl = p_f4.  
  gs_fcat-just = p_just.  
  gs_fcat-ref_field = p_field.  
  gs_fcat-ref_table = p_table.  
  
  APPEND gs_fcat TO gt_fcat.  
ENDFORM.  
*&---------------------------------------------------------------------*  
*&      FORM  FRM_STATUS  
*&---------------------------------------------------------------------*  
*       TEXT  
*----------------------------------------------------------------------*  
*      -->RT_EXTAB   TEXT  
*----------------------------------------------------------------------*  
FORM frm_status USING rt_extab TYPE slis_t_extab.  
  DATA: lt_fcode TYPE TABLE OF sy-ucomm.  
  
  IF p2 = 'X'.  
    APPEND 'SAVE' TO lt_fcode.  
  ENDIF.  
  
  SET PF-STATUS 'STANDARD' EXCLUDING lt_fcode.  
  
ENDFORM. "FRM_STATUS1  
*&---------------------------------------------------------------------*  
*&      Form  FRM_USER_COMMAND  
*&---------------------------------------------------------------------*  
*       text  
*----------------------------------------------------------------------*  
*      -->R_UCOMM      text  
*      -->RS_SELFIELD  text  
*----------------------------------------------------------------------*  
FORM frm_user_command USING r_ucomm LIKE sy-ucomm  
                      rs_selfield TYPE slis_selfield.  
  DATA: lt_data LIKE TABLE OF gt_data WITH HEADER LINE.  
  DATA: lt_cobrb_insert LIKE TABLE OF cobrb WITH HEADER LINE.  
  DATA: lv_urzuo LIKE cobrb-lfdnr.  
  DATA: lv_index LIKE sy-index.  
  DATA: lt_jest_ins LIKE TABLE OF jest_upd WITH HEADER LINE,  
        lt_jest_upd LIKE TABLE OF jest_upd WITH HEADER LINE,  
        lt_jsto_ins LIKE TABLE OF jsto WITH HEADER LINE,  
        lt_jsto_upd LIKE TABLE OF jsto_upd WITH HEADER LINE,  
        lt_obj_del  LIKE TABLE OF onr00 WITH HEADER LINE.  
  DATA: l_name  TYPE seqg3-gname VALUE 'AUFK',  
        l_tabix TYPE sy-tabix,  
        l_subrc TYPE sy-subrc.  
  DATA: lt_enq LIKE TABLE OF seqg3,  
        ls_enq LIKE seqg3.  
  DATA: l_message TYPE string.  
  
  CHECK p1 = 'X'.  
  go_alv->check_changed_data( ).  
  CASE r_ucomm.  
    WHEN 'SAVE'.  
      go_alv->get_filtered_entries( IMPORTING et_filtered_entries = DATA(lt_filter) ).  
      LOOP AT gt_data.  
        READ TABLE lt_filter WITH KEY table_line = sy-tabix TRANSPORTING NO FIELDS.  
        IF sy-subrc <> 0.  
          APPEND gt_data TO lt_data.  
        ENDIF.  
      ENDLOOP.  
  
      CHECK lt_data[] IS NOT INITIAL.  
  
      """检查  
      LOOP AT lt_data.  
        IF lt_data-aufnr_cobrb IS INITIAL.  
          MESSAGE '订单号不能为空!' TYPE 'S' DISPLAY LIKE 'E'.  
          RETURN.  
        ENDIF.  
      ENDLOOP.  
  
      """获取SM12加锁信息  
      CALL FUNCTION 'ENQUEUE_READ'  
        EXPORTING  
          gname                 = l_name  
        IMPORTING  
          number                = l_tabix  
          subrc                 = l_subrc  
        TABLES  
          enq                   = lt_enq  
        EXCEPTIONS  
          communication_failure = 1  
          system_failure        = 2  
          OTHERS                = 3.  
      SORT lt_enq BY garg.  
  
      """加锁  
      LOOP AT lt_data.  
        DATA(l_garg) = sy-mandt && lt_data-aufnr.  
        READ TABLE lt_enq INTO ls_enq WITH KEY garg = l_garg BINARY SEARCH.  
        IF sy-subrc = 0.  
          DATA(lv_check_lock) = 'X'.  
          l_message = l_message && '生产订单' && lt_data-aufnr && '被用户' && ls_enq-guname && '锁定了 |'.  
        ELSE.  
          CALL FUNCTION 'ENQUEUE_ESORDER'  
            EXPORTING  
              aufnr          = lt_data-aufnr  
            EXCEPTIONS  
              foreign_lock   = 1  
              system_failure = 2  
              OTHERS         = 3.  
          IF sy-subrc <> 0.  
            lv_check_lock = 'X'.  
            l_message = l_message && '生产订单' && lt_data-aufnr && '被其它用户锁定了 |'.  
          ENDIF.  
        ENDIF.  
      ENDLOOP.  
  
      IF lv_check_lock = 'X'.  
        MESSAGE l_message TYPE 'I'.  
        """解锁  
        CALL FUNCTION 'DEQUEUE_ALL'.  
        RETURN.  
      ENDIF.  
  
      LOOP AT lt_data.  
  
        DO 8 TIMES.  
          lv_index = sy-index.  
  
          lt_cobrb_insert-lfdnr = lv_index.                     "分配规则的顺序号码  
          lt_cobrb_insert-extnr = lv_index.                     "分配规则号  
          lv_urzuo = lv_index * '10'.  
          lt_cobrb_insert-urzuo = lv_urzuo.                     "源分配  
          lt_cobrb_insert-perbz = 'GES'.                        "结算类型  
          lt_cobrb_insert-prozs = 100.                          "结算百分比率  
          lt_cobrb_insert-konty = 'SK'.                         "科目分配种类  
          lt_cobrb_insert-kokrs = lt_data-kokrs.                "成本控制范  
          lt_cobrb_insert-bukrs = lt_data-bukrs.                "公司代码  
          lt_cobrb_insert-kostl = lt_data-kostl.                "成本中心  
  
          lt_cobrb_insert-hkont =  '660402020' && lv_index.     "总账科目编号  
          lt_cobrb_insert-rec_objnr1 = lt_cobrb_insert-konty && lt_cobrb_insert-bukrs && lt_cobrb_insert-hkont.  
  
          lt_cobrb_insert-objnr = lt_data-objnr.                "对象号  
          lt_cobrb_insert-prctr = lt_data-prctr.                "利润中心  
          lt_cobrb_insert-aufnr = lt_data-aufnr_cobrb.          "内部订单  
  
          IF lt_data-kdauf IS NOT INITIAL.    " AND lv_index = 1.  
            lt_cobrb_insert-dfreg = 'PP2'.                      "缺省规则  
            lt_cobrb_insert-werks = lt_data-werks.              "工厂  
            lt_cobrb_insert-kdauf = lt_data-kdauf.              "销售订单  
            lt_cobrb_insert-kdpos = lt_data-kdpos.              "销售订单行项目  
          ELSE.  
            lt_cobrb_insert-avorg = 'KOAO'.                     "结算业务  
          ENDIF.  
  
          APPEND lt_cobrb_insert. CLEAR lt_cobrb_insert.  
        ENDDO.  
  
        CALL FUNCTION 'K_SRULE_SAVE_UTASK'  
          TABLES  
*           T_COBRA_INSERT    =  
*           T_COBRA_UPDATE    =  
*           T_COBRA_DELETE    =  
            t_cobrb_insert    = lt_cobrb_insert[]  
*           T_COBRB_UPDATE    =  
*           T_COBRB_DELETE    =  
          EXCEPTIONS  
            srule_utask_error = 1  
            OTHERS            = 2.  
        IF sy-subrc = 0.  
          """改变订单状态为 SETC 结算规则维护  
          SELECT SINGLE MAX( chgnr ) INTO @DATA(lv_chgnr) FROM jcds WHERE objnr = @lt_data-objnr AND stat = 'I0028'.  
          IF lv_chgnr IS INITIAL.  
            lt_jest_ins-mandt = sy-mandt.  
            lt_jest_ins-objnr = lt_data-objnr.  
            lt_jest_ins-stat = 'I0028'.  
            lt_jest_ins-inact = space.  
            lt_jest_ins-chgnr = '001'.  
            lt_jest_ins-chgkz = 'X'.  
            APPEND lt_jest_ins. CLEAR lt_jest_ins.  
          ELSE.  
            lt_jest_upd-mandt = sy-mandt.  
            lt_jest_upd-objnr = lt_data-objnr.  
            lt_jest_upd-stat = 'I0028'.  
            lt_jest_upd-inact = space.  
            lt_jest_upd-chgnr = lv_chgnr + 1.  
            lt_jest_upd-chgkz = 'X'.  
            APPEND lt_jest_upd. CLEAR lt_jest_upd.  
          ENDIF.  
        ENDIF.  
  
        CLEAR: lt_cobrb_insert, lt_cobrb_insert[], lv_chgnr.  
      ENDLOOP.  
  
      IF lt_jest_ins[] IS NOT INITIAL OR lt_jest_upd[] IS NOT INITIAL.  
        CALL FUNCTION 'STATUS_UPDATE'  
          TABLES  
            jest_ins = lt_jest_ins[]  
            jest_upd = lt_jest_upd[]  
            jsto_ins = lt_jsto_ins[]  
            jsto_upd = lt_jsto_upd[]  
            obj_del  = lt_obj_del[].  
      ENDIF.  
  
      """解锁  
      CALL FUNCTION 'DEQUEUE_ALL'.  
      PERFORM get_data.  
    WHEN OTHERS.  
  ENDCASE.  
  
  PERFORM refresh_alv USING 'X' 'X'.  
ENDFORM. "FRM_UCOMM1  
*&---------------------------------------------------------------------*  
*& Form REFRESH_ALV  
*&---------------------------------------------------------------------*  
*& text  
*&---------------------------------------------------------------------*  
*&      --> P_  
*&      --> P_  
*&---------------------------------------------------------------------*  
FORM refresh_alv  USING row col.  
  DATA ls_stbl TYPE lvc_s_stbl.  
  ls_stbl-row = row.  
  ls_stbl-col = col.  
  go_alv->refresh_table_display( EXPORTING is_stable = ls_stbl ).  
ENDFORM.  
  
*---------------------------------------------------------------------*  
*&      Form  DATA_CHANGED  
*---------------------------------------------------------------------*  
*       数据改变检查  
*---------------------------------------------------------------------*  
FORM data_changed USING or_data_changed TYPE REF TO cl_alv_changed_data_protocol.  
  LOOP AT or_data_changed->mt_mod_cells INTO DATA(ls_mod_cell).  
    READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<fs_line>) INDEX ls_mod_cell-row_id.  
    CHECK sy-subrc = 0.  
    ASSIGN COMPONENT ls_mod_cell-fieldname OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<fs_value>).  
    CHECK sy-subrc = 0.  
    CALL METHOD or_data_changed->get_cell_value  
      EXPORTING  
        i_row_id    = ls_mod_cell-row_id  
*       I_TABIX     =  
        i_fieldname = ls_mod_cell-fieldname  
      IMPORTING  
        e_value     = <fs_value>.  
  
    CASE ls_mod_cell-fieldname.  
      WHEN 'AUFNR_COBRB'.  
        SELECT SINGLE prctr cycle INTO ( <fs_line>-prctr, <fs_line>-kostl ) FROM aufk WHERE aufnr = <fs_value>.  
  
      WHEN OTHERS.  
    ENDCASE.  
  ENDLOOP.  
  PERFORM refresh_alv USING 'X' 'X'.  
ENDFORM.