Eu preferi fazer o meu próprio gerador de relatórios que o denominei como MsFlexReport. Com Flexreport eu consigo várias proezas como imprimir em modo retrato ou paisagem, totalização por grupos, imprimir o logo no cabeçalho, personalizar o título do relatório conforme as necessidades, etc, tudo gerado a partir de uma ferramenta visual onde posso gerar uma tabela temporária indexada da forma que eu bem quoser para armazenar os dados ou ler uma tabela específica que poderá ser relacionada com várias outras, tudo sem escrever uma linha sequer de código fonte. Todavia, em casos de relatórios mais complexos, eu posso criar uma rotina escrita que irá acumular os dados nessa tabela temporária. Outra coisa importante é a praticidade dessa minha ferramenta visual que me permite testar e visualizar o relatório no momento da sua contrução, facilitando assim o trabalho. Dentre outras coisas, eu consigo gerar uma quantidade de relatórios infinita de uma mesma tabela, uma vez que essas informações ficam armazenadas num dicionário de relatórios os quais são distinguido por seu codinome Como eu executo os relatórios criados à partir dessa minha ferramenta a partir dos menus? Simples, basta informar através do seu gerador de menus ou através do seu código fonte da seguinte forma:
No meu gerador de menus chamo assim: &Contas a Receber ;InicioSubMenu() ;Inicio do submenudo financeiro
Manutenção de Contas a Receber ;CADGER("ARQCREC") ;Manutenção e baixa de contas a receber
&Borderô de Desconto ;Finr002() ;Borderô de Desconto
Manutenção de Cobrança ;CADGER("TBCOBR") ;Manutenção de Cobrança
Baixa de Cobrança P/Arq. Retorno ;BAIXRETCB() ;Baixa e atualização da cobrança pelo arquivo de retorno do banco
&Relatórios de Diversos da Cobrança ;FINR110() ;Relatórios de títulos emitidos/a receber/recebidos no período
&Extrato do Cliente ;Finr130() ;Extrato financeiro do cliente
Tipos de Cobrança ;CADGER("ARQTCOB") ;Tipos de Cobrança
Formas de Pagamento ;CADGER("ARQFPAG") ;Formas de Pagamento
Fim do submenu de contas a receber ;FimSubMenu() ;Fim do submenu de contas a receber
Contas a &Pagar ;InicioSubMenu() ;Inicio do submenu de contas a pagar
Manutenção de Contas à Pagar ;CADGER("ARQCPAG","VerificaSaldos()") ;Manutenção de contas a pagar
Contas a Pagar Múltiplas Parcelas ;CADGER("TBENTCPM") ;Contas a Pagar Múltiplas Parcelas
&Relatórios de Títulos Pagos ;FlexReport("ARQCPAG","CTAPAG") ;Relatórios de títulos pagos
&Relatórios de Títulos Emitidos ;FlexReport("ARQCPAG","CTAPEMIT") ;Relatórios de títulos emitidos
&Relatórios de Títulos a Pagar ;FlexReport("ARQCPAG","CTAAPAG") ;Relatórios de títulos a pagar...
A partir do código fonte chamo assim:
...
MENUITEM "&Relatório de Contas a Pagar";
ACTION FlexReport("ARQCPAG","CTAAPAG");
MESSAGE "Relatórios de títulos a pagar"...
Aproveitando pra vender o peixe, eu também tenho um gerador de tabelas, indices das tabelas, pesquisas, um gerador de cadastros e subcadastro, gerador de pesquisas, gerador de menus, dentre outras coisinhas que me poupam muitas linhas de códigos fontes.
Quando quiserem uma demonstração será um prazer mostrar pra galera.
Abraços,
Feliz ano novo.