CCN 0 Denunciar post Postado Outubro 16, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 16, 2007 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
CCN 0 Denunciar post Postado Outubro 17, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 17, 2007 Coloque o SQL dentro da query, depois clicar em Parameters, e configura o tipo deles, depois vai funcionar... Compartilhar este post Link para o post Compartilhar em outros sites
CCN 0 Denunciar post Postado Outubro 17, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 17, 2007 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
cracher 0 Denunciar post Postado Outubro 17, 2007 CNN não sei se ajuda mas no meu sistema fiz desse modo. 1-Criei um formulario de filtro: 2 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: 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
CCN 0 Denunciar post Postado Outubro 18, 2007 CNN não sei se ajuda mas no meu sistema fiz desse modo. 1-Criei um formulario de filtro: 2 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: 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
icefusion 0 Denunciar post Postado Outubro 18, 2007 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
CCN 0 Denunciar post Postado Outubro 18, 2007 tente alterar essas duas linhas....Query1.FieldByName ('INICIO').asstring := edit1.textQuery1.FieldByName ('FINAL').asstring := edit2.textDa a mema mensagem: Query1: Field 'INICIO' not Found. Compartilhar este post Link para o post Compartilhar em outros sites
Tatiane.InterArt 0 Denunciar post Postado Dezembro 1, 2007 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
Syler(Alex Sandro) 0 Denunciar post Postado Outubro 17, 2008 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
S4ndr0_soad 0 Denunciar post Postado Outubro 17, 2008 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