├── ABAP - Finding BADIs and User-Exits └── code.abap ├── ABAP - Macros └── code.abap ├── ABAP - Parallel Processing └── code.abap ├── ABAP - Performance Comparison └── code.abap ├── ABAP - Project Pattern └── code.abap ├── ABAP - RTTS ├── Casting.abap ├── Criação de Variável - DDIC.abap ├── Criação de Variável - Estrutura.abap ├── Criação de Variável - Máquina de Gerar Variáveis.abap ├── Criação de Variável - Simples.abap ├── Criação de Variável - Tabela.abap ├── Inspeção de Variável - Estrutura.abap ├── Inspeção de Variável - Simples.abap └── Inspeção de Variável - Tabela.abap ├── ABAP - Removing Invalid Characters with Example ├── code.abap └── example.abap ├── ABAP - SORT tables using BINARY SEARCH (no SORT command) └── code.abap ├── ABAP - Standard Exception Classes └── code.abap ├── ABAP - TVARV Class and Example ├── code.abap └── example.abap ├── ABAP - Using OLE for Microsoft Word └── code.abap ├── ALV - ALV's consistency check └── code.abap ├── ALV - Reusing Standard ALVs └── code.abap ├── CRM BOL - Alert Modeler └── code.abap ├── CRM BOL - Dynamic Query └── code.abap ├── CRM BOL - Get Entities └── code.abap ├── CRM BOL - Messages └── code.abap ├── CRM BOL - Relationship └── code.abap ├── README.md ├── Security - Dynamic Code Generation └── code.abap ├── Security - Kernel Calls └── code.abap ├── Security - OS Commands └── code.abap ├── Security - Virus Scan Interface └── code.abap ├── Selection Screen - Buttons └── code.abap ├── Selection Screen - Hide Elements └── code.abap ├── Selection Screen - New Screen └── code.abap ├── Selection Screen - Tabstrip └── code.abap ├── Selection Screen - Useful Stuff └── code.abap ├── Selects - Dynamic Selection └── code.abap ├── Selects - Testing WHERE clauses └── code.abap ├── Webdynpro - Dynamic MIME content from AS Cache └── code.abap └── Webdynpro - Get URL └── code.abap /ABAP - Finding BADIs and User-Exits/code.abap: -------------------------------------------------------------------------------- 1 | REPORT z_enhancement_finder NO STANDARD PAGE HEADING LINE-SIZE 201. 2 | 3 | TABLES : tstc, 4 | tadir, 5 | modsapt, 6 | modact, 7 | trdir, 8 | tfdir, 9 | enlfdir, 10 | sxs_attrt , 11 | tstct. 12 | 13 | DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE. 14 | DATA : field1(30). 15 | DATA : v_devclass LIKE tadir-devclass. 16 | 17 | PARAMETERS : p_tcode LIKE tstc-tcode, 18 | p_pgmna LIKE tstc-pgmna . 19 | 20 | DATA wa_tadir TYPE tadir. 21 | 22 | START-OF-SELECTION. 23 | 24 | IF NOT p_tcode IS INITIAL. 25 | SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode. 26 | 27 | ELSEIF NOT p_pgmna IS INITIAL. 28 | tstc-pgmna = p_pgmna. 29 | ENDIF. 30 | 31 | IF sy-subrc EQ 0. 32 | SELECT SINGLE * FROM tadir 33 | WHERE pgmid = 'R3TR' 34 | AND object = 'PROG' 35 | AND obj_name = tstc-pgmna. 36 | 37 | MOVE : tadir-devclass TO v_devclass. 38 | 39 | IF sy-subrc NE 0. 40 | SELECT SINGLE * FROM trdir 41 | WHERE name = tstc-pgmna. 42 | IF trdir-subc EQ 'F'. 43 | SELECT SINGLE * FROM tfdir 44 | WHERE pname = tstc-pgmna. 45 | 46 | SELECT SINGLE * FROM enlfdir 47 | WHERE funcname = tfdir-funcname. 48 | 49 | SELECT SINGLE * FROM tadir 50 | WHERE pgmid = 'R3TR' 51 | AND object = 'FUGR' 52 | AND obj_name EQ enlfdir-area. 53 | 54 | MOVE : tadir-devclass TO v_devclass. 55 | ENDIF. 56 | ENDIF. 57 | 58 | SELECT * FROM tadir INTO TABLE jtab 59 | WHERE pgmid = 'R3TR' 60 | AND object IN ('SMOD', 'SXSD') 61 | AND devclass = v_devclass. 62 | 63 | SELECT SINGLE * FROM tstct 64 | WHERE sprsl EQ sy-langu 65 | AND tcode EQ p_tcode. 66 | 67 | FORMAT COLOR COL_POSITIVE INTENSIFIED OFF. 68 | WRITE:/(19) 'Transaction Code - ', 69 | 20(20) p_tcode, 70 | 45(50) tstct-ttext. 71 | SKIP. 72 | IF NOT jtab[] IS INITIAL. 73 | WRITE:/(105) sy-uline. 74 | FORMAT COLOR COL_HEADING INTENSIFIED ON. 75 | 76 | * sorting the internal table 77 | SORT jtab BY object. 78 | DATA : wf_txt(60) TYPE c, 79 | wf_smod TYPE i , 80 | wf_badi TYPE i , 81 | wf_object2(30) TYPE c. 82 | CLEAR : wf_smod, wf_badi , wf_object2. 83 | 84 | *GET the total smod. 85 | LOOP AT jtab INTO wa_tadir. 86 | AT FIRST. 87 | FORMAT COLOR COL_HEADING INTENSIFIED ON. 88 | 89 | WRITE:/1 sy-vline, 90 | 2 'Enhancement/ Business Add-in', 91 | 41 sy-vline , 92 | 42 'Description', 93 | 105 sy-vline. 94 | WRITE:/(105) sy-uline. 95 | ENDAT. 96 | CLEAR wf_txt. 97 | AT NEW object. 98 | IF wa_tadir-object = 'SMOD'. 99 | wf_object2 = 'Enhancement' . 100 | ELSEIF wa_tadir-object = 'SXSD'. 101 | wf_object2 = ' Business Add-in'. 102 | 103 | ENDIF. 104 | FORMAT COLOR COL_GROUP INTENSIFIED ON. 105 | 106 | WRITE:/1 sy-vline, 107 | 108 | 2 wf_object2, 109 | 105 sy-vline. 110 | ENDAT. 111 | 112 | CASE wa_tadir-object. 113 | WHEN 'SMOD'. 114 | wf_smod = wf_smod + 1. 115 | SELECT SINGLE modtext INTO wf_txt 116 | FROM modsapt 117 | WHERE sprsl = sy-langu 118 | AND name = wa_tadir-obj_name. 119 | FORMAT COLOR COL_NORMAL INTENSIFIED OFF. 120 | 121 | WHEN 'SXSD'. 122 | * for badis 123 | wf_badi = wf_badi + 1 . 124 | SELECT SINGLE text INTO wf_txt 125 | FROM sxs_attrt 126 | WHERE sprsl = sy-langu 127 | AND exit_name = wa_tadir-obj_name. 128 | FORMAT COLOR COL_NORMAL INTENSIFIED ON. 129 | ENDCASE. 130 | 131 | WRITE:/1 sy-vline, 132 | 2 wa_tadir-obj_name HOTSPOT ON, 133 | 41 sy-vline , 134 | 42 wf_txt, 135 | 105 sy-vline. 136 | AT END OF object. 137 | WRITE : /(105) sy-uline. 138 | ENDAT. 139 | ENDLOOP. 140 | 141 | WRITE:/(105) sy-uline. 142 | 143 | SKIP. 144 | FORMAT COLOR COL_TOTAL INTENSIFIED ON. 145 | WRITE:/ 'No.of Exits:' , wf_smod. 146 | WRITE:/ 'No.of BADis:' , wf_badi. 147 | 148 | ELSE. 149 | FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. 150 | WRITE:/(105) 'No userexits or BADis exist'. 151 | ENDIF. 152 | ELSE. 153 | FORMAT COLOR COL_NEGATIVE INTENSIFIED ON. 154 | WRITE:/(105) 'Transaction does not exist'. 155 | ENDIF. 156 | 157 | AT LINE-SELECTION. 158 | 159 | DATA : wf_object TYPE tadir-object. 160 | CLEAR wf_object. 161 | 162 | GET CURSOR FIELD field1. 163 | CHECK field1(8) EQ 'WA_TADIR'. 164 | READ TABLE jtab WITH KEY obj_name = sy-lisel+1(20). 165 | MOVE jtab-object TO wf_object. 166 | 167 | CASE wf_object. 168 | WHEN 'SMOD'. 169 | SET PARAMETER ID 'MON' FIELD sy-lisel+1(10). 170 | 171 | CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN. 172 | WHEN 'SXSD'. 173 | SET PARAMETER ID 'EXN' FIELD sy-lisel+1(20). 174 | CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN. 175 | ENDCASE. -------------------------------------------------------------------------------- /ABAP - Macros/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - Macros/code.abap -------------------------------------------------------------------------------- /ABAP - Parallel Processing/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - Parallel Processing/code.abap -------------------------------------------------------------------------------- /ABAP - Performance Comparison/code.abap: -------------------------------------------------------------------------------- 1 | *----------------------------------------------------------------------* 2 | * === ABAP ZOMBIE PRESENTS === * 3 | *----------------------------------------------------------------------* 4 | * Selection Screen Examples * 5 | *----------------------------------------------------------------------* 6 | * Description -> Compare different code snipets and check wich one is * 7 | * faster! * 8 | * Date -> Dez 13, 2011 * 9 | * SAP Version -> 6.0 * 10 | *----------------------------------------------------------------------* 11 | * ABAP Zombie Staff: Mauricio Roberto Cruz * 12 | * Mauro Cesar Laranjeira * 13 | * Priscila Silva 14 | *----------------------------------------------------------------------* 15 | * Please, visit us at http://abapzombie.com/ and drop a Comment! * 16 | *----------------------------------------------------------------------* 17 | REPORT zombie_performance_examples. 18 | 19 | *--------------------------------------------------------------------* 20 | * Report Main Screen 21 | *--------------------------------------------------------------------* 22 | SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE text-001. 23 | 24 | PARAMETERS: p_both RADIOBUTTON GROUP rb01, 25 | p_test1 RADIOBUTTON GROUP rb01, 26 | p_test2 RADIOBUTTON GROUP rb01. 27 | 28 | SELECTION-SCREEN END OF BLOCK bl01. 29 | 30 | SELECTION-SCREEN BEGIN OF BLOCK bl02 WITH FRAME TITLE text-002. 31 | 32 | PARAMETERS: p_01 RADIOBUTTON GROUP rb02, 33 | p_02 RADIOBUTTON GROUP rb02, 34 | p_03 RADIOBUTTON GROUP rb02, 35 | p_04 RADIOBUTTON GROUP rb02, 36 | p_05 RADIOBUTTON GROUP rb02, 37 | p_06 RADIOBUTTON GROUP rb02, 38 | p_07 RADIOBUTTON GROUP rb02, 39 | p_08 RADIOBUTTON GROUP rb02, 40 | p_09 RADIOBUTTON GROUP rb02, 41 | p_10 RADIOBUTTON GROUP rb02, 42 | p_11 RADIOBUTTON GROUP rb02, 43 | p_12 RADIOBUTTON GROUP rb02, 44 | p_13 RADIOBUTTON GROUP rb02, 45 | p_14 RADIOBUTTON GROUP rb02. 46 | 47 | SELECTION-SCREEN END OF BLOCK bl02. 48 | *--------------------------------------------------------------------* 49 | * Class - Examples Handler 50 | *--------------------------------------------------------------------* 51 | CLASS lcl_compare DEFINITION. 52 | 53 | PUBLIC SECTION. 54 | METHODS constructor IMPORTING comptype TYPE char5. 55 | METHODS compare_command IMPORTING compnum TYPE char2. 56 | 57 | PRIVATE SECTION. 58 | TYPES: BEGIN OF ty_sbook, 59 | carrid TYPE sbook-carrid, 60 | connid TYPE sbook-connid, 61 | fldate TYPE sbook-fldate, 62 | bookid TYPE sbook-bookid, 63 | passname TYPE sbook-passname, 64 | END OF ty_sbook. 65 | 66 | TYPES: BEGIN OF ty_sflight, 67 | carrid TYPE sflight-carrid, 68 | connid TYPE sflight-connid, 69 | END OF ty_sflight. 70 | 71 | DATA: v_test1 TYPE char1, 72 | v_test2 TYPE char1. 73 | 74 | DATA: t_sflight TYPE TABLE OF ty_sflight, 75 | t_sbook TYPE TABLE OF ty_sbook, 76 | t_sbook_aux TYPE TABLE OF ty_sbook, 77 | lwa_sflight LIKE LINE OF t_sflight, 78 | lwa_sbook LIKE LINE OF t_sbook. 79 | 80 | METHODS command_01 IMPORTING test1 TYPE char1 OPTIONAL 81 | test2 TYPE char1 OPTIONAL. 82 | METHODS command_02 IMPORTING test1 TYPE char1 OPTIONAL 83 | test2 TYPE char1 OPTIONAL. 84 | METHODS command_03 IMPORTING test1 TYPE char1 OPTIONAL 85 | test2 TYPE char1 OPTIONAL. 86 | METHODS command_04 IMPORTING test1 TYPE char1 OPTIONAL 87 | test2 TYPE char1 OPTIONAL. 88 | METHODS command_05 IMPORTING test1 TYPE char1 OPTIONAL 89 | test2 TYPE char1 OPTIONAL. 90 | METHODS command_06 IMPORTING test1 TYPE char1 OPTIONAL 91 | test2 TYPE char1 OPTIONAL. 92 | METHODS command_07 IMPORTING test1 TYPE char1 OPTIONAL 93 | test2 TYPE char1 OPTIONAL. 94 | METHODS command_08 IMPORTING test1 TYPE char1 OPTIONAL 95 | test2 TYPE char1 OPTIONAL. 96 | METHODS command_09 IMPORTING test1 TYPE char1 OPTIONAL 97 | test2 TYPE char1 OPTIONAL. 98 | METHODS command_10 IMPORTING test1 TYPE char1 OPTIONAL 99 | test2 TYPE char1 OPTIONAL. 100 | METHODS command_11 IMPORTING test1 TYPE char1 OPTIONAL 101 | test2 TYPE char1 OPTIONAL. 102 | METHODS command_12 IMPORTING test1 TYPE char1 OPTIONAL 103 | test2 TYPE char1 OPTIONAL. 104 | METHODS command_13 IMPORTING test1 TYPE char1 OPTIONAL 105 | test2 TYPE char1 OPTIONAL. 106 | METHODS command_14 IMPORTING test1 TYPE char1 OPTIONAL 107 | test2 TYPE char1 OPTIONAL. 108 | 109 | ENDCLASS. "lcl_compare DEFINITION 110 | 111 | *----------------------------------------------------------------------* 112 | * CLASS lcl_compare IMPLEMENTATION 113 | *----------------------------------------------------------------------* 114 | * 115 | *----------------------------------------------------------------------* 116 | CLASS lcl_compare IMPLEMENTATION. 117 | 118 | METHOD constructor. 119 | 120 | CASE comptype. 121 | WHEN 'TEST1'. 122 | me->v_test1 = 'X'. 123 | WHEN 'TEST2'. 124 | me->v_test2 = 'X'. 125 | WHEN 'BOTH'. 126 | me->v_test1 = 'X'. 127 | me->v_test2 = 'X'. 128 | ENDCASE. 129 | 130 | ENDMETHOD. "constructor 131 | 132 | METHOD compare_command. 133 | 134 | DATA: l_methname TYPE string. 135 | 136 | DATA: l_before TYPE timestampl, 137 | l_after TYPE timestampl, 138 | l_result TYPE timestampl. 139 | 140 | CONCATENATE 'COMMAND_' compnum INTO l_methname. 141 | 142 | IF me->v_test1 = 'X'. 143 | SKIP 1. 144 | GET TIME STAMP FIELD l_before. 145 | CALL METHOD me->(l_methname) 146 | EXPORTING 147 | test1 = 'X'. 148 | GET TIME STAMP FIELD l_after. 149 | l_result = l_after - l_before. 150 | WRITE: 'Test 1 Duration: ' COLOR COL_GROUP, 151 | 50 l_result. 152 | SKIP 1. 153 | ENDIF. 154 | 155 | CLEAR: l_result, l_after, l_before. 156 | 157 | IF me->v_test2 = 'X'. 158 | GET TIME STAMP FIELD l_before. 159 | CALL METHOD me->(l_methname) 160 | EXPORTING 161 | test2 = 'X'. 162 | GET TIME STAMP FIELD l_after. 163 | l_result = l_after - l_before. 164 | WRITE: 'Test 2 Duration: ' COLOR COL_POSITIVE, 165 | 50 l_result. 166 | ENDIF. 167 | 168 | ENDMETHOD. "compare_command 169 | 170 | METHOD command_01. 171 | *--------------------------------------------------------------------* 172 | * Select..EndSelect vs. Array Fetch 173 | *--------------------------------------------------------------------* 174 | CASE 'X'. 175 | 176 | * SELECT...ENDSELECT 177 | WHEN test1. 178 | 179 | SELECT carrid 180 | connid 181 | fldate 182 | bookid 183 | FROM sbook 184 | UP TO 30000 ROWS 185 | INTO lwa_sbook. 186 | APPEND lwa_sbook TO t_sbook. 187 | ENDSELECT. 188 | 189 | * ARRAY FETCH 190 | WHEN test2. 191 | 192 | SELECT carrid 193 | connid 194 | fldate 195 | bookid 196 | FROM sbook 197 | INTO TABLE t_sbook 198 | UP TO 30000 ROWS. 199 | 200 | ENDCASE. 201 | 202 | ENDMETHOD. "command_01 203 | 204 | METHOD command_02. 205 | *--------------------------------------------------------------------* 206 | * RANGEs - CAUTION! 207 | *--------------------------------------------------------------------* 208 | DATA: rg_carrid TYPE RANGE OF sbook-carrid, 209 | lwa_carrid LIKE LINE OF rg_carrid. 210 | 211 | CASE 'X'. 212 | 213 | * Not Equal! Caution! 214 | WHEN test1. 215 | 216 | lwa_carrid-low = 'JP'. 217 | lwa_carrid-option = 'NE'. 218 | lwa_carrid-sign = 'I'. 219 | APPEND lwa_carrid TO rg_carrid. 220 | 221 | * Equal - OK 222 | WHEN test2. 223 | 224 | lwa_carrid-low = 'JP'. 225 | lwa_carrid-option = 'EQ'. 226 | lwa_carrid-sign = 'I'. 227 | APPEND lwa_carrid TO rg_carrid. 228 | 229 | ENDCASE. 230 | 231 | SELECT carrid 232 | connid 233 | fldate 234 | bookid 235 | FROM sbook 236 | INTO TABLE t_sbook 237 | UP TO 50000 ROWS 238 | WHERE carrid IN rg_carrid. 239 | 240 | ENDMETHOD. "command_02 241 | 242 | METHOD command_03. 243 | *--------------------------------------------------------------------* 244 | * FOR ALL ENTRIES vs. INNER JOIN 245 | *--------------------------------------------------------------------* 246 | CASE 'X'. 247 | 248 | * FOR ALL ENTRIES 249 | WHEN test1. 250 | 251 | SELECT carrid 252 | connid 253 | FROM sflight 254 | INTO TABLE t_sflight 255 | WHERE carrid = 'AA'. 256 | 257 | DELETE ADJACENT DUPLICATES FROM t_sflight 258 | COMPARING carrid connid. 259 | 260 | SELECT carrid 261 | connid 262 | fldate 263 | bookid 264 | FROM sbook 265 | INTO TABLE t_sbook 266 | UP TO 10000 ROWS 267 | FOR ALL ENTRIES IN t_sflight 268 | WHERE carrid = t_sflight-carrid 269 | AND connid = t_sflight-connid. 270 | 271 | * INNER JOIN 272 | WHEN test2. 273 | 274 | SELECT a~carrid 275 | a~connid 276 | b~fldate 277 | b~bookid 278 | FROM sflight AS a INNER JOIN sbook AS b 279 | ON a~carrid = b~carrid AND 280 | a~connid = b~connid 281 | INTO TABLE t_sbook 282 | UP TO 10000 ROWS 283 | WHERE a~carrid = 'AA'. 284 | 285 | ENDCASE. 286 | 287 | ENDMETHOD. "command_03 288 | 289 | METHOD command_04. 290 | *--------------------------------------------------------------------* 291 | * READ TABLE WITHOUT BINARY SEARCH 292 | *--------------------------------------------------------------------* 293 | SELECT carrid 294 | connid 295 | FROM sflight 296 | INTO TABLE t_sflight 297 | WHERE carrid = 'AA'. 298 | 299 | SELECT carrid 300 | connid 301 | fldate 302 | bookid 303 | FROM sbook 304 | INTO TABLE t_sbook 305 | UP TO 500000 ROWS 306 | WHERE carrid = 'AA'. 307 | 308 | CASE 'X'. 309 | 310 | * READ TABLE 311 | WHEN test1. 312 | LOOP AT t_sbook INTO lwa_sbook. 313 | READ TABLE t_sflight INTO lwa_sflight WITH KEY 314 | carrid = lwa_sbook-carrid 315 | connid = lwa_sbook-connid. 316 | ENDLOOP. 317 | 318 | * READ TABLE BINARY SEARCH 319 | WHEN test2. 320 | * Do not forget to SORT the table before BINARY SEARCH 321 | LOOP AT t_sbook INTO lwa_sbook. 322 | READ TABLE t_sflight INTO lwa_sflight WITH KEY 323 | carrid = lwa_sbook-carrid 324 | connid = lwa_sbook-connid 325 | BINARY SEARCH. 326 | ENDLOOP. 327 | ENDCASE. 328 | 329 | ENDMETHOD. "command_04 330 | 331 | METHOD command_05. 332 | *--------------------------------------------------------------------* 333 | * Select inside LOOP Statement 334 | *--------------------------------------------------------------------* 335 | SELECT carrid 336 | connid 337 | fldate 338 | bookid 339 | FROM sbook 340 | INTO TABLE t_sbook 341 | UP TO 200000 ROWS 342 | WHERE carrid = 'AA'. 343 | 344 | CASE 'X'. 345 | 346 | * SELECT inside LOOPs 347 | WHEN test1. 348 | 349 | LOOP AT t_sbook INTO lwa_sbook. 350 | SELECT SINGLE carrid 351 | connid 352 | FROM sflight 353 | INTO lwa_sflight 354 | WHERE carrid = lwa_sbook-carrid 355 | AND connid = lwa_sbook-connid. 356 | 357 | ENDLOOP. 358 | 359 | * SELECT without LOOPs 360 | WHEN test2. 361 | 362 | t_sbook_aux[] = t_sbook[]. 363 | SORT t_sbook_aux BY carrid connid. 364 | DELETE ADJACENT DUPLICATES FROM t_sbook_aux 365 | COMPARING carrid 366 | connid. 367 | 368 | SELECT carrid 369 | connid 370 | FROM sflight 371 | INTO TABLE t_sflight 372 | FOR ALL ENTRIES IN t_sbook_aux 373 | WHERE carrid = t_sbook_aux-carrid 374 | AND connid = t_sbook_aux-connid. 375 | 376 | LOOP AT t_sbook INTO lwa_sbook. 377 | READ TABLE t_sflight INTO lwa_sflight WITH KEY 378 | carrid = lwa_sbook-carrid 379 | connid = lwa_sbook-connid 380 | BINARY SEARCH. 381 | ENDLOOP. 382 | 383 | ENDCASE. 384 | 385 | ENDMETHOD. "command_05 386 | 387 | METHOD command_06. 388 | *--------------------------------------------------------------------* 389 | * Massive Update to DB Tables 390 | * The same concept can be applied to INSERT, DELETE and UPDATE 391 | *--------------------------------------------------------------------* 392 | 393 | DATA: t_sbook TYPE TABLE OF sbook, 394 | lwa_sbook LIKE LINE OF t_sbook. 395 | 396 | SELECT * 397 | FROM sbook 398 | INTO TABLE t_sbook 399 | UP TO 100000 ROWS 400 | WHERE carrid = 'AA'. 401 | 402 | * MODIFY inside LOOPs 403 | CASE 'X'. 404 | WHEN test1. 405 | LOOP AT t_sbook INTO lwa_sbook. 406 | MODIFY sbook FROM lwa_sbook. 407 | ENDLOOP. 408 | 409 | * MODIFY From Table 410 | WHEN test2. 411 | MODIFY sbook FROM TABLE t_sbook. 412 | 413 | ENDCASE. 414 | 415 | ENDMETHOD. "command_06 416 | 417 | METHOD command_07. 418 | *--------------------------------------------------------------------* 419 | * SELECT INTO CORRESPODING FIELDS 420 | *--------------------------------------------------------------------* 421 | CASE 'X'. 422 | 423 | * SELECT INTO CORRESPONDING FIELDS 424 | WHEN test1. 425 | SELECT * 426 | FROM sbook 427 | INTO CORRESPONDING FIELDS OF TABLE t_sbook 428 | UP TO 100000 ROWS. 429 | 430 | * SELECT ARRAY FETCH 431 | WHEN test2. 432 | SELECT carrid 433 | connid 434 | fldate 435 | bookid 436 | FROM sbook 437 | INTO TABLE t_sbook 438 | UP TO 100000 ROWS. 439 | 440 | ENDCASE. 441 | 442 | ENDMETHOD. "command_07 443 | 444 | METHOD command_08. 445 | *--------------------------------------------------------------------* 446 | * LOOP WHERE vs. LOOP with BINARY SEARCH 447 | *--------------------------------------------------------------------* 448 | SELECT carrid 449 | connid 450 | fldate 451 | bookid 452 | FROM sbook 453 | INTO TABLE t_sbook 454 | UP TO 100000 ROWS. 455 | 456 | CASE 'X'. 457 | 458 | * LOOP WHERE 459 | WHEN test1. 460 | LOOP AT t_sbook INTO lwa_sbook WHERE carrid = 'AA'. 461 | ENDLOOP. 462 | 463 | * LOOP BINARY SEARCH 464 | WHEN test2. 465 | SORT t_sbook BY carrid. 466 | READ TABLE t_sbook INTO lwa_sbook WITH KEY 467 | carrid = 'AA' 468 | BINARY SEARCH. 469 | 470 | LOOP AT t_sbook INTO lwa_sbook FROM sy-tabix. 471 | IF lwa_sbook-carrid <> 'AA'. 472 | EXIT. 473 | ENDIF. 474 | ENDLOOP. 475 | 476 | ENDCASE. 477 | 478 | ENDMETHOD. "command_08 479 | 480 | METHOD command_09. 481 | *--------------------------------------------------------------------* 482 | * MOVE CORRESPONDING 483 | *--------------------------------------------------------------------* 484 | 485 | DATA: t_sbook TYPE TABLE OF sbook, 486 | lwa_sbook TYPE sbook. 487 | 488 | SELECT * 489 | FROM sbook 490 | INTO TABLE t_sbook 491 | UP TO 200000 ROWS. 492 | 493 | * MOVE CORRESPODING 494 | CASE 'X'. 495 | WHEN test1. 496 | 497 | LOOP AT t_sbook INTO lwa_sbook. 498 | MOVE-CORRESPONDING lwa_sbook TO lwa_sflight. 499 | ENDLOOP. 500 | 501 | * MOVE SPECIFYING FIELDS 502 | WHEN test2. 503 | 504 | LOOP AT t_sbook INTO lwa_sbook. 505 | lwa_sflight-carrid = lwa_sbook-carrid. 506 | lwa_sflight-connid = lwa_sbook-connid. 507 | ENDLOOP. 508 | ENDCASE. 509 | 510 | ENDMETHOD. "command_09 511 | 512 | METHOD command_10. 513 | *--------------------------------------------------------------------* 514 | * INDEX EXAMPLES 515 | *--------------------------------------------------------------------* 516 | 517 | DATA: rg_buspart TYPE RANGE OF s_buspanum, 518 | lwa_buspart LIKE LINE OF rg_buspart. 519 | 520 | lwa_buspart-sign = 'I'. 521 | lwa_buspart-option = 'EQ'. 522 | lwa_buspart-low = '00003640'. 523 | APPEND lwa_buspart TO rg_buspart. 524 | 525 | CASE 'X'. 526 | 527 | * INDEX USAGE EXAMPLE 528 | WHEN test1. 529 | 530 | SELECT carrid 531 | connid 532 | fldate 533 | bookid 534 | FROM sbook 535 | INTO TABLE t_sbook 536 | UP TO 200000 ROWS 537 | WHERE agencynum IN rg_buspart. 538 | 539 | * ANOTHER INDEX USAGE EXAMPLE 540 | WHEN test2. 541 | 542 | SELECT carrid 543 | connid 544 | fldate 545 | bookid 546 | FROM sbook 547 | INTO TABLE t_sbook 548 | UP TO 200000 ROWS 549 | WHERE customid IN rg_buspart. 550 | 551 | ENDCASE. 552 | 553 | ENDMETHOD. "command_10 554 | 555 | METHOD command_11. 556 | 557 | *--------------------------------------------------------------------* 558 | * INNER JOIN PARTIAL KEY vs INNER JOIN FULL PRIMARY KEY 559 | *--------------------------------------------------------------------* 560 | 561 | CASE 'X'. 562 | 563 | * INNER JOIN PARTIAL KEY 564 | WHEN test1. 565 | 566 | SELECT a~carrid 567 | a~connid 568 | b~fldate 569 | b~bookid 570 | FROM sflight AS a INNER JOIN sbook AS b 571 | ON a~carrid = b~carrid" AND 572 | * a~connid = b~connid 573 | INTO TABLE t_sbook 574 | UP TO 100000 ROWS 575 | WHERE a~carrid = 'AA'. 576 | 577 | * INNER JOIN FULL PRIMARY KEY 578 | WHEN test2. 579 | 580 | SELECT a~carrid 581 | a~connid 582 | b~fldate 583 | b~bookid 584 | FROM sflight AS a INNER JOIN sbook AS b 585 | ON a~carrid = b~carrid AND 586 | a~connid = b~connid 587 | INTO TABLE t_sbook 588 | UP TO 100000 ROWS 589 | WHERE a~carrid = 'AA'. 590 | 591 | ENDCASE. 592 | 593 | ENDMETHOD. "command_11 594 | 595 | METHOD command_12. 596 | 597 | *--------------------------------------------------------------------* 598 | * LOOP ASSIGNING 599 | *--------------------------------------------------------------------* 600 | 601 | DATA: lwa_sbook LIKE LINE OF t_sbook. 602 | 603 | FIELD-SYMBOLS: LIKE LINE OF t_sbook. 604 | 605 | SELECT a~carrid 606 | a~connid 607 | b~fldate 608 | b~bookid 609 | FROM sflight AS a INNER JOIN sbook AS b 610 | ON a~carrid = b~carrid AND 611 | a~connid = b~connid 612 | INTO TABLE t_sbook 613 | UP TO 200000 ROWS 614 | WHERE a~carrid = 'AA'. 615 | 616 | CASE 'X'. 617 | 618 | * TEST 1 619 | WHEN test1. 620 | 621 | LOOP AT t_sbook INTO lwa_sbook. 622 | lwa_sbook-carrid = 'BB'. 623 | MODIFY t_sbook FROM lwa_sbook INDEX sy-tabix. 624 | ENDLOOP. 625 | 626 | * TEST 2 627 | WHEN test2. 628 | 629 | LOOP AT t_sbook ASSIGNING . 630 | -carrid = 'BB'. 631 | ENDLOOP. 632 | 633 | ENDCASE. 634 | 635 | ENDMETHOD. "command_12 636 | 637 | METHOD command_13. 638 | *--------------------------------------------------------------------* 639 | * SubQuery 640 | *--------------------------------------------------------------------* 641 | CASE 'X'. 642 | 643 | * TEST 1 644 | WHEN test1. 645 | 646 | SELECT carrid 647 | connid 648 | FROM sflight 649 | INTO TABLE t_sflight 650 | WHERE carrid = 'AA'. 651 | 652 | DELETE ADJACENT DUPLICATES FROM t_sflight 653 | COMPARING carrid connid. 654 | 655 | SELECT carrid 656 | connid 657 | fldate 658 | bookid 659 | FROM sbook 660 | INTO TABLE t_sbook 661 | UP TO 10000 ROWS 662 | FOR ALL ENTRIES IN t_sflight 663 | WHERE carrid = t_sflight-carrid 664 | AND connid = t_sflight-connid. 665 | 666 | * TEST 2 667 | WHEN test2. 668 | 669 | SELECT carrid 670 | connid 671 | fldate 672 | bookid 673 | FROM sbook 674 | INTO TABLE t_sbook 675 | UP TO 10000 ROWS 676 | WHERE EXISTS ( SELECT * 677 | FROM sflight 678 | WHERE carrid = 'AA' 679 | AND connid = sbook~connid ). 680 | ENDCASE. 681 | 682 | ENDMETHOD. "command_13 683 | 684 | METHOD command_14. 685 | *--------------------------------------------------------------------* 686 | * New Test 687 | *--------------------------------------------------------------------* 688 | CASE 'X'. 689 | 690 | * TEST 1 691 | WHEN test1. 692 | 693 | * TEST 2 694 | WHEN test2. 695 | 696 | ENDCASE. 697 | 698 | ENDMETHOD. "command_14 699 | 700 | ENDCLASS. "lcl_compare IMPLEMENTATION 701 | 702 | DATA: o_comp TYPE REF TO lcl_compare. 703 | DATA: v_comm TYPE char2. 704 | 705 | *--------------------------------------------------------------------* 706 | * Event INITIALIZATION 707 | *--------------------------------------------------------------------* 708 | INITIALIZATION. 709 | 710 | PERFORM f_create_texts. 711 | 712 | *&---------------------------------------------------------------------* 713 | *& Form F_CREATE_TEXTS 714 | *&---------------------------------------------------------------------* 715 | FORM f_create_texts . 716 | %_p_both_%_app_%-text = 'Run Both Examples'. 717 | %_p_test1_%_app_%-text = 'Run Test 1'. 718 | %_p_test2_%_app_%-text = 'Run Test 2'. 719 | %_p_01_%_app_%-text = '01: SELECT... ENDSELECT'. 720 | %_p_02_%_app_%-text = '02: RANGEs'. 721 | %_p_03_%_app_%-text = '03: F.A.E. vs INNER JOIN'. 722 | %_p_04_%_app_%-text = '04: READ TABLE Binary Search'. 723 | %_p_05_%_app_%-text = '05: SELECT inside LOOPs'. 724 | %_p_06_%_app_%-text = '06: Massive Update to DB '. 725 | %_p_07_%_app_%-text = '07: SELECT Into Corresponding F.'. 726 | %_p_08_%_app_%-text = '08: LOOP WHERE vs BINARY LOOP'. 727 | %_p_09_%_app_%-text = '09: MOVE-CORRESPONDING'. 728 | %_p_10_%_app_%-text = '10: Usage of Indexes'. 729 | %_p_11_%_app_%-text = '11: Inner Join Full vs Partial'. 730 | %_p_12_%_app_%-text = '12: Loop Assigning'. 731 | %_p_13_%_app_%-text = '13: Subquery'. 732 | %_p_14_%_app_%-text = '14: Place your test HERE!'. 733 | ENDFORM. " F_CREATE_TEXTS 734 | 735 | *--------------------------------------------------------------------* 736 | * Event Start-Of-Selection 737 | *--------------------------------------------------------------------* 738 | START-OF-SELECTION. 739 | 740 | CASE 'X'. 741 | WHEN p_test1. 742 | CREATE OBJECT o_comp 743 | EXPORTING 744 | comptype = 'TEST1'. 745 | WHEN p_test2. 746 | CREATE OBJECT o_comp 747 | EXPORTING 748 | comptype = 'TEST2'. 749 | WHEN p_both. 750 | CREATE OBJECT o_comp 751 | EXPORTING 752 | comptype = 'BOTH'. 753 | ENDCASE. 754 | 755 | CASE 'X'. 756 | WHEN p_01. 757 | v_comm = '01'. 758 | WHEN p_02. 759 | v_comm = '02'. 760 | WHEN p_03. 761 | v_comm = '03'. 762 | WHEN p_04. 763 | v_comm = '04'. 764 | WHEN p_05. 765 | v_comm = '05'. 766 | WHEN p_06. 767 | v_comm = '06'. 768 | WHEN p_07. 769 | v_comm = '07'. 770 | WHEN p_08. 771 | v_comm = '08'. 772 | WHEN p_09. 773 | v_comm = '09'. 774 | WHEN p_10. 775 | v_comm = '10'. 776 | WHEN p_11. 777 | v_comm = '11'. 778 | WHEN p_12. 779 | v_comm = '12'. 780 | WHEN p_13. 781 | v_comm = '13'. 782 | WHEN p_14. 783 | v_comm = '14'. 784 | ENDCASE. 785 | 786 | o_comp->compare_command( v_comm ). 787 | *----------------------------------------------------------------------* 788 | * === DISCLAIMER === * 789 | *----------------------------------------------------------------------* 790 | * This code is made only for study and reference purposes. It was not * 791 | * copied from any running program and it does not make references * 792 | * to any functional requirement. All code here was created based on * 793 | * the authors experience and creativity! Enjoy! * 794 | *----------------------------------------------------------------------* -------------------------------------------------------------------------------- /ABAP - Project Pattern/code.abap: -------------------------------------------------------------------------------- 1 | *----------------------------------------------------------------------* 2 | * === ABAP ZOMBIE PRESENTS === * 3 | *----------------------------------------------------------------------* 4 | * Title * 5 | *----------------------------------------------------------------------* 6 | * Description -> * 7 | * Date -> * 8 | * SAP Version -> * 9 | *----------------------------------------------------------------------* 10 | * ABAP Zombie Staff: Mauricio Roberto Cruz * 11 | * Mauro Cesar Laranjeira * 12 | * Priscila Slva * 13 | *----------------------------------------------------------------------* 14 | * Please, visit us at http://abapzombie.blog.br/ and drop a Comment! * 15 | *----------------------------------------------------------------------* 16 | 17 | * Types 18 | *-------------------------------------* 19 | 20 | 21 | * Objects 22 | *-------------------------------------* 23 | 24 | 25 | * Variables 26 | *--------------------------------------* 27 | 28 | 29 | * Internal Tables 30 | *--------------------------------------* 31 | 32 | 33 | * Work Area 34 | *--------------------------------------* 35 | 36 | 37 | * Field Symbols 38 | *--------------------------------------* 39 | 40 | 41 | 42 | * === SELECTION SCREEN === 43 | *----------------------------------------------------------------------- 44 | 45 | 46 | 47 | * === INITIALIZATION === 48 | *----------------------------------------------------------------------- 49 | 50 | 51 | 52 | * === AT SELECTION-SCREEN === 53 | *----------------------------------------------------------------------- 54 | 55 | 56 | 57 | * === START-OF-SELECTION === 58 | *----------------------------------------------------------------------- 59 | 60 | 61 | *----------------------------------------------------------------------* 62 | * === DISCLAIMER === * 63 | *----------------------------------------------------------------------* 64 | * This code is made only for study and reference purposes. It was not * 65 | * copied from any running program and it does not make references * 66 | * to any functional requirement. All code here was created based on * 67 | * the authors experience and creativity! Enjoy! * 68 | *----------------------------------------------------------------------* -------------------------------------------------------------------------------- /ABAP - RTTS/Casting.abap: -------------------------------------------------------------------------------- 1 | CLASS cl_celular DEFINITION. 2 | ENDCLASS. 3 | 4 | CLASS cl_iphone DEFINITION INHERITING FROM cl_celular. 5 | ENDCLASS. 6 | 7 | CLASS cl_galaxy DEFINITION INHERITING FROM cl_celular. 8 | ENDCLASS. 9 | 10 | CLASS cl_lumia DEFINITION INHERITING FROM cl_celular. 11 | ENDCLASS. 12 | 13 | DATA: o_celular TYPE REF TO cl_celular, "Classe Pai de Todas as outras 14 | o_iphone TYPE REF TO cl_iphone, 15 | o_galaxy TYPE REF TO cl_galaxy, 16 | o_lumia TYPE REF TO cl_lumia. 17 | 18 | CREATE OBJECT o_iphone. 19 | 20 | * Pai = Filho 21 | o_celular = o_iphone. 22 | 23 | * Filho = Pai. 24 | o_iphone ?= o_celular. 25 | 26 | * Com o ?=, o verificador permite que você faça a operação 27 | * por sua conta e risco. Se estiver errado, vai dar DUMP 28 | * e ele vai rir da sua cara. 29 | -------------------------------------------------------------------------------- /ABAP - RTTS/Criação de Variável - DDIC.abap: -------------------------------------------------------------------------------- 1 | DATA: datadescr TYPE REF TO cl_abap_datadescr. 2 | DATA: variavel TYPE REF TO data. 3 | 4 | FIELD-SYMBOLS: TYPE any. 5 | 6 | * Pelo describe_by_name, conseguimos mostar qual elemento de dados 7 | * o RTTS deve usar de referência para instanciar o objeto. 8 | datadescr ?= cl_abap_datadescr=>describe_by_name( 'MATNR' ). 9 | 10 | * Depois utilizamos o mesmo esquema para conseguir passar valor 11 | * para a variável 12 | CREATE DATA variavel TYPE HANDLE datadescr. 13 | ASSIGN variavel->* TO . 14 | 15 | * Se a exit de conversão estiver ativa, você verá o output 16 | * desse valor sem os zeros, afinal, o campo é um MATNR! 17 | = '000000000012345678'. 18 | WRITE . 19 | -------------------------------------------------------------------------------- /ABAP - RTTS/Criação de Variável - Estrutura.abap: -------------------------------------------------------------------------------- 1 | DATA: estrutura TYPE REF TO data. 2 | 3 | FIELD-SYMBOLS: TYPE any, 4 | TYPE any. 5 | 6 | DATA: structdescr TYPE REF TO cl_abap_structdescr. 7 | 8 | * O get da CL_ABAP_STRUCTDESCR tem um paramêtro chamado "P_COMPONENTS". 9 | * Não precisa ser nenhum PhD para entender o que precisamos fazer.. 10 | DATA: componentes TYPE abap_component_tab, 11 | componente LIKE LINE OF componentes. 12 | 13 | * A importância de entender o RTTS por "etapas" como estamos fazendo 14 | * vem agora. A estrutura de componentes tem um campo chamado "TYPE", que 15 | * aceita um objeto do tipo CL_ABAP_DATADESCR. Nós já aprendemos como 16 | * criar objetos que fazem referência a variáveis, certo? Então vamos 17 | * montar nossa estrutura! 18 | 19 | DATA: datadescr TYPE REF TO cl_abap_datadescr, 20 | elemdescr TYPE REF TO cl_abap_elemdescr. 21 | 22 | * Criando um campo CHAR de 10 23 | elemdescr = cl_abap_elemdescr=>get_c( 10 ). 24 | componente-name = 'CHAR_DE_10'. 25 | componente-type = elemdescr. 26 | APPEND componente TO componentes. 27 | 28 | * Criando um campo para a planta, com o elemento de dados WERKS_D 29 | datadescr ?= cl_abap_datadescr=>describe_by_name('WERKS_D'). 30 | componente-name = 'WERKS'. 31 | componente-type = datadescr. 32 | APPEND componente TO componentes. 33 | 34 | * Agora vamos criar nossa estrutura! 35 | structdescr = cl_abap_structdescr=>get( componentes ). 36 | 37 | * Mesmo esquema de sempre para poder acessá-la 38 | CREATE DATA estrutura TYPE HANDLE structdescr. 39 | ASSIGN estrutura->* TO . 40 | 41 | * Porem para acessar os campos e preenche-los, vamos utilizar o 42 | * ASSIGN COMPONENT utilizando um índice para indicar qual o campo 43 | * que queremos acessar 44 | ASSIGN COMPONENT 1 OF STRUCTURE TO . 45 | = '1234567890'. 46 | 47 | ASSIGN COMPONENT 2 OF STRUCTURE TO . 48 | = '3000'. 49 | 50 | * Pare aqui no debug e veja os valores preenchidos em :) 51 | BREAK-POINT. 52 | -------------------------------------------------------------------------------- /ABAP - RTTS/Criação de Variável - Máquina de Gerar Variáveis.abap: -------------------------------------------------------------------------------- 1 | DATA: elemdescr TYPE REF TO cl_abap_elemdescr. 2 | 3 | * Char 4 | elemdescr = cl_abap_elemdescr=>get_c( 10 ). 5 | PERFORM escreva_sei_la_o_que USING elemdescr '1234567890A'. 6 | 7 | * Inteiro 8 | elemdescr = cl_abap_elemdescr=>get_i( ). 9 | PERFORM escreva_sei_la_o_que USING elemdescr 123. 10 | 11 | * NumChar 12 | elemdescr = cl_abap_elemdescr=>get_n( 5 ). 13 | PERFORM escreva_sei_la_o_que USING elemdescr 987654. 14 | 15 | * String 16 | elemdescr = cl_abap_elemdescr=>get_string( ). 17 | PERFORM escreva_sei_la_o_que USING elemdescr 'Prevenindo Consultores e Virarem Zumbis'. 18 | 19 | * Packed com Decimais 20 | elemdescr = cl_abap_elemdescr=>get_p( p_length = 10 p_decimals = 5 ). 21 | PERFORM escreva_sei_la_o_que USING elemdescr '1234567890.12345' . 22 | 23 | *&---------------------------------------------------------------------* 24 | *& Form ESCREVA_SEI_LA_O_QUE 25 | *&---------------------------------------------------------------------* 26 | FORM escreva_sei_la_o_que USING p_elemdescr TYPE REF TO cl_abap_elemdescr 27 | p_seila. 28 | 29 | DATA: variavel TYPE REF TO data. 30 | 31 | FIELD-SYMBOLS TYPE any. 32 | 33 | CREATE DATA variavel TYPE HANDLE p_elemdescr. 34 | 35 | ASSIGN variavel->* TO . 36 | 37 | = p_seila. 38 | WRITE: /01 'Tipo:', 39 | 7 p_elemdescr->type_kind, 40 | 20 'Tamanho:', 41 | 35 p_elemdescr->length, 42 | 50 'Valor:', 43 | 60 . 44 | 45 | ENDFORM. " ESCREVA_SEI_LA_O_QUE 46 | -------------------------------------------------------------------------------- /ABAP - RTTS/Criação de Variável - Simples.abap: -------------------------------------------------------------------------------- 1 | DATA: elemdescr TYPE REF TO cl_abap_elemdescr. 2 | 3 | DATA: variavel TYPE REF TO data. 4 | 5 | FIELD-SYMBOLS TYPE any. 6 | 7 | * Criando uma variável CHAR de 18 posições. 8 | elemdescr = cl_abap_elemdescr=>get_c( 18 ). 9 | 10 | * Aqui a magia do TYPE HANDLE entra em ação. Ele foi 11 | * feito especialmente para funcionar com as classes do RTTS 12 | * O comando abaixo quer dizer: 13 | * CRIE uma variavel DO TIPO dessa classe rtts. 14 | CREATE DATA variavel TYPE HANDLE elemdescr. 15 | 16 | * Você não vai conseguir fazer mta coisa com a variável type ref to data. 17 | * Precisamos utilizar um fieldsymbol para manipular o valor. 18 | ASSIGN variavel->* TO . 19 | 20 | * Sao 18 posicoes, então o 9 teria que ser cortado. 21 | * Teste e veja se o output está correto! 22 | = '1234567890123456789'. 23 | WRITE . 24 | -------------------------------------------------------------------------------- /ABAP - RTTS/Criação de Variável - Tabela.abap: -------------------------------------------------------------------------------- 1 | DATA: tabela TYPE REF TO data, 2 | estrutura TYPE REF TO data. 3 | 4 | FIELD-SYMBOLS: TYPE standard table, 5 | TYPE any, 6 | TYPE any. 7 | 8 | DATA: structdescr TYPE REF TO cl_abap_structdescr, 9 | tabledescr TYPE REF TO cl_abap_tabledescr, 10 | datadescr TYPE REF TO cl_abap_datadescr, 11 | elemdescr TYPE REF TO cl_abap_elemdescr. 12 | 13 | DATA: componentes TYPE abap_component_tab, 14 | componente LIKE LINE OF componentes. 15 | 16 | *-- Criação da Estrutura Igual Exemplo Anterior: 17 | 18 | elemdescr = cl_abap_elemdescr=>get_c( 10 ). 19 | componente-name = 'CHAR_DE_10'. 20 | componente-type = elemdescr. 21 | APPEND componente TO componentes. 22 | 23 | datadescr ?= cl_abap_datadescr=>describe_by_name('WERKS_D'). 24 | componente-name = 'WERKS'. 25 | componente-type = datadescr. 26 | APPEND componente TO componentes. 27 | 28 | * Agora vamos criar nossa estrutura! 29 | structdescr = cl_abap_structdescr=>get( componentes ). 30 | 31 | * Mesmo esquema de sempre para poder acessá-la 32 | CREATE DATA estrutura TYPE HANDLE structdescr. 33 | ASSIGN estrutura->* TO . 34 | 35 | 36 | *-- Criação da Tabela 37 | 38 | * Ok, vamos criar essa tabela bunita. É claro que vamos utilizar o GET da 39 | * clase CL_ABAP_TABLEDESCR. Notou que tudo no RTTS segue o mesmo padrão 40 | * de funcionamento? 41 | 42 | * O parâmetro obrigatório se chama P_LINE_TYPE. Podemos passar nossa estrutura! 43 | tabledescr ?= cl_abap_tabledescr=>get( structdescr ). 44 | 45 | CREATE DATA tabela TYPE HANDLE tabledescr. 46 | ASSIGN tabela->* TO . 47 | 48 | * Você ainda pode dizer qual o tipo da tabela (SORTED, HASHED, STANDARD) e quais 49 | * os campos chaves da sua tabela interna. Experimente fuçar no método "get". 50 | 51 | 52 | 53 | *-- Preenchendo a tabela criada dinâmicamente 54 | 55 | * Neste caso, eu coloquei o field-symbol como TYPE STANDARD TABLE. Isso me permite 56 | * dar um APPEND da estrutura pois eu criei a tabela interna da 57 | * forma default (que é STANDARD TABLE). 58 | 59 | * Primeiro preechemos a estrutura: 60 | ASSIGN COMPONENT 1 OF STRUCTURE TO . 61 | = 'MATERIAL123'. 62 | 63 | ASSIGN COMPONENT 2 OF STRUCTURE TO . 64 | = 'SP01'. 65 | 66 | * Depois é só dar o append! 67 | APPEND TO . 68 | 69 | * Pare aqui no debug e veja a tabela criada de forma totalmente dinâmica, já 70 | * preenchida com uma linha! :) 71 | BREAK-POINT. 72 | -------------------------------------------------------------------------------- /ABAP - RTTS/Inspeção de Variável - Estrutura.abap: -------------------------------------------------------------------------------- 1 | DATA: estrutura TYPE mara. 2 | 3 | DATA: componentes TYPE cl_abap_structdescr=>component_table. 4 | 5 | DATA: structdescr TYPE REF TO cl_abap_structdescr, 6 | campodescr TYPE REF TO cl_abap_datadescr. 7 | 8 | FIELD-SYMBOLS LIKE LINE OF cl_abap_structdescr=>components. 9 | 10 | structdescr ?= cl_abap_structdescr=>describe_by_data( estrutura ). 11 | 12 | * Aqui você recebe a lista de todos os componentes da estrutura, com outros 13 | * objetos já referenciados de acordo com o tipo do campo. (abra no debug para entender) 14 | * Com isso você pode saber O QUE VOCÊ QUISER sobre QUALQUER CAMPO da estrutura. 15 | * Não é feitiçaria, é SAPLoLogia (só pra rimar) 16 | componentes = structdescr->get_components( ). 17 | 18 | * Vamos analisar um campo específico da estrutura: 19 | campodescr = structdescr->get_component_type( 'MATNR' ). "Troque o campo para experimentar!" 20 | WRITE: /01 'MATNR', 21 | 10 'É do tipo', 22 | 20 campodescr->type_kind. 23 | 24 | *Ah, mas tudo que eu quero é um lista dos campos e já era! 25 | LOOP AT structdescr->components ASSIGNING . 26 | * Tá, toma aí 27 | WRITE: /01 -name, 28 | 20 -decimals, 29 | 30 -length, 30 | 40 -type_kind, 31 | 50 sy-tabix. "posição na estrutura 32 | ENDLOOP. 33 | -------------------------------------------------------------------------------- /ABAP - RTTS/Inspeção de Variável - Simples.abap: -------------------------------------------------------------------------------- 1 | DATA: material TYPE mara-matnr, 2 | texto TYPE string. 3 | 4 | DATA: relative_name TYPE string. 5 | 6 | DATA: o_typedescr TYPE REF TO cl_abap_typedescr. 7 | 8 | DATA: x031l TYPE TABLE OF x031l, 9 | x030l TYPE x030l. 10 | 11 | * Criando o objeto para análise. Este objeto fará referência ao 12 | * tipo da variável "material". 13 | o_typedescr = cl_abap_typedescr=>describe_by_data( material ). 14 | 15 | * Nome absoluto contém o nome + identificador. No caso, será \TYPE=MATNR 16 | * que indica que este objeto é referente a um TYPE MATNR(elemento de dados). 17 | * Experimente trocar o tipo do campo para PSTAT, e você verá que o TYPE muda 18 | * para o elemento de dados, que é o PSTAT_D. 19 | WRITE / o_typedescr->absolute_name. 20 | 21 | * Nome utilizado para referência no programa. 22 | relative_name = o_typedescr->get_relative_name( ). 23 | WRITE / relative_name. 24 | 25 | * Métodos que só funcionam se o tipo referenciado veio do DDIC. 26 | * Se você trocar de "material" para "texto" na hora de chamar o 27 | * método describe_by_data, irá tomar um DUMP na cabeça. 28 | x031l[] = o_typedescr->get_ddic_object( ). 29 | x030l = o_typedescr->get_ddic_header( ). 30 | 31 | * Tipo da Variável, neste caso C de CHAR 32 | WRITE: / o_typedescr->type_kind. 33 | 34 | * Tamanho da variável, para o elemento de dados MATNR - 18 35 | WRITE: / o_typedescr->length. 36 | -------------------------------------------------------------------------------- /ABAP - RTTS/Inspeção de Variável - Tabela.abap: -------------------------------------------------------------------------------- 1 | DATA: tabela TYPE TABLE OF mara. 2 | 3 | DATA: tabledescr TYPE REF TO cl_abap_tabledescr, 4 | structdescr TYPE REF TO cl_abap_structdescr. 5 | 6 | FIELD-SYMBOLS LIKE LINE OF tabledescr->key. 7 | 8 | tabledescr ?= cl_abap_tabledescr=>describe_by_data( tabela ). 9 | 10 | * Vamos fuçar na linha da tabela 11 | structdescr ?= tabledescr->get_table_line_type( ). 12 | * Note que o programa faz um downcast do tipo que GET_TABLE_LINE_TYPE retorna para o 13 | * objeto STRUCTDESCR. 14 | * E aqui você pode usar o exemplo de estruturas para fuçar no objeto STRUCTDESCR. 15 | * [insira o código do exemplo anterior aqui] 16 | 17 | * Campos da tabela 18 | LOOP AT tabledescr->key ASSIGNING . 19 | WRITE / sy-tabix. "Posição do Campo 20 | WRITE 20 -name. "Números da Mega-Sena (quem sabe assim algúem testa este exemplo!) 21 | ENDLOOP. 22 | 23 | * Tem mais um monte de atributos que descrevem outras coisas da tabela 24 | * interna. Explore! 25 | -------------------------------------------------------------------------------- /ABAP - Removing Invalid Characters with Example/code.abap: -------------------------------------------------------------------------------- 1 | *----------------------------------------------------------------------* 2 | * === ABAP ZOMBIE PRESENTS === * 3 | *----------------------------------------------------------------------* 4 | * Selection Screen Examples * 5 | *----------------------------------------------------------------------* 6 | * Description -> Small code to handle characters removal in strings * 7 | * Date -> Jan 21th, 2010 * 8 | * SAP Version -> 6.0 * 9 | *----------------------------------------------------------------------* 10 | * ABAP Zombie Staff: Mauricio Roberto Cruz * 11 | * Mauro Cesar Laranjeira * 12 | *----------------------------------------------------------------------* 13 | * Please, visit us at http://abapzombie.blog.br/ and drop a Comment! * 14 | *----------------------------------------------------------------------* 15 | 16 | *&---------------------------------------------------------------------* 17 | *& Include ZAZ_REMOVE_CHARACTERS 18 | *&---------------------------------------------------------------------* 19 | 20 | *----------------------------------------------------------------------* 21 | * CLASS lcl_converte_caracter DEFINITION 22 | *----------------------------------------------------------------------* 23 | * 24 | *----------------------------------------------------------------------* 25 | CLASS lcl_converte_caracter DEFINITION. 26 | 27 | PUBLIC SECTION. 28 | 29 | METHODS remove_char_mass IMPORTING value(char_remove) TYPE string 30 | no_blanks TYPE c OPTIONAL 31 | CHANGING string TYPE string. 32 | 33 | METHODS remove_char_single IMPORTING value(char_remove) TYPE char1 34 | CHANGING string TYPE string. 35 | 36 | 37 | PRIVATE SECTION. 38 | 39 | ENDCLASS. "lcl_converte_caracter DEFINITION 40 | 41 | *----------------------------------------------------------------------* 42 | * CLASS lcl_converte_caracter IMPLEMENTATION 43 | *----------------------------------------------------------------------* 44 | * 45 | *----------------------------------------------------------------------* 46 | CLASS lcl_converte_caracter IMPLEMENTATION. 47 | 48 | * Remove all special characters at once. They're all replaced by 49 | * spaces (blanks can be removed using no_blanks). 50 | *--------------------------------------------------------------------* 51 | METHOD remove_char_mass. 52 | 53 | DATA: l_pos_remove TYPE i, 54 | l_remove TYPE string. 55 | 56 | CONDENSE char_remove NO-GAPS. 57 | 58 | * Create PATTERN to be used in translate 59 | * Special Characters will be turned into Spaces. 60 | WHILE l_pos_remove < STRLEN( char_remove ). 61 | 62 | CONCATENATE l_remove char_remove+l_pos_remove(1) space 63 | INTO l_remove 64 | RESPECTING BLANKS. 65 | ADD 1 TO l_pos_remove. 66 | 67 | ENDWHILE. 68 | 69 | * Remove all special characteres 70 | TRANSLATE string USING l_remove. 71 | 72 | * Check if blanks must stay. 73 | IF NOT no_blanks IS INITIAL. 74 | CONDENSE string NO-GAPS. 75 | ENDIF. 76 | 77 | ENDMETHOD. "remove_char_mass 78 | 79 | * Removes the special character completely, leaving no blanks 80 | *--------------------------------------------------------------------* 81 | METHOD remove_char_single. 82 | 83 | DATA: wa_result TYPE match_result. 84 | DATA: l_offset TYPE i. 85 | 86 | * Remove the special character completely, leaving no blanks 87 | WHILE sy-subrc = 0. 88 | 89 | FIND char_remove IN string RESULTS wa_result. 90 | 91 | IF sy-subrc = 0. 92 | l_offset = wa_result-offset + 1. 93 | CONCATENATE string(wa_result-offset) string+l_offset 94 | INTO string. 95 | ENDIF. 96 | 97 | ENDWHILE. 98 | 99 | ENDMETHOD. "remove_char_single 100 | 101 | ENDCLASS. "lcl_converte_caracter IMPLEMENTATION 102 | 103 | *----------------------------------------------------------------------* 104 | * === DISCLAIMER === * 105 | *----------------------------------------------------------------------* 106 | * This code is made only for study and reference purposes. It was not * 107 | * copied from any running program and it does not make references * 108 | * to any functional requirement. All code here was created based on * 109 | * the authors experience and creativity! Enjoy! * 110 | *----------------------------------------------------------------------* -------------------------------------------------------------------------------- /ABAP - Removing Invalid Characters with Example/example.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - Removing Invalid Characters with Example/example.abap -------------------------------------------------------------------------------- /ABAP - SORT tables using BINARY SEARCH (no SORT command)/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - SORT tables using BINARY SEARCH (no SORT command)/code.abap -------------------------------------------------------------------------------- /ABAP - Standard Exception Classes/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - Standard Exception Classes/code.abap -------------------------------------------------------------------------------- /ABAP - TVARV Class and Example/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - TVARV Class and Example/code.abap -------------------------------------------------------------------------------- /ABAP - TVARV Class and Example/example.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - TVARV Class and Example/example.abap -------------------------------------------------------------------------------- /ABAP - Using OLE for Microsoft Word/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ABAP - Using OLE for Microsoft Word/code.abap -------------------------------------------------------------------------------- /ALV - ALV's consistency check/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ALV - ALV's consistency check/code.abap -------------------------------------------------------------------------------- /ALV - Reusing Standard ALVs/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/ALV - Reusing Standard ALVs/code.abap -------------------------------------------------------------------------------- /CRM BOL - Alert Modeler/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/CRM BOL - Alert Modeler/code.abap -------------------------------------------------------------------------------- /CRM BOL - Dynamic Query/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/CRM BOL - Dynamic Query/code.abap -------------------------------------------------------------------------------- /CRM BOL - Get Entities/code.abap: -------------------------------------------------------------------------------- 1 | DATA: o_controller TYPE REF TO cl_crmcmp_b_cucobupa_impl, 2 | o_entity TYPE REF TO cl_crm_bol_entity. 3 | 4 | o_controller ?= me->get_custom_controller( 'GLOBAL.CRMCMP_BPIDENT/CuCoBuPa' ). 5 | 6 | o_entity ?= o_controller->typed_context->customers->collection_wrapper->get_current( ). -------------------------------------------------------------------------------- /CRM BOL - Messages/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/CRM BOL - Messages/code.abap -------------------------------------------------------------------------------- /CRM BOL - Relationship/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/CRM BOL - Relationship/code.abap -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | :warning: _Most of these examples were created 10+ years ago and are being kept here for reference purposes (tons of legacy code out there, right?). If you want to tackle any of these problems, you should first try looking for modern APIs on newer ABAP versions ([this](https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/index.htm) is a good start)._ 3 | 4 | ABAPZombie-Code-Library 5 | ======================= 6 | 7 | This repository contains all examples from on our website. 8 | 9 | If you need further information about any code, search for the appropriate post at www.abapzombie.com 10 | 11 | Contact us for suggestions: contato@abapzombie.com 12 | -------------------------------------------------------------------------------- /Security - Dynamic Code Generation/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Security - Dynamic Code Generation/code.abap -------------------------------------------------------------------------------- /Security - Kernel Calls/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Security - Kernel Calls/code.abap -------------------------------------------------------------------------------- /Security - OS Commands/code.abap: -------------------------------------------------------------------------------- 1 | DATA: lv_param LIKE sxpgcolist-parameters. 2 | 3 | lv_param = '/pasta/arquivo.txt'. 4 | 5 | CALL FUNCTION 'SXPG_COMMAND_EXECUTE' 6 | EXPORTING 7 | commandname = 'ZCHMOD' 8 | additional_parameters = lv_param 9 | EXCEPTIONS 10 | no_permission = 1 11 | command_not_found = 2 12 | parameters_too_long = 3 13 | security_risk = 4 14 | wrong_check_call_interface = 5 15 | program_start_error = 6 16 | program_termination_error = 7 17 | x_error = 8 18 | parameter_expected = 9 19 | too_many_parameters = 10 20 | illegal_command = 11 21 | wrong_asynchronous_parameters = 12 22 | cant_enq_tbtco_entry = 13 23 | jobcount_generation_error = 14 24 | OTHERS = 15. -------------------------------------------------------------------------------- /Security - Virus Scan Interface/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Security - Virus Scan Interface/code.abap -------------------------------------------------------------------------------- /Selection Screen - Buttons/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selection Screen - Buttons/code.abap -------------------------------------------------------------------------------- /Selection Screen - Hide Elements/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selection Screen - Hide Elements/code.abap -------------------------------------------------------------------------------- /Selection Screen - New Screen/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selection Screen - New Screen/code.abap -------------------------------------------------------------------------------- /Selection Screen - Tabstrip/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selection Screen - Tabstrip/code.abap -------------------------------------------------------------------------------- /Selection Screen - Useful Stuff/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selection Screen - Useful Stuff/code.abap -------------------------------------------------------------------------------- /Selects - Dynamic Selection/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selects - Dynamic Selection/code.abap -------------------------------------------------------------------------------- /Selects - Testing WHERE clauses/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Selects - Testing WHERE clauses/code.abap -------------------------------------------------------------------------------- /Webdynpro - Dynamic MIME content from AS Cache/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Webdynpro - Dynamic MIME content from AS Cache/code.abap -------------------------------------------------------------------------------- /Webdynpro - Get URL/code.abap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/abapzombie/ABAPZombie-Code-Library/11f0d391d865fdf16cb41fb523431c6980de88c7/Webdynpro - Get URL/code.abap --------------------------------------------------------------------------------