ABAP ALV DEMO示例源码

关于ALV表格颜色,感觉这种需求在项目中用到的时候不是很多,但是前一段时间面试的时候,面试官问了我关于ALV单元格颜色的问题。

以前了解过一点,回答的不是很好,后来百度了一下,大概了解了一些,今天工作不忙,所以总结一下,以后工作用到可以过来看一下。

(其实有的时候面试官就是想通过这些不常用的知识点,来了解被面试者的水平)

DEMO源代码

  1 *&---------------------------------------------------------------------*
  2 *& Report  ZHAIM_test
  3 *&
  4 *&---------------------------------------------------------------------*
  5 *&
  6 *&
  7 *&---------------------------------------------------------------------*
  8 
  9 REPORT  ZHAIM_test NO STANDARD PAGE HEADING.
 10 
 11 TABLES ZEMP_TEST.
 12 
 13 TYPES: BEGIN OF TY_ZEMP.
 14        INCLUDE STRUCTURE ZEMP_TEST.
 15 TYPES: CLR TYPE CHAR4,
 16        CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
 17        END OF TY_ZEMP.
 18 
 19 DATA: IT_ZEMP TYPE STANDARD TABLE OF TY_ZEMP,
 20       IW_ZEMP TYPE TY_ZEMP.
 21 
 22 TYPE-POOLS : SLIS.
 23 DATA : IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
 24        IT_EVENT TYPE SLIS_T_EVENT, "不能有表头,否则会RUNTIME ERROR
 25        IW_LAYOUT TYPE SLIS_LAYOUT_ALV,
 26        IW_CELLCOLOR TYPE LVC_S_SCOL,
 27        IT_LISTHEADER TYPE SLIS_T_LISTHEADER.
 28 
 29 PARAMETERS P_DEPT TYPE ZEMP_TEST-EDEPT.
 30 
 31 START-OF-SELECTION.
 32 
 33   PERFORM FRM_GET_EVENT.
 34   PERFORM FRM_GET_DATA.
 35   PERFORM FRM_ALV_COLOR.
 36   PERFORM FRM_COMMENT_BUILD.
 37   PERFORM FRM_LAYOUT.
 38   PERFORM FRM_FIELDCAT.
 39   PERFORM FRM_ALV_DISPLAY.
 40 
 41 *&---------------------------------------------------------------------*
 42 *&      Form  FRM_GET_DATA
 43 *&---------------------------------------------------------------------*
 44 *       text
 45 *----------------------------------------------------------------------*
 46 *  -->  p1        text
 47 *  <--  p2        text
 48 *----------------------------------------------------------------------*
 49 FORM FRM_GET_DATA .
 50 
 51   AUTHORITY-CHECK OBJECT 'ZEMPOBJ00'
 52          ID 'ZEMPDEPT' FIELD P_DEPT
 53          ID 'ACTVT'  FIELD '03'.
 54   IF SY-SUBRC <> 0.
 55     MESSAGE S001(00) WITH '您没有权限查看此数据' DISPLAY LIKE 'E'.
 56     STOP.
 57   ENDIF.
 58 
 59   SELECT *
 60     FROM ZEMP_TEST
 61     INTO CORRESPONDING FIELDS OF TABLE IT_ZEMP
 62    WHERE EDEPT = P_DEPT.
 63   IF SY-SUBRC <> 0.
 64     MESSAGE S001(00) WITH '不存在符合条件的数据' DISPLAY LIKE 'E'.
 65     STOP.
 66   ENDIF.
 67 
 68 ENDFORM.                    " FRM_GET_DATA
 69 
 70 *&---------------------------------------------------------------------*
 71 *&      Form  FRM_GET_EVENT
 72 *&---------------------------------------------------------------------*
 73 *       text
 74 *----------------------------------------------------------------------*
 75 *  -->  p1        text
 76 *  <--  p2        text
 77 *----------------------------------------------------------------------*
 78 FORM FRM_GET_EVENT .
 79 
 80   DATA: FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME VALUE 'FRM_TOP_OF_PAGE'.
 81 
 82   DATA L_EVENTS TYPE SLIS_ALV_EVENT.
 83 
 84   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
 85     EXPORTING
 86       I_LIST_TYPE     = 0
 87     IMPORTING
 88       ET_EVENTS       = IT_EVENT
 89     EXCEPTIONS
 90       LIST_TYPE_WRONG = 1
 91       OTHERS          = 2.
 92   IF SY-SUBRC <> 0.
 93     MESSAGE ID SY-MSGID TYPE SY-MSGTY
 94         NUMBER SY-MSGNO
 95           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
 96   ENDIF.
 97 * 在事件(字段名:NAME)为"TOP_OF_PAGE"的行中
 98 *将FORM名(字段名:FORM)设为"FRM_TOP_OF_PAGE"
 99 * 这样,系统就会自动PERFORM FRM_TOP_OF_PAGE.
