16. Prßce s tabulkami

V tΘto kapitole popφ╣eme, jak pou╛φvat ve sv²ch databßzov²ch aplikacφch komponentu datovΘ mno╛iny TTable. Komponenta tabulky zaobaluje ·plnou strukturu a data v p°ipojenΘ databßzovΘ tabulce. Komponenta tabulky d∞dφ mnoho sv²ch zßkladnφch vlastnostφ a metod od TDataSet, TBDEDataSet a TDBDataSet. S t∞mito komponentami jsme se ji╛ seznßmili.
S komponentou tabulky se seznßmφme v t∞chto bodech:

Pou╛φvßnφ komponenty tabulky

Komponenta tabulky nßm dßvß p°φstup ke ka╛dΘmu °ßdku a sloupci v p°ipojenΘ databßzovΘ tabulce, kterß je v Paradoxu, dBASE, Accessu, FoxPro, ODBC databßze nebo SQL databßze na vzdßlenΘm serveru, jako je InterBase, Sybase nebo SQL Server.
M∙╛eme editovat a prohlφ╛et data v ka╛dΘm sloupci a °ßdku tabulky. M∙╛eme pracovat z rozsahem °ßdk∙ v tabulce a m∙╛eme filtrovat zßznamy k zφskßnφ podmno╛iny °ßdk∙ tabulky spl≥ujφcφ zadanΘ filtrovacφ kritΘrium. M∙╛eme vyhledßvat zßznamy, kopφrovat, p°ejmenovßvat a ru╣it celΘ tabulky a vytvß°et vztah Master-detail mezi tabulkami.
Poznßmka: Komponenta tabulky se v╛dy odkazuje na jednu databßzovou tabulku. Pokud pot°ebujeme v jednΘ komponent∞ p°istupovat k vφce tabulkßm, nebo pokud nßs zajφmß podmno╛ina °ßdk∙ a sloupc∙ z jednΘ nebo vφce tabulek, pak mφsto komponenty tabulky m∙╛eme pou╛φt komponentu dotazu.

Nastavovßnφ komponenty tabulky

Nßsledujφcφ kroky jsou obecnΘ instrukce pro nastavovßnφ komponenty tabulky p°i nßvrhu. Pro p°izp∙sobenφ vlastnostφ podle po╛adavku na╣φ aplikace mohou b²t po╛adovßny dal╣φ kroky. K vytvo°enφ komponenty tabulky:
  1. Umφstφme komponentu tabulky ze strßnky Data Access Palety komponent do DatovΘho modulu nebo na formulß° a nastavφme jejφ vlastnost Name na unikßtnφ hodnotu v na╣φ aplikaci.
  2. Nastavφme DatabaseName komponenty na jmΘno databßze, ke kterΘ budeme p°istupovat.
  3. Nastavφme vlastnost TableName na jmΘno tabulky v databßzi. Pokud vlastnost DatabaseName je ji╛ specifikovßna, pak jmΘno tabulky lze vybrat v rozbalovacφm seznamu.
  4. Umφstφme komponentu DatovΘho zdroje do DatovΘho modulu nebo na formulß° a nastavφme jejφ vlastnost DataSet na jmΘno komponenty tabulky. Komponenta DatovΘho zdroje je pou╛ita k p°edßnφ v²sledkovΘ mno╛iny z tabulky do Datov²ch ovladaΦ∙ k zobrazenφ.
Pro zp°φstupn∞nφ dat zaobalen²ch komponentou tabulky:
  1. Umφstφme komponentu DatovΘho zdroje ze strßnky Data Access Palety komponent do DatovΘho modulu nebo na formulß° a nastavφme jejφ vlastnost DataSet na jmΘno komponenty tabulky.
  2. Umφstφme DatovΘ ovladaΦe, jako je TDBGrid na formulß° a nastavφme vlastnost DataSource ovladaΦe na jmΘno komponenty DatovΘho zdroje umφst∞nΘ v p°edchozφm kroku.
  3. Nastavφme vlastnost Active komponenty tabulky na true.
V tomto bod∞ se budeme zab²vat:
Specifikovßnφ umφst∞nφ tabulky
Vlastnost DatabaseName specifikuje, kde komponenta tabulky hledß databßzovou tabulku. Pro Paradox a dBASE, DatabaseName m∙╛e b²t p°ezdφvka BDE nebo adresß°ovß cesta. Pro tabulky SQL, DatabaseName musφ b²t p°ezdφvka BDE.
V²hodou pou╛φvßnφ p°ezdφvek BDE ve v╣ech p°φpadech je to, ╛e m∙╛eme zm∞nit Datov² zdroj pro celou aplikaci jednoduchou zm∞nou definice p°ezdφvky v Pr∙zkumnφku SQL.
K nastavenφ vlastnosti DatabaseName:
  1. Nastavφme vlastnost Active na false (pokud ji╛ nenφ nastaveno).
  2. Specifikujeme p°ezdφvku BDE nebo adresß°ovou cestu ve vlastnosti DatabaseName.
Tip: Pokud na╣e aplikace pou╛φvß komponentu databßze k °φzenφ databßzov²ch transakcφ, pak DatabaseName m∙╛e b²t nastaveno na lokßlnφ p°ezdφvku definovanou pro komponentu databßze.
Specifikovßnφ jmΘna tabulky
Vlastnost TableName specifikuje zp°φstup≥ovanou tabulku databßze v komponent∞ tabulky. Pro specifikaci tabulky provedeme tyto kroky:
  1. Nastavφme vlastnost tabulky Active na false (pokud ji╛ nenφ nastaveno).
  2. Nastavφme vlastnost DatabaseName na p°ezdφvku BDE nebo adresß°ovou cestu.
  3. Nastavφme vlastnost TableName na zp°φstup≥ovanou tabulku. P°i nßvrhu m∙╛eme volit z p°φpustn²ch jmen v rozbalovacφm seznamu vlastnosti TableName v Inspektoru objekt∙. Za b∞hu musφme specifikovat p°φpustnou hodnotu v k≤du.
Po specifikaci p°φpustnΘho jmΘna tabulky m∙╛eme nastavit vlastnost komponenty Active na true pro p°ipojenφ k databßzi, otev°enφ tabulky a zobrazenφ a editaci dat.
Za b∞hu, m∙╛eme nastavit nebo zm∞nit p°i°azenou tabulku ke komponent∞ tabulky: Nap°. nßsledujφcφ k≤d m∞nφ jmΘno tabulky pro komponentu tabulky OrderOrCustTable na zßklad∞ jejφho souΦasnΘho jmΘna tabulky:
OrderOrCustTable->Active = false; // Uzav°enφ tabulky
if (OrderOrCustTable->TableName == "CUSTOMER.DB")
  OrderOrCustTable->TableName = "ORDERS.DB";
else
  OrderOrCustTable->TableName = "CUSTOMER.DB";
OrderOrCustTable->Active = true; // Op∞tovnΘ otev°enφ novΘ tabulky
Specifikovßnφ typu tabulky pro lokßlnφ tabulky
Pokud aplikace p°istupuje k tabulkßm Paradoxu, dBASE, FoxPro nebo textov²m tabulkßm ASCII, pak BDE pou╛φvß vlastnost TableType k urΦenφ typu tabulky (jejφ oΦekßvanΘ struktury). TableType nenφ pou╛φvßno, kdy╛ aplikace p°istupuje k SQL tabulce na databßzovΘm serveru.
Implicitn∞ TableType je nastaveno na ttDefault. Kdy╛ TableType je ttDefault, pak BDE urΦuje typ tabulky podle p°φpony souboru tabulky. Nßsledujφcφ tabulka sumarizuje p°φpony jmen soubor∙ rozeznßvan²ch BDE a urΦenφ typu tabulky:
 
P°φpona Typ tabulky
Soubor bez p°φpony Paradox.DB
.DB Paradox
.DBF dBASE
.TXT ASCII text

Pokud na╣e lokßlnφ tabulky pou╛φvajφ p°φpony soubor∙ podle p°edchozφ tabulky, pak m∙╛eme nastavit TableName na ttDefault. Jinak, na╣e aplikace musφ nastavit TableType k indikaci sprßvnΘho typu tabulky (podle nßsledujφcφ tabulky).
 

