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:
-
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.
-
Nastavφme DatabaseName komponenty na jmΘno databßze,
ke kterΘ budeme p°istupovat.
-
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.
-
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:
-
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.
-
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.
-
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:
-
Nastavφme vlastnost Active na false (pokud
ji╛ nenφ nastaveno).
-
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:
-
Nastavφme vlastnost tabulky Active na false
(pokud ji╛ nenφ nastaveno).
-
Nastavφme vlastnost DatabaseName na p°ezdφvku BDE
nebo adresß°ovou cestu.
-
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:
-
Nastavenφm Active na false.
-
P°i°azenφm p°φpustnΘho jmΘna tabulky vlastnosti TableName.
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:
-
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.
-
Otev°eme tabulku.
-
Pomocφ SetKey uvedeme tabulku do stavu dsSetKey.
-
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).
-
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:
-
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.
-
Otev°eme tabulku.
-
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:
-
Alternativnφ index
-
Seznam sloupc∙ pro °azenφ (pouze pro SQL)
Specifikace jinΘho °adφcφho po°adφ vy╛aduje nßsledujφcφ kroky:
-
UrΦenφ dostupn²ch index∙.
-
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φ:
-
vlastnosti IndexName ke specifikaci existujφcφho indexu
-
vlastnosti IndexFieldNames k vytvo°enφ pseudoindexu
zalo╛enΘho na podmno╛in∞ sloupc∙ v tabulce
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:
-
Vlastnost IndexFieldCount k urΦenφ poΦtu sloupc∙ v
indexu
-
Vlastnost IndexFields k zji╣t∞nφ seznamu jmen sloupc∙
tvo°φcφch index
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:
-
Uvedeme datovou mno╛inu do stavu dsSetKey a nastavφme
poΦßteΦnφ hodnotu indexu pro rozsah.
-
Nastavφme koncovou hodnotu indexu pro rozsah.
-
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:
-
Uvedeme datovou mno╛inu do stavu dsSetKey a modifikujeme
poΦßteΦnφ hodnotu indexu pro rozsah.
-
Modifikujeme koncovou hodnotu pro rozsah.
-
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:
-
Nastavφme vlastnost DatabaseName na databßzi, kterß
novou tabulku bude obsahovat.
-
Nastavφme vlastnost TableType na po╛adovan² typ tabulky.
Pro tabulky Paradoxu, dBASE nebo ASCII nastavφme TableType na ttParadox,
ttDBase
nebo ttASCII. Pro v╣echny ostatnφ tabulky nastavφme
TableTypes
na ttDefault.
-
Nastavφme vlastnost TableName na jmΘno novΘ tabulky.
Pokud hodnota vlastnosti TableType je ttParadox nebo ttDBase,
pak nenφ nutno specifikovat p°φponu.
-
P°idßme definice polo╛ek popisujφcφ polo╛ky v novΘ tabulce.
P°i nßvrhu m∙╛eme p°idßvat definice polo╛ek dvojit²m kliknutφm na vlastnosti
FieldDefs
v Inspektoru objekt∙ k zobrazenφ Editoru. Tento editor pou╛ijeme k p°idßvßnφ,
odstra≥ovßnφ nebo zm∞nu vlastnostφ definic polo╛ek. Za b∞hu vyΦistφme v╣echny
existujφcφ definice polo╛ek a potom pou╛ijeme metodu AddFieldDef
pro p°idßnφ ka╛dΘ novΘ definice polo╛ky. Pro ka╛dou novou definici polo╛ky,
nastavφme vlastnosti objektu TFieldDef na specifikaci po╛adovan²ch
atribut∙ polo╛ky.
-
Voliteln∞, p°idßme definice index∙ popisujφcφ indexy novΘ
tabulky. P°i nßvrhu m∙╛eme p°idat definici indexu dvojit²m kliknutφm na
vlastnosti IndexDefs v Inspektoru objekt∙ k zobrazenφ editoru. Tento
editor pou╛ijeme k p°idßvßnφ, odstra≥ovßnφ nebo modifikovßnφ vlastnostφ
definicφ index∙. Za b∞hu, vyprßzdnφme v╣echny existujφcφ definice index∙,
a pak pou╛ijeme metodu AddIndexDef pro ka╛dou novou definici indexu.
Pro ka╛dou novou definici indexu, nastavφme vlastnosti objektu TIndexDef
na specifikaci po╛adovan²ch atribut∙ indexu.
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:
-
Kopφrovat zßznamy z jinΘ tabulky do tΘto tabulky.
-
Aktualizovat zßznamy v tΘto tabulce, kterΘ se vyskytujφ v
jinΘ tabulce.
-
P°idßvat zßznamy z jinΘ tabulky na konec tΘto tabulky.
-
Ru╣it zßznamy v tΘto tabulce, kterΘ se vyskytujφ v jinΘ tabulce.
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:
-
Umφstφme dv∞ komponenty TTable a dv∞ komponenty TDataSource
do datovΘho modulu.
-
Nastavφme vlastnosti prvnφ komponenty TTable takto:
-
DatabaseName: BCDEMOS
-
TableName: CUSTOMER
-
Name: CustomersTable
-
Nastavφme vlastnosti druhΘ TTable takto:
-
DatabaseName: BCDEMOS
-
TableName: ORDERS
-
Name: OrdersTable
-
Nastavφme vlastnosti prvnφ TDataSource na:
-
Name: CustSource
-
DataSet: CustomersTable
-
Nastavφme vlastnosti druhΘ TDataSource na:
-
Name: OrdersSource
-
DataSet: OrdersTable
-
Umφstφme dv∞ komponenty TDBGrid na formulß°.
-
Zvolφme File | Include Unit Hdr k urΦenφ, ╛e formulß°
bude pou╛φvat datov² modul.
-
Nastavφme vlastnost DataSource prvnφ komponenty m°φ╛ky
na DataModule2->CustSource a nastavφme vlastnost DataSource
druhΘ komponenty m°φ╛ky na DataModule2->OrdersSource.
-
Nastavφme vlastnost MasterSource komponenty OrdersTable
na
CustSource. Tφm propojφme tabulku CUSTOMER (tabulka Master) s
tabulkou ORDERS (tabulka Detail).
-
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φ:
-
V Available Index zvolφme CustNo k propojenφ
dvou tabulek polo╛kou CustNo.
-
V obou seznamech polo╛ek Detail Fields i Master
Fields vybereme
CustNo.
-
Stiskneme tlaΦφtko Add pro p°idßnφ tΘto podmφnky spojenφ.
V seznamu
JoinedList se zobrazφ CustNo -> CustNo.
-
Zvolφme OK k ukonΦenφ na╣eho v²b∞ru a uzav°enφ okna
Nßvrhß°e
-
Nastavφme vlastnosti Active komponent CustomersTable
a OrdersTable na true k zobrazenφ dat v m°φ╛kßch na formulß°i.
-
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:
-
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.
-
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.
-
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φ.
-
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.