Sunteți pe pagina 1din 79

UNIVERSITATEA ALEXANDRU IOAN CUZA IAI FACULTATEA DE ECONOMIE I ADMINISTRAREA AFACERILOR SPECIALIZAREA: INFORMATIC ECONOMIC

APLICAII MOBILE

Absolvent Viorel IFTODE

2008

Cuprins
INTRODUCERE .................................................................................................................................................. 3 .NET COMPACT FRAMEWORK.............................................................................................................................. 6 MICROSOFT SQL SERVER COMPACT 3.5 ................................................................................................................ 6 SCENARIU DE APLICAIE N MEDIILE MOBILE .................................................................................................. 8 DE CE REPLICAREA DE TIP SINCRONIZARE?................................................................................................................ 9 SCENARIU ......................................................................................................................................................10 MODEL DE IMPLEMENTARE A APLICAIILOR N MEDIUL MOBIL .....................................................................11 1. CONFIGURAREA ADAPTORULUI DE REEA I A SERVERULUI IIS DE PE MAINA PE CARE SE VOR AFLA DISTRIBUITORUL I EDITORUL ...................................................................................................................................................................11 2. CONFIGURAREA DISPOZITIVELOR MOBILE (ABONAII).............................................................................................13 3. SCHEMA BAZEI DE DATE A APLICAIEI H5N1 .......................................................................................................13 4. PREGTIREA AGENTULUI SNAPHOT ....................................................................................................................15 5. PREGTIREA DIRECTORULUI SNAPSHOT...............................................................................................................16 6. REALIZAREA PUBLICAIEI BAZEI DE DATE BD_H5N1..............................................................................................16 7. SETAREA PERMISIUNILOR ................................................................................................................................21 8. REALIZAREA SNAPSHOTULUI ............................................................................................................................22 9. CONFIGURAREA SERVERULUI IIS .......................................................................................................................22 10. REALIZAREA SUBSCRIERII ...............................................................................................................................24 REALIZAREA APLICAIEI H5N1 ............................................................................................................................30 REALIZAREA CONEXIUNII CU BAZA DE DATE H5N1_MEDIC.SDF ..................................................................................34 MEDIC.VB & SINCRONIZARE.VB ...........................................................................................................................36 MPACHETAREA I DISTRIBUIREA APLICAIILOR MOBILE .........................................................................40 MODALITI DE DISTRIBUIRE A APLICAIILOR ..........................................................................................................41 MPACHETAREA I DISTRIBUIREA APLICAIEI H5N1 ...................................................................................................41 STABILIREA FIIERELOR CE ALCTUIESC APLICAIA .....................................................................................................41 REALIZAREA FIIERULUI .CAB ..............................................................................................................................42 SPECIFICAREA ACIUNILOR CE SE VOR EFECTUA N TIMPUL INSTALRII /DEZINSTALRII ........................................................48 REALIZAREA FIIERULUI .INI .................................................................................................................................49 CONCLUZII ......................................................................................................................................................52 ANEXE .............................................................................................................................................................54 ANEXA 1: MEDIC.VB.........................................................................................................................................54 ANEXA 2: SINCRONIZARE.VB ...............................................................................................................................55 ANEXA 3: AUTENTIFICARE.VB..............................................................................................................................57 ANEXA 4: APPH5N1.VB ....................................................................................................................................59 ANEXA5: CONSULTATIE.VB .................................................................................................................................62 ANEXA 6: CONDITII _INSTALARE_DEZINSTALARE.VB ..................................................................................................71 ANEXA 7: VARIANTA 1 (VARIANTA CLASIC) ...........................................................................................................73 ANEXA 8: VARIANTA 2 (VARIANTA CE FOLOSETE LINQ) ............................................................................................76 BIBLIOGRAFIE .................................................................................................................................................79

Introducere
Ritmul n care tehnologia avanseaz este suficient de rapid astfel nct aproape i determin pe unii s nu in pasul cu ea (cazul telecomunicaiilor, informaticii, autovehiculelor, etc.), alteori ritmul acesteia este lent n special n cazul tehnologiilor de vrf unde numrul specialitilor este redus (cazul medicinei, cercetrii spaiale, etc.). Paii cei mai rapizi n ultimii ani au fost fcui n domeniul telecomunicaiilor ar fi nepotrivit s notm noile tehnologii dezvoltate n ultimii cinci ani de zile (lucrarea nu i va mai atinge scopul, n plus, schimbrile aprute pot fi vazute cu ochiul liber). Telefonia mobil este cea care d tonul n ultima perioad deoarece n ziua de astzi cu ajutorul unui dispozitiv mobil poi realiza o sumedenie de operaiuni: trimiterea i recepionarea de mesaje scrise (eng. Short Message Service SMS), mesaje multimedia (eng. Multimedia Messaging Service MMS); accesarea casuei potale prin intermediul protocoalelor Post Office Protocol version 3 (POP3), Internet Message Access Protocol (IMAP), Simple Mail Transfer Protocol (SMTP); iniierea i recepionarea de apeluri telefonice Global System for Mobile Communications (GSM), Voice-over-Internet protocol (VOIP), tip teleconferin, etc.; efectuarea de fotografii n format digital; transfer de fiiere prin Universal Serial Bus (USB), Bluetooth, Wi-Fi; accesarea internetului prin intermediul GSM, Wireless Application Protocol (WAP), General Packet Radio Service (GPRS), Enhanced Data rates for GSM Evolution (EDGE), Circuit Switched Data (CSD), etc.; accesarea fiierelor multimedia (vizionarea filmelor, ascultarea melodiilor n format MP3, etc.); accesarea diferitelor aplicaii (clieni ERP, navigatori Global Positioning System GPS, dicionare, jocuri, etc.); etc. Motivul pentru care dispozitivele mobile au suferit transformri de la simple terminale de iniiere i recepionare a apelurilor telefonice i pn la terminale cu funcii suplimentare asemeni celor sus menionate, s-a datorat necesitii oamenilor de a accesa informaia oriunde i oricnd. Acest oriunde i oricnd s-a putut realiza doar prin intermediul unor dispozitive mobile de mici dimensiuni. Cu timpul cerinele n afaceri au determinat ca personalul unei companii s fie permanent conectat la business (n adevaratul sens al cuvntului nu numai s poat accesa resursele din companie atunci cnd resursa uman nu se afl fizic la sediu, ci i atunci cnd angajaii se afl n timpul liber i pot efectua operaiuni de rutin ce nu necesit un efort deosebit fapt care a determinat ca unele companii s i plteasc angajaii chiar i cnd acetia sunt plecai n vacan). n cele ce urmeaz vom ncerca s prezentm cum anume pot fi realizate aplicaii destinate dispozitivelor mobile, ce anume avem nevoie pentru crearea acestora, vom exemplifica cu un tip de aplicaie ceva mai complex, iar n finalul acestei lucrri vom puncta cteva concluzii referitoare la dezvoltarea aplicaiilor mobile pe platforma .NET. Pentru nceput inem s precizm c aplicaiile mobile se pot dezvolta pe mai multe platforme folosind diferite limbaje de programare.

Tabelul nr. 1 Scurt descriere a principalelor platforme

Platforma Java ME

Descriere Micro Edition sau Java ME ofer suportul pentru crearea aplicaiilor care ruleaz pe dispozitivele mici fr fir (telefoane mobile, asisteni digitali personali, pagere, etc.). Java ME face parte din platforma Java2, care mai cuprinde J2EE (Java 2 Enterprise Edition) i J2SE (Java 2 Standard Edition). Tehnologia Java ME (J2ME) este asemntoare cu cea J2SE, diferenele constnd n faptul c dispozitivele pentru care sunt destinate aplicaiile J2ME folosesc resurse limitate. Astfel, pentru a crea astfel de 3

Symbian

.NET Compact Framework

Palm OS

aplicaii este folosit un subset de clase din pachetele java.lang, java.io, java.util, pachete care fac parte din Java Standard Edition. n plus, pentru J2ME au fost construite dou maini virtuale: C Virtual Machine (CVM) i K Virtual Machine(KVM). Acestea ocup puin memorie i necesit mult mai puine resurse dect maina virtual pentru J2EE sau J2SE. Mediul J2ME este furnizat de ctre Sun n cadrul pachetului Java 2 Micro Edition Wireless Toolkit (J2MEWTK).1 Actualmente (la data scrierii acestei lucrri) pachetul este gsit sub denumirea Sun Java Wireless Toolkit for Connected Limited Device Configuration versiunea 2.5.2.2 Este una din cele mai perfomante platforme de dezvoltare pentru dispozitivele mobile Nokia, Fujitsu, Sony Ericsson, Motorola dispozitivele mobile ale cror sistem de operare este Symbian. Platforma cea mai rspndit actualmente este S60 (n proporie de 67%).3 Folosit n dezvoltarea aplicaiilor mobile ale cror sistem de operare este Windows Mobile. Spre deosebire de Java ME, .NET Compact Framework folosete n ntregime librrile .NET Framework (dar adaptate pentru dispozitivele mobile). Ultima versiune a fost lansat de ctre Microsoft la data de 25 Ianuarie 2008 sub numele .NET Compact Framework 3.5. Iniial sistem de operare destinat dispozitivelor mobile personal digital assistants (PDAs) actualmente deinut de catre Palm, Inc.4

Tabelul nr. 2 Evaluare comparativ a principalelor platforme

Platforma Java ME

Limbaje programare Java

Uurin nvare Medie

Emulator Gratis disponibil n kitul Sun Java Wireless Toolkit for CLDC 2.5.2 n funcie de platforma exist emulatoare ce pot fi folosite cu sau fr eforturi financiare. Disponibil odat cu IDE-ul sau gratis descrcnd gratis kitul de pe siteul companiei Microsoft. Sunt disponibile gratis doar anumite emulatoare.

IDE Eclipse, NetBeans Mobility Pack. Eclipse, Microsoft Visual Studio, NetBeans, etc. Microsoft Visual Studio 2003 / 2005 / 2008.

Costuri Gratis

Symbian

C++

Dificil

Gratis sau cu eforturi financiare n funcie de utilitarele folosite. Gratis sau cu eforturi financiare n funcie de utilitarele folosite.

.NET Compact Framework

VB.NET, C#

Medie

Palm OS

C, C++

Excelent

Eclipse.

Gratis sau cu eforturi financiare n funcie de utilitarele folosite.

1 2

tefan, T., Cristian, O., Stefan, A., Java de la 0 la expert, Editura Polirom, Iasi, 2003 pg 27-28 Sun Microsystems - http://java.sun.com/javame/downloads/index.jsp (accesat pe 07/06/2008) 3 Symbian Ltd. - http://www.s60.com/business/developers/tools?&select1=#72 (accesat pe 07/06/2008) 4 Palm, Inc. - http://www.palm.com/us/developers/ (accesat pe 07/06/2008)

Ultima versiune a sistemului de operare destinat dispozitivelor mobile i dezvoltat de ctre compania Microsoft este Windows Mobile 6.15 (lansat la data de 1 Aprilie 2008). Este un sistem de operare compact i orientat ctre zona de business i poate fi gsit sub forma a trei versiuni (n funcie de performanele hardware ale dispozitivului mobil): Windows Mobile Standard este destinat telefoanelor mobile cu funcii avansate (eng. Smartphone) precum: e-mail, mesaje text, browser internet, etc. (fiind o versiune cu mai puine funcionaliti dect Windows Mobile Classic sau Windows Mobile Professional). Windows Mobile Classic este destinat dispozitivelor smart PDA (eng. Personal Digital Assistant) ce nu ndeplinesc i funcia de telefon mobil. Spre deosebire de smartphone, aceste dispozitive au ecran senzitiv al crui rezoluie este de cel puin 240 X 320 pixeli, tastatur cu mai mult de 12 taste, procesor mult mai performant, memorie de capacitate ridicat, adaptor de reea wireless, etc. Versiunea sistemului de operare destinat acestor dispozitive ofer inclusiv facilitile Microsoft Office Mobile. Windows Mobile Professional este destinat dispozitivelor smart PDA ce indeplinesc i funcia de telefon mobil. Versiunea sistemului de operare destinat acestor dispozitive ofer toate funciile oferite de celelalte versiuni. Anterior am spus c Windows Mobile este un sistem de operare orientat ctre zona de business. Motivul pentru care am afirmat acest lucru se datoreaz n principal faptului c versiunea 6.1 ofer funcionaliti frecvent cerute n zona afacerilor: conine o versiune Office6 adaptat dispozitivelor mobile Word, Excel, PowerPoint (permite scrierea i vizualizarea de fiiere Office inclusiv cele generate cu Microsoft Office 2007); ofer faciliti de conectare la csua potal prin intermediul Outlook Mobile7 (permite inclusiv sincronizarea n timp real cu serverul de Exchange direct push); exist disponibil i o versiune Communicator Mobile8 un instant messanger cu funcii avansate; navigare internet cu ajutorul unei versiuni a Internet Explorer9; player de coninut multimedia Microsoft Media Player Mobile10; agend ce poate fi sincronizat cu clientul Outlook de pe calculatorul personal; ofer posibilitatea conectrii la distan Remote Desktop; compatibil WEB 2.0; are preinstalat unui sistem de gestiune a bazelor de date ct i versiunea 2.0 a Microsoft Compact Framework; prin intermediul System Center Mobile Device Manager 200811 permite personalului IT s gestioneze n mod centralizat dispozitivele mobile i s le integreze n Active Directory (oferind chiar faciliti de implementare de politici de securitate); etc.;

Dezvoltarea de aplicaii pentru dispozitivele mobile ale cror sistem de operare este Windows Mobile poate fi fcut folosind limbajul nativ C++ sau limbajele C# i VB.NET care sunt gestionate de maina virtual Common Language Runtime (CLR). Spre deosebire de aplicaiile scrise folosind C++, aplicaiile dezvoltate prin intermediul C# i VB.NET sunt mai uor de scris i pot fi realizate ntr-un timp mai scurt deoarece programatorii nu vor mai trebui s trateze neaparat aspecte privind managementul memoriei (eng. memory management), managementul firelor de execuie
5 6

Microsoft - http://www.microsoft.com/Windowsmobile/default.mspx (accesat pe 07/06/2008) Microsoft - http://www.microsoft.com/windowsmobile/software/officemobile.mspx (accesat pe 07/06/2008) 7 Microsoft - http://www.microsoft.com/windowsmobile/software/outlookmobile.mspx (accesat pe 07/06/2008) 8 Microsoft - http://office.microsoft.com/en-us/communicator/HA102027021033.aspx (accesat pe 07/06/2008) 9 Microsoft - http://www.microsoft.com/windowsmobile/software/iemobile.mspx (accesat pe 07/06/2008) 10 Microsoft - http://www.microsoft.com/windowsmobile/software/mediaplayer.mspx (accesat pe 07/06/2008) 11 Microsoft - http://www.microsoft.com/windowsmobile/mobiledevicemanager/default.mspx (accesat pe 07/06/2008)

(eng. thread management), colectorul de gunoaie (eng. garbage collection), etc. Aplicaiile scrise n C# i VB.NET la momentul compilrii lor vor fi convertite ntr-un limbaj intermediar low-level Common Intermediate Language (CIL). La momentul execuiei aplicaiilor, maina virtual CLR va converti codul CIL (prin intermediul compilatorului just-in-time eng. JIT) n cod nativ ce va fi ulterior interpretat de procesor. Deoarece este nevoie de compilarea codului CIL la execuia aplicaiei, aplicaiile ce se folosesc de maina virtual CLR vor fi mai lente dect aplicaiile scrise n cod C++. n cazul dispozitivelor mobile, indicat ar fi scrierea aplicaiilor folosind C++ deoarece aceste dispozitive de mici dimensiuni nu au posibilitatea de a oferi performane hardware considerabile, dar n funcie de timpul pus la dispoziie pentru dezvoltarea unei aplicaii, de nivelul de cunotine i experiena cu limbajul de programare C++ pe care o au programatorii, de complexitatea aplicaiei, etc. se poate alege i varianta n care la execuia unei aplicaii va fi folosit maina virtual CLR.

.NET Compact Framework


.NET Compact Framework12 este o versiune adaptat pentru dispozitivele mobile a .NET Framework. Folosete aceeai structur de clase ca i versiunea destinat calculatoarelor, cu meniunea c la versiunea destinat dispozitivelor mobile unele metode i proprieti au fost eliminate (din criterii de performan) i au fost adugate un set de clase specifice pentru controlarea / gestiunea device-urilor. Trebuie amintit faptul c aplicaiile smart dezvoltate n oricare limbaj de programare .NET, pentru a putea fi funcionale trebuiesc a fi executate de pe un dispozitiv care n prealabil are instalat framework-ul .NET (corespunztor versiunii sub care acestea au fost dezvoltate). Versiunile Windows Mobile anterioare (5.0 / 2003 SE / 2003 / etc.) nu aveau preinstalat componenta .NET, dar pentru c numrul de aplicaii destinate dispozitivelor Windows Mobile a crescut i pentru a uura etapa de deployment, Microsoft a inclus n mod implicit Compact Framework n versiunile Windows Mobile 6.0 i 6.1. Actualmente .NET Compact Framework se afl la versiunea 3.5, dar schimbrile eseniale s-au fcut odat cu trecere la versiunea 2.0 (lansat n Octombrie 2005).

Microsoft SQL Server Compact 3.5


Microsoft SQL Server Compact 3.513 este cel mai nou sistem de gestiune a bazelor de date relaionale, produs de ctre Microsoft i destinat dezvoltrii de aplicaii desktop ct i pentru dispozitivele mobile (Pocket PC, Smartphone). Trebuie s reinem faptul c SQL Server Compact 3.5 nu ofer o funcionalitate att de puternic precum SQL Server 2005 sau SQL Server 2008. Este o versiune mai simpl, dar care ofer multe faciliti: baza de date SQL Server Compact Edition este ncapsulat ntr-un singur fiier, acest lucru facilitnd instalarea uoar a aplicaiilor prin simpla copiere dintr-un loc n altul (fa de alte SGBD-uri care necesit export/import de date); SQL Compact Edition ofer posibilitatea criptrii bazei de date. Nu doar protejeaz accesul la date prin intermediul unei parole, ci i ntreg coninutul bazei de date este criptat prin algoritmul RSA pe 128 bii, iar n cazul n care baza de date ajunge pe mini nepotrivite, slabe sunt ansele ca datele s fie descifrate; dimensiunea unei baze de date poate atinge maxim 4GB (n viitorul apropiat, cu siguran va dispare aceast limitare); integritate referenial deplin (permite inclusiv actualizri n cascad); ACID Atomicitate, Consisten, Izolare, Durabilitate (suport tranzacional);
12 13

