Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda pra criar Form com pesquisa em SQL entre intervalo de Datas


.Léo

Pergunta

Bom dia pessoal, esse é o meu segundo tópico criado em foruns na net e fico feliz em usar este recurso. 8)

Minha dificuldade está em criar um Form em Delphi 2006 para pesquisa em um ADOQUERY que puxa os dados da tabela Lancamento, a tabela Lancamento está em um banco MDB chamado bdsis.mdb e dentro da tabela Lancamento tenho um campo chamado Data do tipo Data/hora.

No form que estou criando de nome frmConComAss tem o edit (edtprontuario) e dois TDateTimePicker (aquele combobox que quando clicamos e aparece um calendário bem bacana).

No SQL do ADOQUERY tem a seguinte instrução Select * from Lancamento order by Data desc, assim será visualizado no TOPO o ultimo REG do Lancamento.

No bitbutton que quero filtrar pelo PRONTUARIO E LOGO EM SEGUIDA PELO INTERVALO DAS DATAS INICIAL E FINAL ESCOLHIDAS PELO calDI (componente TDateTimePicker DATA INICIAL) E calDF (componente TDateTimePicker DATA FINAL) tem a seguinte instrução:

var

sql_txt: string;

flag_aux: Boolean; //irá auxiliar na execução dos demais codigos

begin

//Inicio da condição para filtragem do PRONTUARIO

flag_aux := False;

sql_txt := 'Select * from Lancamento where '; //A variavel sql_txt recebe Declaração SQL

if edtPro.text<>'' then

begin

sql_txt := sql_txt + 'Prontuario = "' + edtPro.text + '" ';

flag_aux := True;

end

else

begin

flag_aux:=false;

Showmessage('Campo vazio, favor, digitar um PRONTUÁRIO válido');

end; //Até aqui está ok

//####################MEU PROBLEMA COMEÇA AQUI ##########################

if calDI.date <> '' then

begin

if flag_aux=true then

sql_txt := sql_txt + 'and data >= "' + calDI.date + '" ';

end;

if calDF <> '' then

begin

if flag_aux=true then

sql_txt := sql_txt + 'and data <= "' + calDF.date + '" ';

end;

//####################MEU PROBLEMA TERMINA AQUI ############################

//Instrução para abertura do MEU ADOQUERY de name adqfiltro

if (flag_aux=true) then

begin

adqfiltro.Close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add(sql_txt);

adqfiltro.Open;

end;

A instrução acima funciona perfeitamente quando digito apenas o prontuário e me mostra em meu dbgrip todos os reg correspondentes. Entretanto não estou conseguindo filtrar quando digito o PRONTUÁRIO e escolho a Data inicial e a Data final, pois me reportar um erro de dados incompatíveis entre minha variável sql_txt e o meus componentes calDI e calDF... :huh:

tentei criar duas variáveis publicas chamadas data1 e data2 do tipo string, dai eles receberiam os valores assim:

data1:=DateToStr(calDI.date); // onde converto o valor Data em string pra ser aceito na variável sql_txt

data2:=DateToStr(calDF.date);

daí ficaria assim

if calDI.date <> '' then

begin

if flag_aux=true then

sql_txt := sql_txt + 'and data >= "' + data1 + '" ';

end;

if calDF <> '' then

begin

if flag_aux=true then

sql_txt := sql_txt + 'and data <= "' + data2 + '" ';

end;

Mesmo assim da o erro de dados incompatíveis... Se precisar de mais detalhes, favor perguntar e desde já agradeço a ajuda de todos.

Abs e espero que vocês possam me ajudar, sou novato e sei o básico em SQL e Delphi :unsure:

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

data1:=DateToStr(calDI.date); // onde converto o valor Data em string pra ser aceito na variável sql_txt
data2:=DateToStr(calDF.date);

//####################MEU PROBLEMA COMEÇA AQUI ##########################
if data1 <> '  /  /    ' then
begin
   if flag_aux=true then
   sql_txt := sql_txt + 'and data >= "' + data1 + '" ';
end;

if data2 <> '  /   /    ' then
begin
   if flag_aux=true then
   sql_txt := sql_txt + 'and data <= "' + data2 + '" ';
end;
//####################MEU PROBLEMA TERMINA AQUI ############################

Obseve que se voce já pegou os valores de calDI.date e calDF.date e os converteu em strings, basta comparar a string

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
data1:=DateToStr(calDI.date); // onde converto o valor Data em string pra ser aceito na variável sql_txt
data2:=DateToStr(calDF.date);

