Filtrar dados em DBGrid
13/02/2013
0
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
Posts
13/02/2013
Douglas
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.
13/02/2013
Klaus
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.
13/02/2013
Douglas
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.
13/02/2013
Perivaldo Martins
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!
14/02/2013
Klaus
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.
14/02/2013
Perivaldo Martins
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!
14/02/2013
Douglas
siga o passa-a-passo do Martins,
vai lhe ajudar bastante.
Qualquer problema poste novamente.
18/02/2013
Klaus
18/02/2013
Perivaldo Martins
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!
18/02/2013
Lorival Filho
18/02/2013
Perivaldo Martins
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!
27/02/2013
Perivaldo Martins
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!
27/02/2013
Klaus
28/02/2013
Douglas
que situação mais o importante é que
conseguiu resolver.
Clique aqui para fazer login e interagir na Comunidade :)