Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CCN

Consulta entre datas

Recommended Posts

Como vão, estou começando na programação em Delphi, portanto não liguem para minhas garfes.A minha duvida é que to fazendo um programinha para meu tio onde tenho que fazer uma consulta do arquivo dbgeral.db, onde o campo data, esta como “D” na sua estrutura.Sendo que, coloquei duas variáveis para receber as datas inicial e final. public { Public declarations } inicio : string [60]; final : string [60]; end; If DateTimePicker2.Date < DateTimePicker1.Date ThenbeginShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');DateTimePicker2.Date := DateTimePicker1.Date;endElsebeginInicio := DateToStr(DateTimePicker1.Date);Final := DateToStr(DateTimePicker2.Date);edit1.text:= inicio;edit2.Text:= final;Query1.Close;Query1.SQL.Clear;Query1.SQL.Text := 'SELECT Data, Num_veiculo, Placa, Km FROM bdgeral '+'WHERE Data >= DateToStr(INICIO) and data <= DateToStr(FINAL) ORDER BY Data';Query1.Prepare;Query1.Open;DBGrid1.SetFocusend;end;ai aparece a mensagem “ Capability not supported.”, como posso corrigir isso, como posso alem disso escolher alem entre estas datas também de determinado Veiculo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa alterar um pouco o seu procedimento, não é preciso ter as variáveis declaradas para receber as datas, pode fazer algo como:

 

beginIf DateTimePicker2.Date < DateTimePicker1.Date Then	begin	ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');	DateTimePicker2.Date := DateTimePicker1.Date;	endElse	begin	edit1.text:= DateToStr(DateTimePicker1.Date);	edit2.Text:= DateToStr(DateTimePicker2.Date);	Query1.Close;	Query1.SQL.Clear;	Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');	Query1.SQL.Add('FROM bdgeral');	Query1.SQL.Add('WHERE Data between :dataIni and :dataFim');	Query1.SQL.Add('ORDER BY Data');	Query1.FieldByName('dataIni').Value:=StrToDate(DateToStr(DateTimePicker1.Date));	Query1.FieldByName('dataFim').Value:=StrToDate(DateToStr(DateTimePicker1.Date));	Query1.Open;	DBGrid1.SetFocus	end;end;

Pode ser que tenha diferença de acordo com a paleta de componentes que você usar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa alterar um pouco o seu procedimento, não é preciso ter as variáveis declaradas para receber as datas, pode fazer algo como:

beginIf DateTimePicker2.Date < DateTimePicker1.Date Then	begin	ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');	DateTimePicker2.Date := DateTimePicker1.Date;	endElse	begin	edit1.text:= DateToStr(DateTimePicker1.Date);	edit2.Text:= DateToStr(DateTimePicker2.Date);	Query1.Close;	Query1.SQL.Clear;	Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');	Query1.SQL.Add('FROM bdgeral');	Query1.SQL.Add('WHERE Data between :dataIni and :dataFim');	Query1.SQL.Add('ORDER BY Data');	Query1.FieldByName('dataIni').Value:=StrToDate(DateToStr(DateTimePicker1.Date));	Query1.FieldByName('dataFim').Value:=StrToDate(DateToStr(DateTimePicker1.Date));	Query1.Open;	DBGrid1.SetFocus	end;end;
Pode ser que tenha diferença de acordo com a paleta de componentes que você usar...
Caro marcio, obrigado pela atenção, mais co este codigo deu uma outra mensagem de erro que é a seguinte " Query1: Field 'dataini" not found." que posso fazer pra resolver????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque o SQL dentro da query, depois clicar em Parameters, e configura o tipo deles, depois vai funcionar...

