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
Teraz mi zas vypisuje chybu 'Cannot convert 1857 to a date' v tomto riadku: DataModule1.ADOStoredPr…
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…
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…
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…
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 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