Fórum Ajuda de lógica numa Consulta SQL. #239299
23/06/2004
0
é 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
Curtir tópico
+ 0Posts
23/06/2004
Bueno
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
23/06/2004
Skywalker
´now´ - ele retorna a data e a hora atual.
Talvez seja ele.
Gostei + 0
23/06/2004
Bueno
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
23/06/2004
Skywalker
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
23/06/2004
Paulo_amorim
Se o que o skywalker ta falando eh correto, troque Now; por Time;
Até+
Gostei + 0
23/06/2004
Bueno
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
23/06/2004
Skywalker
Gostei + 0
24/06/2004
Bueno
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
24/06/2004
Skywalker
logo sugiro que a ultima parte do seu codigo fique assim
´qprev.ParamByName(´vdata´).value:= cdata;´
Talvez funcione.
Gostei + 0
24/06/2004
Bueno
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
24/06/2004
Everton
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
Clique aqui para fazer login e interagir na Comunidade :)