Como pode ver sou bem inesperiente, vou colocar o conteudo do form todo pra você ver se to fazendo algo de errado, eu preciso mesmo da query, ou posso so usar o filter, não seria mais facil???Como posso fazer, em detales,já que viu que sou bem iniciante mesmo!!!rsrsrsrsrsrsunit uConsulta;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, Grids, DBGrids, ComCtrls, Db, DBTables;type TfrmConsulta = class(TForm) Button1: TButton; DBGrid1: TDBGrid; Edit1: TEdit; Edit2: TEdit; DateTimePicker1: TDateTimePicker; DateTimePicker2: TDateTimePicker; Query1: TQuery; procedure FormKeyPress(Sender: TObject; var Key: Char); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var frmConsulta: TfrmConsulta;implementationuses uVeiculo, uDM, uTecnovan;{$R *.DFM}procedure TfrmConsulta.FormKeyPress(Sender: TObject; var Key: Char);beginif key = #13 then begin key := #0; Perform(WM_NextDlgCtl,0,0); end;end;procedure TfrmConsulta.Button1Click(Sender: TObject);beginIf DateTimePicker2.Date < DateTimePicker1.Date Then begin ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!'); DateTimePicker2.Date := DateTimePicker1.Date; endElse begin edit1.text:= DateToStr(DateTimePicker1.Date); edit2.Text:= DateToStr(DateTimePicker2.Date); Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km'); Query1.SQL.Add('FROM bdgeral'); Query1.SQL.Add('WHERE Data between :dataIni and :dataFim'); Query1.SQL.Add('ORDER BY Data'); Query1.FieldByName('dataIni').Value:=StrToDate(DateToStr(DateTimePicker1.Date)); Query1.FieldByName('dataFim').Value:=StrToDate(DateToStr(DateTimePicker1.Date)); Query1.Open; DBGrid1.SetFocus end;end;end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa selecionar o componente query, clicar na propriedade SQL (...) colar o código SQL, dar OK, ir na propriedade Parameters e configurar o tipo de parâmetro, pode ainda passar o SQL diretamente, sem o uso de parâmetros fazendo:

 

