quarta-feira, 14 de agosto de 2013

Assing Component

*  Fala aee, olha um post muito interessante pra quem gosta de trabalhar
* de forma dinamica, hoje vamos falar sobre o comando 'Assign Component'
* é uma comando usado pra você se referenciar ao valor do campo e não
* ao campo em sí.
*  No exemplo abaixo estou fazendo um programa que mostra somente os
* chaves da tabela informada, onde deverá ser criado as estrutura e
* tabelas tudo de forma dinâmica, reparem quais são os valores de cada
* tabela interna e veja como trabalho com ela no relacionamento de
* alimentação da tabela principal que terá uma estrutura só com os
* campos chaves da tabela da tela de seleção.

* Qualquer dúvida ou complemento fiquem a vontade. Espero ajudar. Tnx.

* Tirem as aspas simples (') da frente dos Fields Symbols.... rs

 
 
*&---------------------------------------------------------------------*
REPORT z_assign_component.

TYPE-POOLS :
  slis
.

DATA :
  it_table    
TYPE REF TO data,
  st_line     
TYPE REF TO data,
  it_keys     
TYPE TABLE OF dfies,
  st_keys     
TYPE dfies,
  it_fcat     
TYPE TABLE OF lvc_s_fcat,
  st_fcat     
TYPE lvc_s_fcat,
  dy_table    
TYPE REF TO data,
  dy_line     
TYPE REF TO data
  
.

* Field-simbols
FIELD-SYMBOLS :
  ‘<fs_table>  
TYPE STANDARD TABLE,
  ‘<fs_line>
,
  ‘<dyn_table> 
TYPE STANDARD TABLE,
  ‘<dyn_line>
,
  ‘<dyn_field>
.

START-OF-SELECTION.

* Tela de seleção.
  
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
  
PARAMETERS :
    p_table 
TYPE dd02l-tabname OBLIGATORY,  " Nome da tabela
    p_rows  
TYPE i,      " Quantidade de linhas à retornar
    p_where 
TYPE char100 " Condições do Select ( sem ponto no final )
    
.
  
SELECTION-SCREEN END OF BLOCK   b1.

  
PERFORM z_select_dynamic,
            z_get_keys
,
            z_create_dynamic_table
,
            z_feed_dynamic_table
,
            z_alv
            
.

*&---------------------------------------------------------------------*
*&      Form  Z_SELECT_DYNAMIC
*&---------------------------------------------------------------------*
FORM z_select_dynamic .

  
TRANSLATE p_table TO UPPER CASE.

  
"Criação da tabela dinamica
  
CREATE DATA it_table TYPE TABLE OF (p_table).

  
ASSIGN it_table->TO  '<fs_table>.

  
"Faz a seleção na tabela transparente informada
  
SELECT *    " Campos
    
FROM  (p_table)    " Tabela Transparente
    
UP TO p_rows ROWS  " Qtde Linhas
    
INTO CORRESPONDING FIELDS OF TABLE ‘<fs_table>
    
WHERE (p_where).   " Condições informadas

*  Criação de uma estrutura baseada na tabela dinamica e assign
* num field Symbol.
  
CREATE DATA st_line LIKE LINE OF ‘<fs_table>.
  
ASSIGN st_line->TO ‘<fs_line>.


ENDFORM.                    " Z_SELECT_DYNAMIC

*&---------------------------------------------------------------------*
*&      Form  Z_GET_KEYS
*&---------------------------------------------------------------------*
FORM z_get_keys .

*  Execução de uma função somente para pegar todos os campos chaves da
* tabela informada
  
CALL FUNCTION 'GET_KEY_FIELDS_OF_TABLE'
    
EXPORTING
      tabname       
p_table
*      mandt_needed  =
    
TABLES
      key_fieldtab  
it_keys
    
EXCEPTIONS
      not_supported 
1
      
OTHERS        2.

  
IF sy-subrc <> 0.
    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  
ENDIF.


ENDFORM.                    " Z_GET_KEYS

*&---------------------------------------------------------------------*
*&      Form  Z_CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
FORM z_create_dynamic_table .

  
BREAK-POINT.

*  Aqui estou passando todos os dados da tabela de chaves para uma
* tabela de catalogo de campos que seja do mesmo tipo do parametro de
* importação para execução do method abaixo.
  
LOOP AT it_keys INTO st_keys.

    
MOVE-CORRESPONDING st_keys TO st_fcat.
    
APPEND st_fcat TO it_fcat.

  
ENDLOOP.

* Criação e referencia de tabela dinamica no field Symbol.
  
CALL METHOD cl_alv_table_create=>create_dynamic_table
    
EXPORTING
      it_fieldcatalog  
it_fcat
      i_length_in_byte 
'X'
    
IMPORTING
      ep_table         
dy_table.
  
ASSIGN dy_table->TO '<dyn_table>.

*  Criação de uma estrutura baseada na tabela dinamica e assign
* num field Symbol.
  
CREATE DATA dy_line LIKE LINE OF '<dyn_table>.
  
ASSIGN dy_line->TO '<dyn_line>.



ENDFORM.                    " Z_CREATE_DYNAMIC_TABLE

*&---------------------------------------------------------------------*
*&      Form  Z_FEED_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
FORM z_feed_dynamic_table .

  
DATA :
    vl_contador  
TYPE i,
    vl_lines     
TYPE i,
    vl_field
(50TYPE c.

  
FIELD-SYMBOLS :
    <field>
    
.

  
BREAK-POINT.

* Informa a quantidade de linhas da tabela de chaves.
  
DESCRIBE TABLE it_keys LINES vl_lines.

* Loop inicial baseada na tabela com os dados.
  
LOOP AT <fs_table> INTO <fs_line>.

    
CLEAR vl_contador.
    
DO vl_lines TIMES.

      vl_contador 
vl_contador + 1.

      
READ TABLE it_keys INTO st_keys
        
INDEX vl_contador.

*  Aqui tá o famoso 'Assig component' percebam que eu passo o valor do
* campo referente e não o campo em sí,
      
ASSIGN COMPONENT st_keys-fieldname
        
OF STRUCTURE '<fs_line> TO '<dyn_field>.

*      <fs_line>-(st_keys-fieldname) = <dyn_field>.
*  Esse comando acima que está comentando é a lógica que gostariamos de
* aplicar mas não podemos usar isso pq não sabemos os campos da Estrutura
* <fs_line> porque ela é criada dinamicamente, portanto usamos um ASSIGN
* desse tipo.

      
CONCATENATE '<dyn_line>-' st_keys-fieldname INTO vl_field.
      
ASSIGN (vl_fieldTO '<field>.
      
MOVE '<dyn_field>  TO '<field>.

* Limpa a variavel com o campos de referencia pra começar tudo de novo.
      
CLEAR vl_field.

    
ENDDO.

*  Agora alimenta a tabela dinamica com os valores em seus respectivos
* campos
    
APPEND '<dyn_line> TO '<dyn_table>.

  
ENDLOOP.

ENDFORM.                    " Z_FEED_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*&      Form  Z_ALV
*&---------------------------------------------------------------------*
FORM z_alv .

  
DATA :
    st_fieldcat 
TYPE slis_fieldcat_alv,
    it_fieldcat 
TYPE TABLE OF slis_fieldcat_alv,
    st_layout   
TYPE slis_layout_alv,
    vl_flag 
TYPE i.

  
BREAK-POINT.

* Catalogo de campos da tabela.

  
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
   
EXPORTING
     i_program_name               
sy-repid
     i_structure_name             
p_table
   i_client_never_display       
'X'
    
CHANGING
      ct_fieldcat                  
it_fieldcat
   
EXCEPTIONS
     inconsistent_interface       
1
     program_error                
2
     
OTHERS                       3
            
.
  
IF sy-subrc <> 0.
    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  
ENDIF.

* Deleta todos os campos que não tiverem na tabela de chaves.
  
LOOP AT it_fieldcat INTO st_fieldcat.

    vl_flag 
sy-tabix.

    
READ TABLE it_keys INTO st_keys
      
WITH KEY fieldname st_fieldcat-fieldname.

    
IF sy-subrc IS NOT INITIAL.
      
DELETE it_fieldcat INDEX vl_flag.
    
ENDIF.

  
ENDLOOP.

* Layout
  st_layout
-zebra 'X'.
  st_layout
-colwidth_optimize 'X'.

* ALV
  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
     i_callback_program                
sy-repid
     is_layout                         
st_layout
     it_fieldcat                       
it_fieldcat
    
TABLES
      t_outtab                          
= ‘<dyn_table>
   
EXCEPTIONS
     program_error                     
1
     
OTHERS                            2
            
.
  
IF sy-subrc <> 0.
    
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  
ENDIF.

ENDFORM.                    " Z_ALV
 
 
 
 

 

Um comentário:

  1. Boa noite, parabéns pelo blog cada vez melhor.
    meu nome é Carlos valentini.
    Gostaria de compartilhar com o grupo uma opinião pessoal.
    Posso estar enganado, pois, não sou o dono da verdade.
    Sou desenvolvedor ABAP e fui baixar a versão SAP NetWeaver Application Server ABAP 7.4 on SAP MaxDB - Trial Edition para uma avaliação da mesma.
    Entrei no SDN e para a minha surpresa recebi a mensagem que não esta disponível para o Brasil.
    Até a versão 7.03 esta liberado.
    Entrei em contato e a resposta que tive foi a seguinte: esta liberada para 35 países, e o Brasil esta fora da lista.
    Como vamos poder evoluir e melhorar profissionalmente? A SAP esquece que o crescimento do ERP e outros produtos tem relação direta com a qualidade dos profissionais que trabalham com as ferramentas.
    E outro detalhe hoje o Brasil se não me engano é o terceito em faturamento para a SAP.
    Fiz um post no SDN sobre o assunto: http://scn.sap.com/thread/3422116
    Vamos divulgar este problema.

    ResponderExcluir