Hodnota TableType Typ tabulky
ttDefault Typ je urΦen automaticky BDE
ttParadox Paradox
ttDBase dBASE
ttFoxPro FoxPro
ttASCII ASCII text
Otevφrßnφ a uzavφrßnφ tabulky
Pro zobrazovßnφ a editovßnφ dat tabulky v Datov²ch ovladaΦφch jako je TDBGrid, tabulku otev°eme. Jsou dva zp∙soby otevφrßnφ tabulek. M∙╛eme nastavit jejφ vlastnost Active na true nebo m∙╛eme volat metodu Open. Otev°enφm tabulku uvedeme do stavu dsBrowse a v╣echny aktivnφ ovladaΦe p°i°azenΘ k DatovΘmu zdroji tabulky zobrazφ data.
P°i ukonΦovßnφ zobrazovßnφ a editace dat nebo ke zm∞n∞ zßkladnφch vlastnostφ komponenty tabulky (nap°. DatabaseName, TableName a TableType), nejprve ode╣leme nebo zru╣φme zatφm neprovedenΘ zm∞ny. Pokud jsou povoleny odlo╛enΘ aktualizace, pak volßme ApplyUpdates k zßpisu neproveden²ch zm∞n do databßze. Nakonec tabulku uzav°eme.
Jsou dva zp∙soby uzav°enφ tabulky. M∙╛eme nastavit jejφ vlastnost Active na false nebo m∙╛eme volat metodu Close. Uzav°enφm tabulky uvedeme tabulku do stavu dsInactive. Aktivnφ ovladaΦe p°i°azenΘ k DatovΘmu zdroji tabulky jsou vyprßzdn∞ny.

╪φzenφ Φtecφho/zßpisovΘho p°φstupu k tabulce

Implicitn∞, kdy╛ tabulka je otev°ena, je po╛adovßn Φtecφ a zßpisov² p°φstup k p°ipojenΘ databßzovΘ tabulce. V zßvislosti na charakteristikßch p°ipojenΘ databßzovΘ tabulky, po╛adovanΘ zßpisovΘ privilegium nemusφ b²t p°id∞leno (nap°. kdy╛ je po╛adovßn p°φstup k SQL tabulce na vzdßlenΘm serveru a server omezφ p°φstup k tabulce pouze na Φtenφ).
Jsou t°i vlastnosti komponenty tabulky, kterΘ ovliv≥ujφ Φtecφ a zßpisov² p°φstup k tabulce: CanModify, ReadOnly a Exclusive.
CanModify je vlastnost, kterß urΦuje zda komponenta tabulky mß Φtecφ a zßpisov² p°φstup do p°ipojenΘ databßzovΘ tabulky. Po otev°enφ tabulky za b∞hu, na╣e aplikace m∙╛e testovat CanModify k zji╣t∞nφ zda tabulka mß zßpisov² p°φstup. Pokud CanModify je false, pak aplikace nem∙╛e zapisovat do databßze. Kdy╛ CanModify je true, pak na╣e aplikace m∙╛e do databßze zapisovat (pokud ReadOnly tabulky je false).
ReadOnly urΦuje, zda u╛ivatel m∙╛e editovat data. Kdy╛ ReadOnly je false (implicitn∞), pak u╛ivatel m∙╛e prohlφ╛et i editovat data. K omezenφ u╛ivatele na prohlφ╛enφ dat, nastavφme ReadOnly na true p°ed otev°enφm tabulky.
Exclusive °φdφ zda aplikace zφskß v²hradnφ p°φstup k tabulce Paradoxu, dBASE nebo FoxPro. K zφskßnφ v²hradnφho p°φstupu pro tyto typy tabulek nastavφme vlastnost Exclusive komponenty tabulky na true p°ed otev°enφm tabulky. Po ·sp∞╣nΘm otev°enφ tabulky s v²hradnφm p°φstupem, ostatnφ aplikace nemohou Φφst nebo zapisovat data tabulky. Po╛adavek na v²hradnφ p°φstup nenφ akceptovßn, pokud p°i pokusu o otev°enφ tabulky, je tabulka ji╛ pou╛φvßna.
Nßsledujφcφ p°φkazy otevφrajφ tabulku pro v²hradnφ p°φstup:
CustomersTable->Exclusive = true; // Nastavenφ po╛adavku na v²hradnφ p°φstup
CustomersTable->Active = true;    // Otev°enφ tabulky
Poznßmka: M∙╛eme se pokusit nastavit Exclusive pro SQL tabulku, ale n∞kterΘ servery nemajφ podporu ·rovn∞ v²luΦnΘho uzamΦenφ tabulky. JinΘ mohou p°id∞lit v²luΦn² zßmek, ale umo╛nφ ostatnφm aplikacφm Φφst data z tabulky.

Vyhledßvßnφ zßznam∙

Zßznamy v tabulce lze vyhledßvat r∙zn²mi zp∙soby. Nejpru╛n∞j╣φ a preferovan² zp∙sob vyhledßvßnφ zßznamu, je pou╛itφ obecn²ch metod Locate a Lookup. Tyto metody umo╛≥ujφ prohledßvat libovoln² typ polo╛ky v libovolnΘ tabulce a to bez ohledu na to, zda jsou indexovanΘ nebo klφΦovanΘ.
Locate hledß prvnφ °ßdek vyhovujφcφ specifikovan²m kritΘriφm a p°esouvß kurzor na tento °ßdek. Lookup vracφ hodnoty z prvnφho °ßdku vyhovujφcφho specifikovan²m kritΘriφm, ale nep°esouvß kurzor na tento °ßdek.
Locate a Lookup m∙╛eme pou╛φt s libovoln²m typem DatovΘ mno╛iny (nejen s TTable). ┌pln² popis najdeme v kapitole Seznßmenφ s datov²mi mno╛inami.
Komponenty tabulek takΘ podporujφ metody Goto a Find. Tyto metody jsou ji╛ zastaralΘ a je vhodnΘ mφsto nich pou╛φvat ve sv²ch aplikacφch Lookup a Locate. Pokud chceme zv²╣it v²konnost existujφcφch aplikacφ (kterΘ je pou╛φvajφ), pak aplikaci m∙╛eme p°evΘst na pou╛φvßnφ nov²ch metod.
S vyhledßvßnφ zßznam∙ se seznßmφme v t∞chto bodech:
Vyhledßvßnφ zßznam∙ na zßklad∞ indexovan²ch polo╛ek
Komponenty tabulek podporujφ mno╛inu vyhledßvacφch metod Goto pro zachovßnφ zp∞tnΘ kompatibility. Metody Goto umo╛≥ujφ vyhledßnφ zßznamu na zßklad∞ indexovan²ch polo╛ek a ud∞lßnφ prvnφho nalezenΘho zßznamu nov²m souΦasn²m zßznamem.
Pro tabulky Paradoxu a dBASE, klφΦ musφ b²t v╛dy indexem, kter² m∙╛eme specifikovat ve vlastnosti IndexName komponenty tabulky. Pro SQL tabulky, klφΦ m∙╛e b²t takΘ seznam polo╛ek specifikovan²ch ve vlastnosti IndexFieldNames. M∙╛eme takΘ specifikovat polo╛kov² seznam pro tabulky Paradoxu a dBASE, ale polo╛ky musφ mφt na sob∞ definovanΘ indexy.
Tip: K vyhledßvßnφ na neindexovan²ch polo╛kßch tabulky Paradoxu nebo dBASE, pou╛ijeme Locate. Alternativn∞, m∙╛eme k hledßnφ na neindexovan²ch polo╛kßch v tabulkßch Paradoxu a dBASE pou╛φt komponentu TQuery a p°φkaz SELECT.
Nßsledujφcφ tabulka uvßdφ ╣est metod svßzan²ch s Goto a Find, kterΘ aplikace m∙╛e pou╛φt k vyhledßvßnφ zßznam∙:
 