Microsoft - http://msdn.microsoft.com/en-us/netframework/aa497273.aspx Microsoft - http://www.microsoft.com/sql/editions/compact/default.mspx

se instaleaz uor att pe desktop ct i pe dispozitivele mobile; folosete tehnologia ADO.NET n implementare; suport replicarea datelor; etc.;

Pentru a putea dezvolta aplicaii care s ruleze pe dispozitivele mobile (Smartphone, Pocket PC, etc., ale cror sistem de operare este una din versiunile Microsoft Windows Mobile) este necesar a instala pachetul Microsoft Visual Studio. Varianta Visual Studio ideal pentru dezvoltare este Microsoft Visual Studio 2008 Professional Edition14. Din fericire, aceast variant poate fi descrcat gratuit (n versiune trial) de pe site-ul Microsoft.

14

Microsoft - http://msdn.microsoft.com/en-us/vstudio/products/aa700831.aspx

Scenariu de aplicaie n mediile mobile


O baz de date distribuit reprezint o colecie de date integrate din punct de vedere logic, dar care sunt distribuite pe mai multe platforme conectate printr-o reea. Replicarea este un proces prin care serverul de baze de date este responsabil a actualiza i pstra datele aflate pe mai multe servere (copii / transferuri de nregistrri i obiecte ale bazei de date). n anumite cazuri, replicarea poate duce la o cretere a performanelor i a disponibilitii datelor pentru aplicaii. Principalul dezavantaj al sistemelor centralizate, l reprezint ntreruperea funcionalitii aplicaiilor n cazul apariiei unor disfuncionaliti la nivelul serverului, pe cnd, sistemele distribuite prin intermediul replicrii pot: pstra copii ale acelorai date pe mai multe maini de lucru (astfel aplicaiile vor putea accesa o baz de date local mult mai repede dect pot accesa datele unei baze de date aflate pe un server ndeprtat); efectua operaii complexe ce necesit citiri i prelucrri ndelungate, dar care nu afecteaz performanele ntregului sistem; mbunti timpii de citire / prelucrare a datelor; permite lucrul cu datele bazei de date n mod deconectat, iar la cerere i n cazul n care se poate accesa canalul de comunicaie, se vor actualiza posibilele modificri aprute. Microsoft SQL Server suport mai multe tipuri de replicri15: replicarea snapshot; replicarea tranzacional; replicarea de tip sincronizare (eng. merge replication). Dintre aceste trei tipuri de replicare a datelor, doar replicarea sincronizat (eng. merge replication) este compatibil i cu Microsoft SQL Server Compact Edition. nainte de a trece mai departe n a descrie modul de configurare i utilizare a replicrii de tip merge ntr-o aplicaie destinat dispozitivelor smart, este necesar a cunoate civa termeni frecvent folosii pe parcursul acestei lucrri. Editorul (eng. Publisher) server de baze de date ce poate avea una sau mai multe publicaii ale crui principale roluri sunt de a permite efectuarea replicrii cu alte servere i de a identifica i salva modificrile aprute. Abonatul (eng. Subscriber) server de baze de date care primete date (pentru care s-a facut subscriere i care au fost transmise de editor ca urmare a procesului de replicare). Distribuitorul (eng. Distributor) serverul care administreaz fluxul de date al procesului de replicare (distribuie i stocheaz modificrile datelor). Articol (eng. Article) o colecie de date (o tabel; o poriune dintr-o tabel: anumite coloane, anumite nregistrri; etc.). Publicaie (eng. Publication) set de articole ce se doresc a fi replicate. Subscriere (eng. Subcription) solicitarea efecturii de copii a datelor i obiectelor ce se doresc a fi replicate. Instantaneu (eng. Snapshot) imaginea parial sau integral a coninutului bazei de date la un moment dat. Agentul snapshot cel ce pregtete instantaneul (snapshotul), respectiv fiierele surs ale bazei de date (fiiere ce sunt salvate ntr-un folder snapshot aflat la distribuitor). De fiecare dat cnd agentul snapshot este pornit, automat el va verifica modificrile aprute i va genera fiierele surs a bazei de date (.sch scheme, .dri constrngeri i indeci, .trg declanatoare, .sys tabele cu date sistem, .cft conflicte ntre tabele, .bcp date). Agentul de distribuie cel ce pstreaz istoricul i statisticile replicrilor efectuate. Agentul de sincronizare (eng. merge agent) cel ce aplic instantaneul (snapshotul) precum i modificrile aprute la abonat sau editor.
15

Microsoft - http://msdn.microsoft.com/en-us/library/ms151198.aspx

Baz date distribuie (eng. Distribution database) baz de date sistem folosit doar pentru replicare i care nu conine alte tabele utilizator (are rolul de a pstra tranzaciile efectuate pn cnd acestea sunt propagate ctre destinatari).

De ce replicarea de tip sincronizare?


Replicarea sincronizat 16 (eng. merge replication) este replicarea ce permite efectuarea sincronizrii dintre un abonat i un editor, atunci cnd acetia pot comunica prin intermediul unei reele, fiind permis realizarea unor schimburi de date n ambele sensuri. Acest tip de replicare este recomandat a fi folosit n urmtoarele situaii: mai muli abonai pot efectua multiple actualizri asupra datelor, iar schimbrile aprute vor putea fi propagate ctre editor (astfel fiind posibil ca i ali abonai s poat vedea modificrile survenite); abonaii pot efectua modificri asupra datelor n mod deconectat, ulterior efectundu-se sincronizarea cu editorul pentru a propaga schimbrile ctre acesta; abonaii pot obine date filtrate; n procesul de sincronizare vor fi transmise modificrile nete (dac o nregistrare se modific de n ori la abonat nainte de a se efectua sincronizarea, nregistrarea va fi modificat o singur dat la editor n momentul n care sunt propagate schimbrile). Agentul snapshot i agentul de sincronizare vor implementa replicarea de tip sincronizare. Implicit agentul snapshot analizeaz fiierele din folderul snapshot, iar n anumite condiii intervine prin a efectua schimbri la nivelul lor. Este foarte important ca agentul snapshot s actualizeze respectivele fiiere, deoarece n funcie de coninutul lor va fi revizuit i schema bazei de date a abonatului. Agentul de sincronizare va aplica snapshotul asupra abonatului (abonatul trebuie s aib aceai schem a bazei de date ca i editorul) i va propaga modificrile ce apar la editor i la abonat. Agentul de distribuie n cazul replicrii de tip sincronizare are rolul de a pstra istoricul i statisticile replicrilor efectuate.
APLICAIE CLIENT APLICAIE CLIENT

REPLICAREA MERGE NCEPE PRIN A GENERA I APLICA INSTANTANEUL (SNAPSHOT).

EDITOR

ABONAT

MODIFICRI ALE DATELOR

MODIFICRI ALE DATELOR

AGENT MERGE DISTRIBUITOR

ISTORIC DATE

BAZ DATE DISTRIBUIE

Figur 1 Arhitectura general a replicrii de tip sincronizare (eng. Merge Replication)

(Surs: http://msdn2.microsoft.com/en-us/library/ms151329.aspx) n continuare prezentm un posibil scenariu ce ar solicita replicarea datelor aflate pe dispozitive mobile.
16

Microsoft - http://msdn.microsoft.com/en-us/library/ms151329.aspx

Scenariu
Gripa aviar face s planeze ameninarea unei pandemii greu de controlat cu mijloace actuale de protecie. Exist dou posibiliti prin care H5N1 ar putea provoca milioane de victime ntr-un timp scurt. Primul implic ipoteza ca virusul gripei aviare s se combine cu cel al gripei umane, astfel noul virus putndu-se transmite precum gripa umana, dar cu efectele gripei aviare. A doua posibilitate ar fi ca H5N1 s sufere o mutaie spontan prin care s se transmit direct de la om la om. Avnd n vedere c din totalul persoanelor infectate (cei care au intrat n contact cu animale bolnave), jumtate au decedat, o posibil pandemie de grip, ar fi de temut dac virusul H5N1 al gripei aviare s-ar adapta la om. Potrivit Organizaiei Mondiale a Sntii, o pandemie ar putea face pn la o sut de milioane mori. Virusul gripei aviare se manifest la om ntr-un mod mult mai grav dect cel al gripei umane. Debutul este brutal, violent, cu simptome de febr ridicat (39-40 grade Celsius), frisoane, dureri de cap, de gt, mialgii (dureri musculare), astenie i nas nfundat. Dup cteva zile de la instalarea acestor semne, apare o tuse seac, iritant. Aceste manifestri apar i n cazul gripei umane, ns principala diferen ntre cele dou tipuri de grip (uman i aviar) o reprezint insuficiena respiratorie (pacientul simte ca nu mai poate respira i are dureri n piept). La gripa aviar, senzaia de sufocare este determinat de instalarea unei pneumonii virale (plmnul se ncarc cu lichid, care nu mai permite transferul de gaze). Avnd n vedere c boala evolueaz foarte rapid (aproximativ zece zile) i se poate transmite relativ uor, este de importan vital s se transmit ntr-un timp ct mai scurt toate datele care sugereaz infecia cu virusul gripei aviare, n aa fel nct specialitii s se poat pronuna ct mai precoce n privina diagnosticului i a instaurrii carantinei. Un posibil ajutor oferit de ctre noile tehnologii, ar fi, ca medicii s se deplaseze n diferite zone cu risc crescut de epidemie i s culeag date referitoare la pacienii crora le vor efectua consultaii medicale. Datele despre pacieni vor fi completate i salvate n baze de date Microsoft SQL Server Compact Edition (.sdf), prin intermediul formularului aplicaiei H5N1, iar la anumite intervale de timp modificrile vor fi transmise prin intermediul tehnologiilor de comunicaie fr fir (ex: GPRS), ctre un centru de colectare (baz de date Microsoft SQL Sever .mdf). Principalele avantaje al unei asemenea arhitecturi sunt date de: posibilitatea lucrului n mod deconectat, transmiterea rapid a datelor, precum i luarea unor decizii n intervale scurte de timp de ctre specialiti.
Editor + Distribuitor

IIS

Abonai

Figur 2 Arhitectura propus pentru realizarea aplicaiei H5N1

nainte de a trece efectiv la partea de implementare a aplicaiei H5N1, este necesar a pregti (configura) canalele de comunicaie prin intermediul crora vor putea fi replicate datele aflate la abonai i editor. 10

Model de implementare a aplicaiilor n mediul mobil


1. Configurarea adaptorului de reea i a serverului IIS de pe maina pe care se vor afla distribuitorul i editorul
Pentru a ne asigura de reuita implementrii aplicaiei prezentate pe parcursul acestui capitol, indiferent dac exista, sau nu, un adaptor de reea instalat pe maina local, trebuie instalat un adaptor de loopback (mesajele sunt transmise i recepionate printr-un singur canal de comunicaie): se accesez panoul de control (Control Panel) i se alege modul de vizualizare clasic; se face dublu click pe Add Hardware, apoi se apas butonul Next; din captul listei Installed Hardware se va selectea Add a new harware device, apoi se va apsa butonul Next; se alege opiunea Install the hardware that I manually selected from list (Advanced); din lista Common hardware types se va selectea Network Adapters; din zona Manufacturer se va alege Microsoft, iar din zona Network Adapter click pe Microsoft Loopback Adapter, apoi se apas butonul Next; se apas butonul Next pentru a efectua instalarea; click pe Finish pentru a finaliza instalarea. Configurarea adaptorului (setarea adresei IP): din panoul de control (Control Panel) se va selecta Network Connections, urmnd a configura Local Area Connection (click dreapta Properties); din zona This connection uses the following items se va selecta Internet Protocol (TCP/IP) i apoi click pe Properties; se va seta adresa IP (IP address: 192.168.0.1; Subnet Mask: 255.255.255.0).

Figur 3 Setrile adaptorului de reea

11

Pentru a verifica corectitudinea setrilor efectuate se va testa din consola Windows comanda ping 192.168.0.1. Rezultatul ar trebui s fie asemntor cu cel din imaginea alturat.

Figur 4 Verificarea configurrii adaptorului de reea

Crearea paginii principale a serverului IIS: Folosind editorul de texte Notepad se va realiza urmtoarea pagina web:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Pagina implicita!</title> </head> <body> <h1 align="center">Va rugam sa reveniti!</h1> </body> </html>

Fiierul va fi salvat n calea Home Directory a serverului IIS (%homedrive%\Inetpub\wwwroot), dndu-i denumirea index.htm (File - Save As - index.htm). Prin intermediul browserului se va verifica rezultatul obinut accesnd adresa http://192.168.0.1.

Figur 5 Noua pagin principal a serverului IIS

12

Pentru a efectua setri suplimentare serverului IIS: se va accesa panoul de control (Control Panel) i se va alege modul de vizualizare clasic; se va deschide consola Administrative Tools i Internet Information Services; din structura arborescent se va selecta Default Web Site (click dreapta Properties).

2. Configurarea dispozitivelor mobile (abonaii)


Device Emulator Manager (Start - All programs - Microsoft Device Emulator 2.0 Preview), se acceseaz Windows Mobile 5.0 Pocket PC VGA Emulator i se va efectua operaiunea de conectare prin apsarea butonului Connect; dup ce a fost pornit emulatorul, se vor accesa proprietile acestuia (File - Configure...), alegnd cadrul de pagina Network i activnd NE2000 PCMCIA network adapter and bind to; din list se va alege adaptorul de reea existent pe maina de lucru (Microsoft Loopback Adaptor - Virtual Machine Network Services Driver n cazul n care a fost instalat adaptorul loopback); de pe dispozitivul Pocket PC se va accesa Network Cards (Start - Settings - Connections); din combobox-ul My network card connects to, se va alege opiunea The Internet; se acceseaz NE2000 Compact Ethernet Driver i se configureaz adaptorul prin intermediul cruia dispozitivul Pocket PC va putea comunica cu maina pe care este instalat serverul de baze de date Microsoft SQL Server (IP address: 192.168.0.2; Subnet mask: 255.255.255.0);

Figur 6 Adresa IP a abonatului

dup ce s-a configurat adaptorul, trebuie reefectauat operaiunea de conectare cu adaptorul de reea (File - Configure... - Network). Pentru a verifica dac setarile au fost corect efectuate, de pe dispozitivul Pocket PC se va deschide Internet Explorer i se va accesa adresa http://192.168.0.1 (rezultatul const n afiarea paginii principale gzduit pe serverul IIS cu adresa IP 192.168.0.1).

3. Schema bazei de date a aplicaiei H5N1


Dei am fi putut aduce baza de date a aplicaiei H5N1, la o form care s permit o flexibilitate ridicat, am decis a simplifica pe ct posibil lucrurile i propunem ca schema bazei de date BD_H5N1 s fie alctuit din dou tabele (MEDICI are rolul de a pstra date referitoare la medicii care vor efectua consultaii pacienilor; ANAMNEZA va reine date privind pacienii i consultaia efectuat lor).

13

Figur 7 Schema bazei de date a aplicaiei H5N1

Pentru nceput, se va deschide SQL Server Management Studio (Start All Programs Microsoft SQL Server 2005), iar din fereastra Connect to Server pentru Server Type se va alege opiunea Database Engine.

Figur 8 Autentificarea la serverul de baze de date Microsoft SQL Server 2005

Din meniul File New, se va selecta Query with Current Connection pentru a deschide o nou fereastr prin intermediul creia vor putea fi transmise fraze SQL ctre SGBD. Urmtoarele secvene de cod au ca rezultat generarea bazei de date BD_H5N1.
CREATE DATABASE BD_H5N1 GO

14

USE BD_H5N1 GO CREATE TABLE MEDICI ( cod_medic INTEGER IDENTITY NOT NULL PRIMARY KEY, nume_prenume_medic NVARCHAR(25) NOT NULL, nume_cont NVARCHAR(10) NOT NULL CONSTRAINT UK_nume_cont UNIQUE, parola_cont NVARCHAR(10) NOT NULL, adresa_contact NVARCHAR(50) NOT NULL, telefon_contact NVARCHAR(10) NOT NULL ) GO CREATE TABLE ANAMNEZA ( cod_pacient INTEGER IDENTITY NOT NULL, cod_medic INTEGER NOT NULL, nume_prenume_pacient NVARCHAR(25) NOT NULL, adresa NVARCHAR(50), telefon NVARCHAR(10), varsta TINYINT NOT NULL, mediu_urban_rural BIT NOT NULL DEFAULT 1, nr_zile_apar_simpt TINYINT NOT NULL DEFAULT 0, temperatura NUMERIC(3,1) NOT NULL DEFAULT 36.5, dureri_de_cap BIT NOT NULL DEFAULT 0, dureri_de_gat BIT NOT NULL DEFAULT 0, dureri_musculare BIT NOT NULL DEFAULT 0, nas_infundat BIT NOT NULL DEFAULT 0, conjunctivita BIT NOT NULL DEFAULT 0, tuse BIT NOT NULL DEFAULT 0, senzatie_de_sufocare BIT NOT NULL DEFAULT 0, insuficienta_respiratorie BIT NOT NULL DEFAULT 0, contact_animale BIT NOT NULL DEFAULT 0, informatii_suplimentare NTEXT, data_consult DATETIME NOT NULL DEFAULT GETDATE(), CONSTRAINT pk_anamneza PRIMARY KEY (cod_pacient,cod_medic), CONSTRAINT fk_anamneza_medici FOREIGN KEY (cod_medic) REFERENCES MEDICI(cod_medic) ON UPDATE CASCADE ON DELETE NO ACTION ) GO

Dup crearea bazei de date, urmeaz etapa prin care se va popula tabela MEDICI cu nregistrri.
INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Abramovici Cristian','acristian','acristian','Str. M.Eminescu, nr.42','0780111111') GO INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Marinescu Loredana','mloredana','mloredana','Str. I.L.Caragiale, nr.1','0780111112') GO INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Simion Laura','slaura','slaura','Str. Stefan Cel Mare, nr. 22','0780111110') GO

4. Pregtirea agentului snaphot


