Compilar TLPP - SmartView

Olá!

Estou conectado ao REST e compilei um fonte TLPP. A compilação é finalizada sem erro, porém o objeto de negocio não é criado no SmartView, gostaria de saber se alguem pode me ajudar com a dúvida que eu tenho, penso que talvez seria necesário relacionar algum dado no modulo configurador ou até mesmo revisar os parametros de comunicaçao no visual studio.

[Info - 15:30:11] Starting recompile.

[Info - 15:30:11] Starting build for environment desenv3.

[Info - 15:30:12] Starting build using RPO token ...

[Info - 15:30:12] Start file recompile.

[Info - 15:30:12] Using Includes: c:/includes

[Info - 15:30:12] Start regular compiling

c:/clientes/cia/p12/smartview/financeiro/cswfin0001.tlpp (1/1).

[Info - 15:30:12] [SUCCESS] Source

c:/clientes/cia/p12/smartview/financeiro/cswfin0001.tlpp compiled successfully.

[Info - 15:30:12] Committing end build. This could take a while...

[Info - 15:30:12] All files compiled successfully.

[Info - 15:30:12] Recompile finished.

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?

Cade o fonte? Ele só vai aparecer no objeto de negocios mesmo .

Como você fez para compilar um objeto de negocio usando o tlpp?

Entao amigo, Não sei como está o seu objeto de negócios, No seu código parece que você está setando um objeto de negócios já existente, Mas dentro do metodo, nao tem nenhum parametro para busca-lo, somente com o retorno. Posso estar errado mas acredito que esteja ai o erro.

Normalmente eu uso assim.


    method new() class SB1TReportsBusinessObject
        _Super:new()

        //Define a Área
        self:appendArea("Compras")

        //Define o nome do Objeto de Negócio
        self:setDisplayName("Produtos") 

        //Define a descrição do Objeto de Negócio
        self:setDescription("Produtos do Protheus")

        //ativando o combobox   
        self:setIsCBoxLookup(.T.,.F.) 

        //ele vai puxar os dados do schema com o Lookup
        self:setIsLookup(.T.)

    return self

Como você está consultando os logs?

o que é objeto de negocio? tem documentacao no tdn isso?

Voce esta compilando no rpo errado.

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)