100   CLEAR L_EVENTS.
101   READ TABLE IT_EVENT
102         WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
103         INTO L_EVENTS.
104 
105   IF SY-SUBRC = 0.
106     MOVE FORMNAME_TOP_OF_PAGE TO L_EVENTS-FORM.
107     MODIFY IT_EVENT FROM L_EVENTS INDEX SY-TABIX.
108   ELSE.
109     L_EVENTS-FORM = FORMNAME_TOP_OF_PAGE.
110     L_EVENTS-NAME = FORMNAME_TOP_OF_PAGE.
111     APPEND L_EVENTS TO IT_EVENT.
112   ENDIF.
113 
114 ENDFORM.                    " FRM_GET_EVENT
115 
116 *&---------------------------------------------------------------------*
117 *&      Form  FRM_TOP_OF_PAGE
118 *&---------------------------------------------------------------------*
119 *       表头
120 *----------------------------------------------------------------------*
121 *  -->  p1        text
122 *  <--  p2        text
123 *----------------------------------------------------------------------*
124 FORM  FRM_TOP_OF_PAGE.
125   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
126     EXPORTING
127       IT_LIST_COMMENTARY       = IT_LISTHEADER
128       I_LOGO                   = 'ENJOYSAP_LOGO'
129 *     I_END_OF_LIST_GRID       =
130 *     I_ALV_FORM               =
131       .
132 * "TCODE:OAOR,CLASS
133 * NAME:PICTURES,CLASS TYPE :OT,执行,可以看到所有的PICTURE
134 
135 ENDFORM.                    "FRM_TOP_OF_PAGE
136 *&---------------------------------------------------------------------*
137 *&      Form  FRM_COMMENT_BUILD
138 *&---------------------------------------------------------------------*
139 *       text
140 *----------------------------------------------------------------------*
141 *  -->  p1        text
142 *  <--  p2        text
143 *----------------------------------------------------------------------*
144 FORM FRM_COMMENT_BUILD .
145   DATA LW_LISTHEADER TYPE SLIS_LISTHEADER.
146 
147   CLEAR: IT_LISTHEADER, LW_LISTHEADER.
148 
149   LW_LISTHEADER-TYP  = 'H'.
150   LW_LISTHEADER-INFO = 'ALV DEMO'.
151   APPEND LW_LISTHEADER TO IT_LISTHEADER.
152 
153   CLEAR LW_LISTHEADER.
154   LW_LISTHEADER-TYP  = 'S'.
155   LW_LISTHEADER-KEY  = '用户:'.
156   LW_LISTHEADER-INFO = SY-UNAME.
157   APPEND LW_LISTHEADER TO IT_LISTHEADER.
158 
159   CLEAR LW_LISTHEADER.
160   LW_LISTHEADER-TYP  = 'S'.
161   LW_LISTHEADER-KEY  = '日期:'.
162   LW_LISTHEADER-INFO = SY-DATUM.
163   APPEND LW_LISTHEADER TO IT_LISTHEADER.
164 
165 ENDFORM.                    " FRM_COMMENT_BUILD
166 *&---------------------------------------------------------------------*
167 *&      Form  FRM_LAYOUT
168 *&---------------------------------------------------------------------*
169 *       text
170 *----------------------------------------------------------------------*
171 *  -->  p1        text
172 *  <--  p2        text
173 *----------------------------------------------------------------------*
174 FORM FRM_LAYOUT .
175 
176   IW_LAYOUT-COLWIDTH_OPTIMIZE = 'X'."自适应字段宽度
177   IW_LAYOUT-ZEBRA = 'X'.              "斑马线显示
178   "ALV单元格中列的颜色在 IT_FIELDCAT 中设置,
179               "行的颜色,以及单元格颜色在 IS_LAYOUT中设置。
180   IW_LAYOUT-INFO_FIELDNAME = 'CLR'.  "行颜色代码的字段
181   IW_LAYOUT-COLTAB_FIELDNAME = 'CELLCOLOR'. "单元格颜色内表字段
182 * IW_LAYOUT-EDIT = 'X'. "可以修改所有ALV列的数据,
183 * 左边也会出来选择行的按钮","保存"按钮也会出来
184   IW_LAYOUT-F2CODE = 'PICK'."双击触发的FUNCTION CODE
185 
186 ENDFORM.                    " FRM_LAYOUT
187 *&---------------------------------------------------------------------*
188 *&      Form  FRM_ALV_COLOR
189 *&---------------------------------------------------------------------*
190 *       text
191 *----------------------------------------------------------------------*
192 *  -->  p1        text
193 *  <--  p2        text
194 *----------------------------------------------------------------------*
195 FORM FRM_ALV_COLOR .
196   LOOP AT IT_ZEMP INTO IW_ZEMP.
197 
198      "员工编号为‘3’的行,颜色为红色
199      IF IW_ZEMP-EMPID = '3'.
200        IW_ZEMP-CLR = 'C610'.
201 
202        MODIFY IT_ZEMP FROM IW_ZEMP.
203        CLEAR IW_ZEMP.
204 
205      ENDIF.
206 
207      IF IW_ZEMP-EMPID = '2'.
208        IW_CELLCOLOR-FNAME = 'ENAME'.
209        "员工编号为‘2’的行的‘ENAME’字段颜色为 黄色
210        IW_CELLCOLOR-COLOR-COL = 3.
211        IW_CELLCOLOR-COLOR-INT = 1.
212        IW_CELLCOLOR-COLOR-INV = 0.
213 
214        APPEND IW_CELLCOLOR TO IW_ZEMP-CELLCOLOR.
215        MODIFY IT_ZEMP FROM IW_ZEMP.
216        CLEAR IW_ZEMP.
217 
218      ENDIF.
219   ENDLOOP.
220 * Syntax of color        value in    col    color
221 *{ COL_BACKGROUND }        0            GUI-specific
222 *{ 1 | COL_HEADING }    1         Gray-blue
223 *{ 2 | COL_NORMAL }        2            Light gray
224 *{ 3 | COL_TOTAL }      3         Yellow
225 *{ 4 | COL_KEY }        4         Blue-green
226 *{ 5 | COL_POSITIVE }      5            Green
227 *{ 6 | COL_NEGATIVE }      6            Red
228 *{ 7 | COL_GROUP }      7         Violet
229 
230 ENDFORM.                    " FRM_ALV_COLOR
231 *&---------------------------------------------------------------------*
232 *&      Form  FRM_FIELDCAT
233 *&---------------------------------------------------------------------*
234 *       text
235 *----------------------------------------------------------------------*
236 *  -->  p1        text
237 *  <--  p2        text
238 *----------------------------------------------------------------------*
239 FORM FRM_FIELDCAT .
240 
241   CLEAR IT_FIELDCAT.
242 
243 * 函数调用获得标准字段,构成FCAT
244   PERFORM FRM_GET_ALL_FIELD.
245 * RFE自定义字段,字段颜色,求和
246   PERFORM FRM_REDEFINE_FIELD.
247 
248 * 颜色和HOTSPOT和对齐
249   "PERFORM FRM_COLOR_HOTSPOT USING LW_FCAT.
250 * 格式调整
251  " PERFORM FRM_FORMAT_FIELD USING LW_FCAT.
252 
253 ENDFORM.                    " FRM_FIELDCAT
254 *&---------------------------------------------------------------------*
255 *&      Form  FRM_GET_ALL_FIELD
256 *&---------------------------------------------------------------------*
257 *       text
258 *----------------------------------------------------------------------*
259 *       text
260 *----------------------------------------------------------------------*
261 FORM FRM_GET_ALL_FIELD .
262 
263   DATA W_REPID TYPE SY-REPID.
264   W_REPID = SY-REPID.
265 
266   CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
267     EXPORTING
268       I_PROGRAM_NAME         = W_REPID
269 *     I_INTERNAL_TABNAME     =
270       I_STRUCTURE_NAME       = 'ZEMP_TEST'
271 *     I_CLIENT_NEVER_DISPLAY = 'X'
272 *     I_INCLNAME             =
273 *     I_BYPASSING_BUFFER     =
274 *     I_BUFFER_ACTIVE        =
275     CHANGING
276       CT_FIELDCAT            = IT_FIELDCAT
277     EXCEPTIONS
278       INCONSISTENT_INTERFACE = 1
279       PROGRAM_ERROR          = 2
280       OTHERS                 = 3.
281   IF SY-SUBRC <> 0.
282     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
283            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
284   ENDIF.
285 
286 ENDFORM.                    " FRM_GET_ALL_FIELD
287 *&---------------------------------------------------------------------*
288 *&      Form  FRM_REDEFINE_FIELD
289 *&---------------------------------------------------------------------*
290 *       text
291 *----------------------------------------------------------------------*
292 *  -->  p1        text
293 *  <--  p2        text
294 *----------------------------------------------------------------------*
295 FORM FRM_REDEFINE_FIELD .
296   DATA LW_FCAT TYPE SLIS_FIELDCAT_ALV.
297   CLEAR LW_FCAT.
298 **  DEFINE INITIAL_FIELD.
299 **    ADD 1 TO col_pos .
300 **    CLEAR LW_FCAT.
301 **    LW_FCAT-COL_POS = col_pos.
302 **    LW_FCAT-TABNAME = TABNAME.
303 **    LW_FCAT-SELTEXT_L = &1.
304 **    LW_FCAT-SELTEXT_M = &1.
305 **    LW_FCAT-SELTEXT_S = &1.
306 **    LW_FCAT-FIELDNAME = &2.
307 **  APPEND P_LW_FCAT TO IT_FIELDCAT.
308 **  END-OF-DEFINITION.
309 *
310     LW_FCAT-COL_POS = '4'.
311     LW_FCAT-SELTEXT_L = 'SALARY'.
312     LW_FCAT-SELTEXT_M = 'SALARY'.
313     LW_FCAT-SELTEXT_S = 'SALARY'.
314     LW_FCAT-EMPHASIZE = 'C710'. "设置字段的颜色
315     LW_FCAT-DO_SUM = 'X'.  "立即求和,只有I,F,P类型的列可以求和
316 
317     MODIFY IT_FIELDCAT FROM LW_FCAT
318     TRANSPORTING EMPHASIZE SELTEXT_L SELTEXT_M SELTEXT_S EMPHASIZE DO_SUM
319     WHERE FIELDNAME = 'ESLRY'.
320 
321     CLEAR LW_FCAT.
322     LW_FCAT-HOTSPOT = 'X'.
323     LW_FCAT-KEY = 'X'.
324     MODIFY IT_FIELDCAT FROM LW_FCAT
325     TRANSPORTING REF_TABNAME HOTSPOT KEY
326     WHERE FIELDNAME = 'EMPID'.
327 
328 
329 
330 ENDFORM.                    " FRM_REDEFINE_FIELD
331 *&---------------------------------------------------------------------*
332 *&      Form  FRM_STATUS_EX
333 *&---------------------------------------------------------------------*
334 *       text
335 *----------------------------------------------------------------------*
336 *  -->  p1        text
337 *  <--  p2        text
338 *----------------------------------------------------------------------*
339 FORM FRM_STATUS_EX USING EXTAB TYPE SLIS_T_EXTAB.
340   DATA:BEGIN OF TAB OCCURS 0,
341          FCODE LIKE RSMPE-FUNC,
342        END OF TAB.
343 
344   TAB-FCODE = '&OL0'.APPEND TAB.
345   TAB-FCODE = '&OAD'.APPEND TAB.
346   TAB-FCODE = '&AVE'.APPEND TAB.
347 
348   SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'
349   EXCLUDING TAB IMMEDIATELY.
350 
351 ENDFORM.                    " FRM_STATUS_EX
352 
353 *&---------------------------------------------------------------------*
354 *&      Form  FRM_ALV_USER_COMMD
355 *&---------------------------------------------------------------------*
356 *       text
357 *----------------------------------------------------------------------*
358 *  -->  p1        text
359 *  <--  p2        text
360 *----------------------------------------------------------------------*
361 FORM FRM_ALV_USER_COMMD USING R_UCOMM TYPE SY-UCOMM
362                                  RS_SELFIELD TYPE SLIS_SELFIELD.
363 
364 DATA LW_EMPTEST TYPE CHAR10 VALUE 'ZEMP_TEST'.
365 
366   CASE R_UCOMM.
367     WHEN 'PICK'.
368 *    READ TABLE IT_ASSET INTO IW_ASSET INDEX RS_SELFIELD-TABINDEX.
369     SET PARAMETER ID: 'DTB' FIELD LW_EMPTEST.
370 
371     CALL TRANSACTION 'SE11' ."AND SKIP FIRST SCREEN.
372   ENDCASE.
373 
374 ENDFORM.                    " FRM_ALV_USER_COMMAND
375 
376 
377 *&---------------------------------------------------------------------*
378 *&      Form  FRM_ALV_DISPLAY
379 *&---------------------------------------------------------------------*
380 *       text
381 *----------------------------------------------------------------------*
382 *  -->  p1        text
383 *  <--  p2        text
384 *----------------------------------------------------------------------*
385 FORM FRM_ALV_DISPLAY .
386   DATA LW_REPID TYPE SY-REPID.
387   LW_REPID = SY-REPID.
388 
389   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
390    EXPORTING
391 *     I_INTERFACE_CHECK                 = ' '
392 *     I_BYPASSING_BUFFER                = ' '
393 *     I_BUFFER_ACTIVE                   = ' '
394      I_CALLBACK_PROGRAM                = LW_REPID
395      I_CALLBACK_PF_STATUS_SET          = 'FRM_STATUS_EX'
396      I_CALLBACK_USER_COMMAND           = 'FRM_ALV_USER_COMMD'
397 *     I_CALLBACK_TOP_OF_PAGE            = ' '
398 *     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
399 *     I_CALLBACK_HTML_END_OF_LIST       = ' '
400 *     I_STRUCTURE_NAME                  = 'ZEMP_TEST'
401 *     I_BACKGROUND_ID                   = ' '
402      I_GRID_TITLE                      = 'ALV DEMO'
403 *     I_GRID_SETTINGS                   =
404      IS_LAYOUT                         = IW_LAYOUT
405      IT_FIELDCAT                       = IT_FIELDCAT
406 *     IT_EXCLUDING                      =
407 *     IT_SPECIAL_GROUPS                 =
408 *     IT_SORT                           =
409 *     IT_FILTER                         =
410 *     IS_SEL_HIDE                       =
411 *     I_DEFAULT                         = 'X'
412 *     I_SAVE                            = ' '
413 *     IS_VARIANT                        =
414 *     IT_EVENTS                         = IT_EVENT
415 *     IT_EVENT_EXIT                     =
416 *     IS_PRINT                          =
417 *     IS_REPREP_ID                      =
418 *     I_SCREEN_START_COLUMN             = 0
419 *     I_SCREEN_START_LINE               = 0
420 *     I_SCREEN_END_COLUMN               = 0
421 *     I_SCREEN_END_LINE                 = 0
422 *     I_HTML_HEIGHT_TOP                 = 0
423 *     I_HTML_HEIGHT_END                 = 0
424 *     IT_ALV_GRAPHICS                   =
425 *     IT_HYPERLINK                      =
426 *     IT_ADD_FIELDCAT                   =
427 *     IT_EXCEPT_QINFO                   =
428 *     IR_SALV_FULLSCREEN_ADAPTER        =
429 *   IMPORTING
430 *     E_EXIT_CAUSED_BY_CALLER           =
431 *     ES_EXIT_CAUSED_BY_USER            =
432     TABLES
433       T_OUTTAB                          = IT_ZEMP
434 *   EXCEPTIONS
435 *     PROGRAM_ERROR                     = 1
436 *     OTHERS                            = 2
437             .
438   IF SY-SUBRC <> 0.
439 *   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
440 *           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
441   ENDIF.
442 
443 ENDFORM.                    " FRM_ALV_DISPLAY
  • 列颜色

