VALUE и параллельные курсоры
Техника параллельных курсоров (индексов) при обработке вложенных таблиц позволяет существенно увеличить производительность при обходе внутренних таблиц, в простейшем виде это выглядит следующим образом:
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 |
SORT: it_vbak BY vbeln, it_vbap BY vbeln. LOOP AT it_vbak ASSIGNING <ls_vbak>. READ TABLE it_vbap TRANSPORTING NO FIELDS WITH KEY vbeln = <ls_vbak>-vbeln BINARY SEARCH. lv_tabix = sy-tabix. LOOP AT it_vbap FROM lv_tabix ASSIGNING <ls_vbap> . IF <ls_vbap>-vbeln <> <ls_vbak>-vbeln. EXIT. ENDIF. ENDLOOP. ENDLOOP. " Или без READ SORT: it_vbak BY vbeln, it_vbap BY vbeln. lv_tabix = 1. LOOP AT it_vbak ASSIGNING <ls_vbak>. LOOP AT it_vbap FROM lv_tabix ASSIGNING <ls_vbap>. IF <ls_vbak>-vbeln <> <ls_vbap>-vbeln. lv_tabix = sy-tabix. EXIT. ENDIF. ENDLOOP. ENDLOOP. |
Используя оператор VALUE мы так же можем прибегать к этой технике:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
" Через Until DATA(lt_table) = VALUE ty_t_data( FOR <ls_vbak> IN lt_vbak FOR i = line_index( lt_vbap[ vbeln = <ls_vbak>-vbeln ] ) UNTIL i = 0 OR i > lines( lt_vbap ) OR lt_vbap[ i ]-vbeln <> <ls_vbak>-vbeln ( vbeln = <ls_vbak>-vbeln posnr = VALUE #( lt_vbap[ i ]-posnr OPTIONAL ) ) ). " Или через While DATA(lt_table) = VALUE ty_t_data( FOR <ls_vbak> IN lt_vbak FOR i = line_index( lt_vbap[ vbeln = <ls_vbak>-vbeln ] ) WHILE i <> 0 AND i <= lines( lt_vbap ) AND lt_vbap[ i ]-vbeln = <ls_vbak>-vbeln ( vbeln = <ls_vbak>-vbeln posnr = VALUE #( lt_vbap[ i ]-posnr OPTIONAL ) ) ). |