Ajuda de lógica numa Consulta SQL.

Delphi

23/06/2004

Fala Galera!
é o seguinte, tenho tabela cpdos que contém OS´s, e cada OS tem uma data e hora de previsão de execução.
O que eu estou tentando fazer é que seja mostrado as OS´s que estouraram essa data e hora de previsão.
eu fiz isso:
        qprev.Close;
        qprev.SQL.Clear;
        with qprev.SQL do begin
            Add(´SELECT  PDATAEXEC AS DATA, PHORAEXEC AS HORA, SERSOLIC, COD FROM CpdOS´);
            Add (´ where situacao in("Pendente","Em Andamento")´);
            Add (´ and PDATAEXEC >= :vdata´);
            Add (´ and PHORAEXEC >= :vhora´);
            Add (´ order by cod´);
            qprev.ParamByName(´vdata´).asdate := date;
            qprev.ParamByName(´vhora´).astime := Now;
        end;
        qprev.Open;


Funciona, mas ele me trará todos os registro em que a data for menor ou igual a ´vdata´ e que a hora for maior ou igual a ´vhora´. Isto é, se eu tiver uma OS que estourou sua previsão ontém mas que a hora for maior que vhora, não irá aparecer...

Acho q eu consegui explicar....
alguém poderia me ajudar a solucionar isso???

Valew!!!!


Bueno

Bueno

Curtidas 0

Respostas

Bueno

Bueno

23/06/2004

Pessoal, desculpe, o código estava errado..
segue abaixo o certo, porém o o mesmo erro... hehehe

 qprev.Close;
        qprev.SQL.Clear;
        with qprev.SQL do begin
            Add(´SELECT  PDATAEXEC AS DATA, PHORAEXEC AS HORA, SERSOLIC, COD FROM CpdOS´);
            Add (´ where situacao in("Pendente","Em Andamento")´);
            Add (´ and PDATAEXEC <= :vdata´);
            Add (´ and PHORAEXEC <= :vhora´);
            Add (´ order by cod´);
            qprev.ParamByName(´vdata´).asdate := date;
            qprev.ParamByName(´vhora´).astime := Now;
        end;
        qprev.Open;


Com este código, a query me trará as OS´s que a PDATAEXEC <= :vdata e que a PHORAEXEC <= :vhora. Isto é, a query não me trará os registros que a PDATAEXEC for menor que vdata mas que PHORAEXEC for maior que vhora.

Qker dúvida postae q eu tento ser mais claro...


GOSTEI 0
Skywalker

Skywalker

23/06/2004

veja bem o segundo parametro:
´now´ - ele retorna a data e a hora atual.
Talvez seja ele.


GOSTEI 0
Bueno

Bueno

23/06/2004

[b:fc85fd159a]skywalker[/b:fc85fd159a]
Não vejo problema aí, pois é exatamente isso que eu quero.. essa rotina está dentro de um timer que será executado a cada 5 min.
Eu teria q usar If´s dentro dessa query, mas nem sei se isso é possível? então... é possível usar if´s numa query?

Teria q ser +/- assim:

Selecionar os registros em que a DATAEXEC for menos que a data atual. E selecionar os registros em que a DATAEXEC for igual a data atual, mas a HORAEXEC for menor que a hora atual.

Mas... COMO EU FAÇO ISSO?!?!??!

Valew!!!!


GOSTEI 0
Skywalker

Skywalker

23/06/2004

Caro bueno se você comprara uma hora:
Ex: 11:55:35
com um valor retornado da função Now do delphi
Ex: 23/06/2004 11:55:35
ira retornar alguns campos não desejados, então minha sugestão e no lugar do Now coloque time, e me retorne caso funcione.


GOSTEI 0
Paulo_amorim

Paulo_amorim

23/06/2004

Olá

Se o que o skywalker ta falando eh correto, troque Now; por Time;

Até+


GOSTEI 0
Bueno

Bueno

23/06/2004

[b:a2af250956]skywalker , Paulo_Amorim[/b:a2af250956]

Senhores, o meu problema é de lógica!!! não é a função!
Ponham isso num botão e mandem executar e vejam o resultado:
showmessage(timetostr(Now));



aguardo respostas...


GOSTEI 0
Skywalker

Skywalker

23/06/2004

pelo o que eu vi não ha erros de logica pois as condições com os and´s estão todas corretas, porem sugiro que ao inves de compara os dois campos data e hora separados compare eles juntos atraves de uma concatenação.Não vai ser a coisa mais rapida, porem pode funcionar.


GOSTEI 0
Bueno

Bueno

23/06/2004

vc tem razão! c eu usar concatenado, vai funcionar, porém... como eu concateno dois campos string para um campo DateTime???
por enquanto minha sql tá assim:

cdata := datetimetostr(now);
qprev.Close;
qprev.SQL.Clear;
with qprev.SQL do begin
    Add(´SELECT SERSOLIC, COD, PDATAEXEC + " " + PHORAEXEC as PDATAEXEC FROM CpdOS´);
    Add (´ where situacao in("Pendente","Em Andamento")´);
    Add (´ and PDATAEXEC <= :vdata´);
    Add (´ order by cod´);
    qprev.ParamByName(´vdata´).asdatetime := strtodatetime(cdata);
end;
qprev.Open;



GOSTEI 0
Skywalker

Skywalker

23/06/2004

no caso na hora que voce concatenar os campo eles virarão um campo string ´PDATAEXEC´, logo voce nao precisa converte sua variavel string ´cdata´ para datetime, pois o campo concatenado é uma string.
logo sugiro que a ultima parte do seu codigo fique assim

´qprev.ParamByName(´vdata´).value:= cdata;´
Talvez funcione.


GOSTEI 0
Bueno

Bueno

23/06/2004

Kra, agradeço sua ajuda! valew mesmo!
Consegui resolver o meu problema da seguinte forma:

        qprev.Close;
        qprev.SQL.Clear;
        with QPrev.SQL do begin
            Add(´Select PDataExec, PHoraExec, SerSolic, cod  from CPDOS´);
            Add(´where situacao in ("Pendente", "Em Andamento")´);
            Add(´And PDATAEXEC < :VDATA´);
            Add(´or situacao in ("Pendente", "Em Andamento")´);
            Add(´and PDATAEXEC = :VDATA and PHoraExec < :VHORA ´);
            Add(´Order By PDataExec, PHoraExec, COD´);
            qprev.ParamByName(´vdata´).AsDate:= strtodatetime(FormatDatetime(´DD/MM/YY´,date));
            qprev.ParamByName(´vhora´).Astime := strtotime(FormatDateTime(´hh:mm:ss´,time));
        end;
        qprev.Open;



GOSTEI 0
Everton

Everton

23/06/2004

bueno, sei que você já conseguiu resolver o seu problema, mas deixo aqui uma outra solução:


qprev.Close; 
qprev.SQL.Clear; 
with QPrev.SQL do 
begin 
  Add(´Select PDataExec, PHoraExec, SerSolic, cod  from CPDOS´); 
  Add(´where situacao in ("Pendente", "Em Andamento") ´); 
  Add(´And ((PDATAEXEC < CURRENT_DATE)        ´); 
  Add(´      or ((PDATAEXEC = CURRENT_DATE)     ´);
  Add(´      and (PHoraExec < CURRENT_TIME)))    ´); 
  Add(´Order By PDataExec, PHoraExec, COD´); 
end; 
qprev.Open;




GOSTEI 0
POSTAR