Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Nezobrazujúce sa záznamy databázy spojenej cez ADO v Delphi 2007

Mám databázu, ku ktorej som v Delphi 2007 pripojený cez ADO komponenty. V komponente DBGrid, ktorá má zobrazovať dáta z databázy v prehľadnej tabuľke, sa mi zobrazujú iba názvy stĺpcov tabuľky (načítali sa z databázy). No políčka, kde majú byť už konkrétne údaje záznamov, sú prázdne. Neviete mi niekto poradiť v čom je problém? Inak to isté robia aj ostatné komponenty, ktoré majú zobrazovať dáta z databázy.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ako mám dostať výsledok SQL príkazu do nejakej premennej, ktorú môžem ďalej využívať v podmienkach?…
gorgeous007 29.06.2008 18:03
gorgeous007
Vysledkem SQL prikazu je dataset (mnozina dat). Ty si musis precist, co potrebujes, napr: promenna :…
Jan Fiala 29.06.2008 19:01
Jan Fiala
Na otestovanie som použil toto: Label1.Caption := DataModule1.ADOQueryKasa1.FieldByName('datum').Va…
gorgeous007 29.06.2008 19:30
gorgeous007
Protoze datum je ze serveru vraceno v poli DateTime a Label.Caption je string, tak je treba pred pri… nový
Jan Fiala 29.06.2008 20:12
Jan Fiala
A keď to potrebujem použiť pri SQL príkaze SELECT max(datum) FROM kasa? Píše mi, že "Field" datum ne… nový
gorgeous007 29.06.2008 20:37
gorgeous007
SELECT max(datum) as Datum FROM kasa A najednou field Datum existuje... nový
Jan Fiala 29.06.2008 21:02
Jan Fiala
Teraz mi zas vypisuje 'Could not convert variant of type (Null) into type (Double)'. Možno to súvisí… nový
gorgeous007 30.06.2008 11:12
gorgeous007
S datumem jsou vždy problémy. Zpracování datumu je nejlepší vždy nechat na systému přes parametry do… nový
Rce 30.06.2008 11:25
Rce
No už ma to fakt nebaví. Neviete mi poradiť akú databázu použiť, aby s ňou Delphi 2007 vedelo bezpro… nový
gorgeous007 03.07.2008 12:59
gorgeous007
ADO mas zdokumentovane dokonale na MSDN. Tvuj problem bude ve formatu datumu - protoze jej tam posle… nový
Jan Fiala 03.07.2008 13:06
Jan Fiala
Ja tam už dávno dohadzujem čisto len Date. Pod Win98 to ide, no pod WinXP nie. Preto si myslím, že c… nový
gorgeous007 03.07.2008 13:49
gorgeous007
Obávám se, že ti C++ nepomůže. Není to syntaxí Delphi či C++ ale syntaxí SQL a jeho zobrazení datumu… nový
Rce 03.07.2008 13:57
Rce
Neviem aký formát dátumu myslíš. Veď pod oboma Windowsami nie sú žiadne podrobnejšie nastavenia dátu… nový
gorgeous007 03.07.2008 16:32
gorgeous007
Teraz mi zas vypisuje chybu 'Cannot convert 1857 to a date' v tomto riadku: DataModule1.ADOStoredPr… nový
gorgeous007 03.07.2008 16:40
gorgeous007
To je jak u blbejch. Kdyz ti poradim, abys datum daval ve formau yyyymmdd, ty mi odpovis, ze uz to d… nový
Jan Fiala 03.07.2008 18:20
Jan Fiala
Sorry, som myslel, že v tomto prípade to nič neovplyvní. Inak díky za upozornenie, dal som tam yyyym… nový
gorgeous007 03.07.2008 20:33
gorgeous007
A ty se divis, proc ti to tu chybu pise? Opakuji. Sam nevis co pises. Doporucuji se zamerit na DataM… nový
Jan Fiala 03.07.2008 20:40
Jan Fiala
No, to máš pravdu, že neviem, čo píšem do zdrojáku, lebo to nemám z kade vedieť. Robím to metódou po… nový
gorgeous007 03.07.2008 21:50
gorgeous007
Pokud to maji byt castky, tak v databazi pouzij typ Money nebo Curency. To je typ s pevnym poctem de… nový
Jan Fiala 03.07.2008 20:41
Jan Fiala
No, pekne. Teraz mi blbne už aj samotné Delphi. Keď kliknem na ENTER, tak mi nevytvorí nový riadok,… nový
gorgeous007 06.07.2008 13:01
gorgeous007
Nemas vypnuty Insert? nový
Jan Fiala 06.07.2008 20:08
Jan Fiala
Díky, ja by som na to asi nikdy neprišiel. ;-) nový
gorgeous007 07.07.2008 10:08
gorgeous007
Inak ten problém s nezobrazovaním dát z databázy pod WinXP som už vyriešil, no radšej tu nepíšem čím… nový
gorgeous007 07.07.2008 15:38
gorgeous007
Provedes dotaz: select count(*) as Pocet from Tabulka Vrati se ti pocet zaznamu v tabulce nový
Jan Fiala 07.07.2008 16:49
Jan Fiala
Díky, ale nevracia to náhodou pri prázdnej tabuľke NULL? nový
gorgeous007 07.07.2008 21:00
gorgeous007
nepíšem čím to bolo, lebo by ste ma asi zabili Klídek, nikdo tě vraždit nebude, možná by to bylo za… nový
Rce 07.07.2008 21:43
Rce
Ako som už vyššie písal, prerábam jeden starý program. Mám ho nainštalovaný v adresári Program Files… nový
gorgeous007 08.07.2008 11:24
gorgeous007
Nedá sa nejak urobiť aby sa po stlačení ENTERu automaticky stlačilo konkrétne tlačidlo na formulári,… poslední
gorgeous007 11.07.2008 20:06
gorgeous007