Metoda Popis
EditKey Chrßnφ souΦasn² obsah vyrovnßvacφ pam∞ti vyhledßvacφho klφΦe a uvßdφ tabulku do stavu dsSetKey, aby aplikace mohla modifikovat existujφcφ vyhledßvacφ kritΘria p°ed provedenφm vyhledßvßnφ.
FindKey Kombinuje metody SetKey a GotoKey do jednΘ metody.
FindNearest Kombinuje metody SetKey a GotoNearest do jednΘ metody.
GotoKey Hledß prvnφ zßznam v datovΘ mno╛in∞, kter² p°esn∞ odpovφdß vyhledßvacφmu kritΘriu a p°esouvß kurzor na tento zßznam, pokud je nalezen.
GotoNearest Vyhledßvßnφ na °et∞zcovΘ polo╛ce na ne·plnou shodu hodnoty klφΦe a p°esouvß kurzor na tento zßznam.
SetKey Vyprazd≥uje vyrovnßvacφ pam∞╗ vyhledßvacφho klφΦe a uvßdφ tabulku do stavu dsSetKey, aby aplikace mohla specifikovat novß vyhledßvacφ kritΘria p°ed provedenφm vyhledßvßnφ.

GotoKey a FindKey jsou logickΘ funkce, kterΘ v p°φpad∞ ·sp∞chu, p°esouvajφ kurzor na nalezen² zßznam a vracejφ true. Pokud hledßnφ je ne·sp∞╣nΘ, pak kurzor nenφ p°esunut a funkce vracφ false.
GotoNearest a FindNearest v╛dy m∞nφ pozici kurzoru, a to na prvnφ p°esn∞ odpovφdajφcφ zßznam (je-li nalezen) nebo na prvnφ zßznam, kter² je v∞t╣φ ne╛ specifikovanß vyhledßvacφ kritΘria.

Provedenφ vyhledßvßnφ metodou Goto
K provedenφ vyhledßvßnφ pomocφ metody Goto musφme provΘst tyto obecnΘ kroky:

  1. V p°φpad∞ pot°eby ve vlastnosti IndexName specifikujeme index pou╛it² p°i vyhledßvßnφ. Pro SQL tabulky seznam polo╛ek pou╛it²ch jako klφΦ nalezneme v IndexFieldNames. Pokud pou╛ijeme primßrnφ index tabulky nenφ nutno nastavovat tyto vlastnosti.
  2. Otev°eme tabulku.
  3. Pomocφ SetKey uvedeme tabulku do stavu dsSetKey.
  4. Ve vlastnosti Fields specifikujeme hodnotu (hodnoty) k vyhledßvßnφ. Fields je seznam °et∞zc∙, kter² je indexovßn po°adov²mi Φφsly odpovφdajφcφ sloupc∙m (jsou Φφslovßny od 0).
  5. Pomocφ GotoKey nebo GotoNearest hledßme a p°esuneme se na prvnφ vyhovujφcφ zßznam.
Nap°. nßsledujφcφ k≤d, spojen² s obsluhou stisku tlaΦφtka, p°emφstφ kurzor na prvnφ zßznam obsahujφcφ hodnotu polo╛ky, kterß se p°esn∞ shoduje s textem v editaΦnφm ovladaΦi na formulß°i:
void __fastcall TSearchDemo::SearchExactClick(TObject *Sender)
{
  Table1->SetKey();
  Table1->Fields[0]->AsString = Edit1->Text;
  if (!Table1->GotoKey())
    ShowMessage("Zßznam nenalezen");
}
GotoNearest je podobnΘ. Vyhledßvß nejbli╛╣φ shodu v ΦßsteΦnΘ hodnot∞ polo╛ky. M∙╛e b²t pou╛ita pouze na °et∞zcov²ch polo╛kßch. Nap°.
Table1->SetKey();
Table1->Fields[0]->AsString = "Sm";
Table1->GotoNearest();
Pokud existuje zßznam s "Sm" jako prvnφmi dv∞mi znaky, pak kurzor je umφst∞n na tento zßznam. Jinak, pozice kurzoru se nem∞nφ a GotoNearest vracφ false.

Provedenφ vyhledßvßnφ metodou Find
K provedenφ vyhledßvßnφ metodou Find provedeme nßsledujφcφ kroky:

  1. V p°φpad∞ pot°eby ve vlastnosti IndexName specifikujeme index pou╛it² p°i vyhledßvßnφ. Pro SQL tabulky seznam polo╛ek pou╛it²ch jako klφΦ nalezneme v IndexFieldNames. Pokud pou╛ijeme primßrnφ index tabulky nenφ nutno tyto vlastnosti nastavovat.
  2. Otev°eme tabulku.
  3. Pomocφ FindKey nebo FindNearest hledßme a p°esuneme se na prvnφ nebo nejbli╛╣φ zßznam. Ob∞ metody p°ebφrajφ jeden parametr (Φßrkami odd∞len² seznam hodnot polo╛ky), kde ka╛dß hodnota odpovφdß indexovan²m sloupc∙m v p°ipojenΘ tabulce.
Poznßmka: FindNearest m∙╛eme pou╛φvat pouze na °et∞zcovΘ polo╛ky.
Specifikovßnφ souΦasnΘho zßznamu po ·sp∞╣nΘm vyhledßvßnφ
Implicitn∞, ·sp∞╣nΘ vyhledßvßnφ umis╗uje kurzor na prvnφ zßznam vyhovujφcφ vyhledßvacφm kritΘriφm. Pokud po╛adujeme, m∙╛eme nastavit vlastnost tabulky KeyExclusive na true k umφst∞nφ kurzoru na nßsledujφcφ zßznam za prvnφm vyhovujφcφm zßznamem. Implicitn∞, KeyExclusive je false, co╛ znamenß, ╛e kurzor je umφst∞n na prvnφ vyhovujφcφ zßznam.
Vyhledßvßnφ na ΦßsteΦn²ch klφΦφch
Pokud tabulka mß vφce ne╛ jeden sloupec klφΦe a chceme vyhledßvat hodnoty na podmno╛in∞ t∞chto klφΦ∙, pak nastavφme KeyFieldCount na poΦet sloupc∙, kterΘ budeme prohledßvat. Nap°. pokud tabulka mß t°φsloupcov² primßrnφ klφΦ a chceme vyhledßvat hodnoty pouze v prvnφm sloupci, pak nastavφme KeyFieldCount na 1.
Pro tabulky s vφcesloupcov²mi klφΦi, m∙╛eme vyhledßvat hodnoty pouze v sousednφch sloupcφch klφΦe, poΦφnaje od prvnφho. Nap°. pro t°φsloupcov² klφΦ m∙╛eme vyhledßvat hodnoty v prvnφm sloupci, v prvnφm a druhΘm sloupci nebo ve v╣ech t°ech sloupcφch, ale ne nap°. v prvnφm a t°etφm sloupci.
Vyhledßvßnφ na alternativnφch indexech
Pokud chceme vyhledßvat na jin²ch indexech ne╛ na primßrnφm klφΦi tabulky, pak musφme specifikovat jmΘno pou╛itΘho indexu ve vlastnosti IndexName tabulky. Tabulka musφ b²t uzav°ena p°i specifikovßnφ hodnoty pro IndexName. Nap°. pokud tabulka CUSTOMER mß sekundßrnφ index nazvan² CityIndex, na kterΘm chceme vyhledßvat hodnoty, pak musφme nastavit hodnotu vlastnosti IndexName tabulky na "CityIndex":
Customer->Close();
Customer->IndexName = "CityIndex";
Customer->Open();
Customer->SetKey();
Customer->FieldValues["City"] = Edit1->Text;
Customer->GotoNearest();
Mφsto specifikace jmΘna indexu, m∙╛eme ve vlastnosti IndexFieldNames uvΘst seznam pou╛φvan²ch polo╛ek jako klφΦ. Pro tabulky Paradoxu a dBASE, polo╛ky seznamu musφ b²t indexovßny nebo p°i provßd∞nφ hledßnφ je generovßna v²jimka. Pro SQL tabulky, polo╛ky v seznamu nemusφ b²t indexovßny.
Poka╛dΘ, kdy╛ volßme SetKey nebo FindKey, pak jsou vyprßzdn∞ny v╣echny p°edchozφ hodnoty ve vlastnosti Fields. Pokud chceme zopakovat vyhledßvßnφ pomocφ d°φve nastaven²ch polo╛ek, nebo chceme n∞co p°idat k polo╛kßm pou╛it²m k vyhledßvßnφ, pak volßme EditKey mφsto SetKey a FindKey. Nap°. pokud index CityIndex obsahuje polo╛ky City i Country, pak k nalezenφ zßznamu se specifikovan²m jmΘnem firmy ve specifikovan²m m∞st∞ pou╛ijeme nßsledujφcφ k≤d:
Customer->EditKey();
Customer->FieldValues["Country"] = Variant(Edit2->Text);
Customer->GotoNearest();

