相关函数
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.