Teraz mi zas vypisuje 'Could not convert variant of type (Null) into type (Double)'. Možno to súvisí s tým, že pod WinXP sa mi nezobrazujú tie záznamy a tak sa to tvári ako dátový typ Null. Hľadal som na Googli, ale je tam toho strašne málo a píšu o tom len Španieli a Číňania. :-(

EDIT: Zistil som, že pod Win98 to ide normálne. Žiadne chybové hlášky a v komponente Label1 sa zobrazí ten najväčší dátum.

S datumem jsou vždy problémy. Zpracování datumu je nejlepší vždy nechat na systému přes parametry dotazu SQL. Hodnota NULL není v datumovém poli příliš vhodná, ošetřit za pomocí IS NULL. IMHO nebude záležet na Win98/XP - i když drivery ODBC můžou mít své chyby. Spíš zkontroluj, jestli nemáš různé národní nastavení zobrazení datumu. Na tom tady taky hodně záleží.

Ja tam už dávno dohadzujem čisto len Date. Pod Win98 to ide, no pod WinXP nie. Preto si myslím, že chyba nebude v mojom zdrojáku, ale v tom ako WinXP (konkrétne tie ODBC drivery) pracuje s tou starou databázou (nevie v nej rozoznať dátové typy alebo s nimi pracovať a...).

A na tie anglické návody na MSDN fakt nemám čas. Keď niečo čítam v slovenčine (poprípade češtine), tak si to aj zapamätám. Ale v angličtine viem akurát o čom je veta alebo odstavec, ktorý čítam. Niežeby som nevedel po anglicky, ale po prečítaní z toho väčšinou nič nemám. Hlavne ak by som teraz k tomu ADO musel čítať brutálne veľa o všetkých komponentoch, ich vlastnostiach a použití.

Proste stále mi Delphi vyhodí nejakú chybu. A pri každej skúšať či to náhodou nejde pod Win98, hľadať každú jednu na Googli, či písať do fóra, tak to ten program nezrobím ani za 10 rokov.

Rozmýšľal som už o C++, ku ktorému je toho viac v slovenčine/češtine. Lenže Borland C++ Builder sa mi akosi nedarí nainštalovať. A v Dev-C++, ktorý mi poradil jeden kamarát a ktorý som nainštaloval len pred chvíľou, sa všetko píše len v zdrojovom kóde (žiaden formulár nevidno počas tvorby programu/pred skompilovaním), takže by som sa musel od základov učiť C++. Aj keď síce už niečo viem, pretože doteraz som sa venoval len tvorbe webových aplikácii v PHP, ktoré má syntax práve z C++.

No tak už neviem. Možno to nechám tak a prídem o pekný zisk... :-/

Obávám se, že ti C++ nepomůže. Není to syntaxí Delphi či C++ ale syntaxí SQL a jeho zobrazení datumu. Nemáš náhodou nastaven jiný národní formát datumu ve Win 98 a v XP? Nemáš jedny win české a jedny anglické (US)? Problém též na 99% nebude v ADO ani ODBC, ale v SQL. Ve Win 98 a XP se připojuješ ke stejnému serveru, nebo máš na ladění v obojím nějakou lokální instalaci? Je v obou Win stejná konfigurace databázového serveru? Jaký vůbec používáš databázový stroj (omlouvám se, jestli jsem to v tomto threadu přehlédl)?

Neviem aký formát dátumu myslíš. Veď pod oboma Windowsami nie sú žiadne podrobnejšie nastavenia dátumu/času.

Na obidvoch PC (s WinXP aj s Win98) je databáza nastavená v Microsoft ODBC Administrator ako System DSN. Konfigurácia je na oboch PC úplne rovnaká. Databáza je Sybase SQL Anywhere 5.5 a už dlhé roky s ňou pod Win98 (a asi aj pod Win95) pracuje stará verzia programu, ktorý mám teraz odznova urobiť.

Teraz mi zas vypisuje chybu 'Cannot convert 1857 to a date' v tomto riadku:

DataModule1.ADOStoredProc.Parameters.ParamByName('newPohladavky').Value := DataModule1.ADOQuery.FieldByName('Pohladavky').Value;

Ten je súčasťou nasledujúcej časti zdrojového kódu:

procedure TwndZaklad.FormActivate(Sender: TObject);
begin
  maxDatum := DataModule1.ADOQueryStartUp.FieldByName('Datum').Value;
  if (maxDatum > Date) then Application.Terminate;
  if (maxDatum < Date) then begin
    DataModule1.ADOStoredProc.ProcedureName := 'KASA_ZALOZ_NOVY_DEN';

    DataModule1.ADOStoredProc.Parameters.ParamByName('newDatum').Value := Date;

    DataModule1.ADOQuery.SQL.Clear;
    DataModule1.ADOQuery.SQL.Add('SELECT pohladavky AS Pohladavky FROM kasa WHERE datum='+FormatDateTime('yyyy-mm-dd', maxDatum));
    DataModule1.ADOQuery.Active := true;
    DataModule1.ADOStoredProc.Parameters.ParamByName('newPohladavky').Value := DataModule1.ADOQuery.FieldByName('Pohladavky').Value;

    DataModule1.ADOQuery.SQL.Clear;
    DataModule1.ADOQuery.SQL.Add('SELECT stav AS Stav FROM kasa WHERE datum='+FormatDateTime('yyyy-mm-dd', maxDatum));
    DataModule1.ADOQuery.Active := true;
    DataModule1.ADOStoredProc.Parameters.ParamByName('newPocStav').Value := DataModule1.ADOQuery.FieldByName('Stav').Value;

    DataModule1.ADOStoredProc.Active := true;
    DataModule1.ADOStoredProc.ExecProc;

    wndKasa.ShowModal;
  end;
end;

To je jak u blbejch. Kdyz ti poradim, abys datum daval ve formau yyyymmdd, ty mi odpovis, ze uz to davno davas jako date a pak uvedes ukazku kodu, kde mas nekolikrat:

DataModule1.ADOQuery.SQL.Add('SELECT stav AS Stav FROM kasa WHERE datum='+FormatDateTime('yyyy-mm-dd', maxDatum));

Tobe jina databaze nepomuze. Bohuzel jedine, co ti pomuze je rozumet tomu, co pises.
A muzes se samozrejme spolehat na pirazovani variantu a jejich "nejakou" konverzi, ale nemas zadnou kontrolu nad typy.
Pred par prispevky jsem ti psal, jak nastavit typ parametru. Zkus si to precist.

Sorry, som myslel, že v tomto prípade to nič neovplyvní. Inak díky za upozornenie, dal som tam yyyymmdd a už nevypisuje tú chybu. Teraz to zas hlási 'CommandText does not return a result set.'.

Inak tá procedúra v databáze, ktorá je aj v tom kúsku zdrojáku, pridáva do databázy nový záznam. A ten záznam sa už pod WinXP zobrazil, až na tie dve položky Stav a Pohladavky, ktoré tá procedúra prijíma ako parametre. Asi som tam dal zlý dátový typ. Ale čo tam mám dať, aby to bolo kompatibilné, keď v databáze sú dátové typy decimal (10,0) a decimal (10,2)? Ako DataType oboch parametrov tam databáza dohodí ftBCD, no čo mám dať ako Value.Type?

No, to máš pravdu, že neviem, čo píšem do zdrojáku, lebo to nemám z kade vedieť. Robím to metódou pokus-omyl. Myslím tie veci s ADO komponetami. O ostatných sa aj niečo píše na Živě.cz či v knihe Mistroství v Delphi 6. ;-)

