Criando um relatório automático

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um relatório automático

Mensagem por JoséQuintas »

Na prática o Harbour já tem isso, uma vez que ele sumula os comandos REPORT e LABEL do Clipper.

Mas não seria uma coisa do outro mundo.

Um básico:

Código: Selecionar todos

aFields := { "CODIGO", "NOME', "ENDERECO" }

DO WHILE ! Eof()
   @ pRow(), 0 SAY ""
   FOR EACH oElement IN aFields
      @ pRow(), pCol() + 2 SAY &( oElement )
   NEXT
   @ pRow() + 1, 0 SAY ""
   SKIP
ENDDO
Quer com totais/etc?
Aí o array precisaria mais do que o campo.
Precisaria ter o título da coluna, o indicativo se soma ou não, e até um total.

Código: Selecionar todos

aFields := { ;
   { "CODCLI", "CODIGO", .F., 0 }, ;
   { "NOME", "NOME", .F. 0 }, ;
   { "ENDERECO", 'ENDERECO", .F. 0 }, ;
   { "VL.VENDA", "VALOR", .T., 0 } }

DO WHILE ! Eof()
   IF PRow() == 0 .OR. pRow() > 66
     Cabecalho( aFields )
   ENDIF
   @ pRow(), 0 SAY ""
   FOR EACH oElement IN aFields
      @ pRow(), pCol() + 2 SAY &( oElement[ 2 ]  )
      IF oElement[ 3 ] // se soma
         oElement[ 4 ] += &( oElement[ 2 ] )
      ENDIF
   NEXT
   @ pRow() + 1, 0 SAY ""
   SKIP
ENDDO
@ pRow() + 2, 0 SAY ""
FOR EACH oElement IN aFields
   IF oElement[ 3 ]
      @ pRow(), pCol() + 2 SAY oElement[ 4 ] // total
   ELSE
      @ pRow(), pCol() + 2 SAY Space( Len( Transform( &( oElement[ 2] ), "" ) ) ) // deixa em branco
   ENDIF
NEXT
RETURN

FUNCTION Cabecalho( aFields )

   @ 0, 0 SAY ""
   FOR EACH oElement IN aFields
     @ pRow(), pCol() + 2 SAY oElement[ 1 ] // titulo da coluna
   NEXT
   @ pRow() + 1 SAY Replicate( "-", 132 )
   @ pRow() + 2, 0 SAY ""

   RETURN NIL
Basicamente seria isso, mas não considerando PICTURE pra numéricos, ou alinhamento mais detalhado.

E por aí vai.
Se for modo texto, alinhamento por coluna, se for modo gráfico, é calcular como gráfico.
Se tiver quebra por campo (subtotais), seriam mais colunas no array de configuração.
Esse array poderia ser um arquivo XML, JSON, etc. gravado no disco ou em MySQL, e o fonte de impressão apenas usa a configuração.

O interessante: a configuração serviria pra gerar o mesmo relatório em texto, PDF, Excel, etc.
Foi assim que surgiram os relatórios automáticos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um relatório automático

Mensagem por JoséQuintas »

Faltou acrescentar:

Como através de comandos SQL pode-se fazer praticamente tudo, e com ODBC/ADO também....
É aí que isso se torna mais interessante.

O VB6 tem duas opções de criar relatórios: Crystal Reports e Data Reports
O Access também tem.

NÃO SEI se nestas alturas do campeonato compensa, mas...
Uma vez que o Harbour pode salvar arquivo em formato ADO, poderiam ser usados esses geradores de relatório.

Vantagem?
Considerando que tem produto pra Harbour que é pago, mas pra outras linguagens é grátis....
Pode ser interessante fazer em outra linguagem.
Vai ser algo como relatório:Execute(), qual a diferença se for em outra linguagem?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Criando um relatório automático

Mensagem por lwinter »

Boas consideracoes Jose!
Voce sabe se tem Crystal Reports para Harbour ou algo parecido?
Voltando ao seu exemplo seria interessante uma rotima que ja criasse em PDF automatico com quebra de pagina, etc...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um relatório automático

Mensagem por JoséQuintas »

Pequena adaptação pra PDF:

Código: Selecionar todos

aFields := { ;
 { "CODCLI", "CODIGO", .F., 0 }, ;
 { "NOME", "NOME", .F. 0 }, ;
 { "ENDERECO", 'ENDERECO", .F. 0 }, ;
 { "VL.VENDA", "VALOR", .T., 0 } }

oPDF := PDFClass():New()
oPDF:acHeader := { "RELATORIO", "", "" }
FOR EACH oElement IN aFields
   oPDF:acHeader[ 2 ] += oElement[ 1 ] + Space(2)
NEXT
oPDF:acHeader[ 3 ] := Replicate( "-", 132 )

DO WHILE ! Eof()
   oPDF:MaxRowTest()
   oPDF:nCol := 0
 FOR EACH oElement IN aFields
   oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, &( oElement[ 2 ] ) )
   IF oElement[ 3 ] // se soma
    oElement[ 4 ] += &( oElement[ 2 ] )
   ENDIF
 NEXT
oPDF:nRow += 1
 SKIP
ENDDO
oPDF:nRow += 2
oPDF:nCol := 0
FOR EACH oElement IN aFields
 IF oElement[ 3 ]
   oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, oElement[ 4 ] ) // total
 ELSE
   oPDF:DrawText( oPDF:nRow, oPDF:nCol + 2, Space( Len( Transform( &( oElement[ 2] ), "" ) ) ) ) // deixa em branco
 ENDIF
NEXT
oPDF:End()
RETURN
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Criando um relatório automático

Mensagem por lwinter »

Entendi. Mas tem como alterar fontes, inserir imagens, etc....? Dai poderia fazer um cabecalho e rodape da hora. O miolo seria como voce colocou.
Mas mesmo assim, existe algum gerado de relatorio legal para harbour?
paiva_dbdc
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 12 Nov 2012 09:58
Localização: uberlandia mg

Criando um relatório automático

Mensagem por paiva_dbdc »

tem o FastReport
lwinter
Usuário Nível 3
Usuário Nível 3
Mensagens: 123
Registrado em: 07 Mar 2011 12:08
Localização: Campinas - SP

Criando um relatório automático

Mensagem por lwinter »

Paiva, vou perguntar ja sabendo a resposta. O Fastreport funciona para console e SQL?

rgds,
Responder