Criação de relatórios em 10 minutos em AdvPL

Olá pessoal…

Recentemente desenvolvi uma rotina, em que, ao colar uma consulta sql, basta clicar em um botão Gerar, e ele gera um código .prw completo para compilação e utilização.

A intenção é que quando temos a consulta sql pronta, possamos fazer um relatório rapidamente.

Ao executar o zReport, é mostrado a tela, tendo duas abas, a primeira são as definições do relatório (como orientação padrão, título, se irá enviar por e-Mail, etc).

Aba principal para configuração do relatório

Aba principal para configuração do relatório

A segunda aba, é a de dados, onde é possível informar a consulta SQL, agrupamento e totalizadores.

Aba de dados

Aba de dados

Ao gerar, será perguntado se deseja abrir o arquivo.

Ao compilar o arquivo gerado, ele será um TReport normal, com as possibilidades de gerar pdf, planilha, etc.

Tela principal do relatório gerado

Tela principal do relatório gerado

Abaixo um print da impressão.

Relatório impresso na tela do Protheus

Relatório impresso na tela do Protheus

Agora, caso você tenha uma consulta “SELECT * FROM …” e deseja especificar as colunas mais detalhadamente (inclusive com opções de cores), insira a consulta e marque a opção “Deseja informar as colunas manualmente?”, e informe os dados necessários.

Tela de dados, especificando as colunas

Tela de dados, especificando as colunas

Por último, basta imprimir. Abaixo um print de exemplo.

Exemplo de impressão com colunas especificadas

Exemplo de impressão com colunas especificadas

Caso queira fazer o download do .prw, clique aqui.

Vídeo tutorial de como usar:



Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

