Páginas filhas
  • Smart View - Gerando os recursos através de uma função

Versões comparadas

Chave

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

Essa função será depreciada a parte da LIB Label 20240226, utilizar a nova classe: Classe para execução dos recursos no Protheus

Função criada para execução dos relatórios do Smart View a partir do cadastro na tabela de De/Para ( FW_TREP_CONTROLLER )

...

Disponível a partir da LIB Label 20230227

Informações
titleLogs

É possível ver os logs da função ligando a chave FwTraceLog=1 no INI do ambiente utilizado, para mais informações sobre a chave: Chaves para controle de logs

...

...

Os arquivos .trp são os layouts exportados do Smart View e que servem para a Importação Automática de Recursos dentro do Protheus, esse processo é possível através da rotina Amarração Protheus x Smart View e utilizando a função totvs.framework.treports.callTReports.

Definimos um padrão de nomenclatura para esse arquivo para que possamos unificar recursos que utilizem o mesmo objeto de negócio, para que o usuário possa escolher diferentes recursos em uma única chamada de menu/rotina.

Irei exemplificar a nomenclatura de um layout de relatório abaixo:

  •  framework.sv.framework.product.subtitle.rep.bra.trp

Onde:

  • framework: Nome da área/tribe responsável;
  • sv: Agrupador de inovação;
  • framework: Módulo Responsável;
  • product: Nome do ON;
  • subtitle: Nome complementar do ON (Ex: Analítico, Sintético...);
  • rep: Tipo de Layout (rep=Report/pv=Pivot Table/dg=Data Grid);
  • bra: País do ON;

Exemplo de como seria a nomenclatura de um layout de tabela dinâmica:

  • framework.sv.framework.product.default.pv.trp

Todos os complementos da nomenclatura são obrigatórios, com exceção do país do ON.

Se a nomenclatura do layout não tiver o país, como no exemplo acima, consideramos que esse layout é para todos os países.

...

titleArquivo .trp

Para criar o arquivo .trp deve ser seguido os passos demonstrados no gif abaixo:

Image Removed

Não deverão ser utilizados programas para compactar, podendo dar problemas na descompactação do arquivo.

...

Função totvs.framework.treports.callTReports

...

NomeTipoObrigatórioDefaultDescrição
cIdProtcaractereX
Id do relatório que será impresso (relacionado ao nome do arquivo .trp)
cTypecaractereApenas se for um recurso individual
Tipo de dado (report, pivot-table ou data-grid)
nPrintTypenuméricoApenas se for utilizada em jobo recurso sem interface
Tipo do impressão (Arquivo=1, Email=2)
jPrintInfojsonApenas se for utilizada em jobo recurso sem interface
Informações para a impressão do relatório
jParamsjsonSe houver parâmetros no relatório
Parâmetros do relatório
lRunInJoblRunNoInterfacelógico
.T.Indica se irá executar em jobsem interface
lShowParams (Disponível a partir da LIB Label 20230807)lógico
.T.Indica se irá mostrar a tela de parâmetros (se for geração em job esse sem interface esse parâmetro sempre é .F.)

lWizard (Disponível a partir da LIB Label 20231009)

lógico
.F.Indica se exibe o wizard de configuração do Smart View, caso o ambiente não esteja preparado
cError (Disponível a partir da LIB Label 20231009)caractere

Indica o erro na execução [referência]
Informações
titleParâmetros

Ao utilizar a geração em job sem interface o desenvolvedor deve ter conhecimento dos parâmetros cadastrados no Smart View, pois os mesmos serão enviados a partir do jParams

...

Informações
titleDisponibilidade

Funcionalidade disponível a partir da LIB Label 20231009

Com o padrão de nomenclatura definido acima Padrão para nomenclatura dos arquivos .trp (layouts) correto, é possível unificar os recursos em apenas uma chamada, sendo:

...

