This sample program illustrates how to add and remove lines to a table using the ALV Grid Control and how to implement the saving of the new data.
In order to implement such requirement, here are the steps to undertake:
1.Lock your database table accordingly;
2.Set status of columns to editable;
3.Set all cells of the table non-editable by using the style table;
4.Define internal tables to remember inserted and deleted lines,
thus the delta between input made after the last saving;
5.Check if there exist already other records with equal key fields;
6.Use protocol attributes MT_DELETED_ROWS and MT_INSERTED_ROWS
to remember which lines where deleted or inserted. Save this
information in your internal tables;
7.Check if any errors exist in protocol by using method
CHECK_CHANGED_DATA of your ALV Grid instance;
8.When all values are valid, use your internal tables to update your table on the database;
9.Refresh your internal tables;
10.Unlock your database table;
Sample Code:
In order to implement such requirement, here are the steps to undertake:
1.Lock your database table accordingly;
2.Set status of columns to editable;
3.Set all cells of the table non-editable by using the style table;
4.Define internal tables to remember inserted and deleted lines,
thus the delta between input made after the last saving;
5.Check if there exist already other records with equal key fields;
6.Use protocol attributes MT_DELETED_ROWS and MT_INSERTED_ROWS
to remember which lines where deleted or inserted. Save this
information in your internal tables;
7.Check if any errors exist in protocol by using method
CHECK_CHANGED_DATA of your ALV Grid instance;
8.When all values are valid, use your internal tables to update your table on the database;
9.Refresh your internal tables;
10.Unlock your database table;
Sample Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | * Classes **************************************** class screen_init definition create private. public section. class-methods init_screen. methods constructor. private section. data: splitter_h type ref to cl_gui_splitter_container, splitter_v type ref to cl_gui_splitter_container, picture type ref to cl_gui_picture, tree type ref to cl_gui_simple_tree. methods: fill_tree, fill_picture. endclass. class screen_handler definition. public section. methods: constructor importing container type ref to cl_gui_container, handle_node_double_click for event node_double_click of cl_gui_simple_tree importing node_key. private section. data: html_viewer type ref to cl_gui_html_viewer, list_viewer type ref to cl_gui_alv_grid. methods: fill_html importing carrid type spfli-carrid, fill_list importing carrid type spfli-carrid connid type spfli-connid. endclass. class screen_init implementation. method init_screen. data screen type ref to screen_init. create object screen. endmethod. method constructor. data: events type cntl_simple_events, event like line of events, event_handler type ref to screen_handler, container_left type ref to cl_gui_container, container_right type ref to cl_gui_container, container_top type ref to cl_gui_container, container_bottom type ref to cl_gui_container. create object splitter_h exporting parent = cl_gui_container=>screen0 rows = 1 columns = 2. call method splitter_h->set_border exporting border = cl_gui_cfw=>false. call method splitter_h->set_column_mode exporting mode = splitter_h->mode_absolute. call method splitter_h->set_column_width exporting id = 1 width = 107. container_left = splitter_h->get_container( row = 1 column = 1 ). container_right = splitter_h->get_container( row = 1 column = 2 ). create object splitter_v exporting parent = container_left rows = 2 columns = 1. call method splitter_v->set_border exporting border = cl_gui_cfw=>false. call method splitter_v->set_row_mode exporting mode = splitter_v->mode_absolute. call method splitter_v->set_row_height exporting id = 1 height = 160. container_top = splitter_v->get_container( row = 1 column = 1 ). container_bottom = splitter_v->get_container( row = 2 column = 1 ). create object picture exporting parent = container_top. create object tree exporting parent = container_bottom node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single. create object event_handler exporting container = container_right. event-eventid = cl_gui_simple_tree=>eventid_node_double_click. event-appl_event = ' '. "system event, does not trigger PAI append event to events. call method tree->set_registered_events exporting events = events. set handler event_handler->handle_node_double_click for tree. call method: me->fill_picture, me->fill_tree. endmethod. method fill_picture. types pict_line(256) type x. data pict_tab type table of pict_line. data url(255) type c. import pict_tab = pict_tab from database abtree(pi) id 'FLIGHTS'. call function 'DP_CREATE_URL' exporting type = 'IMAGE' subtype = 'GIF' tables data = pict_tab changing url = url. call method picture->load_picture_from_url exporting url = url. call method picture->set_display_mode exporting display_mode = picture->display_mode_fit_center. endmethod. method fill_tree. data: node_table type table of abdemonode, node type abdemonode, spfli_wa type spfli, spfli_tab type sorted table of spfli with unique key carrid connid. select carrid connid from spfli into corresponding fields of table spfli_tab. node-hidden = ' '. " All nodes are visible, node-disabled = ' '. " selectable, node-isfolder = 'X'. " a folder, node-expander = ' '. " have no '+' sign for expansion. loop at spfli_tab into spfli_wa. at new carrid. node-node_key = spfli_wa-carrid. clear node-relatkey. clear node-relatship. node-text = spfli_wa-carrid. node-n_image = ' '. node-exp_image = ' '. append node to node_table. endat. at new connid. concatenate spfli_wa-carrid spfli_wa-connid into node-node_key. node-relatkey = spfli_wa-carrid. node-relatship = cl_gui_simple_tree=>relat_last_child. node-text = spfli_wa-connid. node-n_image = '@AV@'. "AV is the internal code node-exp_image = '@AV@'. "for an airplane icon endat. append node to node_table. endloop. call method tree->add_nodes exporting table_structure_name = 'ABDEMONODE' node_table = node_table. endmethod. endclass. * class screen_handler implementation. method constructor. create object: html_viewer exporting parent = container, list_viewer exporting i_parent = container. endmethod. method handle_node_double_click. data: carrid type spfli-carrid, connid type spfli-connid. carrid = node_key(2). connid = node_key+2(4). if connid is initial. call method: fill_html exporting carrid = carrid, html_viewer->set_visible exporting visible = 'X', list_viewer->set_visible exporting visible = ' '. else. call method: fill_list exporting carrid = carrid connid = connid, list_viewer->set_visible exporting visible = 'X', html_viewer->set_visible exporting visible = ' '. endif. call method cl_gui_cfw=>flush. endmethod. method fill_html. data url type scarr-url. select single url from scarr into url where carrid = carrid. call method html_viewer->show_url exporting url = url. endmethod. method fill_list. data: flight_tab type table of demofli, begin of flight_title, carrname type scarr-carrname, cityfrom type spfli-cityfrom, cityto type spfli-cityto, end of flight_title, list_layout type lvc_s_layo. select single c~carrname p~cityfrom p~cityto into corresponding fields of flight_title from ( scarr as c inner join spfli as p on c~carrid = p~carrid ) where p~carrid = carrid and p~connid = connid. select fldate seatsmax seatsocc into corresponding fields of table flight_tab from sflight where carrid = carrid and connid = connid order by fldate. concatenate flight_title-carrname connid flight_title-cityfrom flight_title-cityto into list_layout-grid_title separated by space. list_layout-smalltitle = 'X'. "The list title has small fonts, list_layout-cwidth_opt = 'X'. "the column width is adjusted, list_layout-no_toolbar = 'X'. "the toolbar is suppressed. call method list_viewer->set_table_for_first_display exporting i_structure_name = 'DEMOFLI' is_layout = list_layout changing it_outtab = flight_tab. endmethod. endclass. * Program execution ************************************************ load-of-program. call screen 100. * Dialog Modules PBO module status_0100 output. set pf-status 'SCREEN_100'. set titlebar 'TIT_100'. call method screen_init=>init_screen. endmodule. * Dialog Modules PAI module cancel input. leave program. endmodule. |