Problema com Listagem por Data
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject);
// COMANDO PARA SELECIONAR SOMENTE POR DATA //
var Inicio: String;
Final: String;
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
Inicio := DateToStr(DateTimePicker1.Date);
Final := DateToStr(DateTimePicker2.Date);
DM.Q_PesqChq.Close;
DM.Q_PesqChq.SQL.Clear;
DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES');
DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO >=:pInicio and DATA_VENCIMENTO<=:pFinal ORDER BY DATA_VENCIMENTO');
DM.Q_PesqChq.ParamByName('pInicio').Value := StrToDate(Inicio);
DM.Q_PesqChq.ParamByName('pFinal').value := StrToDate(Final);
// DM.Q_PesqChq.Prepared;//
DM.Q_PesqChq.Open;
DM.CDS_PesqChq.Open;
Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.Q_PesqChq.RecordCount)
end;
end;
Francielio Medeiros
Respostas
Rafael Cunha
18/02/2013
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject); begin If DateTimePicker2.Date < DateTimePicker1.Date Then begin ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!'); DateTimePicker2.Date := DateTimePicker1.Date; end else begin DM.Q_PesqChq.Close; DM.Q_PesqChq.SQL.Clear; DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES '); DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO'); DM.Q_PesqChq.ParamByName('pInicio').Value := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('pFinal').value := DateTimePicker2.Date; // DM.Q_PesqChq.Prepared;// DM.Q_PesqChq.Open; DM.CDS_PesqChq.Open; Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.Q_PesqChq.RecordCount) end; end;
Joel Rodrigues
18/02/2013
Por que você não passa para o parâmetro direto o valor dos DatePickers?
Francielio Medeiros
18/02/2013
Q_PesqChq:Parameter 'pInicial' Not Found.
Joel Rodrigues
18/02/2013
Basta usar os mesmos nomes.
Francielio Medeiros
18/02/2013
Conversion error from string "41319.87095906250"
Rafael Cunha
18/02/2013
Joel Rodrigues
18/02/2013
Francielio Medeiros
18/02/2013
como que posso fazer isso?
Rafael Cunha
18/02/2013
DM.Q_PesqChq.ParamByName('pInicio').Value := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('pFinal').value := DateTimePicker2.Date;
Perivaldo Martins
18/02/2013
DM.Q_PesqChq.ParamByName('pInicio').Value := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('pFinal').value := DateTimePicker2.Date;
Eu também concordo, ele poderia também fazer assim.
DM.Q_PesqChq.ParamByName('pInicio').asDate := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('pFinal').asDate := DateTimePicker2.Date;
Boa sorte e bons códigos!
Joel Rodrigues
18/02/2013
Você primeiramente converteu as datas para string:
Inicio := DateToStr(DateTimePicker1.Date); Final := DateToStr(DateTimePicker2.Date);
depois converteu de string para data:
DM.Q_PesqChq.ParamByName('pInicio').Value := StrToDate(Inicio); DM.Q_PesqChq.ParamByName('pFinal').value := StrToDate(Final);
O que nós estamos dizendo é pare você passar os valores para os parâmetros diretamente dos DatePickers, conforme foi sugerido acima:
DM.Q_PesqChq.ParamByName('pInicio').asDate := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('pFinal').asDate := DateTimePicker2.Date;
Abraço.
Francielio Medeiros
18/02/2013
#Código
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject);
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
DM.Q_PesqChq.Close;
DM.Q_PesqChq.SQL.Clear;
DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES ');
DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO');
DM.Q_PesqChq.ParamByName('dtInicial').asDate := DateTimePicker1.Date;
DM.Q_PesqChq.ParamByName('dtFinal').asDate := DateTimePicker2.Date;
DM.Q_PesqChq.Prepared := True;
DM.Q_PesqChq.Open;
DM.CDS_PesqChq.Open;
Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.Q_PesqChq.RecordCount)
end;
end;
Francielio Medeiros
18/02/2013
esqueci de mencionar eu estou usando: SQLConnection1, TsqlQuery, TDataSetProvider, TclientDataset.
Rafael Cunha
18/02/2013
Rafael Cunha
18/02/2013
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject); begin If DateTimePicker2.Date < DateTimePicker1.Date Then begin ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!'); DateTimePicker2.Date := DateTimePicker1.Date; end else begin DM.Q_PesqChq.Close; DM.Q_PesqChq.SQL.Clear; DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES '); DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO'); DM.Q_PesqChq.ParamByName('dtInicial').Value := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('dtFinal').value := DateTimePicker2.Date; // DM.Q_PesqChq.Prepared;// //DM.Q_PesqChq.Open; DM.CDS_PesqChq.Open; Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.CDS_PesqChq.RecordCount) end; end;
Espero que ajude.
Francielio Medeiros
18/02/2013
http://img822.imageshack.us/img822/5162/semttulome.jpg
Rafael Cunha
18/02/2013
Francielio Medeiros
18/02/2013
http://img405.imageshack.us/img405/9549/123hfi.jpg
Francielio Medeiros
18/02/2013
William
18/02/2013
1 - Qual SGBD vc está usando?
2 - Qual é o tipo do campo DATA_VENCIMENTO no banco?
Talvez vc até mencionou acima, mas não encontrei...
Marcio
18/02/2013
o problema é que no DateTimePicker está puxando horas também
por hora para ver se está funfando, coloca a função Trunc na frente do dateTimePicker
onde está alimentando os parâmetros:
DM.Q_PesqChq.ParamByName('dtInicial').Value := Trunc(DateTimePicker1.Date); DM.Q_PesqChq.ParamByName('dtFinal').value := Trunc(DateTimePicker2.Date);
se der certo você precisa fazer um tratamento com horas também mas dependendo
se estiver gravando a hora também...
falow
Rafael Cunha
18/02/2013
Francielio Medeiros
18/02/2013
Ah e Lembrando me perguntaram qual tipo de banco é Firebird e o campo e tipo Date.
#Código
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject);
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
DM.Q_PesqChq.Close;
DM.Q_PesqChq.SQL.Clear;
DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES ');
DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO');
DM.Q_PesqChq.ParamByName('dtInicial').AsDate := DateTimePicker1.Date;
DM.Q_PesqChq.ParamByName('dtFinal').AsDate := DateTimePicker2.Date;
//DM.Q_PesqChq.Prepared;
DM.Q_PesqChq.Open;
DM.CDS_PesqChq.Open;
Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.CDS_PesqChq.RecordCount)
end;
end;
Rafael Cunha
18/02/2013
Francielio Medeiros
18/02/2013
Francielio Medeiros
18/02/2013
Muito Obrigadooooo!!!!
#Código Certinho!!!!
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject);
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
DM.Q_PesqChq.Close;
DM.Q_PesqChq.SQL.Clear;
DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES ');
DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO');
DM.Q_PesqChq.ParamByName('dtInicial').AsDate := DateTimePicker1.Date;
DM.Q_PesqChq.ParamByName('dtFinal').AsDate := DateTimePicker2.Date;
//DM.Q_PesqChq.Prepared;
DM.Q_PesqChq.Open;
DM.CDS_PesqChq.Open;
Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.CDS_PesqChq.RecordCount)
end;
end;
Perivaldo Martins
18/02/2013
Vamos analisar como o código do colega foi modificado para que funcionasse como ele queria.
Primeiro Código
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject); // COMANDO PARA SELECIONAR SOMENTE POR DATA // var Inicio: String; // Como dito por alguns colegas, essas variáveis não são necessárias Final: String; // Foram removidas do código. OK! begin If DateTimePicker2.Date < DateTimePicker1.Date Then begin ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!'); DateTimePicker2.Date := DateTimePicker1.Date; end else begin Inicio := DateToStr(DateTimePicker1.Date); //Desnecessário Final := DateToStr(DateTimePicker2.Date); // Por isso foram removidas DM.Q_PesqChq.Close; DM.Q_PesqChq.SQL.Clear; DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES'); DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO >=:pInicio and DATA_VENCIMENTO<=:pFinal ORDER BY DATA_VENCIMENTO'); DM.Q_PesqChq.ParamByName('pInicio').Value := StrToDate(Inicio); //Aqui também houve mudança, foi trocado VALUE por AsDate DM.Q_PesqChq.ParamByName('pFinal').value := StrToDate(Final); //para receber a informação correta do DateTimePicker // DM.Q_PesqChq.Prepared;// DM.Q_PesqChq.Open; DM.CDS_PesqChq.Open; // Essa linha aqui é que estava causando o erro de operação não suportada, TSQLQuery não suporta a propriedade RecordCount // Foi trocada TSQLQuery por TClientDataSet (DM.CDS_Pesq) Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.Q_PesqChq.RecordCount) end; end;
Vejamos como ficou o código final e funcional para o nosso colega.
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject); begin If DateTimePicker2.Date < DateTimePicker1.Date Then begin ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!'); DateTimePicker2.Date := DateTimePicker1.Date; end else begin DM.Q_PesqChq.Close; DM.Q_PesqChq.SQL.Clear; DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES '); DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO'); DM.Q_PesqChq.ParamByName('dtInicial').AsDate := DateTimePicker1.Date; DM.Q_PesqChq.ParamByName('dtFinal').AsDate := DateTimePicker2.Date; //DM.Q_PesqChq.Prepared; DM.Q_PesqChq.Open; DM.CDS_PesqChq.Open; Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.CDS_PesqChq.RecordCount) end; end;
Por isso é bom sempre informar o banco de dados que está sendo utilizado, versão do Delphi, componentes de acesso, com essas informações a ajuda pode ser mais rápida.
Boa sorte e bons códigos.
Francielio Medeiros
18/02/2013
Bom segue aqui meu codigo atualizado com outras modificações ele agora soma todos os cheques listados...
#Código
procedure TF_ListaChqData.btn_cancelarClick(Sender: TObject);
begin
DM.CDS_PesqChq.Active := False;
Label2.Caption := ' ';
Label3.Caption := ' ';
end;
procedure TF_ListaChqData.btn_PesqClick(Sender: TObject);
VAR
SOMAR:Integer;
begin
If DateTimePicker2.Date < DateTimePicker1.Date Then
begin
ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');
DateTimePicker2.Date := DateTimePicker1.Date;
end
else
begin
DM.Q_PesqChq.Close;
DM.Q_PesqChq.SQL.Clear;
DM.Q_PesqChq.SQL.Add('SELECT CODIGO, DATA_EMISSAO, DATA_VENCIMENTO, NUMCHEQUE, TITULAR, APELIDO_TITULAR, TEL_TITULAR, BANCO, AGENCIA, CONTA, VALOR, SITUACAO_CHQ, SACADOR, TEL_SACADOR, OBS FROM CHEQUES ');
DM.Q_PesqChq.SQL.Add('WHERE DATA_VENCIMENTO between :dtInicial and :dtFinal ORDER BY DATA_VENCIMENTO');
DM.Q_PesqChq.ParamByName('dtInicial').AsDate := DateTimePicker1.Date;
DM.Q_PesqChq.ParamByName('dtFinal').AsDate := DateTimePicker2.Date;
DM.Q_PesqChq.Prepared := True;
DM.Q_PesqChq.Open;
DM.CDS_PesqChq.Open;
inherited;
SOMAR:=0;
DM.CDS_PesqChq.DisableControls;
DM.CDS_PesqChq.First;
while not DM.CDS_PesqChq.Eof do
begin
SOMAR := (SOMAR + DM.CDS_PesqChq.FieldByName('Valor').AsInteger);
DM.CDS_PesqChq.Next;
end;
DM.CDS_PesqChq.EnableControls;
Label3.Caption := FormatFloat ('R$ #,,,,0.00',SOMAR);
Label2.Caption := 'Total de Registros Localizados: ' + IntToStr(DM.CDS_PesqChq.RecordCount)
end;
end;