Documente Academic
Documente Profesional
Documente Cultură
APLICAII MOBILE
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.
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
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
Platforma Java ME
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.
VB.NET, C#
Medie
Palm OS
C, C++
Excelent
Eclipse.
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.
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
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).
EDITOR
ABONAT
ISTORIC DATE
(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
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
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.
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.
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).
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).
13
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.
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
Password: Confirm Password: User must change password at next logon Password never expires
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
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).
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
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
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).
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.
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.
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.
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
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.
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
PublisherChanges
PublisherDatabase PublisherLogin
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.
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
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
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
mbtnSincronizare
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
32
nudNrZileAparitieSimptome txtTemperatura rbnDureriCapDa rbnDureriGatDa rbnDureriMusculare Da rbnNasInfundatDa rbnConjunctivitaDa rbnTuseDa rbnSenzatieSufocareDa rbnInsuficientaRespiratorieDa rbnContactAnimaleDa rbnDureriCapNu rbnDureriGatNu rbnDureriMusculareNu rbnNasInfundatNu rbnConjunctivitaNu rbnTuseNu rbnSenzatieSufocareNu rbnInsuficientaRespiratorieNu rbnContactAnimaleNu
33
txtInformatiiSuplimentare
btnSalveaza
btnReseteaza
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.
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
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()
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;
38
pentru proprietatea DisplayMember se va selecta nume_prenume_pacient; pentru proprietatea ValueMember se va selecta cod_pacient;
setul de date i adaptorul generate de wizard vor fi redenumite conform imaginii urmtoare;
39
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;
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.
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
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.
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
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
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.
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.
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.
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.
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
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
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 ...).
Ultimele operaiuni necesarare a fi efectuate constau n a: completa proprietile Author, Manufacturer, ProductName, Title; compila pachetul de instalare.
50
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
72
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
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.
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