Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Informações

Objeto oData

Serão feitos tratamentos internos neste objeto.

Ele possui apenas dois métodos para uso externo, usado em conjunto com os métodos da nova classe, sendo eles:

Método AliasToData() - Método do objeto oData que converte o alias recebido em dados para o TReports.

NomeTipoObrigatórioDefaultDescrição
cAliasCaracterX
Workarea que será trabalhada
oFilterObjetoX
Objeto de filtro do TReports
nPage (Disponível a partir da LIB Label 20220613)NuméricoX
Indica a página atual do relatório

Método AppendData() - Método do objeto oData que adiciona um json para o array de dados.

Parâmetros:

NomeTipoObrigatórioDefaultDescrição
jDataJsonX
Json contendo os dados (chave:valor)

Exemplos de uso estarão abaixo nos métodos criados para a classe IntegratedProvider.

...

Informações

Método deverá ser utilizado no new() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
lKeyLabelLógicoX.F.Indica que o filtro lookup será do tipo key-label
lX3Lógico
.F.Indica que utilizará o SX3 para recuperar os valores do key-label dos campos

Exemplo de uso:

Bloco de código
self:setIsCBoxLookup(.T., .T.)

...

Informações

Método deverá ser utilizado no getSchema() após a criação dos campos da nova classe, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cFieldCaracterX
Campo que receberá o LookUp Key-Label

cComboValues

CaracterX
Valores do key-label (Formato igual ao combobox da SX3, ex.: "D MG 01=Filial BH" separado por ; caso tenha mais de uma opção)

lIsRequired

Lógico
.F.Indica que é obrigatório o preenchimento do campo.

Utilização com o método addProperty() documentado acima

...

Informações

Método deverá ser utilizado no new() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
lIsLookUpLógicoX.F.Indica que o filtro será do tipo padrão lookup

Exemplo de uso:

Bloco de código
self:setIsLookup(.T.)

...

Informações

Método deverá ser utilizado no getSchema() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cIdCaracter
IDIndica o cabeçalho de exibição da chave do lookup
cProdCaracter
CódigoIndica o cabeçalho de exibição do código do lookup (Mesmo conteúdo do ID)
cDescCaracter
DescriçãoIndica o cabeçalho de exibição da descrição do lookup

Exemplo de uso:

Bloco de código
self:oSchema:setDescriptor("Código","Código do Produto", "Descrição do Produto")

...

Informações

Método deverá ser utilizado no getSchema() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cFieldCaracterX
Indica o campo que será setado a consulta
aStructArrayX

Indica a estrutura que será utilizada no Lookup

Exemplo da estrutura:

aStruct[1][1]:"ATF0510001"
aStruct[1][2]:"ATFA036 EMISSAO DE NOTA EM LOT"

aStruct[2][1]:"0003"
aStruct[2][2]:"PRODUTO PADRAO"

lIsRequiredLógico
.F.Indica que é obrigatório o preenchimento do campo

Exemplo de uso:

Bloco de código
self:oSchema:setLookUpVal(cField, aStruct, lIsRequired)

...

Informações

Método deverá ser utilizado no getSchema() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cFieldCaracterX
Indica o campo que será setado a consulta
cTableCaracterX

Indica a tabela da SX5 que será utilizada para buscar a estrutura do lookup

lIsRequiredLógico
.F.Indica que é obrigatório o preenchimento do campo

Exemplo de uso:

Bloco de código
self:oSchema:setLookUpVal(cField, cTable, lIsRequired)

...

Informações

Método deverá ser utilizado no getSchema() da nova classe criada, exemplo completo estará no final da documentação.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição

cField

CaracterX
Campo que será setado a consulta
aFieldsArrayX

Indica os campos da estrutura da consulta (chave-descrição).

Exemplo:

aFields[1]:"ED_CODIGO"

aFields[2]:"ED_DESCRIC"

cQueryCaracterX

Indica a tabela da SX5 que será utilizada para buscar a estrutura do lookup

lIsRequiredLógico
.F.Indica que é obrigatório o preenchimento do campo

Exemplo de uso:

Bloco de código
self:oSchema:setLookUpQuery(cField, aFields, cQuery, lIsRequired)

...

O log de debug somente é ativado pela chave no environment: fw-treports-debug=1

Paginação no Objeto de Negócio

Aviso

Funcionalidade disponível a partir da LIB Label 20220613

Para facilitar a construção do Objeto de Negócio e melhorar a performance foi implementada a paginação na fonte de dados, além de simplificar a forma como ele é construído.

