České vysoké učení technické v Praze Fakulta elektrotechnická
Bakalářská práce
Aplikace pro podporu čínské medicíny Martin Adamíra
Vedoucí práce: Ing. Vladimír Klimeš
Studijní program: Elektrotechnika a informatika, strukturovaný, magisterský Obor: Výpočetní technika červen 2006
ii
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č.121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Mírové pod Kozákovem dne 1.6.2006 .................................................................................. iii
iv
Obsah Obsah ..........................................................................................................................................v Seznam obrázků........................................................................................................................vii 1. Úvod ...................................................................................................................................1 2. Čínská medicína .................................................................................................................2 2.1. Léčebné metody..........................................................................................................2 2.2. Fytoterapie ..................................................................................................................2 2.3. Čínské bylinné směsi mohou mít několik podob........................................................3 2.4. Akupunktura ...............................................................................................................3 2.5. Tuina masáže ..............................................................................................................3 2.6. Zdravotní cvičení Qigong ...........................................................................................4 2.7. Akupresurní sestavy pro první pomoc........................................................................4 2.8. Dietetika......................................................................................................................4 3. Analýza ...............................................................................................................................5 3.1. Popis problému ...........................................................................................................5 3.2. Specifikace cíle...........................................................................................................6 3.3. Volba implementačního prostředí ..............................................................................7 3.4. Způsob ukládání dat....................................................................................................7 4. Implementace databáze.......................................................................................................9 4.1. Struktura databázového souboru ................................................................................9 4.2. Načítání databázového souboru................................................................................10 4.3. Změny v databázovém modelu.................................................................................11 4.4. Implementace databáze – stručně .............................................................................11 4.5. Implementace databáze – podrobně .........................................................................12 5. Databázový model ............................................................................................................15 5.1. Význam jednotlivých entit a jejich atributů .............................................................17 6. Implementace grafického rozhraní ...................................................................................20 6.1. Ochrana proti neoprávněnému použití programu .....................................................20 6.2. Čínské znaky.............................................................................................................20 6.3. Dialogová okna.........................................................................................................21 6.4. Obecné řešení dialogových oken ..............................................................................21 6.5. Aktualizace databáze bylin, syndromů a symptomů ................................................22 7. Uživatelská příručka .........................................................................................................23 7.1. Instalace ....................................................................................................................23 7.2. Úprava databáze syndromů a symptomů..................................................................25 7.3. Úprava databáze bylin ..............................................................................................26 7.4. Aktualizace databáze syndromů, symptomů a bylin ................................................27 7.5. Databáze pacientů.....................................................................................................28 8. Obsah přiloženého CD......................................................................................................31 9. Závěr .................................................................................................................................32
v
vi
Seznam obrázků Obrázek 1 - databázový model - první část ..............................................................................15 Obrázek 2 - databázový model - druhá část..............................................................................16 Obrázek 3 - čínské znaky..........................................................................................................20 Obrázek 4 - dialogové okno......................................................................................................21 Obrázek 5 - spuštění instalace ..................................................................................................23 Obrázek 6 - způsob instalace ....................................................................................................23 Obrázek 7 - cíl instalace ...........................................................................................................23 Obrázek 8 - dokončení instalace...............................................................................................24 Obrázek 9 - zástupce.................................................................................................................24 Obrázek 10 - registrační klíč ....................................................................................................24 Obrázek 11 - databáze syndromů a symptomů.........................................................................25 Obrázek 12 - editace syndromu ve vazbě na symptom ............................................................25 Obrázek 13 - databáze bylin .....................................................................................................26 Obrázek 14 - editace byliny......................................................................................................26 Obrázek 15 - editace kombinace upravených bylin..................................................................27 Obrázek 16 - databáze pacientů................................................................................................28 Obrázek 17 - zdravotní karta pacienta ......................................................................................28 Obrázek 18 - pomůcka pro diagnózu pacienta .........................................................................29 Obrázek 19 - základní informace o bylině................................................................................30 Obrázek 20 - informace o kombinaci upravených bylin ..........................................................30
vii
viii
1. Úvod Prostřednictvím mého kolegy z fakulty elektrotechnické mě oslovil MUDr. Jozef Lucký ze společnosti TCM Bohemia s.r.o. s tím, že by potřeboval vytvořit nějaký počítačový systém pro podporu čínské medicíny. Zhruba před dvěma lety, kdy jsme se poprvé sešli, jsme vytvořili v celku jednoduchý návrh, který se dal vyřešit relační databází s maximálně deseti tabulkami a jednoduchým uživatelským rozhraním. Celý projekt jsem odhadl na 50 hodin práce pro jednoho člověka. Nicméně, jak už to tak s většinou softwarových projektů bývá, zadavatel upřesňoval své požadavky až v průběhu vývoje a projekt se stále rozrůstal. Asi před rokem mě potkal nemilý problém s harddiskem v počítači a přišel jsem o velkou část zdrojových kódů. Navíc se řešení s Borland Database Enginem ukázalo jako maximálně nevyhovující. Než abych psal znovu ten samý zdrojový kód, rozhodl jsem se celý projekt od základů přepracovat a navíc použít jako téma bakalářské práce.
1
2. Čínská medicína Čínská medicína je nejznámějším léčebným systémem, stojícím paralelně k soudobým biomedicínským postupům. Poskytuje ucelený pohled na otázky, které pálí čas od času každého z nás - otázky zdraví, nemoci, životního stylu, cesty k udržení zdraví, energie, životního elánu. Odpovědi, které dává, jsou prověřeny věkem, množstvím lidí, kteří se jimi řídili a v posledních desetiletích i rozsáhlým výzkumem prováděným na Západě.
2.1.
Léčebné metody
Čínská medicína používá několik terapeutických metod. Jejich výběr se řídí povahou onemocnění, typem pacienta a jeho ochotou spolupodílet se na léčebném procesu. Ačkoliv je nejznámější akupunktura (tedy u nás nejznámější), nejrozšířenější je fytoterapie. K dalším metodám patří masáže, cvičení, akupresura a dietetika.
2.2.
Fytoterapie
Fytoterapie je nejužívanější a nejrozšířenější metodou. Využívají se v Číně rostoucí byliny, doplněné o minerálie a ojediněle i živočišné produkty. Nevyužívají se naše léčivky. Ne, že by nebyly rovněž zdraví prospěšné, ale proto, že jak již bylo uvedeno výše, čínská medicína je svázaná staletou empirií a postupy. Nedá se tedy říct - když je pampeliška hořká, můžeme ji použít místo jiné hořké čínské byliny. Fytoterapie je metoda, která léčí materií - tedy něčím, co je obsaženo v bylinách a vařením se z nich vyloučí, složitým způsobem to spolu zreaguje, aby to potom působilo na metabolizmus a jiné pochody lidského organizmu. V tom spočívá důvod ulpívání na dodržování starých osvědčených předpisů. Po určité době podávání se organizmus začne vracet do své ztracené normy. Zpočátku právě díky pomoci bylin, které jej k tomu nutí. Postupem času se však dávka bylin pozvolna snižuje a hlídá se, aby se udržela "laťka" zlepšeného zdraví. Až se jednoho dne byliny vysadí úplně, přičemž však člověk zůstává nadále zdráv. Nejde tedy o celoživotní substituci, ale o výuku organizmu. Od tohoto scénáře jsou možné odchylky - někdy, zvláště u akutních, kratší dobu trvajících případů, se bylinky mohou po zlepšení zdraví vysadit skokem. A také obráceně - u závažných či velmi chronických metod již "síla bylin" nestačí na změnu, pouze na podporu a směsi se podávají dlouhodobě. Bylinné směsi dostává klient na předepsaný počet dnů, do následující kontroly. Při ní se směs dále upravuje podle aktuálních potřeb nebo se snižuje dávka v závěrečných fázích terapie.
2
2.3.
Čínské bylinné směsi mohou mít několik podob
Odvar (tang): Původní metoda podávání bylin, nejúčinnější ale taky chuťově nejméně vábná. Řídí se Konfuciovým "dobrý lék chutná hořce, dobrá rada drásá uši". Práškový extrakt (san): Koncentrovaný výtažek v suché podobě, určený k rozpuštění ve vodě. Méně účinnější ale chutnější. Často podávaný u dětí či pro doléčení. Lisované pilulky (wan): Lisované tradiční směsi do malých kuliček. Chuťově naprosto bezproblémové, účinností opět nižší než u vařených bylin. Rovněž vhodné pro doléčení či u méně problémových stavů. Další doplňkové produkty - sirupy, náplasti, masti, čípky.
2.4.
Akupunktura
Založená na ovlivňování speciálních míst na povrchu těla napichováním jehel. Patří k ní další přidružené metody, z nichž využíváme ovlivňování bodů tlakem při akupresuře a masážích nebo teplem, při takzvaném moxování (nahřívání bodů dutinkami, naplněnými pelyňkem). Při respektování pravidel, týkající se hygieny provedení, hloubky napichování, podání řádného vysvětlení o metodě atd., se jedná o naprosto bezpečnou metodu, nezatíženou vedlejšími vlivy. Využívá se často u bolestivých stavů, je však prospěšná i u mnoha dalších onemocnění. V posledních desetiletích probíhá intenzivní výzkum, což dokumentuje například materiál vydaný Světovou Zdravotnickou Organizací (čtení spíše pro praktiky - dokument má 81 stran). Na akupunkturu si klient dochází jednou až dvakrát týdně, při udržovacím tempu méně často. Samozřejmostí je používání jehel na jedno použití.
2.5.
Tuina masáže
Využívá se hlavně pro potřeby celkového ovlivnění pohybového aparátu - svalů, šlach, kloubů. Oproti akupunktuře působí plošně a více dynamicky. S předešlými metodami se velmi často kombinuje. Tuina masáže se liší od "běžných" masáží zejména prací se systémem drah a akupunkturních bodů. To znamená, že kromě řádného rozmasírování využívá i reflexního působení specielně vybraných bodů na celkový stav harmonizace a uvolnění. Masáže se provádí jednou či dvakrát týdně, pokud se jedná o akutnější stav (náhlá ztuhlost krční či hrudní páteře, bolesti zad, povšechné bolesti těla, bolesti hlavy apod.), tak i častěji. Masáže se provádí přes textilii vleže či vsedě na speciálním masážním křesle.
3
2.6.
Zdravotní cvičení Qigong
Cvičení je vhodné pro lidi s aktivním přístupem ke svému zdraví. Protože jej po naučení má každý doma a může provádět libovolně bez rizika předávkování se, představuje významný nástroj pro udržení zdraví a předcházení nemocem. Zejména je vhodné pro prevenci, tedy v případech, kdy se nerovnováha organizmu projevuje pouze na "energetické úrovni", tedy když máme problém, ale při vyšetřování přístroji a laboratorně nám naštěstí ještě nic neobjevili. Pokud však tento stav přetrvává, může se dostat do "orgánové úrovně", což vyvolá nějakou změnu - vznik vředu, zánětu, zvětšení apod. Každé cvičení Qigong (práce s vitální energií) je určeno pro celkovou harmonizaci a dále pro některou oblast organizmu. různá cvičení se kombinují do sestav, aby se tak zajistil celkový rozvoj a harmonie. Nástrojem, se kterým se zejména pracuje, je dýchání. Snažíme se o hluboké dýchání, nejčastěji se současnou vizualizací toku energie, která se vede do určitých částí těla, podle předem daného plánu. různých cvičení Qigong je na tisíce a lidí, kteří jej cvičí na miliony. U nás vyučujeme sestavu Osm kusů brokátu (Baduanjin) a cvičení Pěti elementů (Wuxing).
2.7.
Akupresurní sestavy pro první pomoc
Akupresura je mladší sestrou akupunktury. Přes menší účinnost má jednu nespornou výhodu, lze jí použít takřka kdykoliv a kdekoliv. Je ceněna zejména pro svou nenáročnost, neškodnost a po zácviku snadnost provedení. V současné době provádíme výuku sestav určených pro: • bolesti hlavy • bolesti a ztuhlost krční a horní hrudní páteře • bolestivou menstruaci a premenstruální problémy Výuka probíhá v malých skupinkách, aby se zajistilo dokonalé zvládnutí metody. Nejdříve se naučíte lokalizaci bodů, poté posloupnost jejich kombinace.
2.8.
Dietetika
Známý lékař a taoista Sun Simiao, jenž se dožil 101 let a do konce života aktivně léčil, řekl: "U svých pacientů nejdříve doporučuji změnu jídelníčku. Pokud to nestačí, volím další metody." V současnosti by změna jídelníčku asi nestačila, přeci jenom soudobé nemoci jsou složitější a faktorů, které je ovlivňují jsme vyvinuli mnohem více. Pořád ale platí, že jídelníček je jedním z velmi důležitých nástrojů, který se může stát jak dobrým sluhou, tak zlým pánem. Poznámky k jídelníčku jsou součástí každé konzultace, u některých diagnóz mají pouze okrajový význam, jindy jsou stěžejní. Dietetika se opírá o střídmost, různorodost a pravidelnost ve stravování. Navíc k těmto obecným pravidlům čínská dietetika razí zásadu "termodynamických" vlastností stravy, které musí korelovat se stavem pacienta a povahou jeho onemocnění.
4
3. Analýza 3.1.
Popis problému
Mým úkolem bylo vytvořit aplikaci pro Windows, kterou budou používat lékaři čínské medicíny. Potřebná data, jako jsou informace o různých syndromech nebo bylinách si do programu zadavatel vloží sám. Jak jsem již řekl, zadání projektu se v průběhu jeho implementace měnilo. Jeho současnou podobu bych formuloval v několika bodech: Agenda pacientů a jejich návštěv: program má obsahovat databázi pacientů a u každého pacienta několik základních údajů, jako je jméno, datum narození nebo adresa. Pacient přijde ke svému lékaři s nějakým problémem, který je potřeba zapsat do zdravotní karty. Většinou přijde několikrát a každou návštěvu je nutné evidovat zvlášť. Pro přehlednost zdravotní karty mají být návštěvy kategorizovány podle problému, kvůli kterému pacient přišel. Databáze syndromů a symptomů: symptom je projev onemocnění. Z klasické medicíny známe projevy jako zvýšenou teplotu, bolest hlavy, malátnost a podobně. Každý symptom může mít několik příčin (syndromů), které se léčí různými způsoby, mimo jiné v závislosti na tom, jaké má pacient symptomy. Není tedy možné říci, jakým způsobem léčit syndrom FENG HAN, ale můžeme lékaři napovědět, jak se typicky léčí FENG HAN při symptomu beitong (bolesti zad). Správné diagnóze navíc napomáhají tzv. pulzy – je jich cca 30 a syndrom ve vazbě na konkrétní symptom jich může mít i několik. Databáze bylin: základním stavebním kamenem této databáze je bylina. Bylina má nějaký název, obrázky a teoretické informace jako čeleď, odkazy a podobně. Byliny se dají upravovat několika způsoby – je tedy vhodné vytvořit tabulku, která bude všechny úpravy obsahovat (např. různá máčení, pražení a podobně). Upravené nebo neupravené byliny se mohou zkombinovat a vzniklá kombinace má potom určitou povahu, chuť, způsob dávkování, účinky a další vlastnosti. Pomůcka při diagnóze pacienta: anamnézou lékař zjistí, jaké má pacient symptomy. Program ve své databázi najde všechny syndromy, které se k daným symptomům vážou. Lékař má potom možnost si u jednotlivých syndromů přečíst teoretické informace, které databáze obsahuje a označit ty, které s pacientem souvisí, resp. vyloučit ty, které nesouvisí. Součástí informací jsou také recepty a lékař má možnost recept přenést do zdravotní karty pacienta a tam jej případně dále modifikovat. Recept je složený z bylin a program má nabízet možnost zobrazení detailních informací o jednotlivých bylinách. Objednávání bylinných směsí: upravená nebo neupravená bylina má svůj objednací kód a cenu. V současné chvíli ještě nemáme dořešený způsob, jakým se bude vypočítávat cena směsi a jak bude možné byliny objednávat u dodavatelů. Dodavatelé mají jakési ceníky s možností slev pro stálé zákazníky a objednávky jsou možné písemně, faxem nebo emailem. V tomto směru máme vizi do budoucna, že program bude automaticky vytvářet objednávky a počítat ceny.
5
3.2.
Specifikace cíle
Mým úkolem je vytvořit aplikaci pro Windows, kterou budou používat jako pomůcku lékaři čínské medicíny. Já tvořím pouze holou aplikaci a o vkládání potřebných dat se nestarám – to si řeší zadavatel sám. Výslednou aplikaci chceme dále prodávat. Proto je potřeba vyřešit alespoň základní způsob zabezpečení proti volnému kopírování programu mezi uživateli. Nejjednodušší je zřejmě přečtení sériového čísla disku, na který uživatel program instaluje a matematický výpočet klíče, který bude od uživatele program vyžadovat. Předání klíče mohu řešit třeba telefonicky nebo emailem. Řešení sice není úplně ideální, ale velké procento uživatelů tak od volného kopírování odradíme. Instalace a ovládání programu musí být maximálně jednoduché, tak aby jej zvládl i začátečník. Pokud dojde k nějakému problému, program jej musí vyřešit zcela samostatně a nemůže se spoléhat na znalosti uživatele. Program bude vždy sloužit jednomu uživateli, případně více uživatelům na jednom počítači. Je zbytečné řešit nějaké sdílení dat po síti, to se po nás v současné chvíli vůbec nechce. Program bude obsahovat databázi syndromů, symptomů, bylin a agendu pacientů. Jejich strukturu popisuje databázový model v některé z následujících kapitol a je zbytečné jej na tomto místě opisovat. Cílem projektu je i pomůcka při diagnóze, která bude lékaři pomáhat při hledání příčin onemocnění. Při návrhu systému musíme rovněž počítat s tím, že jej v budoucnu budeme vylepšovat a vytvářet upgrady. To platí i pro databázi syndromů, symptomů a bylin. Program tedy musí někam uložit svojí aktuální verzi tak, aby případný upgrade dokázal provést konverzi. Rovněž je nutné vyřešit způsob upgradu databáze syndromů, symptomů a bylin nejlépe exportem, který provede zadavatel, výstup pošle klientovi a klient provede import. Předpokládám, že uživatel bude data do programu převážně vkládat. Výjimečně bude již vložená data upravovat nebo mazat. To by mělo usnadnit rozhodování při volbě vhodného databázového systému. Další věci, které by program mohl řešit a se kterými je potřeba počítat, jsou například zálohování obrázků pacientů na výměnná média, odesílání předpisů směrem k dodavateli, zjišťování dostupnosti bylin u dodavatele, výpočty cen receptů, práce s různými slevami a další a další věci. Takové věci už však přesahují rozpočet projektu a rozsah bakalářské práce a proto si je ponecháme jako možnost dalších verzí programu a vize do budoucna. Nejprve je třeba realizovat to, co jsme si zadali a poté je možno uvažovat o dalších vylepšováních. Výstupem projektu by tedy měl být funkční a použitelný program s výše uvedenými funkcemi.
6
3.3.
Volba implementačního prostředí
Jedná se o aplikaci určenou pouze pro platformu Windows. Z této oblasti znám a mám zkušenosti s následujícími vývojovými prostředími:
Borland Delphi Free Pascal ve spojení s projektem Lazarus Borland C++Builder Borland JBuilder Microsoft Visual C# a platforma .Net GTK# ve spojení s projektem Mono
Bylo by asi hloupé a neekonomické učit se pracovat s nějakým novým prostředím. Daleko jednodušší je vybrat si z těch, která již znám. Nevýhodou JBuilderu je, že aplikace v něm vytvořené vyžadují nainstalovanou Java Virtual Machine, což může být pro řadu uživatelů problém. Navíc mám s touto platformou špatné zkušenosti, co se týče grafického prostředí aplikace. Na některých strojích se mi stávalo, že se aplikace špatně překreslovala a bylo nutné ve Windows vypnout hardwarovou akceleraci – což jistě není čisté řešení. GTK# a Visual C# také vyžadují instalaci speciálního prostředí (.NET, resp. Mono). Navíc s GTK# mám obdobně špatné zkušenosti se zobrazováním grafických prvků. Pokud chci vyvíjet v komfortním prostředí, zbývá mi na výběr Borland Delphi a C++Builder. Obě prostředí jsou naprosto totožná, rozdíl je pouze ve vlastním jazyku. A jelikož mám s Delphi bohatší zkušenosti, rozhodl jsem se pro ně. Pro nekomerční využití (bakalářský projekt) licenci mám a až program budu chtít jednou prodávat, převedu projekt do Free Pascalu spojeného s Lazarusem a celé to tak legalizuji.
3.4.
Způsob ukládání dat
První věc, kterou jsem se při tvorbě svého programu musel zabývat, je volba vhodného způsobu, jak ukládat data. Pro rozhodování jsem si stanovil následující podmínky:
Nízké pořizovací a udržovací náklady – nejlépe nulové Instalace bez nutnosti jakýchkoliv znalostí uživatele Vysoká odolnost proti ztrátě dat při havárii systému Schopnost zotavit se z havárie bez zásahu uživatele
7
Nejjednodušší řešení, které by napadlo snad každého programátora, je použití některého existujícího databázového systému. Jelikož je můj projekt komerční, mohu vzhledem k jeho rozpočtu hned ze začátku vyřadit databázové systémy typu Microsoft SQL Server, Microsoft Access a v podstatě všechno, co se musí platit. Pokud vezmu v úvahu, kolik hodin by mi zabralo zkoumání a testování systému, který neznám, můžeme se zúžit na výběr mezi Borland Database Enginem, MySQL a PostgreSQL. MySQL sice spousta lidí zná jako "databázový systém zadarmo". Jenže háček je v tom, že MySQL používá tzv. dvojí licenci – pro nekomerční využití se vás týká licence GPL – tedy, software zdarma, ale pro komerční využití je pro vás licence jiná. A podle ceníku nejlevnější edice nazvaná MySQL Network Basic stojí 495 Euro za jeden server a jeden rok. Což, jak už jsem uvedl o něco výše, nepřipadá v úvahu. PostgreSQL je dostupné pod BSD licencí, což znamená, že je zcela zdarma. Jenže problém je v tom, že nainstalovat PostgreSQL databázový systém není úplně jednoduché a pro uživatele, který je rád, že dokáže spustit program ve Windows, prakticky nereálné. Tento problém bychom mohli vyřešit podrobným manuálem typu "krok za krokem", nicméně pro začínajícího uživatele stačí udělat jedinou chybu a je v instalaci zcela ztracen. Motem mého softwaru by měla být jednoduchost instalace a použití. Použití PostgreSQL by však v tomto směru bylo spíše demotivující. Navíc další problémy nastanou při pádu systému, kdy je potřebný zásah uživatele, aby jej znovu zprovoznil. Zbývá Borland Database Engine, který je z pohledu instalace velice jednoduchý. Proto jsem se jej ze začátku rozhodl použít. Narazil jsem však na několik zásadních problémů: •
Systém je velice pomalý. Spojení několika tabulek v něm trvá ve srovnání např. s MySQL nebo PostgreSQL velice dlouho a to je pro uživatele velmi nepříjemné. Například vyhledávání v databázi symptomů při sepisování anamnézy lékařem bych musel dotazy nad databází provádět v samostatném vlákně, což není příliš jednoduché a znamená to spoustu hodin programování navíc.
•
Je velice jednoduché databázové soubory poškodit – například při pádu systému nebo i jen samotného programu se mi velice často stávalo, že spadl i Borland Database Engine a po restartu nebyl schopen s tabulkami znovu pracovat. Tento problém jsem řešil tak, že před přihlášením k databázi jsem všechny soubory zálohoval do samostatného adresáře, abych je v případě problémů mohl automaticky obnovit. Jenže pokud uživateli systém spadne po několika hodinách práce, může to mít nedozírné následky.
•
Některé dotazy provést ani nešly. Jak se postupně zaplňovala databáze, rostly požadavky na systémové zdroje pro vykonání složitějších dotazů. Až jednoho krásného dne došlo k jejich úplnému vyčerpání a program přestal fungovat.
Na základě výše uvedených argumentů jsem použití Borland Database Enginu zavrhl.
8
4. Implementace databáze Po vyloučení všech známých databázových systémů jsem došel k závěru, že si raději vytvořím systém vlastní – takový, který bude splňovat všechny moje podmínky. Vytvořil jsem tedy databázový systém, který se nemusí instalovat, protože je součástí vlastního programu. Při havárii systému neztrácí žádná úspěšně uložená data a po havárii se zotaví bez jakéhokoliv zásahu uživatele. Celý systém je řešený jako transakční log. To znamená, že databázi reprezentuje jeden soubor, do kterého se data pouze přidávají – nikdy se nemodifikují, ani nemažou. Za předpokladu, že nás nezklame souborový systém, tedy můžeme tvrdit, že úspěšně uložená data se nemohou nijak ztratit.
4.1.
Struktura databázového souboru
Do databázového souboru jsou ukládány následující datové typy: boolean – je reprezentován jedním bytem. Logická hodnota TRUE je uložena jako "1", logická hodnota FALSE jako "0". integer – 32bitové celé číslo se znaménkem uložené jako little endian (tzn., nejprve je uložen nejnižší (0.) byte, potom 1., 2. a nakonec 3. byte. double – 64bitové reálné číslo datetime – datum a čas. Je to vlastně double, kde celá část říká, kolik celých dní uplynulo od 1.1.1900 0:00:00 a desetinná část představuje čas vyjádřený jako část dne (např. 0,25 představuje 6 hodin ráno, nebo 0,5 je poledne). string – nejprve se uloží délka řetězce (jako datový typ integer) a potom samotný řetězec (od prvního znaku). Na začátku souboru je uložena verze databáze (datový typ string). Konkrétně v mém programu je verze ve formátu AdaBylinkyRRRRMMDD, kde RRRR je rok, MM měsíc a DD den. Například AdaBylinky20050428. Potom následují tzv. transakce. Každá transakce je uvozená řetězcem Z*** a aktuálním časem typu datetime (ten slouží jen jako pomůcka pro případné ladění programu). Následují jednotlivé záznamy a konec transakce je vyznačen řetězcem K*** a kontrolním součtem, který je datového typu integer. Kontrolní součet se počítá od značky Z*** ke značce K*** včetně těchto značek. Přičemž všechny značky v databázi jsou ukládané jako datový typ integer (nejnižší byte odpovídá ascii hodnotě "K", resp. "Z", ostatní byty ascii hodnotě "*"). Kontrolní součet se na začátku nastaví na hodnotu "0" a potom se inkrementuje různým způsobem pro různé datové typy:
9
boolean – o hodnotu "1", pokud má hodnotu TRUE integer – o číselnou hodnotu integeru double – do jeho 64bitovového prostoru se namapují dva integery (32bitové) a kontrolní součet se zvýší o hodnoty obou těchto integerů datetime – stejně jako double string – o délku řetězce jako integer a jednotlivé znaky pak inkrementují kontrolní součet o jejich ascii hodnoty Jednotlivé záznamy (řádky tabulek) jsou uvozeny značkou N***, U*** nebo S***, podle toho, zda se jedná o nový záznam, upravený již existující záznam nebo smazání záznamu. Následuje primární klíč a v případě nového nebo upraveného záznamu hodnoty v tomto záznamu. Hodnoty typu boolean, integer, double, datetime a string se ukládají klasicky. Pokud je hodnotou tabulka, pak se neuloží nic (tabulku musíme uložit jako sadu dalších záznamů). Pokud je hodnotou ukazatel na řádek tabulky, pak se uloží příslušný primární klíč. Primární klíče se ukládají jako posloupnost přirozených čísel (integer) ukončená číslem -1 (integer). Čísla v posloupnosti představují primární klíče řádků v tabulkách, kterými musíme při hledání našeho řádku projít. Je to z toho důvodu, že tabulka může být vnořená do jiné tabulky (viz následující kapitola).
4.2.
Načítání databázového souboru
Při nahrávání databázového souboru se nejprve přečte jeho verze a program ověří, zda jde opravdu o databázi, kterou očekává. V databázovém souboru není uložena její struktura – tu program zná – stačí mu pouze zkontrolovat verzi. Dále se načítají jednotlivé transakce. Před každou transakcí se vynuluje kontrolní součet, přečte se značka Z***, datum, dále jednotlivé záznamy a značka K***. Kontrolní součet se uloží do pomocné proměnné a přečte se kontrolní součet z databázového souboru. Pokud jsou součty rozdílné, nebo v průběhu čtení transakce dojde k nějaké chybě, znamená to, že je transakce poškozená. Vycházím z předpokladu, že k poškození může dojít pouze při neúspěšném nebo nedokončeném ukládání a chyba je tudíž na konci souboru. V případě chyby tedy celou databázi pro jistotu zálohuji, smažu část souboru od značky Z*** až do konce souboru, vymažu načtená data z operační paměti a načtení databáze zopakuji. Tímto způsobem je zajištěna automatická oprava databáze, aniž by bylo zapotřebí jakéhokoliv zásahu uživatele, což je jedna z podmínek, kterou jsem si při návrhu databázového systému stanovil.
10
4.3.
Změny v databázovém modelu
Při vývoji novějších verzí programu se samozřejmě může změnit i struktura databáze. Program vytváří strukturu databáze postupně (chronologicky) a v každém bodě, který představuje vydanou verzi databáze kontroluje, zda soubor takové verzi neodpovídá. Pokud odpovídá, pak soubor načte a pokračuje ve konstrukci struktury databáze. Načtená data se tak konvertují. Až je struktura kompletní, ověří se, zda je aktuální verze databáze shodná s verzí souboru. Pokud ne, soubor se zálohuje a celá databáze se uloží v současné struktuře. Při dalším spuštění programu už tak bude verze aktuální.
4.4.
Implementace databáze – stručně
Celá databáze (jeden soubor) je reprezentována třídou tDatabaze. Tato třída obsahuje definice tabulek (tedy seznamy názvů a typů sloupců, které tabulka obsahuje) implementovaných jako třídy tDefiniceTabulky a tSloupec. Dále databáze obsahuje tzv. fyzické tabulky (třída tFyzickaTabulka), které představují jakési instance svých definic. Jedna definice může mít logicky několik instancí, neboli několik fyzických tabulek může mít stejnou definici. Fyzická tabulka potom obsahuje řádky (třída tRadek). Sloupec může být různého typu. Kromě základních typů boolean, integer, double, datetime a string jsou možné také typy: dlouhý string – v databázovém souboru je uložený stejně jako krátký string, rozdíl je ve způsobu, jakým se s ním zachází. Zatímco krátké stringy jsou vždy načtené v operační paměti počítače, dlouhé stringy jsou v paměti pouze u záznamů, kde byla hodnota stringu změněna a ještě nebyla uložena do databázového souboru. počítaný string – ten v databázovém souboru není uložený vůbec. Je reprezentovaný funkcí s návratovou hodnotou typu string, která jej spočítá z ostatních hodnot daného záznamu. ukazatel na řádek – je to vlastně reference na řádek jiné tabulky. V definici sloupce je řečeno, na jakou definici tabulky má ukazovat. V záznamu je potom uložen pointer na příslušný řádek. tabulka – kromě běžně známých datových typů jsem implementoval také typ tabulka, který v podstatě znamená, že pro každý záznam tabulky se v příslušném sloupci vytvoří nová instance třídy tFyzickaTabulka s předem danou definicí. Tento datový typ je v mém systému hojně používaný a v podstatě umožňuje elegantní obejití relací. Bylina, která má několik obrázků, tedy nemusí být reprezentována několika záznamy v tabulce obrázků, které budou odkazovat na svoji bylinu, ale každá bylina má svoji vlastní tabulku s obrázky. Napříč strukturou databáze jsem implementoval "globální primární klíč". V mé databázi to znamená, že pokud v definici tabulky řeknete, že má mít globální primární klíč, pak je tento klíč unikátní v rámci celé databáze – tedy i v případě, že má definice tabulky několik instancí. Databáze je tedy načtená v operační paměti počítače celá – kromě dlouhých stringů.
11
4.5.
Implementace databáze – podrobně
Celou databázi reprezentuje třída tDatabaze. Konstruktoru této třídy předáme název souboru, ve kterém mají být nebo jsou uložená data. Třída zajišťuje nahrávání dat ze souboru a ukládání dat do souboru na úrovni transakcí a datových typů. To znamená, že zná značky Z*** a K***, které v souboru označují začátek a konec transakce. Ví, že na začátku transakce je její datum a čas (jen pro ladící účely) a na konci kontrolní součet. Neřeší ale samotný databázový model, tedy strukturu tabulek.
Třída obsahuje statické pole objektů třídy tDefiniceTabulky a statické pole objektů třídy tFyzickaTabulka. K jednotlivých definicím a fyzickým tabulkám se tedy nepřistupuje jejich jmény, jak to je u většiny databázových systémů, ale jejich indexem. Seznam indexů má samozřejmě program uložený jako konstanty, takže v programu jsou názvy tabulek vidět – ovšem ne jako řetězce, ale jako konstanty. Důvod je prostý: snaha o maximální efektivitu systému. Hledání ve jmenném prostoru tabulek by zbytečně zdržovalo – přístup přes index je mnohem snazší a rychlejší. To je také důvod, proč jsou pole statická – přístup ke statickému poli je mnohem rychlejší než k dynamickému. Definic tabulek nikdy nebude obrovské množství, proto je vhodné rovnou alokovat třeba pole o 1000 ukazatelích, což operační paměť rozhodně nezahltí. Pro fyzické tabulky platí to samé – upřesňuji, že třída databáze má seznam pouze základních fyzických tabulek, ke kterým je z ní přímý přístup. Fyzické tabulky vytvořené jako datový typ tabulka v tomto seznamu nejsou – ty jsou u příslušných záznamů (instancí třídy tRadek). Třída má dva konstruktory. První má pouze jeden argument – název souboru. Vytvoří se tak prázdný objekt, který patří k danému souboru. Druhý konstruktor má parametry dva: název souboru a instanci třídy tDatabaze. Ten nejprve zavolá první konstruktor a poté kompletně zkopíruje strukturu databáze podle svého druhého parametru. Nekopíruje ale její obsah – pouze strukturu. Destruktor zavolá destruktory všech definic tabulek a všech fyzických tabulek. Metody UlozString(const s: string), UlozDouble(...), UlozDateTime(...), UlozInteger(...) a UlozBoolean(...) ukládají do databázového souboru data s příslušným datovým typem. Předpokládají, že je při jejich volání soubor otevřený a připravený pro zápis na konec souboru. Kromě toho funkce inkrementují proměnnou CRC a počítají tak kontrolní součet. Tyto metody jsou PRIVATE, to znamená, že jsou viditelné pouze pro metody třídy tDatabaze a pro metody ostatních tříd, definovaných ve stejné knihovně, jako třída tDatabaze. Metoda NovaVerze (verze: string) vytvoří (nebo smaže a vytvoří) databázový soubor a zapíše do něho verzi databáze. Metoda ZacatekUkladani otevře databázový soubor a uloží na jeho konec značku Z*** a aktuální datum a čas. Zapíše tak do souboru začátek nové transakce. Ještě předtím však vynuluje proměnnou CRC, aby funkce pro zápis do souboru počítaly správně kontrolní součet. Metoda KonecUkladani naopak do souboru zapíše značku K*** (konec transakce) a obsah proměnné CRC (kontrolní součet). Na závěr databázový soubor uzavře a vynutí si tak uložení dat z vyrovnávacích pamětí na pevný disk. Metoda Zaloha: string vytvoří přejmenuje databázový soubor do formátu "X_zaloha_Y.Z", kde X je původní název souboru, Y je číslo (takové, které ještě neexistuje) a Z je přípona souboru. Návratovou hodnotou je název zálohovaného souboru. Název souboru, ke kterému je databáze přiřazena se však nezmění. Takže voláním metody NovaVerze se vytvoří soubor se stejným jménem, jako původně.
12
Funkce NahrajString, NahrajDouble, NahrajDateTime, NahrajInteger a NahrajBoolean ze souboru načtou data příslušného typu a vrátí je jako svou návratovou hodnotu. Kromě toho inkrementují proměnnou CRC, aby bylo možné na konci transakce zjistit, zda odpovídá kontrolní součet. Všechny tyto funkce jsou deklarované jako PRIVATE. Funkce existuje vrací logickou hodnotu, zda databázový soubor existuje a funkce verze přečte ze souboru jeho verzi a vrátí ji jako návratovou hodnotu. Metoda NahrajDataZeSouboru načte celou databázi do paměti počítače (kromě dlouhých stringů – ty se čtou pouze pro výpočet CRC, ale v paměti počítače nezůstávají). Přeskočí tedy verzi souboru a čte postupně jednotlivé transakce a kontroluje CRC. V případě, že narazí na chybu, soubor zálohuje, smaže ze souboru všechna data od začátku poslední transakce a celý proces opakuje znovu. O skutečnosti, že byl soubor poškozený, informuje uživatele pomocí dialogového boxu. Co se týče jednotlivých záznamů, pak přečte jen značku N***, U*** nebo S*** (tedy, zda jde o nový, upravený záznam, nebo zda se má záznam smazat) a přečte primární klíč. Záznam určený pro smazání rovnou smaže. Pokud primární klíč neoznačuje řádek, ale tabulku, pak se smažou všechny řádky takové tabulky. Pro nový záznam vytvoří instanci třídy tRadek, přidá ji do dynamické tabulky a zavolá její metodu NahrajData, která již zařídí načtení dat pro daný záznam. V případě úpravy záznamu najde řádek v příslušné tabulce a opět zavolá jeho metodu NahrajData.
Třída tDefiniceTabulky obsahuje definici tabulky – tedy seznam jejích sloupců. Jelikož definic v reálném systému není veliké množství (řádově desítky), je vhodné zde optimalizovat rychlost přístupu k definicím jednotlivých sloupců. Vzhledem k tomu, že prakticky s každým zápisem nebo čtením dat z databáze se musí přistupovat k definici sloupců, je zde optimalizace více než nutná. Definice sloupců jsou uloženy paralelně ve dvou statických polích (jejich rozměr jsem zvolil 1000, v případě potřeby stačí jen zvětšit jednu konstantu).
Pole SloupceA obsahuje ukazatele na instance třídy tSloupec v takovém pořadí, že číslo sloupce (uložené jako konstanta v programu) odpovídá indexu v tomto poli. Pokud tedy chceme znát definici sloupce slRecept (celočíselná konstanta), pak stačí číst SloupceA[slRecept]. Pole SloupceB obsahuje ty samé ukazatele na instance třídy tSloupec, ale tentokrát v takovém pořadí, v jakém jsou uloženy v databázovém souboru. Třída tDefiniceTabulky má proměnnou maxOffset, která říká, kolik sloupců v dané definici je. Pokud tedy chceme například načíst záznam z databázového souboru, pak stačí v cyklu projít všechny položky pole SloupceB s indexem od nuly po maxOffset. Konstruktoru třídy je potřeba předat ukazatel na databázi, číslo definice (konstanta) a informaci, zda tabulka používá globální primární klíč (boolean). Konstruktor sám zapíše ukazatel na instanci třídy do pole v databázi a uloží si logickou hodnotu, zda se má používat globální primární klíč. Za tímto účelem má třída proměnnou, do které si ukládá maximální použitou hodnotu primárního klíče. Destruktor naopak ukazatel v databázi smaže. Kromě toho zavolá destruktory všech sloupců.
Třída tSloupec představuje definici sloupce v tabulce. Pamatuje si tedy datový typ a v případě ukazatele na řádek jiné tabulky také číselné označení definice cílové tabulky (to
13
jen pro zajištění kontroly, zda záznamy ukazují na řádky, na které mají ukazovat). V případě počítaného stringu sloupec obsahuje ukazatel na funkci, kterou má pro výpočet hodnoty zavolat. U datového typu tabulka si logicky pamatuje číslo její definice.
Konstruktorů má třída hned několik. Pro každý datový typ zvlášť. Všechny mají jako první argument ukazatel definici tabulky, pod kterou sloupec patří, číselné označení sloupce (konstanta) a případně další argument, pokud se jedná ukazatel na řádek, datový typ tabulka nebo počítaný string. Každý konstruktor inkrementuje maxOffset v definici tabulky a zapíše ukazatel na sloupec do polí SloupceA a SloupceB. Výjimku tvoří počítaný string, který se zapisuje jen do pole SloupceA a hodnotu maxOffset nemění. V případě, že se sloupec přidává do definice tabulky, která má již nějaké instance (fyzické tabulky) a ty obsahují nějaká data, je potřeba realokovat všechny jejich řádky a inicializovat hodnotu nového sloupce. Destruktor vymaže ukazatel na sloupec v definici tabulky.
Instance třídy tFyzickaTabulka představuje jakousi instanci definice tabulky. Je to tedy tabulka, jejíž definice je popsána v instanci třídy tDefiniceTabulky. Obsahuje ukazatel na první, aktuální a poslední řádek ve spojovém seznamu řádků tabulky.
Konstruktory má dva. Jeden pro vytvoření tabulky přímo v databázi (zapíše ukazatel na tabulku do seznamu fyzických tabulek v databázi) a druhý pro vytvoření tabulky jako datového typu tabulka (zapíše ukazatel na novou tabulku do záznamu v cílové tabulce). Destruktor smaže všechny řádky tabulky a v případě, že tabulka patří přímo k databázi, smaže z ní ukazatel na sebe. Metodami PrvniRadek, DalsiRadek, PosledniRadek, PredchoziRadek se můžeme po tabulce pohybovat. Vlastnost AktRadek ukazuje na aktuální řádek v tabulce. Funkce KonecTabulky zjistí, jestli jsme se dostali před začátek nebo za konec spojového seznamu řádků tabulky. Při pokusu o čtení AktRadek, když jsme před začátkem nebo za koncem tabulky se vyvolá výjimka. To je z důvodu usnadnění hledání chyb. Pokud bychom se totiž pokoušeli přistupovat k metodám řádku přes nulový ukazatel, došlo by k Access Violation a ten se špatně ladí. Metoda UlozSmazat zapíše do databáze značku S***, primární klíč řádku, ve kterém se fyzická tabulka nachází a číslo sloupce. Smazáním tabulky se rozumí smazání všech jejích řádků. To lze provést například metodou VyprazdniTabulku.
Třída tRadek reprezentuje jednotlivé záznamy ve fyzické tabulce. Každý záznam má svůj primární klíč (unikátní buď v rámci fyzické tabulky nebo v rámci definice tabulky). Každý řádek má čítač, kterým sleduje, kolik na něj ukazuje řádků. Při pokusu o smazání řádku s nenulovým čítačem se vyvolá výjimka.
Konstruktoru předáme fyzickou tabulku a řádek se přidá do spojového seznamu. Destruktor řádek ze spojového seznamu vyjme a pokud právě probíhá transakce, zapíše do databázového souboru značku S*** a primární klíč řádku. Pomocí vlastností (typu pole) AsBoolean, AsInteger, AsDouble, AsDateTime, AsString, AsRadek, AsTabulka můžeme přistupovat k jednotlivým hodnotám v záznamu. Pokud skutečný datový typ neodpovídá požadovanému typu, pokusí se třída o konverzi a při neúspěchu vyvolá výjimku. Metody NahrajData, UlozNovy a UlozUpravit pracují s databázovým souborem.
14
5. Databázový model Legenda:
GPK = globální primární klíč BOOL = boolean INT = integer DOUBLE = double DT = datetime KS = krátký string DS = dlouhý string SySy = syndrom ve vazbě na symptom = ukazatel na řádek = tabulka Seznam SySy SySy
Návštěva GPK Název KS Pulz DS Anamnéza DS Předpis DS Poznámky DS Pozorování DS Jazyk DS Pohmat DS Akupunktura DS Princip léčby DS SySy Symptomy Obrázky
Obrázek GPK Název DS Celý název PS Záloha Typ Přípona KS Oříznutí vlevo INT Oříznutí vpravo INT Oříznutí nahoře INT Oříznutí dole INT
Sezn. symptomů Prioritní BOOL Symptom Celý název PS
Symptom GPK Název KS Popis KS
SySy GPK Název PS Syndrom KS Teorie DS Principy DS Symptom Léčby Pulzy
Léčba GPK Název KS Recept DS Modifikace DS
Problém GPK Název KS Návštěvy
Pacient GPK Příjmení KS Jméno KS Adresa KS Telefon KS EMail KS Narozen DT Problémy
Seznam pulzů Pulz
Záloha GPK Název PS Vypálit BOOL Umístění PS
Pulz GPK Název KS Popis KS DATABÁZE
Typ obrázku GPK Název KS
Obrázek 1 - databázový model - první část
15
Fronta předpisů GPK Vytvořen DT Odeslán DT Text DS
Upravená bylina Bylina Úprava
Obrázek byliny GPK Přípona KS
Článek byliny Popis DS
Bylina Obrázky Čínsky KS Česky KS Latinsky KS Anglicky KS Znaky KS Odkazy klasické DS Odkazy vědecké Tón čínsky KS Čeleď latinsky KS Čeleď česky KS Bensky KS Chen KS
Kód Typ KS Bylina Úprava Kód KS Cena DOUBLE Název byliny PS Název úpravy PS Sleva DOUBLE
Úprava byliny Popis KS Čínsky KS Česky KS Latinsky KS Anglicky KS Znaky KS
DATABÁZE
Kombinace upravených bylin Celý název PS Další celý název PS Upravené byliny Povaha KS Chuť KS Tropizmus KS Účinky Poznámky k úpravě KS Popis byliny KS Upozornění KS Denní dávka KS
Účinek byliny Popis DS Čínsky KS Česky KS Anglicky KS Tón čínsky KS
Obrázek 2 - databázový model - druhá část
16
5.1.
Význam jednotlivých entit a jejich atributů
Symptom – jedná se o projev onemocnění. Symptom má svůj název a popis. Jako příklad uvedu symptom s názvem "bigan" a popisem "sucho v nose". Názvy jsou tedy čínské a popisy české. Jelikož jsou symptomů řádově desítky, názvy i popisy jsou relativně krátké a pracuje se s nimi docela často, použil jsem pro ně datový typ krátký string, aby byly vždy nahrané v operační paměti počítače. Seznam symptomů – používá se při anamnéze pacienta, kdy lékař zjišťuje, jaké symptomy jeho pacient má. Při anamnéze tedy přidává záznamy do této tabulky a navíc rozlišuje mezi prioritními a neprioritními symptomy – ty prioritní se pak při diagnóze zobrazí jako první. Entita se logicky odkazuje na řádek tabulky symptomů. Navíc obsahuje atribut celý název, který není uložen v databázovém souboru, ale při jeho čtení se zavolá funkce, která vrátí název symptomu a jeho popis uvedený za názvem v závorce. Pulz je reprezentován názvem a popisem. Pulzů jsou řádově desítky a jejich názvy jsou velmi krátké: "cu", "da", "dai", ... Popis většinou není uveden vůbec a nebo je krátký. Proto je v obou případech použit datový typ krátký string. Seznam pulzů obsahuje jediný atribut – pulz, který se odkazuje na řádek tabulky pulz. Entita sama o sobě nemá význam – ten získá až při použití jako datový typ tabulka jinou entitou. Léčba má název (např. "ZHI ZHU WAN"), je vyjádřená receptem, který se skládá z bylin a doporučených dávek (např. "ZHISHI 15, BAIZHU 30-50"), případně je recept možné upravit a vznikají tak modifikace. Modifikace jsou potřebné například při silných projevech onemocnění nebo dalších doprovodných symptomech. Název je typu krátký string a recept a modifikace dlouhý string. SySy (syndrom ve vazbě na symptom) – jedná se o příčinu onemocnění, která se projevuje některým symptomem. Logicky se tedy entita SySy odkazuje na entitu Symptom. Název syndromu je obsažen v atributu syndrom. Atribut název je počítaný string. Při jeho čtení se tedy volá funkce, která vrací řetězec ve formátu "X ~ Y", kde X je název syndromu a Y je název symptomu. Teorie je doprovodný text popisující průběh onemocnění a další informace. Atribut principy obsahuje další informace v podobě textu. Název syndromu je krátký string, teorie a principy jsou dlouhé stringy (načítají se do operační paměti pouze pokud je to nutné). Atribut léčby představuje celou tabulku odvozenou od entity Léčba. Pro každý syndrom ve vazbě na symptom tedy existuje několik možných způsobů léčby. Atribut Pulzy obsahuje tabulku Seznam pulzů. Jeden SySy tedy může mít několik pulzů. Seznam SySy (syndromů ve vazbě na symptomy) obsahuje jediný atribut – SySy, který se odkazuje na řádek tabulky SySy. Entita sama o sobě nemá význam – ten získá až při použití jako datový typ tabulka jinou entitou. Záloha zatím obsahuje jediný řádek. Tabulka je připravená pro budoucí rozšiřování softwaru, kdy bychom chtěli obrázky pacientů zálohovat na výměnná média. Potom získají význam i počítané atributy název a umístění. Atribut vypálit typu boolean slouží pro rozlišení, zda jde o obrázky na pevném disku nebo na výměnném médiu.
17
Typ obrázku slouží pro rozlišení obrázků pacienta na obrázky jazyku, kůže, vypadaných vlasů a dalších. Takovýto rozlišující název je uložen v atributu název. Jelikož je takovýchto typů jen pár, použil jsem pro něj datový typ krátký string. To, že mám takové rozlišující názvy v jedné společné tabulce se hodí například pro realizaci filtrů, kdy si lékař může zobrazit historii obrázků pacienta týkajících se například jen jazyku. Obrázek je fotografie pacienta pořízená fotoaparátem. Obrázky jsou uložené ve zvláštním adresáři (cestu k němu vrací funkce, která se skrývá pod atributem umístění tabulky záloha, na kterou se entita obrázek odkazuje atributem záloha). V budoucnu by obrázky mohly být umístěné i na výměnných mediích – proto je tu taková vazba vytvořená. Obrázky jsou kategorizovány podle typu (např. obrázky jazyku, kůže, vlasů, atd.). Atribut typ tedy odkazuje na tabulku typ obrázku. Dále tu máme atribut název, kam si lékař ukládá popisky k jednotlivým obrázkům. Vzhledem k tomu, že s název není potřeba moc často pracovat, použil jsem datový typ dlouhý string. Celý název je počítaný string – je to název obrázku včetně cesty k němu. Obrázky se ukládají ve formátu "1.jpg", "2.jpg", kde číslo odpovídá primárnímu klíči obrázku (proto je použit globální primární klíč – aby názvy byly jedinečné) a "jpg" je hodnota atributu přípona (krátký string). Atributy oříznutí vlevo, vpravo, nahoře a dole jsou typu integer a vyjadřují, o kolik pixelů se má obrázek oříznout. Součástí programu je i nástroj pro nastavení tohoto oříznutí. Zda by bylo lepší oříznutý obrázek rovnou uložit, to je otázka do diskuse. Já jsem ponechal možnost uživateli, aby oříznutí mohl kdykoliv vrátit zpět. Aby si mohl například nastavit oříznutí pro možnost porovnání několika obrázků, ale soubor zůstal nezměněný. Zda by bylo lepší soubor editovat zřejmě ukáže praxe. Návštěva je jednotlivá návštěva pacienta. Má svůj název, který se zpravidla zapisuje jako datum, kdy návštěva proběhla. Nicméně je možné sem napsat libovolný text. Název je krátký string. Ostatní atributy (pulz, anamnéza, předpis, poznámky, pozorování, jazyk, pohmat, akupunktura a princip léčby) jsou typu dlouhé stringy. Není totiž nutné, aby byly všechny stále v paměti. Při každé návštěvě můžeme pořídit několik obrázků (datový typ tabulka). V rámci anamnézy lékař označí několik symptomů a se softwarovým pomocníkem diagnózy vyplyne z návštěvy několik SySy (syndromů ve vazbě na symptomy). Problém je reprezentovaný názvem (krátký string) a několika návštěvami pacienta u svého lékaře. Pacient – u každého pacienta nás zajímá jeho příjmení, jméno, adresa, telefon, email (krátké stringy) a datum a čas, kdy byl pacient narozen. Ano, zajímá nás i čas – resp. hodina. Každý pacient chodí k lékaři kvůli nějakým problémům – jednotlivé návštěvy jsou pak obsažené v těchto problémech. Fronta předpisů – při návštěvě pacienta mu lékař předepíše recept a ten buď rovnou vytiskne a nebo v budoucnu bude moci odeslat například emailem. Musíme však předpokládat, že lékař není stále připojený k internetu a proto má možnost předpis uložit do jakési fronty a až se připojí k internetu, odeslat je najednou. Vytvořen je datum a čas, kdy byl recept do fronty vložen a odeslán je datum a čas, kdy byl recept odeslán. Text je vlastní obsah receptu. Obrázek byliny – každá bylina může mít několik obrázků. Obrázky bylin jsou uloženy v samostatném adresáři (odděleně od obrázků pacientů) a ukládají se ve formátu "1.jpg",
18
"2.jpg", kde číslo odpovídá primárnímu klíči obrázku (proto je použit globální primární klíč – aby názvy byly jedinečné) a "jpg" je hodnota atributu přípona (krátký string). Článek byliny – je využit pro uložení vědeckých odkazů byliny, tedy článků, kterých může být u každé byliny několik. Text článku je uložen v atributu popis (dlouhý string). Bylina je bylina ve své původní podobě bez úpravy. Může mít několik obrázků. Dále má několik základních vlastností: název čínsky, česky, latinsky, anglicky, znaky (čínsky pomocí čínských znaků), tón čínsky, čeleď latinsky, čeleď česky, bensky, chen (všechny typu krátký string). Odkazy klasické je článek popisující klasické odkazy byliny (dlouhý string) a odkazy vědecké zase vědecké odkazy byliny – těch může být více, proto jsou uložené v samostatné tabulce. Úprava byliny – byliny mohou (ale nemusí) být upravené. Pokud bylina upravená není, pak odkazuje na řádek s primárním klíčem "1", kde je uložena informace o tom, že bylina nemá žádnou úpravu. Tento řádek se nikdy nemaže. Na všech místech programu, kde se úprava byliny zadává, je možnost vytvořit novou úpravu. Pokud však uživatel některou úpravu nepoužije, pak se automaticky smaže (vyjma úpravy s primárním klíčem "1"). Atribut popis se nepoužívá – zůstal zde z historických důvodů, kdy úprava nebyla uložena v několika jazycích. S novější verzí jsem názvy úprav zkopíroval do atributu čínsky, ale v atributu popis jsem je zachoval také (pro jistotu – kdyby zadavatel potřeboval z nějakého důvodu zjistit, které úpravy jsem takto prokopíroval). V atributech česky, latinsky, anglicky a znaky je úprava přeložená do příslušných jazyků. Jazykem znaky se rozumí čínština zapsaná pomocí čínských znaků. Všechny atributy jsou typu krátký string. Upravená bylina je v podstatě relace mezi bylinou a úpravou. Samotná entita nemá význam – ten získá až při použití jako datový typ tabulka v některé jiné entitě. Účinek byliny je vyjádřen čínsky, česky a anglicky (krátké stringy). Účinky jsou například "vyživuje krev, dává do pořádku menzes" apod. Tón čínsky (krátký string) může být třeba "yinxue xiaxing" apod. Popis (dlouhý string) je potom další text k danému účinku. Kombinace upravených bylin vnikne kombinováním několika (ne)upravených bylin, případně může být reprezentována jen jednou (ne)upravenou bylinou. Pak se samozřejmě nejedná o kombinace, ale z hlediska databáze je to vcelku jedno. Kombinace má potom jeden nebo více účinků. U každé kombinace nás dále zajímá její povaha, chuť, tropizmus, poznámky, popis byliny, upozornění (kontraindikace) a denní dávka (všechno krátké stringy). Pro usnadnění práce s tabulkou jsou zde počítané stringy celý název a další celý název, kde při čtení celého názvu dostaneme řetězec ve tvaru "bylina (úprava)" pro první hodnotu v tabulce upravených bylin a při opakovaném čtení dalšího celého názvu získáváme obdobný řetězec pro další řádky v tabulce upravených bylin. Po přečtení celé tabulky upravených bylin pak funkce vrací prázdný řetězec. Kód slouží pro možnost objednávání bylin u dodavatele. To zatím v programu není vyřešené – je to jenom vize do budoucna. V atributu typ (krátký string) je hodnota "bylina" nebo "extrakt" (byliny lze objednávat jak v podobě sušených bylin, tak v podobě pilulek nebo jiných extraktů). Entita se logicky odkazuje na bylinu a úpravu. Dále je tu objednací kód (krátký string), cena, sleva (double) a název byliny a úpravy (počítaný string – vyhodnocuje se podle vazby na bylinu a úpravu).
19
6. Implementace grafického rozhraní Program je založen na databázovém systému a databázovém modelu, které jsem podrobně popsal v předchozích kapitolách. Tvoří jej desítky formulářů (oken) a několik tisíc řádků zdrojového kódu. Je nad rámec této publikace, abych zde uváděl kompletní výpis zdrojového kódu nebo se pokoušel zde popsat každý detail. Proto se nyní zaměřím jen na zajímavé části programu, kde je o čem psát.
6.1.
Ochrana proti neoprávněnému použití programu
Po spuštění programu se zavolá API funkce GetVolumeInformation, která zjistí sériové číslo disku, ze kterého je aplikace spuštěna. Sériové číslo v podobě řetězce se ještě trochu upraví, aby nebylo úplně stejné jako číslo disku a vznikne tak jakési identifikační číslo. Toto číslo se při prvním spuštění programu zobrazí uživateli a program jej vyzve k zadání klíče. Klíč si jednak spočítá sám program (jako poupravený md5 hash poupraveného identifikačního čísla) a jednak si jej uživatel vyžádá mailem nebo telefonem ode mě. V případě shody obou klíčů se klíč uloží do registru Windows (aby jej uživatel nemusel příště zadávat znovu) a aplikace se spustí. V opačném případě se aplikace ukončí s příslušným chybovým hlášením.
6.2.
Čínské znaky
Obrázek 3 - čínské znaky
Čínské znaky dělají trochu problémy, protože potřebují kódování v unicode a to prakticky žádné komponenty v Delphi7 nepodporují. Problém jsem vyřešil tak, že pro čínské znaky používám komponentu tRichEdit, která kromě čínských znaků podporuje prakticky jakýkoliv text reprezentovatelný formátem RTF (rich text format). Do databáze potom ukládám rich text formát jako obyčejný string a v okně se zobrazují požadované čínské znaky.
20
6.3.
Dialogová okna
Obrázek 4 - dialogové okno
Na obrázku vidíme základní okno programu. Většina oken má podobnou strukturu. Hlavní část plochy okna zabírá seznam – v tomto případě seznam pacientů. Jedná se o komponentu TListView s nastavením ViewStyle = vsReport (podoba tabulky se záhlavím). Abecední řazení si řeší komponenta sama. Jednotlivé řádky mají kromě viditelných textových položek také vlastnost Data, do které si ukládám ukazatel na řádek v databázi. Po otevření okna a při každé změně vybrané položky v seznamu volám funkci, která zjistí, zda je vybraný nějaký řádek v seznamu. Pokud ano, zobrazí se v pravé části okna detailní informace o pacientovi a zpřístupní se tlačítka Upravit, Smazat a Zdravotní karta. V opačném případě se tlačítka znepřístupní a detailní informace zmizí.
6.4.
Obecné řešení dialogových oken
Jak jsem již řekl v předchozím odstavci, většina dialogových oken si je velmi podobná. Abych stále dokola neopisoval stejný zdrojový kód, vytvořil jsem si pro obsluhu databázových dialogových oken třídu tDatabazeOkno. Instanci třídy pomocí ukazatelů propojíme buď se samotný oknem, které má zobrazit, nebo s metodou, která zobrazení provede. Ve druhém případě se pro zobrazení zavolá metoda a předá se jí ukazatel na řádek, pro který se okno zobrazuje. Metoda potom vrací mrOK nebo mrCancel podle toho, zda uživatel změny v dialogu potvrdil nebo stornoval.
21
Kromě okna potřebuje třída také vědět, ke které fyzické tabulce se okno vztahuje a v jaké komponentě je tabulka zobrazena. Může to být ListView, ListBox, ComboBox nebo TabSet. Který řádek fyzické tabulky editujeme, si třída zjistí právě z této komponenty. Naopak pro změnu hodnot v této komponentě potřebuje třída znát číslo sloupce fyzické tabulky, který je v komponentě zobrazen a v případě ListView i čísla dalších sloupců, které se mají zobrazit. To se provede metodou AddSubItemSloupec. Procedurou AddPolozka přidáme vazby mezi sloupci databázové tabulky a mezi editačními prvky okna. Třída podporuje komponenty tEdit, tRichEdit, tMemo a tComboBox. Kromě toho můžeme nastavit defaultní hodnoty pro nový záznam. Kromě ukazatele na metodu zobrazující okno, můžeme třídě předat také ukazatel na funkci, která výpis tabulky bude filtrovat. Na závěr zavoláme metodu NovyZaznam, UpravitZaznam, SmazatZaznam nebo NaplnitSeznam podle toho, zda chceme do tabulky přidat nový záznam, upravit nebo smazat právě označený záznam a nebo tabulku naplnit hodnotami. Všechny metody po provedení svého úkolu zavolají destruktor třídy. Použití třídy pak může vypadat následovně: Vytvoříme si funkci, která vrátí požadovanou instanci třídy tDatabazeOkno function OknoPacient: tDatabazeOkno; begin Result := tDatabazeOkno.Create( foPacient, // dialogové okno pro editaci pacienta databaze.FyzickeTabulky[taPacient], // tabulka pacientů foHlavni.lvPacient, // seznam pacientů (ListView) slPrijmeni); // sloupec příjmení Result.AddSubItemSloupec(slJmeno); // sloupec jméno Result.AddSubItemSloupec(slNarozen); // sloupec narozen Result.AddSubItemSloupec(slAdresa); // sloupec adresa // komponenty v dialogovém okně pro editaci pacienta Result.AddPolozka(slPrijmeni, foPacient.inPrijmeni); Result.AddPolozka(slJmeno, foPacient.inJmeno); Result.AddPolozka(slNarozen, foPacient.inNarozen); Result.AddPolozka(slTelefon, foPacient.inTelefon); Result.AddPolozka(slEMail, foPacient.inEMail); Result.AddPolozka(slAdresa, foPacient.inAdresa); end;
Potom již stačí zavolat jeden z následujících řádků: OknoPacient.NovyZaznam; OknoPacient.UpravitZaznam; OknoPacient.SmazatZaznam; OknoPacient.NaplnitSeznam;
a třída se postará o zobrazení dialogového okna a provedení požadované akce.
6.5.
Aktualizace databáze bylin, syndromů a symptomů
Program obsahuje nástroj, díky kterému je možné exportovat databázi bylin, syndromů ~ symptomů nebo obojí do binárního souboru a naopak importovat binární soubor do programu. Toho lze využít pro aktualizaci databáze směrem od tvůrce databáze k jeho zákazníkům.
22
7. Uživatelská příručka 7.1.
Instalace
Vložte přiložené instalační CD do mechaniky a spusťte program setup.exe.
Obrázek 5 - spuštění instalace
Klikněte na "Next"
Obrázek 6 - způsob instalace
Vyberte si, zda se má program instalovat pouze pro Vás (Only for me), nebo pro všechny uživatele počítače (Anyone who uses this computer) a klikněte na "Next".
Obrázek 7 - cíl instalace
23
Pokud Vám nevyhovuje vybrané umístění, zvolte si, kam chcete program nainstalovat. Poté klikněte na "Next".
Obrázek 8 - dokončení instalace
Instalace byla úspěšně dokončena. Kliknutím na "Finish" ukončíte instalační program. Na ploše přibyl nový zástupce:
Obrázek 9 - zástupce
Dvojklikem levého tlačítka myši na ikoně zástupce spustíte program AdaBylinky.
Obrázek 10 - registrační klíč
Při prvním spuštění Vás program vyzve k zadání klíče. Pro jeho získání prosím kontaktujte svého prodejce. Ten od Vás bude potřebovat Vaše identifikační číslo, které je složené z číslic 0 až 9 a písmen A až F. (na obrázku je to 2016E03A)
24
7.2.
Úprava databáze syndromů a symptomů
V hlavním menu programu klikněte na Databáze – Databáze syndromů a symptomů.
Obrázek 11 - databáze syndromů a symptomů
V tomto okně můžete přidávat, upravovat nebo mazat pulzy, symptomy nebo syndromy ve vazbě na symptomy. Editace pulzů a symptomů je triviální – obě tabulky mají jen dva sloupce: název a popis.
Obrázek 12 - editace syndromu ve vazbě na symptom
Při zadávání syndromu ve vazbě na symptom zadáváte název syndromu a vybíráte ze seznamu již zadaných symptomů. Pokud hledaný symptom v seznamu není, je potřeba jej nejprve vložit do databáze pomocí tlačítka "Nový" v okně "Sběr dat". Dále vyplňte pole teorie a principy a zaškrtněte odpovídající pulzy. Pomocí tlačítek vedle pole léčba zadejte jeden nebo více receptů, včetně případných modifikací. Léčby je vhodné pro lepší orientaci pojmenovávat.
25
7.3.
Úprava databáze bylin
V hlavním menu programu klikněte na Databáze – Databáze bylin.
Obrázek 13 - databáze bylin
Obrázek 14 - editace byliny
Vyplňte požadované položky u byliny. Jakmile napíšete nějaký text do pole odkazy vědecké, zobrazí se pod textovým polem nová záložka s číslem. Pod poslední záložkou je vždy prázdné textové pole. Pomocí záložek se můžete přepínat mezi jednotlivými články. Podobně při vložení obrázku byliny se objeví i záložka. Obrázky bylin jsou fyzicky uložené v adresáři "Obrazky_bylin", který se nachází v adresáři, do kterého jste program nainstalovali.
26
Obrázek 15 - editace kombinace upravených bylin
V levé části okna vyberte byliny a úpravy, které kombinujete. Musíte vybrat alespoň jednu bylinu. Pokud vyberete bylinu, musíte k ní vybrat i příslušnou úpravu. Nenaleznete-li požadovanou úpravu v seznamu, můžete ji přidat pomocí tlačítka nahoře. Nenaleznete-li bylinu, můžete ji přidat jedině z předcházejícího okna "Byliny" tlačítkem "Přidat" nad seznamem bylin. Mezi úpravami je také úprava "bez úpravy", což znamená, že píšete informace o bylině, na kterou není aplikována žádná úprava. Účinků kombinace upravených bylin může být několik. Jakmile vyplníte alespoň jednu položku v sekci "účinky", objeví se ve spodní části okna nová záložka. Pod poslední záložkou je vždy připraven nový prázdný formulář pro vyplnění dalšího účinku.
7.4.
Aktualizace databáze syndromů, symptomů a bylin
Program obsahuje nástroj, díky kterému je možné exportovat databázi bylin, syndromů ~ symptomů nebo obojí do souboru a naopak importovat tento soubor zpět do programu. Toho lze využít pro aktualizaci databáze směrem od tvůrce databáze k jeho zákazníkům. Tvůrce zvolí v hlavním menu programu Soubor – Export – Byliny nebo Syndromy ~ symptomy nebo Byliny + syndromy ~ symptomy a uloží příslušnou část databáze do externího souboru. Zákazník potom zvolí Soubor – Import – Databázový soubor – provede tak import tohoto souboru a jeho databáze se aktualizuje. Aby nedocházelo ke kolizím se změnami, které si zákazník v databázi sám provedl, bude zřejmě vhodné zákazníkům úplně znemožnit editaci databáze bylin, syndromů a symptomů. Pokud v ní najdou nějakou chybu, nebo nedostatek, informují nás o tom třeba emailem a my tak budeme moci změnu provést globálně pro všechny zákazníky. Exportem a importem se přenesou pouze textové informace. Kromě exportovaného souboru je tedy nutné distribuovat také obrázky bylin (uložené ve složce Obrazky_bylin).
27
7.5.
Databáze pacientů
Obrázek 16 - databáze pacientů
V hlavním okně programu vidíme seznam pacientů. Kliknutím na konkrétního pacienta se zobrazí jeho detailní informace v pravé části okna a navíc se zpřístupní tlačítka pro možnost úpravy, smazání pacienta nebo pro zobrazení jeho zdravotní karty. Za tlačítky nový a upravit se skrývá dialogové okno, které vám umožní upravovat editovat příjmení, jméno, adresu, datum a čas narození, adresu, telefon a email pacienta. Okno, které se zobrazí po kliknutí na tlačítko zdravotní karta naopak umožňuje evidovat návštěvy pacientů a napomáhá při jejich diagnóze. Zdravotní karta je vidět na následujícím obrázku.
Obrázek 17 - zdravotní karta pacienta
28
V horní části zdravotní karty vidíte základní informace o pacientovi jako jméno, adresu atd. Ve spodní části jsou tlačítka pro přidávání, mazání a přejmenovávání problémů a návštěv pacienta. Problémy jsou reprezentovány záložkami těšně nad tlačítky a ještě o něco výše jsou záložky s návštěvami. Na obrázku vidíte pacienta Františka Vomáčku, který byl u lékaře kvůli problému "tou tong" již čtyřikrát. Občas se stane, že za čas po vyřešení problému se k vám pacient vrátí s nějakým novým problémem. Aby se nové návštěvy nemíchaly se starými, vytvoříte si pro nový problém novou záložku a pod ní vytváříte další návštěvy. Při návštěvě vyplníte anamnézu, pozorování jazyk, pohmat a pulz. Můžete také pořídit několik fotografií a přiložit je ke zdravotní kartě. Fotografie rozdělujete do několika kategorií (jazyk, kůže, vypadané vlasy, ...) abyste si potom mohli v historii obrázků vyfiltrovat například všechny obrázky jazyku. Součástí programu je i jednoduchý nástroj na ořezávání obrázků, který usnadňuje porovnání příbuzných obrázků. Oříznutím se původní obrázek nemění, takže lze kdykoliv vrátit zpět. Dále sestavíte seznam symptomů (projevů onemocnění) pacienta. Symptomy, které jsou obsaženy v textu anamnézy jsou v dialogu pro přidávání symptomů na začátku, tak abyste je nemuseli hledat. U každého symptomu rozlišujete jeho důležitost tím, že mu buď dáte nebo nedáte prioritu. Potom kliknete na tlačítko diagnóza a v novém okně se zobrazí všechny syndromy ve vazbě na symptomy, které jste vybrali ve zdravotní kartě. Okno "diagnóza" je vidět na následujícím obrázku. Nezařazené syndromy jsou seřazené primárně podle toho, zda se vážou k symptomu, kterému jste dali ve zdravotní kartě prioritu. Kliknutím na syndrom se zobrazí jeho detailní informace včetně receptů. Recepty snadno přenesete do zdravotní karty tak, že je označíte a kliknete ne tlačítko kopírovat vybraný text do zdravotní karty. Syndromy, které podle vás tvoří diagnózu pacienta přesunete do seznamu ANO. Na prvním místě v seznamu by měla být hlavní diagnóza. Po uzavření okna diagnóza se vámi vybrané syndromy objeví ve zdravotní kartě.
Obrázek 18 - pomůcka pro diagnózu pacienta
29
Pokud kliknete (nebo pomocí šipek na klávesnici najedete kurzorem) na bylinu v receptu ve zdravotní kartě nebo v pomůcce pro diagnózu pacienta, zpřístupní se tlačítko informace o bylině a po kliknutí na něj se zobrazí informace o dané bylině.
Obrázek 19 - základní informace o bylině
Na druhé záložce v okně informací o bylině je seznam všech kombinací (ne)upravených bylin, které v sobě danou bylinu obsahují. Po kliknutí na konkrétní kombinaci se zobrazí další informace.
Obrázek 20 - informace o kombinaci upravených bylin
30
8. Obsah přiloženého CD Na přiloženém CD jsou následující soubory:
index.htm – seznam souborů ve formě HTML stránky složka dokumentace
adamira.doc – tento dokument ve formátu Microsoft Word XP
adamira.pdf – tento dokument ve formátu PDF
složka spustitelné programy
AdaBylinky.exe – spustitelný program pro Windows 98 a vyšší verze.
setup.exe – instalační dávka programu
složka zdrojové texty
unDatabaze.pas – implementace databázového systému (třídy tDatabaze, tFyzickaTabulka, tRadek a další)
unDatabazeOkna.pas – třída tDatabazeOkno, kterou jsem obecně implementoval všechna dialogová okna pracující s databází
31
9. Závěr Vytvořil jsem funkční a použitelný program pro Windows (verze Windows 98 a vyšší). Program obsahuje nástroje pro editaci databáze bylin, syndromů, symptomů, a vazeb mezi nimi. Zmíněnou databázi je možné exportovat do souboru a spolu s obrázky bylin rozeslat zákazníkům, kteří si potom svoji databázi aktualizují. Program dále obsahuje agendu pacientů a jejich návštěv u lékaře. Ze zdravotní karty pacienta je přístupný nástroj, který lékaři pomůže při diagnostice pacienta. Lékař označí symptomy, nastaví jim určitou prioritu a program podle vazeb k syndromům vyhledá všechny syndromy, které by mohly tvořit diagnózu pacienta. Lékař má navíc k dispozici detailní informace o všech nalezených syndromech a snadno se dostane i k informacím o bylinách, které jsou obsažené v doporučených receptech pro léčbu syndromu. Strukturu databáze jsem diskutoval se zadavatelem. Jak tomu je u většiny softwarových projektů, ani nám se nepodařilo specifikovat všechny požadavky hned na poprvé a musel jsem několikrát měnit i strukturu databáze. Nejzajímavější částí projektu byla zřejmě tvorba specifického databázového systému. Rozhodně to nebyla zbytečná práce. Systém je řešený dostatečně obecně, aby jej bylo možné použít i v jiných projektech. Zdrojový kód v Object Pascalu jde kromě Delphi a Free Pascalu přeložit také v C++Builderu, případně, pokud bych ze svého databázového systému vytvořil DLL knihovnu, mohl bych jej použít prakticky v jakémkoliv jiném programovacím jazyce. Projekt AdaBylinky přesahuje rámec této bakalářské práce. Začal jsem na něm pracovat dlouho před svou bakalářskou prací a jelikož na něm pracuji sám, budu se mu ještě nějaký čas věnovat. S panem Luckým (zadavatelem projektu) máme ještě mnoho vizí, které bychom chtěli realizovat. Patří mezi ně například: databázový soubor obsahuje i data, která již byla dávno smazána. Není jich sice mnoho, ale stojí za zvážení možnost jakéhosi "vakuování", které provádí moderní databázové systémy. Tedy, aby se soubor čas od času pročistil. V současné chvíli k takovému procesu dochází při změně struktury databáze – původní databáze se zálohuje a databáze s novou strukturou je již "čistá". zálohování dat na výměnná média. Pokud budou obrázky pacientů velké a bude jich mnoho, může se stát, že jednoho dne dojde místo na disku a bude zapotřebí obrázky někam zálohovat. Bylo by hezké, kdyby program zálohování sám podporoval a například by věděl, na kterém médiu zálohovaná data hledat. zálohovat by se měla také databáze a to z bezpečnostních důvodů. Při poškození disku v počítači by mohlo dojít ke ztrátě dat, což je velice nepříjemné. výstup směrem k přípravě bylinných směsí a jejich administrativního zpracování. Tento výstup by sloužil k tomu, že terapeut například z Veselí nad Lužnicí napíše pro svého pacienta recept. Tento pak odešle k přípravě do Prahy, nebo Hluboké nad Vltavou, kde jsou přípravny bylin, popřípadě i jinam. Odesílání by mělo být možné online, nebo offline (zápis do databáze a hromadné odeslání po připojení k internetu), popřípadě faxem, či pouze vytisknout k odeslání poštou. výpočet ceny receptu podle ceníku, možnosti slev, ... Jak vidíte, na projektu je ještě mnoho práce a pravděpodobně se objeví řada dalších nápadů.
32