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
    types: begin 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_kna1) = VALUE 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_20e30) = FILTER #(
                      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
    types: begin 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_kna1) = VALUE 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_20e30) = FILTER #(
                      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
    types: begin 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_kna1) = VALUE 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_20e30) = FILTER #(
                      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
    types: begin 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_kna1) = VALUE 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_20e30) = FILTER #(
                      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
    types: begin 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_kna1) = VALUE 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_20e30) = FILTER #( |.
    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
    types: begin 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_kna1) = VALUE 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 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.