Bloco de código
titleUnificação do Menu
collapsetrue
#include "protheus.ch"
#include "fwmvcdef.ch"

//-------------------------------------------------------------------
/*/{Protheus.doc} poc_mvc
Exemplo de um modelo e view baseado em uma unica tabela com chamada
de um relatório no treports pela função totvs.framework.treports.callTReports

@author  Vanessa Ruama
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
User Function poc_mvc()
    Local oBrowse As Object
	
	oBrowse := FWMBrowse():New()
	oBrowse:SetAlias('SC7')
	oBrowse:SetDescription('Pedido de Compras')
	oBrowse:Activate()
		
Return

//-------------------------------------------------------------------
/*/{Protheus.doc} MenuDef
Função para carregamento do menu.

@return aRotina, array, array com as opções de menu.

@author  Vanessa Ruama
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function MenuDef()
    Local aRotina As Array
    Local aMedicao As Array

    aRotina := {}
    aMedicao := {}

    ADD OPTION aRotina TITLE 'Visualizar'           ACTION 'VIEWDEF.poc_mvc' OPERATION 2 ACCESS 0
    ADD OPTION aRotina TITLE 'Incluir'              ACTION 'VIEWDEF.poc_mvc' OPERATION 3 ACCESS 0
    ADD OPTION aRotina TITLE 'Alterar'              ACTION 'VIEWDEF.poc_mvc' OPERATION 4 ACCESS 0
    ADD OPTION aRotina TITLE 'Excluir'              ACTION 'VIEWDEF.poc_mvc' OPERATION 5 ACCESS 0
    ADD OPTION aRotina TITLE 'Imprimir Multi'       ACTION 'callMulti'       OPERATION 8 ACCESS 0
Return aRotina

//-------------------------------------------------------------------
/*/{Protheus.doc} ModelDef
Definição do model referente aos pedidos

@return oModel, objeto, objeto do modelo

@author  Vanessa Ruama
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ModelDef()
    Local oModel As Object
    Local oStruSC7 As Object

    oStruSC7 := FWFormStruct(1,"SC7")

	oModel := MPFormModel():New("PEDIDO")
	oModel:SetDescription("Pedido de Compras")
	
	oModel:addFields('MASTERSC7',,oStruSC7)
	oModel:getModel('MASTERSC7'):SetDescription('Pedido de Compras')
	 
Return oModel

//-------------------------------------------------------------------
/*{Protheus.doc} ViewDef
Interface do modelo de dados

@return oView , objeto, retorna a view do modelo

@author  Vanessa Ruama
@since   01/12/2022
@version 1.0
*/
//-------------------------------------------------------------------
Static Function ViewDef()
Local oModel := ModelDef()
Local oView
Local oStrSC7:= FWFormStruct(2, 'SC7')
	
	oView := FWFormView():New()
	oView:SetModel(oModel)

	oView:AddField('FORM_PROD' , oStrSC7,'MASTERSC7' ) 
	oView:CreateHorizontalBox( 'BOX_FORM_PROD', 100)
	oView:SetOwnerView('FORM_PROD','BOX_FORM_PROD')	
	
Return oView

//-------------------------------------------------------------------
/*{Protheus.doc} callMulti
Chamada de múltiplos recursos do Smart View

@author  Vanessa Ruama
@since   15/09/2023
@version 1.0
*/
//-------------------------------------------------------------------
Function callMulti()
	Local lSuccess As logical
    Local cError as character

    //1º parâmetro = Relatório cadastrado na tabela de De/Para (Campo TR__IDREL)
    //2º parâmetro = Tipo do relatório ("reports" = relatório comum, "data-grid" = visão de dados, "pivot-table" = tabela dinâmica)
    //3º parâmetro = Tipo do impressão (Arquivo=1, Email=2)
    //4º parâmetro = Informações de impressão
    //5º parâmetro = Parâmetros do relatório
    //6º parâmetro = Indica se executa emsem a jobinterface
 	//7º parâmetro = Indica se exibe os parâmetros para preenchimento
	//8º parâmetro = Indica se exibe o wizard de configuração do Smart View
 	//9º parâmetro = Erro da execução
	
	//Disponível a partir da LIB Label 20231009
	lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product",,,,,.F.,,.T., @cError)

	If !lSuccess
		Conout(cError)
	EndIf	
