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.
Adiciona uma propriedade aninhado no objeto de negócio.
Utilizar esse método caso o objeto aninhado seja o objeto principal.
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"
|
Sintaxe: self:addNestedProperty
() → nil
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.
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 |
|
Sintaxe: self:transformInNested
() → nil
Retorna a estrutura dos campos aninhados.
|
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
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: