Histórico da Página
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
User Function treportsJob() 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 |
Enviando os parâmetros para os viewers externos
A partir da LIB Label 20240226 será possível enviar os parâmetros para os viewers externos do Smart View que são abertos no Protheus através do 5º parâmetro da função, isso facilitará o preenchimento feito pelo usuário que terão as opções carregadas do seu Profile/SX1 e também dos parâmetros enviados a partir da função.
Com esse recurso, também será possível bloquear parâmetros e também não exibi-los em tela.
Opções da 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.
Parâmetros multivalores:
- Deverão ser enviados como string e separados por ';'. Ex.: "D MG 01; D MG 02"
Parâmetros do tipo data:
- Utilizar as funções de conversão disponibilizadas na lib para enviar o formato correto. Doc: Smart View - Conversão de datas
1º Exemplo de um json preenchendo os parâmetros:
Bloco de código | ||||
---|---|---|---|---|
| ||||
jParams := JsonObject():new()
jParams["parameters"] := Array(2) //Os valores deverão sempre vir dentro do array 'parameters'
jParams["force"] := .T. //Indica se força o valor, atenção ao utilizar essa propriedade, com isso não segue o profile do usuário
jParams["parameters"][1] := JsonObject():New()
jParams["parameters"][1]["name"] := "MV_PAR01" //Identificação do parâmetro
jParams["parameters"][1]["value"] := ""
jParams["parameters"][1]["visibility"] := "Disabled" //Desabilita o parâmetro
jParams["parameters"][2] := JsonObject():New()
jParams["parameters"][2]["name"] := "MV_PAR02"
jParams["parameters"][2]["value"] := "ZZZZ"
jParams["parameters"][2]["visibility"] := "Disabled" //Desabilita o parâmetro
lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product",,,,jParams,.F.,,.T., @cError) |
No exemplo acima envio apenas o preenchimento de 2 parâmetros, ambos ficarão desabilitados e como enviei a propriedade force como true, todas as vezes que esse recurso for consumido esses valores serão iguais, tenha cuidado ao utilizar essa propriedade, pois com ela não irá seguir o profile salvo do usuário.
Em tela teremos o seguinte resultado:
Com a propriedade force igual a false, será sempre seguido o que esta no profile do usuário, serão preenchidos com os parâmetros da função apenas aqueles que não possuem valores do profile.
2º Exemplo de um json preenchendo os parâmetros:
Bloco de código | ||||
---|---|---|---|---|
| ||||
jParams := JsonObject():new()
jParams["parameters"] := {} //Os valores deverão sempre vir dentro do array 'parameters'
jParams["force"] := .F. //Indica se força o valor ou segue o profile
Pergunte("ABSENT",.F.,,.F.,,,@aPergunta,,) //pergunte do objeto de negócio
For nX := 1 To Len(aPergunta)
jValues := JsonObject():new()
jValues["name"] := "MV_PAR"+StrZero(nX,2)
if aPergunta[nX, 02] == "D" //Converte o tipo data
jValues["value"] := totvs.framework.treports.date.dateToTimeStamp(aPergunta[nX, 08])
elseif aPergunta[nX, 06] == "R"
//Se for Range, considera o campo especifico de range
jValues["value"] := aPergunta[nX, 20]
elseif aPergunta[nX, 06] == "C" .And. aPergunta[nX, 08] == 0
jValues["value"] := 1 //Envia o valor do combo sempre preenchido
else
jValues["value"] := aPergunta[nX, 08]
endif
jValues["visibility"] := "Default"
if jValues["name"] == "MV_PAR03"
jValues["visibility"] := "Hidden"
endif
if jValues["name"] == "MV_PAR05"
jValues["visibility"] := "Disabled"
endif
aAdd(jParams["parameters"], jValues)
Next nX
lSuccess := totvs.framework.treports.callTReports("framework.sv.framework.product.synt.rep.bra", "report", 1,,jParams,.F.,,,@cError) |
No exemplo acima pego o preenchimento de um pergunte do SX1 e repasso para o viewer nos formatos corretos.
Em tela teremos o seguinte resultado:
Observações
- 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 job.
- 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 job. A sugestão é colocar o nome + FWTimeStamp()