╪azenφ zßznam∙

Index urΦuje zobrazovacφ po°adφ zßznam∙ v tabulce. Obecn∞, zßznamy jsou zobrazovßny ve vzestupnΘm po°adφ primßrnφho indexu (pro tabulky dBASE bez primßrnφho indexu, po°adφ je zalo╛eno na fyzickΘm po°adφ zßznamu). Toto implicitnφ po°adφ nevy╛aduje ╛ßdnou intervenci aplikace. Pokud po╛adujeme jinΘ po°adφ, pak musφme specifikovat: Specifikace jinΘho °adφcφho po°adφ vy╛aduje nßsledujφcφ kroky:
  1. UrΦenφ dostupn²ch index∙.
  2. Specifikovßnφ alternativnφho indexu nebo seznamu sloupc∙ k pou╛φvßnφ.
V tΘto Φßsti se budeme zab²vat:
Zφskßvßnφ seznamu dostupn²ch sloupc∙ pomocφ GetIndexNames
Za b∞hu, na╣e aplikace m∙╛e volat metodu GetIndexNames k zφskßnφ seznamu dostupn²ch index∙ pro tabulku. GetIndexNames vracφ seznam °et∞zc∙ obsahujφcφ p°φpustnß jmΘna index∙. Nap°. nßsledujφcφ k≤d urΦuje seznam index∙ dostupn²ch Datovou mno╛inou CustomerTable:
TStringList *IndexList = new TStringList();
CustomersTable->GetIndexNames(IndexList);
Poznßmka: Pro tabulky Paradoxu, primßrnφ index je nepojmenovan² a tedy nenφ vracen GetIndexNames. Pokud se pot°ebujeme vrßtit k pou╛φvßnφ primßrnφho indexu tabulky Paradoxu po pou╛φvßnφ alternativnφho indexu, nastavφme vlastnost IndexName tabulky na prßzdn² °et∞zec.
Specifikace alternativnφho indexu pomocφ IndexName
Pro specifikaci, ╛e tabulka bude °azena pou╛itφm alternativnφho indexu, specifikujeme jmΘno indexu ve vlastnosti IndexName komponenty tabulky. B∞hem nßvrhu m∙╛eme specifikovat toto jmΘno v Inspektoru objekt∙ a za b∞hu m∙╛eme k vlastnosti p°istupovat na╣im k≤dem. Nap°. nßsledujφcφ k≤d nastavφ index pro CustomersTable na CustDescending:
CustomersTable->IndexName = "CustDescending";
Pro tabulky dBASE, kterΘ pou╛φvajφ ne-vytvß°enΘ indexy, nastavφme vlastnost IndexFiles na jmΘno pou╛φvanΘho indexovΘho souboru p°ed nastavenφm IndexName. B∞hem nßvrhu m∙╛eme kliknout na tlaΦφtko se t°emi teΦkami u vlastnosti IndexFiles v Inspektoru objekt∙ k vyvolßnφ Editoru indexov²ch soubor∙. Uvidφme seznam dostupn²ch indexov²ch soubor∙, zvolφme Add a vybereme jeden nebo vφce indexov²ch soubor∙ ze seznamu. Indexov² soubor dBASE m∙╛e obsahovat vφcenßsobnΘ indexy. K v²b∞ru indexu z indexovΘho souboru, vybereme jmΘno indexu z rozbalovacφho seznamu IndexName v Inspektoru objekt∙. M∙╛eme takΘ specifikovat vφce index∙ v souboru zadßnφm po╛adovan²ch jmen index∙ (odd∞lovan²ch st°ednφky).
M∙╛eme takΘ nastavit IndexFiles a IndexName za b∞hu. Nap°. nßsledujφcφ k≤d nastavuje IndexFiles pro tabulku AnimalsTable na ANIMALS.MDX a pak nastavuje IndexName na NAME:
AnimalsTable->IndexFiles->Add("ANIMALS.MDX");
AnimalsTable->IndexName = "NAME";
Specifikace °adφcφho po°adφ pro tabulky SQL
V SQL °adφcφ po°adφ °ßdk∙ je urΦeno klauzulφ ORDER BY. M∙╛eme specifikovat index pou╛it² touto klauzulφ pomocφ: IndexName a IndexFieldNames se vzßjemn∞ vyluΦujφ. Nastavenφm jednΘ vlastnosti zru╣φme nastavenou hodnotu v druhΘ vlastnosti.
IndexFieldNames je vlastnost seznamu °et∞zc∙. Ke specifikaci °adφcφho po°adφ, zapφ╣eme seznam v╣ech jmen sloupc∙ pou╛it²ch k urΦenφ °azenφ do vlastnosti a jmΘna odd∞lujeme st°ednφky. ╪azenφ je pouze ve vzestupnΘm po°adφ. Rozli╣ovßnφ velikosti pφsmen p°i °azenφ zßvisφ na schopnostech na╣eho serveru. Vφce informacφ nalezneme v dokumentaci serveru.
Nßsledujφcφ k≤d nastavuje °adφcφ po°adφ pro PhoneTable na LastName a potom na FirstName:
PhoneTable->IndexFieldNames = "LastName;FirstName";
Poznßmka: Pokud pou╛ijeme IndexFieldNames pro tabulky Paradoxu a dBASE, pak C++ Builder se pokusφ nalΘzt index pou╛φvajφcφ nßmi specifikovan² sloupec. Pokud index nenφ nalezen, pak je generovßna v²jimka.
Zkoumßnφ seznamu polo╛ek na indexy
Kdy╛ na╣e aplikace pou╛φvß za b∞hu indexy, pak m∙╛e testovat: IndexFields je seznam °et∞zc∙ obsahujφcφ jmΘna sloupc∙ pro index. Nßsledujφcφ k≤d ukazuje jak m∙╛eme pou╛φt IndexFieldCount a IndexFields k prochßzenφ seznamem jmen sloupc∙ v aplikaci:
AnsiString ListOfIndexFields[20];
for (int i = 0; i < CustomersTable->IndexFieldCount; i++)
  ListOfIndexFields[i] = CustomersTable->IndexFields[i]->FieldName;
Poznßmka: IndexFieldCount nenφ p°φpustn² pro tabulky otev°enΘ na v²razov²ch indexech.

Prßce s podmno╛inou dat

