Filtrar dados em DBGrid

13/02/2013

15

Olá, Preciso fazer um filtro de 3 campos: emissão, vencimento e cliente e estes filtros tem um checkbox que marco e desmarco qual serão os filtros para aparecer no Grid, meu problema é que só consigo que funcione com os tres checkbox marcados true, se não retorna vazio se algum estiver desmarcado e também queria filtrar os que foram pagos.
Segue o conteúdo da query:
select F.data_venda,
F.data_venc,
F.codigo,
CC.codigo,
CC.nome,
F.valor_total
from financeiro as F(nolock)
join cadastro_clientes as CC
on CC.codigo = F.cod_cliente

where F.data_venda between :dtemissao1 and :dtemissao2
and (F.data_venc between :dtvencimento1 and :dtvencimento2)
and (CC.codigo >= :codigoinicial and CC.codigo <= :codigofinal )

Este codigo acima funciona com os tres checkbox marcados(mas não 1 ou 2 marcados) e estou tentando usar também filtrando os pagos com este codigo que inseri:

select * from financeiro
where not exists (select pagto financeiro where pagto = 1)

que roda no query analyzer do SQLServer 2008,mas não sei como juntar na mesma query acima.
Alguma sugestão, agradeceria muito.
Responder

Posts

13/02/2013

Douglas

Boa tarde Klaus,

para sanar seu problema de marcações no retorno do seu select.

use a consulta substituindo a expressão AND por OR. Como o código abaixo:

select F.data_venda,
F.data_venc,
F.codigo,
CC.codigo,
CC.nome,
F.valor_total
from financeiro as F(nolock)
join cadastro_clientes as CC
on CC.codigo = F.cod_cliente
where F.data_venda between (:dtemissao1 and :dtemissao2)
or (F.data_venc between :dtvencimento1 and :dtvencimento2)
or (CC.codigo >= :codigoinicial and CC.codigo <= :codigofinal)


O próximo passo, caso o select acima não retorne vazio
faça uma verificação para rodar o próximo select.

Apenas um exemplo:

if not Qry_Consulta.IsEmpty then
begin
Qry_Consulta.Close;
Qry_Consulta.SQL.Clear;
Qry_Consulta.SQL.Add('select * from financeiro where not exists (select pagto financeiro where pagto = 1)')
Qry_Consulta.Open;
end;


Qualquer dúvida poste.

Boa sorte Amigo.
Responder

13/02/2013

Klaus

A tentativa não deu, troquei o 'and' por 'or'. O segundo problema seria agrupar os dois selects. Segue abaixo o codigo que retorna um erro 'valor de coerção inválido' que é qdo não preencho todos os dados no 3 checkbox.

qryGridContas.Close;

If CheckBox1.Checked = true then
If (cxDateEdit4.Text <> '') or (cxDateEdit3.Text <> '') then
Begin
qryGridContas.Parameters.ParamByName('dtemissao1').Value := cxDateEdit4.Date;
qryGridContas.Parameters.ParamByName('dtemissao2').Value := cxDateEdit3.Date;
End
Else
Begin
MessageDlg('As Datas Devem Ser Preenchidas!',mtWarning,[mbOK],0);
End;

If CheckBox2.Checked = true then
Begin
qryGridContas.Parameters.ParamByName('dtvencimento1').Value := cxDateEdit1.Date;
qryGridContas.Parameters.ParamByName('dtvencimento2').Value := cxDateEdit2.Date;
End;

If CheckBox3.Checked = true then
If DBLookupComboBox1.KeyValue = 0 then
Begin
qryGridContas.Parameters.ParamByName('codigoinicial').Value := 1;
qryGridContas.Parameters.ParamByName('codigoFinal').Value := 999999999;
end
Else
Begin
qryGridContas.Parameters.ParamByName('codigoInicial').Value := DBLookupComboBox1.KeyValue;
qryGridContas.Parameters.ParamByName('codigoFinal').Value := DBLookupComboBox1.KeyValue;
End;
qryGridContas.Open;

Podemos separar as duas questões, resolver primeiro o filtro apenas dos checkbox marcados.
Mesmo assim agradeço.
Responder

13/02/2013

Douglas

Klaus,

vamos por parte.

Poste todo o código do primeiro erro. Expondo exatamente o que você esta fazendo.

