Problema com Listagem por Data

Delphi

18/02/2013

Bom pessoal estou com um pequeno problema, quando vou fazer a listagem por data me aparece um erro [0x0005]: Operação Not Supported.


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

Francielio Medeiros

Curtidas 0

Respostas

Rafael Cunha

Rafael Cunha

18/02/2013

Realizei uma pequena alteração no seu código abaixo, veja se resolve seu problema.

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;
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

18/02/2013

Em que linha ocorre o erro?
Por que você não passa para o parâmetro direto o valor dos DatePickers?
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Apresentou o seguinte erro:
Q_PesqChq:Parameter 'pInicial' Not Found.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

18/02/2013

É que no código do amigo acima, ele nomeou os parâmetros como dtInicial e dtFinal. Depois tentou acessar os parâmetros usando pInicio e pFinal.
Basta usar os mesmos nomes.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Outro erro foi apresentado:
Conversion error from string "41319.87095906250"
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Passa os valores direto do DateTimePicker ao invés de converte para string e depois converter para Date novamente.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

18/02/2013

Exato. Foi o que eu sugeri e o que o Rafael fez no exemplo dele. Passe os valores direto dos DatePickers para os parâmetros.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Pessoal sou iniciante como assim nao entendi vocês podem me ajudar ?
como que posso fazer isso?
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

No exemplo que mandei acima ele já faz do jeito que estamos falando.

DM.Q_PesqChq.ParamByName('pInicio').Value := DateTimePicker1.Date;
DM.Q_PesqChq.ParamByName('pFinal').value := DateTimePicker2.Date;


GOSTEI 0
Perivaldo Martins

Perivaldo Martins

18/02/2013

No exemplo que mandei acima ele já faz do jeito que estamos falando.

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!
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

18/02/2013

Só explicando o que estamos falando:
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.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Gente Muito obrigado a todos pela ajuda mais ainda continua com erro:

#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;

GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

o Erro Operation not suported.



esqueci de mencionar eu estou usando: SQLConnection1, TsqlQuery, TDataSetProvider, TclientDataset.
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Quando você está debugando o erro ocorre em qual linha.
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Como a sua Query está ligada em um ClientDataSet apenas de um open nele, o código ficaria assim:

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.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Ainda Continua o memso erro segue anexo a foto do erro:

http://img822.imageshack.us/img822/5162/semttulome.jpg
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Se você debugar ele da o erro em que linha? Colo seu código atualizado para ser analisado.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Pronto segue ai onde tá o Erro:

http://img405.imageshack.us/img405/9549/123hfi.jpg
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Alguem pode me Ajudar ???
GOSTEI 0
William

William

18/02/2013

Colega pode até parecer uma pergunta boba, mas tenho q perguntar antes de tentar entender a causa do erro:

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...
GOSTEI 0
Marcio

Marcio

18/02/2013

amigo faça o seguinte:

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
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Quando você executa a aplicação antes de dar o erro ele chega a mostrar na label o tanto de registro que ele retornou?
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Pessoal fiz umas alterações ficou quase pronto ele agora não retorna mais erro só falta aparecer os dados no dbgrid....
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;
GOSTEI 0
Rafael Cunha

Rafael Cunha

18/02/2013

Para que as informações apareça na DBGrid você terá que incluir um TDataSource, ligando a propriedade "DataSet" em seu ClientDateSet e em seguida vincular esse DataSource a sua Grid utilizando a propriedade "DataSource".
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

já fiz isso mais ele não me retorna nada acho que tem que alterar o sql porque se eu marcar o clientedataset como active ele mostra todos os dados....
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Pessoal Deu certo!


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;
GOSTEI 0
Perivaldo Martins

Perivaldo Martins

18/02/2013

Blza, que bom que você conseguiu resolver o problema.

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.
GOSTEI 0
Francielio Medeiros

Francielio Medeiros

18/02/2013

Bom Muito Obrigado a todos, o Devmedia está me Ajudando Muito sou muito grato ao site por me ajudar, por isso assim que as coisas melhorarem vou virar assinante MVP.
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;
GOSTEI 0
POSTAR