*---------------------------------------------------------------------*
* Program : ZEXT_ISSUE_DOCUMENT_FIX *
* Title : 问题单据处理 *
* Type : Manually *
* Created by: xx *
* Created on: yyyy/MM/dd *
* Change/Transport Number: *
* Description : 问题单据处理 *
*---------------------------------------------------------------------*
* MODIFICATION LOG: *
* VER DD/MM/YY Author DESCRIPTION CHANGE REQUEST *
* --- -------- ------------- ---------------------- ---------------*
* 000 00/00/00 wh Initial release *
*---------------------------------------------------------------------*
REPORT ZEXT_ISSUE_DOCUMENT_FIX.
INCLUDE: zext_issue_document_fix_top, "Defination
zext_issue_document_fix_sel, "Selection screen
zext_issue_document_fix_f01. "Subroutines
*---------------------------------------------------------------------*
* INITIALIZATION *
*---------------------------------------------------------------------*
INITIALIZATION.
*---------------------------------------------------------------------*
* START-OF-SELECTION *
*---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM f_fetch_data. "获取数据
PERFORM f_set_parame. "ALV字段
PERFORM f_alv_display. "ALV输出
*---------------------------------------------------------------------*
* END-OF-SELECTION *
*---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM f_free_memory.
*&---------------------------------------------------------------------*
*& 包括 ZEXT_ISSUE_DOCUMENT_FIX_TOP
*&---------------------------------------------------------------------*
TABLES: crmd_orderadm_h,
crmd_orderadm_i,
crmd_link,
crmd_partner,
bbp_pdorg,
bbp_pdtax,
zext_benefits.
CONSTANTS: gc_e TYPE c LENGTH 1 VALUE 'E'.
TYPES: BEGIN OF tys_out,
channel_id TYPE zext_order_h-channel_id,
object_id TYPE crmd_orderadm_h-object_id,
ext_id TYPE zext_sc_h-ext_id,
number_int TYPE crmd_orderadm_i-number_int,
guid_set TYPE crmd_link-guid_set,
ext_tax_rate TYPE zext_sc_i-ext_tax_rate,
partner TYPE crmd_partner-guid,
disabled TYPE crmd_partner-disabled,
pdorg TYPE bbp_pdorg-guid,
proc_org_resp TYPE bbp_pdorg-proc_org_resp,
proc_org TYPE bbp_pdorg-proc_org,
proc_group TYPE bbp_pdorg-proc_group,
tax TYPE bbp_pdtax-guid,
tax_code TYPE bbp_pdtax-tax_code,
bbpsguid TYPE bbp_pdacc-set_guid,
g_l_acct TYPE bbp_pdacc-g_l_acct,
guid_hi TYPE crmd_link-guid_hi,
cellcolor TYPE lvc_t_scol,"单元格颜色字段
END OF tys_out.
DATA: gt_out TYPE TABLE OF tys_out,
gs_out TYPE tys_out.
DATA: gt_fieldcat TYPE lvc_t_fcat.
DATA: gr_grid TYPE REF TO cl_gui_alv_grid.
DATA: gv_ret TYPE char1 VALUE 'X'.
DATA: gs_cellcolor TYPE lvc_s_scol,
gt_zext TYPE TABLE OF zext_benefits,
gs_zext TYPE zext_benefits.
*&---------------------------------------------------------------------*
*& 包括 ZEXT_ISSUE_DOCUMENT_FIX_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK zsdf1 WITH FRAME TITLE text-s01.
PARAMETERS: p_cid LIKE zext_order_h-channel_id AS LISTBOX VISIBLE LENGTH 20 DEFAULT ' '.
SELECT-OPTIONS: s_crmdid FOR crmd_orderadm_h-object_id OBLIGATORY.
SELECTION-SCREEN END OF BLOCK zsdf1.
*&---------------------------------------------------------------------*
*& 包括 ZEXT_ISSUE_DOCUMENT_FIX_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form F_FETCH_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_fetch_data .
DATA: lv_guid_h TYPE crmt_object_guid,
lv_guid_i TYPE crmt_object_guid.
SELECT crmd_orderadm_h~guid
crmd_orderadm_h~object_id
crmd_orderadm_i~guid
crmd_orderadm_i~number_int
FROM crmd_orderadm_h
INNER JOIN crmd_orderadm_i ON crmd_orderadm_i~header = crmd_orderadm_h~guid
INTO (lv_guid_h,gs_out-object_id,lv_guid_i,gs_out-number_int)
WHERE crmd_orderadm_h~object_id IN s_crmdid.
*External Order ID
CLEAR: gs_out-ext_id,
gs_out-channel_id.
SELECT SINGLE zext_sc_h~ext_id
zext_order_h~channel_id
FROM zext_sc_h
INNER JOIN zext_order_h ON zext_order_h~orderid = zext_sc_h~ext_id
INTO (gs_out-ext_id,gs_out-channel_id)
WHERE zext_sc_h~guid = lv_guid_h
AND zext_order_h~channel_id = p_cid.
*External tax
CLEAR: gs_out-ext_tax_rate.
SELECT SINGLE ext_tax_rate
FROM zext_sc_i
INTO gs_out-ext_tax_rate
WHERE zext_sc_i~guid = lv_guid_i.
*Partner
CLEAR: gs_out-partner,
gs_out-disabled.
SELECT SINGLE crmd_partner~guid
crmd_partner~disabled
FROM crmd_link
INNER JOIN crmd_partner ON crmd_partner~guid = crmd_link~guid_set
INTO (gs_out-partner,gs_out-disabled)
WHERE crmd_link~guid_hi = lv_guid_i
AND crmd_link~objtype_hi = '06'
AND crmd_link~objtype_set = '07'
AND crmd_partner~partner_fct = '00000019'.
*ORG
CLEAR: gs_out-pdorg,
gs_out-proc_org_resp,
gs_out-proc_org,
gs_out-proc_group.
SELECT SINGLE bbp_pdorg~guid
bbp_pdorg~proc_org_resp
bbp_pdorg~proc_org
bbp_pdorg~proc_group
FROM crmd_link
INNER JOIN bbp_pdorg ON bbp_pdorg~set_guid = crmd_link~guid_set
INTO (gs_out-pdorg,gs_out-proc_org_resp,gs_out-proc_org,gs_out-proc_group)
WHERE crmd_link~guid_hi = lv_guid_i
AND crmd_link~objtype_hi = '06'
AND crmd_link~objtype_set = '21'.
*Tax code
CLEAR: gs_out-tax,
gs_out-tax_code.
SELECT SINGLE bbp_pdtax~guid
bbp_pdtax~tax_code
crmd_link~guid_set
crmd_link~guid_hi
FROM crmd_link
INNER JOIN bbp_pdtax ON bbp_pdtax~set_guid = crmd_link~guid_set
INTO (gs_out-tax,gs_out-tax_code,gs_out-bbpsguid,gs_out-guid_hi)
WHERE crmd_link~guid_hi = lv_guid_i
AND crmd_link~objtype_hi = '06'
AND crmd_link~objtype_set = '34'.
*G_L_ACCT
CLEAR gs_out-g_l_acct.
SELECT SINGLE bbp_pdacc~g_l_acct
FROM crmd_link
INNER JOIN bbp_pdacc ON bbp_pdacc~set_guid = crmd_link~guid_set
INTO gs_out-g_l_acct
WHERE crmd_link~guid_hi = lv_guid_i
AND crmd_link~objtype_hi = '06'
AND crmd_link~objtype_set = '31'.
APPEND gs_out TO gt_out.
CLEAR: gs_out,
lv_guid_h,
lv_guid_i.
ENDSELECT.
IF gt_out IS NOT INITIAL.
SORT gt_out BY channel_id ASCENDING
object_id ASCENDING
number_int ASCENDING.
ELSE.
MESSAGE '未查询到数据!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
SELECT *
FROM zext_benefits
INTO TABLE gt_zext.
ENDFORM. " F_FETCH_DATA
*&---------------------------------------------------------------------*
*& Form F_SET_PARAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_set_parame.
CONSTANTS: lc_structrue TYPE dd02l-tabname VALUE 'ZSRM_ISSUE_DOCUMENT_01',
lc_x TYPE c LENGTH 1 VALUE 'X'.
REFRESH gt_fieldcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = lc_structrue
i_client_never_display = lc_x
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* 程序内部错误,请联系系统管理员!
EXIT.
ENDIF.
ENDFORM. " F_SET_PARAME
*&---------------------------------------------------------------------*
*& Form F_ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_alv_display.
DATA: ls_layout TYPE lvc_s_layo.
* DATA: lv_title TYPE c LENGTH 6 VALUE '问题单据处理'.
CONSTANTS: lc_x TYPE c LENGTH 1 VALUE 'X'.
DATA: ls_event TYPE slis_alv_event.
ls_layout-cwidth_opt = 'X'.
ls_layout-zebra = 'X'.
LOOP AT gt_out INTO gs_out.
READ TABLE gt_zext INTO gs_zext WITH KEY g_l_acct = gs_out-g_l_acct.
IF sy-subrc = 0 AND gs_out-channel_id = 'EXT_JD'."循环内表,如果数据读取成功并且channel_id = EXT_JD则内表该行的G_L_ACCT字段所在单元格背景变红
CLEAR gs_cellcolor.
gs_cellcolor-fname = 'G_L_ACCT'. " 需要变色的字段
gs_cellcolor-color-col = 6.
gs_cellcolor-color-int = 1.
gs_cellcolor-color-inv = 0.
APPEND gs_cellcolor TO gs_out-cellcolor.
MODIFY gt_out FROM gs_out.
ENDIF.
CLEAR: gs_out,
gs_zext.
ENDLOOP.
ls_layout-ctab_fname = 'CELLCOLOR'. "指定存储颜色的栏位名(可能是报表gt_out 的字段)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
is_layout_lvc = ls_layout
it_fieldcat_lvc = gt_fieldcat[]
i_default = lc_x
i_save = lc_x
TABLES
t_outtab = gt_out[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE text-s03 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " F_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& Form pf_status_set
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'MAIN_STATUS'.
ENDFORM. "PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->UCOMM text
* -->SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "接收屏幕ALV,放置容器
IMPORTING
e_repid = sy-cprog
e_grid = gr_grid.
CASE ucomm.
WHEN '&CHANGE'.
PERFORM f_reset USING selfield.
WHEN '&DATA_SAVE'.
PERFORM f_save_data.
* gv_initial = 'S'.
PERFORM f_reset USING selfield.
WHEN 'STOP'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*& Form FRESET
*&---------------------------------------------------------------------*
* Reset layout
*----------------------------------------------------------------------*
FORM f_reset USING is_selfield TYPE slis_selfield.
is_selfield-col_stable = abap_on. "防止列跑位
is_selfield-row_stable = abap_on. "防止行跑位
is_selfield-refresh = abap_on.
PERFORM frm_when_changed. "刷新ALV网格并保持位置(单元格行列位置不变)
DATA: ls_layout TYPE lvc_s_layo.
PERFORM f_mod_fieldcat.
CALL METHOD gr_grid->set_frontend_fieldcatalog
EXPORTING
it_fieldcatalog = gt_fieldcat.
CLEAR ls_layout.
"获取ALV变化过后的布局参数
CALL METHOD gr_grid->get_frontend_layout
IMPORTING
es_layout = ls_layout.
"重新回写自适应宽度
ls_layout-cwidth_opt = 'X'.
ls_layout-zebra = 'X'.
"回写ALV变化过后的布局参数
CALL METHOD gr_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
ENDFORM. " F_RESET
*&---------------------------------------------------------------------*
*& Form frm_when_changed
*&---------------------------------------------------------------------*
* Reset frm_when_changed
*----------------------------------------------------------------------*
FORM frm_when_changed.
DATA: ls_stbl TYPE lvc_s_stbl.
ls_stbl-row = 'X'.
ls_stbl-col = 'X'.
CALL METHOD gr_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
ENDFORM. " frm_when_changed
*&---------------------------------------------------------------------*
*& Form F_MOD_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_mod_fieldcat .
DATA: ls_fieldcat TYPE lvc_s_fcat.
LOOP AT gt_fieldcat INTO ls_fieldcat.
IF ls_fieldcat-fieldname = 'DISABLED'.
ls_fieldcat-edit = abap_on.
MODIFY gt_fieldcat FROM ls_fieldcat.
ENDIF.
IF ls_fieldcat-fieldname = 'PROC_ORG_RESP'.
ls_fieldcat-edit = abap_on.
MODIFY gt_fieldcat FROM ls_fieldcat.
ENDIF.
IF ls_fieldcat-fieldname = 'PROC_ORG'.
ls_fieldcat-edit = abap_on.
MODIFY gt_fieldcat FROM ls_fieldcat.
ENDIF.
IF ls_fieldcat-fieldname = 'PROC_GROUP'.
ls_fieldcat-edit = abap_on.
MODIFY gt_fieldcat FROM ls_fieldcat.
ENDIF.
IF ls_fieldcat-fieldname = 'TAX_CODE'.
ls_fieldcat-edit = abap_on.
MODIFY gt_fieldcat FROM ls_fieldcat.
ENDIF.
CLEAR ls_fieldcat.
ENDLOOP.
ENDFORM. " F_MOD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form F_SAVE_DATA
*&---------------------------------------------------------------------*
* Save data
*----------------------------------------------------------------------*
FORM f_save_data.
DATA: lv_err_text TYPE c LENGTH 1000,
lcx_error TYPE REF TO cx_root.
CALL METHOD gr_grid->check_changed_data
IMPORTING
e_valid = gv_ret.
TRY.
LOOP AT gt_out INTO gs_out.
UPDATE crmd_partner SET disabled = gs_out-disabled
WHERE guid = gs_out-partner
AND partner_fct = '00000019'.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
UPDATE bbp_pdorg SET proc_org_resp = gs_out-proc_org_resp
proc_org = gs_out-proc_org
proc_group = gs_out-proc_group
WHERE guid = gs_out-pdorg.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
UPDATE bbp_pdtax SET tax_code = gs_out-tax_code
WHERE set_guid = gs_out-bbpsguid.
IF sy-subrc = 0.
UPDATE bbp_pdigp SET tax_code = gs_out-tax_code
WHERE guid = gs_out-guid_hi.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ELSE.
ROLLBACK WORK.
ENDIF.
CLEAR gs_out.
ENDLOOP.
* modify znmsmm_t20 from table lt_t20[].
CATCH cx_sy_open_sql_db INTO lcx_error.
lv_err_text = lcx_error->get_text( ). "得到错误信息
sy-subrc = 4. "改变系统变量
ENDTRY.
IF sy-subrc = 0.
COMMIT WORK.
MESSAGE '修改成功!' TYPE 'S'.
* 保存成功!
ELSE.
ROLLBACK WORK.
MESSAGE lv_err_text TYPE gc_e.
ENDIF.
ENDFORM. "f_save_data
*&---------------------------------------------------------------------*
*& Form F_FREE_MEMORY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM f_free_memory .
FREE: gt_out.
ENDFORM. " F_FREE_MEMORY