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 *&---------------------------------------------------------------------* *& Form SELECT_DATA_AND_INIT_STYLE *&---------------------------------------------------------------------* 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 TEXT– 001. 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 TEXT –002 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( ).