A teraz neviem, čo si myslel. To, že tam má byť namiesto DataModule1.ADOStoredProc.ExecProc riadok DataModule1.ADOStoredProc.Open, alebo niečo iné? Fakt neviem čo mi to robí, pretože to vždy zmaže celú databázu a vloží tam záznam s dnešným dátum a jeden s dátumom 30.12.1899. :-|

No, pekne. Teraz mi blbne už aj samotné Delphi. Keď kliknem na ENTER, tak mi nevytvorí nový riadok, ale iba kurzor skočí o riadok nižšie, ako keby som stlačil šípku dolu. A zas keď kliknem na SPACE, tak mi nezrobí medzeru, ale sa len kurzor posunie o jeden znak doprava, ako keby som stlačil šípku doprava. Inak všetko ostatné funguje. Myslím písanie všetkých znakov a dokonca aj ich mazanie (BACKSPACE). :-/

Inak ten problém s nezobrazovaním dát z databázy pod WinXP som už vyriešil, no radšej tu nepíšem čím to bolo, lebo by ste ma asi zabili. Proste bolo to spôsobené len mojou hlúposťou alebo skôr nevšímavosťou (mimo Delphi). :-x

A ešte mám jednu otázku: Ako môžem zistiť, či databázová tabuľka obsahuje nejaké záznamy alebo je prázdna? Myslím cez Delphi, keď to chcem použiť v podmienke: Ak je tabuľka prázdna, vloží záznam s určitými hodnotami a keď už nejaký záznam obsahuje, spustí procedúru z databázy (čo sa mi mimochodom už tiež podarilo urobiť).

