Guia de introdução
Aplicação de técnicas básicas e conceitos
Trabalhar com classes locais
Ler dados do banco de dados
Trabalhar com objetos de dados estruturados
Trabalhar com tabelas internas complexas
Implementar atualizações do banco de dados utilizando business objects
Descrição do modelo de programação de aplicativos ABAP RESTful

Utilizar o Entity Manipulation Language

Objective

After completing this lesson, you will be able to implemente uma instrução EML.

Entity Manipulation Language (EML)

O EML consiste em instruções que você pode utilizar para manipular os dados de um business object. Você utiliza a instrução READ ENTITIES para ler dados; para todas as outras operações, você utiliza a instrução MODIFY ENTITIES com o suplemento correspondente UPDATE, CREATE ou DELETE.

Nota

Você só pode utilizar as operações CREATE, UPDATE e DELETE se a definição de comportamento da interface do business object contiver a diretiva correspondente use create, use update ou use delete. A tentativa de usar uma operação proibida causa um erro de sintaxe.

Para ler dados de um business object, você utiliza a instrução READ ENTITIES. A instrução tem dois parâmetros importantes: uma tabela interna contendo as chaves dos dados que você quer ler e outra que contém os resultados da consulta.

Essas tabelas internas têm tipos de dados especiais chamados tipos de definição de comportamento derivados. O sistema cria os mesmos automaticamente quando um desenvolvedor cria uma definição de comportamento e eles contêm alguns ou todos os campos do business object, juntamente com outros campos que controlam como o sistema processa uma determinada solicitação. Você declara as tabelas internas utilizando o novo suplemento TYPE TABLE FOR <operation> na instrução DATA.

O tipo TABLE FOR READ IMPORT contém o campo-chave ou campos do business object. A estrutura %control é uma estrutura gerada que indica quais campos do business object são realmente utilizados na operação atual. Em nosso exemplo, o sistema preenche a estrutura automaticamente e você não precisa se preocupar com isso.

O tipoTABLE FOR READ RESULT contém todos os campos do business object. Esta tabela contém o conjunto de resultados após a execução da instrução de leitura.

A tabela de importação de leitura contém uma coluna para cada campo-chave do business object, neste caso, agencyID. Para ler uma determinada agência, você adiciona uma linha à tabela interna que contém a respectiva chave. Assim como o campo-chave ou campos, a tabela contém as colunas %is_draft e %control. Com %is_draft, você pode especificar se deseja ler dados de rascunho ou dados ativos. A estrutura %control é utilizada para especificar quais campos devem ser lidos.

Nota

Em nosso exemplo, só lemos dados ativos e a estrutura %control é preenchida pelo framework, com base na lista de campos após o suplemento FIELDS.

Ao processar um business object, utilizando a instrução READ ENTITIES OF ou MODIFY ENTITIES OF, você deve primeiro especificar o nome da definição de comportamento. Isso é seguido pela palavra-chave ENTITY e pelo nome da entidade com a qual você deseja trabalhar. Se a entidade tiver um nome de alias, você deve utilizá-la aqui.

Nota

Você não pode usar o nome do alias após a adição de OF. Isso ocorre porque, tecnicamente, você indica o nome da definição de comportamento neste momento, não o nome da entidade.

A instrução READ ENTITIES lê os dados do business object de acordo com as chaves que você transfere no suplemento WITH. Ele retorna o resultado na tabela interna no suplemento RESULT. Na instrução, você também pode indicar de quais campos do business object você precisa. Neste exemplo, usamos o suplemento ALL FIELDS para retornar todos os campos. No entanto, se você só necessitar de um subconjunto dos campos, pode usar a variante FIELDS ( field1field2 … ) para restringir a quantidade de dados que é lida.

Nota

Ao contrário de uma instrução SELECT, a lista de campos não é separada por vírgulas.

A tabela de resultados contém todos os campos do business object, juntamente com o campo de controle %is_draft. Se a sua instrução READ ENTITIES contiver a variante ALL FIELDS, o sistema fornece os valores de todos os campos. Se você usar a variante FIELDS ( f1fn ), somente os campos que você solicitou serão preenchidos.

Nota

Os campos-chave são sempre preenchidos, mesmo que não estejam indicados na variante FIELDS ( f1fn ).

Se você quiser atualizar dados, você declara uma tabela interna com TYPE TABLE FOR UPDATE. Este contém todos os campos do business object e também a estrutura %control. Em nossa variante da instrução MODIFY ENTITIES, o sistema preenche a estrutura %control automaticamente.

A instrução MODIFY ENTITIES atualiza dados no buffer transacional. No suplemento FIELDS, você indica quais campos devem ser modificados. Além disso, COM, você transfere a tabela interna que contém os dados que deseja atualizar.

Quando você utiliza EML fora do business object, deve utilizar a instrução COMMIT ENTITIES para acionar a sequência de gravação e gravar de forma persistente os dados no banco de dados.

Nota

Mais tarde, neste curso, usaremos o EML na implementação do comportamento do objeto de negócios. Dentro da implementação de comportamento, não é necessário nem permitido acionar o commit com COMMIT ENTITIES.

Como implementar uma instrução EML

