Páginas filhas
  • Classe para execução dos recursos no Protheus

Classe criada para a execução de recursos do Smart View no Protheus.

Disponível

Disponível a partir da LIB Label 20240226

Logs

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


Índice


Pré-requisitos

  • Já ter feito a instalação e integração com o Smart View, mais informações nos links:

           Instalação do Smart View

           Requisitos Mínimos


Unificando o Menu/Rotina com recursos diferentes

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

  • Múltiplos Relatórios
  • Múltiplas Tabelas Dinâmicas
  • Múltiplas Visões de Dados

Para isso preciso ter os 4 .trp's compilados (no caso da importação automática) e com as nomenclaturas corretas, como no exemplo abaixo:

  • Relatório 1 -  framework.sv.framework.product.synthetic.rep.bra.trp
  • Relatório 2 -  framework.sv.framework.product.analytical.rep.bra.trp
  • Tabela Dinâmica - framework.sv.framework.product.default.pv.trp
  • Visão de Dados - framework.sv.framework.product.default.dg.trp

Para a chamada do recurso o ID enviado (cProtheusId) no método new() desta classe deverá ser o seguinte: framework.sv.framework.product (área responsável + agrupador + modulo + nome do ON) e não deve ser mandado o parâmetro que indica o tipo do recurso, já que o recurso deverá ser escolhido pelo usuário.

Para utilizar o recurso individual o ID enviado na classe deverá ser o nome completo do layout, ex.:  framework.sv.framework.product.synthetic.rep.bra


Métodos

New()

Método de instância da classe.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
cProtheusIdCaractereX
Id do recurso que será impresso (relacionado ao nome do arquivo .trp)
cTypeCaractereApenas quando for a execução de recurso único
Tipo do recurso (report, pivot-table ou data-grid)

Exemplos de uso:

Recurso único
oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product.default.rep.bra", "report")
Múltiplos recursos
oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product")

Sintaxe: New() → objeto self


setRunInJob()

Indica se executa o relatório em job

Esse método deverá ser utilizado apenas para relatórios.

Utilizando a geração em job o método executeSmartView da classe sempre retornará .T., pois será iniciado um startJob, sendo possível verificar a geração a partir do console.log com a chave FwTraceLog=1 ligada.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lIsJobLógicoX.F.Indica se o recurso será executado em job

Exemplo de uso:

oSmartView:setRunInJob(.T.)

Sintaxe: setRunInJob(<lIsJob>) → nil


setNoInterface()

Indica se executa o relatório sem a interface.

Esse método deverá ser utilizado apenas para relatórios.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lNoInterfaceLógicoX.F.Indica se o recurso será executado sem interface

Exemplo de uso:

oSmartView:setNoInterface(.T.)

Sintaxe: setNoInterface(<lNoInterface>) → nil


setShowWizard()

Indica se exibe o wizard de configuração caso o ambiente esteja despreparado para o uso da integração.

Esse método deverá ser utilizado apenas para relatórios.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lShowWizardLógicoX.F.Indica se abre o wizard de configuração

Exemplo de uso:

oSmartView:setShowWizard(.T.)

Sintaxe: setShowWizard(<lShowWizard>) → nil


setShowParams()

Indica se exibe o botão de parâmetros para que o usuário edite.

Esse método deverá ser utilizado apenas para relatórios.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lShowParamsLógicoX.T.Indica irá mostrar o botão de parâmetros

Exemplo de uso:

oSmartView:setShowParams(.T.)

Sintaxe: setShowParams(<lShowParams>) → nil


setParameters()

Indica os parâmetros do recurso.

Neste método é considerado o envio de todos os parâmetros de uma vez, para enviar um de cada, pode-se utilizar o método setParam(), não é possível utilizar os dois métodos ao mesmo tempo, pois um sobrescreve o outro.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
jParamsJsonX
Parâmetros que serão setados no recurso

Formato esperado:

{
   "parameters":[
      {
         "name":"MV_PAR01",
         "value":"",
         "visibility":"Default"
      },
      {
         "name":"MV_PAR02",
         "value":"ZZZZ"
      },
      {
         "name":"MV_PAR03",
         "value":"D MG 03, M SP 01",
         "visibility":"Hidden"
      }
   ],
   "force":false
}

Propriedade force:

  • Caso seja enviado como .T. indica que irá sobrescrever o profile do usuário com os parâmetros enviados, caso alguns parâmetros não sejam enviados ficarão com o valor do profile.

Propriedade visibility:

  • Default - O parâmetro é exibido e pode ter seu valor alterado pelo usuário;
  • Hidden - O parâmetro não é exibido no viewer;
  • Disabled - O parâmetro é exibido no viewer, porém o usuário não pode alterar seu valor.

