Criando um relatório automático
Enviado: 23 Mai 2020 12:14
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:
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.
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.
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.