* 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.
* 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
.
*&---------------------------------------------------------------------*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(50) TYPE 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_field) TO '<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
Boa noite, parabéns pelo blog cada vez melhor.
ResponderExcluirmeu 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.