Nesta documentação, você vai encontrar um exemplo de como criar um objeto de negócio em TLPP utilizando uma procedure. Se quiser saber mais sobre todos os métodos disponíveis para a criação de objetos de negócio, consulte a documentação completa aqui: Smart View - Criação de Objetos de Negócios.
Vale lembrar que os dados de um objeto de negócio podem vir de diferentes fontes, como uma query, uma procedure, um arquivo ou qualquer outra origem que possa ser lida em ADVPL/TLPP. O mais importante é sempre garantir que o schema esteja alinhado com os dados (data), como mostrado no exemplo abaixo:
GetData
GetSchema
Os dados enviados ao objeto de negócio estão no JSON jItems. É importante garantir que o nome das propriedades enviadas seja exatamente igual ao ID enviado no getSchema. Dessa forma, você consegue obter os dados de qualquer origem suportada pelo ADVPL/TLPP.
Adaptar a procedure e seu retorno de acordo com o banco de dados utilizado.
CREATE OR ALTER PROCEDURE Product @Filial NVARCHAR(10) = NULL, @Cod NVARCHAR(20) = NULL AS BEGIN SELECT B1.B1_FILIAL, B1.B1_COD, B1.B1_DESC, B1.B1_UCOM FROM SB1T10 AS B1 INNER JOIN SB9T10 AS B9 ON B9.B9_COD = B1.B1_COD WHERE (@Filial IS NULL OR B1.B1_FILIAL = @Filial) AND (@Cod IS NULL OR B1.B1_COD = @Cod); END;
#include "msobject.ch" #include "protheus.ch" #include "totvs.framework.treports.integratedprovider.th" namespace customprocedure @totvsFrameworkTReportsIntegratedProvider(active=.T., team="Framework", name="ON Procedure", country="BRA", initialRelease="12.1.2310") //------------------------------------------------------------------- /*{Protheus.doc} ProductON Classe para criação do Objeto de Negócio @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- class ProductON from totvs.framework.treports.integratedprovider.IntegratedProvider public method new() as object public method getDisplayName() as character public method getDescription() as character public method getData() as object public method getSchema() as object protected data aFields as array endclass //------------------------------------------------------------------- /*{Protheus.doc} new Método de instância da classe @return object: self @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- method new() class ProductON _Super:new() self:appendArea("Compras - Procedure") //Campos que serão retornados da procedure self:aFields := {"B1_FILIAL", "B1_COD", "B1_DESC", "B1_UCOM"} return self //------------------------------------------------------------------- /*{Protheus.doc} getDisplayName Retorna o nome de exibição do objeto de negócio @return string @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- method getDisplayName() as character class ProductON return "Objeto de negócio de produtos com procedure" //------------------------------------------------------------------- /*{Protheus.doc} getDescription Retorna a descrição do objeto de negócio @return string @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- method getDescription() as character class ProductON return "Objeto de negócio de produtos com procedure" //------------------------------------------------------------------- /*{Protheus.doc} getData Retorna os dados do objeto de negócio @param nPage, numérico, indica a página atual do relatório @param oFilter, objeto, contém o filtro do TReports @return object: self:oData @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- method getData(nPage as numeric, oFilter as object) as object class ProductON local jItems as json local jParams as json local oStatement as object jParams := oFilter:getParameters() //metodo para retorno do json dos parâmetros //Faz a execução da procedure Product cQuery := "EXEC Product " cQuery += "@Filial = '" + FWxFilial("SB1") + "', " //Indica o primeiro parâmetro if valtype(jParams["MV_PAR01"]) == "A" .and. Len(jParams["MV_PAR01"]) > 0 cQuery += "@Cod = ?" //Indica o segundo parâmetro EndIf oStatement := FWExecStatement():New(cQuery) oStatement:setString(1, jParams["MV_PAR01"][1]) cAlias := oStatement:OpenAlias() while !(cAlias)->(Eof()) jItems := JsonObject():new() jItems['filial'] := (cAlias)->&(self:aFields[1]) jItems['code'] := AllTrim((cAlias)->&(self:aFields[2])) jItems['desc'] := AllTrim((cAlias)->&(self:aFields[3])) jItems['date'] := u_convertDate(AllTrim((cAlias)->&(self:aFields[4]))) self:appendData(jItems) (cAlias)->(DBSkip()) enddo return self:oData //------------------------------------------------------------------- /*{Protheus.doc} getSchema Retorna a estrutura dos campos @return object: self:oSchema @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- method getSchema() as object class ProductON self:addProperty('filial', 'Filial' , 'string', 'Filial', 'B1_FILIAL') self:addProperty('code', 'Código' , 'string', 'Código', 'B1_COD') self:addProperty('desc', 'Descrição' , 'string', 'Descrição', 'B1_DESC') self:addProperty('date', 'Data Últ. Compra' , 'date', 'Data Últ. Compra', 'B1_UCOM') self:addParameter("MV_PAR01", "Código do Produto", "string", .F.) return self:oSchema //------------------------------------------------------------------- /*{Protheus.doc} convertDate Converte o campo do tipo data para o formato do Smart View @param xDate, variant, data recebida do Protheus @return cConvDate, character, data convertida para o Smart View @author Vanessa Ruama @since 17/01/2025 @version 1.0 */ //------------------------------------------------------------------- user function convertDate(xDate as variant) as character local cConvDate as character if Valtype(xDate) == "D" cConvDate := totvs.framework.treports.date.dateToTimeStamp(xDate) else cConvDate := totvs.framework.treports.date.stringToTimeStamp(xDate) endif return cConvDate