Método self:setPageSize()

Seta a quantidade de itens por página.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
nPageSizeNúmericoX100Indica a quantidade de itens por página

Exemplo de uso:

Bloco de código
self:setPagesize(nPageSize)

Sintaxe: self:setPagesize(<nPageSize>) → nil

Método self:getPageSize()

Retorna a quantidade de itens por página.

Exemplo de uso:

Bloco de código
self:getPagesize()

Sintaxe: self:getPagesize() → self:nPageSize

Método self:setQuery()

Seta a query do objeto de negócio.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cQueryCaracterX
Indica a query do objeto de negócio

Observações:

  • Se não forem enviados todos os campos (Exemplo: SELECT * FROM) deverá ser usado o ID #QueryFields# e os campos setados serão aqueles recuperados do método getSchema().
  • É possível escrever a query e setar o where dela posteriormente com o método self:setWhere(), para isso deverá ser utilizado o ID #QueryWhere# após o Where da query.

Exemplo de uso:

Bloco de código
cQuery := "SELECT * FROM " + RetSQLName("SB1") + " WHERE B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '
self:setQuery(cQuery)
Bloco de código
cQuery := "SELECT #QueryFields# FROM " + RetSQLName("SB1") + " WHERE B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '
self:setQuery(cQuery)
Bloco de código
cQuery := "SELECT #QueryFields# FROM " + RetSQLName("SB1") + "WHERE #QueryWhere#" //Usa o ID #QueryWhere# para setar o where posteriormente
self:setQuery(cQuery)
self:setWhere("B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '") 

Sintaxe: self:setQuery(<cQuery>) → nil


Método self:setWhere()

Seta o where da query.



Parâmetros:


Nome

TipoObrigatórioDefaultDescrição
cWhereCaracterX
Indica o where da query



Exemplo de uso:


Bloco de código
self:setWhere("B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '") 


Sintaxe: self:setWhere(<cWhere>) → nil

Método self:setOrder()

Seta o campo de ordenação da query.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
cOrderCaracterXPrimeiro campo indicado no método getSchema()Indica o campo de ordenação

Exemplo de uso:

Bloco de código
self:setWhere("B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '") 

Sintaxe: self:setOrder(<cOrder>) → nil

Método self:setHasNext()

Seta se terá próxima página.

Parâmetros:

Nome

TipoObrigatórioDefaultDescrição
lHasNextLógicoX.F.Indica se terá próxima página

Exemplo de uso:

Bloco de código
self:setHasNext(.T.) 

Sintaxe: self:setHasNext(<lHasNext>) → nil


Exemplos completos com paginação:

Bloco de código
titleExemplo completo - Query - Paginação automática
collapsetrue
#include "msobject.ch"
#include "totvs.framework.treports.integratedprovider.th"
 
namespace custom.materiais.produtos.integratedprovider
 
@totvsFrameworkTReportsIntegratedProvider(active=.T.)
class SB1TReportsBusinessObject from totvs.framework.treports.integratedprovider.IntegratedProvider
    public method new() as object
    public method getData() as object
    public method getSchema() as object
endclass
 
method new() class SB1TReportsBusinessObject
_Super:new()
//Define a Área
self:appendArea("Materiais")

//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")

return self

method getData() as object class SB1TReportsBusinessObject
local cQuery as character

//Define a quantidade máxima por página (Default 100)
self:setPageSize(20)

//Define a query do Objeto de Negócio
cQuery := "SELECT #QueryFields# FROM " + RetSQLName("SB1") +  "WHERE #QueryWhere#"
self:setQuery(cQuery)

//Define o campo de ordenação da query
self:setOrder("B1_COD")

//Define o where da query
self:setWhere("B1_FILIAL = '"+ FWxFilial('SB1') +"' AND D_E_L_E_T_ = ' '") 

return self:oData
 
method getSchema() as object class SB1TReportsBusinessObject

self:addProperty("Filial", "Filial", "string", "Filial", "B1_FILIAL")
self:addProperty("Codigo", "Codigo", "string", "Código", "B1_COD")
self:addProperty("Descricao", "Descricao", "string", "Descricao","B1_DESC")
self:addProperty("Tipo", "Tipo", "string", "Tipo","B1_TIPO")
self:addProperty("Unidade", "Unidade de medida", "string", "Unidade","B1_UM")
self:addProperty("Revisao", "Revisao", "date", "Revisao","B1_UREV")

return self:oSchema
Bloco de código
titleExemplo completo - AliasToData - Paginação automática
collapsetrue
#include "msobject.ch"
#include "totvs.framework.treports.integratedprovider.th"
 