//####################MEU PROBLEMA COMEÇA AQUI ##########################
if data1 <> '  /  /    ' then
begin
   if flag_aux=true then
   sql_txt := sql_txt + 'and data >= "' + data1 + '" ';
end;

if data2 <> '  /   /    ' then
begin
   if flag_aux=true then
   sql_txt := sql_txt + 'and data <= "' + data2 + '" ';
end;
//####################MEU PROBLEMA TERMINA AQUI ############################

Obseve que se voce já pegou os valores de calDI.date e calDF.date e os converteu em strings, basta comparar a string

abraço

Vlw Jhonas agradeço muito pela sua paciencia em ler meu problema e procurar uma solução, só que acabei fazendo diferente antes de ver sua resposta e deu certo por um instante, saca só...

Em vez de dois Tedit para inserção da data inicial e data final para pesquisa no Field Data da Table Lancamento, coloquei dois TDataTimePicker no lugar e como a propriedade que ele armazena o valor escolhido é o date fiz o seguinte:

procedure TfrmComAss.btnFiltrarClick(Sender: TObject);

var

var_aux : boolean;

cmdsql : string;

begin

var_aux:=false;

cmdsql:='Select * from Lancamento where ';

data1:=DateToStr(calDI.Date); //Primeiro TdateTimePicker

data2:=DateToStr(calDF.Date); //Segundo TdateTimePicker

if edtPro.text<>'' then

begin

cmdsql := cmdsql + 'Data between "' + data1 + '" and "'+ data2 +'" ';

var_aux := True;

end

else

begin

var_aux:=false;

Showmessage('Favor, digitar o PRONTUÁRIO e escolher uma Data válida dd/mm/aaaa');

end;

if (var_aux=true) then

begin

adqfiltro.Close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add(cmdsql);

adqfiltro.Open;

end;

end;

O código acima funciona legal, tipo, se não digitar um prontuário ele pede para digitar e com o prontuário digitado ele fará a busca do intervalo de datas entre os dois TdateTimePicker, daí o meu problema atual ( :unsure: )

Notei que os valores são pesquisados mais ele está ignorando o valores tipo mes e ano. Exemplo:

Tenho um registro de 24/05/2009

Filtro da seguinte forma para ter o valor acima:

# Correto#

01/01/2009 até 26/05/2009

# O Errado que está correto mais não deveria está (ohh céus)#

01/06/2009 até 26/12/2009

Praticamente a criança está filtrando apenas pelo dia, puts..... peço desculpas pela minha novisse mais quem puder ajudar apartir daqui, eu fico grato. Segue abaixo todo o meu PAS para eventuais consultas, um forte abraço e ótimo dia de serviço a nós:

unit ConComAss;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Mask, DBCtrls, Grids, DBGrids, ExtCtrls, Buttons, ComCtrls,

DB, ADODB, DBTables, Provider, jpeg;

type

TfrmComAss = class(TForm)

Shape2: TShape;

Label1: TLabel;

DBGrid: TDBGrid;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

StatusBar1: TStatusBar;

DBNavigator1: TDBNavigator;

btnSair: TBitBtn;

adqFiltro: TADOQuery;

DataSource: TDataSource;

edtPro: TEdit;

adqFiltroNome: TStringField;

adqFiltroCodigo_Lancamento: TAutoIncField;

adqFiltroCodigo_Comercio: TIntegerField;

adqFiltroProntuario: TWideStringField;

adqFiltroDescricao_Item: TWideStringField;

adqFiltroQtas_Vezes: TIntegerField;

adqFiltroValor: TBCDField;

Label6: TLabel;

adqFiltroComercio: TStringField;

dblNome: TDBLookupComboBox;

Image1: TImage;

CalDI: TDateTimePicker;

CalDF: TDateTimePicker;

BitBtn2: TBitBtn;

adqFiltroData: TWideStringField;

procedure BitBtn2Click(Sender: TObject);