Vytvo°enΘ tabulky mohou b²t rozsßhlΘ a aplikace m∙╛e po╛adovat omezenφ poΦtu °ßdk∙ se kter²mi pracuje. Pro komponenty tabulek jsou dv∞ mo╛nosti omezenφ zßznam∙ pou╛φvan²ch aplikacφ: rozsahy a filtry. Filtry mohou b²t pou╛φvßny s libovoln²m typem datov²ch mno╛in, vΦetn∞ komponent TTable, TQuery a TStoredProc. Proto╛e jsou aplikovatelnΘ na v╣echny datovΘ mno╛iny, najdeme jejich ·pln² popis v Seznßmenφ s datov²mi mno╛inami.
Rozsahy jsou aplikovatelnΘ pouze na komponenty TTable. I kdy╛ se podobajφ, rozsahy a filtry majφ r∙znΘ pou╛itφ. V tΘto Φßsti jsou nßsledujφcφ body:
Seznßmenφ s rozdφly mezi rozsahy a filtry
Rozsahy i filtry omezujφ viditelnost zßznam∙ v tabulce na podmno╛inu v╣ech dostupn²ch zßznam∙, ale zp∙sob provedenφ se li╣φ. Rozsah je mno╛ina souvisle indexovan²ch zßznam∙, kterΘ se nachßzejφ mezi specifikovan²mi hodnotami mezφ. Nap°. v databßzi zam∞stnanc∙ indexovanΘ jmΘny, m∙╛eme aplikovat rozsah k zobrazenφ v╣ech zam∞stnanc∙ jejich╛ jmΘna jsou v∞t╣φ ne╛ "Jones" a men╣φ ne╛ "Smith". Proto╛e rozsahy zßvisφ na indexech, rozsahy mohou b²t aplikovßny pouze na indexovanΘ tabulky Paradoxu a dBASE (pro SQL tabulky, rozsahy mohou b²t aplikovßny na libovolnΘ polo╛ky v seznamu vlastnosti IndexFieldNames). Rozsahy mohou b²t °azeny pouze na zßklad∞ existujφcφch index∙.
Filtr, na druhΘ stran∞, je libovolnß mno╛ina souvisejφcφch nebo nesouvisejφcφch zßznam∙, kterΘ sdφlejφ specifikovanΘ datovΘ prvky a to bez ohledu na indexaci. Nap°. mßme filtr v databßzi zam∞stnanc∙, kter² zobrazuje v╣echny zam∞stnance, kterΘ ╛ijφ v Kalifornii a b∞hem p∞ti nebo vφce let pracovali v na╣em podniku. I kdy╛ filtry mohou pou╛φvat indexy, filtry na nich nejsou zßvislΘ. Filtry jsou aplikovßny, zßznam po zßznamu, jak aplikace prochßzφ datovou mno╛inou.
Obecn∞ filtry jsou flexibiln∞j╣φ ne╛ rozsahy. Rozsahy ale mohou b²t efektivn∞j╣φ, kdy╛ datovß mno╛ina je znaΦn∞ velkß a zßznamy nßs zajφmajφcφ, jsou seskupeny do skupin sousednφch index∙. Pro znaΦn∞ rozsßhlΘ datovΘ mno╛iny je ale mnohem v²hodn∞j╣φ pou╛φt komponentu dotazu k v²b∞ru dat pro zobrazenφ i editaci.
Vytvß°enφ a aplikovßnφ novΘho rozsahu
Proces vytvß°enφ a aplikovßnφ rozsahu vy╛aduje tyto obecnΘ kroky:
  1. Uvedeme datovou mno╛inu do stavu dsSetKey a nastavφme poΦßteΦnφ hodnotu indexu pro rozsah.
  2. Nastavφme koncovou hodnotu indexu pro rozsah.
  3. Aplikujeme rozsah na datovou mno╛inu.
Nastavovßnφ poΦßtku rozsahu
Volßnφm SetRangeStart uvedeme datovou mno╛inu do stavu dsSetKey a zahßjφme vytvß°enφ seznamu poΦßteΦnφch hodnot pro rozsah. Po volßnφ SetRangeStart nßsledujφcφ °ada p°i°azenφ vlastnosti Fields jsou chßpßny jako hodnoty poΦßteΦnφch index∙ k pou╛itφ p°i aplikovßnφ rozsahu. Kdy╛ pou╛φvßme tabulky Paradoxu nebo dBASE, pak specifikovanΘ polo╛ky musφ b²t indexovanΘ polo╛ky.
Nap°. p°edpoklßdejme, ╛e na╣e aplikace pou╛φvß komponentu tabulky nazvanou Customers, spojenou s tabulkou CUSTOMER a ╛e mßme vytvo°enΘ trvalΘ polo╛kovΘ komponenty pro v╣echny polo╛ky v datovΘ mno╛in∞ Customers. CUSTOMER je indexovßn na svΘm prvnφm sloupci (CustNo). Formulß° aplikace mß dv∞ editaΦnφ komponenty nazvanΘ StartVal a EndVal pro specifikaci poΦßteΦnφ a koncovΘ hodnoty rozsahu. Nßsledujφcφ k≤d m∙╛e b²t pou╛it k vytvo°enφ a aplikovßnφ rozsahu:
Customers->SetRangeStart();
Customers->FieldValues["CustNo"] = StrToInt(StartVal->Text);
Customers->SetRangeEnd();
if (!EndVal->Text.IsEmpty())
  Customers->FieldValues["CustNo"] = StrToInt(EndVal->Text);
Customers->ApplyRange();
Tento k≤d testuje zda text zadan² v EndVal nenφ prßzdn² p°ed p°i°azenφm n∞jakΘ hodnoty Fields. Pokud text zadan² pro StartVal je prßzdn², pak v╣echny zßznamy od zaΦßtku tabulky jsou vlo╛eny do rozsahu, nebo╗ v╣echny hodnoty jsou v∞t╣φ ne╛ null. Ale pokud do EndVal je p°i°azen prßzdn² text, pak do rozsahu nenφ vlo╛en ╛ßdn² zßznam, nebo╗ ╛ßdn² nenφ men╣φ ne╛ null.
Pro vφcesloupcovΘ indexy m∙╛eme specifikovat poΦßteΦnφ hodnotu pro v╣echny nebo n∞kterΘ polo╛ky v indexu. Pokud nep°i°adφme hodnotu pro polo╛ku pou╛itou v indexu, pak je pou╛ita hodnota null p°i aplikovßnφ rozsahu. Pokud nastavφme vφce hodnot ne╛ je hodnot v indexu, pak nadbyteΦnΘ polo╛ky jsou p°i v²poΦtu rozsahu ignorovßny.
K ukonΦenφ specifikace poΦßtku rozsahu, volßme SetRangeEnd nebo ApplyRange. Tyto metody budou popsßny dßle.
Tip: K zahßjenφ od zaΦßtku datovΘ mno╛iny, vynechßme volßnφ SetRangeStart.
M∙╛eme takΘ nastavit poΦßteΦnφ (a koncovΘ) hodnoty pro rozsah pomocφ volßnφ SetRange (viz dßle).

Nastavovßnφ konce rozsahu
Volßnφ SetRangeEnd uvßdφ datovou mno╛inu do stavu dsSetKey a zahajuje vytvß°enφ seznamu koncov²ch hodnot pro rozsah. Po volßnφ SetRangeEnd nßsleduje °ada p°i°azenφ do vlastnosti Fields chßpan²ch jako koncovΘ hodnoty pou╛it²ch index∙ p°i aplikovßnφ rozsahu. SpecifikovanΘ polo╛ky musφ b²t pro tabulky Paradoxu a dBASE indexovan²mi polo╛kami.
Poznßmka: V╛dy specifikujte koncovou hodnotu pro rozsah, i kdy╛ rozsah chceme konΦit poslednφm zßznamem v datovΘ mno╛in∞. Pokud nedodßme koncovou hodnotu, pak C++ Builder p°edpoklßdß, ╛e koncovß hodnota rozsahu je null. Rozsah s koncovou hodnotou rovnou null je v╛dy prßzdn².
Koncovou hodnotu nejsnadn∞ji p°i°adφme volßnφm metody FieldByName. Nap°.
Table1->SetRangeStart();
Table1->FieldByName("LastName")->Value = Edit1->Text;
Table1->SetRangeEnd();
Table1->FieldByName("LastName")->Value = Edit2->Text;
Table1->ApplyRange();
Pro vφcesloupcovΘ indexy, m∙╛eme specifikovat poΦßteΦnφ hodnotu pro v╣echny nebo pro n∞kterΘ polo╛ky v indexu. Pokud nezadßme hodnotu pro n∞kterou polo╛ku pou╛itou v indexu, pak se zde p°i aplikovßnφ rozsahu p°edpoklßdß hodnota null. Pokud nastavφme vφce hodnot ne╛ je polo╛ek v indexu, pak je generovßna v²jimka.
Po dokonΦenφ specifikace konce rozsahu volßme ApplyRange.
Poznßmka: Koncovou (a takΘ poΦßteΦnφ) hodnotu pro rozsah m∙╛eme takΘ nastavit volßnφm SetRange.