namespace custom.materiais.produtos.integratedprovider
 
@totvsFrameworkTReportsIntegratedProvider(active=.T.)
class SB1TReportsBusinessObjectData from totvs.framework.treports.integratedprovider.IntegratedProvider
    public method new() as object
    public method getData() as object
    public method getSchema() as object
endclass
 
method new() class SB1TReportsBusinessObjectData
_Super:new()

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

//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")

return self

method getData(nPage as numeric, oFilter as object) as object class SB1TReportsBusinessObjectData
//Define a quantidade máxima por página (Default 100)
//self:setPageSize(100)

self:aliasToData("SB1", oFilter, nPage) //nPage obrigatório para paginação
return self:oData
 
method getSchema() as object class SB1TReportsBusinessObjectData
self:aliasToSchema("SB1")

return self:oSchema
Bloco de código
titleExemplo completo - Paginação manual
collapsetrue
#include "msobject.ch"
#include "protheus.ch"
#include "totvs.framework.treports.integratedprovider.th"
  
namespace custom.materiais
  
@totvsFrameworkTReportsIntegratedProvider(active=.T.)
class SB1TReportsBusinessObject 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
endclass
  
method new() class SB1TReportsBusinessObject
_Super:new()
self:appendArea("Materiais - KeyLabel")
self:setIsCBoxLookup(.T., .T.)
return self
  
method getDisplayName() as character class SB1TReportsBusinessObject
return "Produtos"
  
method getDescription() as character class SB1TReportsBusinessObject
return "Produtos do Protheus"
  
method getData(nPage as numeric, oFilter as object) as object class SB1TReportsBusinessObject
local cQuery as character
local cAlias as character
local nStart as numeric
local nEnd as numeric
  
cQuery := "SELECT B1_FILIAL, B1_COD, B1_DESC, B1_TIPO, B1_UM, B1_UREV, B1_FILIAL, B1_PRV1 FROM " + RetSQLName("SB1") + " WHERE D_E_L_E_T_ = ' '"
  
//Os filtros serão setados na interface do novo TReports
if oFilter:hasFilter()
    cQuery += " AND " + oFilter:getSQLExpression()
endif

//Seta a quantidade de itens por página (Default 100)
self:setPageSize(15)

//Indica que terá próxima página (Default .F.)
self:setHasNext(.T.)

//Seta o primeiro item e o último da página tual
nStart := ((nPage - 1) * self:getPageSize()) + 1
nEnd   := nPage * self:getPageSize()
  
cAlias := MPSysOpenQuery(cQuery)

//Posiciona no registro inicial  
(cAlias)->(DbGoTo(nStart))

while !(cAlias)->(Eof())
    cDate := FwTimeStamp(6, StoD((cAlias)->B1_UREV))
    self:oData:appendData({"Filial": (cAlias)->B1_FILIAL,;
            "Codigo": (cAlias)->B1_COD,;
            "Descricao": (cAlias)->B1_DESC,;
            "Tipo": (cAlias)->B1_TIPO, ;
            "Unidade": (cAlias)->B1_UM, ;
            "Revisao": cDate ,;
            "Preco": (cAlias)->B1_PRV1})
    (cAlias)->(DBSkip())

    if (cAlias)->(Recno()) > nEnd
        exit
    endif
enddo

if (cAlias)->(Eof())
    //Necessário informar quando não terá próxima página
    self:setHasNext(.F.)
endif

(cAlias)->(DBCloseArea())
  
return self:oData
  
method getSchema() as object class SB1TReportsBusinessObject
local cComboFil as character
 
cComboFil := "D MG 01=Filial BH; D MG 02=Filial Uberaba"
 
self:oSchema:addProperty("Filial", "Filial", "string", "Filial", "B1_FILIAL", cComboFil,.F.)
self:oSchema:addProperty("Codigo", "Codigo", "string", "Codigo", "B1_COD")
self:oSchema:addProperty("Descricao", "Descricao", "string", "Descricao","B1_DESC")
self:oSchema:addProperty("Tipo", "Tipo", "string", "Tipo","B1_TIPO")
self:oSchema:addProperty("Unidade", "Unidade de medida", "string", "Unidade","B1_UM")
self:oSchema:addProperty("Revisao", "Revisao", "date", "revisao","B1_UREV")
self:oSchema:addProperty("Data", "Data", "date", "Data","B1_UREV")
self:oSchema:addProperty("Preco", "Preço", "number", "Preço","B1_PRV1")

return self:oSchema