Gerador de código ABAP online

Muitas vezes, durante a codificação ABAP, surge uma tarefa típica - inicializar outros campos pelos valores de alguns campos da tabela interna (selecione na tabela do banco de dados, chamando sub-rotinas de FM). E o código, neste caso, é muito simples em termos de algoritmo, mas é bastante. Eu sempre quis reduzir o tempo gasto nessas operações de rotina. E ele até escreveu um método baseado na criação dinâmica de programas para selecionar valores de referência por suas chaves nas tabelas do banco de dados .

Nos comentários apontados para

" ilegibilidade do código " é a sua linguagem micro que você precisa aprender.
" chamadas dinâmicas " - chamadas dinâmicas não são bem-vindas, incluindo que, nesse caso, o log de uso não encontre um local para usar as tabelas / campos correspondentes.

Como alternativa, eu ainda estava propondo uma opção com geração automática de código, mas só agora eu trouxe essa coisa para uma ferramenta pronta . Quem se importa, por favor, debaixo do gato.

A idéia é simples: existe um conjunto de parâmetros pelos quais um código ABAP é gerado de acordo com um modelo especificado.

Vamos dar um exemplo simples: na tabela interna, coloque o nome do campo pelo valor do campo . Falando na linguagem técnica do desenvolvedor: na tabela interna, pelo valor do campo BUKRS, coloque o valor do campo BUTXT de acordo com a tabela do banco de dados T001 .

Declaração simples em apenas uma frase. Mas, para conseguir isso, você precisa fazer LOOP na tabela interna e SELECT SINGLE em um loop (o que é rápido, mas do ponto de vista da velocidade, não é muito bem-vindo, especialmente se houver muitas linhas na tabela interna), ou selecionar valores únicos do BUKRS, uma consulta à tabela de banco de dados T001, e depois colocamos os valores correspondentes do campo BUTXT em READ TABLE. Nesse caso, o código será mais ideal, mas sua escrita não é tão rápida, porque esse código já é muito. Além disso, não há nada complicado - um trabalho "simples" quase simples de digitar.

E aqui o gerador automático vem em socorro, porque esse código possui uma forma padronizada, o que significa que sua escrita pode ser automatizada.

Especifique os seguintes parâmetros:

Tabela do banco de dados: T001
campos de comunicação: BUKRS
campos inicializados: BUTXT

e obtenha o seguinte código gerado
*--      T001 FORM values_from_tab_T001 USING "-- ()  uv_in_BUKRS TYPE any "--   uv_out_BUTXT TYPE any CHANGING "--    ct_table TYPE ANY TABLE . "--    ? CHECK NOT ( ct_table[] IS INITIAL ). "--     TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "--    LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "--     SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "--     SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "--     SORT lt_item BY BUKRS. "--     LOOP AT ct_table ASSIGNING <ls_table>. "--    ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "--    ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "--      READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM. 

Agora basta chamar a sub-rotina gerada no seu programa

 PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE. 

Veja o código no site do gerador ABAP
Os nomes dos campos na tabela interna e na própria tabela interna são passados ​​como parâmetros para a sub-rotina. Após a chamada, o campo BUTXT terá o valor desejado.

Os nomes dos campos na tabela interna são feitos na forma de parâmetros para que a mesma sub-rotina possa ser chamada para campos diferentes. I.e. se você tiver dois campos BE na tabela interna (por exemplo, BUKRS1 e BUKRS2), basta gerar uma sub-rotina e chamá-la duas vezes

 PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE. 

Nesse caso, “não otimização” aparece, pois haverá dois SELECT da tabela de banco de dados T001, embora, no caso ideal, você possa fazer tudo através de um. Mas este é o custo da automação. É improvável que isso desacelere bastante a execução do programa, mas se necessário, você sempre pode "concluir" o subprograma para suas necessidades particulares.

Você pode inicializar vários campos ao mesmo tempo e, em condições, especificar constantes (por exemplo, sy-langu, que é frequentemente usado na escolha de textos). No exemplo padrão, os nomes do UE são selecionados de acordo com a tabela T006A.

Ao gerar o código, também é criado um link pelo qual o exemplo criado pode ser aberto no navegador.

Atualmente, existem vários modelos no gerador:

  1. Definir a estrutura [+ tipo de tabela] - defina a estrutura + tipo de tabela + tabela deste tipo + espaço de trabalho da tabela + símbolo de campo da tabela. Isso nem sempre é necessário, mas é mais fácil excluir o gerado do que digitá-lo manualmente
  2. A remoção de registros duplicados da tabela interna por campos é um gerador muito simples e, em geral, esse código pode ser escrito manualmente, mas se houver muitos campos, na minha opinião, é melhor usar esse modelo
  3. Selecione valores de referência na tabela do banco de dados - o modelo descrito acima
  4. Selecionar valores de referência - o modelo permite definir valores de campo por meio de uma chamada para subprogramas FM. Nesse caso, as chamadas são armazenadas em cache.
  5. Selecione valores de referência do domínio - este modelo não possui parâmetros e foi adicionado para poder copiar esse código no seu programa

Eu acho que uma descrição detalhada da operação de cada modelo não faz sentido, pois é mais fácil ver o resultado de seu trabalho no site . Cada modelo tem valores padrão para seus parâmetros e, se você é um desenvolvedor abap, entenderá rapidamente o código.

Source: https://habr.com/ru/post/pt426967/


All Articles