

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.
Pokud chces memory tabulku, jdes na to uplne spatne. Query slouzi pro vyber dat z existujici databaze. Ty potrebujes napr. ClientDataset z Delphi nebo stahnout kbMemTable, tusim, ze i v rx library je jedna memory tabulka.
Nie je to celkom tak. Ja chcem toto:
A neni jednodussi jit cestou:
Pokud neexistuje tabulka, zkopiruji ji z adresare, kde mam vychozi prazdne tabulky ?
Už som nad tým uvažoval, ale sa mi to riešenie veľmi nepáči. Zdá sa mi to také neprogramátorské. Chcel by som sa naučiť vytvoriť to programovo.
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:
Takže všetko som urobil. Aj indexy pekne vo vizuále vytváram, ale ako zadám do položky TIndexDef.Fields vo vizuále dve položky naraz? Napríklad MENO, SIET? Ide o to, že neviem akým znakom oddeliť tie dve položky v reťazci.
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.
Ej a tu je problém. Ja potrebujem, aby to nemalo vlastnosť "case sensitive".
No však, [ixCaseInsensitive] znamená: ne "case sensitive".
To in mi trošku uniklo.
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:
//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).
To je teraz na mňa trochu moc. Ten súbor mám, pozriem si to.
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á:
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:
Zistil som, že vlastnosť Exist má stále hodnotu False.
Ak sa nebojíš mojich kódov, tak ti to asi pošlem. Ja som už nervy s tým stratil. Už som všetky vlastnosti prešiel aj 3x a nič.
Odoslané na: info@arkotechnik.cz
Tak jsem ti před chvílí majlem odpověděl.
Nejako ten mail mešká. Ale veď sa dočkám. Ďakujem.
Á doprde**.. Já si to z práce forwardoval domů a reply se poslalo zpátky do práce
. Už jsem to napravil. Příště mi posílej majl na rce@... (dál je to stejné jako jsi posílal). To mi přijde jak domů, tak i do práce a jen mě soukromě.
Síce meškal, ale práve dorazil, idem čítať, ešte raz ďakujem.
Nemáš za co.

Ď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).
Ďakujem, teraz už toto multirozvláknené vlákno hádam môžem uzavrieť.
Dobrá. Kdyžtak založ čerstvé vlákno na nový dotaz.