Se va deschide panoul de control (Control Panel) i se va alege modul de vizualizare clasic; Se va accesa Computer Management aflat n directorul sistem Administrative Tools; creai un nou utilizator accesnd System Tools Local Users and Groups Users: Cmp Valoare User name: agent_snapshot 15

Password: Confirm Password: User must change password at next logon Password never expires

Abc_123 Abc_123 deselectat selectat

5. Pregtirea directorului snapshot


Se va deschide Windows Explorer, apoi din meniul Tools Folder Options... View, se va deselecta opiunea Use simple file sharing; Se va realiza un nou director cu denumirea director_snapshot (ex: %SystemDrive%\director_snapshot); Noul directorul creat va fi partajat - Sharing and Security...; Se va selecta Share this folder, apoi vor fi setate permisiunile (Permissions); Se va apsa butonul Add iar n zona Enter the object name to select se va introduce agentul snapshot computername\agent_snapshot (unde computername se va nlocui cu denumirea staiei locale, denumire ce poate fi aflat apelnd comanda echo %computername% din consola Windows); Pentru utilizatorul agent_snapshot trebuiesc setate permisiunile Change i Read; n cadrul de pagina Security se va aduga utilizatorul agent_snapshot i i vor fi atribuite permisiunile Read & Execute, List Folder Contents, Read i Write; Se va apsa butonul OK pentru a permanentiza setrile.

6. Realizarea publicaiei bazei de date BD_H5N1


Se va reveni n zona Object Explorer a SQL Server Management Studio: Din structura arborescent se va selecta Replication iar din meniul contextual se va alege crearea unei noi publicaii (New Publication). Se va apsa pe butonul Next din cadrul primei ferestre a wizard-ului;

Figur 9 Wizard-ul folosit pentru realizarea publicaiei bazei de date BD_H5N1

n cazul n care aceasta este prima publicaie realizat, wizard-ul va cere s i fie specificat serverul ce se va comporta ca Distribuitor. Se va selecta prima opiune pentru a alege serverul local.

16

Figur 10 Specificarea serverului de baze de date care se va comporta ca Distribuitor

n urmtoarea fereastr va trebui tastat adresa UNC a folderului snapshot (\\computername\director_snapshot - unde computername va fi nlocuit cu denumirea staiei locale). Urmtorul pas const n a selecta baza de date ce se dorete a fi publicat - BD_H5N1. Aa cum am spus i la nceputul capitolului, replicarea de tip sincronizare este singurul tip de replicare la care Microsoft Server Compact Edition poate subscrie. Se va selecta Merge replication apoi se va face click pe Next. Dintre tipurile de abonai ce vor efectua sincronizri, vom alege doar Microsoft Server Compact Edition (se va alege opiunea SQL Server 2005 Compact Edition).

17

Urmtorul pas ce trebuie efectuat const n a selecta articolele ce se doresc a fi publicate (ANAMNEZA i MEDICI).

Figur 11 Selectarea articolelor ce se doresc a fi publicate

Toate articolele ce vor fi publicate necesit existena unei coloane de tip UNIQUEINDENTIFIER. Noua fereastr a wizard-ului informeaz faptul c acest tip de coloan va fi adugat pentru cele dou tabele ce vor fi publicate. Tipul de date UNIQUEIDENTIFIER ocup un spaiu de 16 octei per valoare i de obicei opereaz cu identificatori globali unici (eng. Globally Unique Indetifiers GUIDs). Un GUID este un numr binar unic (nuciun alt calculator din lume nu va genera un duplicat al unei valori GUID), tocmai de aceea este excelent ca acest tip de date s fie folosit n cazul bazelor de date distribuite, pentru a fi folosit drept cheie primar. O valoare GUID poate fi obinut prin dou metode: o folosind funcia NEWID() n acest caz, cel ce va genera identificatorul global unic este SGBD-ul. o folosind funciile API generatorul identificatorului global unic este dat de aplicaia client. GUID este o valoare generat pe baza numrului unic de indentificare a adaptorului de reea i a numrului unic al procesorului. O tabel a unei baze de date poate conine mai multe coloane de tip UNIQUEIDENTIFIER, ns este acceptat ca doar o singur coloan din acest tip de date s aib setat proprietatea ROWGUIDCOL. n cazul replicrii de tip sincronizare, valorile atributelor de tip UNIQUEIDENTIFIER sunt cele care asigur unicitatea nregisitrrilor i permit copierea de date de la abonat la editor (i viceversa), fr a exista posibilitatea aducerii bazei de date n stare de inconsisten. Principalele dezavantaje ale tipului de date UNIQUEIDENTIFIER sunt: o valorile sunt lungi, lipsite de neles, generate aleator; o valorile ocup un spaiu de stocare mult mai mare dect valorile tipurilor numerice; 18

operaiile ce necesit lucrul cu indexurile atributelor de tip UNIQUEIDENTIFIER sunt mai lente; o etc. Pasul Filter Table Rows permite dezvoltatorului efectuarea unor filtre pe baza crora abonaii vor primi de la editor doar nregistrrile care le sunt exclusiv adresate lor. o

Figur 12 Fereastr a wizard-ului prin intermediul creia se pot realiza filtre asupra articolelor publicate

n cazul n care nu s-ar aplica filtre, un medic de fiecare dat cnd va cere realizarea sincronizrii cu editorul ar descrca ntregul coninut al tabelei MEDICI (respectiv toi pacienii consultai, inclusiv pacienii consultai de colegii lui), fapt care duce la o ncrcare inutil a bazei de date aflate pe dispozitivul smart al medicului, costuri ridicate privind comunicaiile, ncetinirea aplicaiei pe msur ce numrul pacienilor consultai va crete, etc. Folosind filtrele, operaia de sincronizare va trimite ctre dispozitivul smart Windows Mobile aflat n poseseia medicului, doar nregistrrile cu privire la pacienii consultai de el. n cazul nostru filtrarea nregistrrilor se va realiza pe baza numelui utilizatorului prin care se realizeaz autentificarea la serverul SQL (se poate obine folosind funcia SUSER_SNAME()). Interesul nostru este de a realiza filtrarea doar pe tabela ANAMNEZA pe baza condiiei cod_medic=(SELECT cod_medic FROM MEDICI WHERE nume_cont=SUSER_SNAME()). Vom apsa butonul Add i alegem opiunea Add Filter..., selectm tabela ANAMNEZA, iar n seciunea Filter statement se va completa condiia de filtrare.

19

Figur 13 Condiia de filtrare a datelor tabelei ANAMNEZA

Totui de ce nu efectum filtrri i pe tabela MEDICI? o Numrul medicilor este cu mult mai mic dect numrul pacienilor, iar efectuarea filtrrii datelor pe tabele cu un numr mic de nregistrri nu ar mbuntii cu mult performanele aplicaiei. o Medicii pot schimba dispozitivele smart Windows Mobile ntre ei (efectueaz consultaii pe schimburi de lucru), aadar este necesar ca la autentificarea n aplicaia H5N1, pe dispozitivul smart s existe toate datele cu privire la conturile medicilor. o Apariia unui medic nou n cadrul echipelor de consultaii va nsemna realizarea unui nou cont de access la aplicaie (operaie ce se va realiza la editor), iar respectivul medic va avea posibilitatea s se autentifice pe oricare din dispozitivele smart disponibile (nu nainte de a efectua sincronizarea cu editorul). o etc. Urmtorul pas al wizard-ului (Snapshot Agent) permite setarea realizrii snapshotului precum i a frecvenei cu care agentul snapshot va fi activat. Se vor alege ambele opiuni Create a snapshot immediately, respectiv Schedule the Snapshot Agent to run at the following times apoi se va apsa butonul Next. Din fereastra de dialog Agent Security vom face click pe Security Settings... o Se va alege opiunea Run under the following Windows account: Cmp Valoare Process account: computername\agent_snapshot17 Password: Abc_123 Confirm Password: Abc_123

17

computername va fi nlocuit cu denumirea staiei locale

20

Ca i modalitate de conectare la editor alegem By impersonating the process account. La urmtorul pas al wizard-ului se va alege opiunea Create the publication. Atribuim publicaiei denumirea PUBLICATIE_H5N1 i cerem finalizarea wizard-ului prin apsarea butonului Finish. Dup generarea publicaiei de ctre wizard, se va apsa butonul Close. o

7. Setarea permisiunilor
Este necesar pentru a se realiza sincronizarea dintre editor i abonat, s stabilim permisiunile de access pentru: Agentul snapshot; Agentul IIS; Medici (pentru fiecare medic se va crea un cont de acces, datele conturilor de acces vor coincide cu datele aflate n tabela MEDICI); Revenim n zona Object Explorer a SQL Server Management Studio, iar din meniul contextual Security se va alege crearea unui nou cont de acces (New Login...). Agentul snapshot: o Din fereastra de dialog pentru crearea conturilor de acces se va selecta Windows Authentication apoi click stnga pe butonul Search...; o Din zona Enter the object name to select se va completa computername\agent_snapshot (unde computername va fi nlocuit cu denumirea staiei locale) se va apsa butonul Check Names pentru a verifica corectitudinea datelor introduse, apoi click stnga pe butonul OK. o Din panoul de navigaie se va face click pe User Mapping, iar din lista de baze de date disponibil vom selecta distribution i BD_H5N1 (pentru fiecare baz de date n parte se va alege rolul db_owner).

Figur 14 Crearea i setarea permisiunilor contului agentului snapshot

Se va apsa butonul OK pentru a genera contul de acces.

21

Agentul IIS: o Paii sunt asemntori cu cei parcuri n crearea contului agentului snapshot, doar c n zona Enter the object name to select se va completa computername\IUSR_computername (unde computername va fi nlocuit cu denumirea staiei locale), iar pentru cele dou baze de date (distribution i BD_H5N1) nu se va mai alege rolul db_owner. Medici (se vor completa cu datele din tabela MEDICI): o Din fereastra de dialog pentru crearea conturilor de acces se va selecta SQL Server Authentication, apoi se va completa formularul conform specificaiilor din tabelul urmtor: Cmp Valoare Login name: acristian Password: acristian Confirm Password: acristian Enforce password policy deselecat o Din panoul de navigaie vom face click pe User Mapping, iar din lista de baze de date disponibil se va selecta distribution i BD_H5N1 (iar pentru fiecare baz de date n parte se va alege rolul db_owner). o Pentru a genera contul de acces se va apsa butonul OK. Din fereastra de proprieti a publicaiei (din zona Object Explorer a SQL Server Management Studio, parcurgem structura arborescet pn la publicaia PUBLICATIE_H5N1, click dreapta Properties), selectm din panoul de navigaie Publication Access List i folosind butonul Add vom aduga toate conturile nou create (agentul snapshot, agentul IIS, conturile medicilor).

8. Realizarea snapshotului
Revenim n zona Object Explorer a SQL Server Management Studio i parcurgem structura arborescet pn la publicaia PUBLICATIE_H5N1, accesm View Snapshot Agent Status (click dreapta pe publicaie iar din meniul contextual se va alege View Snapshot Agent Status). n noua fereastr vom apsa butonul Start pentru a genera snapshotul. La final trebuie sa ne asigurm c instantaneul a fost generat n totalitate.

9. Configurarea serverului IIS


Dup ce s-a creat publicaia, s-au setat permisiunile de acces i a fost generat instantaneul, va trebui configurat serverul IIS pentru a permite comunicarea serverelor SQL Compact Edition cu serverul SQL 2005. Spre a uura ct mai mult lucrurile, pentru configurarea serverului IIS exist un wizard ce poate fi accesat din meniul contextual al publicaiei PUBLICATIE_H5N1 (opiunea Configure Web Synchronization...):

Figur 15 Configurarea serverului web pentru a permite realizarea sincronizrii dintre abonai i editor

22

La apariia primei ferestre a wizard-ului se va apsa butonul Next. n cel de-al doilea pas (Subscriber Type) se va alege opiunea SQL Server Compact Edition. Pentru pasul Web Server se va specifica denumirea mainii pe care este instalat serverul IIS (implicit completat de ctre wizard) i vom alege opiunea Create a new virtual directory. n cazul n care suntem ntmpinati de o csu de mesaj asemntoare cu cea din imaginea alturat, nseamn ca nu am instalat SQL Server Compact Edition server components. Rezolvarea acestei probleme se va face prin accesarea butonului Yes al acestui mesaj de atenionare determin instalarea SQL Server Compact Edition server components.

Figur 16 Mesajul afiat n cazul n care nu ai instalat SQL Server Compact Edition server components

Finalizarea pasului Web Server se realizeaz prin selectarea Default Web Site (cruia i va fi adugat un director virtual).

Figur 17 Configurarea serverului web pentru a permite realizarea sincronizrii dintre abonai i editor

Pasul Virtual Directory Information presupune completarea casetei de text Alias cu denumirea ce se dorete a fi dat directorului virtual (ex: H5N1). Cel mai probabil, dup apsarea butonului Next vom fi ntmpinai de dou casete de mesaj (o caset de mesaj prin 23

care suntem informai c directorul cu denumirea menionat n caseta de text alias nu exist, i cea dea doua caset de mesaj, prin care suntem informai de efectuarea unei copii i a unei nregistrrii a agentului SQL Server Compact Edition). Urmtorul pas (Secure Communications) presupune specificarea tipului de mediu de comunicaie dintre abonat i serverul IIS (folosirea unui canal de comunicaie securizat sau nesecurizat). Deoarece nu ne aflm ntr-un mediu de productie i nu dorim a complica mai mult lucrurile, consideram ca nu este necesar a alege modul securizat de transmitere a datelor se va alege optiunea Do not require security channel (SSL). n pasul Client Authentication se va selecta Clients will connect anonymously. La pasul Anonymous Access se vor accepta setrile implicite. La pasul Snapshot Share Access se va meniona adresa UNC a directorului snapshot (ex: \\computername\director_snapshot unde computername va fi nlocuit cu denumirea staiei locale). n fereastra de dialog a pasului Complete the Wizard vor fi prezentate un sumar al setrilor efectuate pe parcursul wizard-ului. Se va apsa butonul Finish pentru a finaliza configurarea serverului IIS. Verificarea corectitudinii setrilor efectuate se realizeaz prin accesarea din browserul web, a adresei http://192.168.0.1/H5N1/sqlcesa30.dll?diag.

10. Realizarea subscrierii


nainte de a realiza subscrierea, este necesar a crea o nou baza de date (ex.: H5N1_MEDIC) SQL Compact. Se va realiza conexiunea cu baza de date SQL Compact Edition. Din zona Object Explorer a SQL Server Management Studio, vom accesa wizard-ul folosit pentru generarea subscrierii (se parcurge structura arborescent Replication Subscriptions, iar din meniul contextual se va alege opiunea New Subscriptions...).

Figur 18 Realizarea subscrierii folosind SQL Server Management Studio

n prima fereastr a wizard-ului se va face click pe butonul Next. 24

n cel de-al doilea pas (Choose Publication) se va alege <Find SQL Server Publisher> din lista drop down. Se va efectua autentificarea la serverul SQL Server 2005. Dup efectuarea autentificrii, se va selecta publicaia creat n paii anteriori (PUBLICATIE_H5N1) apoi se va face click pe butonul Next.

Figur 19 Selectarea publicaiei la care se dorete realizarea subscrierii