Depois veremos a parte de criar um Subselect.
Responder
Amigo, vc poderia informar quais são os componentes de acesso que vc está utilizando e como estão dispostos na tela os componentes CheckBox?

São 3 checkbox's, então algumas verificações devem ser feitas, pq vc poderá exibir resultados sem nenhuma das opções dos mesmos, com 1, 2 ou as 3.

Se puder passar mais detalhes.

Boa sorte e bons códigos!
Responder

14/02/2013

Klaus

Bom, a resposta do Martins é ADOQuery, DataSource, DBGrid, SQLServer 2008, Delphi 7.
E a do Douglas: não existe um erro, propriamente dito, o que quero é filtrar ou não qdo os checkbox's estiverem marcados.
Explicação da tela: tenho uma tela de contas a receber com 3 checkbox, 1 emissão, 1 vencimento e outro com o nome do cliente.
O que quero mostrar no grid somente os dados dos checkbox's marcados e qdo não estiver marcados filtrar apenas aqueles marcados, mas qdo deixo de marcar algum é que dá o erro ´valor de caractere inválido para especificação de coerção´ que sei que se resolve qdo marco os 3 checkbox's.
Espero ter sido mais claro e agradeço a paciência de vcs.
Responder
Bom, a resposta do Martins é ADOQuery, DataSource, DBGrid, SQLServer 2008, Delphi 7.
E a do Douglas: não existe um erro, propriamente dito, o que quero é filtrar ou não qdo os checkbox's estiverem marcados.
Explicação da tela: tenho uma tela de contas a receber com 3 checkbox, 1 emissão, 1 vencimento e outro com o nome do cliente.
O que quero mostrar no grid somente os dados dos checkbox's marcados e qdo não estiver marcados filtrar apenas aqueles marcados, mas qdo deixo de marcar algum é que dá o erro ´valor de caractere inválido para especificação de coerção´ que sei que se resolve qdo marco os 3 checkbox's.
Espero ter sido mais claro e agradeço a paciência de vcs.


Meu amigo, infelizmente não disponho de tempo para tentar implementar algo agora com ADO, mas posso te sugerir uma idéia com DBX, vc poderá testar, caso funcione, tentar tornar o código mais otmizado.

Só lembrando que esse pequeno exemplo leva em conta q vc estaria usando DBX mas não o impede de fazê-lo com ADO, é q no momento não tenho como fazê-lo, caso apresente algum erro, post aqui, não tive tempo de testar antes.

  with SQLQuery2 do  //Utilizando SQLQuery [DBX] + ClientDataSet
  begin
    close; // Fecha o SQLQuery
    SQL.Clear; //Limpa o SQLQuery
    //Adiciona instruções ao SQLQuery
    SQL.Add('SELECT F.DTVENDA, F.DTVENC, F.IDFINAN, CC.IDCLI, CC.NMCLI, ');
    SQL.Add(' F.VLRTOTAL FROM FINANCEIRO as F ');
    SQL.Add('JOIN CLIENTESX AS CC ON CC.IDCLI = F.IDCLI');

    if ChkEmiss.Checked = True then // Verifica se o checkbox Emissão está marcado
    begin
      // Verifica se mais algum CheckBox está marcado, se estiver muda a instrução
      if (ChkVenc.Checked =  True) or (ChkCli.Checked = true) then
      begin
        SQL.Add(' AND (F.DTVENDA BETWEEN :dtemissao1 and :dtemissao2) ');
        Params.ParamByName('dtemissao1').AsDate := StrToDate(Edit6.Text);
        Params.ParamByName('dtemissao2').AsDate := StrToDate(Edit9.Text);
      end
      else
      begin
        SQL.Add(' WHERE (F.DTVENDA BETWEEN :dtemissao1 and :dtemissao2) ');
        Params.ParamByName('dtemissao1').AsDate := StrToDate(Edit6.Text);
        Params.ParamByName('dtemissao2').AsDate := StrToDate(Edit9.Text);
      end;
    end;

    if ChkVenc.Checked = true then // Verifica se o checkbox Vencimento está marcado
    begin
      if (ChkEmiss.Checked =  True) or (ChkCli.Checked = true) then
      begin
        SQL.Add(' AND (F.DTVENC BETWEEN :dtvencimento1 and :dtvencimento2) ');
        Params.ParamByName('dtvencimento1').AsDate := StrToDate(Edit7.Text);
        Params.ParamByName('dtvencimento2').AsDate := StrToDate(Edit10.Text);
      end
      else
      begin
        SQL.Add(' WHERE (F.DTVENC BETWEEN :dtvencimento1 and :dtvencimento2) ');
        Params.ParamByName('dtvencimento1').AsDate := StrToDate(Edit7.Text);
        Params.ParamByName('dtvencimento2').AsDate := StrToDate(Edit10.Text);
      end;
    end;

    if ChkCli.Checked = true then // Verifica se o Checkbox cliente está marcado
    begin
      if (ChkVenc.Checked =  True) or (ChkEmiss.Checked = true) then
      begin
        SQL.Add(' AND (CC.IDCLI >= :codigoinicial and CC.IDCLI <= :codigofinal ) ');
        Params.ParamByName('codigoinicial').AsInteger := StrToInt(Edit8.Text);
        Params.ParamByName('codigofinal').AsInteger := StrToInt(Edit11.Text);
      end
      else
      begin
        SQL.Add(' WHERE (CC.IDCLI >= :codigoinicial and CC.IDCLI <= :codigofinal ) ');
        Params.ParamByName('codigoinicial').AsInteger := StrToInt(Edit8.Text);
        Params.ParamByName('codigofinal').AsInteger := StrToInt(Edit11.Text);
      end;
    end;

    ExecSQL; //Executa a instrução
  end;
  Memo1.Lines.Assign(SQLQuery2.SQL); //Aqui é possível ver no Memo a instrução SQL gerada
  Cds2.Close; // Fecha o ClientDataSet
  Cds2.Open;  // Abre o ClientDataSet (é como se fosse dado um refresh)


