Pesquisa de Despesas

Este formulário fará a pesquisa das despesas do cliente. Na tabela de despesas é armazenado o código e não o nome do cliente. O delphi possui um recurso chamado Campo Virtual. Ele cria o campo apenas para ser visualizado. Se você abrir a tabela ele não será mostrado.

Criando o Campo Virtual (Calculado)

Pressione Shift + F12 e selecione a unit dmDespesa (módulo). Clique com botão direito no tbDespesa e selecione New Field. Ver figura abaixo:

Deixe como a figura abaixo:


Name: Nome do campo.
Componente: É onde o campo virtual ficará armazenado (o delphi já coloca o nome acima como padrão).
Type: String - será armazenado texto.
Size: Tamanho.
Field Type: Lookup - fará a busca de uma tabela com a outra.
Key Fields: Campo que foi relacionado da tabela de despesa (chave-estrangeira).
Dataset: Qual a tabela onde o nome do cliente é armazenado.
Lookup Keys: Qual o campo que tem a chave primária na tabela de cliente e que foi utilizado para relacionar com a tabela de despesa.
Result Field: Qual campo será exibido, neste caso Nome.

Crie um formulário novo e altere as propriedades:

Name: frmPDespesa
Caption: Pesquisa de Despesas
Position: poScreenCenter

Salve como: PDespesa

Na Guia Standard selecione o componente RadioGroup e coloque no formulário alterando as propriedades:
Name: rgDespesa
Caption: Opções de Pesquisa:
Items: Lançamento, Nome, Data (um abaixo do outro).

Na Guia Additional selecione o componente BitBtn e altere as propriedades:
Name: btnPesquisa
Caption: &Pesquisa
Glyph: Zoomin

Na Guia Additional selecione outro componente BitBtn e altere as propriedades:
Name: btnSair
Caption: Sai&r
Glyph: Dooropen

Na Guia Data Control selecione o componente DbGrid e altere as propriedades:
Name: grdDespesa

Vá até o Menu File / Use Unit e selecione Modulo para vincular as tabelas que estão no módulo no formulário atual.

Ainda no dbGrid selecione a propriedade DataSource e deixe como: dmDespesa.dsDespesa

Codificando os botões:
Sair: Close

Pesquisa:

//Se for selecionada primeira opção
if rgDespesa.ItemIndex = 0 then
begin
dmDespesa.tbDespesa.IndexFieldNames:=''; //Índice pela chave primária
//Filter seleciona na tabela os registros de acordo com o parâmetro especificado
dmDespesa.tbDespesa.Filter :='Lancamento=' + '''' + txtLancamento.Text + '''';
//Ativa (realiza) o filtro
dmDespesa.tbDespesa.Filtered := True;
end;
if rgDespesa.ItemIndex = 1 then
begin
dmDespesa.tbDespesa.IndexFieldNames:=('Data'); //Índice pela chave secundária
with dmDespesa.tbDespesa do
begin
SetRangeStart; //Pega o intervalo inicial
FieldByName('Data').AsDateTime :=
strTodate(mskDataInicial.Text);
SetRangeEnd; //Pega o intervalo final
FieldByName('Data').AsDateTime :=
strTodate(mskDataFinal.Text);

ApplyRange; //Aplica o filtro
end;
end;
//Normalmente é necessário desativar o filtro, coloque no evento
//close do formulário: dmDespesa.tbDespesa.Filtered := False;

Observação: A instrução with fará com que não haja a repetição do objeto, ou seja: Se você não utilizasse ficaria por exemplo: dmDespesa.tbDespesa.SetRangeStart. A instrução FieldByName (nome do campo) especifica qual é o campo da tabela.

Será necessário criar o índice secundário pelo campo Data. Clique aqui para saber como cria.

No evento onShow do formulário: dmDespesa.tbDespesa.Open;
No evento onClose do formulário: dmDespesa.tbDespesa.Close;