Implementar atualizações do banco de dados utilizando business objects

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 ( f1 … fn ), 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 ( f1 … fn ).

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 com→visualizaçã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 Arquivo→Nova→classe 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.