Versões comparadas

Chave

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

...

Bloco de código
titleExemplo sem interface e envio por e-mail
collapsetrue
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:

1º Exemplo de um json preenchendo os parâmetros:

Bloco de código
titleExemplo jParams
collapsetrue
    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:

Image Added

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
titleExemplo jParams
collapsetrue
    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:

Image Added

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()