40 Responses

  1. Luiz Carlos disse:

    Parabéns show de bola. São coisas assim que a totvs deveria nos entregar por padrão.

  2. Newton Cesar disse:

    Boa Mestree !! Fera !

  3. Artur Lima disse:

    Parabéns Daniel por compartilhar este material!

  4. Philippe disse:

    Muito bom, você está de parabéns

  5. George Lopes disse:

    Parabéns Grande Mestre Atílio! Ficou show de bola!

  6. Roberto Zaniboni disse:

    Boa tarde Atílio, realmente seu fonte e muito bom, podemos acrescentar muitas coisas nele para ficar muito melhor.
    Ex.: a opção do próprio usuário de criar as perguntas e o sistema as cria, eu já faço isso em relatórios que eu mesmo crio.

    • Dan_Atilio disse:

      Boa noite Roberto.
      Rapaz, muito obrigado.
      Realmente, eu deixo esses fontes genéricos abertos, pois sempre podemos melhorá-los né.
      Como diria Philippe Kahn:
      “The power of Open Source is the power of the people. The people rule.”
      Um grande abraço.

  7. Vagner disse:

    Boa noite Dan,
    Show de bola.
    Abs

  8. Dario disse:

    Excelente! Muchas gracias!

  9. Alexsandro disse:

    Muito bom cara, genial.
    Me ajudou muito.
    Muito obrigado

  10. MAURICIO disse:

    Boa Tarde,

    Gostaria se possível de um exemplo de relatório tendo Multi Thread, estou com problemas em performance deles.

  11. Que isso hem !! TOPÍSSIMO !! PARABENS !

  12. Ariel disse:

    Como faço para adicionar no menu do usuário?

  13. JFTavares disse:

    Há didática e pedagogia em suas aulas, classe, objetos, métodos e a propriedade é dele mesmo. Parabéns Daniel, construindo conhecimentos da melhor maneira, simples e eficiente.

  14. Fala Dan. Antes de tudo, agradeço por compartilhar todo esse conhecimento.

    Gostaria de pedir uma ajuda:
    _ Eu compilei o seu fonte (na integra) no meu ambiente de testes. No próprio TDS, chamei a rotina “U_ZREPORT” para testar, mas está dando um erro ao executa-la:

    THREAD ERROR ([20910], maicon.macedo, IT-00061) 08/11/2018 14:32:58
    Alias does not exist SX3 on MSNEWGETDADOS:NEW(APLIB170.PRW) 03/01/2018 17:40:20 line : 270

    [TOTVS build: 7.00.131227A-20180425 NG]
    Called from MSNEWGETDADOS:NEW(APLIB170.PRW) 03/01/2018 17:40:20 line : 270
    Called from U_ZREPORT(ZREPORT.PRW) 08/11/2018 14:21:22 line : 168
    Called from STATICCALL(ZREPORT.PRW) 08/11/2018 14:21:22 line : 168

    [TOTVS Ambiente: ENV]
    [TOTVS Environment RPODB: top]
    [TOTVS Environment Trace: Nenhum]
    [TOTVS Environment IBXLog: Nenhum]
    [TOTVS Environment KillStack: Nenhum]
    [TOTVS Environment TraceStack: Nenhum]
    [TOTVS Environment SpecialKey: 9439]
    [TOTVS Environment LocalFiles: ctree]
    [TOTVS Environment LogProfiler: Nenhum]
    [TOTVS Environment TopMemoMega: Nenhum]
    [TOTVS Environment RPOLanguage: Portuguese]
    [TOTVS Environment RegionalLanguage: BRA]
    [TOTVS Environment LocalDBExtension: .dtc]
    [TOTVS Environment ConnectionTimeOut: Nenhum]
    [TOTVS Environment General CTreeMode: server]
    [TOTVS Environment General ConsoleLog: 1]
    [TOTVS Environment General ConsoleFile: /outsourcing/totvs/protheus_data/logs/console_app.log]
    [TOTVS Environment General MaxQuerySize: Nenhum]
    [TOTVS Environment General MaxStringSize: Nenhum]
    [TOTVS Remote Lib: QT-4.5.2 WIN]
    [TOTVS Tipo Remoto: Microsoft Windows]
    [TOTVS Build Remota: 7.00.131227A-20180507]
    [TOTVS Tipo de Servidor: Console]
    [TOTVS Server Build: 7.00.131227A-20180425 NG]
    [TOTVS Server Unix: Sim]
    [TOTVS Database: mssql]
    [TOTVS Framework Versão: 20180108]
    [TOTVS Framework Data: 20180103-193932]
    [TOTVS Framework Comita: 764df3ca6bf8bb29a74d895a81ad23cb4bc778cc]
    [TOTVS RPO Release: 12.1.017]

    Publicas
    Public 1: CPAISLOC(C) :BRA
    Public 2: ASX8(A) :

    STACK STATICCALL(ZREPORT.PRW) 08/11/2018 14:21:22

    STACK U_ZREPORT(ZREPORT.PRW) 08/11/2018 14:21:22

    Private 1: CAUTOR(C) :zReport
    Private 2: CDATA(C) :11/08/18
    Private 3: NJANLARG(N) :800
    Private 4: NJANALTU(N) :500
    Private 5: ODLGPVT(O) :O
    Private 6: OBTNFEC(U) :NIL
    Private 7: OBTNGER(U) :NIL
    Private 8: ATPPAD(A) :
    Private 9: OSAYUSERF(O) :O
    Private 10: OGETUSERF(O) :O
    Private 11: CGETUSERF(C) :xRelat
    Private 12: OSAYDIREC(O) :O
    Private 13: OGETDIREC(O) :O
    Private 14: CGETDIREC(C) :C:\Users\MAICON~1.MAC\AppData\Local\Temp\
    Private 15: OSAYTITUL(O) :O
    Private 16: OGETTITUL(O) :O
    Private 17: CGETTITUL(C) :Relatorio
    Private 18: NLENDIREC(N) :120
    Private 19: ATPORI(A) :
    Private 20: ATPFON(A) :
    Private 21: OSAYORIEN(O) :O
    Private 22: OCMBORIEN(O) :O
    Private 23: CCMBORIEN(C) :R
    Private 24: OSAYFONTE(O) :O
    Private 25: OCMBFONTE(O) :O
    Private 26: CCMBFONTE(C) 😛
    Private 27: OSAYUTILI(O) :O
    Private 28: OCMBUTILI(O) :O
    Private 29: CCMBUTILI(C) :N
    Private 30: OSAYPERGU(O) :O
    Private 31: OGETPERGU(O) :O
    Private 32: CGETPERGU(C) :
    Private 33: OSAYMOSTR(O) :O
    Private 34: OCMBMOSTR(O) :O
    Private 35: CCMBMOSTR(C) :N
    Private 36: OSAYENVIA(O) :O
    Private 37: OCMBENVIA(O) :O
    Private 38: CCMBENVIA(C) :N
    Private 39: OSAYEMAIL(O) :O
    Private 40: OGETEMAIL(O) :O
    Private 41: CGETEMAIL(C) :
    Private 42: OSAYSQL(O) :O
    Private 43: OPANELSQL(O) :O
    Private 44: OEDITSQL(O) :O
    Private 45: CEDITSQL(C) :
    Private 46: OSAYQUEBR(O) :O
    Private 47: OGETQUEBR(O) :O
    Private 48: CGETQUEBR(C) :
    Private 49: OCHKEDIT(O) :O
    Private 50: LCHKEDIT(L) :.F.
    Private 51: OMSGETCAM(U) :NIL
    Private 52: AHEADERCAM(A) :
    Private 53: ACOLSCAM(A) :
    Private 54: OCHKTOT(U) :NIL
    Private 55: LCHKTOT(L) :.F.
    Private 56: OMSGETTOT(U) :NIL
    Private 57: AHEADERTOT(A) :
    Private 58: ACOLSTOT(A) :
    Private 59: OFOLDERPVT(O) :O
    Private 60: OSCROLLREL(O) :O
    Private 61: OSCROLLSQL(O) :O
    Local 1: AAREA(A) :
    Local 2: OGRPGER(O) :O
    Local 3: OGRPDEF(O) :O
    Local 4: OGRPPAR(O) :O
    Local 5: OGRPEMA(O) :O

    STACK MSNEWGETDADOS:NEW(APLIB170.PRW) 03/01/2018 17:40:20

    Param 1: NTOP(N) : 85
    Param 2: NLEFT(N) : 3
    Param 3: NBOTTOM(N) : 145
    Param 4: NRIGHT(N) : 373
    Param 5: NSTYLE(N) : 7
    Param 6: ULINHAOK(C) : AllwaysTrue()
    Param 7: UTUDOOK(U) : NIL
    Param 8: CINICPOS(C) :
    Param 9: AALTER(U) : NIL
    Param 10: NFREEZE(N) : 0
    Param 11: NMAX(N) : 99
    Param 12: CFIELDOK(C) : AllwaysTrue()
    Param 13: USUPERDEL(U) : NIL
    Param 14: UDELOK(U) : NIL
    Param 15: OWND(O) : O
    Param 16: @APARHEADER(A) :
    Param 17: @APARCOLS(A) :
    Param 18: UCHANGE(U) : NIL
    Param 19: CTELA(U) : NIL
    Local 1: SELF(O) :O
    Local 2: NTOP(N) :85
    Local 3: NLEFT(N) :3
    Local 4: NBOTTOM(N) :145
    Local 5: NRIGHT(N) :373
    Local 6: NSTYLE(N) :7
    Local 7: ULINHAOK(C) :AllwaysTrue()
    Local 8: UTUDOOK(U) :NIL
    Local 9: CINICPOS(C) :
    Local 10: AALTER(U) :NIL
    Local 11: NFREEZE(N) :0
    Local 12: NMAX(N) :99
    Local 13: CFIELDOK(C) :AllwaysTrue()
    Local 14: USUPERDEL(U) :NIL
    Local 15: UDELOK(U) :NIL
    Local 16: OWND(O) :O
    Local 17: APARHEADER(A) :
    Local 18: APARCOLS(A) :
    Local 19: UCHANGE(U) :NIL
    Local 20: CTELA(U) :NIL
    Local 21: NI(N) :1
    Local 22: NX3ORD(U) :NIL
    Local 23: CTIPO(U) :NIL
    Local 24: CSVALIAS(C) :
    Local 25: LADDLINE(L) :.T.
    Local 26: NBYTE(N) :6
    Local 27: NRESTO(N) :1
    Local 28: NX(N) :1
    Local 29: CBINARIO(C) :00000111
    Local 30: ACOMBO(U) :NIL
    Local 31: NSIZE(U) :NIL
    Local 32: LSX3OPENNED(L) :.F.
    Local 33: LINTELA(L) :.F.
    Local 34: AINTELA(U) :NIL
    Local 35: NJ(U) :NIL
    Local 36: LSKIP(U) :NIL
    Local 37: OFONT(U) :NIL
    Local 38: CATEXPRESSION(C) :Iif( Len( Self:aCOLS ) >= Self:oBrowse:nAt, Self:oBrowse:nAt, Len( Self:aCOLS ) )
    Local 39: LISP12(L) :.T.

    STACK { | e | ErrorDialog( e ) }(APLIB240.PRW) 03/01/2018 17:40:20

    Local CodeBlock 1: E(O) :O

    STACK ERRORDIALOG(APLIB240.PRW) 03/01/2018 17:40:20

    Local 1: E(O) :O
    Local 2: LINSIGA(L) :.F.
    Local 3: CMSG(U) :NIL
    Local 4: NI(U) :NIL
    Local 5: CX(U) :NIL
    Local 6: URETURN(U) :NIL
    Local 7: CERROR(U) :NIL
    Local 8: LSKIPERROR(L) :.F.
    Local 9: AOBJLOG(A) :
    Local 10: NX(U) :NIL

    STACK ERRORDLG(APLIB240.PRW) 03/01/2018 17:40:20

    Local 1: OERR(O) :O
    Local 2: CMSG(U) :NIL
    Local 3: ODLG(U) :NIL
    Local 4: OFONT(U) :NIL
    Local 5: OBMP(U) :NIL
    Local 6: OPANEL(U) :NIL
    Local 7: OPANELBMP(U) :NIL
    Local 8: ODETAIL(U) :NIL
    Local 9: OSEND(U) :NIL
    Local 10: OCLOSE(U) :NIL
    Local 11: OSAVE(U) :NIL
    Local 12: OERROR(U) :NIL
    Local 13: CERROR(U) :NIL

    STACK CLEARPASS(APLIB240.PRW) 03/01/2018 17:40:20

    Local 1: CENV(U) :NIL

    Files

    • Dan_Atilio disse:

      Boa noite Maicon, tudo bem?

      Opa, primeiramente muito obrigado pelo carinho.

      Esse erro é por que o Protheus não foi “preparado” com o famoso RPCSetEnv ou Prepare Environment. Portanto, o ideal é executar a rotina, direto pelo Menu dentro do sistema, ou no Fórmulas.

      Ou seja, executar o SIGAMDI / SIGAADV, e depois sim abrir o zReport.

      Espero ter ajudado. Qualquer dúvida, fico à disposição.

      Um grande abraço.

  15. Dan, boa tarde.
    Antes de tudo, obrigado por compartilhar todo esse conhecimento.

    Eu compilei o seu fonte (na integra) no meu ambiente de teste (minha plataforma é cloud). Ao testa-lo, no próprio TDS, ocorre um erro:

    THREAD ERROR ([20910], maicon.macedo, IT-00061) 08/11/2018 14:32:58
    Alias does not exist SX3 on MSNEWGETDADOS:NEW(APLIB170.PRW) 03/01/2018 17:40:20 line : 270

    Pode me dar uma ajuda?

    Obrigado novamente.

    • Dan_Atilio disse:

      Boa noite Maicon, tudo bem?

      Opa, primeiramente muito obrigado pelo carinho.

      Esse erro é por que o Protheus não foi “preparado” com o famoso RPCSetEnv ou Prepare Environment. Portanto, o ideal é executar a rotina, direto pelo Menu dentro do sistema, ou no Fórmulas.

      Ou seja, executar o SIGAMDI / SIGAADV, e depois sim abrir o zReport.

      Espero ter ajudado. Qualquer dúvida, fico à disposição.

      Um grande abraço.

  16. Welinton disse:

    Cara, você arrebentou..!!!!
    Eu desenvolvo desde 2001, mas sempre tive “medo” do TREPORT..kkkkkkk
    Cara, valeu mesmo. Muito boa, excelente essa sua ferramenta.
    Meus parabéns e muito, muito obrigado por disponibilizar.

  17. eduardo cevoli disse:

    Eu Incluo os parâmetros das perguntas na query da mesma forma que faço em ADVPL????
    ex: ” AND RC_PERIODO = ‘” + mv_par03 + “‘ “

  18. Edelmar Frazao disse:

    Um duvida, a minha consulta sql retorna 1183 registros, mas a extracao do relatorio da rotina do retornou 183 registros, há alguma limitacao no fonte?

  19. Cleidson disse:

    Após executar, inclui no menu, mas quando tento acessar informar que a função não está disponível, como resolvo isso?

  20. Cleidson disse:

    Dan, quando executo diz que a função não existe, como resolver isso?

Deixe uma resposta

Terminal de Informação