Nastavovßnφ poΦßteΦnφ a koncovΘ hodnoty rozsahu
Mφsto odd∞lenΘho volßnφ SetRangeStart a SetRangeEnd ke specifikacφ hranic rozsahu, m∙╛eme volat SetRange k uvedenφ datovΘ mno╛iny do stavu dsSetKey a nastavenφ poΦßteΦnφ a koncovΘ hodnoty rozsahu v jedinΘm volßnφ. SetRange p°ebφrß dva parametry konstantnφch polφ: mno╛ina poΦßteΦnφch hodnot a mno╛ina koncov²ch hodnot. Nap°. nßsledujφcφ p°φkazy z°izujφ rozsah pro dvousloupcov² index:
TVarRec StartVals[2];
TVarRec EndVals[2];
StartVals[0] = Edit1->Text;
StartVals[1] = Edit2->Text;
EndVals[0] = Edit3->Text;
EndVals[1] = Edit4->Text;
Table1->SetRange(StartVals, 1, EndVals, 1);
Pro vφcesloupcovΘ indexy, m∙╛eme specifikovat poΦßteΦnφ a koncovou hodnotu pro v╣echny nebo pro n∞kterΘ polo╛ky v indexu. Pokud nezadßme hodnotu pro n∞kterou polo╛ku pou╛itou v indexu, pak se zde p°edpoklßdß hodnota null p°i aplikovßnφ rozsahu. K vynechßnφ hodnoty pro prvnφ polo╛ku v indexu a specifikaci hodnot pro nßsledujφcφ polo╛ky, p°edßme pro vynechanou polo╛ku hodnotu null. Pokud nastavφme vφce hodnot ne╛ je polo╛ek v indexu, pak nadbyteΦnΘ polo╛ky jsou ignorovßny.
Poznßmka: V╛dy specifikujte koncovou hodnotu pro rozsah, i kdy╛ rozsah chceme konΦit poslednφm zßznamem v datovΘ mno╛in∞. Pokud nedodßme koncovou hodnotu, pak C++ Builder p°edpoklßdß, ╛e koncovß hodnota rozsahu je null. Rozsah s koncovou hodnotou rovnou null je v╛dy prßzdn², proto╛e poΦßteΦnφ hodnota je v∞t╣φ nebo rovna koncovΘ hodnot∞.

Specifikace rozsahu na zßklad∞ ΦßsteΦn²ch klφΦ∙
Pokud klφΦ je tvo°en jednou nebo vφce °et∞zcov²mi polo╛kami, pak metoda SetRange podporuje ΦßsteΦnΘ klφΦe. Nap°. pokud index je zalo╛en na sloupcφch LastName a FirstName, pak nßsledujφcφ specifikace rozsahu je p°φpustnß:
Table1->SetRangeStart();
Table1->FieldValues["LastName"] = "Smith";
Table1->SetRangeEnd();
Table1->FieldValues["LastName"] = "Zzzzzz";
Table1->ApplyRange();
Tento k≤d zahrnuje v╣echny zßznamy v rozsahu kde LastName je v∞t╣φ nebo rovno "Smith". Hodnota specifikace m∙╛e takΘ b²t:
Table1->FieldValues["LastName"] = "Sm";
Tento p°φkaz zahrnuje zßznamy, kterΘ majφ LastName v∞t╣φ nebo rovno "Sm. Nßsledujφcφ p°φkaz vklßdß zßznamy s LastName v∞t╣φm nebo rovno "Smith" a FirstName je v∞t╣φ nebo rovno "J":
Table1->FieldValues["LastName"] = "Smith";
Table1->FieldValues["FirstName"] = "J";

Zahrnovßnφ nebo vyluΦovßnφ zßznam∙ odpovφdajφcφch hraniΦnφm hodnotßm
Implicitn∞ rozsah zahrnuje v╣echny zßznamy, kterΘ jsou v∞t╣φ nebo rovny specifikovanΘ poΦßteΦnφ hodnot∞ a men╣φ nebo rovny specifikovanΘ koncovΘ hodnot∞. Toto chovßnφ je °φzeno vlastnostφ KeyExclusive. KeyExclusive mß implicitn∞ hodnotu false. Pokud to po╛adujeme, pak m∙╛eme nastavit KeyExclusive pro komponentu tabulky na true k vylouΦenφ zßznamu odpovφdajφcφmu koneΦnΘ hodnot∞. Nap°.
Table1->SetRangeStart();
Table1->KeyExclusive = true;
Table1->FieldValues["LastName"] = "Smith";
Table1->SetRangeEnd();
Table1->FieldValues["LastName"] = "Tyler";
Table1->ApplyRange();
Tento k≤d vklßdß v╣echny zßznamy v rozsahu kde LastName je v∞t╣φ nebo rovno "Smith" a men╣φ ne╛ "Tyler".

Aplikovßnφ rozsahu
Metoda SetRange z°izuje hraniΦnφ podmφnky pro rozsah, ale neuvßdφ je v Φinnost. Aby se rozsah projevil musφme volat ApplyRange. ApplyRange bezprost°edn∞ omezuje u╛ivatel∙v pohled a p°φstup k dat∙m na specifikovanou podmno╛inu datovΘ mno╛iny.

Zru╣enφ rozsahu
Metoda CancelRange ukonΦuje rozsah a obnovuje p°φstup k ·plnΘ datovΘ mno╛in∞. I kdy╛ zru╣enφm rozsahu obnovφme p°φstup ke v╣em zßznam∙m v datovΘ mno╛in∞, hraniΦnφ podmφnky pro rozsah jsou stßle dostupnΘ a rozsah m∙╛eme kdykoli obnovit. Meze jsou chrßn∞ny dokud nezadßme novΘ meze nebo existujφcφ meze nemodifikujeme. Nap°. nßsledujφcφ k≤d je p°φpustn²:
...
Table1->CancelRange();
...
// pozd∞ji aplikujeme stejn² rozsah znovu. Nenφ nutno volat SetRangeStart ...
Table1->ApplyRange();
...

Modifikovßnφ rozsahu
Dv∞ funkce povolujφ modifikovat existujφcφ hraniΦnφ podmφnky pro rozsah: EditRangeStart pro zm∞nu poΦßteΦnφ hodnoty rozsahu a EditRangeEnd pro zm∞nu koncovΘ hodnoty rozsahu. Proces editace a aplikovßnφ rozsahu vy╛aduje obecn∞ tyto kroky:
  1. Uvedeme datovou mno╛inu do stavu dsSetKey a modifikujeme poΦßteΦnφ hodnotu indexu pro rozsah.
  2. Modifikujeme koncovou hodnotu pro rozsah.
  3. Aplikujeme rozsah na datovou mno╛inu.
M∙╛eme modifikovat poΦßteΦnφ nebo koncovΘ hodnoty rozsahu nebo m∙╛eme modifikovat ob∞ hraniΦnφ podmφnky. Pokud modifikujeme hraniΦnφ podmφnky pro rozsah, kter² je prßv∞ aplikovßn na datovou mno╛inu, pak zm∞ny se neprojevφ dokud znova nevolßme ApplyRange.

Editace poΦßtku rozsahu
Volßnφm EditRangeStart uvedeme datovou mno╛inu do stavu dsSetKey a zaΦneme modifikovßnφ souΦasnΘho seznamu poΦßteΦnφch hodnot pro rozsah. P°i°azenφ do vlastnosti Fields nßsledujφcφ po volßnφ EditRangeStart p°episujφ souΦasnΘ poΦßteΦnφ hodnoty rozsahu. P°i pou╛φvßnφ Paradoxu nebo dBASE, polo╛ky musφ b²t indexovan²mi polo╛kami.
Tip: Pokud vytvß°φme rozsah zalo╛en² na ΦßsteΦn²ch klφΦφch, pak m∙╛eme pou╛φt EditRangeStart k roz╣φ°enφ poΦßteΦnφch hodnot pro rozsah.

Editace konce rozsahu
Volßnφm EditRangeEnd uvedeme datovou mno╛inu do stavu dsSetKey a zaΦneme modifikovßnφ souΦasnΘho seznamu koncov²ch hodnot pro rozsah. P°i°azenφ do vlastnosti Fields nßsledujφcφ po volßnφ EditRangeEnd p°episujφ souΦasnΘ koncovΘ hodnoty rozsahu. P°i pou╛φvßnφ Paradoxu nebo dBASE polo╛ky musφ b²t indexovan²mi polo╛kami.
Poznßmka: V╛dy specifikujte koncovou hodnotu pro rozsah, i kdy╛ rozsah chceme konΦit poslednφm zßznamem v datovΘ mno╛in∞. Pokud nedodßme koncovou hodnotu, pak C++ Builder p°edpoklßdß, ╛e koncovß hodnota rozsahu je null. Rozsah s koncovou hodnotou rovnou null je v╛dy prßzdn², proto╛e poΦßteΦnφ hodnota je v∞t╣φ nebo rovna koncovΘ hodnot∞.

