Advpl: Como definir o local do arquivo PDF gerado pela classe TREPORT, executada sem interface gráfica (via schedule)

Olá pessoal,

Com base nesta publicação ( https://centraldeatendimento.totvs.com/hc/pt-br/articles/360021601812-MP-ADVPL-SALVAR-RELAT%C3%93RIO-TREPORT-VIA-JOB ) criei um relatório pra ser agendado no Schedule do Protheus, para gerar o relatório em PDF e enviar por e-mail.

Diferente da publicação, ao invés de usar startjob() estou usando


RPCSetType(3)
RpcSetEnv("01","01",,,"FAT","U_TPDFM1") //Abertura do ambiente em rotinas automáticas

Na publicação vemos as seguintes atribuições:


oReport:nRemoteType := NO_REMOTE        // FORMA DE GERAÇÃO DO RELATÓRIO
oReport:nDevice     := 8                // ENVIO DE .PDF VIA E-MAIL
oReport:cEmail      := "meuemail@dominio.com" // DESTINATÁRIO
oReport:SetReportPortal("Nome_do_arquivo") // DEFINE O NOME DO RELATÓRIO

Ocorre que toda vez executo tal rotina via VSCODE, surge a pergunta se desejo sobrescrever o arquivo Nome_do_arquivo.PDF já existente em minha pasta de arquivos temporários. Interessante que em oReport:SetReportPortal() não informei o local, apenas o nome que deve ser salvo o PDF.

Por falta de documentação no TDN que esclareça isso, alguém sabe informar como posso sobrescrever automaticamente tal arquivo ? Ou talvez remover ele ? Como estou executando via VSCODE, ele cria o arquivo em minha pasta de arquivos temporários, como dito acima. Mas se eu colocar no Schedule, acredito que ele irá criar em outro local.Penso em usar o File() pra verificar a existência. Caso exista, excluo com Ferase(). Mas aí é que está: como saber o lugar onde está sendo salvo o arquivo. Há como eu definir isso ? Tentei colocar uma pasta antes do nome do arquivo em oReport:SetReportPortal(), mas não funcionou. Acabou abrindo uma interface de escolha de pasta para salvar o arquivo. Como quero executar via schedule este relatório, isso não "funfará", né!?

Bom dia, se estiver utilizando o método FWMSPrinter para criar o pdf, você pode passar o local do arquivo onde estará sendo salvo! Desta forma primeiro você acessa o diretório e faz as tratativas caso o arquivo já exista e depois usa o mesmo caminho no parâmetro cPathInServer do método FWMSPrinter .

https://tdn.totvs.com/display/public/PROT/FWMsPrinter

Atenciosamente,

Bom dia Douglas, não estou usando FWMSPrinter. Estou usando a classe TREPORT.

Opa, pode crer, neste caso tenta manipular a propriedade cdir da classe treport, oReport:cdir:=“cLocal”, mas não vai dar certo, vai ter que usar o putmv no MV_RELT, aí se faz o seguinte usa o getmv para pegar o valor atual e salva em varíavel, aí faz o putmv com o caminho desejado, aí depois da impressão, você volta o valor padrão pego!

Vicente, bom dia

Da uma olhada nesse link e vê se te ajuda.

https://centraldeatendimento.totvs.com/hc/pt-br/articles/360049503954-MP-ADVPL-Salvar-relat%C3%B3rio-Treport-PDF-em-diret%C3%B3rio

Nossa… Esse exemplo é meu, publicaram ele sem e nem saber… =)

Olá Felipe, agradeço pelo link, mas também não funcionou.

Vicente,

Quando você executa uma função via VSCode, ela será aberta via Smartclient, logo você terá uma thread com interface, então essa pergunta de arquivo pode ser exibida, em um job ou schedule, isso nunca vai acontecer, pois a thread não ter interface.

Exatamente por essa diferença, os exemplos, ambos que estão citados aqui, fazem um startjob, caso contrário o cenário fica totalmente diferente.


Já verificou o valor do parâmetro MV_RELT, como a MP que o Felipe colocou de exemplo cita?


No seu exemplo existe um RpcSetType, qual o motivo? =)

Olá Daniel,
Ref. ao executar via VSCODE, neste editor pressiono e peço pra executar U_T153START , função que chama o startjob(), conforme a publicação citada no início por mim. Nesta execução, percebo que é criado um arquivo “crptportal.rel” na pasta definida em MV_RELT. Já na pasta de arquivos temporários minha, não é criado nada. O e-mail é encaminhado, mas sem o arquivo PDF em anexo.
O RpcSetType() está alí pelo fato da rotina ser criada para ser executada via Schedule. Ver: DAGROCCO-147 DT Tratamento Performance/Licenças Schedule - Linha Microsiga Protheus - TDN

Se executo via VSCODE ( ) a função U_T153RPTMAIL(), o e-mail é disparado com o PDF em anexo, o qual é criado na minha pasta temporária, mas não na pasta definida em MV_RELT. Aí que está o problema que me fez postar aqui. Se executo novamente U_T153RPTMAIL() via VSCODE, ele abre a interface pra saber se quero sobrescrever o arquivo já existente, criado na primeira execução que citei.
Em resumo: via startjob(), o PDF não é criado, tampouco é enviado por e-mail.
Se puder, conseguirás reproduzir este problema pegando este fonte realizando estes testes ?

Solucionado!

Depurando via VSCODE U_T153START(), o e-mail foi enviado SEM o arquivo PDF em anexo.

Depurando via VSCODE U_T153RPTMAIL(), o e-mail foi enviado COM o arquivo PDF em anexo.

Depurando via VSCODE U_T153RPTMAIL() pela segunda ou mais vezes, ele apresenta interface gráfica perguntando se quero sobrescrever o arquivo PDF criado na pasta temporária. Respondendo sim, o e-mail foi enviado COM o arquivo PDF em anexo.

Via Schedule, tanto agendando U_T153START() como U_T153RPTMAIL(), ambos funcionaram perfeitamente, executando várias vezes, sempre atualizando o arquivo PDF que também foi criado na pasta definida em MV_RELT.

Moral da história: Via VSCODE, não funfa testar tal código, quer seja via Startjob() (por U_T153START()) ou não ( por U_T153RPTMAIL() ).