列的颜色很简单,在构成ALV字段的FIELDCAT内表中有一个字段是EMPHASIZE,将一个char型4位的颜色代码分配到FIELDCAT内表这个字段即可。

1 LW_FCAT-EMPHASIZE = 'C710'. "设置字段的颜色
2 
3 MODIFY IT_FIELDCAT FROM LW_FCAT
4 TRANSPORTING EMPHASIZE
5 WHERE FIELDNAME = 'ESLRY'.
  • 行颜色

1. 在构成ALV数据的内表中,添加一个char型4位的字段(CLR),用来记录颜色代码

1 TABLES ZEMP_TEST.
2 
3 TYPES: BEGIN OF TY_ZEMP.
4            INCLUDE STRUCTURE ZEMP_TEST.
5 TYPES: CLR TYPE CHAR4,"可以控制行颜色
6         END OF TY_ZEMP.
7 
8 DATA: IT_ZEMP TYPE STANDARD TABLE OF TY_ZEMP,
9       IW_ZEMP TYPE TY_ZEMP.

2. 循环内表,设置颜色代码

1   LOOP AT IT_ZEMP INTO IW_ZEMP.
2      "员工编号为‘3的行,颜色为红色
3    IF IW_ZEMP-EMPID = '3'.
4         IW_ZEMP-CLR = 'C610'.
5         MODIFY IT_ZEMP FROM IW_ZEMP.
6         CLEAR IW_ZEMP.
7      ENDIF.
8   ENDLOOP.