Zru╣enφ v╣ech zßznam∙ v tabulce

Pro zru╣enφ v╣ech °ßdk∙ dat v tabulce volßme metodu EmptyTable komponenty tabulky. Pro SQL tabulky je tato metoda ·sp∞╣nß pouze tehdy, pokud k tabulce mßme privilegium DELETE. Nap°. nßsledujφcφ p°φkaz zru╣φ v╣echny zßznamy v datovΘ mno╛in∞:
PhoneTable->EmptyTable();
Pozor: Zru╣enφ dat pomocφ EmptyTable nelze odvolat.

Zru╣enφ tabulky

P°i nßvrhu, k zru╣enφ tabulky v databßzi, klikneme prav²m tlaΦφtkem na komponent∞ tabulky a v zobrazenΘ mφstnφ nabφdce zvolφme Delete Table. Tato volba v nabφdce je dostupnß pouze pokud komponenta tabulky reprezentuje existujφcφ databßzovou tabulku (vlastnosti DatabaseName a TableName specifikujφ existujφcφ tabulku).
Pro zru╣enφ tabulky za b∞hu, volßme metodu DeleteTable komponenty tabulky. Nap°. nßsledujφcφ p°φkaz odstra≥uje tabulku p°ipojenΘ datovΘ mno╛iny:
CustomersTable->DeleteTable();
Pozor: Kdy╛ zru╣φme tabulku pomocφ DeleteTable, pak tabulka a v╣echna jejφ data jsou ztracena.

P°ejmenovßnφ tabulky

K p°ejmenovßnφ tabulky Paradoxu a dBASE p°i nßvrhu, v mφstnφ nabφdce komponenty tabulky zvolφme Rename Table. M∙╛eme takΘ p°ejmenovat tabulku p°epsßnφm vlastnosti TableName existujφcφ tabulky v Inspektoru objekt∙. Kdy╛ zm∞nφme vlastnost TableName, pak v zobrazenΘm dialogovΘm okn∞ jsme dotßzßni, zda chceme tabulku p°ejmenovat. Lze zde zvolit p°ejmenovßnφ tabulky, nebo zru╣enφ operace m∞nφcφ vlastnost TableName (nap°. pro vytvo°enφ novΘ tabulky) beze zm∞ny jmΘna tabulky reprezentovanΘ starou hodnotou TableName.
Pro p°ejmenovßnφ tabulky Paradoxu nebo dBASE za b∞hu, volßme metodu RenameTable komponenty tabulky. Nap°. nßsledujφcφ p°φkaz p°ejmenovßvß tabulku Customer na CustInfo:
Customer->RenameTable("CustInfo");

Vytvß°enφ tabulky

NovΘ tabulky databßze lze vytvß°et p°i nßvrhu nebo za b∞hu. P°φkaz Create Table (p°i nßvrhu) nebo metoda CreateTable (za b∞hu) umo╛≥uje vytvß°et tabulky bez nutnosti znßt SQL. Vy╛aduje to ale dobrou znalost vlastnostφ, udßlostφ a metod komponent datov²ch mno╛in. Nejprve je nutno takto definovat vytvß°enou tabulku: Poznßmka: P°i nßvrhu, m∙╛eme p°edzavΘst definice polo╛ek a definice index∙ existujφcφ tabulky ve vlastnostech FieldDefs a IndexDefs. Nastavφme vlastnosti DatabaseName a TableName na specifikaci existujφcφ tabulky. V mφstnφ nabφdce komponenty tabulky zvolφme Update Table Definition. To automaticky nastavuje hodnoty vlastnostφ FieldDefs a IndexDefs na popis polo╛ek a index∙ existujφcφ tabulky. Dßle nastavφme DatabaseName a TableName na specifikaci vytvß°enΘ tabulky, a zru╣φme v╣echny dotazy na p°ejmenovßnφ existujφcφ tabulky. Pokud chceme ulo╛it tyto definice s komponentou tabulky (nap°. pokud na╣e aplikace je pak pou╛ije k vytvo°enφ tabulek na systΘmu u╛ivatele), pak nastavφme vlastnost StoreDefs na true.
Kdy╛ ji╛ mßme tabulku ·pln∞ popsanou, pak ji m∙╛eme vytvo°it. P°i nßvrhu v mφstnφ nabφdce komponenty tabulky zvolφme Create Table. Za b∞hu volßme metodu CreateTable pro generovßnφ specifikovanΘ tabulky.
Varovßnφ: Pokud vytvß°φme tabulku, kterß duplikuje jmΘno existujφcφ tabulky, pak existujφcφ tabulka a v╣echna jejφ data jsou p°epsßna nov∞ vytvo°enou tabulkou. Starou tabulku a jejφ data nelze obnovit.
Nßsledujφcφ k≤d vytvß°φ novou tabulku za b∞hu a p°i°azuje ji k p°ezdφvce BCDEMOS. P°ed vytvo°enφm novΘ tabulky ov∞°φme zda jejφ jmΘno se neshoduje se jmΘnem ji╛ existujφcφ tabulky.
TTable *NewTable = new TTable(Form1);
NewTable->Active = false;
NewTable->DatabaseName = "BCDEMOS";
NewTable->TableName = Edit1->Text;
NewTable->TableType = ttDefault;
NewTable->FieldDefs->Clear();
TFieldDef *NewField=NewTable->FieldDefs->AddFieldDef();//definovßnφ 1.polo╛ky
NewField->DataType = ftInteger;
NewField->Name = Edit2->Text;
NewField = NewTable->FieldDefs->AddFieldDef(); // definovßnφ druhΘ polo╛ky
NewField->DataType = ftString;
NewField->Size = StrToInt(Edit3->Text);
NewField->Name = Edit4->Text;
NewTable->IndexDefs->Clear();
TIndexDef *NewIndex = NewTable->IndexDefs->AddIndexDef(); // p°idßnφ indexu
NewIndex->Name = "PrimaryIndex";
NewIndex->Fields = Edit2->Text;
NewIndex->Options << ixPrimary << ixUnique;
// Testujeme zda tabulka ji╛ neexistuje
bool CreateIt = (!NewTable->Exists);
if (!CreateIt)
   if (Application->MessageBox((AnsiString("Overwrite table ") + Edit1->Text +
                               AnsiString("?")).c_str(),
                               "Table Exists", MB_YESNO) == IDYES)
    CreateIt = true;
if(CreateIt)
  NewTable->CreateTable(); // vytvo°enφ tabulky

Importovßnφ dat z jinΘ tabulky

Metodu BatchMove komponenty tabulky m∙╛eme pou╛φt k importovßnφ dat z jinΘ tabulky. BatchMove m∙╛e: BatchMove p°ebφrß dva parametry: jmΘno tabulky, ze kterΘ chceme data importovat a specifikace re╛imu operace importu. Nßsledujφcφ tabulka popisuje mo╛nΘ nastavenφ pro specifikace re╛imu.
 
Hodnota V²znam
batAppend P°ipojenφ v╣ech zßznam∙ ze zdrojovΘ tabulky na konec tΘto tabulky.
batAppendUpdate P°ipojenφ v╣ech zßznam∙ ze zdrojovΘ tabulky na konec tΘto tabulky a aktualizace existujφcφch zßznam∙ v tΘto tabulce stejn²mi zßznamy ze zdrojovΘ tabulky.
batCopy Kopφruje v╣echny zßznamy ze zdrojovΘ tabulky do tΘto tabulky.
batDelete Ru╣φ v╣echny zßznamy v tΘto tabulce, kterΘ se takΘ vyskytujφ ve zdrojovΘ tabulce.
batUpdate Aktualizace existujφcφch zßznam∙ v tΘto tabulce jejich prot∞j╣ky ve zdrojovΘ tabulce.

Nap°. nßsledujφcφ k≤d aktualizuje zßznamy v souΦasnΘ tabulce zßznamy z tabulky Customer:
Table1->BatchMove("CUSTOMER.DB", batUpdate);
BatchMove vracφ poΦet ·sp∞╣n∞ importovan²ch zßznam∙.
Pozor: ImportovanΘ zßznamy pomocφ re╛imu batCopy p°episujφ existujφcφ zßznamy. K ochrßn∞nφ existujφcφch zßznam∙ pou╛ijeme batAppend.
BatchMove provßdφ pouze n∞kterΘ funkce dostupnΘ na╣φ aplikacφ p°φmo prost°ednictvφm komponenty TBatchMove. Pokud pot°ebujeme p°esouvat v∞t╣φ mno╛stvφ dat mezi tabulkami, pak pou╛ijeme komponentu dßvkovΘho p°esunu, mφsto volßnφ funkce BatchMove komponenty tabulky.

