问题灵感来源于ABAP贴吧,闲逛的时候,看到问题:动态内表要设置字段可编辑,颜色等
对于是否可编辑好说,只需要LOOP循环FIELDCAT,然后使用指针设置即可,如下:
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<FS_FIELDCAT>).
CASE <FS_FIELDCAT>-fieldname.
WHEN 'WERKS'.
<FS_FIELDCAT>-edit = 'X'.
ENDCASE.
ENDLOOP.
本篇重点在于如何设置单元格颜色。
先说方法: 去SE11 定义一张属性表,再通过fieldcat生成内表,后续数据操作,均使用生成的内表,包括颜色。最后输出这个张生成的内表。
由于FIELDCAT中没办法定义一个表结构,所以,直接定义一张自建表,用来给fieldcat参考就行
init_fill_fcat 'CELLCOLOR' 'XXX' 'ZCOLOR' 'CELLCOLOR' '' '' '' '' ''.
剩下的就是数据操作,赋值了。没有什么特殊的,代码段如下。在最后有完整的代码。
"通过fielcat生成内表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = dy_table.
" 用表类型指针 <dyn_table> 指向 数据对象的内容.
ASSIGN dy_table->* TO <dyn_alv>.
"建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
CREATE DATA gs_line LIKE LINE OF <dyn_alv>.
" 用<dyn_wa>指针指向该结构
ASSIGN gs_line->* TO <dyn_wa>.
MOVE-CORRESPONDING gt_data TO gt_alv.
"在FIELDCAT中
LOOP AT gt_alv INTO gs_alv.
MOVE-CORRESPONDING gs_alv TO <dyn_wa>.
ASSIGN COMPONENT 'CELLCOLOR' OF STRUCTURE <dyn_wa> TO <dyn_color>.
ls_lvc-fname = 'MATNR'.
ls_lvc-color-int = '1'.
ls_lvc-color-inv = '0'.
ls_lvc-color-col = '6'. "红色
APPEND ls_lvc TO <dyn_color>. "单元格颜色
APPEND <dyn_wa> TO <dyn_alv>.
CLEAR:<dyn_wa>,lv_flag,gs_alv.
ENDLOOP.
"定义字段可编辑
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<FS_FIELDCAT>).
CASE <FS_FIELDCAT>-fieldname.
WHEN 'WERKS'.
<FS_FIELDCAT>-edit = 'X'.
ENDCASE.
ENDLOOP.
"删掉CELLCOLOR的显示
DELETE gt_fieldcat WHERE fieldname = 'CELLCOLOR'.
"针对动态内表排序
CLEAR:lt_sort.
lt_sort = VALUE #(
( name = 'MATNR' descending = '' astext = '' )
).
SORT <dyn_alv> BY (lt_sort).
完整代码如下:
*&---------------------------------------------------------------------*
*& Report ZMM021
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest12.
TABLES:mara,mard,ausp,makt,resb.
DATA:BEGIN OF gs_data,
matnr TYPE matnr,
END OF gs_data.
DATA:gt_data LIKE TABLE OF gs_data.
DATA:gt_alv LIKE TABLE OF gs_data.
DATA:gs_alv LIKE gs_data.
*----------------------------------------------------------------------*
*ALV参数声明
*----------------------------------------------------------------------*
DATA: gt_fieldcat TYPE lvc_t_fcat, "字段目录内表
gs_fieldcat TYPE lvc_s_fcat, "字段目录工作区
gs_layout TYPE lvc_s_layo, "用于定义ALV表单的相关格式、属性
gs_glay TYPE lvc_s_glay. "编辑更新
DATA:dy_table TYPE REF TO data,
gs_line TYPE REF TO data.
FIELD-SYMBOLS:<dyn_alv> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>,
<dyn_color> TYPE STANDARD TABLE.
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME .
PARAMETERS:p_werks AS CHECKBOX USER-COMMAND us1,
p_maktx AS CHECKBOX,
p_year TYPE char3.
SELECTION-SCREEN END OF BLOCK blk01.
INITIALIZATION.
START-OF-SELECTION.
PERFORM frm_authority_check.
PERFORM frm_data_get.
"设置字段属性
PERFORM frm_set_fieldcat.
"设置输出格式
PERFORM frm_set_layout.
"创建动态内表
PERFORM frm_create_table.
"显示ALV
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_data_get
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_data_get .
SELECT
matnr
FROM mara
INTO CORRESPONDING FIELDS OF TABLE gt_data
UP TO 2 ROWS.
IF gt_data IS INITIAL.
gt_data = VALUE #( ( matnr = '111' )
( matnr = '222' ) ).
ENDIF.
ENDFORM.
FORM frm_pf_status USING pa_extab TYPE slis_t_extab .
SET PF-STATUS 'ZTEST12'.
ENDFORM .
FORM frm_user_command USING r_ucomm TYPE sy-ucomm
r_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN ''.
WHEN OTHERS.
ENDCASE.
r_selfield-col_stable = 'X'.
r_selfield-row_stable = 'X'.
r_selfield-refresh = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_authority_check
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_authority_check .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
DATA:lv_fieldname TYPE char30.
DATA:lv_year TYPE char4.
REFRESH gt_fieldcat.
DEFINE init_fill_fcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
gs_fieldcat-scrtext_l = &2.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-scrtext_s = &2.
gs_fieldcat-reptext = &2.
gs_fieldcat-ref_table = &3.
gs_fieldcat-ref_field = &4.
gs_fieldcat-f4availabl = &5.
gs_fieldcat-icon = &6.
gs_fieldcat-edit = &7.
gs_fieldcat-no_zero = &8.
gs_fieldcat-inttype = &9.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
init_fill_fcat 'MATNR' '物料' 'MARA' 'MATNR' '' '' '' '' ''.
init_fill_fcat 'CELLCOLOR' '物料' 'ZCOLOR' 'CELLCOLOR' '' '' '' '' ''.
IF p_maktx = 'X'.
init_fill_fcat 'MAKTX' '描述' '' '' '' '' '' '' ''.
ENDIF.
IF p_werks = 'X'.
init_fill_fcat 'WERKS' '工厂' '' '' '' '' '' '' ''.
ENDIF.
DO p_year TIMES.
lv_year = sy-datum+0(4) + sy-index.
lv_fieldname = 'Y' && lv_year.
init_fill_fcat lv_fieldname lv_year '' '' '' '' '' '' ''.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
CLEAR:gs_glay,gs_layout.
gs_layout-cwidth_opt = 'A'. "优化列宽设置
gs_layout-zebra = 'X'. "设置斑马线
gs_glay-edt_cll_cb = 'X'. " 打上自动更新并刷新标记
gs_layout-ctab_fname = 'CELLCOLOR'."单元格颜色
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_create_table .
DATA:lt_sort TYPE abap_sortorder_tab, "用于内表排序
ls_sort TYPE abap_sortorder.
DATA:lv_count TYPE i,
lv_fieldname TYPE char30,
lv_atinn TYPE char30,
lv_coltext TYPE char40,
lv_flag TYPE c.
DATA: dref_str TYPE REF TO data,
dref_tab TYPE REF TO data,
dref_i TYPE REF TO data,
itab_type TYPE REF TO cl_abap_tabledescr,
struct_type TYPE REF TO cl_abap_structdescr,
elem_type TYPE REF TO cl_abap_elemdescr,
table_type TYPE REF TO cl_abap_tabledescr,
comp_tab TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.
DATA:ls_lvc TYPE lvc_s_scol. " 单元格颜色控制
"通过fielcat生成内表
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = dy_table.
" 用表类型指针 <dyn_table> 指向 数据对象的内容.
ASSIGN dy_table->* TO <dyn_alv>.
"建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
CREATE DATA gs_line LIKE LINE OF <dyn_alv>.
" 用<dyn_wa>指针指向该结构
ASSIGN gs_line->* TO <dyn_wa>.
MOVE-CORRESPONDING gt_data TO gt_alv.
"给内表添加字段
LOOP AT gt_alv INTO gs_alv.
MOVE-CORRESPONDING gs_alv TO <dyn_wa>.
ASSIGN COMPONENT 'CELLCOLOR' OF STRUCTURE <dyn_wa> TO <dyn_color>.
ls_lvc-fname = 'MATNR'.
ls_lvc-color-int = '1'.
ls_lvc-color-inv = '0'.
ls_lvc-color-col = '6'. "红色
APPEND ls_lvc TO <dyn_color>. "单元格颜色
APPEND <dyn_wa> TO <dyn_alv>.
CLEAR:<dyn_wa>,lv_flag,gs_alv.
ENDLOOP.
LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<FS_FIELDCAT>).
CASE <FS_FIELDCAT>-fieldname.
WHEN 'WERKS'.
<FS_FIELDCAT>-edit = 'X'.
ENDCASE.
ENDLOOP.
DELETE gt_fieldcat WHERE fieldname = 'CELLCOLOR'.
"针对动态内表排序
CLEAR:lt_sort.
lt_sort = VALUE #(
( name = 'MATNR' descending = '' astext = '' )
).
SORT <dyn_alv> BY (lt_sort).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
i_callback_pf_status_set = 'FRM_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = <dyn_alv>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.