3. LAYOUT结构中INFO_FIELDNAME的值指定为 CLR

  IW_LAYOUT-INFO_FIELDNAME = 'CLR'.  "行颜色代码的字段
  • 单元格颜色

单元格颜色的设置与行颜色设计基本一致

1. 在构成ALV数据的内表中,添加一个内表 CellColor,用来记录颜色代码,需要设置颜色的字段名

1 TYPES: BEGIN OF TY_ZEMP.
2        INCLUDE STRUCTURE ZEMP_TEST.
3 TYPES: CLR TYPE CHAR4,
4        CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
5        END OF TY_ZEMP.

CellColor的结构:FNAME        ALV 控制: 内部表字段的字段名称
         COLOR        ALV 控制: 颜色代码     COLOR是一个结构:COL      ALV 控制: 颜色
                                    INT      ALV 控制: 强化    1/0
                                    INV      ALV 控制: 相反    1/0    设置颜色是前景,或者是背景
         NOKEYCOL  ALV 控制: 覆盖码颜色
2. 循环内表,设置颜色代码

3. LAYOUT结构中COLTAB_FIELDNAME的值指定为CELLCOLOR

  IW_LAYOUT-COLTAB_FIELDNAME = 'CELLCOLOR'. "单元格颜色内表字段


最后在调用ALV函数时,设置layout,fieldcat参数

     IS_LAYOUT                         = IW_LAYOUT
     IT_FIELDCAT                       = IT_FIELDCAT
  • ALV工具栏