Ako som už vyššie písal, prerábam jeden starý program. Mám ho nainštalovaný v adresári Program Files, kde je aj databáza, ktorá beží cez ODBC. Všetky databázové tabuľky boli prázdne a preto sa mi v novom programe, ktorý robím, nič nezobrazovalo. Lenže ja som celý čas cez jedného SQL klienta pristupoval k druhej (rovnakej) databáze, ktorá bola v adresári s tým klientom a ktorá už obsahovala nejaké záznamy. Vtedy som si myslel, že stále pomocou môjho programu aj toho SQL klienta pristupujem k tej istej databáze. Prišiel som na to až vtedy, keď som mal spustený ten program, ktorý robím, a v tom istom čase som spustil toho SQL klienta. Ten SQL klient sa automaticky pripojil k tej dobrej databáze (čo som vtedy ešte nevedel), zrazu som sa čudoval, prečo sú databázové tabuľky prázdne, a potom mi to došlo. :-D

Nedá sa nejak urobiť aby sa po stlačení ENTERu automaticky stlačilo konkrétne tlačidlo na formulári, v momente keď je kurzor v komponente Edit (teda keď niečo píšem)? Viem síce urobiť, aby sa po stlačení ENTERu niečo vykonalo, ale vždy sa mi pri tom ozve ten zvuk Windowsu, ktorý signalizuje, že sa niečo nedá (teda neviem to inak opísať).

A ešte nedajú sa nejak uvoľňovať zavreté formuláre z pamäti? Sledujem totiž, že stále keď otvorím formulár, program uloží do pamäte ďalších pár kB. Dokonca si jednotlivé formuláre stále držia svoje premenné po zavretí a opätovnom otvorení. Formuláre otváram príkazom ShowModal a zatváram príkazom Close. Keď použijem príkaz Free, tak konkrétny formulár už počas toho istého chodu programu neotvorím. To už sú princípy OOP, ktorým som sa zatiaľ nezaoberal (viem, čudné, keď programujem v Object Pascale :-D ). Ale neviete mi aspoň poradiť ako uvoľniť premenné z pamäti pri zatváraní formulára?

Som síce už riadne OT, ale nechcem zbytočne zakladať novú tému. ;-)

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