Synchronizovßnφ tabulek p°ipojen²ch ke stejnΘ databßzovΘ tabulce

Pokud vφce ne╛ jedna komponenta tabulky je spojena se stejnou tabulkou databßze pomocφ jejich vlastnostφ DatabaseName a TableName a tabulky nesdφlφ komponentu datovΘho zdroje, pak ka╛dß tabulka mß sv∙j vlastnφ pohled na data a sv∙j vlastnφ aktußlnφ zßznam. P°i prochßzenφ zßznamy u╛ivatelem se aktußlnφ zßznamy komponent tabulek li╣φ.
K vnucenφ aktußlnφho zßznamu pro ka╛dou z t∞chto komponent tabulky na stejnou hodnotu volßme metodu GotoCurrent. GotoCurrent nastavuje sv∙j vlastnφ aktußlnφ zßznam tabulky na aktußlnφ zßznam komponenty jinΘ tabulky. Nap°. nßsledujφcφ k≤d nastavuje aktußlnφ zßznam CustomerTableOne na aktußlnφ zßznam  CustomerTableTwo:
CustomerTableOne->GotoCurrent(CustomerTableTwo);
Tip: Pokud na╣e aplikace pot°ebuje synchronizovat komponenty tabulek tφmto zp∙sobem, pak vlo╛φme komponenty do datovΘho modulu a vlo╛φme hlaviΦku datovΘho modulu do ka╛dΘ jednotky, ve kterΘ p°istupujeme k tabulkßm.
Pokud musφme synchronizovat komponenty tabulek na odd∞len²ch formulß°φch, pak musφme vlo╛it hlaviΦkov² soubor jednoho formulß°e do jednotky druhΘho formulß°e a alespo≥ jedno jmΘno tabulky musφme kvalifikovat jmΘnem formulß°e. Nap°.
CustomerTableOne->GotoCurrent(Form2->CustomerTableTwo);

Vytvß°enφ formulß°∙ Master-detail

Vlastnosti MasterSource a MasterFields komponenty tabulky mohou b²t pou╛ity k z°φzenφ vazby 1 : N mezi dv∞mi tabulkami. Vlastnost MasterSource je pou╛ita ke specifikaci datovΘho zdroje, ze kterΘho tabulka bude zφskßvat data pro tabulku Master. Nap°. pokud spojφme dv∞ tabulky do vazby Master-detail, pak tabulka Detail m∙╛e zachycovat udßlosti nastalΘ v tabulce Master specifikacφ datovΘho zdroje tabulky Master v tΘto vlastnosti.
Vlastnost MasterFields specifikuje sloupce spoleΦnΘ v obou tabulkßch pou╛itΘ pro z°φzenφ vazby. Pro spojenφ tabulek na zßklad∞ vφce jmen sloupc∙ pou╛ijeme st°ednφky odd∞lovan² seznam:
Table1->MasterFields = "OrderNo;ItemNo";
Pro pomoc p°i vytvß°enφ smyslupln²ch vazeb mezi dv∞mi tabulkami, m∙╛eme pou╛φt Nßvrhß° vazby polo╛ek.

P°φklad formulß°e Master-detail
Nßsledujφcφ kroky vytvß°ejφ jednoduch² formulß°, ve kterΘm u╛ivatel m∙╛e prochßzet zßznamy zßkaznφk∙ a zobrazovat v╣echny objednßvky od aktußlnφho zßkaznφka. Tabulka Master je tabulka CustomersTable a tabulka Detail je OrdersTable:

  1. Umφstφme dv∞ komponenty TTable a dv∞ komponenty TDataSource do datovΘho modulu.
  2. Nastavφme vlastnosti prvnφ komponenty TTable takto:
  3. Nastavφme vlastnosti druhΘ TTable takto:
  4. Nastavφme vlastnosti prvnφ TDataSource na:
  5. Nastavφme vlastnosti druhΘ TDataSource na:
  6. Umφstφme dv∞ komponenty TDBGrid na formulß°.
  7. Zvolφme File | Include Unit Hdr k urΦenφ, ╛e formulß° bude pou╛φvat datov² modul.
  8. Nastavφme vlastnost DataSource prvnφ komponenty m°φ╛ky na DataModule2->CustSource a nastavφme vlastnost DataSource druhΘ komponenty m°φ╛ky na DataModule2->OrdersSource.
  9. Nastavφme vlastnost MasterSource komponenty OrdersTable na CustSource. Tφm propojφme tabulku CUSTOMER (tabulka Master) s tabulkou ORDERS (tabulka Detail).
  10. Dvojit∞ klikneme na hodnotu vlastnosti MasterFields v Inspektoru objekt∙ k vyvolßnφ Nßvrhß°e vazby polo╛ek k nastavenφ nßsledujφcφch vlastnostφ:
  11. Nastavφme vlastnosti Active komponent CustomersTable a OrdersTable na true k zobrazenφ dat v m°φ╛kßch na formulß°i.
  12. P°elo╛φme a spustφme aplikaci.
Pokud aplikaci spustφme nynφ, pak uvidφme, ╛e tabulky jsou spojeny a kdy╛ p°ejdeme na jin² zßznam v tabulce CUSTOMER, pak vidφme pouze ty zßznamy tabulky ORDERS, kterΘ se vztahujφ k aktußlnφmu zßkaznφku.

Prßce s vno°en²mi tabulkami

Vno°enΘ komponenty tabulek poskytujφ p°φstup k dat∙m ve vno°enΘ datovΘ mno╛in∞ tabulky. Vlastnost NestedDataSet trvalΘ polo╛ky vno°enΘ datovΘ mno╛iny obsahuje odkaz na vno°enou datovou mno╛inu. Jeliko╛ TNestedDataSet je odvozena od TBDEDataSet, vno°enΘ tabulky d∞dφ funkΦnost BDE a m∙╛eme pou╛φt BDE pro p°φstup k dat∙m vno°enΘ tabulky. Vno°enΘ tabulky poskytujφ vφce funkΦnosti tabulky komponenty, ale zp°φstup≥ovanß data jsou ulo╛ena ve vno°enΘ tabulce.
Nßsledujφcφ kroky jsou obecnΘ instrukce pro nastavovßnφ komponent vno°en²ch tabulek p°i nßvrhu. Komponenta tabulky nebo ╛ivΘho dotazu musφ b²t dostupnß v datovΘ mno╛in∞ obsahujφcφ datovou mno╛inu nebo odkazovanou polo╛ku. TrvalΘ polo╛ky pro TDataSetField nebo TReferenceField musφ takΘ existovat. K pou╛itφ komponenty vno°enΘ tabulky:
  1. Umφstφme komponentu vno°enΘ tabulky ze strßnky Data Access Palety komponent do datovΘho modulu nebo na formulß° a nastavφme jejφ vlastnost Name na unikßtnφ hodnotu v na╣φ aplikaci.
  2. Nastavφme DataSetField komponenty na jmΘno trvalΘ polo╛ky datovΘ mno╛iny nebo polo╛kov² odkaz k p°φstupu. Polo╛ky m∙╛eme vybrat z rozbalovacφho seznamu.
  3. Umφstφme komponentu datovΘho zdroje do datovΘho modulu nebo na formulß° a nastavφme vlastnost DataSet na jmΘno komponenty vno°enΘ tabulky. Komponenta datovΘho zdroje je pou╛ita k p°edßnφ v²sledkovΘ mno╛iny z tabulky do datov²ch ovladaΦ∙ k zobrazenφ.

  1. V adresß°i Program files\Borland\CBuilder\Examples\DBTask\Find nalezneme demonstraΦnφ aplikaci hledajφcφ zßznamy na zßklad∞ hodnot v tabulce Customer. ProhlΘdn∞te si tuto aplikaci a zjist∞te jak pracuje.
16. Prßce s tabulkami