可以自定义工具栏,或者添加标准ALV工具栏,然后去除一些不需要的功能,这样可以保留标准工具栏的功能

 1   DATA:BEGIN OF TAB OCCURS 0,
 2          FCODE LIKE RSMPE-FUNC,
 3        END OF TAB.
 4 
 5   TAB-FCODE = '&OL0'.APPEND TAB.
 6   TAB-FCODE = '&OAD'.APPEND TAB.
 7   TAB-FCODE = '&AVE'.APPEND TAB.
 8 
 9   SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'
10   EXCLUDING TAB IMMEDIATELY.
  • 求和
LW_FCAT-DO_SUM = 'X'.  "立即求和,只有I,F,P类型的列可以求和

----------------------------------------------------------

附:ALV的颜色代码:http://blog.csdn.net/wren2004/article/details/3941551

   

DATA:

  ok_code LIKE sy-ucomm,

  save_ok LIKE sy-ucomm,

  g_container TYPE scrfname VALUE 'BCALV_GRID_DEMO_0100_CONT1',

  grid1 TYPE REF TO cl_gui_alv_grid,

  g_custom_container TYPE REF TO cl_gui_custom_container,

  gs_layout TYPE lvc_s_layo,

  g_max TYPE i VALUE 100.

*§1.Extend your output table for a field, e.g., CELLTAB, that holds

* information about the edit status of each cell for the

* corresponding row (the table type is SORTED!).

DATA: BEGIN OF gt_outtab OCCURS 0. "with header line

        INCLUDE STRUCTURE sflight.

DATA: celltab TYPE lvc_t_styl.

DATA: END OF gt_outtab.

*---------------------------------------------------------------------*

* MAIN *

*---------------------------------------------------------------------*

CALL SCREEN 100.

*---------------------------------------------------------------------*

* MODULE PBO OUTPUT *

*---------------------------------------------------------------------*

MODULE pbo OUTPUT.

  SET PF-STATUS 'MAIN100'.

  SET TITLEBAR 'MAIN100'.

  IF g_custom_container IS INITIAL.

    CREATE OBJECT g_custom_container

      EXPORTING

        container_name = g_container.

    CREATE OBJECT grid1

      EXPORTING

        i_parent = g_custom_container.

    PERFORM select_data_and_init_style.

*§3.Provide the fieldname of the celltab field by using field

* STYLEFNAME of the layout structure.

    gs_layout-stylefname = 'CELLTAB'.

    CALL METHOD grid1->set_table_for_first_display

      EXPORTING

        i_structure_name = 'SFLIGHT'

        is_layout        = gs_layout

      CHANGING

        it_outtab        = gt_outtab[].

  ENDIF.

ENDMODULE.                    "pbo OUTPUT

*---------------------------------------------------------------------*

* MODULE PAI INPUT *

*---------------------------------------------------------------------*

MODULE pai INPUT.

  save_ok = ok_code.

  CLEAR ok_code.

  CASE save_ok.

    WHEN 'EXIT'.

      PERFORM exit_program.

    WHEN 'SWITCH'.

      PERFORM switch_edit_mode.

    WHEN OTHERS.

* do nothing

  ENDCASE.

ENDMODULE.                    "pai INPUT

*---------------------------------------------------------------------*

* FORM EXIT_PROGRAM *

*---------------------------------------------------------------------*

FORM exit_program.

  LEAVE PROGRAM.

ENDFORM.                    "exit_program

*&amp;---------------------------------------------------------------------*

*&amp; Form SELECT_DATA_AND_INIT_STYLE

*&amp;---------------------------------------------------------------------*

FORM select_data_and_init_style.

  DATA: lt_sflight TYPE TABLE OF sflight WITH HEADER LINE,

  lt_celltab TYPE lvc_t_styl,

  l_index TYPE i.

  SELECT * FROM sflight INTO TABLE lt_sflight UP TO g_max ROWS.

* move corresponding fields from lt_sflight to gt_outtab

  LOOP AT lt_sflight.

    MOVE-CORRESPONDING lt_sflight TO gt_outtab.

    APPEND gt_outtab.

  ENDLOOP.

*§2.After selecting data, set edit status for each row in a loop

* according to field SEATSMAX.

  LOOP AT gt_outtab.

    l_index = sy-tabix.

    REFRESH lt_celltab.

    IF gt_outtab-seatsmax GE 300.

      PERFORM fill_celltab USING 'RW'

      CHANGING lt_celltab.

    ELSE.

      PERFORM fill_celltab USING 'RO'

      CHANGING lt_celltab.

    ENDIF.

*§2c.Copy your celltab to the celltab of the current row of gt_outtab.

    INSERT LINES OF lt_celltab INTO TABLE gt_outtab-celltab.

    MODIFY gt_outtab INDEX l_index.

  ENDLOOP.

ENDFORM. " SELECT_DATA_AND_INIT_STYLE

*&---------------------------------------------------------------------*

*& Form FILL_CELLTAB

*&---------------------------------------------------------------------*

FORM fill_celltab USING value(p_mode)

