12.07.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M EDelfinárium / 12. èas : Spä k databázam III.Tentoraz sa opä budeme zaobera databázami. Povieme si nieèo o metóde BatchMovea komponente TBatchMove a ukážeme si, ako prenáša údaje z jedného databázovéhoformátu do druhého.METÓDA BatchMove PODROBNEJŠIE. Možno si spomí<strong>na</strong>te, že tútometódu sme pred mesiacom použili, keï sme potrebovali uloži množinu dát, ktorúvytvoril dopyt SQL. Vtedy som to síce nezdôraznil, no metóda BatchMove vie by nesmiernešikovným pomocníkom. V predchádzajúcom èlánku som už spomenul, že jej primárnouúlohou je presúva dáta, zvládne však aj iné „kú<strong>sk</strong>y“. Prvým parametrom tejto metódyje zdroj dát, ktorým je komponent odvodený od triedy TBDEDataSet. Najznámejšímipotomkami tejto triedy sú komponenty TTable a TQuery. Manipulácia s dátami ovplyvnívždy tú tabu¾ku, ktorá metódu BatchMove volá. Druhý parameter metódy BatchMove jetypu TBatchMode a môže <strong>na</strong>dobúda <strong>na</strong>sledujúce hodnoty:l batAppend – táto hodnota z<strong>na</strong>èí, že dôjde k pripojeniu zdrojových údajov k novejtabu¾ke. Štruktúra polí ani indexy zdrojovej tabu¾ky zmenené nebudú, ale poradie polí vzdrojovej i cie¾ovej tabu¾ke musí by rov<strong>na</strong>ké, pretože v opaènom prípade dôjde k<strong>na</strong>rušeniu integrity dát. Inými slovami, ak je <strong>na</strong>príklad v cie¾ovej tabu¾ke prvé pole typuinteger a v zdrojovej tabu¾ke je prvé pole typu string, tento re azec bude jednoduchoprenesený do èíselného po¾a.Parameter batAppend je užitoèný vtedy, ak máme dve tabu¾ky so zhodnou štruktúrou,ale jed<strong>na</strong> z nich obsahuje novšie záz<strong>na</strong>my, ktoré by sme radi presunuli do cie¾ovej tabu¾ky.l batAppendUpdate – pracuje podobne ako batAppend, len s tým rozdielom, že docie¾ovej databázy nielenže pridá <strong>na</strong>jnovšie záz<strong>na</strong>my, ale dôjde aj k aktualizácii týchzáz<strong>na</strong>mov cie¾ovej tabu¾ky, ktoré sa v zdrojovej tabu¾ke zmenili. Inými slovami, novézáz<strong>na</strong>my sa pridajú a staršie sa aktualizujú.l batCopy – dôjde k úplnému zániku pôvodnej štruktúry tabu¾ky, stratia sa pôvodnépolia aj indexy. Lenže pozor, ak je zdrojom údajov komponent TTable, ktorý obsahujenejaké indexy, treba poèíta s tým, že tieto indexy do cie¾ovej tabu¾ky nebudú prenesené.l batDelete – záz<strong>na</strong>my, ktoré sa <strong>na</strong>chádzajú aj v zdrojovej, aj v cie¾ovej tabu¾ke, budú vymazané.l batUpdate – v cie¾ovej tabu¾ke budú aktualizované tie záz<strong>na</strong>my, ktoré sa <strong>na</strong>chádzajú ajv zdrojovej tabu¾ke.Samozrejme, <strong>na</strong> základe takýchto všeobecných informácií nie je možné porozumie ,kde sa <strong>sk</strong>rýva potenciál metódy BatchMove, preto si všetko vysvetlíme <strong>na</strong> príklade.Strýko Držgroš má dve kníhkupectvá. Keïže je to ve¾mi sporivý káèer a nerád vyhadzujepeniaze <strong>na</strong> výplaty, v prvom sedí on sám a v druhom vysedáva jeho synovec Huey.Evidencia predaných kníh sa vedie v jednoduchej tabu¾ke typu Paradox (Držgroša ani lenne<strong>na</strong>padne, aby investoval do nejakého rozumného databázového riešenia). Na boháèovompoèítaèi je hlavná databáza a <strong>na</strong> poèítaèi jeho synovca je umiestnená druhá databáza. Veèer,keï sa obchod zatvára, Huey musí donies záz<strong>na</strong>my o predaných knihách <strong>na</strong> di<strong>sk</strong>ete (pravda,mohol by ich posla cez internet, Držgroš však šetrí aj <strong>na</strong> tom). Držgroš si údaje zladí tak,aby sa záz<strong>na</strong>my z poboèky (teda kníhkupectva, kde pracuje Huey) pripojili k tým, ktoré máon vo svojom hlavnom súbore. Po tomto úkone sa obaja poberú spa .Vytvorme si teraz aj my podobnýmodel. Prvá tabu¾ka sa bude volaDRZGROS.DB a druha HUEY.DB. Vprvej vytvoríme primárny index,keïže pri operácii batAppendUpdatemusí by cie¾ová tabu¾ka indexovaná.Obr. 1Aby bola štruktúra oboch tabuliek èo<strong>na</strong>jjednoduchšia, budú tabu¾ky obsahovaiba dve polia. Obe polia budúre azcové s dåžkou 30 z<strong>na</strong>kov,prièom prvé sa bude vola Nazov(teda názov knihy) a druhé Predal(t. j. kto knihu predal). Do každejObr. 2tabu¾ky pridáme dva záz<strong>na</strong>my ešte vDatabase De<strong>sk</strong>tope (obr. 1 a 2).Potom vytvoríme nový formulár, ktorý bude pomocou komponentu TDBGrid zobrazovaobsah súboru DRZGROS.DB. Vytvoríme dva komponenty TTable, prvý <strong>na</strong>zveme Drzgros adruhý Huey, oba budú pracova s rovnomennými databázami. Potom pridáme tlaèidlo,ktoré <strong>na</strong>zveme Prenos.Pred <strong>na</strong>písaním kódu si ešte raz zopakujme, v èom spoèíva náš problém: Huey priniesolsvoje záz<strong>na</strong>my <strong>na</strong> di<strong>sk</strong>ete a my ich musíme prida k Držgrošovej hlavnej databáze.Naš astie nie je to nijaký problém:procedure TForm1.PrenosClick(Sender: TObject);begintrytryScreen.Cursor:=crHourGlass;with drzgros dobeginClose;BatchMove(Huey,batAppendUpdate);Openend;//withexceptraiseend;//exceptfi<strong>na</strong>llyScreen.Cursor:=crDefault;end;//fi<strong>na</strong>llyMožno si budete klás otázku, preèo som použil parameter batAppendUpdate, keï somdoteraz celý èas hovoril iba o pridávaní. Mohli sme teoreticky použi parameter batAppend,to by však so sebou prinieslo aj jednu ve¾kú nevýhodu: keby sa náhodou Huey „uklepol“ azadal by nesprávny názov knihy, preniesla by sa chyba aj do Držgrošovej databázy. A èo je eštehoršie, nielenže by sa tam preniesla, ale by tam aj ostala, kým by ju starý káèer neopravil. Hueyby preklep vo svojej databáze opravoval <strong>na</strong>darmo, pretože zmeny by sa v Držgrošovom súboreaj tak neprejavili vzh¾adom <strong>na</strong> to, že program by do úvahy bral iba nové záz<strong>na</strong>my (teda dohlavnej databázy by sa pridali <strong>na</strong>jnovšie záz<strong>na</strong>my, tie staré by však ostali nedotknuté). Akpoužijeme parameter batAppendUpdate, nielenže sa nové záz<strong>na</strong>my pridajú, ale dôjde aj kaktualizácii tých starších.Nadmieru šetrný káèer môže metódu BatchMove dokonca aj zneuži . Predstavme si,že jedného dòa Huey donesie nové údaje. Držgroš však chce ušetri <strong>na</strong> jedle (a <strong>na</strong>turáliách,v ktorých svojho synovca vypláca), a tak použije uvedený kód s malou úpravou:miesto parametra batAppendUpdate použije batDelete. Iste tušíte, aký bude výsledok:všetky záz<strong>na</strong>my v hlavnej databáze, ktoré pochádzajú od Hueya, sa vymažú. Držgrošpotom môže svojmu synovcovi tvrdi , že vlastne niè nepredal, a teda veèeru si nezaslúži.KOMPONENT TBatchMove. Problémy s presunom, aktualizáciou èi mazanímdát je možné rieši aj pomocou komponentu TBatchMove. Slúži <strong>na</strong> rov<strong>na</strong>ké úèely akometóda BatchMove, ale je <strong>na</strong> úlohu presúvania, vymazávania èi aktualizovania dát podstatnelepšie pripravený než uvedená metóda. Umožòuje <strong>na</strong>príklad používate¾ovi zadanázov tabu¾ky, do ktorej sa majú umiestni záz<strong>na</strong>my, ktoré sa z nejakého dôvodu nepodariloprekopírova do cie¾ovej tabu¾ky. Môže <strong>na</strong>príklad <strong>na</strong>sta prípad, že sa v cie¾ovej ajzdrojovej tabu¾ke <strong>na</strong>chádzajú rov<strong>na</strong>ké záz<strong>na</strong>my. Pri pokuse o kopírovanie do cie¾ovejtabu¾ky <strong>na</strong>stane výnimka Key violation, pretože daný záz<strong>na</strong>m už v cie¾ovej tabu¾ke existuje.V takom prípade tento záz<strong>na</strong>m komponent TBatchMove presunie do vami urèenejtabu¾ky. Môžete síce toto <strong>na</strong>stavenie ignorova , potom sa však nedozviete, ktorý záz<strong>na</strong>mproblém spôsobil.Okrem toho komponent umožòuje definova aj tabu¾ku pre také záz<strong>na</strong>my, ktorénemohli by spracované z dôvodu nekompatibility polí. Predstavte si, že v cie¾ovejtabu¾ke definujete pole s názvom Meno, ktoré má dåžku 30 z<strong>na</strong>kov, zatia¾ èo v zdrojovejtabu¾ke je to isté pole, ale dlhé 35 z<strong>na</strong>kov. Všetky záz<strong>na</strong>my, v ktorých meno osoby presahuje30 z<strong>na</strong>kov, budú potom presunuté do <strong>na</strong>mi špecifikovanej tabu¾ky. Výhodytakéhoto postupu sú rov<strong>na</strong>ké ako v predchádzajúcom prípade: ak sa vy<strong>sk</strong>ytne problém,vždy je dobré vedie , ktoré záz<strong>na</strong>my ho spôsobili.Ve¾kým prínosom komponentu TBatchMove (a aj metódy BatchMove) je to, žeumožòuje konverziu medzi rôznymi typmi databáz. Ak ste teda práve migrovali zParadoxu <strong>na</strong>príklad <strong>na</strong> MS Access a nechcete prís o staré údaje, bude pre vás tentokomponent ve¾mi užitoèným nástrojom. Mnohých z vás teraz možno <strong>na</strong>padne, že sitrošku pocvièíte prsty a <strong>na</strong>píšete si databázový konvertor. Žia¾, to ani zïaleka nie je takéjednoduché. V urèitom zmysle konverzia databáz možná je, konvertova možno všakiba tie <strong>na</strong>jjednoduchšie tabu¾ky bez indexov. Ak som spomí<strong>na</strong>l prechod z Paradoxu <strong>na</strong>Access, mal som <strong>na</strong> mysli prenos údajov, èo má ku konvertovaniu databázy ve¾mi ïaleko.Databáza totiž nezahàòa iba údaje, ale aj indexy, definíciu referenènej integrity a vzávislosti od databázového systému aj rôzne iné dáta (<strong>na</strong>pr. uložené procedúry). Nie je<strong>na</strong>príklad možné prekonvertova do formátu dBase takú paradoxovú tabu¾ku, ktoráobsahuje primárny index, tie totiž dBase nepodporuje. Preprava dát možná je, ale indexya ostatné dôležité údaje vz ahujúce sa k definícii tabu¾ky je potrebné po konverziidoplni ruène.Ïalšou ve¾mi užitoènou vlastnos ou komponentu TBatchMove je možnos mapovaniapolí. Pri presune dát môže <strong>na</strong>sta problém, keï poèet a typy polí v cie¾ovej i zdrojovejtabu¾ke sú síce rov<strong>na</strong>ké, ich poradie sa však v zdrojovej i cie¾ovej tabu¾ke líši, a preto saúdaje môžu dosta <strong>na</strong> nesprávne miesto. Ak je <strong>na</strong>príklad v cie¾ovej tabu¾ke prvé pole typustring a v zdrojovej tabu¾ke typu integer, budú celé èísla „<strong>na</strong>tvrdo“ vložené do re azcovéhopo¾a. Riešením problému je použitie mapovania, vtedy totiž vieme presne urèi ,ktoré pole sa kam premietne.Uvedený problém si, samozrejme, budeme demonštrova <strong>na</strong> príklade. Vytvoríme program,ktorý nám prekonvertuje údaje z tabu¾ky ANIMALS.DBF do formátu Paradox. Násvšak budú zaujíma iba dve polia: názov zviera a a oblas , v ktorej zviera žije. Aby sme sito ešte viac <strong>sk</strong>omplikovali, vytvoríme takú paradoxovú tabu¾ku, ktorá bude obsahova sloven<strong>sk</strong>énázvy polí (<strong>na</strong>zveme ju ZVER.DB). Ako ste už iste vydedukovali, prvé pole sa budevola Meno (ve¾kos 10 z<strong>na</strong>kov) a druhé Oblast (ve¾kos 15 z<strong>na</strong>kov). Rozmer druhého po¾a(èiže po¾a Oblast) som zámerne <strong>sk</strong>rátil (v pôvodnej tabu¾ke má toto pole dåžku 20 z<strong>na</strong>kov),aby sme si mohli demonštrova prácu s problémovými záz<strong>na</strong>mami.128 PC REVUE 10/2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!