为字段值 > n 的 ALV 行着色
Coloring ALV row where field value > n
如何显示 ls_out
的总和为 1900 的行?我怎样才能改进下面的代码?
TABLES: mara, marc.
"marc is N 181
"mara is 1 157
DATA: lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_marc TYPE TABLE OF marc,
ls_marc TYPE marc,
BEGIN OF ls_out OCCURS 0,
mtart LIKE mara-mtart,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
ntgew LIKE mara-ntgew,
brgew LIKE mara-brgew,
sum LIKE mara-brgew,
color(4).
DATA: END OF ls_out.
DATA: lt_out LIKE TABLE OF ls_out,
fcat TYPE slis_t_fieldcat_alv,
ls_fcat LIKE LINE OF fcat,
layout TYPE slis_layout_alv.
FIELD-SYMBOLS: <fsym> LIKE LINE OF fcat.
PARAMETERS: p_mtart TYPE mara-mtart. "FERT
SELECT-OPTIONS: so_werks FOR marc-werks. " 1000 to 1998
SELECT * FROM mara INTO TABLE lt_mara
WHERE mtart = p_mtart.
IF sy-subrc = 0.
SELECT * FROM marc INTO TABLE lt_marc
FOR ALL ENTRIES IN lt_mara
WHERE matnr = lt_mara-matnr
AND werks IN so_werks.
LOOP AT lt_marc INTO ls_marc.
READ TABLE lt_mara INTO ls_mara
WITH KEY matnr = ls_marc-matnr.
ls_out-sum = ls_mara-brgew + ls_mara-ntgew .
MOVE-CORRESPONDING ls_marc TO ls_out.
MOVE-CORRESPONDING ls_mara TO ls_out.
APPEND ls_out TO lt_out.
CLEAR ls_out.
ENDLOOP.
ELSE.
MESSAGE TEXT-e02 TYPE 'E' .
ENDIF.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid "e merr auto
i_internal_tabname = 'LS_OUT'
i_client_never_display = 'X'
i_inclname = sy-repid
CHANGING
ct_fieldcat = fcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
READ TABLE fcat INDEX 6 ASSIGNING <fsym>.
<fsym>-outputlen = 15.
*-conditionally populate the color
LOOP AT LS_OUT.
IF LS_OUT-sum eq 21.
LS_OUT-color = 'C311'.
ENDIF.
MODIFY LS_OUT.
ENDLOOP.
layout-info_fieldname = 'COLOR'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_structure_name = 'LS_OUT'
it_fieldcat = fcat[]
TABLES
t_outtab = lt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
将以下参数添加到您对 REUSE_ALV_GRID_DISPLAY
的调用中应该可以解决您的问题
is_layout = layout
LOOP AT Lt_OUT.
IF lt_out-sum >= 50000.
lt_out-color = 'C311'.
ENDIF.
MODIFY Lt_OUT.
ENDLOOP.
layout-info_fieldname = 'COLOR".
如果您想处理 ALV 中特定单元格的任何 /!\ 格式,方法如下。
FORM update_style using
x type lvc_fname " x is 'MATNR', 'VBELN', 'BELNR'.... whatever in your fieldcatalog
y type int4 " y = 1,2,3.....
update_mask type xstring
update_style type xstring.
READ table gt_alv into gs_alv index y.
tabstyle = gs_alv-tabstyle.
READ table tabstyle into s_style with key fieldname = x.
" check if fieldname already exists in gs_alv-tabstyle (insert or update)
s_style-style = s_style-style BIT-AND update_mask.
s_style-style = s_style-style BIT-OR update_style.
" Update or insert gs_alv-tabstyle from s_style
" update gt_alv from gs_alv
ENDFORM.
如何在 ALV 中为一行分配颜色
(但是你不能同时有单元格背景和字体颜色!)
perform update_style USING x y 'FFFFFFE0' update_style.
update_style can be :
'00000000'. " Disable any color
'00000011'. " White Font
'00000017'. " Red fond
'00000013'. " gray font
'00000014'. " Yellow font
'00000015'. " blue font
'00000016'. " green font
'00000018'. " orange font
'00000011'. " black font
'0000000D'. " background dark blue
'0000000A'. " background fluo blue
'00000005'. " background blue
'00000003'. " background light blue
'00000000'. " background gray
'00000001'. " background light gray
'00000004'. " backgorund yellow
'0000000C'. " background dark yellow
'00000006'. " background green
'0000000E'. " background dark green
'00000010'. " background dark orange
'0000000F'. " background red
'00000007'. " background pink
'00000008'. " background orange
'00000001'. " background standard
如果要处理可编辑、粗体、斜体、下划线...属性
perform update_style USING x y 'FFFFFF9F' '00000020'. " set bold
perform update_style USING x y 'FFFFFF9F' '00000040'. " unset bold property
perform update_style USING x y 'FFFFF9FF' '00000200'. " Underline
perform update_style USING x y 'FFFFF9FF' '00000400'. " stop underlying
perform update_style USING x y 'FFFFF57F' '00000080' " italic
perform update_style USING x y 'FF9FFFFF' '00200000' " hotspot
perform update_style USING x y 'FF9FFFFF' '00400000' " no hotspot
perform update_style USING x y 'F9E7FFFF' '00080000' " Editable
perform update_style USING x y 'F9E7FFFF' '00100000' " Non Editable
对于对齐,update_mask 是 'DFFFF57F'
update_style 可以是:
DATA alv_style_align_left_top(4) TYPE x VALUE '00000800'.
DATA alv_style_align_center_top(4) TYPE x VALUE '00001000'.
DATA alv_style_align_right_top(4) TYPE x VALUE '00001800'.
DATA alv_style_align_left_center(4) TYPE x VALUE '00002000'.
DATA alv_style_align_center_center(4) TYPE x VALUE '00002800'.
DATA alv_style_align_right_center(4) TYPE x VALUE '00003000'.
DATA alv_style_align_left_bottom(4) TYPE x VALUE '00003800'.
DATA alv_style_align_center_bottom(4) TYPE x VALUE '00004000'.
DATA alv_style_align_right_bottom(4) TYPE x VALUE '00004800'.
如果你想处理边框,你必须修改 s_style-style2 为:
'FFFBFFFF' '00040000' " Remove top border
'FFF7FFFF' '00080000' " Remove bottom border
'FFFEFFFF' '00010000' " Remove left border
'FFFDFFFF' '00020000' " Remove right border
在这一切之后(甚至在 set_table_for_first_display 之后)
您只需要调用一个名为 REFRESH 的表单或方法
因为我写了 class CL_GUI_ALV_GRID 的实现,所以我不使用 FORM,而是使用方法:
METHOD REFRESH.
DATA ls_stable TYPE lvc_s_stbl.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD me->refresh_table_display
EXPORTING
is_stable = ls_stable
EXCEPTIONS
finished = 1
OTHERS = 2.
ENDMETHOD.
x 和 y 不是必填字段,因此我可以遍历所有行以将 属性 设置为列(y 未设置)
ASSIGN mt_outtab->* TO <tab>.
CHECK <tab> IS ASSIGNED.
LOOP AT <tab> ASSIGNING <line>.
update_style( x sy-tabix update_mask update_style )
或遍历我的字段目录以将 属性 设置为一行(x 未设置)
LOOP at me->get_frontend_fieldcatalog( ) in ls_fcat
update_style( ls_fcat-fieldname y update_mask update_style )
更多可能性,请检查link
ABAP Alv_grid Merge cells and style formating of cells
如何显示 ls_out
的总和为 1900 的行?我怎样才能改进下面的代码?
TABLES: mara, marc.
"marc is N 181
"mara is 1 157
DATA: lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_marc TYPE TABLE OF marc,
ls_marc TYPE marc,
BEGIN OF ls_out OCCURS 0,
mtart LIKE mara-mtart,
matnr LIKE marc-matnr,
werks LIKE marc-werks,
ntgew LIKE mara-ntgew,
brgew LIKE mara-brgew,
sum LIKE mara-brgew,
color(4).
DATA: END OF ls_out.
DATA: lt_out LIKE TABLE OF ls_out,
fcat TYPE slis_t_fieldcat_alv,
ls_fcat LIKE LINE OF fcat,
layout TYPE slis_layout_alv.
FIELD-SYMBOLS: <fsym> LIKE LINE OF fcat.
PARAMETERS: p_mtart TYPE mara-mtart. "FERT
SELECT-OPTIONS: so_werks FOR marc-werks. " 1000 to 1998
SELECT * FROM mara INTO TABLE lt_mara
WHERE mtart = p_mtart.
IF sy-subrc = 0.
SELECT * FROM marc INTO TABLE lt_marc
FOR ALL ENTRIES IN lt_mara
WHERE matnr = lt_mara-matnr
AND werks IN so_werks.
LOOP AT lt_marc INTO ls_marc.
READ TABLE lt_mara INTO ls_mara
WITH KEY matnr = ls_marc-matnr.
ls_out-sum = ls_mara-brgew + ls_mara-ntgew .
MOVE-CORRESPONDING ls_marc TO ls_out.
MOVE-CORRESPONDING ls_mara TO ls_out.
APPEND ls_out TO lt_out.
CLEAR ls_out.
ENDLOOP.
ELSE.
MESSAGE TEXT-e02 TYPE 'E' .
ENDIF.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid "e merr auto
i_internal_tabname = 'LS_OUT'
i_client_never_display = 'X'
i_inclname = sy-repid
CHANGING
ct_fieldcat = fcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
READ TABLE fcat INDEX 6 ASSIGNING <fsym>.
<fsym>-outputlen = 15.
*-conditionally populate the color
LOOP AT LS_OUT.
IF LS_OUT-sum eq 21.
LS_OUT-color = 'C311'.
ENDIF.
MODIFY LS_OUT.
ENDLOOP.
layout-info_fieldname = 'COLOR'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_structure_name = 'LS_OUT'
it_fieldcat = fcat[]
TABLES
t_outtab = lt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
将以下参数添加到您对 REUSE_ALV_GRID_DISPLAY
的调用中应该可以解决您的问题
is_layout = layout
LOOP AT Lt_OUT.
IF lt_out-sum >= 50000.
lt_out-color = 'C311'.
ENDIF.
MODIFY Lt_OUT.
ENDLOOP.
layout-info_fieldname = 'COLOR".
如果您想处理 ALV 中特定单元格的任何 /!\ 格式,方法如下。
FORM update_style using
x type lvc_fname " x is 'MATNR', 'VBELN', 'BELNR'.... whatever in your fieldcatalog
y type int4 " y = 1,2,3.....
update_mask type xstring
update_style type xstring.
READ table gt_alv into gs_alv index y.
tabstyle = gs_alv-tabstyle.
READ table tabstyle into s_style with key fieldname = x.
" check if fieldname already exists in gs_alv-tabstyle (insert or update)
s_style-style = s_style-style BIT-AND update_mask.
s_style-style = s_style-style BIT-OR update_style.
" Update or insert gs_alv-tabstyle from s_style
" update gt_alv from gs_alv
ENDFORM.
如何在 ALV 中为一行分配颜色 (但是你不能同时有单元格背景和字体颜色!)
perform update_style USING x y 'FFFFFFE0' update_style.
update_style can be :
'00000000'. " Disable any color
'00000011'. " White Font
'00000017'. " Red fond
'00000013'. " gray font
'00000014'. " Yellow font
'00000015'. " blue font
'00000016'. " green font
'00000018'. " orange font
'00000011'. " black font
'0000000D'. " background dark blue
'0000000A'. " background fluo blue
'00000005'. " background blue
'00000003'. " background light blue
'00000000'. " background gray
'00000001'. " background light gray
'00000004'. " backgorund yellow
'0000000C'. " background dark yellow
'00000006'. " background green
'0000000E'. " background dark green
'00000010'. " background dark orange
'0000000F'. " background red
'00000007'. " background pink
'00000008'. " background orange
'00000001'. " background standard
如果要处理可编辑、粗体、斜体、下划线...属性
perform update_style USING x y 'FFFFFF9F' '00000020'. " set bold
perform update_style USING x y 'FFFFFF9F' '00000040'. " unset bold property
perform update_style USING x y 'FFFFF9FF' '00000200'. " Underline
perform update_style USING x y 'FFFFF9FF' '00000400'. " stop underlying
perform update_style USING x y 'FFFFF57F' '00000080' " italic
perform update_style USING x y 'FF9FFFFF' '00200000' " hotspot
perform update_style USING x y 'FF9FFFFF' '00400000' " no hotspot
perform update_style USING x y 'F9E7FFFF' '00080000' " Editable
perform update_style USING x y 'F9E7FFFF' '00100000' " Non Editable
对于对齐,update_mask 是 'DFFFF57F' update_style 可以是:
DATA alv_style_align_left_top(4) TYPE x VALUE '00000800'.
DATA alv_style_align_center_top(4) TYPE x VALUE '00001000'.
DATA alv_style_align_right_top(4) TYPE x VALUE '00001800'.
DATA alv_style_align_left_center(4) TYPE x VALUE '00002000'.
DATA alv_style_align_center_center(4) TYPE x VALUE '00002800'.
DATA alv_style_align_right_center(4) TYPE x VALUE '00003000'.
DATA alv_style_align_left_bottom(4) TYPE x VALUE '00003800'.
DATA alv_style_align_center_bottom(4) TYPE x VALUE '00004000'.
DATA alv_style_align_right_bottom(4) TYPE x VALUE '00004800'.
如果你想处理边框,你必须修改 s_style-style2 为:
'FFFBFFFF' '00040000' " Remove top border
'FFF7FFFF' '00080000' " Remove bottom border
'FFFEFFFF' '00010000' " Remove left border
'FFFDFFFF' '00020000' " Remove right border
在这一切之后(甚至在 set_table_for_first_display 之后) 您只需要调用一个名为 REFRESH 的表单或方法 因为我写了 class CL_GUI_ALV_GRID 的实现,所以我不使用 FORM,而是使用方法:
METHOD REFRESH.
DATA ls_stable TYPE lvc_s_stbl.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD me->refresh_table_display
EXPORTING
is_stable = ls_stable
EXCEPTIONS
finished = 1
OTHERS = 2.
ENDMETHOD.
x 和 y 不是必填字段,因此我可以遍历所有行以将 属性 设置为列(y 未设置)
ASSIGN mt_outtab->* TO <tab>.
CHECK <tab> IS ASSIGNED.
LOOP AT <tab> ASSIGNING <line>.
update_style( x sy-tabix update_mask update_style )
或遍历我的字段目录以将 属性 设置为一行(x 未设置)
LOOP at me->get_frontend_fieldcatalog( ) in ls_fcat
update_style( ls_fcat-fieldname y update_mask update_style )
更多可能性,请检查link
ABAP Alv_grid Merge cells and style formating of cells