Tenho acompanhado em fóruns de Delphi que uma das dúvidas mais freqüentes sobre relatórios é a confecção de uma “MALA DIRETA”.
Vamos esclarecer que esta não é a única maneira de se fazer uma mala direta, e sim, um dedo apontando o caminho, meramente uma dica.
Pois então, mãos à obra!
Primeiramente,
você deverá montar um editor de texto com as suas funções básicas, tais como:
Arquivo (Abrir, Salvar, Fechar, Imprimir), Editar, Formatar, etc... Estas funções
serão definidas por você, de acordo com as necessidades próprias ou de seus
clientes, um exemplo seria a figura abaixo:
Após ter decidido
o seu Layout, você deverá inserir um formulário de impressão para os dados da
Mala Direta, o chamaremos de “Imprime_Mala_Direta”, nele usaremos um componente
QuickReport chamado de Qr_Mala_Direta, um QRBand chamado de QRBand_Dados e dentro
deste um QRRichText chamado de QrRt_Texto.
Insira uma
função de procura e substituição como esta:
procedure TF_Imprime_Mala_Direta.Procura_e_Troca(const Encontrar,
Substituir: String);
Var I, Posicao: Integer;
Linha: String;
begin
FOR I := 0 TO (QrRt_Texto.Lines.Count-1) DO
BEGIN
Linha := QrRt_Texto.Lines[I];
REPEAT
Posicao
:= Pos(Encontrar, Linha);
IF
Posicao > 0 THEN
BEGIN
DELETE(Linha,
Posicao, LENGTH(Encontrar));
INSERT(Substituir,
Linha, Posicao);
QrRt_Texto.Lines[I]
:= Linha;
END;
UNTIL Posicao
= 0;
END;
end;
Explico o
porque desta função mais tarde. Até aí, nenhuma dificuldade! Faça os ajustes
ligação com o Banco de Dados, página, papel, etc..., também conforme as suas
necessidades.
No evento
BeforePrint do componente QrBand_Dados, coloque o seguinte código:
procedure TF_Imprime_Mala_Direta.QRBand_DadosBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
QrRt_Texto.Lines.LoadFromFile(Caminho_e_Nome_do_Arquivo_de_Texto);
Procura_e_Troca('«NOME_DO_CLIENTE»',Query1NOME_CLIENTE.Value);
Procura_e_Troca('«ENDERECO_DO_CLIENTE»',Query1ENDERECO_CLIENTE.Value);
Procura_e_Troca('«DATA_DO_CADASTRO»', Query1DATA_CADASTRO.AsString);
end;
E no Evento
AfterPrint do mesmo componente:
procedure TF_Imprime_Mala_Direta.QRBand_DadosAfterPrint(Sender: TQRCustomBand;
BandPrinted: Boolean);
begin
QrRt_Texto.Lines.Clear;
end;
Agora a parte
que todos esperam.
Caso o seu
sistema gerencie somente uma entidade suponhamos “Clientes”, pule esta etapa,
senão, o meu conselho é criar uma combo com as entidades que sua Mala Direta
gerencie, mais ou menos deste tipo:
No mais, quase
que obrigatoriamente sua Mala Direta deverá uma combo (Como no Word), com os
campos da Entidade de seu Banco de Dados, algo do tipo:
A sugestão
de código a ser inserido no evento OnChange desta Combo, é a seguinte:
CASE Combo_Inserir_Campo.ItemIndex OF
0:INSERT('«NOME_DO_CLIENTE»', Conteudo_Texto, Coluna_Texto);
1:INSERT('«ENDEREÇO_DO_CLIENTE»',Conteudo_Texto,Coluna_Texto);
2:INSERT('«DATA_DE_CADASTRO»', Conteudo_Texto, Coluna_Texto);
Explicando
o Código:
Quando o usuário
clicar no campo desejado será inserido no texto que está sendo digitado pelo
usuário por exemplo: «NOME_DO_CLIENTE», e é extremamente importante que o texto
inserido seja único, não ambíguo para que possa ser substituído posteriormente
pelo conteúdo do Banco de Dados.
Esta é a preparação
que necessitamos, agora vamos à impressão!
No Botão ou
Menu Imprimir de sua Mala Direta, chame o formulário “Imprime_Mala_Direta”.
No Evento
OnCreate deste formulário, você deverá abrir seu Banco de Dados e Selecionar
os clientes que deverão ser processados pela Mala Direta, e chamar a procedure
Print do componente Qr_Mala_Direta.
Lembram das
funções e eventos que programamos anteriormente, então:
Ao receber
a chamada da procedure Print, o QuickReport começará a varredura do Banco de
Dados de Clientes de acordo com a seleção desejada, ao encontrar preenchido
o evento BeforePrint ocorrerá o seguinte:
1 – O carregamento
do Arquivo digitado, no componente QrRt_Texto;
2 – A procedure
Procura_e_Troca, irá procurar e substituir no texto do componente (sem fazer
alterações no arquivo digitado), os dados solicitados, como o Nome, Endereço
e Data de Cadastramento do Cliente;
3 – Não havendo
outras chamadas a outras funções ou eventos será impressa esta página com os
dados do primeiro cliente;
4 – Ao término
da impressão o Evento AfterPrint, se encarrega de limpar o que foi feito anteriormente,
e deixar tudo pronto para uma nova execução de impressão com os dados do próximo
cliente.
Esta é somente
uma das maneiras de se fazer uma Mala Direta!
Boa Sorte a
todos!
Washington Nunes
Analista de Sistemas com Especialização em UML
Programador Delphi, Asp, Php entre outras.
Observação: Por: Washington Nunes
|