CHANGING pt_celltab TYPE lvc_t_styl.

  DATA: ls_celltab TYPE lvc_s_styl,

  l_mode TYPE raw4.

* This forms sets the style of column 'PRICE' editable

* according to 'p_mode' and the rest to read only either way.

  IF p_mode EQ 'RW'.

*§2a.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_ENABLED to set a cell

* to status "editable".

    l_mode = cl_gui_alv_grid=>mc_style_enabled.

  ELSE. "p_mode eq 'RO'

*§2b.Use attribute CL_GUI_ALV_GRID=>MC_STYLE_DISABLED to set a cell

* to status "non-editable".

    l_mode = cl_gui_alv_grid=>mc_style_disabled.

  ENDIF.

  ls_celltab-fieldname = 'CARRID'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'CONNID'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'FLDATE'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'PRICE'.

  ls_celltab-style = l_mode.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'CURRENCY'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'PLANETYPE'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'SEATSMAX'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'SEATSOCC'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

  ls_celltab-fieldname = 'PAYMENTSUM'.

  ls_celltab-style = cl_gui_alv_grid=>mc_style_disabled.

  INSERT ls_celltab INTO TABLE pt_celltab.

ENDFORM. " FILL_CELLTAB

*&---------------------------------------------------------------------*

*& Form SWITCH_EDIT_MODE

*&---------------------------------------------------------------------*

FORM switch_edit_mode.

  IF grid1->is_ready_for_input( ) EQ 0.

* set edit enabled cells ready for input

    CALL METHOD grid1->set_ready_for_input

      EXPORTING

        i_ready_for_input = 1.

  ELSE.

* lock edit enabled cells against input

    CALL METHOD grid1->set_ready_for_input

      EXPORTING

        i_ready_for_input = 0.

  ENDIF.

ENDFORM. " SWITCH_EDIT_MODE

-------------------------------------------------

REPORT  zmmr_perf_eval_vend. 


“Types Declaration 
TYPES:BEGIN OF t_disp,
   lifnr TYPE lifnr, 
   name1 TYPE name1_gp, 
   bedat TYPE bedat, 
   rfq   TYPE I ,
   quot  TYPE I ,
   po    TYPE I ,
   cont  TYPE I ,
   sch   TYPE I ,
END OF t_disp, 
BEGIN OF t_temp, 
   lifnr TYPE lifnr, 
   CNT   TYPE I ,
END OF t_temp, 
BEGIN OF t_lfa1, 
   lifnr TYPE lifnr, 
   name1 TYPE name1_gp, 
END OF t_lfa1. 

“For ALV {
DATA: “it_layout   TYPE lvc_s_layo, 
       gr_table TYPE REF TO cl_salv_table,
       gr_functions TYPE REF TO cl_salv_functions,
       gr_columns TYPE REF TO cl_salv_columns_table,
       gr_column TYPE REF TO cl_salv_column_table,
       gr_display TYPE REF TO cl_salv_display_settings,
       lr_grid  TYPE REF TO cl_salv_form_layout_grid,
       lr_gridx TYPE REF TO cl_salv_form_layout_grid,
       lr_logo  TYPE REF TO cl_salv_form_layout_logo,
       lr_label TYPE REF TO cl_salv_form_label,
       lr_text  TYPE REF TO cl_salv_form_text,
       lr_footer  TYPE REF TO cl_salv_form_layout_grid,
       ls_color TYPE lvc_s_colo
       . 
” For ALV } 

DATA: it_disp TYPE TABLE OF t_disp, 
       wa_disp LIKE LINE OF it_disp,
       it_temp TYPE TABLE OF t_temp,
       wa_temp LIKE LINE OF it_temp,
       it_lfa1 TYPE TABLE OF t_lfa1,
       wa_lfa1 LIKE LINE OF it_lfa1.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT001.
   SELECT-OPTIONS :  s_lifnr FOR wa_disp– lifnr,
   s_bedat FOR wa_disp– bedat.
SELECTION-SCREEN END OF BLOCK b1.

*———————————————————————-* 
*       CLASS lcl_Perf_Eval DEFINITION 
*———————————————————————-* 
*
*———————————————————————-* 
CLASS lcl_perf_eval DEFINITION .
   PUBLIC SECTION.
   METHODS:  constructor ,
   fill_disp.
   METHODS build_fc. 
   METHODS disp_alv. 
   METHODS set_tol. 
   METHODS end_of_page. 

ENDCLASS.                    “lcl_perf_eval DEFINITION 