beginIf DateTimePicker2.Date < DateTimePicker1.Date Then	begin	ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');	DateTimePicker2.Date := DateTimePicker1.Date;	endElse	begin	edit1.text:= DateToStr(DateTimePicker1.Date);	edit2.Text:= DateToStr(DateTimePicker2.Date);	Query1.Close;	Query1.SQL.Clear;	Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');	Query1.SQL.Add('FROM bdgeral');	Query1.SQL.Add('WHERE Data between ''' + DateToStr(DateTimePicker1.Date) + ''' and ''' + DateToStr(DateTimePicker1.Date) + '''');	Query1.SQL.Add('ORDER BY Data');	Query1.Open;	DBGrid1.SetFocus	end;end;

Caso de erro de conversão ou algo do tipo, precisa ver o formato que a sua data é armazenada no BD, e então fazer a conversão...

Compartilhar este post


Link para o post
Compartilhar em outros sites

CNN não sei se ajuda mas no meu sistema fiz desse modo.

 

1-Criei um formulario de filtro:

Imagem Postada2

 

2-Adicionei como pode ver um IBQuery da paleta InterBase e um DataSource da paleta Data Access ligado no IBQuery e na SQL fiz assim:

Imagem Postada

 

3-Criei uma procedure no private Exemplo:

 

private

procedure ProcDados;

 

procedure Nome_Do_Seu_Form.ProcDados;

begin

IBQuery.Close;

IBQuery.SQL.Strings[1]:='where cast(Campo_Data_Da_Sua_Tabela as date) between : datainicial (Nome_Do_Primeiro_Campo_Data) and :datafinal' (Nome_Do_Segundo_Campo_Data);

IBQuery.SQL.Strings[2]:='order by Campo_Data_Da_Sua_Tabela desc';

IBQuery.ParamByName('datainicial').AsString:=eDataInicial.Text;

IBQuery.ParamByName('datafinal').AsString:=eDataFinal.Text;

IBQuery.Open;

end;

 

4-E no evento OnClick do Botão Imprimir coloquei assim:

 

Begin

ProcDados;

Seu_Formulario_De_Visualização (No meu caso o QuickReport).Preview;

end;

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

CNN não sei se ajuda mas no meu sistema fiz desse modo.

 

1-Criei um formulario de filtro:

Imagem Postada2

 

2-Adicionei como pode ver um IBQuery da paleta InterBase e um DataSource da paleta Data Access ligado no IBQuery e na SQL fiz assim:

Imagem Postada

 

3-Criei uma procedure no private Exemplo:

 

private

procedure ProcDados;

 

procedure Nome_Do_Seu_Form.ProcDados;

begin

IBQuery.Close;

IBQuery.SQL.Strings[1]:='where cast(Campo_Data_Da_Sua_Tabela as date) between : datainicial (Nome_Do_Primeiro_Campo_Data) and :datafinal' (Nome_Do_Segundo_Campo_Data);

IBQuery.SQL.Strings[2]:='order by Campo_Data_Da_Sua_Tabela desc';

IBQuery.ParamByName('datainicial').AsString:=eDataInicial.Text;

IBQuery.ParamByName('datafinal').AsString:=eDataFinal.Text;

IBQuery.Open;

end;

 

4-E no evento OnClick do Botão Imprimir coloquei assim:

 

Begin

ProcDados;

Seu_Formulario_De_Visualização (No meu caso o QuickReport).Preview;

end;

 

Espero ter ajudado.

No momento ainda sou muito cru para usar comandos SQL, seja na query ou na IBquery, usei o database Desctop para fazer um DB com paradox7, sendo o campo da tabela DATA colocado na estrutura como "D" e o restante dos campos como "A", porque se eu colocasse o campo DATA como "A" e eu coloco em ordenado por data não fica em ordem correta, com isso acho que seu eu colocasse o um filtro sem query, fica mais facil pra mim, so que eu não to conseguindo exatamente por esse problema dos tipos dos campos, já as variaveis que criei para fazer a comparação criei como String, dai que eu to achando que ta dando esse pau. quando executo este codigo no botão OK do form:

 

procedure TfrmConsulta.btnConsultaClick(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

edit1.text:= DateToStr(DateTimePicker1.Date);

edit2.Text:= DateToStr(DateTimePicker2.Date);

 

Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');

Query1.SQL.Add('FROM bdgeral');

Query1.SQL.Add('WHERE Data between :INICIO and :FINAL');

Query1.SQL.Add('ORDER BY Data');

Query1.FieldByName ('INICIO').value := StrToDate(DateToStr(DateTimePicker1.Date));

Query1.FieldByName ('FINAL').value := StrToDate(DateToStr(DateTimePicker1.Date));

Query1.Open;

DBGrid1.SetFocus

end;

end;

Os dois edits que cloquei so para saber o que estava sendo armazenado nas variaveis, estão mostrando que ta funcionando ate ali, mais quando ele deveria estar filtrando os registros entre aquelas datas para mostrar no dbgrid ta dando um erro "Query1: Field 'INICIO' not Found". Será que consegui me explicar para possam me ajudar a sair desta enrrascada. e valeu mesmo pela paciencia de VCs. Abraço

 

Precisa selecionar o componente query, clicar na propriedade SQL (...) colar o código SQL, dar OK, ir na propriedade Parameters e configurar o tipo de parâmetro, pode ainda passar o SQL diretamente, sem o uso de parâmetros fazendo:

 

beginIf DateTimePicker2.Date < DateTimePicker1.Date Then	begin	ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');	DateTimePicker2.Date := DateTimePicker1.Date;	endElse	begin	edit1.text:= DateToStr(DateTimePicker1.Date);	edit2.Text:= DateToStr(DateTimePicker2.Date);	Query1.Close;	Query1.SQL.Clear;	Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');	Query1.SQL.Add('FROM bdgeral');	Query1.SQL.Add('WHERE Data between ''' + DateToStr(DateTimePicker1.Date) + ''' and ''' + DateToStr(DateTimePicker1.Date) + '''');	Query1.SQL.Add('ORDER BY Data');	Query1.Open;	DBGrid1.SetFocus	end;end;
Caso de erro de conversão ou algo do tipo, precisa ver o formato que a sua data é armazenada no BD, e então fazer a conversão...
No momento ainda sou muito cru para usar comandos SQL, seja na query ou na IBquery, usei o database Desctop para fazer um DB com paradox7, sendo o campo da tabela DATA colocado na estrutura como "D" e o restante dos campos como "A", porque se eu colocasse o campo DATA como "A" e eu coloco em ordenado por data não fica em ordem correta, com isso acho que seu eu colocasse o um filtro sem query, fica mais facil pra mim, so que eu não to conseguindo exatamente por esse problema dos tipos dos campos, já as variaveis que criei para fazer a comparação criei como String, dai que eu to achando que ta dando esse pau. quando executo este codigo no botão OK do form:

 

procedure TfrmConsulta.btnConsultaClick(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

edit1.text:= DateToStr(DateTimePicker1.Date);

edit2.Text:= DateToStr(DateTimePicker2.Date);

 

Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add('SELECT Data, Num_veiculo, Placa, Km');

Query1.SQL.Add('FROM bdgeral');

Query1.SQL.Add('WHERE Data between :INICIO and :FINAL');

Query1.SQL.Add('ORDER BY Data');

Query1.FieldByName ('INICIO').value := StrToDate(DateToStr(DateTimePicker1.Date));

Query1.FieldByName ('FINAL').value := StrToDate(DateToStr(DateTimePicker1.Date));

Query1.Open;

DBGrid1.SetFocus

end;

end;

Os dois edits que cloquei so para saber o que estava sendo armazenado nas variaveis, estão mostrando que ta funcionando ate ali, mais quando ele deveria estar filtrando os registros entre aquelas datas para mostrar no dbgrid ta dando um erro "Query1: Field 'INICIO' not Found". Será que consegui me explicar para possam me ajudar a sair desta enrrascada. e valeu mesmo pela paciencia de VCs. Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente alterar essas duas linhas....Query1.FieldByName ('INICIO').asstring := edit1.textQuery1.FieldByName ('FINAL').asstring := edit2.text

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente alterar essas duas linhas....Query1.FieldByName ('INICIO').asstring := edit1.textQuery1.FieldByName ('FINAL').asstring := edit2.text

Da a mema mensagem: Query1: Field 'INICIO' not Found.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gostei desse exemplo de filtro q você mostrou assima, estou criando uma tela de pesquisa parecida, porém o resultado vai ser mostrado em um DBGrid ligado aos IBQuery e DataSource claro!

 

Uso para passar o parâmetro de datas componentes DateTimePicker e não estou acertando fazer essa pesquisa, sabe me dizer como esses componentes funcionariam neste caso, é a primeira vez q os uso!

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao veio eu tava pesquisando e eu nao entendi uma parte desse codigo, você poderia me explicar oq seria esse Nome_Do_Primeiro_Campo_Data e o Nome_Do_Segundo_Campo_Data??

 

IBQuery.SQL.Strings[1]:='where cast(Campo_Data_Da_Sua_Tabela as date) between : datainicial (Nome_Do_Primeiro_Campo_Data) and :datafinal' (Nome_Do_Segundo_Campo_Data);

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

CCN, no lugar de FieldByName coloca ParamByName, fica assim:

 

Query1.ParamByName ('INICIO').asString := edit1.Text;
Query1.ParamByName ('FINAL').asString := edit2.Text;

se não der tenta:

 

Query1.ParamByName ('INICIO').asString := QuotedStr(edit1.Text);
Query1.ParamByName ('FINAL').asString := QuotedStr(edit2.Text);

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.