Clipper On Line • Ver Tópico - Criando um relatório automático
Página 1 de 1

Criando um relatório automático

MensagemEnviado: 23 Mai 2020 12:14
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:

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.

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.

Criando um relatório automático

MensagemEnviado: 24 Mai 2020 10:53
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?

Criando um relatório automático

MensagemEnviado: 25 Mai 2020 21:10
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...

Criando um relatório automático

MensagemEnviado: 25 Mai 2020 22:35
por JoséQuintas
Pequena adaptação pra PDF:

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

Criando um relatório automático

MensagemEnviado: 26 Mai 2020 19:49
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?

Criando um relatório automático

MensagemEnviado: 27 Mai 2020 08:25
por paiva_dbdc
tem o FastReport

Criando um relatório automático

MensagemEnviado: 27 Mai 2020 20:57
por lwinter
Paiva, vou perguntar ja sabendo a resposta. O Fastreport funciona para console e SQL?

rgds,