*———————————————————————-* 
*       CLASS lcl_perf_eval IMPLEMENTATION 
*———————————————————————-* 
*
*———————————————————————-* 
CLASS lcl_perf_eval IMPLEMENTATION .
   METHOD constructor. 
     TRY.
       cl_salv_table=> factory( IMPORTING r_salv_table = gr_table CHANGING t_table = it_disp ). “Calling Factory Obj of Cl_ALV_TABLE
     CATCH cx_salv_msg.
     ENDTRY .

     IF gr_table IS INITIAL .
       MESSAGE TEXT002 TYPE ‘I’ DISPLAY LIKE ‘E’.
       EXIT .
     ENDIF .
   ENDMETHOD.                    “constructor

   METHOD fill_disp. 
     “RFQ 
     SELECT a~lifnr COUNT(  DISTINCT a~ebeln ) AS rfq FROM ekko AS a
     JOIN ekpo AS b ON a~ ebeln = b ~ebeln
     INTO CORRESPONDING FIELDS OF TABLE it_disp
     WHERE a~lifnr IN s_lifnr AND bedat IN s_bedat
     AND b~loekz NE ‘X’
     AND a~bstyp = ‘A’
     GROUP BY a~lifnr .

     “WRITE sy-dbcnt. 
     “Quot 
     SELECT lifnr COUNT( DISTINCT ebeln ) AS CNT FROM ekko
     APPENDING CORRESPONDING FIELDS OF TABLE it_temp
     WHERE lifnr IN s_lifnr AND bedat IN s_bedat
     AND loekz EQ space
     AND ( bstyp = ‘A’ AND statu = ‘A’ ) 
     GROUP BY lifnr.

     LOOP AT it_temp INTO wa_temp .
       wa_disp– lifnr = wa_temp –lifnr. 
       wa_disp– quot = wa_temp –CNT. 
       MODIFY it_disp FROM wa_disp TRANSPORTING lifnr quot WHERE lifnr = wa_temp–lifnr .
       CLEAR : wa_disp, wa_temp.
     ENDLOOP .

     ” PO 
     REFRESH it_temp.
     SELECT lifnr COUNT( DISTINCT a~ ebeln ) AS CNT FROM ekko AS a JOIN ekpo AS b ON a~ ebeln = b ~ebeln
     APPENDING CORRESPONDING FIELDS OF TABLE it_temp
     WHERE lifnr IN s_lifnr AND bedat IN s_bedat
     AND b~loekz EQ space
     AND bsart NE ‘UB’ 
     AND ( a~ bstyp = ‘F’ )
     GROUP BY lifnr.

     LOOP AT it_temp INTO wa_temp .
       wa_disp– lifnr = wa_temp –lifnr. 
       wa_disp– po = wa_temp –CNT. 
       MODIFY it_disp FROM wa_disp TRANSPORTING lifnr po WHERE lifnr = wa_temp–lifnr .
       IF sy–subrc NE 0. 
         APPEND wa_disp TO it_disp .
       ENDIF .
       CLEAR : wa_disp, wa_temp.
     ENDLOOP .

     “Cont. Created 
     REFRESH it_temp.
     SELECT lifnr COUNT( DISTINCT a~ ebeln ) AS CNT FROM ekko AS a JOIN ekpo AS b ON a~ ebeln = b ~ebeln
     APPENDING CORRESPONDING FIELDS OF TABLE it_temp
     WHERE lifnr IN s_lifnr AND bedat IN s_bedat
     AND b~loekz EQ space
     AND ( a~ bstyp = ‘K’ )
     GROUP BY lifnr.

     LOOP AT it_temp INTO wa_temp .
       wa_disp– lifnr = wa_temp –lifnr. 
       wa_disp– cont = wa_temp –CNT. 
       MODIFY it_disp FROM wa_disp TRANSPORTING lifnr cont WHERE lifnr = wa_temp–lifnr .
       IF sy–subrc NE 0. 
         APPEND wa_disp TO it_disp .
       ENDIF .
       CLEAR : wa_disp, wa_temp.
     ENDLOOP .

     “Sch Aggre 
     REFRESH it_temp.
     SELECT lifnr COUNT( DISTINCT a~ ebeln ) AS CNT FROM ekko AS a JOIN ekpo AS b ON a~ ebeln = b ~ebeln
     APPENDING CORRESPONDING FIELDS OF TABLE it_temp
     WHERE lifnr IN s_lifnr AND bedat IN s_bedat
     AND b~loekz EQ space
     AND ( a~ bstyp = ‘L’ )
     GROUP BY lifnr.

     LOOP AT it_temp INTO wa_temp .
       wa_disp– lifnr = wa_temp –lifnr. 
       wa_disp– sch = wa_temp –CNT. 
       MODIFY it_disp FROM wa_disp TRANSPORTING lifnr sch WHERE lifnr = wa_temp–lifnr .
       IF sy–subrc NE 0. 
         APPEND wa_disp TO it_disp .
       ENDIF .
       CLEAR : wa_disp, wa_temp.
     ENDLOOP .

     SELECT lifnr name1 FROM lfa1
     INTO CORRESPONDING FIELDS OF TABLE it_lfa1
     FOR ALL ENTRIES IN it_disp
     WHERE lifnr = it_disp –lifnr. 

     LOOP AT it_disp INTO wa_disp .
       READ TABLE it_lfa1 INTO wa_lfa1 WITH KEY lifnr = wa_disp–lifnr .
       IF sy–subrc EQ 0. 
         wa_disp– name1 = wa_lfa1 –name1. 
         MODIFY it_disp FROM wa_disp TRANSPORTING lifnr name1 WHERE lifnr = wa_disp– lifnr .
       ENDIF .
     ENDLOOP .


     SORT it_disp BY lifnr .

   ENDMETHOD.                    “fill_disp
   METHOD build_fc. 

     INCLUDE <color>.
     TRY.
       gr_columns = gr_table->get_columns ( ).
       gr_columns-> set_optimize( abap_true ).
       gr_column ?= gr_columns-> get_column( ‘LIFNR’ ).
       ls_color– col = 3 .
       gr_column-> set_color( ls_color ).

     CATCH cx_salv_not_found.
     ENDTRY .

     TRY.
       gr_column ?= gr_columns-> get_column( ‘NAME1’ ).
       gr_column-> set_long_text(‘Vendor Name’ ).
       gr_column-> set_short_text( ‘V.Name’ ).
       gr_column-> set_medium_text(‘Vendor Name’ ).
       ls_color– col = 3 .
       gr_column-> set_color( ls_color ).
     CATCH cx_salv_not_found.
     ENDTRY .

     TRY.
       gr_column ?= gr_columns-> get_column( ‘BEDAT’ ).
       gr_column-> set_visible( abap_false ).
       gr_column-> set_technical( VALUE = if_salv_c_bool_sap=> true ).
     CATCH cx_salv_not_found.
     ENDTRY .

     TRY.
       gr_column ?= gr_columns-> get_column( ‘RFQ’ ).
       gr_column-> set_short_text( ‘RFQ’ ).
       gr_column-> set_medium_text( ‘RFQ Created’ ).
     CATCH cx_salv_not_found.
     ENDTRY .

     TRY.
       gr_column ?= gr_columns-> get_column( ‘QUOT’ ).
       gr_column-> set_short_text( ‘Quot.’ ).
       gr_column-> set_medium_text( ‘Quotation Maintained’ ).
     CATCH cx_salv_not_found.
     ENDTRY .
     TRY.
       gr_column ?= gr_columns-> get_column( ‘PO’ ).
       gr_column-> set_short_text( ‘PO Created’ ).
     CATCH cx_salv_not_found.
     ENDTRY .

     TRY.
       gr_column ?= gr_columns-> get_column( ‘CONT’ ).
       gr_column-> set_short_text( ‘Cont.’ ).
       gr_column-> set_medium_text( ‘Contract Created’ ).
     CATCH cx_salv_not_found.
     ENDTRY .
     TRY.
       gr_column ?= gr_columns-> get_column( ‘SCH’ ).
       gr_column-> set_short_text( ‘Sch. Crea.’ ).
       gr_column-> set_medium_text( ‘Sch. Agr. Created’ ).
       gr_column-> set_long_text( ‘Schedule Agreement Created’ ).
     CATCH cx_salv_not_found.
     ENDTRY .

   ENDMETHOD.                    “build_fc

   METHOD disp_alv. 

     set_tol( ). 
     build_fc( ). 
     end_of_page( ). 

     gr_functions = gr_table->get_functions ( ).
     gr_functions-> set_all( abap_true ).
     gr_table-> set_top_of_list( lr_logo ).
     gr_table-> set_end_of_list( lr_footer ).
     gr_display = gr_table->get_display_settings ( ).
     gr_display-> set_striped_pattern( cl_salv_display_settings =>true ). 


     gr_table-> display( ).

   ENDMETHOD.                    “disp_alv
   METHOD set_tol. 
     DATA : lv_text( 30) TYPE C ,
           lv_date TYPE C LENGTH 10. 

     CREATE OBJECT lr_grid.

     lr_grid-> create_header_information( row = 1  column = 1
     TEXT = ‘MM: Vendor Evaluation’
     tooltip = ‘MM: Vendor Evaluation’ ).

     lr_gridx = lr_grid->create_grid ( row = 2  column = 1  ).
     lr_label = lr_gridx->create_label ( row = 2 column = 1
     TEXT = ‘Vendor No # :’ tooltip = ‘Vendor #.’ ). 

     IF s_lifnr IS NOT INITIAL .
       lv_text = s_lifnr–low .
       IF s_lifnr–high IS NOT INITIAL.
         CONCATENATE lv_text ‘ to ‘ s_lifnr –high INTO lv_text SEPARATED BY space.
       ENDIF .
     ELSE .
       lv_text = ‘Not Provided’.
     ENDIF .
     lr_text  = lr_gridx->create_text (  row = 2 column = 2
     TEXT = lv_text tooltip = lv_text ).
     “Vendor 
     lr_label = lr_gridx->create_label ( row = 3 column = 1
     TEXT = ‘Posting Date:’ tooltip = ‘Posting Date’ ). 
     IF s_bedat IS NOT INITIAL .
       WRITE s_bedat–low DD/MM/YYYY TO lv_text  . 
       IF s_bedat–high IS NOT INITIAL.
         WRITE s_bedat–high DD/MM/YYYY TO lv_date. 
         CONCATENATE lv_text ‘ to ‘ lv_date INTO lv_text SEPARATED BY space.
       ENDIF .
     ELSE .
       lv_text = ‘Not Provided’.
     ENDIF .

     lr_text  = lr_gridx->create_text (  row = 3 column = 2
     TEXT = lv_text  tooltip = lv_text ).

     lr_label = lr_gridx->create_label ( row = 4 column = 1
     TEXT = ‘Run Date:’ tooltip = ‘Run Date’ ). 
     lr_text  = lr_gridx->create_text (  row = 4 column = 2
     TEXT = sy– datum tooltip = sy –datum ). 

     lr_label = lr_gridx->create_label ( row = 5 column = 1 ).
     lr_label = lr_gridx->create_label ( row = 6 column = 1 ).
     lr_label = lr_gridx->create_label ( row = 7 column = 1 ).
     lr_label = lr_gridx->create_label ( row = 8 column = 1 ).


* Create logo layout, set grid content on left and logo image on right 
     CREATE OBJECT lr_logo.
     lr_logo-> set_left_content( lr_grid ).
     lr_logo-> set_right_logo( ‘ZCHEM_N_LOGO_SMALL’ ). ” Image From OAER T.code

   ENDMETHOD.                    “set_Tol

   METHOD end_of_page. 

     DATA :lf_lines TYPE sy–tfill .

     DATA : “lr_label TYPE REF TO cl_salv_form_label,
           lf_flow  TYPE REF TO cl_salv_form_layout_flow .

     CREATE OBJECT lr_footer.
*–get total lines in internal table 
     lf_lines = LINES( it_disp ).
     lr_label = lr_footer->create_label ( row = 1 column = 1 ).
     lr_label-> set_text( ‘Information:’ ).
     lf_flow = lr_footer->create_flow ( row = 2  column = 1 ).
     lf_flow-> create_text( TEXT = ‘Total Number of Entries’ ). 
     lf_flow = lr_footer->create_flow ( row = 2  column = 2 ).
     lf_flow-> create_text( TEXT = lf_lines ). 

   ENDMETHOD.                    “end_of_page

ENDCLASS.                    “lcl_perf_eval IMPLEMENTATION 


START-OF-SELECTION.
DATA : obj_rep TYPE REF TO lcl_perf_eval. ” Declaring Object for Class 

CREATE OBJECT : obj_rep. ” Creating Object 

 obj_rep->fill_disp( ). ” Calling class Methods
 obj_rep->disp_alv( ).
原文地址:https://www.cnblogs.com/mingdashu/p/alv_color.html