- Smart View - Criação de Objetos de Negócios
- Smart View - Configuração do produto Protheus integrado ao Smart View
- Novo Smart View implantado.
- A partir da LIB Label 20231121
Foi implementado na integração com o Smart View a possibilidade de criação de objetos de negócios aninhados.
Um objeto de negócio aninhado consiste em um objeto de negócio que possui propriedades multiníveis e relações de dados, permitindo assim que os dados sejam enviados em um mesmo objeto, mas com grupos separados.
Objetos aninhados
As propriedades aninhadas (formato array) devem ser utilizados apenas em relatórios. Na visão de dados e tabela dinâmica as mesmas não trarão resultados dentro do objeto. Essas propriedades, incluindo suas subpropriedades, não são filtráveis.
Novos Métodos na classe totvs.framework.treports.integratedprovider.IntegratedProvider
addNestedProperty()
Adiciona uma propriedade aninhado no objeto de negócio.
Utilizar esse método caso o objeto aninhado seja o objeto principal.
Parâmetros:
Nome | Tipo | Obrigatório | Default | Descrição |
---|---|---|---|---|
cId | Caractere | X | Id da propriedade | |
cDescription | Caractere | X | Descrição da propriedade | |
cDisplayname | Caractere | X | Nome de exibição | |
cAlias | Caractere | Indica o alias da propriedade | ||
xField | Variant | X | Caractere ou Array contendo a estrutura/campos do objeto aninhado |
Para adicionar em uma única propriedade aninhada campos de várias tabelas, é necessário mandar o 5º parâmetro com a estrutura dos campos com 4 posições e o cAlias nulo:
1-Id | 2-Descrição | 3-Tipo | 4-DisplayName
Exemplo completo:
aFields := {} aAdd(aFields , {"A2_NOME", "Nome", "string", "Nome"}) aAdd(aFields , {"A1_COD", "Código", "string", "Código"}) self:addNestedProperty("Aninhado", "Aninhado", "Aninhado", , aFields)
Adicionando uma propriedade para fazer 2 níveis de objetos aninhados:
aFields := {} aAdd(aFields , {"A2_NOME", "Nome", "string", "Nome"}) aAdd(aFields , {"A1_COD", "Código", "string", "Código"}) aAdd(aFields , {"NIVEL2", "Nível 2", "array", "Nível 2"}) //Posso enviar o tipo como "array" já que irei transformar em objeto aninhado self:addNestedProperty("Aninhado", "Aninhado", "Aninhado", , aFields) aFields2 := {} aAdd(aFields2 , {"A2_COD", "Código", "string", "Código"}) self:transformInNested("NIVEL2", "", aFields2) //Transformo em objeto aninhado e já indico os campos que irão ficar dentro
Desta forma acima o objeto "Aninhado" terá dentro dele um outro objeto chamado "NIVEL2"
Exemplo de uso:
|
Sintaxe: self:addNestedProperty
() → nil
transformInNested()
Transforma a propriedade em uma propriedade aninhada no objeto de negócio.
Utilizar esse método caso o objeto aninhado sejá nível 2 ou +, primeiro ele deve ser adicionado no objeto principal.
Parâmetros:
Nome | Tipo | Obrigatório | Default | Descrição |
---|---|---|---|---|
cId | Caractere | X | Id da propriedade | |
cAlias | Caractere | Indica o alias da propriedade | ||
xField | Variant | X | Caractere ou Array contendo a estrutura/campos do objeto aninhado |
Exemplo de uso:
|
Sintaxe: self:transformInNested
() → nil
getStructNestedFields()
Retorna a estrutura dos campos aninhados.
Exemplo de uso:
|
Sintaxe: self:getStructNestedFields
() → array
Objetos aninhados com campos do SX3 e campos manuais (virtuais)
Schema
method getSchema() as object class CustomTReportsBusinessObject local aNested as array local aNestedManual as array aNested := {"A2_NATUREZ", "A2_CGC"} self:addNestedProperty("Fornecedores", "Fornecedores (SA2)", "Fornecedores (SA2)", "SA2", aNested) //Propriedade aninhada com campos manuais aNestedManual := Array(0) //Posições do array = 1-Id | 2-Descrição | 3-Tipo | 4-DisplayName //O array deverá ter exatamente 4 posições como demonstrado abaixo aAdd(aNestedManual, {"Informacao1", "Informação 1", "string", "Informação 1"}) aAdd(aNestedManual, {"Informacao2", "Informação 2", "string", "Informação 2"}) self:addNestedProperty("Info", "Info", "Info",, aNestedManual) //Exemplo adicionando uma propriedade manual e depois transformando em aninhado self:addProperty("EnderecoDetalhes", "Detalhes do Endereço", "string", "Detalhes do Endereço", "EnderecoDetalhes") self:transformInNested("EnderecoDetalhes", "SA2", {"A2_END", "A2_BAIRRO"}) self:transformInNested("A2_BAIRRO", "SA2", {"A2_MUN", "A2_CEP"}) //Transformando a A2_BAIRRO em aninhada, fazendo assim mais um nível return self:oSchema
Data
Atenção
- O objeto aninhado deverá ser utilizado apenas em objetos de negócios que executem a própria query e enviam os dados através do método appendData
- Não deve ter paginação ao retornar os dados do objeto aninhado, ele deve ser entregue por completo, por isso o desenvolvedor deve se atentar ao utilizar esse recurso para não dar timeout na requisição enquanto estiver buscando os dados.
method getData() as object class CustomTReportsBusinessObject (...) //Ao indicar os campos da query utilizando o método getSQLFields com o 4º parâmetro como .T., trará os campos que estão dentro de objetos aninhados e que existem no SX3, independente do nível em que o campo esta cQuery := "SELECT " + self:getSQLFields(,,,.T.) + " FROM " + RetSQLName("SA5") (...) while !(cAlias)->(Eof()) jItems := JsonObject():new() for nX := 1 To Len(aAllFields) //Enquanto esta no while da query, antes do appendData, indicar os valores dos objetos aninhados formatNestedJson(cAlias, @jItems) next nX self:oData:appendData(jItems) (cAlias)->(DBSkip()) nCount++ //Sai do loop quando chegar no tamanho de itens da página if nCount == self:getPageSize() exit endif enddo (...) return self:oData //------------------------------------------------------------------- /*{Protheus.doc} formatNestedJson Formato o json dos objetos aninhados @param cAlias charactere: Alias aberto na query @param jItems json: Json de resposta na requisição @author Vanessa Ruama @since 02/03/2023 @version 1.0 */ //------------------------------------------------------------------- static function formatNestedJson(cAlias as character, jItems as json) //Como o desenvolvedor conhece a estrutura de objetos aninhados que foram criados, basta retornar corretamente no formato json jItems["Fornecedores"] := {} aAdd(jItems["Fornecedores"], {"A2_NATUREZ": (cAlias)->&("A2_NATUREZ"), "A2_CGC": (cAlias)->&("A2_CGC")}) jItems["Info"] := {} aAdd(jItems["Info"], {"Informacao1":"Info 1", "Informacao2":"Info 2"}) jItems["EnderecoDetalhes"] := {} aAdd(jItems["EnderecoDetalhes"], {"A2_END": (cAlias)->&("A2_END"), "A2_BAIRRO":{{"A2_MUN": (cAlias)->&("A2_MUN"), "A2_CEP": (cAlias)->&("A2_CEP")}}}) return
Retorno esperado dos objetos aninhados no json do método getData (busca de dados)
{ "data": [ { "Fornecedores": [ { "A2_NATUREZ": "IRGCT ", "A2_CGC": " " } ], "Info": [ { "Informacao1": "Info 1", "Informacao2": "Teste 1" }, { "Informacao1": "Info 2", "Informacao2": "Teste 2" }, { "Informacao1": "Info 3", "Informacao2": "Teste 3" } ], "EnderecoDetalhes": [ { "A2_END": "TESTE IT", "A2_BAIRRO": [ { "A2_MUN": "SP", "A2_CEP":"00000-00" } ] } ], (...) }
Resultado esperado no Smart View
Como utilizar no design
1 - Inserir a banda demonstrada abaixo:
2 - Selecionar a banda que foi adicionada e inserir qual objeto aninhado deseja utilizar, aqui no meu exemplo selecionei o objeto "Info":
3 - Adicionar os campos do objeto aninhado ao design:
4 - Resultado: