Master Detail Detail

Este documento descreve a forma de criação de uma entidade master-detail-detail e a sua utilização.

Modelação

A modelação do Elevation 300 permite relação entre entidades do tipo detalhe, desta forma, os próximos capítulos pretendem explicar como modelar um master-detail-detail.

Modelo de entidades

O modelo de entidades permite a existência de entidades do tipo Master-detail-detail, para isso é necessário:

  1. Adicionar uma entidade master;

  2. Adicionar uma entidade detail ao master e o tipo de Association ser do tipo Composition;

  3. Adicionar outra entidade detail ao detail e o tipo de Association ser do tipo Composition;

Entidade Master-detail-detail

Modelo de serviços

No modelo de serviços é possível otimizar o carregamento da entidade Master-detail-detail (exemplo: Invoice). Para tal, é necessário criar resources parciais da entidade.

Para explicar este cenário vamos utilizar o exemplo da invoice.

  • No serviço das invoices vamos criar uma resource da invoice line:

Seleção de atributos

Esta resource apenas tem a lista das invoice line taxes, assim, vai ser criado uma resource que carrega a informação das linhas das taxas.

  • Depois de se criar uma resource num serviço é necessário adicionar a resource principal para o serviço Invoices, assim criamos a StandardInvoice:

Resources do serviço

A resource StandardInvoice deve apenas ter os atributos necessários para a view, neste caso tem selecionados os atributos master e das duas grelhas visíveis na view (DocumentLines e DocumentTaxes).

View da resource StandardInvoice

A resource parcial InvoiceLinesPartialTax tem a informação do último detalhe que só é carregado a pedido, dessa forma, não necessitamos de carregar a invoice completa, mas vamos carregando quando for necessário.

Modelo de apresentação

No modelo de apresentação é possível definir uma view para mostrar a informação dos detalhes e associar essa view a um link na service view principal. Para tal, é necessário:

  • Adicionar uma service view e associa-la ao resource model criado no modelo de serviços (no caso descrito na secção anterior, o resource era: InvoiceLinePartialTax)

Selecionar o resource model

  • Desenhar a view para a resource detail (InvoiceLinePartialTax)

View detail detail

  • Na view principal adicionar a referenced view criada no ponto anterior

Referenced views

  • Adicionar atributo link na lista e escolher na ComboBox Action Type: ShowModel. Na combo ReferencedView escolher a referenced view adicionada no ponto anterior.

Opções do atributo link

  • Por fim, podemos optar por ver esse link numa coluna da grelha ou no menu de contexto da linha. Para isso, na opção Display, temos de optar por Principal (link na coluna da grelha) ou RowActions (menu de contexto da linha).

Display - atributo link

Popup detail-detail

Camada de serviços para entidades Master-detail-detail

Serviço de update aos campos

Os serviços de updates são gerados para todos os atributos da entidade, com o comportamento semelhante ao que acontece com os atributos do master. Estes serviços utilizam a seguinte rota por defeito:

[Route("{id}/documentLines/{lineId}/documentLineTaxes/{innerLineId}/note")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro detalhe;
  • innerLineId: id da entidade detail detail (InvoiceLineTaxes);
  • note: atributo a actualizar;

Serviço de get da entidade master-detail-detail

Para suportar o get destas entidades é necessário a geração de um conjunto de serviços:

  • Get paginado da grelha
[Route("{id}/documentLines/{lineId}/documentLineWTaxes/{pageIndex}/{pageSize}")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro detalhe;
  • pageIndex: o index;
  • pageSize: número de registos a devolver;
  • Get da resource: origem de dados do draft
[Route("{id}/documentLines/{lineId}/getdraftInvoiceLinePartialTax ")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • getdraftInvoiceLinePartialTax: parte da rota que distingue qual é a resource ;
  • Get da resource: origem de dados da entidade
[Route("{id}/documentLines/{lineId}/getInvoiceLinePartialTax ")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • getInvoiceLinePartialTax: parte da rota que distingue qual é a resource;

Serviço para criar, consultar, editar e apagar uma linha

Os serviços gerados para o último nível de detalhe são:

  • create de uma nova linha: linha adicionada na última posição da grelha
[Route("{id}/documentLines/{lineId}/documentLineTaxes/new")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro;
  • new: parte da rota que distingue que é para criar uma linha nova;
  • clone de uma linha: linha clonada para a última posição da grelha
[Route("{id}/documentLines/{lineId}/documentLineTaxes/{innerLineId}/clone")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro;
  • innerLineId: id da entidade detail detail (InvoiceLineTaxes);
  • clone: parte da rota que distingue que é para criar clonar a linha;
  • create above: linha adicionada na posição acima
[Route("{id}/documentLines/{lineId}/documentLineTaxes/{innerLineId}/newAbove")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro;
  • innerLineId: id da entidade detail detail (InvoiceLineTaxes);
  • newAbove: parte da rota que distingue que é para criar uma linha acima;
  • delete: linha apagada e indexes recalculados
[Route("{id}/documentLines/{lineId}/documentLineTaxes/{innerLineId}/delete")]
  • Id: id da entidade master (Invoice);
  • documentLines: nome do atributo da invoice lines na entidade master;
  • lineId: id da entidade detail (InvoiceLines);
  • documentLineTaxes: nome do atributo da invoice line taxes no primeiro;
  • innerLineId: id da entidade detail detail (InvoiceLineTaxes);
  • delete: parte da rota que distingue que é para criar uma linha acima.