Filtro de Registros com o SQLDataSet

Delphi

27/07/2015

Olá Pessoal...
Criei essa Conta Recentemente pois estou quebrando a Cabeça a Semanas com um Problema que estou enfrentando!!
Então Resolvi pedir ajuda a vocês Programadores de Plantão hehe...

Pois bem,
Eu estou desenvolvendo um Sistema de Gerenciamento de Gastos. O Sistema está Quase 100% Só Falta Resolver esta Parte que não estou conseguindo!!

Estou utilizando o Delphi XE5 Update 2 e o Banco de Dados Firebird 2.0!!

No Meu Banco de Dados há várias Tabelas, mas a que interessa aqui é a Tabela 'GASTOS'...
Cuja suas Colunas são:

1- GAS_CODIGO (SMALLINT NOT NULL) - CHAVE PRIMÁRIA
2- GAS_DATA (DATE)
3- GAS_DESCRICAO (VARCHAR(1000))
4- GAS_VALOR (NUMERIC(15,2))
5- GAS_QUANTIDADE (INTEGER)
6- GAS_TOTAL (NUMERIC(15,2))
7- TPG_CODIGO (SMALLINT) - CHAVE ESTRANGEIRA DA TABELA 'TIPO_DE_GASTO'
8- CAT_CODIGO (SMALLINT) - CHAVE ESTRANGEIRA DA TABELA 'CATEGORIAS'
9- FOR_CODIGO (SMALLINT) - CHAVE ESTRANGEIRA DA TABELA 'FORNECEDORES'

Bom,
Estou Cadastrando os Registros na Tebela Normalmente através de Instruções SQL e Mostrando os Registros em um DBGrid!!

Aí vem a parte indispensáveis do Sistema. Um Filtro SQL Para esses Registros podendendo CONTER no mínimo 1 e no Máximo 5 parâmetros...
Já Criei um SQLDataSet do meu DataModule apenas para Filtragem do Conteúdo e um Novo Form com o Nome frmFiltro contendo os seguintes componentes:

- 2 MaskEdit (1 para preencher com uma Data Inicial e outro com uma Data Final)
- 1 Edit (Para Digitar o Valor total á ser Buscado)
- 3 DBLookupComboBox (Para listar Respectivamente os Registros das Colunas 'TPG_CODIGO', 'CAT_CODIGO' e 'FOR_CODIGO')
- 1 Button (Para Colocar o Código de Pesquisa).

Acima do DBGrid do Form de Cadastro de Gastos tem um Botão 'Filtrar' (Que abre o Form frmFiltro) e um Botão 'Limpar' (Que Limpa o Filtro)!

Vamos Imaginar uma Situção:
Eu tenho 150 Registro no Banco de Dados, e clico em Filtro para Abrir o Form do Filtro...
Preencho Apenas o Intervalo de Datas e deixo os outros Componentes em Branco e Clico em Filtrar...Nesse Caso eu Coloquei o Seguinte Comando no Botão 'Filtrar' do frmFiltro:

procedure TfrmFiltro.btnFiltrarClick(Sender: TObject);
begin
dm.dspGastos.DataSet := Dm.sdsComando;
if (mskDataInicial.Text <> ' / / ') and (mskDataFinal.Text <> ' / / ') and (dlcTipoDeGasto.KeyValue < 1) and (dlcCategoria.KeyValue < 1) and (edtValorTotal.Text = '') then
begin
with Dm.sdsComando do
begin
close;
CommandText := 'select * from GASTOS where GAS_DATA between :datainicial and :datafinal';
ParamByName('datainicial').AsString := FormatDateTime('mm/dd/yyyy',StrToDate(mskDataInicial.Text));
ParamByName('datafinal').AsString := FormatDateTime('mm/dd/yyyy',StrToDate(mskDataFinal.Text));
ExecSQL;
end;
Dm.cdsGastos.Refresh;
close;
end;

Até aí blz,
Só que irá Surgir muito mais situções para Verificar e passar o Código com os Parâmetros, com por Exemplo essa outra Situação:
Preencho Apenas o Intervalo de Datas e o ComboBox de 'Categoria' e deixo os outros Componentes em Branco e Clico em Filtrar...Nesse Caso eu Coloquei o Seguinte Comando no Botão 'Filtrar' do frmFiltro:

procedure TfrmFiltro.btnFiltrarClick(Sender: TObject);
begin
dm.dspGastos.DataSet := Dm.sdsComando;
if (mskDataInicial.Text <> ' / / ') and (mskDataFinal.Text <> ' / / ') and (dlcTipoDeGasto.KeyValue < 1) and (dlcCategoria.KeyValue > 0) and (edtValorTotal.Text = '') then
begin
with Dm.sdsComando do
begin
close;
CommandText := 'select * from GASTOS where (GAS_DATA between :datainicial and :datafinal) and (CAT_CODIGO= :categoria)';
ParamByName('datainicial').AsString := FormatDateTime('mm/dd/yyyy',StrToDate(mskDataInicial.Text));
ParamByName('datafinal').AsString := FormatDateTime('mm/dd/yyyy',StrToDate(mskDataFinal.Text));
ParamByName('categoria').AsInteger := dlcCategoria.KeyValue;
ExecSQL;
end;
Dm.cdsGastos.Refresh;
close;
end;

O Problema é o Seguinte:
Imagine fazer várias Verificações com as Diversas Possibilidades de Filtro Possíveis, como por exemplo:

DATA
CATEGORIA
DATA + CATEGORIA
DATA + TIPODEGASTO
DATA + FORNECEDOR
CATEGORIA + DATA
TIPODEGASTO + FORNECEDOR...
E assim por Diante!!

Virá um Código extremamente Extenso e Cansativo de se Fazer...
Já tentei Vários Métodos Diferentes para Resolver esse Problema e não obtive sucesso!!
Espero que Vocês possam me ajudar nisso pessoal...
Desde Já Muito Obrigado!
Gustavo

Gustavo

Curtidas 0

Respostas

Jhonatan Pereira

Jhonatan Pereira

27/07/2015

Vou te falar a verdade, não li tudo hahaha
Mas pelo que vi, você pode fazer o filtro na consulta SQL, já vem o resultado do jeito que você quer...
GOSTEI 0
POSTAR