Filtrar dados em DBGrid
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.
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.
Klaus
Curtidas 0
Respostas
Douglas
13/02/2013
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:
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:
Qualquer dúvida poste.
Boa sorte Amigo.
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.
GOSTEI 0
Klaus
13/02/2013
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.
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.
GOSTEI 0
Douglas
13/02/2013
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.
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.
GOSTEI 0
Perivaldo Martins
13/02/2013
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!
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!
GOSTEI 0
Klaus
13/02/2013
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.
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.
GOSTEI 0
Perivaldo Martins
13/02/2013
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.
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!
GOSTEI 0
Douglas
13/02/2013
Klaus,
siga o passa-a-passo do Martins,
vai lhe ajudar bastante.
Qualquer problema poste novamente.
siga o passa-a-passo do Martins,
vai lhe ajudar bastante.
Qualquer problema poste novamente.
GOSTEI 0
Klaus
13/02/2013
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.
GOSTEI 0
Perivaldo Martins
13/02/2013
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!
GOSTEI 0
Lorival Filho
13/02/2013
Você consegue monitorar pelo Profiler do SQL? Verifique isso também que pode ser algo que está se perdendo na consulta.
GOSTEI 0
Perivaldo Martins
13/02/2013
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!
GOSTEI 0
Klaus
13/02/2013
Martins, consegui resolver o problema. Obrigado pela ajuda.
GOSTEI 0
Perivaldo Martins
13/02/2013
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!
GOSTEI 0
Klaus
13/02/2013
Foi um erro de lógica, pois na alteração toda faltou inserir uma opção de filtro dos checkbox.
GOSTEI 0
Douglas
13/02/2013
Caramba Klaus,
que situação mais o importante é que
conseguiu resolver.
que situação mais o importante é que
conseguiu resolver.
GOSTEI 0
José
13/02/2013
Que bom que a duvida inicial foi sanada, sendo assim estou marcando este tópico como concluído.
GOSTEI 0