Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - BDE - TQuery - tabuľka v pamäti

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, Grids, DBGrids, DBTables;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Query1: TQuery;
  end;

var
  Form1: TForm1;
  Field1: TFloatField;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Query1 := TQuery.Create(Self);
  Field1 := TFloatField.Create(nil);
  Field1.FieldName := 'Cislo';
//  Field1.Size := 5;
  Field1.DisplayWidth := 5;
  Field1.Precision := 2;
  Query1.Fields.Add(Field1);
  Query1.Active := True;
  DataSource1.DataSet := Query1;

  try
    Query1.Append;
    Query1.Fields[0].AsFloat := 10;
    Query1.Post;
  finally
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Query1.Free;
end;

end.

Čo robím zle? Ak povolím riadok Field1.Size, tak dostanem chybu, že je to chybná dĺžka, ak to nepovolím, tak pri Active := True dostanem "No SQL statement available". Keďže je tabuľka vytváraná v pamäti, tak jej fyzické meno neexistuje. Zrejme je chyba niekde v tom. Tiež by ma zaujímalo, čo s tou dĺžkou.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Pokud chces memory tabulku, jdes na to uplne spatne. Query slouzi pro vyber dat z existujici databaz…
Jan Fiala 18.07.2006 20:12
Jan Fiala
Nie je to celkom tak. Ja chcem toto: ak neexistuje tabuľka vytvoriť; uložiť; otvoriť; pracovať s ňo…
msx. 18.07.2006 20:25
msx.
A neni jednodussi jit cestou: Pokud neexistuje tabulka, zkopiruji ji z adresare, kde mam vychozi pra…
Jan Fiala 18.07.2006 20:38
Jan Fiala
Už som nad tým uvažoval, ale sa mi to riešenie veľmi nepáči. Zdá sa mi to také neprogramátorské. Chc…
msx. 18.07.2006 20:47
msx.
Jestliže chceš vytvořit programově tabulku, když není na disku přítomna, tak na to musíš takto: Na f…
Rce 18.07.2006 22:50
Rce
Na form nebo TDataModule prskni TTable. V objektu TTable dvojklikem otevři Field editor a nadefinuj…
msx. 20.07.2006 13:17
msx.
Omlouvám se:-[, vyber volbu "New field" a nadegfinuj sloupec tabulky. Opakováním "New field" nadefin…
Rce 20.07.2006 13:26
Rce
Práveže nie, mal som kliknúť na New Field, teraz som zistil, ale už mi to nedovolilo editovať príspe…
msx. 20.07.2006 13:28
msx.
:-[:-[:-[:-[ Jsi sakra rychlej. Než jsem tu blbost po sobě přečetl, tak jsi jí viděl i ty. :-[:-[:-[
Rce 20.07.2006 13:30
Rce
Nie sme každý neomylný. Stane sa kaaždému. Len najhoršie na tom je, že sa to občas stáva v situáciác…
msx. 21.07.2006 00:41
msx.
Díky. :-);-) nový
Rce 21.07.2006 00:49
Rce
Takže všetko som urobil. Aj indexy pekne vo vizuále vytváram, ale ako zadám do položky TIndexDef.Fie… nový
msx. 21.07.2006 02:08
msx.
Do pole Fields oddělíš jména sloupců středníkem. Například: "Prijmeni;Jmeno". Pozor, v BDE je drobná… nový
Rce 21.07.2006 02:29
Rce
Ej a tu je problém. Ja potrebujem, aby to nemalo vlastnosť "case sensitive". nový
msx. 21.07.2006 02:50
msx.
No však, [ixCaseInsensitive] znamená: ne "case sensitive". nový
Rce 21.07.2006 02:58
Rce
To in mi trošku uniklo.:-[ nový
msx. 21.07.2006 03:27
msx.
A ešte otázka: TQuery má vlastne všetky vymoženosti ako aj TTable. Vo vizuále mu môžem nahádzať polo… nový
msx. 21.07.2006 02:12
msx.
TQuery má téměř všechny vymoženosti, protože stojí na třídě TDBDataSet a tím všechny podobnosti konč… nový
Rce 21.07.2006 02:46
Rce
To je teraz na mňa trochu moc. Ten súbor mám, pozriem si to. nový
msx. 21.07.2006 02:56
msx.
Všetko mi funguje, až na jeden nepochopiteľný detail. Na začiatku sa mi vytvorí tabuľka, ktorá na di… nový
msx. 21.07.2006 03:39
msx.
Podivné. Já to dělám taky tak: procedure GenKdyzNeni (Tab: TTable; const FN: String20; const lJePoI… nový
Rce 21.07.2006 11:47
Rce
Zistil som, že vlastnosť Exist má stále hodnotu False. nový
msx. 21.07.2006 11:59
msx.
Ak sa nebojíš mojich kódov, tak ti to asi pošlem. Ja som už nervy s tým stratil. Už som všetky vlast… nový
msx. 21.07.2006 12:07
msx.
Tak jsem ti před chvílí majlem odpověděl. ;-) nový
Rce 22.07.2006 00:19
Rce
Nejako ten mail mešká. Ale veď sa dočkám. Ďakujem.:beer: nový
msx. 22.07.2006 00:50
msx.
Á doprde**.. Já si to z práce forwardoval domů a reply se poslalo zpátky do práce :x:. Už jsem to na… nový
Rce 22.07.2006 00:59
Rce
Síce meškal, ale práve dorazil, idem čítať, ešte raz ďakujem. nový
msx. 22.07.2006 00:59
msx.
Nemáš za co.;-):-) nový
Rce 22.07.2006 01:00
Rce
Ďakujem. Pomohlo. A ja si môžem lámať hlavu. Môžem poprosiť o vysvetlenie významu DatabaseName? V he… nový
msx. 22.07.2006 01:04
msx.
Je to název databáze. V BDE je databáze řešena jako adresář, tudíž zde jde napsat cesta k datům. Je… nový
Rce 22.07.2006 01:32
Rce
Ďakujem, teraz už toto multirozvláknené vlákno hádam môžem uzavrieť.:-) nový
msx. 22.07.2006 01:42
msx.
Dobrá. Kdyžtak založ čerstvé vlákno na nový dotaz.:-);-) poslední
Rce 22.07.2006 01:46
Rce

Jestliže chceš vytvořit programově tabulku, když není na disku přítomna, tak na to musíš takto:
Na form nebo TDataModule prskni TTable. V objektu TTable dvojklikem otevři Field editor a nadefinuj všechny potřebné fieldy (pravá packa myši v prostoru Field Editoru, vybrat Add Fields.. a dál už uvidíš). Dál dvojklikem na IndexDefs (v Object Inspectoru) obdobným způsobem vytvoř potřebné indexy. Nakonec nastav StoreDefs na TRUE a vhodně TableName a DatabaseName. V programu udělej něco podobného:

if not Table1.Exists then begin
    Table1.FieldDefs.Clear (); // Pro sychr, kdyby se to použilo vícekrát
    Table1.CreateTable (); Table1.Close ();
end;

Na form nebo TDataModule prskni TTable. V objektu TTable dvojklikem otevři Field editor a nadefinuj všechny potřebné fieldy (pravá packa myši v prostoru Field Editoru, vybrat Add Fields.. a dál už uvidíš).

Nedokážem pridať položku (stĺpec), pretože mi to stále dokola vypisuje toto:
[ttablewv0.gif]Samozrejme, že tabuľka neexistuje. Veď preto ju idem vytvoriť, aby existovala. Čo s tým teraz?

Do pole Fields oddělíš jména sloupců středníkem. Například: "Prijmeni;Jmeno". Pozor, v BDE je drobná chyba: Ve všech indexech (mimo primárního) zaškrtní "ixCaseInsensitive" - i když se jedná třeba o číslo. Jinak to může při vytváření tabulky nebo při obnově indexů řvát neprávem chyby.

A ešte otázka: TQuery má vlastne všetky vymoženosti ako aj TTable. Vo vizuále mu môžem nahádzať položky, indexy už nie. Dá sa takto vytvoriť aj databáza v TQuery? Alebo len tým SQL príkazom spomenutým nižšie (čiže vo vizuále si môžem nahadzovať čo chcem a podstatný je SQL príkaz)?

TQuery má téměř všechny vymoženosti, protože stojí na třídě TDBDataSet a tím všechny podobnosti končí. TTable je prostě přímé spojení s tabulkou, TQuery je výsledek dotazu SELECT (což je v podstatě virtuální tabulka). Přes SQL lze vytvořit tabulku, ale musíš použít buď metodu Execute objektu TDatabase - takto Database1.execute (const SQL: String; Params: TParams = nil; Cache: Boolean = False; Cursor: phDBICur = nil): Integer; - význam parametrů viz help. Nebo rychleší je použít přímo API funkce BDE - jestli máš můj modul pro práci s BDE Rce_BDE (nabízel jsem ho kdysi ke stažení), je to metoda ExecSQL. Může vypadat například takto:

{------------------------------ Provede příkaz SQL za pomocí databáze --------------------------}
function ExecSQL (const ASQL: string; ADB: TDatabase; ACursor: phDBICur = nil): LongInt;
{	ASQL	:= Příkaz SQL (DDL nebo DML)							}
{	ADB	:= Objekt databáze, který je použit pro vykonání SQL příkazu			}
{	ACursor	:= Případné handle tabule, kam se narve výsledek (nutné pro SELECT)		}
{Vrací: Počet vět co vrátil příkaz DML (příkaz DDL vrací vždy 0)				}
begin
	Check (DbiQExecDirect (ADB.Handle, qrylangSQL, PChar (ASQL), ACursor));
	if (ACursor <> nil) then Check (DbiGetRecordCount (ACursor^, Result)) else Result := 0;
end;

//Edit Toto je cesta pro příkazy SQL kategorie DDE. Pro příkazy SQL kategorie DML existuje ještě objekt TUpdateSQL, kterým jdou vyslat příkazy DELTE, UPDATE a INSERT (přes výše uvedenou mojí rutinu jdou tyto příkazy vyslat také).
DDE = data definition language = prostředky na definici dat například příkazy CREATE TABLE (vytvoření tabulky), ALTER TABLE (změny definice tabulky), DROP TABLE (smazání tabulky), CREATE INDEX, DROP INDEX.
DML = Data Manipulation Language = manipulace s daty - příkazy SELECT, DELETE (odstranění vět), INSERT (vložení vět z příkazu nebo jiné tabulky), UPDATE (změna položek tabulky).

Všetko mi funguje, až na jeden nepochopiteľný detail. Na začiatku sa mi vytvorí tabuľka, ktorá na disku nie je a po ukončený programu ju na disku nájdem aj s obsahom. Po opätovnom spustení programu mi to prejde vetvou then a tabuľka je čistá:

procedure TfrmPhoneBook.FormCreate(Sender: TObject);
begin
  tblPhoneBook.TableName := PrgPath + cPhoneBook;
  if not tblPhoneBook.Exists then
    begin
      tblPhoneBook.CreateTable;
      tblPhoneBook.Close;
    end;
  tblPhoneBook.Open;
end;

DatabaseName som doteraz nastavené nemal, tak som to rýchlo nastavil na 'DBDEMOS', ale správa sa to rovnako.

Podivné. Já to dělám taky tak:

procedure GenKdyzNeni (Tab: TTable; const FN: String20; const lJePoInst: boolean);
{	Tab		:= Zdejší master ke generování						}
{	FN		:= Název tabule								}
{	lJePoInst	:= true - je po instalaci, hlásit generování, false - drží hubu		}
begin
	oBDE.SetDataPath (Tab, FN); // Nastaví Table.Name a Database name - viz modul Rce_BDE co máš
	if lJePoInst then RceInf (nil, 'Vytváří se ' + Tab.TableName); //Jen ukáže před xicht, že se generuje tabulka
	if not Tab.Exists then begin
		Tab.StoreDefs	:= true { Hovno platný, musí to být v Tab's }; // StoreDefs nastav v TTable!!
		Tab.FieldDefs.Clear (); // Důležité, jestliže je tabulka Tab použita po druhé za běhu programu
		Tab.CreateTable (); Tab.Close () {sychr}; 
		Tab.StoreDefs	:= false;
	end
end;

Ďakujem. Pomohlo. A ja si môžem lámať hlavu. Môžem poprosiť o vysvetlenie významu DatabaseName? V helpe je napísané niečo v zmysle, že to určuje alias databázy alebo proste názov s akým vystupuje databáza, ale nerozumiem, čo to má spoločné s cestou.

Je to název databáze. V BDE je databáze řešena jako adresář, tudíž zde jde napsat cesta k datům. Je tu možno také uvést Alias databáze (zástupné jméno, zástupce pro označení toho adresáře), které je nadefinováno v BDE administrátoru (nebo API funkcema BDE - viz můj modul Rce_BDE).

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