Return .T.

...

Bloco de código
titleExemplo com interface mvc e executando em jobsem interface
collapsetrue
#include "protheus.ch"
#include "fwmvcdef.ch"

//-------------------------------------------------------------------
/*/{Protheus.doc} poc_mvc
Exemplo de um modelo e view baseado em uma unica tabela com chamada
de um relatório no Smart View pela função totvs.framework.treports.callTReports  

@author  Framework
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
User Function poc_mvc()
    Local oBrowse As Object
	
	oBrowse := FWMBrowse():New()
	oBrowse:SetAlias('SB1')
	oBrowse:SetDescription('Cadastro de Produtos')
	oBrowse:Activate()
		
Return

//-------------------------------------------------------------------
/*/{Protheus.doc} MenuDef
Função para carregamento do menu.

@return aRotina, array, array com as opções de menu.

@author  Framework
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function MenuDef()
    Local aRotina As Array

    aRotina := {}

    ADD OPTION aRotina TITLE 'Visualizar'           ACTION 'VIEWDEF.poc_mvc' OPERATION 2 ACCESS 0
    ADD OPTION aRotina TITLE 'Incluir'              ACTION 'VIEWDEF.poc_mvc' OPERATION 3 ACCESS 0
    ADD OPTION aRotina TITLE 'Alterar'              ACTION 'VIEWDEF.poc_mvc' OPERATION 4 ACCESS 0
    ADD OPTION aRotina TITLE 'Excluir'              ACTION 'VIEWDEF.poc_mvc' OPERATION 5 ACCESS 0
    ADD OPTION aRotina TITLE 'Imprimir'             ACTION 'VIEWDEF.poc_mvc' OPERATION 8 ACCESS 0
    ADD OPTION aRotina TITLE 'Imprimir Smart View'  ACTION 'callTrep'        OPERATION 8 ACCESS 0
    ADD OPTION aRotina TITLE 'Copiar'               ACTION 'VIEWDEF.poc_mvc' OPERATION 9 ACCESS 0

Return aRotina

//-------------------------------------------------------------------
/*/{Protheus.doc} ModelDef
Definição do model referente aos produtos

@return oModel, objeto, objeto do modelo

@author  Framework
@since   01/12/2022
@version 1.0
/*/
//-------------------------------------------------------------------
Static Function ModelDef()
    Local oModel As Object
    Local oStruSB1 As Object

    oStruSB1 := FWFormStruct(1,"SB1")

	oModel := MPFormModel():New("PRODUTOS")
	oModel:SetDescription("Produtos - SB1")
	
	oModel:addFields('MASTERSB1',,oStruSB1)
	oModel:getModel('MASTERSB1'):SetDescription('Produtos - SB1')
	 
Return oModel

//-------------------------------------------------------------------
/*{Protheus.doc} ViewDef
Interface do modelo de dados

@return oView , objeto, retorna a view do modelo

@author  Framework
@since   01/12/2022
@version 1.0
*/
//-------------------------------------------------------------------
Static Function ViewDef()
Local oModel := ModelDef()
Local oView
Local oStrSB1:= FWFormStruct(2, 'SB1')
	
	oView := FWFormView():New()
	oView:SetModel(oModel)

	oView:AddField('FORM_PROD' , oStrSB1,'MASTERSB1' ) 
	oView:CreateHorizontalBox( 'BOX_FORM_PROD', 100)
	oView:SetOwnerView('FORM_PROD','BOX_FORM_PROD')	
	
Return oView