Caso a mesma não seja enviada, terá o valor 'Default'

Parâmetros multivalores:

  • Deverão ser enviados como string e separados por ';'. Ex.: "D MG 01; D MG 02"

Parâmetros do tipo data:

Exemplo de uso:

jParams := JsonObject():new()
jParams["parameters"] := Array(2)
jParams["force"] := .T. //Indica se força o valor
jParams["parameters"][1] := JsonObject():New()
jParams["parameters"][1]["name"] := "MV_PAR01"
jParams["parameters"][1]["value"] := ""
jParams["parameters"][1]["visibility"] := "Disabled"
    
jParams["parameters"][2] := JsonObject():New()
jParams["parameters"][2]["name"] := "MV_PAR02"
jParams["parameters"][2]["value"] := "ZZZZ"
jParams["parameters"][2]["visibility"] := "Disabled"

oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product")
oSmartView:setParameters(jParams)

Sintaxe: setParameters(<jParams>) → nil


setParam()

Indica o valor de um parâmetro do relatório.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
cNameCaractereX
Identificação do parâmetro, ex.: MV_PAR01
xValueVarianteX
Valor do parâmetro
cVisibilityCaractere
DefaultVisibilidade do Parâmetro

Exemplo de uso:

oSmartView:setParam("MV_PAR01", "", "Disabled")
oSmartView:setParam("MV_PAR02", "ZZZZZ")
oSmartView:setParam("MV_PAR03", 2, "Hidden")
oSmartView:setParam("MV_PAR04", totvs.framework.treports.date.stringToTimeStamp("20240130"))

Sintaxe: setParam(<cName>, <xValue>, <cVisibility>) → nil


setForceParams()

Indica se irá forçar o preenchimento dos parâmetros com o valores enviados.

Com o force ativado o profile do usuário sempre será sobrescrito com os valores dos parâmetros enviados, aqueles que não forem enviados, será preenchido pelo profile, caso exista.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lForceLógicoX.F.Indica se força os valores dos parâmetros

Exemplo de uso:

oSmartView:setForceParams(.T.)

Sintaxe: setForceParams(<lForce>) → nil


setPrintType()

Indica o tipo de impressão.

Esse método deverá ser utilizado apenas para relatórios.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
nPrintTypeNuméricoX1

Tipo de impressão, sendo elas:

1 - Arquivo

2 - E-mail

Exemplo de uso:

oSmartView:setPrintType(1)

Sintaxe: setPrintType(<nPrintType>) → nil


setPrintInfo()

Indica os valores de impressão do recurso.

Esse método deverá ser utilizado apenas para relatórios.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
jPrintInfoJsonX
Informações de impressão.

Formato esperado:

É necessário o envio de algumas informações sobre a impressão a partir do jPrintInfo, sendo elas:

  • Opção 1 - Impressão em arquivo

Propriedades:

Propriedades

Obrigatório

Default

Descrição

name
Nome do relatório na tabela (TR__IDREL) + Data/HoraNome do arquivo
extension
pdfExtensão
path
MV_RELTPasta onde será salvo


  • Opção 2 - Impressão por E-mail

Propriedades:

Propriedades

Obrigatório

Default

Descrição

toX
Destinatário do E-mail
subject
Relatório Smart ViewAssunto do E-mail
body

Descrição do relatório (TR__DESCRI)

Corpo do -email
name
Nome do relatório na tabela (TR__IDREL) + Data/HoraNome do arquivo
extension
pdfExtensão
path
MV_RELTPasta onde será salvo

Necessário ter configurado o SMTP para envio de e-mail - Configurar o SMTP para envio de relatórios por e-mail

Extensões disponíveis

O tWebEngine possui uma proteção para não realizar download de arquivos maliciosos. Por padrão é possível realizar download de arquivos do Smart View com as seguintes extensões: pdf, xls, xlsx, rtf, docx, mht, html, txt, csv e png.

