Estou com o mesmo problema, alguém pode ajudar?
Segue a rotina:
#include "protheus.ch"
#include "msobject.ch"
#include "totvs.framework.treports.integratedprovider.th"
// Cria um novo namespace para sua classe
namespace custom.bunzl.businessobject
// Caso queira desativar a utilização da classe mudar para active=.F.
@totvsFrameworkTReportsIntegratedProvider(active=.T., team="SIGACOM", tables="SC1, SC7", name="Solicitação de Compra", country="BRA", initialRelease="12.1.2210", customTables="SC1, SC7")
/*
{Protheus.doc} CustomPurchaseRequestBusinessObject
Classe para criação do Objeto de Negócio de Solicitação de Compra customizado para o SmartView
@author weslley.pereira
@since 16/01/2025
@version 1.0
*/
class CustomPurchaseRequestBusinessObject from totvs.framework.treports.integratedprovider.IntegratedProvider
//Propriedades da Classe
protected data aFields as array
protected data aStruct as array
protected data oStatement as object
protected data cAlias as character
//Métodos da Classe
public method new() as object
public method getData(nPage as numeric, oFilter as object) as object
public method getSchema() as object
protected method getStruct(aFlds as Array) as array
endclass
/*---------------------------------------------------------
{Protheus.doc} new
Método Construtor
@return object: self
@author weslley.pereira
@since 16/01/2025
@version 1.0
----------------------------------------------------------*/
method new() class CustomPurchaseRequestBusinessObject
Local aFieldsSC1 as array
Local aFieldsSC7 as array
Local aAux as array
Local nLen as numeric
_Super:new() //Instancia o método construtor da classe pai herdada pela CustomPurchaseRequestBusinessObject
self:aFields := {}
self:appendArea("Compras")
self:setDisplayName("Bunzl - Solicitação de Compra - [SC1/SC7]")
self:setDescription("Bunzl - Objeto de Negócio utilizado para visão de Solicitação de Compra [SC1/SC7]")
aFieldsSC1 := FWSX3Util():GetAllFields("SC1")
self:aStruct := ::getStruct(aFieldsSC1)
aFieldsSC7 := FWSX3Util():GetAllFields("SC7")
aAux := ::getStruct(aFieldsSC7)
//Concatena a estrutura dos campos da SC7 na estrutura do relatório, onde já está a estrutura dos campos da SC1
nLen := len(self:aStruct)
asize(self:aStruct, nLen + len(aAux))
acopy(aAux, self:aStruct, 1, len(aAux), nLen + 1)
return self
/*---------------------------------------------------------
{Protheus.doc} getData
Método que 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 os filtros aplicados ao relatório
@return object: self:oData
@author weslley.pereira
@since 16/01/2025
@version 1.0
----------------------------------------------------------*/
method getData() as object class CustomPurchaseRequestBusinessObject
Local cQuery as character
Local nSkip as numeric
Local nCount as numeric
Local nx, nY as numeric
Local jItems as json
Local aPDFields as array
Local lParamUser as logical
Local nParamOrder := 1 as numeric
Local lObfuscated := .F. as logical
Local nTotRegPag := 1000 as numeric
local cCampo as character
nCount := 0
cQuery := ""
cQuery += " SELECT * " + CRLF
cQuery += " FROM ? SC1 " + CRLF
cQuery += " LEFT JOIN ? SC7 ON " + CRLF
cQuery += " C1_NUM = C7_NUMSC AND " + CRLF
cQuery += " C7_ITEMSC = C1_ITEM " + CRLF
cQuery += " WHERE SC1.D_E_L_E_T_ = ? AND " + CRLF
cQuery += " SC7.D_E_L_E_T_ = ? AND " + CRLF
//Filtros setados na interface do SmartView
if oFilter:hasFilter()
cQuery := " AND " + oFilter:getSQLExpression()
endif
//método para retorno do json dos parâmetros
jParams := oFilter:getParameters()
if ValType(jParams["01"]) <> "A" .and. ValType(jParams["02"]) <> "A"
lParamUser := .F.
endif
cQuery += " AND C7_FILIAL BETWEEN ? AND ? " + CRLF
cQuery += " ORDER BY C7_FILIAL, C7_NUMSC " + CRLF
self:oStatement := FWExecStatement():new(cQuery)
self:oStatement:SetUnsafe(nParamOrder++, RetSqlName("SC1"))
self:oStatement:SetUnsafe(nParamOrder++, RetSqlName("SC7"))
self:oStatement:SetString(nParamOrder++, space(1))
self:oStatement:SetString(nParamOrder++, space(1))
self:oStatement:SetString(nParamOrder++, AllTrim(jParams['01'][1]))
self:oStatement:SetString(nParamOrder++, AllTrim(jParams['02'][1]))
self:self:cAlias := self:oStatement:OpenAlias(GetNextAlias())
//Seto tamanho da página
self:setPageSize(nTotRegPag)
if nPage == 1
(self:cAlias)->(dbGoTop())
else
//Defino a quantidade que irei pular conforme a página atual
nSkip := ((nPage - 1) * self:getPageSize())
(self:cAlias)->(dbSkip(nSkip))
endif
//Tratamento para LGPD [ESTE OBJETO NÃO É NECESSÁRIO POR NÃO TER DADOS SENSÍVEIS]
//aPDFields := FWProtectedDataUtil():UsrAccessPDFields(__cUserID, self:aFields)
//lObfuscated := len(aPDFields) != len(self:aFields)
while !(self:cAlias)->(EOF())
jItems := JsonObject():new()
for nx := 1 to len(self:aStruct)
cCampo := self:aStruct[nx][1]
if lObfuscated .and. aScan(aPDFields, self:aStruct[nx][5]) == 0
jItems[cCampo] := FWProtectedDataUtil():ValueAsteriskToAnonymize((self:cAlias)->&(self:aStruct[nx][5])) //Esconde o dado na tela se for um dado protegido
else
if self:aStruct[nx][3] == "date"
jItems[cCampo] := totvs.framework.treports.date.stringToTimeStamp((self:cAlias)->&(cCampo))
elseif self:aStruct[nx][3] == "string"
jItems[cCampo] := ""
for nY := 1 to len(self:aStruct[nx][6])
if (self:cAlias)->&(self:aStruct[nx][5]) == SubStr(self:aStruct[nx][6][nY], 1, 1)
jItems[cCampo] := AllTrim(self:aStruct[nx][6][nY])
endif
next nY
if empty(jItems[cCampo])
jItems[cCampo] := (self:cAlias)->&(self:aStruct[nx][5])
endif
else
jItems[cCampo] := (self:cAlias)->&(self:aStruct[nx][5])
endif
endif
next nX
self:oData:appendData(jItems)
(self:cAlias)->(dbSkip())
nCount++
//Fim do processamento quando atingir o limite da página
if nCount == self:getPageSize()
exit
endif
enddo
//Define nova página se não for último registro
self:setHasNext(!(self:cAlias)->(EOF()))
dbSelectArea(self:cAlias)
(self:cAlias)->(dbCloseArea())
if Select(self:cAlias) == 0
FErase((self:cAlias)+GetDBExtension())
FErase("cArqInd"+OrdBagExt())
endif
return self:oData
/*---------------------------------------------------------
{Protheus.doc} getSchema
Retorna a estrutura dos campos
@return object: self:oSchema
@author weslley.pereira
@since 16/01/2025
@version 1.0
----------------------------------------------------------*/
method getSchema() as object class CustomPurchaseRequestBusinessObject
Local nX as numeric
for nX := 1 to len(self:aStruct)
self:addProperty(self:aStruct[nX][1], self:aStruct[nX][2], self:aStruct[nX][3], self:aStruct[nX][4], self:aStruct[nX][5])
next nX
//Defino pârametros Nativos para o meu Objeto de Negócio - com isso qualquer recurso que utilize este objeto já herdará estes parâmetros nativos.
self:addParameter("01", "Filial de", "string", .F.)
self:addParameter("02", "Filial até", "string", .F.)
//self:addParameter("03", "teste", "string", .F.)
//Consulta dos parâmetros
self:setCustomURL("01", "api/framework/v1/genericLookupService/smartview/SM0", 2)
self:setCustomURL("02", "api/framework/v1/genericLookupService/smartview/SM0", 2)
return self:oSchema
/*---------------------------------------------------------
{Protheus.doc} getStruct
Prepara a estrutura dos campos
@param aFlds array: Array com os campos do relatório
@return aFldTmp array: Array com a estrutura dos campos
@author weslley.pereira
@since 16/01/2025
@version 1.0
----------------------------------------------------------*/
method getStruct(aFlds as Array) as Array class CustomPurchaseRequestBusinessObject
Local aConvFld as array
Local aFldTmp as array
Local cCampo as character
Local cFldQry as character
Local cTipR as character
Local nPos as numeric
Local nC as numeric
Local cConteSX3 as character
aConvFld := {{"C", "String"}, {"D", "date"}, {"L", "boolean"}, {"M", "memo"}}
aFldTmp := {}
for nC := 1 to len(aFlds)
cFldQry := aFlds[nC]
nPos := AT(".", aFlds[nC]) + 1
if nPos > 0
cCampo := SubStr(cFldQry, nPos)
else
cCampo := cFldQry
endif
cTipo := GetSx3Cache(cCampo, "X3_TIPO")
if (nPos := aScan(aConvFld, {|c| c[01] == cTipo})) > 0
cTipR := aConvFld[nPos, 2]
else
cTipR := "string"
endif
cConteSX3 := GetSx3Cache(aFlds[nC], "X3_CONTEXT")
if cConteSX3 != "V"
aOpcoes := {}
aOpcoes := TkSx3Box(cCampo)
aadd(self:aFields, {AllTrim(upper(aFlds[nC]))})
aadd(aFldTmp, {cCampo, FWSX3Util():GetFieldDescription(cCampo), cTipR, FWSX3Titulo(upper(cCampo)), cCampo, aOpcoes})
endif
next nC
return (aFldTmp)
Qual o fonte que você compilou, poderia dar o exemplo? Chegou a verificar se reinicializando o appserver o seu objeto de negócios fica disponível no Smart View?
— Daniel Mendes 01 de Aug de 2024Cade o fonte? Ele só vai aparecer no objeto de negocios mesmo .
— Lucas de Paulo Santos 02 de Aug de 2024Como você fez para compilar um objeto de negocio usando o tlpp?
— Luccas 05 de Sep de 2024