//-------------------------------------------------------------------
/*{Protheus.doc} callTReports Função para chamada do relatório do Smart View

@author  Framework
@since   01/12/2022
@version 1.0
*/
//-------------------------------------------------------------------
Function callTrep()
    Local lSuccess As Logical

    //1º parâmetro = Relatório cadastrado na tabela de De/Para (Campo TR__IDREL)
    //2º parâmetro = Tipo do relatório ("reports" = relatório, "data-grid" = visão de dados, "pivot-table" = tabela dinâmica)
	//Como não foi mandado o 6º parâmetro como .F. o relatório será gerado emsem jobinterface, caso esse parâmetro seja enviado será aberta a tela de opções
	lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product.default.pv", "pivot-table")      
    If !lSuccess
        Conout("Erro na geração, verificar logs")
    EndIf

Return
Bloco de código
titleExemplo sem interface e geração de arquivo
collapsetrue
User Function treportsJobtreportsNoInterface()
	Local lSuccess As Logical
	Local jParams As Json
    Local jPrintInfo As Json

    RpcSetEnv('T1', 'M PR 02', "admin", "1234") //Caso não tenha ambiente aberto

    //Preencher os parâmetros do relatório, caso o mesmo tenha parâmetro
	jParams := JsonObject():New()
	jParams['filial'] := "M PR 02"
	jParams['periodo'] := "201601"
	jParams['matriculade'] := "000003"
	jParams['matriculaate'] := "000003"

    jPrintInfo := JsonObject():New()  
    jPrintInfo['name'] := "GPER040_" + FwTimeStamp() //Adicionado o timestamp para não ter conflito no nome do arquivo 
    jPrintInfo['path'] := "C:\relatórios\"
	jPrintInfo['extension'] := "pdf"

    //1º parâmetro = Relatório cadastrado na tabela de De/Para (Campo TR__IDREL)
    //2º parâmetro = Tipo do relatório ("reports" = relatório, "data-grid" = visão de dados, "pivot-table" = tabela dinâmica)
	//3º parâmetro = Tipo de impressão (1 = Arquivo, 2 = E-mail )   
    //4º parâmetro = Informações de impressão    
    //5º parâmetro = Parâmetros do relatório
    lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product.synthetic.rep.bra", "report", 1, jPrintInfo, jParams)

    If !lSuccess
        Conout("Erro na geração, verificar logs")
    EndIf 
Return
Bloco de código
titleExemplo sem interface e envio por e-mail
collapsetrue
User Function treportsJobtreportsNoInterface()
	Local lSuccess As Logical
    Local jPrintInfo As Json

    RpcSetEnv('T1', 'M PR 02', "admin", "1234") //Necessário identificar o usuário no rpcsetenv ou após       

    jPrintInfo := JsonObject():New()     
    jPrintInfo['to'] := "[email protected]" //Obrigatório setar o destinatário
    jPrintInfo['name'] := "Produtos - " + FWTimeStamp()

    //1º parâmetro = Relatório cadastrado na tabela de De/Para (Campo TR__IDREL)
    //2º parâmetro = Tipo do relatório ("reports" = relatório, "data-grid" = visão de dados, "pivot-table" = tabela dinâmica)
	//3º parâmetro = Tipo de impressão (1 = Arquivo, 2 = E-mail )   
    //4º parâmetro = Informações de impressão    
    lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product.analytical.rep.bra", "report", 2, jPrintInfo)

    If !lSuccess
        Conout("Erro na geração e envio do e-mail, verificar logs")
    EndIf 
Return

...

  • Os tipos de relatório pivot-table e data-grid serão gerados apenas com interface.
  • Os parâmetros do relatório deverão ser enviados pela função, caso seja geração em jobsem interface.
  • Ao enviar o nome do relatório na propriedade 'name', enviada pelo json jPrintInfo, deverá se atentar a nomes iguais, caso a função seja chamada em jobsem interface. A sugestão é colocar o nome + FWTimeStamp()