procedure FormShow(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure btnSairClick(Sender: TObject);

private

{ Private declarations }

public //declaração de duas variaveis que serao publicas

var

data1, data2 : string; // As variáveis serão públicas pois irei utilizá-las em Forms futuros.

end;

var

frmComAss: TfrmComAss;

implementation

uses Banco;

{$R *.dfm}

procedure TfrmComAss.btnFiltrarClick(Sender: TObject);

var

var_aux : boolean;

cmdsql : string;

begin

var_aux:=false;

cmdsql:='Select * from Lancamento where ';

data1:=DateToStr(calDI.Date);

data2:=DateToStr(calDF.Date);

if edtPro.text<>'' then

begin

cmdsql := cmdsql + 'Data between "' + data1 + '" and "'+ data2 +'" ';

var_aux := True;

end

else

begin

var_aux:=false;

Showmessage('Favor, digitar o PRONTUÁRIO e escolher uma Data válida dd/mm/aaaa');

end;

if (var_aux=true) then

begin

adqfiltro.Close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add(cmdsql);

adqfiltro.Open;

end;

end;

procedure TfrmComAss.btnSairClick(Sender: TObject);

begin

//Fechamento do banco sql na hora de sair do Form - Evita de Dados corromperem

adqfiltro.SQL.Clear;

adqfiltro.Close;

close;

end;

procedure TfrmComAss.FormShow(Sender: TObject);

begin

dmMain.adotLanVen.IndexFieldNames := 'Prontuario'; //Campo Sendo habilitado para Pesquisa/Localização

end;

end.

Abs...

Editado por .Léo
Link para o comentário
Compartilhar em outros sites

  • 0

Ae garoto, não sei se resolveu o seu problema ainda, não entendo muito, porem o pouco que sei tentarei passar para você, pois tive a mesma dificuldade na hora de fazer uma pesquisa em SQL com datas!!!

Veja o que eu tive que fazer!

qryOcorre.SQL.Clear;

qryOcorre.SQL.Add('SELECT CLIENTE, HISTORICO, ATENDENTE, DATA '

+ 'FROM '

+ 'OCORRE '

+ 'WHERE '

+ 'ATENDENTE = :USUARIO '

+ 'AND (DATA >= :DATAI AND DATA <= :DATAF)'); //DATAI é a Data Inicial, e DATAF é a Data Final!

cdsOcorre.FetchParams;

cdsOcorre.Params.ParamByName('USUARIO').AsString := lkpAtendentes.Text; // Tenho um Campo Usuario, e seto o parametro para ser o valor que está no lkpAtendentes!

cdsOcorre.Params.ParamByName('DATAI').AsDate := DataInicial.Date;// DataInicial é um DateTimePicker

cdsOcorre.Params.ParamByName('DATAF').AsDate := DataFinal.Date;// DataFinal tambem é um DateTimePicker!

cdsOcorre.Open;// agora eu abro e boa!

Ve o que você pode fazer com esse codigo q eu fiz!!! Adapte ele! ehehehe

Vlw!

Ou seja, adaptando á seu codigo, creio que ficará assim:

adqfiltro.close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add('SELECT * '

+ 'FROM '

+ 'LANCAMENTO '

+ 'WHERE '

+ '(DATA >= :DATAI AND DATA <= :DATAF)'); //DATAI é a Data Inicial, e DATAF é a Data Final!

adqfiltro.FetchParams;

adqfiltro.Params.ParamByName('DATAI').AsDate := DataInicial.Date;// DataInicial é um DateTimePicker

adqfiltro.Params.ParamByName('DATAF').AsDate := DataFinal.Date;// DataFinal tambem é um DateTimePicker!

adqfiltro.Open;// agora eu abro e boa!

Tenta fazer assim no seu botão?, ahh sei lá, tentei ajudar, se não estiver correto podem me corrigir por favor! ehehe!

Abraços!!!!

Editado por Douglas_Soares
Link para o comentário
Compartilhar em outros sites

  • 0

Oh Douglas, td bem contigo? então você fez em uma TQuery normal ou em um tADOQuery? O cdsOcorre seria o que? Desculpas pela ignorancia no assunto. srsrsrs

Vou tentar utilizar seu exemplo, pois, fiquei muito feliz em ter conseguido uma solução do meu outro problema que era conseguir a filtragem e agora que consigo o nenem filtra só pela data.... to sem sorte nessas duas semanas.. srsrsr

vlw cara... aguardo uma resposta sua.

Editado por .Léo
Link para o comentário
Compartilhar em outros sites

  • 0

No caso usei uma SQLQry, que fica na paleta dbExpress, o cds, no caso é um ClientDataSet, que no caso fica na paleta Data Acess, no seu caso fico meio confuso.

Você usou meu exemplo, e agora ele filtra só pela data, é isso?, ou não?, como seria então?

explica melhor ai eu vo tenta te ajuda, falou!

Link para o comentário
Compartilhar em outros sites

  • 0

Se voce estiver usando BETWEEN repare no formato da data

SELECT CODCLI, DATA, COD_ATV

FROM Moviment

WHERE DATA BETWEEN '09/01/2008' AND '09/10/2008'

a data seria 01/09/2008 a 10/09/2008 ... mas veja que na select voce deve mudar

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Boa Resposta Jhonas, analisando o q você disse e adptando ao codigo do léo, creio que ficaria assim:

SELECT *

FROM LANCAMENTO

WHERE DATA BETWEEN :DATEI AND :DATAF

Adaptando ao seu problema ficaria assim:

adqfiltro.close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add('SELECT * '

+ 'FROM '

+ 'LANCAMENTO '

+ 'WHERE '

+ 'DATA BETWEEN :DATAI AND :DATAF ;

adqfiltro.FetchParams;

adqfiltro.Params.ParamByName('DATAI').AsDate := calDI.Date;

adqfiltro.Params.ParamByName('DATAF').AsDate := calDF.Date;

adqfiltro.Open;

Ve se você consegue usar uma SQLQry, pois com AdoQry não tenho a minima ideia de como eu faria isso!

Vlws!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Ve se você consegue usar uma SQLQry, pois com AdoQry não tenho a minima ideia de como eu faria isso!

[/qote]

Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
   Query1.Active := false;
   Query1.SQL.Clear;
   Query1.SQL.Append('SELECT CODCLI, DATA, COD_ATV '+
                     'FROM Moviment WHERE  DATA BETWEEN ' +
                     '''' + FormatDateTime('mm/dd/yyyy',DateTimePicker1.Date) + ''''+' AND '+
                     ''''+ FormatDateTime('mm/dd/yyyy',DateTimePicker2.Date) + '''');

   showmessage(Query1.SQL.Text);
   Query1.Active := true;
end;

Observe que voce tem que alterar o formato da data quando usa BETWEEN

observe tambem como ficaria a instrução SQL montada atravez do showmessage

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Legal, então mais um vez seguindo seu exemplo, para ajudar o cara vo fazer no modelo dele, huahua!

procedure TfrmComAss.Button1Click(Sender: TObject);

begin

adqfiltro.Active := false;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Append('SELECT * '+

'FROM LANCAMENTO WHERE DATA BETWEEN ' +

'''' + FormatDateTime('mm/dd/yyyy',calDI.Date) + ''''+' AND '+

''''+ FormatDateTime('mm/dd/yyyy',calDF.Date) + '''');

showmessage(adqfiltro.SQL.Text);

adqfiltro.Active := true;

end;

Dessa forma, creio que ele vai filtrar só por datas, creio que você não quer só assim....

Explica ai certinho, como você quer?, filtrar o que?, data?, nome?, hora?

ahh... se não for pedir muito da pra você carrega sua fonte e posta o link aqui pra gente analisar?

beleza... mais uma vez tentei ajudar com minha ignorancia... xD...

Link para o comentário
Compartilhar em outros sites

  • 0
No caso usei uma SQLQry, que fica na paleta dbExpress, o cds, no caso é um ClientDataSet, que no caso fica na paleta Data Acess, no seu caso fico meio confuso.

Você usou meu exemplo, e agora ele filtra só pela data, é isso?, ou não?, como seria então?

explica melhor ai eu vo tenta te ajuda, falou!

____________________________________________________

Então realmente não expliquei direito oque aconteceu depois, foi mal pessoal, notei isso relendo os posts, meu problema inicial era de não conseguir fazer uma consulta entre duas datas, só que acabei conseguindo resolver por conta depois de uma última revisada, por isso que nem testei sua opção na hora, apesar que a dica do pessoal conta, é claro (e fico grato por isso de coração).

Dai, o problema passou pra outro que estava filtrando apenas pelo Dia.

Só que estou achando que deve ser algum problema de conversão do formato, que eu acho que tem um lance do formato americano ser mm/dd/yyyy e o brasileiro ser dd/mm/aaaa. estou crente que a dica do Jhonas possa ajudar com a sintaxe:

procedure TForm1.Button1Click(Sender: TObject);

begin

Query1.Active := false;

Query1.SQL.Clear;

Query1.SQL.Append('SELECT CODCLI, DATA, COD_ATV '+

'FROM Moviment WHERE DATA BETWEEN ' +

'''' + FormatDateTime('mm/dd/yyyy',DateTimePicker1.Date) + ''''+' AND '+

''''+ FormatDateTime('mm/dd/yyyy',DateTimePicker2.Date) + '''');

showmessage(Query1.SQL.Text);

Query1.Active := true;

end;

No meu caso deve ficar assim:

procedure TfrmComAss.btnFiltrarClick(Sender: TObject);

begin

adqFiltro.Active := false;

adqFiltro.SQL.Clear;

adqFiltro.SQL.Append('SELECT * '+

'FROM Lancamento WHERE DATA BETWEEN ' +

'''' + FormatDateTime('mm/dd/yyyy',calDI.Date) + ''''+' AND '+

''''+ FormatDateTime('mm/dd/yyyy',calDF.Date) + '''');

showmessage(adqFiltro.SQL.Text);

adqFiltro.Active := true;

end;

vou testar e tambem testarei a sua conforme citado, e tem razão, é tanto código que puts, a página ta lotando, foi mal aê povo. xD

Agradeço a ajuda de todos!

Editado por .Léo
Link para o comentário
Compartilhar em outros sites

  • 0

Fiz os testes e agora segue o log da situação atual:

procedure TfrmComAss.btnFiltrarClick(Sender: TObject);

var

var_aux : boolean;

cmdsql : string;

begin

var_aux:=false;

cmdsql:='Select Prontuario from Lancamento where ';

data1:=DateToStr(calDI.Date);

data2:=DateToStr(calDF.Date);

if edtPro.text<>'' then

begin

cmdsql := cmdsql + 'Data between "' + data1 + '" and "'+ data2 +'" ';

var_aux := True;

end

else

begin

var_aux:=false;

Showmessage('Favor, digitar o PRONTUÁRIO e escolher uma Data válida dd/mm/aaaa');

end;

if (var_aux=true) then

begin

{ adqfiltro.Close;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Add(cmdsql);

adqfiltro.Open; }

adqfiltro.Active:=false;

adqfiltro.SQL.Clear;

adqfiltro.SQL.Append('Select * from Lancamento where Data BETWEEN ' +

'''' + FormatDateTime('mm/dd/yyyy',calDI.Date) + '''' + ' AND ' +

''''+ FormatDateTime('mm/dd/yyyy',calDF.Date) + '''');

showmessage(adqfiltro.SQL.Text);

adqfiltro.Active:=true;

end;

end;

Com o código sugerido por vocês da certo, só queria saber como faria para inserir o que está ai bunitin no meu adqfiltro (Tadoquery)

Tentei criar uma variavel (cmdsql : string) pra receber os dados de adqfiltro.sql.text e por sua vez a adqfiltro.sql.add(cmdsql) - não deu certo então...

Se vocês souberem me da uma força que praticamente só falta isso, a minha grid exibir esse parametro acima pois no showmessage está correspondendo a seleção feita em meus TdataTimePicker.

vlw pela ajuda abs a todos.

Link para o comentário
Compartilhar em outros sites

  • 0

Depois que você fez a variavel cmdsql, e tentou adicionar no seu adq filtro, não deve ter funcionado aquele comando adqfiltro.sql.add(cmdsql) porque tem que dar um clear.

Tenta fazer assim

adqfiltro.close;

adqfiltro.sql.clear;

adqfiltro.sql.add(cmdsql);

adqfiltro.open;

beleza. ve ai o que você faz, se não for isso, me avisa!

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Depois que você fez a variavel cmdsql, e tentou adicionar no seu adq filtro, não deve ter funcionado aquele comando adqfiltro.sql.add(cmdsql) porque tem que dar um clear.

Tenta fazer assim

adqfiltro.close;

adqfiltro.sql.clear;

adqfiltro.sql.add(cmdsql);

adqfiltro.open;

beleza. ve ai o que você faz, se não for isso, me avisa!

Abraços

Então esse conjunto de códigos, você sugere colocar no depois do showmessage box? se for, no momento que der o clear ele irá eliminar o que está no adqfiltro... e na verdade to tentando é fazer o adqfiltro.sql.add receber alguém para o grid visualizar a filtragem!

tentei com a variavel cmdsql, não deu certo, e se não me falha a memoria, eu cheguei a tentar ontem a noite isso dai e num funfou.. :huh:

Pra ser sincero, qual a finalidade do APPEND??? vou analisar direitin...

falou

Editado por .Léo
Link para o comentário
Compartilhar em outros sites

  • 0

Classifico esse tópico fechado pois o meu problema inicial foi resolvido com a ajuda do pessoal do forum...

O problema novo descrito acima será solucionado em um tópico novo que irei abrir....

Fica os meus reais agradecimentos a todos que particparam com sua ajuda.

3.7 Ao postar uma mensagem, procure usar o tamanho de fonte padrão do fórum, não deixando as letras grandes ou pequenas demais; evite o uso de cores fortes, as quais prejudicam a leitura, e não insira textos totalmente em caixa alta (ESTE É UM TEXTO EM CAIXA ALTA). Tópicos que violarem essa regra serão editados sem prévio aviso.

:rolleyes:

Editado por Jhonas
Regras do Forum
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...