20240106

FILTER

  METHOD tamplates_1 .

*   String template
*    x = |...literal...{expression}\...control characters...|

    WRITE:'*** FILTER'.
    WRITE:'*** Permite filtrar o conteúdo de '.
    WRITE:'*** uma tabela interna'.

    WRITE:'.'.
    WRITE:'.'.

    WRITE:'    T2 = FILTER#(T1 WHERE...)'.
    WRITE:/ |.|.



    ULINE.

  ENDMETHOD.










***
***   Exemplo Simples
***
  METHOD tamplates_2 .

    WRITE:'*** tamplates_2 - Forma Básica' .

**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).

*    sort t_kna1 by kunnr.

    data(t_20e30FILTER #(
                      t_kna1
                      WHERE kunnr <> '0000000010'
    ).



    LOOP AT t_20e30 INTO DATA(ls_20e30).
       write:/ |KUNNR{ ls_20e30-kunnr } NAME1{ ls_20e30-name1 }| .
    ENDLOOP.
    WRITE:/ |.|.

    ULINE.

  ENDMETHOD.







***
*** Literal + expression
***
  METHOD tamplates_3 .

    WRITE:'*** tamplates_3 - Com Filter table' .

**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).


*   Tabeela de Filtro
    DATA t_filter TYPE SORTED TABLE OF y_kna1-kunnr
           WITH UNIQUE KEY table_line.


*   preenchendo a tabela de filtro
    t_filter VALUE #(
                 '0000000010' )
                 '0000000020' )
    ).


*   Gerando a nova tabela com a utilização da tabela de filtro
    data(t_20e30FILTER #(
                      t_kna1 in t_filter
                      WHERE kunnr table_line
    ).



    LOOP AT t_20e30 INTO DATA(ls_20e30).
       write:/ |KUNNR{ ls_20e30-kunnr } NAME1{ ls_20e30-name1 }| .
    ENDLOOP.
    WRITE:/ |.|.

    ULINE.


  ENDMETHOD.







***
***
***
  METHOD tamplates_4 .

    WRITE:'*** tamplates_4 - Cláusula EXCEPT' .
    WRITE:'*** PIOR performance' .



**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).


*   Tabeela de Filtro
    DATA t_filter TYPE SORTED TABLE OF y_kna1-kunnr
           WITH UNIQUE KEY table_line.


*   preenchendo a tabela de filtro
    t_filter VALUE #(
                 '0000000020' )
    ).


*   Gerando a nova tabela com a utilização da tabela de filtro
    data(t_20e30FILTER #(
                      t_kna1 EXCEPT IN t_filter
                      WHERE kunnr table_line
    ).



    LOOP AT t_20e30 INTO DATA(ls_20e30).
       write:/ |KUNNR{ ls_20e30-kunnr } NAME1{ ls_20e30-name1 }| .
    ENDLOOP.
    WRITE:/ |.|.


    ULINE.



  ENDMETHOD.







***
***
***
  METHOD tamplates_5 .

    WRITE:'*** tamplates_5 - Com Filter (2/2)'.
    WRITE:'*** PRECISA DE UM ÍNDICE'.



**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).


*   Tabeela de Filtro
    DATA t_filter2 TYPE SORTED TABLE OF y_kna1-kunnr
         WITH UNIQUE KEY table_line.


*   preenchendo a tabela de filtro
    t_filter2 VALUE #(
                 '0000000020' )
                 '0000000030' )
    ).


*   Gerando a nova tabela COM a utilização do FILTER
    data(t_20e30FILTER #(
                      t_kna1 in t_filter2
                      WHERE kunnr table_line
    ).


*   Lista os regisros filrados
    LOOP AT t_20e30 INTO DATA(ls_20e30).
       write:/ |KUNNR{ ls_20e30-kunnr } NAME1{ ls_20e30-name1 }| .
    ENDLOOP.
    WRITE:/ |.|.



    ULINE.


  ENDMETHOD.







***
***
***
  METHOD tamplates_6 .

    WRITE:'*** tamplates_6 - NÃO COMPILA, POIS NÃO TEM ÍNDICE PARA O CAMPO NAME1'.
    WRITE:'.'.

**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).


*   Gerando a nova tabela COM a utilização do FILTER
*    data(t_20e30) = FILTER #(
*                      t_kna1
*                      WHERE name1 <> CONV #( 'Cliente Dez' )
*    ).


*   Lista os regisros filrados
    WRITE:/ | data(t_20e30FILTER #|.
    WRITE:/ |         t_kna1 |.
    WRITE:/ |         WHERE name1 <> CONV #'Cliente Dez' )|.
    WRITE:/ |         )|.
    WRITE:/ |.|.



    ULINE.



  ENDMETHOD.







***
***
***
  METHOD tamplates_7 .

    WRITE:'*** tamplates_7 - Criado MAIS UM ÍNDICE (NAME1)'.
    WRITE:'.'.

**  Definições
    typesbegin of y_kna1,
             kunnr      type kunnr,
             name1      type name1,
           end of y_kna1,

           y_t_kna1    type SORTED TABLE OF y_kna1
             WITH NON-UNIQUE KEY kunnr
             WITH NON-UNIQUE SORTED KEY name1 COMPONENTS name1.


**  Preenchendo a tabela interna
    data(t_kna1VALUE y_t_kna1(
                     kunnr '0000000010' name1 'Cliente Dez' )
                     kunnr '0000000020' name1 'Cliente Vinte' )
                     kunnr '0000000030' name1 'Cliente Trinta' )
    ).


*   Gerando a nova tabela COM a utilização do FILTER
    data(t_20e30FILTER #(
                      t_kna1 USING KEY name1
                      WHERE name1 <> CONV #'Cliente Trinta' )
    ).



*   Lista os regisros filrados
    LOOP AT t_20e30 INTO DATA(ls_20e30).
       write:/ |KUNNR{ ls_20e30-kunnr } NAME1{ ls_20e30-name1 }| .
    ENDLOOP.
    WRITE:/ |.|.



    ULINE.



  ENDMETHOD.