Boa sorte e bons códigos!
Responder

14/02/2013

Douglas

Klaus,

siga o passa-a-passo do Martins,

vai lhe ajudar bastante.

Qualquer problema poste novamente.
Responder

18/02/2013

Klaus

Obrigado a todos pela ajuda, consegui resolver, tive que fazer como o Martins sugeriu incluindo o SQL.ADD e montando cada escolha com cada checkbox, ficou apenas uma problema, qdo filtro 3 vezes sem sair do form e mudando os criterios de pesquisa o form trava e não pesquisa mais. Já tentei refresh, close open e não achei a solução ainda.
Responder
Obrigado a todos pela ajuda, consegui resolver, tive que fazer como o Martins sugeriu incluindo o SQL.ADD e montando cada escolha com cada checkbox, ficou apenas uma problema, qdo filtro 3 vezes sem sair do form e mudando os criterios de pesquisa o form trava e não pesquisa mais. Já tentei refresh, close open e não achei a solução ainda.


Nobre colega, vou verificar essa situação aqui, montarei um pequeno exemplo para testar, assim q possível lhe retorno, até lá os outros amigos e colegas do fórum poderão lhe dar um caminho para chegar a solução desse pequeno problema.


Boa sorte e bons códigos!
Responder

18/02/2013

Lorival Filho

Você consegue monitorar pelo Profiler do SQL? Verifique isso também que pode ser algo que está se perdendo na consulta.
Responder
Você consegue monitorar pelo Profiler do SQL? Verifique isso também que pode ser algo que está se perdendo na consulta.

Testei aqui e não travou, vai vez pelo fluxo de dados aqui q é pequeno, tem como vc postar seu código para que possamos ver o pode está causando isso? São aproximadamente quantos registros nessa tabela?

Boa sorte e bons códigos!
Responder

27/02/2013

Klaus

Martins, consegui resolver o problema. Obrigado pela ajuda.
Responder
Martins, consegui resolver o problema. Obrigado pela ajuda.


Tranquilo, compartilhe a solução, esse problema pode vir a ser de outros desenvolvedores iniciantes e ou frequentadores do fórum.


Boa sorte e bons códigos!

Responder

27/02/2013

Klaus

Foi um erro de lógica, pois na alteração toda faltou inserir uma opção de filtro dos checkbox.
Responder

28/02/2013

Douglas

Caramba Klaus,

que situação mais o importante é que

conseguiu resolver.
Responder