n pasul Identify Subscription se va completa caseta de de text Subscription name cu SUBSCRIERE_H5N1, sau oricare alt denumire sugestiv. Pentru a trece la pasul urmtor se va apsa butonul Next. Web Server Authentication presupune completarea adresei de acces (http://192.168.0.1/H5N1) ctre directorul virtual al serverului IIS, precum i modalitatea n care se va efectua autentificarea pe serverul WEB. Pe baza exemplului H5N1 nu credem c este necesar autentifcarea n prealabil (The Subscriber will connect anonymously). La pasul SQL Server Authentication se va alege opiunea Use SQL Server Authentication with the following SQL Server user name and password. Cmp Valoare User name: acristian Password: acristian Apsai butonul Finish pentru a finaliza wizard-ul.

SqlCeReplication18 Principala noutate ce va fi ntlnit n codul aplicaiei H5N1 este dat de folosirea unor obiecte de tipul SqlCeReplication (spaiul de nume System.Data.SqlServerCe), care prin intermediul apelrii anumitor metode, ne vor ajuta s realizm sincronizarea dintre abonai i editor.
18

http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlcereplication(VS.80).aspx

25

Tabelul nr. 3 Constructorii clasei SqlCeReplication

SqlCeReplication() SqlCeReplication(internetUrl As String, internetLogin As String, internetPassword As String, publisher As String, publisherDatabase As String, publication As String, subscriber As String, subscriberConnectionString As String)

SqlCeReplication(internetUrl As String, internetLogin As String, internetPassword As String, publisher As String, publisherDatabase As String, publisherLogin As String, publisherPassword As String, publication As String, subscriber As String, subscriberConnectionString As String)

Iniializeaz o nou instan a tipului SqlCeReplication. Iniializeaz o nou instan a tipului SqlCeReplication i totodat sunt setate valorile principalelor proprieti necesare conectrii la publicaie. Parametri: internetUrl adresa URL folosit pentru a contacta agentul SQL Server Compact Edition; internetLogin numele de cont folosit pentru a putea contacta agentul SQL Server Compact Edition; internetPassword parola contului de acces; publisher denumirea editorului; publisherDatabase denumirea bazei de date publicate; publication denumirea publicaiei; subscriber denumirea abonatului; subscriberConnectionString stringul de conectare la baza de date; Aceeai funcionalitate ca i constructorul precedent doar c accept n plus transmiterea valorilor a nc doi parametri: publisherLogin numele de cont folosit pentru conectarea la editor; publisherPassword - parola contului folosit pentru conectarea la editor.

Tabelul nr. 4 Principalele proprieti ale clasei SqlCeReplication

CompressionLevel

ConnectionRetryTimeout

Ofer posibilitatea setrii nivelului de comprimare a datelor. Valorile ce pot fi atribuite prin intermediul acestei proprieti sunt de tip Short i cuprinse ntre 0 i 6 (valoarea 0 va avea ca efect anularea comprimrii datelor; valoarea 1 reprezint un grad de comprimare sczut; valoarea 6 reprezint cel mai mare grad de comprimare). Cu ct gradul de comprimare este mai ridicat, cu att va crete i timpul de procesare a datelor de ctre serverul IIS. Permite setarea numrului de secunde n care SQL Server Compact Edition va ncerca s restabileasc o conexiune euat. Unele canale de comunicaie se confrunt cu frecvente ntreruperi ce pot apare n momentul realizrii sincronizrii dintre abonat i editor. n cazul n care conexiunea este restabilit n intervalul de secunde specificat, atunci sincronizarea va fi continuat, n caz contrar sincronizarea va fi anulat. Valoarea implicit este de 120 secunde, iar maximul acceptat este de 900. Atenie!!! A nu se confunda cu intervalul de timp acceptat pentru 26

ConnectTimeout

Distributor

DistributorPassword

DistributorAddress

DistributorLogin

DistributorNetwork

DistributorSecurityMode

ExchangeType

HostName

realizarea primei conexiuni. Prin intermediul acestei proprieti se poate seta sau obine intervalul de timp (n milisecunde) n care trebuie s se realizeze conexiunea cu serverul. n cazul n care conexiunea nu se realizeaz n intervalul stabilit, cererea realizrii sincronizrii este anulat. Valoarea maxim admis este de 360 000 milisecunde (360 secunde). Prin intermediul acestei proprieti este specificat numele distribuitorului. Distribuitorul este maina pe care este instalat Microsoft SQL Server i care conine instantaneul (snapshotul), istoricul i statisticile replicrilor efectuate. Aceasta proprietate este opional, iar n cazul n care nu i este specificat o valoare, se consider c editorul i distribuitorul sunt instane ale aceluiai server SQL. Proprietatea permite setarea parolei de acces folosit la conectarea cu distribuitorul (doar n cazul n care tipul de autentificare folosit este DBAuthentication). Permite specificarea adresei de reea (un string de forma adresaIP:port) folosit pentru a se putea realiza comunicarea dintre agentul SQL Server Compact Edition i distribuitor. Este necesar setarea acestei proprieti atunci cnd proprietatea DistributorNetwork are setat o valoare cu totul alta dect DefaultNetwork. Proprietatea permite setarea numelui de cont folosit pentru autentificarea cu distribuitorul. Este necesar setarea acestei proprieti atunci cnd tipul de autentificare folosit este DBAuthentication. Prin intermediul acestei proprieti se poate seta sau returna tipul protocolului folosit n comunicarea cu distribuitorul (DefaultNetwork, MultiProtocol, TcpipSockets). Seteaz tipul de autentificare folosit la conectarea cu distribuitorul. Tipurile de autentificare sunt: DBAuthentication autentificare pe baza conturilor existente la nivelul serverului SQL. Acest tip de autentificare implic setarea proprietilor DistributorLogin respectiv Distributor Password. NTAuthentication autentificare pe baza conturilor existente la nivelul sistemului de operare. Permite setarea modului n care se va realiza sincronizarea dintre abonat i editor. BiDirectional modificrile aprute la abonat se vor reflecta ctre editor i viceversa. Upload vor fi transmise ctre editor doar modificrile aprute la abonat. Pe baza valorii acestei proprieti se pot efectua filtre asupra nregistrrilor trimise ctre abonat. Publicaiilor de tip Merge li se pot atribui filtre folosind funcii Transact-SQL precum SUSER_SNAME() i / sau HOST_NAME(). Aceste funcii vor fi incluse n clauza where din pasul Filter Table Rows al wizard-ului de generare de publicaii. Aadar, dac n schema bazei de date exist o tabela cu un atribut ce pstreaz denumirile mainilor ce se vor conecta la editor, pe baza acestui atribut se pot efectua filtre folosind funcia Transact27

InternetLogin

InternetPassword InternetUrl LoginTimeout

Publication Publisher PublisherAddress

PublisherChanges

PublisherDatabase PublisherLogin

PublisherNetwork PublisherPassword PublisherSecurityMode

QueryTimeout

ReceiveTimeout

SendTimeout

SQL HOST_NAME(). Obiectele de tip SqlCeReplication ale mainilor de lucru ce doresc a se conecta la editor sunt obligate a seta proprietatea HostName cu valori pe baza crora se vor efectua filtrri. Primete ca valoare numele de cont folosit la autentificarea cu agentul SQL Server Compact Edition. Implicit nu este setat nicio valoare. Permite setarea parolei contului folosit la autentificarea cu agentul SQL Server Compact Edition. Permite specificarea adresei URL folosit pentru contactarea agentului SQL Server Compact Edition. Prin intermediul acestei proprieti se poate specifica numrul maxim de secunde n intervalul crora se poate realiza conexiunea dintre serverul IIS i editor / distribuitor. Valoarea implicit este de 15 secunde. Seteaz denumirea publicaiei ce a fost generat pentru a se putea realiza replicarea cu abonaii. Seteaz denumirea serverului SQL cu rol de editor. Proprietate prin intermediul creia se specific adresa (un string de forma adresaIP:port) folosit pentru conectarea cu editorul (atunci cnd agentul SQL Server Compact Edition i editorul se afl pe maini de lucru separate). Proprietatea este ReadOnly i returneaz numrul de modificri (inserri, actualizri, tergeri nregistrri) ce au fost permanentizate la abonat n urma operaiunii de sincronizare. Proprietatea permite setarea denumirii bazei de date publicate. Seteaz numele de cont pe baza cruia se va face autentificarea la editor (doar n cazul n care tipul de autentificare folosit este DBAuthentication). Pe baza acestei valori se vor efectua filtrri ale nregistrrilor transmise ctre abonat (doar n cazul n care clauza where, din pasul Filter Table Rows al wizard-ului de generare de publicaii, are specificat o condiie ce folosete funcia Transact-SQL SUSER_SNAME()). Seteaz protocolul folosit n comunicarea cu editorul (DefaultNetwork, MultiProtocol, TcpipSockets). Seteaz parola de acces folosit la conectarea cu editorul. Proprietatea permite specificarea tipului de autentificare folosit la conectarea cu editorul. DBAuthentication autentificare pe baza conturilor existente la nivelul serverului SQL. NTAuthentication autentificare pe baza conturilor existente la nivelul sistemului de operare. Seteaz sau returneaz intervalul maxim de timp (n secunde) alocat efecturii procesarilor interne (ale serverului SQL). Valoarea implicit este de 300 secunde. Returneaz sau seteaz intervalul de timp (n milisecunde) n care obiectul SqlCeReplication ateapt rspuns de la server. Dac intervalul de timp stabilit este depait, atunci cererea adresat serverului este anulat. Valoarea implicit este 60 000 milisecunde (60 secunde), iar maximul admis este de 360 000 milisecunde (360 secunde). Returneaz sau seteaz intervalul de timp (n milisecunde) pe care 28

Subscriber SubscriberChanges

SubscriberConnectionString

obiectul SqlCeReplication l va atepta pentru a transmite cereri ctre server. Valoarea maxim admis este de 360 000 milisecunde (360 secunde). Proprietatea primete ca valoare denumirea subscrierii. Proprietatea este ReadOnly i returneaz numrul de modificri (inserri, actualizri, tergeri nregistrri) ce au fost permanentizate la editor n urma operaiunii de sincronizare. Prin intermediul acestei proprieti se specific stringul de conectare la baza de date SQL Server Compact Edition.

Tabelul nr. 5 Principalele metode ale clasei SqlCeReplication

AddSubscription (addOption As AddOption)

ReinitializeSubscription (uploadBeforeReinitialize As Boolean)

LoadProperties

Synchronize

SaveProperties

Se va crea o nou subscriere la o publicaie Microsoft SQL Server. Parametrul de tip AddOption poate lua urmtorele valori: CreateDatabase presupune crearea bazei de date SQL Server Compact Edition pe baza snapshotului, precum i transferul de nregistrri. ExistingDatabase presupune descrcarea de date (nregistrri) de la editor i permanentizarea lor n baza de date existent la abonat. Dup apelarea metodei AddSubscription va trebui apelat metoda Synchronize. Metoda va marca subscrierea pentru reiniializare. n cazul n care parametrului uploadBeforeReinitialize i este atribuit valoarea TRUE, nainte de a se reiniializa subscrierea, se vor trimite modificrile ctre editor. Implicit valoarea parametrului uploadBeforeReinitialize este FALSE. Reiniializarea subscrierii se va efectua la primul apelul al metodei Synchronize. Metoda va extrage din tabelele sistem ale bazei de date, informaii referitoare la proprietile sincronizrii apoi va ncrca obiectul ce a apelat metoda, cu valorile extrase. Invoc replicarea de tip sincronizare (eng. merge replication) dintre abonat i editor. nainte de a se apela metoda Synchronize, este necesar a se nchide toate conexiunile cu baza de date. Metoda va salva informaiile referitoare la proprietile sincronizrii (ncarcate n obiectul SqlCeReplication ce apeleaz metoda), n tabelele sistem ale bazei de date.

29

Realizarea aplicaiei H5N1


Aplicaia H5N1 va fi alctuit din trei formulare ce i vor permite utilizatorului (medicului): autentificarea la aplicaie (pe baza unui nume de cont i a unei parole); sincronizarea cu editorul (sediul central de prelucrare a datelor); introducerea / modificarea datelor consultaiilor efectuate;

Formularul Autentificare este alctuit dintr-o serie de componente vizuale ce i permit utilizatorului: autentificarea la aplicaie, sincronizarea anonim cu editorul, nchiderea aplicaiei. Autentificarea la aplicaia H5N1 se va face pe baza numelui de cont i a parolei asociate. Acestea trebuiesc completate n casetele de text txtNumeDeCont respectiv txtParolaCont, iar n urma apsrii butonului de autentificare, n funcie de datele introduse, aplicaia H5N1 va trebui s efectueze o cutare n baza de date aflat pe dispozitivul smart (H5N1_MEDIC.sdf). n cazul n care datele completate nu sunt valide, aplicaia H5N1 va afia mesajul de avertizare Ai introdus gresit numele de cont sau parola!. Completarea corect a datelor de autentificare va determina afiarea formularului AppH5N1, de unde utilizatorul va putea accesa oricare alte funcionaliti ale aplicaiei. Formularul Autentificare ofer i posibilitatea realizrii sincronizrii anonime cu editorul. n urma acestei operaiuni toate modificrile aprute la abonat vor fi reflectate ctre editor, iar ctre abonat vor fi transmise doar nregistrrile ce alctuiesc tabela MEDICI. Am denumit aceast sincronizare ca fiind anonim, deoarece operaia de sincronizare se poate realiza i fr ca utilizatorul s fie autentificat la aplicaie. De fapt autentificarea la editor se va face pe baza contului computername\IUSR_computername (unde computername va fi nlocuit cu denumirea staiei locale). Aceast funcionalitate (sincronizare anonim) i va permite oricrui medic nou s se alture echipelor existente i s se autentifice de pe oricare din dispozitivele smart aflate la medicii ce efectueaz consultaii n zonele cu risc (se presupune ca datele privind contul noului medic vor fi nregistrate n baza de date aflat la editor, iar autentificarea pe oricare dispozitiv va trebui precedata de operaia de sincronizare). Ieirea din aplicaie se va realiza prin apsarea Iesire app H5N1 din meniul formularului Autentificare.

lblNumeDeCont

txtNumeDeCont

lblParola

txtParolaCont mbtnSincronizareAnonima

mbtnIesire mbtnAutentificare

Figur 20 Macheta general a formularului Autentificare

30

Formularul AppH5N1 va putea fi accesat doar dac utilizatorul aplicaiei s-a autentificat cu un nume de cont valid. Acest formular permite: realizarea sincronizrii cu editorul, accesul la formularul de introducere / editare date consultaii pacieni, realizarea deautentificrii, ieirea din aplicaie. Operaiunea de sincronizare ce poate fi declanat din formularul AppH5N1, de data aceasta va efectua autentificarea la editor pe baza datelor contului cu care s-a realizat autentificarea la aplicaie. n urma operaiunii de sincronizare, modificrile efectuate de abonat vor fi reflectate ctre editor, iar editorul va transmite ctre abonat toate nregistrrile din tabela MEDICI precum i nregistrrile (doar cele ce ndeplinesc condiia de filtrare) din tabela ANAMNEZA. Odat autentificai la aplicaia H5N1, medicii vor putea introduce / edita date privind consultaiile pacienilor, respectiv vor accesa (prin intermediul opiunilor Consultaie pacient / Consultaii efectuate) cel de-al treilea formular al aplicaiei Consultaie. Deautentificarea se va putea realiza prin apsarea Sfarsit sesiune din meniul formularului AppH5N1, caz n care aplicaia va direciona utilizatorul ctre formularul Autentificare.

lblInfMedic

mbtnConsultatiiEfectuate mbtnConsultPacient mbtnSfarsitSesiune mbtnIesire

mbtnSincronizare

Figur 21 Macheta general a formularului AppH5N1

Formularul Consultaie va ndeplini dou funcionaliti (formular de introducere date consultaie pacient, respectiv formular de editare date consultaii pacient), n funcie de care anumite controale vizuale vor fi activate / dezactivate ori vor avea culori sau mesaje diferite. n cazul introducerii de date: Titlul formularului va conine mesajul Date consult pacient!. Componenta ComboBox cmbAlegePacient va fi inactiv. Textul tuturor elementelor vizuale de tip TextBox, NumericUpDown, RadioButton, Button, va fi de culoare neagr (System.Drawing.Color.Black). n cadrul de pagina Anamneza nicio component de tip RadioButton nu va avea setat o valoare implicit. Componentele btnSalveaza i btnReseteaza vor afia mesajele Salveaza date pacient nou, respectiv Reseteaza formular. Dup confirmarea salvrii datelor pacientului, utilizatorul va fi direcionat ctre formularul AppH5N1.

31

n cazul editrii datelor: Titlul formularului va afia mesajul Modifica date pacienti!. Componenta ComboBox cmbAlegePacient va fi activat i va conine numele i prenumele pacienilor consultai. Textul tuturor elementelor vizuale de tip TextBox, NumericUpDown, RadioButton, Button, va fi de culoare roie (System.Drawing.Color.DarkRed). n cazul n care medicul autentificat are consultaii efectuate, la deschiderea formularului Consultaie, automat toate componentele vizuale vor fi completate cu datele primului pacient din componena ComboBox cmbAlegePacient. Componentele btnSalveaza i btnReseteaza vor afia mesajele Salveaza modificari pacient! respectiv Renunta modificari pacient!. De asemeni aceste componente vor fi active doar n cazul n care medicul autentificat la aplicaie are cel puin un pacient consultat. Dup confirmarea salvrii modificrilor datelor pacientului, formularul Consultaie va rmne activ.

cmbAlegePacient

txtNumePrenume

nudVarsta

txtAdresa rbnUrban

rbnRural

txtNrTelefon

Figur 22 Macheta general a formularului Consultaie (cadrul de pagin Date pacient)

32

nudNrZileAparitieSimptome txtTemperatura rbnDureriCapDa rbnDureriGatDa rbnDureriMusculare Da rbnNasInfundatDa rbnConjunctivitaDa rbnTuseDa rbnSenzatieSufocareDa rbnInsuficientaRespiratorieDa rbnContactAnimaleDa rbnDureriCapNu rbnDureriGatNu rbnDureriMusculareNu rbnNasInfundatNu rbnConjunctivitaNu rbnTuseNu rbnSenzatieSufocareNu rbnInsuficientaRespiratorieNu rbnContactAnimaleNu

Figur 23 Macheta general a formularului Consultaie (cadrul de pagin Anamneza)

33

txtInformatiiSuplimentare

btnSalveaza

btnReseteaza

Figur 24 Macheta general a formularului Consultaie (cadrul de pagin Salveaza)

Realizarea conexiunii cu baza de date H5N1_MEDIC.sdf


Se va creea un nou proiect Windows Mobile 5.0 Pocket PC cu denumirea H5N1, apoi se vor realiza cele trei formulare (formularul Consultaie va fi creat n forma prezentat ca introducere date pacienti) respectnd denumirile obiectelor vizuale aa cum sunt prezentate n imaginile de mai sus. Urmtorul pas const n a realiza conexiunea cu baza de date H5N1_MEDIC.sdf folosind wizard-ul pus la dispozitie de mediul Visual Studio (vom ncrca setul de date local cu toate obiectele existente n baza de date i i vom atribui denumirea setul_de_date_H5N1). Dup ce s-a realizat conexiunea cu baza de date, va trebui s crem noi metode de ncrcare cu datele tabelei MEDICI din setul de date local. Deschidem schema setului de date local prin accesarea fiierului setul_de_date_H5N1.xsd, se acceseaz meniul contextual al tabelei MEDICI Add Query.... La pasul Specify a SQL SELECT statement a wizard-ului, se va introduce fraza SQL SELECT cod_medic, nume_prenume_medic, nume_cont, parola_cont, adresa_contact, telefon_contact, rowguid FROM MEDICI WHERE nume_cont=@nume_cont AND parola_cont=@parola_cont.

34

Figur 25 Fraz SQL parametrizat ce va fi folosit pentru a ncrca cu date tabela MEDICI din setul de date local.

n pasul Choose Methods to Generate, formularul wizard-ului va fi completat cu denumiri sugestive asemntoare cu cele din imaginea alturat.

Figur 26 Denumirile asociate metodelor de ncarcare cu date a tabelei MEDICI din setul de date local

35

Asemntor cu metodele create pentru tabela MEDICI din setul local de date, vor fi create noi metode (incarca_date_anamneza respectiv extrage_date_anamneza) i pentru tabela ANAMNEZA (SELECT adresa, cod_medic, cod_pacient, conjunctivita, contact_animale, data_consult, dureri_de_cap, dureri_de_gat, dureri_musculare, informatii_suplimentare, insuficienta_respiratorie, mediu_urban_rural, nas_infundat, nr_zile_apar_simpt, nume_prenume_pacient, rowguid, senzatie_de_sufocare, telefon, temperatura, tuse, varsta FROM ANAMNEZA WHERE cod_medic = @cod_medic ORDER BY nume_prenume_pacient). n final schema setului de date local al aplicaiei H5N1 ar trebui s fie asemntoare cu schema prezentat n imaginea alturat.

Figur 27 Schema setului de date local al aplicaiei H5N1

Medic.vb & Sincronizare.vb


Pentru a ne uura ct mai mult munca, am decis realizarea a dou clase: Medic are rolul de a pstra date referitoare la persoana autentificat la aplicaie; Sincronizare va reda funcionalitatea necesar aplicaiei pentru a realiza replicarea datelor. Fiecare clas va fi creat ntr-un fiier separat cu extensia .vb (din fereastra Solution Explorer click dreapta Add Class...). Medic.vb vezi Anexa 1
Tabelul nr. 6 Constructorul clasei Medic

Medic(cod_medic As Integer, nume_prenume_medic As String, nume_cont As String, parola_cont As String, adresa_contact As String, telefon_contact As String)

Creeaz o nou instan a tipului Medic. Parametrii: cod_medic codul intern asociat medicului; nume_prenume_medic reprezint numele i prenumele medicului autentificat la aplicaia H5N1; nume_cont numele de cont cu care medicul s-a autentificat la aplicaie; parola_cont parola introdus de mediul autentificat la aplicaie; adresa_contact adresa medicului; telefon_contact numrul de telefon al medicului; Valorile acestor parametrii vor fi preluate din baza 36

de date aflat pe dispozitivul smart.

Tabelul nr. 7 Metodele clasei Medic

get_adresa_contact() get_cod_medic() get_nume_cont() get_nume_prenume_medic() get_parola_cont() get_telefon_contact()

Returneaz o valoare de tip String ce va conine adresa medicului autentificat la aplicaia H5N1. Returneaz o valoare de tip Integer ce va conine codul medicului autentificat la aplicaia H5N1. Returneaz o valoare de tip String ce va conine numele de cont al medicului autentificat la aplicaia H5N1. Returneaz o valoare de tip String ce va conine numele i prenumele medicului autentificat la aplicaia H5N1. Returneaz o valoare de tip String ce va conine parola asociat contului medicului autentificat la aplicaia H5N1. Returneaz o valoare de tip String ce va conine numrul de telefon al medicului autentificat la aplicaia H5N1.

Sincronizare.vb vezi Anexa 2

Tabelul nr. 8 Constructorii clasei Sincronizare

Sincronizare()

Creeaz o instan a tipului Sincronizare. Apelul metodei sincronizare() sau reinitializare_subscriere_si_sincronizare() a unui obiect instaniat cu acest constructor, va determina realizarea sincronizrii cu editorul n mod anonim (autentificarea la editor se va face pe baza contului computername\IUSR_computername). Sincronizare(medic As Medic) Creeaz o instan a tipului Sincronizare. Acest constructor accept ca parametru o instan a tipului Medic, fcnd astfel posibil ca apelul metodei sincronizare() sau reinitializare_subscriere_si_sincronizare(), s determine sincronizarea cu editorul, autentificarea cu acesta fcndu-se pe baza datelor obiectului transmis ca parametru. Indiferent de constructor, la iniializare, membru privat repl al clasei Sincronizare va fi ncrcat cu o serie de date ce permit conectarea la publicaie: InternetUrl adresa URL a agentului SQL Server Compact Edition; Publisher denumirea editorului; PublisherDatabase denumirea bazei de date publicate; Publication denumirea publicaiei; Subscriber denumirea abonatului; SubscriberConnectionString stringul de conectare la baza de date; Toate aceste date vor fi pstrate de membrii privai ai clasei Sincronizare, iar valorile cu care acetia sunt initializai corespund configuraiei prezentate pe parcursul acestui capitol (n cazul n care nu ai folosit aceleai denumiri, adrese IP, etc., valorile membrilor privai vor trebui schimbate conform configuraiei alese de dumneavoastr).
Tabelul nr. 9 Metodele clasei Sincronizare

aceeasi_subscriere()

Apelul acestei metode va determina extragerea de informaii referitoare la proprietile ultimei sincronizrii (se vor fi obine din tabelele sistem 37

sincronizare()

reinitializare_subscriere_si_sincronizare()

__sysMergeArticles, __sysMergeArticles, __sysMergeArticles ale bazei de date H5N1_MEDIC.sdf). Datele extrase vor fi comparate cu datele din membrul privat repl, n funcie de care se va retuna TRUE sau FALSE. Apelul acestei metode va determina apariia unei casete de mesaj prin intermediul creia utilizatorul va confirma (sau nu) sincronizarea cu editorul. Apelul acestei metode va avea efect asemntor cu metoda sincronizare(), diferena fiind dat de faptul c noua metod va efectua i o reiniializare a subscrierii.

Implementarea funcionalitii aplicaiei H5N1 Autentificare.vb vezi Anexa 3 AppH5N1.vb vezi Anexa 4 nainte de a scrie codul formularului Consultaie, este necesar a realiza legtura dintre componenta vizual de tip ComboBox cmbAlegePacient i tabela ANAMNEZA din setul de date local. Mediul Visual Studio este foarte generos n aceast privin i ne permite realizarea acestei cerine prin parcurgerea a cinci pai simpli: se deschide formularul Consultaie i se va selecta componenta vizual cmbAlegePacient; pentru proprietatea DataSource se va alege tabela ANAMNEZA a setului local;

Figur 28 Conectarea componentei ComboBox cmbAlegePacient la tabela ANAMNEZA

38

pentru proprietatea DisplayMember se va selecta nume_prenume_pacient; pentru proprietatea ValueMember se va selecta cod_pacient;

Figur 29 Stabilirea principalelor proprieti pentru cmbAlegePacient

setul de date i adaptorul generate de wizard vor fi redenumite conform imaginii urmtoare;

Figur 30 Noile denumiri ale obiectelor generate de Wizard-ul anterior

Consultatie.vb vezi Anexa 5

39

mpachetarea i distribuirea aplicaiilor mobile


mpachetarea i distribuirea aplicaiilor destinate dispozitivelor smart, nu sunt procese relativ simplu de efectuat (comparativ cu modalitile de mpachetare i distribuire ale aplicaiilor destinate desktop-urilor). Dup ce o aplicaie a fost realizat i testat, urmtorul pas const n a o distribui utilizatorilor. Este foarte important de avut n vedere faptul c nivelul cunotinelor din domeniul utilizrii noilor tehnologii, difer de la un utilizator la altul, mai mult dect att, dispozitivele smart au configuraii hardware i software diferite. Scopul acestui capitol este de a explica modul n care putem mpacheta i distribui aplicaiile, avnd n vedere piedicile enumerate. Trebuie amintit faptul c aplicaiile smart dezvoltate n oricare limbaj de programare .NET, pentru a putea fi funcionabile trebuiesc a fi executate de pe un dispozitiv care n prealabil are instalat framework-ul .NET (corespunztor versiunii sub care acestea au fost dezvoltate). Exist veti bune n acest sens, dispozitivele smart al cror sistem de operare este Windows Mobile 6.0/6.1, au implicit instalate Microsoft .NET Compact Framework 2.0 i Microsoft SQL Server Compact Edition. n cazul n care se ncearc a fi executat o aplicaie dezvoltat ntr-una din platformele .NET, de pe un dispozitiv smart ce nu are instalat n prealabil framework-ul .NET, utilizatorul va fi informat de acest lucru prin intermediul unui mesaj suficient de sugestiv.

Figur 31 Mesajul prin care utilizatorul este ntiinat de necesitatea instalrii n prealabil a Microsoft .NET Compact Framework

Principalii pai ce trebuiesc realizai, sunt: stabilirea fiierelor ce alctuiesc aplicaia; realizarea fiierului .CAB (fiier n care aplicaia va fi mpachetat) practic din acest moment aplicaia poate fi distribuit ctre utilizatori, dar pentru realizarea unui pachet de instalare, 40

care executat de pe staia local s efectueze instalarea aplicaiei pe dispozitivul smart ataat, trebuiesc realizai i restul pailor; realizarea unui fiier .dll n care vor fi specificate aciunile ce se vor efectua dup / nainte de instalare/dezinstalare; realizarea pachetului de instalare n care vor fi mpachetate toate fiierele necesare pentru ca aplicaia s poat fi instalat direct de pe desktop-ul utilizatorului;

Modaliti de distribuire a aplicaiilor


prin intermediul serverelor web: utilizatorul folosind browserul (Microsoft Internet Explorer Mobile) va accesa pagina web de unde poate fi descrcat fiierul .CAB, urmnd apoi a efectua instalarea. prin intermediul potei electronice: utilizatorul primete fiierul .CAB ca ataament al unui email, urmnd a-l descarc i executa. prin intermediul cardurilor de memorie: utilizatorul ataeaz un card de memorie (pe care este stocat fiierul .CAB) la dispozitivul smart de unde i va descrca i instala aplicaia. prin intermediul unui director partajat: utilizatorul acceseaz de pe dispozitivul smart un director partajat de unde va putea accesa fiierul .CAB. prin intermediul ActiveSync: utilizatorul va ataa dispozitivul smart la staia local, va realiza sincronizarea prin intermediul aplicaiei ActiveSync i va executa pachetul de instalare de pe unitatea desktop, iar aplicaia va fi transferat i nregistrat pe dispozitivul mobil. etc.

mpachetarea i distribuirea aplicaiei H5N1


n cele ce urmeaz, se va prezenta modalitatea n care aplicaia H5N1 (a se vedea capitolul referitor la replicarea bazelor de date) poate fi mpachetat i distribuit ctre utilizatori (am considerat ca aplicaia H5N1 s fie luat drept exemplu, deoarece ea pare a fi cea mai complet i mai n msur s acopere subiectele de interes ale acestui capitol).

Stabilirea fiierelor ce alctuiesc aplicaia


Dup ce am scris i rulat aplicatia pentru prima dat, observm c structura fiierelor (din directorul unde aplicaia a fost copiat pe dispozitivul smart) nu este chiar complex. Avem aadar dou fiiere: H5N1.exe H5N1_MEDIC.sdf Cel mai probabil, dac e s fi utilizat emulatorul, iar sistemul de operare ales a fost Windows Mobile 5.0, nainte de a trece fiierele pe dispozitivul smart, mediul integrat Visual Studio 2008 a efectuat verificri n privina resurselor software necesare execuiei aplicaiei, iar n cazul n care acestea nu existau, automat s-ar fi efectuat instalarea lor. Totui, nu tot timpul aceaste resurse software necesare aplicaiei pot fi instalate automat, ns unele dintre ele (n cazul nostru SQL Server Compact Edition) permit ca atunci cnd o serie de fiiere .dll sunt incluse n proiect i distribuite mpreun cu aplicaia, instalarea s nu mai fie obligatorie. Dac avem curiozitatea i accesm directorul n care se afl distribuiile SQL Server Compact Edition (Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500) vom gsi o serie de directoare n care sunt fiiere .CAB i .dll. ns, oare de ce attea directoare i fiiere care fac acelai lucru? Ei bine, denumirile directoarelor sunt acronime de la diferite tipuri de procesoare ale 41

dispozitivelor smart. Aadar fiecare director n parte va conine fiiere .CAB i .dll specifice tipului de procesor cu denumirea directorului accesat. Deci, pentru a evita situaia n care aplicaia H5N1 nu va putea fi executat de pe un dispozitiv smart ce nu are instalat SQL Server Compact Edition, va trebui s distribuim odat cu aplicaia i cteva fiierele .dll (sqlceca30.dll, sqlcecompact30.dll, sqlceer30en.dll, sqlceme30.dll, sqlceoledb30.dll, sqlceqp30.dll, sqlcese30.dll). O alt posibil ntrebare ar fi: Aceleai fiiere .dll cu denumirile susmenionate se gsesc n fiecare director asociat unui anumit tip de procesor. Pe care le vom include?. De cele mai multe ori nu se poate ti cu exactitate pe ce arhitectur aplicaia va fi executat, iar pentru a avea garania c nu vor fi probleme, vom fi nevoii a face mai multe distribuii (fiiere .CAB n care aplicaia va fi mpachetat) pentru fiecare tip de procesor n parte. Ca exemplu, am decis a realiza distribuiile pentru ARMV4I, SH4 i X86. De asemeni, oricare alte fiiere ce sunt necesare funcionrii corecte a aplicaiei, vor trebui identificate pentru a putea fi mpachetate i distribuite odat cu ea.

Realizarea fiierului .CAB


1. Se va deschide proiectul H5N1 n mediul Visual Studio 2008. 2. Din fereastra Configuration Manager (Build Configuration Manager), se va seta Release pentru Active solution configuration.

Figur 32 Pentru optimizarea codului aplicaiei se va alege modul de compilare Release

3. Completarea informaiilor de ansamblare a aplicaie: se acceseaza meniul contextual al proiectului H5N1, apoi se deschide fereastra de proprieti. n seciunea Application se va apsa butonul Assembly Information. 42

Figur 33 Fereastra de proprieti a proiectului H5N1 (cadrul de pagin Application)

Figur 34 Fereastra n care vor fi completate informaiile de ansamblare a aplicaiei

4. Urmtorul pas const n adugarea unui nou proiect de tip Smart Device CAB la soluia existent (File Add New Project, din panoul stng al ferestrei Add New Project se va extinde nodul Other Project Types, se va alege Setup and Deployment, iar din panoul din dreapta ferestrei se va face click pe Smart Device CAB Project). Proiectului i va fi atribuit denumirea H5N1.ARMV4I.

43

Figur 35 Coninutul ferestrei Solution Explorer dup ce a fost adugat noul proiect de tip Smart Device CAB

5. Completarea proprietilor proiectului H5N1.ARMV4I: se va selecta noul proiect, apoi din fereastra Properties se vor efectua modificri asemntoare cu cele din imaginea alturat.

Figur 36 Fereastra de proprieti a proiectului H5N1.ARMV4I

6. Specificarea fiierelor ce se doresc a fi mpachetate: se deschide panoul File System, se va face click dreapta pe Application Folder19 Add Project Output, iar din noua fereastra Add Project Output Group se va selecta Primary Output, apoi click pe butonul OK.

19

Conine informaii referitoare la aplicaia care va fi instalat prin intermediul pachetului.

44

Figur 37 Meniul contextual prin intermediul cruia sunt incluse n proiect fiierele necesare instalrii aplicaiei H5N1

Figur 38 Fereastra Add Project Output Group prin intermediul creia sunt incluse n proiect fiierele necesare instalrii aplicaiei H5N1

7. Ca rezultat, n zona de coninut a seciunii Application Folder va aprea o nou intrare denumit Primary output from H5N1. n acelai timp, n arborele soluiei se populeaz folderul Detected Dependencies cu fiierele necesare aplicaiei. Dintre respectivele fiiere este foarte important a include n folderul n care se afl aplicaia, fiierul System.Data.SqlServerCe.dll (se va selecta respectivul fiier iar din meniul contextual se va debifa Exclude n consecint acesta va fi adus n zona de coninut a seciunii Application Folder).

45

Figur 39 Includerea n proiect a fiierului System.Data.SqlServerCe.dll

8. Dac tot discutm despre fiierele adiacente aplicaiei, este momentul a include i restul fiierelor (baza de date H5N1_MEDIC.sdf, fiierul .ico n cazul n care s-a optat pentru o pictogram, precum i fiierele .dll sqlceca30.dll, sqlcecompact30.dll, sqlceer30en.dll, sqlceme30.dll, sqlceoledb30.dll, sqlceqp30.dll, sqlcese30.dll): a. se acceseaz din nou Add Project Output Group (click dreapta Application Folder Add Project Output), se va selecta Content Files, apoi click pe butonul OK ca rezultat al acestei operaiuni, n pachetul de instalare va fi adugat baza de date precum i pictograma asociat (fiierul .ico). b. adugarea fiierelor .dll se va face prin intermediul ferestrei Add Files (meniul contextual Application Folder Add File), se acceseaz directorul n care se afl fiierele .dll pentru tipul de procesor ARMV4I, iar apoi click pe butonul Open.

Figur 40 Includerea fiierelor .dll

9. n cazul n care se dorete ca dup instalarea aplicaiei, n directorul Programs (accesibil din meniul Start) a dispozitivului smart, s fie realizat o legatur rapid, atunci: 46

a. n folderul Application Folder, acionm click dreapta pe zona Primary output from H5N1 i selectm opiunea Create Shortcut to Primary output from H5N1. b. noul fiier va fi redenumit H5N1. c. din panoul din stnga ferestrei File System se va face click dreapta pe File System on Target Machine Add Special Folder Programs Folder.

Figur 41 Specificarea directorului n care se dorete adugarea legturii rapide

d. pentru a definitiva n mod corect problema legturii rapide, mai este necesar deplasarea ei n folderul Programs Folder prin tehnica drag&drop. 10. Finalmente coninutul proiectului H5N1.ARMV4I ar trebui s fie asemntor cu imaginea alturat.

Figur 42 Forma final a proiectului H5N1.ARMV4I

11. Tot ce ne mai rmne de fcut este s compilm proiectul (din fereastra Solution Explorer click dreapta H5N1.ARMV4I Build). Rezultatul acestei operaiuni const n generarea unui fiier cu extensia .CAB n directorul Release a proiectului. Din acest moment aplicaia poate fi distribuit ctre utilizatori. 47

Pentru realizarea fiierelor .CAB compatibile i celorlalte arhitecturi, va trebui s parcurgem aceeai pai parcuri ca i n cazul proiectului H5N1.ARMV4I, diferena fiind dat de schimbarea fiierelor .dll cu cele specifice procesorului pentru care se realizeaz mpachetarea.

Specificarea aciunilor ce se vor efectua n timpul instalrii/dezinstalrii20


n cadrul aceleiai soluii se va aduga un nou proiect Windows Visual Basic de tip Class Library cruia i va fi atribuit denumirea H5N1_conditii_instalare_dezinstalare. Implicit noul proiect va conine un fiier Class1.vb pe care va trebui s l redenumim n Conditii_Instalare_Dezinstalare.vb.

Figur 43 Coninutul ferestrei Solution Explorer dup ce a fost adugat noul proiect de tip Class Library

nainte de a implementa clasa Conditii_Instalare_Dezinstalare este necesar a aduga proiectului curent dou referine System.Configuration.Install, respectiv System.Windows.Forms. Acest operaiune se poate realiza prin accesarea ferestrei Add Reference (din fereastra Solution Explorer se acceseaz opiunea Add Reference... din meniul contextual al proiectului H5N1_conditii_instalare_dezinstalare). Conditii_Instalare_Dezinstalare.vb vezi Anexa 6 Dup ce s-a finalizat scrierea codului clasei Conditii_Instalare_Dezinstalare, va trebui s efectum compilarea proiectului H5N1_conditii_instalare_dezinstalare (din fereastra Solution Explorer se acceseaz opiunea Build din meniul contextual al proiectului).

20

Etap necesar a fi efectuat doar dac se dorete realizarea pachetului de instalare care s permit instalarea aplicaiei direct de pe staia local.

48

Realizarea fiierului .ini


Managerul de aplicaii (CEAppMgr.exe) poate fi gsit n directorul unde a fost instalat Microsoft ActiveSync, el fiind responsabil cu transferul fiierelor .CAB de pe staia local, pe dispozitivul smart ataat (o alt ndatorire a managerului de aplicaii este de a identifica pachetul compatibil arhitecturii dispozitivului mobil). Aadar, managerul de aplicaii va trebui sa acceseze un fiier .ini care va conine informaii (versiune, scurt descriere, fiiere .CAB21, etc.) referitoare la aplicaia ce urmeaz a fi instalat. Folosind editorul de texte Notepad, creai pe discul local (de preferat n directorul rdcin al soluiei H5N1) fiierul setup.ini. setup.ini [CEAppManager] Version = 1.0 Component = H5N1 [H5N1] Description = Aplicatie consultatii pacienti CabFiles = H5N1.ARMV4I.CAB,H5N1.SH4.CAB,H5N1.X86.CAB Odat finalizat i fiierul setup.ini, tot ce mai rmne de fcut este s realizm pachetul de instalare ce va fi executat de utilizator direct de pe staia local. Se va reveni n mediul Visual Studio 2008, iar n cadrul soluiei H5N1 va fi adugat un nou proiect de tip Setup Project (File Add New Project, din panoul stng al ferestrei Add New Project se va extinde nodul Other Project Types, se va alege Setup and Deployment, iar din panoul din dreapta ferestrei se va face click pe Setup Project), cruia i va fi atribuit denumirea H5N1_setup.

Figur 44 Adugarea unui nou proiect de tip Setup Project

21

n cazul n care exist mai multe distribuii, denumirile fiierelor .CAB vor fi desprite prin virgul (nainte i dup virgul nu sunt admise spaii libere).

49

Din fereastra Solution Explorer se va selecta noul proiect, iar din meniul contextual al acestuia prin intermediul opiunilor Add File vor fi adugate fiierele: H5N1.ARMV4I.CAB H5N1.SH4.CAB H5N1.X86.CAB H5N1_conditii_instalare.dll setup.ini

Figur 45 Fiierele incluse n pachetul de instalare

Dup ce au fost adugate la proiect fiierele necesare, urmeaz etapa n care va trebui s specificm aciunile ce trebuiesc efectuate pe staia local la finalizarea procesului de instalare/dezinstalare. Se va accesa fereastra Custom Actions a proiectului H5N1_setup (din fereastra Solution Explorer, click dreapta pe noul proiect View Custom Actions), iar pentru Install i Uninstall vor fi specificate aciuni personalizate (click dreapta Add Custom Action ...).

Figur 46 Specificarea aciunilor personalizate ce se vor efectua dup instalare/dezinstalare

Ultimele operaiuni necesarare a fi efectuate constau n a: completa proprietile Author, Manufacturer, ProductName, Title; compila pachetul de instalare.

50

Figur 47 Proprietile pachetului de instalare

Dup ce pachetul de instalare a fost compilat, n directorul Release al proiectului H5N1_setup vei gsi dou fiiere (H5N1_setup.msi, setup.exe) care vor putea fi distribuite ctre utilizatori. Folosind pachetul de instalare, pentru a nregistra aplicaia H5N1 pe dispozitivul smart, utilizatorul nu trebuie dect s realizeze sincronizarea dintre staia local i dispozitivul mobil, apoi s execute unul dintre cele dou fiiere create cu ajutorul mediului Visual Studio 2008.

51

Concluzii
Ar fi nepotrivit s menionm un numar mare de concluzii n privina dezvoltrii aplicaiilor mobile pe platforma .NET doar prin prisma acestei lucrri. Totui din experiena acumulat pn n momentul de fa, putem afirma c platforma .NET este o platform flexibil, uor de nvat i uor de folosit. Mai mult dect att, n privint aplicaiilor ce privesc strict domeniul economic, limitele sunt date doar de capacitile intelectuale ale dezvoltatorilor. Aa cum am spus de la bun nceput, platforma oferit de ctre Microsoft pentru dezvoltarea aplicaiilor destinate dispozitivelor mobile nu difer foarte mult de platforma folosit n cazul dezvoltrii de aplicaii pentru sistemele clasice. Microsoft pune la dispoziie un set de instrumente excepionale pentru dezvoltarea de produse profesionale. Dac e s lum n calcul cerinele unui client ce dorete s i fie dezvoltat un produs software, cu siguran acesta va cere ca produsul su s fie dezvoltat n cel mai scurt timp cu putin, s fie un produs care poate fi uor de implementat i utilizat, s fie portabil i nu n ultimul rnd s nu fie scump. Comparativ cu alte platforme de dezvoltare pentru dispozitivele mobile, timpul folosit pentru dezvoltare este mult mai mic n cazul .NET Compact Framework. Vinovat de acest lucru este Microsoft Visual Studio care ofer un set de instrumente puternice foarte folositoare dezvoltatorilor. Pe lng instrumentele puternice oferite de IDE, dezvoltatorii beneficiaz de un set de clase puternice (care sunt mbuntite i extinse de la o versiune la alta) ce oblig programatorii s se concentreze asupra logicii aplicaiei. Spre exemplu, odat cu apariia .NET Compact Framework 3.5, programatorii pot beneficia de facilitile oferite de Language Integrated Query (LINQ) prin intermediul cruia se reduc simitor numrul liniilor de cod scrise pentru efectuarea unor operaiuni complexe. n plus, LINQ este foarte asemntor sintaxei SQL, ceea ce determin ca un programator care are cunotinte medii despre limbajul de interogare SQL s poat nva s utilizeze funcionalitile oferite de LINQ n mai puin de cteva ore. Chiar dac trebuie s fie capitol de incheiere este imposibil s nu exemplificam cele anterior menionate. Exemplu: Se cere a se realiza o clasa Agent caracterizat prin Cod Agent, Nume Prenume, Nume Cont, Parola, Adresa, Telefon. Cu ajutorul acestei clase se va realiza o list ce va conine minim patru ageni ale caror numere de telefon difera i un altul care nu are numr de telefon (proprietatea Telefon va avea valoarea NULL/NOTHING). S se scrie secvena de cod prin care se va afia lista agenilor ordonai dup nume i grupat dup primele patru caractere din numrul de telefon. Varianta 1 (varianta clasic) vezi Anexa 7 Varianta 2 (varianta ce folosete LINQ) vezi Anexa 8 Din secvenele de cod prezentate anterior se vede clar o mbuntire n ceea ce privete numrul de linii de cod scrise. Dac e s lum n calcul i timpul alocat rezolvrii acestei probleme, o persoan ce posed cunotine medii de programare .NET va gsi i implementa prima variant n aproximativ 30 minute, dar pentru varianta n care s-a folosit LINQ, timpul de rezolvare i implementare a problemei se reduce la aproximativ 7-10 minute. Problema sus-menionat nu este de foarte mare complexitate, dar ce ar fi dac la cerina actual s-ar aduga i condiia ca datele s fie sortate dup mai multe criterii (ascendent sau descendent n funcie de atribut), grupate dup mai multe atribute, lista cu ageni s fie joncionat cu o alta list i poate chiar i efectuate ceva operaiuni de agregare? n acest caz variant clasic cu sigurana ar determina programatorul s scrie 52

cteva zeci (bune) de linii de cod, pe cnd folosind facilitile LINQ rezolvarea s-ar limita la cteva instruciuni simple (evident doar dac persoana care rezolv problema stpnete bine LINQ sau are o oarecare experiena cu limbajul SQL). Momentan dispozitivele ale cror sistem de operare este Windows Mobile domin piaa de business doar pentru simplul fapt c sunt foarte uor de utilizat. n acest caz cu singuran un client va cere s i fie dezvoltat un produs care s fie compatibil i care s se integreze cu resursele existente, lucru care va duce n cele mai multe cazuri la alegerea dezvoltrii produsului software folosind platforma .NET. n privina costurilor de producie chiar dac dezvoltarea produselor software pe platforma Microsoft presupune anumite costuri, n ultima perioad lucrurile s-au mai schimbat datorit faptului c numrul dezvoltatorilor din zona Microsoft a crescut simitor, determinnd astfel ca celelalte platforme care nu presupun cheltuieli n privina utilizrii respectivei tehnologii s devin mai scumpe datorit creterilor cheltuielilor cu resursa uman (un numr de specialisti mult mai redus). Evident, creterea cheltuielilor pentru realizarea unui produs dezvoltat pe o platform free sunt determinate i de ali factori, dar cheltuielile cele mai mari sunt cele salariale (factor principal). Finalizm prin a afirma c platforma .NET este flexibil i ideal a fi folosit n dezvoltarea aplicaiilor mobile.

53

Anexe
Anexa 1: Medic.vb
Public Class Medic Private cod_medic As Integer Private nume_prenume_medic As String Private parola_cont As String Private adresa_contact As String Private telefon_contact As String Private nume_cont As String Sub New(ByVal cod_medic As Integer, ByVal nume_prenume_medic As String, ByVal nume_cont As String, ByVal parola_cont As String, ByVal adresa_contact As String, ByVal telefon_contact As String) Me.cod_medic = cod_medic Me.nume_prenume_medic = nume_prenume_medic Me.nume_cont = nume_cont Me.parola_cont = parola_cont Me.adresa_contact = adresa_contact Me.telefon_contact = telefon_contact End Sub Public Function get_adresa_contact() As String Return Me.adresa_contact End Function Public Function get_cod_medic() As Integer Return Me.cod_medic End Function Public Function get_nume_prenume_medic() As String Return Me.nume_prenume_medic End Function Public Function get_parola_cont() As String Return Me.parola_cont End Function Public Function get_telefon_contact() As String Return Me.telefon_contact End Function Public Function get_nume_cont() As String Return Me.nume_cont End Function End Class

54

Anexa 2: Sincronizare.vb
Imports System.Data.SqlServerCe Public Class Sincronizare Private InternetUrl As String = "http://192.168.0.1/H5N1/sqlcesa30.dll" Private Publisher As String = "MOBILE\MSSQL" Private PublisherDatabase As String = "BD_H5N1" Private Publication As String = "PUBLICATIE_H5N1" Private Subscriber As String = "SUBSCRIERE_H5N1" Private Cale_baza_date As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.GetName.CodeBase) & "\H5N1_MEDIC.sdf" Private SubscriberConnectionString As String = "Data Source=" & Cale_baza_date & ";Max Database Size=128;Default Lock Escalation =100;" Private repl As SqlCeReplication Sub New(ByVal medic As Medic) Me.New() repl.PublisherSecurityMode = SecurityType.DBAuthentication repl.PublisherLogin = medic.get_nume_cont repl.PublisherPassword = medic.get_parola_cont End Sub Sub New() repl = New SqlCeReplication repl.InternetUrl = Me.InternetUrl repl.Publisher = Me.Publisher repl.PublisherDatabase = Me.PublisherDatabase repl.Publication = Me.Publication repl.Subscriber = Me.Subscriber repl.SubscriberConnectionString = Me.SubscriberConnectionString repl.PublisherSecurityMode = SecurityType.NTAuthentication End Sub Public Function aceeasi_subscriere() As Boolean Dim repl_existent_tabele_sistem As New SqlCeReplication repl_existent_tabele_sistem.SubscriberConnectionString = Me.SubscriberConnectionString repl_existent_tabele_sistem.LoadProperties() If repl_existent_tabele_sistem.PublisherLogin.Equals(Me.repl.PublisherLogin) AndAlso _ repl_existent_tabele_sistem.InternetUrl.Equals(Me.repl.InternetUrl) AndAlso _ repl_existent_tabele_sistem.Publisher.Equals(Me.repl.Publisher) AndAlso _ repl_existent_tabele_sistem.PublisherDatabase.Equals(Me.repl.PublisherDatabase) AndAlso _ repl_existent_tabele_sistem.Publication.Equals(Me.repl.Publication) AndAlso _ repl_existent_tabele_sistem.Subscriber.Equals(Me.repl.Subscriber) Then Return True Else Return False End If End Function Public Function reinitializare_subscriere_si_sincronizare() As Boolean

