Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi SQL - Chyba pri vyhodnocovaní podmienky alebo zlé zadanie? (where)

V Delphi mám tabuľku, z ktorej potrebujem vydolovať záznamy, ktoré sú v určitom časovom rozmedzí. Časy sú definované takto:

Time - dátum a čas od (vrátane)
TempTime - dátum a čas do (nevrátane)

Po zadaní SQL príkazu do komponenty a jeho selektovaní sa mi zobrazia všetky záznamy vyhovujúce len dátumom. Porovnanie času pri rovnakom dátume je ignorované. Stratil som na tom vyše hodiny a začínam mať pocit, že sa jedná o chybu Delphi. Prioritu operátorov som vylúčil, pretože som tam nasypal zátvoriek, až to zdravé nie je. Funkčný program, ktorý som len "vycucol" z originálu je tu na stiahnutie aj so zdrojovým kódom. Ak vás môžem poprosiť, pozrite sa na to niekto, ponáhľa mi to. Keď prídem z roboty o 22:20, tak sa pozriem, či ste niekto zistili problém.

http://data2.edisk.cz/stahni/84143/SQL.ZIP_409.05kB .html

V zdrojovom kóde sú zapoznámkované dva SQL príkazy. Jeden zobrazí všetko, druhý len vybrané záznamy v určenom časovom intervale. Ale keďže to nefunguje ako má, tak zobrazí dva záznamy. Správne by nemal zobraziť nič.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Už čakám na to, čo mi povie Rce, pretože ten sa s tým musel stretnúť, ak je to chyba v Delphi. Ak ni…
msx. 17.04.2007 22:32
msx.
Díky za uznání, ale chyba v Delphi (rep. v BDE) není - teda tahle chyba, jiné tam pochopitelně jsou… nový
Rce 17.04.2007 23:27
Rce
1. Na vytvorenie tabuľky som použil stránku datatypes.php. Tú mi našiel Google. Nechcel som toľko ot… nový
msx. 18.04.2007 00:10
msx.
(...)to je pracovné TQuery a to v priebehu programu neustále mení obsah (...) Tak do toho formu nal… nový
Rce 18.04.2007 01:02
Rce
Query.SQL.Text := 'select....'; Nedávno som vyčítal z helpu, že je to len na čítanie, takže ostanem… nový
msx. 30.04.2007 23:19
msx.
Co tak pouzit Query.SQL.Add - je to TStringList... SQL[0]:?::?::?: nový
Intex 01.05.2007 10:26
Intex
Pokud jsi tohle vyčetl, tak jsi to vyčetl špatně. Je to to samé jako Memo.Lines.Text := 'nejaký řetě… poslední
Jan Fiala 01.05.2007 10:34
Jan Fiala

Díky za uznání, ale chyba v Delphi (rep. v BDE) není - teda tahle chyba, jiné tam pochopitelně jsou :)).
1) Máš nevhodně navrženou tabulku, je lépe mít datum a čas v jednom poli typu DateTime než extra datum a extra čas - pak by se s výhodou použil predikát BETWEEN.
2) Když už to máš, jak to máš, tak je třeba si uvědomit, že čas je podmnožinou datumu. Podmínka by měla vypadat asi takto:

where ((Datum > :Datum_od) or ((Datum = :Datum_od) and (Cas >= :Cas_od)))   and   ((Datum < :Datum_do) or ((Datum = :Datum_do) and (Cas <= :Cas_do)))'

[původně jsi měl ...(Datum >= :Datum_od)... a ...(Datum <= :Datum_do)... Tak jak jsi to měl, byla podmínka splněna už podle data a čas se nikdy nemohl uplatnit]

3) Nacpat datum a čas v Delpháckém tvaru je jediné správné přes parametry, systém si to přešrotí sám a dobře. Jde to taky cpát textově, ale pak je nutno znásilnit funkce aby převedly datum a čas do amerického formátu yyyy/mm/dd.
4) Necpal bych to textově do Query.SQL [0] ale přímo napsal v editoru do vlastnosti SQL. Když už to cpát programem, tak: Query.SQL.Text := 'select....';

1. Na vytvorenie tabuľky som použil stránku datatypes.php. Tú mi našiel Google. Nechcel som toľko otravovať na poradni, keďže to som si ozaj vedel nájsť sám. DateTime tam žiaľ nie je. Mne osobne to v programe vyhovuje viac (DateTime), ale už to meniť nebudem.

2. Toľko kriku za 2 =. Tak toto som ozaj dokonale prehliadol. Ďakujem a ani sa nečudujem, že mi to nešlo. Akurát koniec musí byť tento, (Cas < :Cas_do))), inak by to bolo vrátane.

3. Mne stačí, čo som si užil za reálne číslo, ktoré som nakoniec aj tak vyhodil, lebo v programe to nevyhovovalo.

4. Napísať priamo vlastnosti to nemôžem, lebo to je pracovné TQuery a to v priebehu programu neustále mení obsah, ale o vlastnosti SQL.Text som nevedel.:i:
________
Vyriešené

(...)to je pracovné TQuery a to v priebehu programu neustále mení obsah (...)

Tak do toho formu naláduj klidně hojnost TQuery. Nebo tam nacpi TDatabase a ta má přímo metodu Execute, která provede znakový SQL příkaz.

Na vytvorenie tabuľky som použil stránku...

Ta stránka není nejvhodnější pro SQL. Zrovna o Paradoxu (BDE) tam není ani muk. Doporučuji "C:\Program Files\Common Files\Borland Shared\Bde\bde32.hlp", který popisuje vnitřek BDE včetně příkladů v Delphi a "C:\Program Files\Common Files\Borland Shared\Bde\localsql.hlp" popisující příkazy SQL pro BDE. Též jsou dobré stránky o BDE (sice z pozice C++ ale pro Delphi též použitelné) hl.html .

Zpět do poradny Odpovědět na původní otázku Nahoru