ABAP alv数据修改+单元格变色
*---------------------------------------------------------------------* * 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