Modificar dados utilizando EML

Neste exercício, você utiliza EML para executar a atualização de operação padrão para a entidade raiz do business object /DMO/R_AGENCYTP. Para evitar inconsistências posteriores, você não acessa o business object diretamente, mas mediante a respectiva interface estável liberada /DMO/I_AGENCYTP.

Modelo:

  • nenhum

Solução:

  • /LRN/CL_S4D400_BOS_EML (classe global)

Tarefa 1: Analisar dados atuais

Utilize a ferramenta Visualização de dados para verificar o nome atual da agência de viagens com o ID "0700##", onde ## representa seu número de grupo.

Etapas

  1. Abra a definição da entidade de visão CDS /DMO/I_AgencyTP.

    1. Se você ainda tiver a definição de dados /DMO/I_AGENCYTP aberta a partir do exercício anterior, mude para a guia correspondente. Caso contrário, pressione Ctrl + Shift + A para abrir o objeto de desenvolvimento ABAP.

  2. Abra a ferramenta Visualização de dados.

    1. Clique com o botão direito do mouse em qualquer lugar do texto fonte para abrir o menu de contexto.

    2. No menu de contexto, selecione Abrir comvisualização de dados.

  3. Verifique o nome atual da agência de viagens com o ID "0700##", onde ## representa seu número de grupo.

    1. Role para baixo até a entrada com o valor "0700##" na coluna AgencyID e anote o valor na coluna Nome.

Tarefa 2: Criar uma classe global

No seu próprio pacote, crie uma nova classe ABAP.

Etapas

  1. Crie uma nova classe ABAP chamada ZCL_##_EML, onde ## representa seu número de grupo. Certifique-se de que a classe implementa a interface IF_OO_ADT_CLASSRUN.

    1. Selecione ArquivoNovaclasse ABAP.

    2. Insira o nome do seu pacote no campo Pacote. No campo Nome, insira o nome ZCL_##_EML, em que ## é seu número de grupo. Insira uma descrição.

    3. No quadro de grupo Interfaces, selecione Adicionar.

    4. Insira IF_OO_ADT_CLASSRUN. Quando a interface aparecer na lista de ocorrências, clique duas vezes nela para adicioná-la à definição de classe.

    5. Selecione Avançar.

    6. Selecione sua ordem de transporte e, em seguida, Concluir.

Tarefa 3: Atualizar dados

Implemente uma instrução EML para modificar o nome da agência de viagens com o ID "0700##" (## representa seu número de grupo).

Etapas

  1. No método IF_OO_ADT_CLASSRUN~MAIN, declare uma tabela interna com o tipo derivado correto para uma atualização EML da entidade /DMO/I_AgencyTP (nome proposto: agencies_upd).

    1. Adicione o seguinte código:

      Code Snippet
      123
      DATA agencies_upd TYPE TABLE FOR UPDATE /DMO/I_AgencyTP.
  2. Preencha a tabela interna com uma única linha contendo "0700##" como o valor para a coluna AGENCYID (onde ## representa seu número de grupo) e qualquer valor novo para a coluna NAME.

    1. Após a declaração de dados, adicione algum código semelhante ao seguinte código:

      Code Snippet
      123
      agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ).
  3. Implemente uma instrução EML MODIFY ENTITIES para a interface do business object /DMO/I_AgencyTP. Atualize os dados da entidade raiz, garantindo que somente o campo NAME seja modificado.

    Dica

    Lembre-se de que o comportamento da interface define o nome do alias /DMO/Agency para a entidade raiz /DMO/I_AgencyTP.
    1. No final do método, adicione o seguinte código:

      Code Snippet
      123456
      MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd.
  4. Para obter algum resultado visível do aplicativo, escreva um literal de texto no console usando o método out->write.

    1. Após a instrução MODIFY ENTITIES, adicione o seguinte código:

      Code Snippet
      123
      out->write( `Method execution finished!` ).
  5. Ative e teste a classe.

    1. Pressione Ctrl + F3 para ativar a classe.

    2. Pressione F9 para executar a classe.

  6. Verifique se o novo nome foi escrito no banco de dados.

    1. Volte para a visualização de dados para a entidade de visão CDS /DMO/I_AgencyTP.

    2. Na barra de ferramentas da guia Visualização de dados, selecione Atualizar.

  7. Adicione a instrução COMMIT ENTITIES ao seu código para confirmar as modificações.

    1. Volte para o método IF_OO_ADT_CLASSRUN~MAIN em sua classe global ZCL_##_EML.

    2. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112131415161718
      METHOD if_oo_adt_classrun~main. DATA agencies_upd TYPE TABLE FOR UPDATE /dmo/i_agencytp. agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ). MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd. COMMIT ENTITIES. out->write( `Method execution finished!` ). ENDMETHOD.
  8. Ative e teste a classe novamente. Confirme que as modificações estão agora no banco de dados.

    1. Pressione Ctrl + F3 para ativar a classe.

    2. Pressione F9 para executar a classe.

    3. Volte para a visualização de dados para a entidade de visão CDS /DMO/I_AgencyTP.

    4. Na barra de ferramentas da guia Visualização de dados, selecione Atualizar.