55

Dim mesaj_avertizare As MsgBoxResult = MsgBox("Sigur doriti efectuarea acestei operatiuni?", MsgBoxStyle.Question + MsgBoxStyle.OkCancel + MsgBoxStyle.DefaultButton2, "Atentie!") If mesaj_avertizare = MsgBoxResult.Ok Then System.Windows.Forms.Cursor.Current = Cursors.WaitCursor repl.ReinitializeSubscription(True) repl.Synchronize() System.Windows.Forms.Cursor.Current = Cursors.Default MsgBox("Am finalizat sincronizarea!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly + MsgBoxStyle.DefaultButton1, "Sincronizare finalizata cu succes!") Return True Else Return False End If End Function

Public Function sincronizare() As Boolean Dim mesaj_avertizare As MsgBoxResult = MsgBox("Sigur doriti efectuarea acestei operatiuni?", MsgBoxStyle.Question + MsgBoxStyle.OkCancel + MsgBoxStyle.DefaultButton2, "Atentie!") If mesaj_avertizare = MsgBoxResult.Ok Then System.Windows.Forms.Cursor.Current = Cursors.WaitCursor repl.Synchronize() System.Windows.Forms.Cursor.Current = Cursors.Default MsgBox("Am finalizat sincronizarea!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly + MsgBoxStyle.DefaultButton1, "Sincronizare finalizata cu succes!") Return True Else Return False End If End Function End Class

56

Anexa 3: Autentificare.vb
Public Class Autentificare 'Instanierea membrului privat "sinc" (apelul metodelor acestei 'instane va determina realizarea sincronizrii anonime dintre 'abonat i editor). Private sinc As New Sincronizare 'Instanierea adaptorului prin intermediul 'cruia se vor efectua cutri n tabela MEDICI 'a bazei de date (H5N1_MEDIC.sdf) aflate pe dispozitivul smart. Private adaptor_autentifica_medic As New setul_de_date_H5N1TableAdapters.MEDICITableAdapter 'Instanierea setului de date local. Private setul_de_date As New setul_de_date_H5N1 'Procedur eveniment ce va fi apelat atunci cand utilizatorul 'apas butonul mbtnIesire ("Iesire app H5N1") al aplicaiei H5N1. Private Sub mbtnIesire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnIesire.Click Me.Close() End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul 'apas butonul mbtnSincronizareAnonima ("Sincronizare"). Private Sub mbtnSincronizareAnonima_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnSincronizareAnonima.Click Try sinc.reinitializare_subscriere_si_sincronizare() Catch ex As Exception Cursor.Current = Cursors.Default MsgBox("Nu am putut efectua sincronizarea! Motivul: " & ex.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul 'apas butonul mbtnAutentificare ("Autentificare"). Private Sub mbtnAutentificare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnAutentificare.Click Try Cursor.Current = Cursors.WaitCursor 'Baza de date H5N1_MEDIC.sdf va fi interogat pe baza 'intrrilor fcute de utilizatorul aplicaiei H5N1. adaptor_autentifica_medic.incarca_date_cont(setul_de_date.MEDICI, txtNumeDeCont.Text, txtParolaCont.Text) If setul_de_date.MEDICI.Rows.Count = 1 Then 'n cazul n care tabela MEDICI a setului de date va 'conine doar o singur nregistrare, se presupune 'c intrrile (numele de cont si parola) 'utilizatorului sunt valide, n consecin i va fi 'permis accesul la aplicaie.

57

'Pe baza datelor extrase din baza de date (date 'referitoare la contul utilizatorului aplicaiei 'H5N1), se va crea o instania a clasei Medic. Dim medic As Medic = New Medic(setul_de_date.MEDICI.Rows(0).Item("cod_medic"), setul_de_date.MEDICI.Rows(0).Item("nume_prenume_medic"), setul_de_date.MEDICI.Rows(0).Item("nume_cont"), setul_de_date.MEDICI.Rows(0).Item("parola_cont"), setul_de_date.MEDICI.Rows(0).Item("adresa_contact"), setul_de_date.MEDICI.Rows(0).Item("telefon_contact")) 'Se creeaz o instan a formularului AppH5N1 creia 'i sunt transmise prin intermediul parametrilor: '* date referitoare la medicul autentificat la aplicaie '* o nou instan a clasei Sincronizare '* referina obiectului curent Dim formular As New AppH5N1(medic, New Sincronizare(medic), Me) 'Se golete formularul utilizat 'la autentificarea utilizatorilor. Me.txtNumeDeCont.Text = "" Me.txtParolaCont.Text = "" Me.txtNumeDeCont.Focus() Cursor.Current = Cursors.Default 'Se afieaz formularul AppH5N1. formular.Show() 'Formularul curent (Autentificare) va fi "ascuns". Me.Hide() Else Cursor.Current = Cursors.Default 'n cazul n care nu exist medic al crui cont 's fie asociat numelui de cont i parolei introduse 'de utilizator, nu va fi permis accesul la celelalte 'formulare ale aplicaiei. Me.txtParolaCont.Text = "" MsgBox("Ai introdus gresit numele de cont sau parola!", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "Va rugam introduceti datele cu atentie!") End If Catch ex1 As Data.SqlServerCe.SqlCeException Cursor.Current = Cursors.Default MsgBox("Am intalnit urmatoarea exceptie: " & ex1.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") Catch ex2 As Exception Cursor.Current = Cursors.Default MsgBox("Am intalnit urmatoarea exceptie: " & ex2.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub End Class

58

Anexa 4: AppH5N1.vb
Public Class AppH5N1 'Se declar membrul public medic_autentificat de tip Medic. Public medic_autentificat As Medic 'Se declar membrul privat sinc de tip Sincronizare. Private sinc As Sincronizare 'Se declar membrul privat referinta_formular_autentificare de 'tip Autentificare (clasa formularului Autentificare) folosit n 'urmtorele secvene de cod pentru a controla comportamentul 'formularului Autentificare. Private referinta_formular_autentificare As Autentificare 'Se declar membrul privat prima_sincronizare_cu_reinitializare 'de tip Boolean ce va fi folosit n urmtoarele secvene de cod 'pentru a determina dac se va folosi, sau nu, metoda prin care 'sincronizarea cu editorul este insoit i de o reiniializare 'a subscrierii. Private prima_sincronizare_cu_reinitializare As Boolean = True 'Constructorul clasei AppH5N1 Sub New(ByRef medicul As Medic, ByVal sincul As Sincronizare, ByRef referinta_formular_autentificare As Autentificare) 'Apelul metodei InitializeComponent() este obligatoriu 'a fi efectuat. Secvenele de cod ale acestei metode 'pot fi vzute n fiierul AppH5N1.Designer.vb din 'directorul proiectului H5N1. Rolul acestei metode este de a 'iniializa componentele vizuale ale formularului AppH5N1. InitializeComponent() Me.medic_autentificat = medicul Me.sinc = sincul Me.referinta_formular_autentificare = referinta_formular_autentificare End Sub 'Procedur eveniment ce va fi apelat n momentul n care 'formularul AppH5N1 va fi ncrcat n memorie. Private Sub AppH5N1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Textul etichetei lblInfMedic va afia informaii despre 'medicul autentificat la aplicaie. Me.lblInfMedic.Text = "Nume Prenume: " & medic_autentificat.get_nume_prenume_medic & vbCrLf _ & "Nume de cont: " & medic_autentificat.get_nume_cont & vbCrLf _ & "Adresa: " & medic_autentificat.get_adresa_contact & vbCrLf _ & "Telefon: " & medic_autentificat.get_telefon_contact End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul

59

'va apsa butonul mbtnConsultatiiEfectuate '("Consultaii efectuate") al aplicaiei H5N1. Private Sub mbtnConsultatiiEfectuate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnConsultatiiEfectuate.Click Cursor.Current = Cursors.WaitCursor 'Se creeaz o instan a formularului Consultatie creia 'i sunt transmise prin intermediul parametrilor: '* referinta_formular_AppH5N1 - referina obiectului curent; '* pacient_nou - valoarea FALSE, prin care 'formularul va prelua comportamentul formularului de editare 'consultaii pacieni. Dim formular_vizualizare_modificare_pacienti As New Consultatie(Me, False) Cursor.Current = Cursors.Default 'Se afieaz formularul Consultatie. formular_vizualizare_modificare_pacienti.Show() 'Formularul curent va fi "ascuns". Me.Hide() End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul 'va apsa butonul mbtnConsultPacient ("Consultatie pacient") 'al aplicaiei H5N1. Private Sub mbtnConsultPacient_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnConsultPacient.Click Cursor.Current = Cursors.WaitCursor 'Se creeaz o instan a formularului Consultatie, doar c 'de aceast dat, parametrului pacient_nou i va fi transmis 'valoarea TRUE, fapt care va determina ca noul formular 's preia comportamentul formularului de introducere date 'consultaii pacieni. Dim formular_vizualizare_modificare_pacienti As New Consultatie(Me, True) Cursor.Current = Cursors.Default formular_vizualizare_modificare_pacienti.Show() Me.Hide() End Sub 'Procedura eveniment ce va fi apelat atunci cnd utilizatorul 'va apsa butonul mbtnSincronizare ("Sincronizare"). Private Sub mbtnSincronizare_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnSincronizare.Click Try If prima_sincronizare_cu_reinitializare AndAlso Not sinc.aceeasi_subscriere Then 'n cazul n care utilizatorul aplicaiei

60

'dorete realizarea sincronizrii cu editorul, i: '* acest proces este cerut a se realiza pentru 'prima oara de cnd utilizatorul s-a autentificat 'la aplicaie; '* datele referitoare la subscriere nu aparin 'utilizatorului autentificat; 'atunci procesul de sincronizare va fi nsoit 'i de o reiniializare a subscrierii. If sinc.reinitializare_subscriere_si_sincronizare() Then prima_sincronizare_cu_reinitializare = False End If Else 'n cazul n care utilizatorul aplicaiei a mai 'efectuat sincronizari cu editorul, sau ultima 'subscriere i aparine medicului autentificat, 'atunci noua cerere nu va trebui a fi nsoit 'i de o reiniializare a subscrierii. sinc.sincronizare() prima_sincronizare_cu_reinitializare = False End If Catch ex As Exception Cursor.Current = Cursors.Default MsgBox("Nu am putut efectua sincronizarea! Motivul: " & ex.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul 'va apsa butonul mbtnSfarsitSesiune ("Sfarsit sesiune") al 'aplicaiei H5N1. Private Sub mbtnSfarsitSesiune_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnSfarsitSesiune.Click 'Se apeleaz metoda Show() a formularului Autentificare. referinta_formular_autentificare.Show() 'Formularul curent (AppH5N1) va fi nchis. Me.Close() End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul 'va apsa butonul mbtnIesire ("Iesire app H5N1"). Private Sub mbtnIesire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mbtnIesire.Click 'Se apeleaz metoda Close() a formularului Autentificare, 'metod care va determina nchiderea aplicaiei. referinta_formular_autentificare.Close() End Sub End Class

61

Anexa5: Consultatie.vb
Public Class Consultatie 'Se declar membrul privat referinta_formular_AppH5N1 de tip AppH5N1 '(clasa formularului AppH5N1), folosit n urmtoarele secvene de cod 'pentru a controla comportamentul formularului AppH5N1. Private referinta_formular_AppH5N1 As AppH5N1 'Membrul privat pacient_nou va fi folosit n urmtoarele secvene de 'cod pentru a determina comportamentul formularului (introducere date 'consultaie pacient / editare date consultaie pacient). Private pacient_nou As Boolean 'Membrul privat rand_pacient este de tip ANAMNEZARow iar n 'urmtoarele secvene de cod va prelua datele consultaiei pacientului 'curent. Private rand_pacient As setul_de_date_H5N1.ANAMNEZARow 'Constructorul clasei Consultatie Sub New(ByRef referinta_formular_AppH5N1 As AppH5N1, Optional ByVal pacient_nou As Boolean = True) 'Apelul metodei InitializeComponent() 'este obligatoriu a fi efectuat. InitializeComponent() Try Me.referinta_formular_AppH5N1 = referinta_formular_AppH5N1 Me.pacient_nou = pacient_nou If pacient_nou Then 'Formatul formularului n cazul n care se doresc a fi 'introduse date despre o nou consultaie. Me.Text = "Date consult pacient!" cmbAlegePacient.Enabled = False Else 'Formatul formularului n cazul n care se dorete 'vizualizarea/modificarea datelor unei anumite consultaii. Me.adaptorANAMNEZA.incarca_date_anamneza(Me.setul_de_date.ANAMNEZA, referinta_formular_AppH5N1.medic_autentificat.get_cod_medic) Me.Text = "Modifica date pacienti!" cmbAlegePacient.Enabled = True Me.txtNumePrenume.ForeColor = System.Drawing.Color.DarkRed Me.nudVarsta.ForeColor = System.Drawing.Color.DarkRed Me.txtAdresa.ForeColor = System.Drawing.Color.DarkRed Me.rbnUrban.ForeColor = System.Drawing.Color.DarkRed Me.rbnRural.ForeColor = System.Drawing.Color.DarkRed Me.txtNrTelefon.ForeColor = System.Drawing.Color.DarkRed Me.nudNrZileAparitieSimptome.ForeColor = System.Drawing.Color.DarkRed Me.txtTemperatura.ForeColor = System.Drawing.Color.DarkRed Me.rbnDureriCapDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnDureriCapNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnDureriGatDa.ForeColor = System.Drawing.Color.DarkRed

62

Me.rbnDureriGatNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnDureriMusculareDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnDureriMusculareNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnNasInfundatDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnNasInfundatNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnConjunctivitaDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnConjunctivitaNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnTuseDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnTuseNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnSenzatieSufocareDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnSenzatieSufocareNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnInsuficientaRespiratorieDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnInsuficientaRespiratorieNu.ForeColor = System.Drawing.Color.DarkRed Me.rbnContactAnimaleDa.ForeColor = System.Drawing.Color.DarkRed Me.rbnContactAnimaleNu.ForeColor = System.Drawing.Color.DarkRed Me.txtInformatiiSuplimentare.ForeColor = System.Drawing.Color.DarkRed Me.btnSalveaza.Text = "Salveaza modificari pacient!" Me.btnSalveaza.ForeColor = System.Drawing.Color.DarkRed Me.btnReseteaza.Text = "Renunta modificari pacient!" Me.btnReseteaza.ForeColor = System.Drawing.Color.DarkRed If Me.setul_de_date.ANAMNEZA.Rows.Count = 0 Then Me.btnSalveaza.Enabled = False Me.btnReseteaza.Enabled = False End If End If Catch ex As Exception MsgBox("Am intalnit urmatoarea exceptie: " & ex.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub Private Sub ANAMNEZABindingSource_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ANAMNEZABindingSource.PositionChanged Try 'Membrul privat rand_pacient va prelua datele 'pacientului curent. Me.rand_pacient = setul_de_date.ANAMNEZA.Rows(setul_de_date.ANAMNEZA.Rows.IndexOf(CType(ANAMNEZABindingSource.Current, System.Data.DataRowView).Row)) 'Se apeleaz metoda prin care formularul aplicaiei 'va fi completat cu datele preluate de 'membrul privat rand_pacient. Me.incarca_date_pacient_in_formular() Catch ex As Exception MsgBox("Am intalnit urmatoarea exceptie: " & ex.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub

63

'Metod al crei rol este de a completa formularul aplicaiei 'cu datele preluate de membrul privat rand_pacient. Private Sub incarca_date_pacient_in_formular() Me.txtNumePrenume.Text = rand_pacient.Item("nume_prenume_pacient") Me.nudVarsta.Value = rand_pacient.Item("varsta") If rand_pacient.Item("adresa").Equals(DBNull.Value) Then Me.txtAdresa.Text = "" Else Me.txtAdresa.Text = rand_pacient.Item("adresa") End If If rand_pacient.Item("mediu_urban_rural") Then Me.rbnUrban.Checked = True Else Me.rbnRural.Checked = True End If If rand_pacient.Item("telefon").Equals(DBNull.Value) Then Me.txtNrTelefon.Text = "" Else Me.txtNrTelefon.Text = rand_pacient.Item("telefon") End If Me.nudNrZileAparitieSimptome.Value = rand_pacient.Item("nr_zile_apar_simpt") Me.txtTemperatura.Text = rand_pacient.Item("temperatura") If rand_pacient.Item("dureri_de_cap") Then Me.rbnDureriCapDa.Checked = True Else Me.rbnDureriCapNu.Checked = True End If If rand_pacient.Item("dureri_de_gat") Then Me.rbnDureriGatDa.Checked = True Else Me.rbnDureriGatNu.Checked = True End If If rand_pacient.Item("dureri_musculare") Then Me.rbnDureriMusculareDa.Checked = True Else Me.rbnDureriMusculareNu.Checked = True End If If rand_pacient.Item("nas_infundat") Then Me.rbnNasInfundatDa.Checked = True Else Me.rbnNasInfundatNu.Checked = True End If If rand_pacient.Item("conjunctivita") Then Me.rbnConjunctivitaDa.Checked = True Else Me.rbnConjunctivitaNu.Checked = True End If If rand_pacient.Item("tuse") Then Me.rbnTuseDa.Checked = True

64

Else Me.rbnTuseNu.Checked = True End If If rand_pacient.Item("senzatie_de_sufocare") Then Me.rbnSenzatieSufocareDa.Checked = True Else Me.rbnSenzatieSufocareNu.Checked = True End If If rand_pacient.Item("insuficienta_respiratorie") Then Me.rbnInsuficientaRespiratorieDa.Checked = True Else Me.rbnInsuficientaRespiratorieNu.Checked = True End If If rand_pacient.Item("contact_animale") Then Me.rbnContactAnimaleDa.Checked = True Else Me.rbnContactAnimaleNu.Checked = True End If If rand_pacient.Item("informatii_suplimentare").Equals(DBNull.Value) Then Me.txtInformatiiSuplimentare.Text = "" Else Me.txtInformatiiSuplimentare.Text = rand_pacient.Item("informatii_suplimentare") End If End Sub Private Sub btnReseteaza_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReseteaza.Click If Me.pacient_nou Then 'n cazul n care formularul este folosit pentru a introduce 'date despre noi consultaii, atunci formularul va fi 'adus la forma implicit (formular necompletat). Me.txtNumePrenume.Text = "" Me.nudVarsta.Value = 35 Me.txtAdresa.Text = "" Me.rbnUrban.Checked = True Me.txtNrTelefon.Text = "" Me.nudNrZileAparitieSimptome.Value = 0 Me.txtTemperatura.Text = 36.5 Me.rbnDureriCapDa.Checked = False Me.rbnDureriCapNu.Checked = False Me.rbnDureriGatDa.Checked = False Me.rbnDureriGatNu.Checked = False Me.rbnDureriMusculareDa.Checked = False Me.rbnDureriMusculareNu.Checked = False Me.rbnNasInfundatDa.Checked = False Me.rbnNasInfundatNu.Checked = False Me.rbnConjunctivitaDa.Checked = False Me.rbnConjunctivitaNu.Checked = False Me.rbnTuseDa.Checked = False Me.rbnTuseNu.Checked = False

65

Me.rbnSenzatieSufocareDa.Checked = False Me.rbnSenzatieSufocareNu.Checked = False Me.rbnInsuficientaRespiratorieDa.Checked = False Me.rbnInsuficientaRespiratorieNu.Checked = False Me.rbnContactAnimaleDa.Checked = False Me.rbnContactAnimaleNu.Checked = False Me.txtInformatiiSuplimentare.Text = "" Else 'n cazul n care formularul este folosit pentru a modifica 'datele unui pacient i se dorete: '* ca modificrile efectuate s nu fie permanentizate; '* formularul s fie adus la forma de dinaintea efecturii 'modificrilor; 'atunci se va apela metoda incarca_date_pacient_in_formular(). Me.incarca_date_pacient_in_formular() End If End Sub 'Procedur eveniment ce va fi apelat atunci cnd utilizatorul apas 'pe butonul btnSalveaza '("Salveaza date pacient nou"/"Salveaza modificari pacient!") Private Sub btnSalveaza_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalveaza.Click Try Dim rand_tabela_date_anamneza As setul_de_date_H5N1.ANAMNEZARow rand_tabela_date_anamneza = setul_de_date.ANAMNEZA.NewANAMNEZARow 'Variabila ce va pstra motivele pentru care salvarea datelor 'referitoare la consultaie nu se poate efectua datorit 'completrii eronate a formularului. Dim motiv_formularul_nu_este_corect_completat As String = "" 'Se efectueaz simple verificri asupra datelor introduse de 'utilizator. If Me.txtNumePrenume.Text.Trim.Length > 0 Then rand_tabela_date_anamneza.Item("nume_prenume_pacient") = Me.txtNumePrenume.Text Else motiv_formularul_nu_este_corect_completat = "Este necesar a completa numele si prenumele pacientului!" & vbCrLf End If rand_tabela_date_anamneza.Item("varsta") = Me.nudVarsta.Value If Me.txtAdresa.Text.Trim.Length = 0 Then rand_tabela_date_anamneza.Item("adresa") = DBNull.Value Else rand_tabela_date_anamneza.Item("adresa") = Me.txtAdresa.Text.Trim End If If Me.rbnUrban.Checked Then rand_tabela_date_anamneza.Item("mediu_urban_rural") = True Else

66

rand_tabela_date_anamneza.Item("mediu_urban_rural") = False End If If Me.txtNrTelefon.Text.Trim.Length = 0 Then rand_tabela_date_anamneza.Item("telefon") = DBNull.Value Else rand_tabela_date_anamneza.Item("telefon") = Me.txtNrTelefon.Text.Trim End If rand_tabela_date_anamneza.Item("nr_zile_apar_simpt") = Me.nudNrZileAparitieSimptome.Value rand_tabela_date_anamneza.Item("temperatura") = Me.txtTemperatura.Text If Me.rbnDureriCapDa.Checked Or Me.rbnDureriCapNu.Checked Then If Me.rbnDureriCapDa.Checked Then rand_tabela_date_anamneza.Item("dureri_de_cap") = True Else rand_tabela_date_anamneza.Item("dureri_de_cap") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Dureri de cap""" & vbCrLf End If

If Me.rbnDureriGatDa.Checked Or Me.rbnDureriGatNu.Checked Then If Me.rbnDureriGatDa.Checked Then rand_tabela_date_anamneza.Item("dureri_de_gat") = True Else rand_tabela_date_anamneza.Item("dureri_de_gat") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Dureri de gat""" & vbCrLf End If If Me.rbnDureriMusculareDa.Checked Or Me.rbnDureriMusculareNu.Checked Then If Me.rbnDureriMusculareDa.Checked Then rand_tabela_date_anamneza.Item("dureri_musculare") = True Else rand_tabela_date_anamneza.Item("dureri_musculare") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Dureri musculare""" & vbCrLf End If If Me.rbnNasInfundatDa.Checked Or Me.rbnNasInfundatNu.Checked Then If Me.rbnNasInfundatDa.Checked Then rand_tabela_date_anamneza.Item("nas_infundat") = True Else rand_tabela_date_anamneza.Item("nas_infundat") = False

67

End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Nas infundat""" & vbCrLf End If If Me.rbnConjunctivitaDa.Checked Or Me.rbnConjunctivitaNu.Checked Then If Me.rbnConjunctivitaDa.Checked Then rand_tabela_date_anamneza.Item("conjunctivita") = True Else rand_tabela_date_anamneza.Item("conjunctivita") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Conjunctivita""" & vbCrLf End If If Me.rbnTuseDa.Checked Or Me.rbnTuseNu.Checked Then If Me.rbnTuseDa.Checked Then rand_tabela_date_anamneza.Item("tuse") = True Else rand_tabela_date_anamneza.Item("tuse") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Tuse""" & vbCrLf End If If Me.rbnSenzatieSufocareDa.Checked Or Me.rbnSenzatieSufocareNu.Checked Then If Me.rbnSenzatieSufocareDa.Checked Then rand_tabela_date_anamneza.Item("senzatie_de_sufocare") = True Else rand_tabela_date_anamneza.Item("senzatie_de_sufocare") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Senzatie sufocare""" & vbCrLf End If If Me.rbnInsuficientaRespiratorieDa.Checked Or Me.rbnInsuficientaRespiratorieNu.Checked Then If Me.rbnInsuficientaRespiratorieDa.Checked Then rand_tabela_date_anamneza.Item("insuficienta_respiratorie") = True Else rand_tabela_date_anamneza.Item("insuficienta_respiratorie") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Insuficienta resp.""" & vbCrLf End If If Me.rbnContactAnimaleDa.Checked Or Me.rbnContactAnimaleNu.Checked Then If Me.rbnContactAnimaleDa.Checked Then rand_tabela_date_anamneza.Item("contact_animale") = True Else

68

rand_tabela_date_anamneza.Item("contact_animale") = False End If Else motiv_formularul_nu_este_corect_completat &= "Nu ati completat rubrica ""Contact animale""" End If If Me.txtInformatiiSuplimentare.Text.Trim.Length = 0 Then rand_tabela_date_anamneza.Item("informatii_suplimentare") = DBNull.Value Else rand_tabela_date_anamneza.Item("informatii_suplimentare") = Me.txtInformatiiSuplimentare.Text End If If motiv_formularul_nu_este_corect_completat.Length = 0 Then If Me.pacient_nou Then rand_tabela_date_anamneza.Item("cod_medic") = Me.referinta_formular_AppH5N1.medic_autentificat.get_cod_medic rand_tabela_date_anamneza.Item("data_consult") = DateTime.Now rand_tabela_date_anamneza.Item("rowguid") = System.Guid.NewGuid If MsgBox("Sigur doriti a salva datele noului pacient?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Atentie!") = MsgBoxResult.Yes Then Cursor.Current = Cursors.WaitCursor 'n cazul n care datele introduse se refer la o 'nou consultaie, iar formularul este corect 'completat, atunci datele despre noua consultaie 'vor fi salvate n baza de date H5N1_MEDIC.sdf. Me.setul_de_date.ANAMNEZA.Rows.Add(rand_tabela_date_anamneza) Me.adaptorANAMNEZA.Update(Me.setul_de_date.ANAMNEZA) Cursor.Current = Cursors.Default MsgBox("Datele au fost salvate in baza de date locala!", MsgBoxStyle.Information) Me.Consultatie_Deactivate(Nothing, Nothing) End If Else If MsgBox("Sigur doriti a salva modificarile aduse asupra consultatiei pacientului?", MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, "Atentie!") = MsgBoxResult.Yes Then 'n cazul modificrii datelor unei consultaii, 'iar formularul este corect completat, atunci 'modificrile vor fi permanentizate 'n baza de date. Me.rand_pacient.Item("nume_prenume_pacient") = rand_tabela_date_anamneza.Item("nume_prenume_pacient") Me.rand_pacient.Item("varsta") = rand_tabela_date_anamneza.Item("varsta") Me.rand_pacient.Item("adresa") = rand_tabela_date_anamneza.Item("adresa") Me.rand_pacient.Item("mediu_urban_rural") = rand_tabela_date_anamneza.Item("mediu_urban_rural") Me.rand_pacient.Item("telefon") = rand_tabela_date_anamneza.Item("telefon") Me.rand_pacient.Item("nr_zile_apar_simpt") = rand_tabela_date_anamneza.Item("nr_zile_apar_simpt") Me.rand_pacient.Item("temperatura") = rand_tabela_date_anamneza.Item("temperatura")

69

Me.rand_pacient.Item("dureri_de_cap") = rand_tabela_date_anamneza.Item("dureri_de_cap") Me.rand_pacient.Item("dureri_de_gat") = rand_tabela_date_anamneza.Item("dureri_de_gat") Me.rand_pacient.Item("dureri_musculare") = rand_tabela_date_anamneza.Item("dureri_musculare") Me.rand_pacient.Item("nas_infundat") = rand_tabela_date_anamneza.Item("nas_infundat") Me.rand_pacient.Item("conjunctivita") = rand_tabela_date_anamneza.Item("conjunctivita") Me.rand_pacient.Item("tuse") = rand_tabela_date_anamneza.Item("tuse") Me.rand_pacient.Item("senzatie_de_sufocare") = rand_tabela_date_anamneza.Item("senzatie_de_sufocare") Me.rand_pacient.Item("insuficienta_respiratorie") = rand_tabela_date_anamneza.Item("insuficienta_respiratorie") Me.rand_pacient.Item("contact_animale") = rand_tabela_date_anamneza.Item("contact_animale") Me.rand_pacient.Item("informatii_suplimentare") = rand_tabela_date_anamneza.Item("informatii_suplimentare") Cursor.Current = Cursors.WaitCursor Me.adaptorANAMNEZA.Update(Me.setul_de_date.ANAMNEZA) Cursor.Current = Cursors.Default MsgBox("Modificarile au fost salvate in baza de date locala!", MsgBoxStyle.Information) End If End If Else MsgBox(motiv_formularul_nu_este_corect_completat, MsgBoxStyle.Exclamation, "Nu pot efectua operatiunea!") End If Catch ex As Exception Cursor.Current = Cursors.Default MsgBox("Am intalnit urmatoarea exceptie: " & ex.Message & "", MsgBoxStyle.OkOnly + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton1, "Ups!!! Probleme ...") End Try End Sub Private Sub Consultatie_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate referinta_formular_AppH5N1.Show() Me.Close() End Sub End Class

70

Anexa 6: Conditii_Instalare_Dezinstalare.vb
Imports Imports Imports Imports Imports System.Windows.Forms System.Diagnostics System.Reflection System.IO Microsoft.Win32

<System.ComponentModel.RunInstaller(True)> _ Public Class Conditii_Instalare_Dezinstalare Inherits System.Configuration.Install.Installer Private Sub Conditii_Instalare_Dezinstalare_AfterInstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles MyBase.AfterInstall 'Secvene de cod ce vor fi executate atunci cnd aplicaia 'va fi instalat. Dim cale_manager_aplicatie As String = extrage_cale_manager_aplicatie() If cale_manager_aplicatie.Length > 0 Then Dim cale_fisier_ini As String = """" & Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "setup.ini") & """" Process.Start(cale_manager_aplicatie, cale_fisier_ini) End If End Sub Private Sub Conditii_Instalare_Dezinstalare_AfterUninstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles MyBase.AfterUninstall 'Secvene de cod ce vor fi executate atunci cnd aplicaia 'va fi dezinstalat. Dim cale_manager_aplicatie As String = extrage_cale_manager_aplicatie() If cale_manager_aplicatie.Length > 0 Then Process.Start(cale_manager_aplicatie) End If End Sub Public Shared Function extrage_cale_manager_aplicatie() As String 'Funcia are rolul de a verifica dac 'Managerul de Aplicaii CE este instalat pe staia local. 'Se verific dac printre regitrii staiei locale 'se afl cheia "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\CEAPPMGR.EXE". Dim cheie_registru As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\CEAPPMGR.EXE") If Not cheie_registru Is Nothing AndAlso cheie_registru.GetValue(String.Empty, String.Empty).ToString.Length > 0 Then 'n cazul n care Managerul de Aplicaii este instalat, 'se va returna valoarea registrului (calea de pe discul 'local unde poate fi gsit CEAPPMGR.EXE). Return cheie_registru.GetValue("") Else 'n caz contrar, utilizatorului 'i va fi afiat un mesaj de eroare! MessageBox.Show("Managerul de Aplicatii CE nu este instalat!", "Nu am gasit Managerul de Aplicatii CE!", MessageBoxButtons.OK,

71

MessageBoxIcon.Error) Return "" End If End Function End Class

72

Anexa 7: Varianta 1 (varianta clasic)


Public Class Agent Implements IComparable(Of Agent) Public IntCodAgent As Integer Private StrNumePrenume As String Private StrNumeCont As String Private StrParola As String Private StrAdresa As String Private StrTelefon As String Sub New(ByVal CodAgent As Integer, ByVal NumePrenume As String, ByVal NumeCont As String, ByVal Parola As String, ByVal Adresa As String, ByVal Telefon As String) Me.CodAgent = CodAgent Me.NumePrenume = NumePrenume Me.NumeCont = NumeCont Me.Parola = Parola Me.Adresa = Adresa Me.Telefon = Telefon End Sub Public Property CodAgent() As Integer Get Return Me.IntCodAgent End Get Set(ByVal value As Integer) Me.IntCodAgent = value End Set End Property Public Property NumePrenume() As String Get Return Me.StrNumePrenume End Get Set(ByVal value As String) Me.StrNumePrenume = value End Set End Property Public Property NumeCont() As String Get Return Me.StrNumeCont End Get Set(ByVal value As String) Me.StrNumeCont = value End Set End Property

73

Public Property Parola() As String Get Return Me.StrParola End Get Set(ByVal value As String) Me.StrParola = value End Set End Property Public Property Adresa() As String Get Return Me.StrAdresa End Get Set(ByVal value As String) Me.StrAdresa = value End Set End Property Public Property Telefon() As String Get Return Me.StrTelefon End Get Set(ByVal value As String) Me.StrTelefon = value End Set End Property Public Overrides Function ToString() As String Dim StrMesaj As String = "Tipul Agent; Cod: " & Me.CodAgent & "; " If Not Me.NumePrenume Is Nothing Then StrMesaj &= "Nume si prenume: " & Me.NumePrenume & "; " End If If Not Me.NumeCont Is Nothing Then StrMesaj &= "Nume de cont: " & Me.NumeCont & "; " End If If Not Me.Parola Is Nothing Then StrMesaj &= "Parola: " & Me.Parola & "; " End If If Not Me.Adresa Is Nothing Then StrMesaj &= "Adresa: " & Me.Adresa & "; " End If If Not Me.Telefon Is Nothing Then StrMesaj &= "Telefon: " & Me.Telefon & "; " End If

74

Return StrMesaj End Function Public Function CompareTo(ByVal other As Agent) As Integer Implements System.IComparable(Of Agent).CompareTo Return String.Compare(Me.NumePrenume, other.NumePrenume) End Function End Class Dim LstAgenti As New List(Of Agent) LstAgenti.Add(New Agent(1, "Lazar Caraion", "lcaraion", "ayk_32653", "Str. M.Eminescu, nr.42", "0744000000")) LstAgenti.Add(New Agent(2, "Iurea Simion", "isimion", "0!5tkq", "Str. I.Creanga, nr.44 bis", "0744000001")) LstAgenti.Add(New Agent(3, "Vasc Simona", "vsimona", "_9b4gt3", "Str. V.Micle, Bl.I, Sc.B, Ap.2", "0744000002")) LstAgenti.Add(New Agent(4, "Ardelean Marcu", "amarcu", "lqrnya852", "Str. I.L.Caragiale, nr.22", "0741000002")) LstAgenti.Add(New Agent(5, "Popovici Ioana", "pioana", "~9d$hpak", "Str. Maresal Ion Antonescu, nr.82", Nothing)) LstAgenti.Sort() Dim StrInCazCaNuAreTelefon = "Fara telefon" Dim LstDeTelefoane As New Collection For Each Ag As Agent In LstAgenti If Ag.Telefon Is Nothing Then If Not LstDeTelefoane.Contains(StrInCazCaNuAreTelefon) Then LstDeTelefoane.Add(New List(Of Agent), StrInCazCaNuAreTelefon) CType(LstDeTelefoane(StrInCazCaNuAreTelefon), List(Of Agent)).Add(Ag) Else CType(LstDeTelefoane(StrInCazCaNuAreTelefon), List(Of Agent)).Add(Ag) End If Else If Not LstDeTelefoane.Contains(Ag.Telefon.Substring(0, 4)) Then LstDeTelefoane.Add(New List(Of Agent), Ag.Telefon.Substring(0, 4)) CType(LstDeTelefoane(Ag.Telefon.Substring(0, 4)), List(Of Agent)).Add(Ag) Else CType(LstDeTelefoane(Ag.Telefon.Substring(0, 4)), List(Of Agent)).Add(Ag) End If End If Next For Each LstaAgentiPerTipNumarTelefon As List(Of Agent) In LstDeTelefoane If LstaAgentiPerTipNumarTelefon(0).Telefon Is Nothing Then Console.WriteLine("Tip numar:" & StrInCazCaNuAreTelefon) Else Console.WriteLine("Tip numar:" & LstaAgentiPerTipNumarTelefon(0).Telefon.Substring(0, 4)) End If For Each Ag As Agent In LstaAgentiPerTipNumarTelefon Console.WriteLine(Ag.ToString()) Next Next

75

Anexa 8: Varianta 2 (varianta ce folosete LINQ)


Public Class Agent Public IntCodAgent As Integer Private StrNumePrenume As String Private StrNumeCont As String Private StrParola As String Private StrAdresa As String Private StrTelefon As String Sub New(ByVal CodAgent As Integer, ByVal NumePrenume As String, ByVal NumeCont As String, ByVal Parola As String, ByVal Adresa As String, ByVal Telefon As String) Me.CodAgent = CodAgent Me.NumePrenume = NumePrenume Me.NumeCont = NumeCont Me.Parola = Parola Me.Adresa = Adresa Me.Telefon = Telefon End Sub Public Property CodAgent() As Integer Get Return Me.IntCodAgent End Get Set(ByVal value As Integer) Me.IntCodAgent = value End Set End Property Public Property NumePrenume() As String Get Return Me.StrNumePrenume End Get Set(ByVal value As String) Me.StrNumePrenume = value End Set End Property Public Property NumeCont() As String Get Return Me.StrNumeCont End Get Set(ByVal value As String) Me.StrNumeCont = value End Set End Property Public Property Parola() As String

76

Get Return Me.StrParola End Get Set(ByVal value As String) Me.StrParola = value End Set End Property Public Property Adresa() As String Get Return Me.StrAdresa End Get Set(ByVal value As String) Me.StrAdresa = value End Set End Property Public Property Telefon() As String Get Return Me.StrTelefon End Get Set(ByVal value As String) Me.StrTelefon = value End Set End Property Public Overrides Function ToString() As String Dim StrMesaj As String = "Tipul Agent; Cod: " & Me.CodAgent & "; " If Not Me.NumePrenume Is Nothing Then StrMesaj &= "Nume si prenume: " & Me.NumePrenume & "; " End If If Not Me.NumeCont Is Nothing Then StrMesaj &= "Nume de cont: " & Me.NumeCont & "; " End If If Not Me.Parola Is Nothing Then StrMesaj &= "Parola: " & Me.Parola & "; " End If If Not Me.Adresa Is Nothing Then StrMesaj &= "Adresa: " & Me.Adresa & "; " End If If Not Me.Telefon Is Nothing Then StrMesaj &= "Telefon: " & Me.Telefon & "; " End If

77

Return StrMesaj End Function End Class Dim LstAgenti As New List(Of Agent) LstAgenti.Add(New Agent(1, "Lazar Caraion", "lcaraion", "ayk_32653", "Str. M.Eminescu, nr.42", "0744000000")) LstAgenti.Add(New Agent(2, "Iurea Simion", "isimion", "0!5tkq", "Str. I.Creanga, nr.44 bis", "0744000001")) LstAgenti.Add(New Agent(3, "Vasc Simona", "vsimona", "_9b4gt3", "Str. V.Micle, Bl.I, Sc.B, Ap.2", "0744000002")) LstAgenti.Add(New Agent(4, "Ardelean Marcu", "amarcu", "lqrnya852", "Str. I.L.Caragiale, nr.22", "0741000002")) LstAgenti.Add(New Agent(5, "Popovici Ioana", "pioana", "~9d$hpak", "Str. Maresal Ion Antonescu, nr.82", Nothing))

Dim StrInCazCaNuAreTelefon = "Fara telefon" Dim IERezGroupBy = From TipNumarSiAg In (From Ag As Agent In LstAgenti.OrderBy(Function(Ag As Agent) Ag.NumePrenume) _ Where Ag.Telefon Is Nothing Select New With {.TipNumar = StrInCazCaNuAreTelefon, .Agentul = Ag}) _ .Union(From Ag As Agent In LstAgenti.OrderBy(Function(Ag As Agent) Ag.NumePrenume) _ Where Not Ag.Telefon Is Nothing Select New With {.TipNumar = Ag.Telefon.Substring(0, 4), .Agentul = Ag}) _ .GroupBy(Function(AnonTip) AnonTip.TipNumar) For Each Anon In IERezGroupBy Console.WriteLine("Tip numar:" & Anon(0).TipNumar) For Each TipNumarSiAg In Anon Console.WriteLine(TipNumarSiAg.Agentul.ToString()) Next Next

78

Bibliografie
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
14.

15. 16. 17.

Anderson, C., Freeman., James, L., Johnston, A. Ljung, S., Mobile Media and Applications, From Concept to Cash: Successful Service Creation and Launch, Wiley, 2006 Andy, W., Peter, R., Building .NET Applications for Mobile Devices, Microsoft Corporation, 2002 Andy, W., Stephen, W., Microsoft .NET Compact Framework, Microsoft Press, Washington, 2003 Dan, F., Jon, B., Building Solutions with the Microsoft .NET Compact Framework: Architecture and Best Practices for Mobile Development, Pearson Education, Boston, 31 Oct. 2003 Erik, R., Ronnie, Y., Microsoft .NET Compact Framework Kick Start, Sams Publishing, 2004 Fotache, M., Proiectarea bazelor de date, Editura Polirom, Iai, 2005 Jaokar, A., Fish, T., Mobile Web 2.0: The Innovators Guide to Developing and Marketing Next Generation Wireless/Mobile Applications, 2006 MacDonald, M., Szpuszta, M., Pro ASP.NET 2.0 in C# 2005, Apress, New York, USA, 2005 McPherson, F., How to Do Everything with Windows Mobile, McGraw-Hill Osborne Media, 2006 Octavian, D., Viorel, I., Aplicaii mobile pe platforma .NET, Editura Universitii Alexandru Ioan Cuza, Iai, 2007 Susman, D., Homer, A., ASP.NET 2.0 Visual Web Developer 2005 Express Edition, Wiley Publishing Inc., Indianopolis, Indiana, USA, 2006 Microsoft - http://channel9.msdn.com/wiki/mobiledeveloper/homepage Microsoft - http://msdn.microsoft.com/en-us/library/ms171850.aspx Microsoft - http://msdn.microsoft.com/en-us/library/ms151198.aspx Microsoft - http://msdn.microsoft.com/en-us/netframework/aa497273.aspx Microsoft - http://www.microsoft.com/sql/editions/compact/default.mspx Microsoft - http://www.microsoft.com/windowsmobile/default.aspx

79