Caso seja necessário realizar o download de outras extensões deve ser realizado tratamento pelo ponto de entrada AddLexList (https://tdn.totvs.com/display/PROT/AdDLExList). Para utilizar este ponto de entrada é necessário o fonte FwDLExList.prw mais atual.

Exemplo de uso:

jPrintInfo := jsonObject():new()
jPrintInfo["extension"] := "xlsx"
jPrintInfo["name"] := "product" + FWTimeStamp()
oSmartView:setPrintInfo(jPrintInfo)

Sintaxe: setPrintInfo(<jPrintInfo>) → nil


executeSmartView()

Executa o recurso escolhido.

Retorno: 

Nome

TipoDescrição
lSuccessLógico

Indica o erro na execução

Exemplo de uso:

lSuccess := oSmartView:executeSmartView()

Sintaxe: oSmartView:executeSmartView() → lSuccess


setOpenFile()

Indica se abre o arquivo após a impressão.

Disponível a partir da LIB Label 20250113


Arquivos não serão abertos se gerados via job;

Arquivos não serão abertos se gerados na pasta Spool;

Para abrir arquivos no WebApp, é obrigatório o uso do agent.

Parâmetros: 

Nome

TipoObrigatórioDefaultDescrição
lOpenFileLógicoX.T.Indica se abre o arquivo gerado

Exemplo de uso:

oSmartView:setForceParams(.T.)

Sintaxe: oSmartView:setForceParams(.T.) → nil


getError()

Retorna o erro na geração.

Retorno: 

Nome

TipoDescrição
cErrorCaractere

Indica o erro na execução

Exemplo de uso:

cError := oSmartView:getError()

Sintaxe: oSmartView:getError() → cError


destroy()

Remove os recursos que podem prender memória.Exemplo de uso:

oSmartView:destroy()

Sintaxe: oSmartView:destroy() → nil


Exemplos completos

Geração em job
#include "protheus.ch"

user function sv_job()
	local oSmartView as object
    
    RpcSetEnv('T1', 'D MG 01', "admin", "1234") //Necessário ter o ambiente inicializado
	
	//Para geração em job sempre deverá ser setado um recurso único
    oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product.default.rep.bra", "report")
    oSmartView:setRunInJob(.T.)
    oSmartView:setParam("MV_PAR01", "", "Disabled")
    oSmartView:setParam("MV_PAR02", "ZZZZZ")
	oSmartView:setPrintType(1)
    oSmartView:executeSmartView() //A geração deverá ser acompanhada via logs pelo server
    oSmartView:destroy()
return
Geração sem interface
#include "protheus.ch"

user function sv_noInterface()
    local lSuccess as logical
	local oSmartView as object
	local jPrint as json
    
    RpcSetEnv('T1', 'D MG 01', "admin", "1234") //Necessário ter o ambiente inicializado
	
	//Para geração sem interface sempre deverá ser setado um recurso único
    oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product.default.rep.bra", "report")
    oSmartView:setNoInterface(.T.)
    oSmartView:setParam("MV_PAR01", "", "Disabled")
    oSmartView:setParam("MV_PAR02", "ZZZZZ")
	oSmartView:setPrintType(1) 

    jPrint := jsonObject():new()
    jPrint["extension"] := "xlsx"
    jPrint["name"] := "teste_print" + FWTimeStamp()
    oSmartView:setPrintInfo(jPrint)  
  
 	lSuccess := oSmartView:executeSmartView()  

 	If !lSuccess
		Conout(oSmartView:getError())
	EndIf	
	   
	oSmartView:destroy()
return
Geração de recurso único com interface
#include "protheus.ch"

user Function callSV()
	local lSuccess As logical
    local jParams as json
	local oSmartView as object

    jParams := JsonObject():new()
    jParams["parameters"] := Array(2)
    jParams["force"] := .T. //Indica se força o valor
    jParams["parameters"][1] := JsonObject():New()
    jParams["parameters"][1]["name"] := "MV_PAR01"
    jParams["parameters"][1]["value"] := ""
    jParams["parameters"][1]["visibility"] := "Disabled"
    
    jParams["parameters"][2] := JsonObject():New()
    jParams["parameters"][2]["name"] := "MV_PAR02"
    jParams["parameters"][2]["value"] := "ZZZZ"
    jParams["parameters"][2]["visibility"] := "Disabled"

    oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product.synt.rep.bra", "report")
    oSmartView:setParameters(jParams)
    lSuccess := oSmartView:executeSmartView()

	If !lSuccess
		Conout(oSmartView:getError())
	EndIf	

    oSmartView:destroy()
return .T.
Geração de múltiplos recursos com interface
#include "protheus.ch"

user Function callMultiSV()
	local lSuccess As logical
	local oSmartView as object

    oSmartView := totvs.framework.smartview.callSmartView():new("framework.sv.framework.product")
    oSmartView:setParam("MV_PAR01", "")
    oSmartView:setParam("MV_PAR02", "ZZZZZ")
	oSmartView:setParam("MV_PAR03", 2) 
	oSmartView:setParam("MV_PAR04", totvs.framework.treports.date.dateToTimeStamp(date()))
    
	lSuccess := oSmartView:executeSmartView()

	If !lSuccess
		Conout(oSmartView:getError())
	EndIf	

    oSmartView:destroy()
return .T.