+ All Categories
Home > Documents > Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

Date post: 22-Jun-2015
Category:
Upload: mihai-alexa
View: 73 times
Download: 1 times
Share this document with a friend
Description:
licenta iftode
79
UNIVERSITATEA „ALEXANDRU IOAN CUZA” IAȘI FACULTATEA DE ECONOMIE ȘI ADMINISTRAREA AFACERILOR SPECIALIZAREA: INFORMATICĂ ECONOMICĂ APLICAȚII MOBILE Absolvent Viorel IFTODE 2008
Transcript
Page 1: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

UNIVERSITATEA „ALEXANDRU IOAN CUZA” IAȘI

FACULTATEA DE ECONOMIE ȘI ADMINISTRAREA AFACERILOR

SPECIALIZAREA: INFORMATICĂ ECONOMICĂ

APLICAȚII MOBILE

Absolvent

Viorel IFTODE

2008

Page 2: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

2

Cuprins INTRODUCERE .................................................................................................................................................. 3

.NET COMPACT FRAMEWORK.............................................................................................................................. 6 MICROSOFT SQL SERVER COMPACT 3.5 ................................................................................................................ 6

SCENARIU DE APLICAȚIE ÎN MEDIILE MOBILE .................................................................................................. 8

DE CE REPLICAREA DE TIP SINCRONIZARE?................................................................................................................ 9 SCENARIU ......................................................................................................................................................10

MODEL DE IMPLEMENTARE A APLICAȚIILOR ÎN MEDIUL MOBIL .....................................................................11

1. CONFIGURAREA ADAPTORULUI DE REȚEA ȘI A SERVERULUI IIS DE PE MAȘINA PE CARE SE VOR AFLA DISTRIBUITORUL ȘI EDITORUL

...................................................................................................................................................................11 2. CONFIGURAREA DISPOZITIVELOR MOBILE (ABONAȚII) .............................................................................................13 3. SCHEMA BAZEI DE DATE A APLICAȚIEI H5N1 .......................................................................................................13 4. PREGĂTIREA AGENTULUI SNAPHOT ....................................................................................................................15 5. PREGĂTIREA DIRECTORULUI SNAPSHOT...............................................................................................................16 6. REALIZAREA PUBLICAȚIEI BAZEI DE DATE BD_H5N1..............................................................................................16 7. SETAREA PERMISIUNILOR ................................................................................................................................21 8. REALIZAREA SNAPSHOTULUI ............................................................................................................................22 9. CONFIGURAREA SERVERULUI IIS .......................................................................................................................22 10. REALIZAREA SUBSCRIERII...............................................................................................................................24 REALIZAREA APLICAȚIEI H5N1 ............................................................................................................................30 REALIZAREA CONEXIUNII CU BAZA DE DATE H5N1_MEDIC.SDF ..................................................................................34 MEDIC.VB & SINCRONIZARE.VB ...........................................................................................................................36

ÎMPACHETAREA ȘI DISTRIBUIREA APLICAȚIILOR MOBILE .........................................................................40

MODALITĂȚI DE DISTRIBUIRE A APLICAȚIILOR ..........................................................................................................41 ÎMPACHETAREA ȘI DISTRIBUIREA APLICAȚIEI H5N1 ...................................................................................................41 STABILIREA FIȘIERELOR CE ALCĂTUIESC APLICAȚIA .....................................................................................................41 REALIZAREA FIȘIERULUI .CAB ..............................................................................................................................42 SPECIFICAREA ACȚIUNILOR CE SE VOR EFECTUA ÎN TIMPUL INSTALĂRII/DEZINSTALĂRII ........................................................48 REALIZAREA FIȘIERULUI .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 FOLOSEȘTE LINQ) ............................................................................................76

BIBLIOGRAFIE .................................................................................................................................................79

Page 3: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

3

Introducere

Ritmul în care tehnologia avansează este suficient de rapid astfel încât aproape îi determină pe unii să nu țină pasul cu ea (cazul telecomunicațiilor, informaticii, autovehiculelor, etc.), alteori ritmul acesteia este lent în special în cazul tehnologiilor de vârf unde numărul specialiștilor este redus (cazul medicinei, cercetării spațiale, etc.). Pașii cei mai rapizi în ultimii ani au fost făcuți în domeniul telecomunicațiilor – ar fi nepotrivit să notăm noile tehnologii dezvoltate în ultimii cinci ani de zile (lucrarea nu își va mai atinge scopul, în plus, schimbările apărute pot fi vazute cu ochiul liber). Telefonia mobilă este cea care dă tonul în ultima perioadă deoarece în ziua de astăzi cu ajutorul unui dispozitiv mobil poți realiza o sumedenie de operațiuni:

trimiterea și recepționarea de mesaje scrise (eng. Short Message Service – SMS), mesaje multimedia (eng. Multimedia Messaging Service – MMS);

accesarea casuței poștale prin intermediul protocoalelor Post Office Protocol version 3 (POP3), Internet Message Access Protocol (IMAP), Simple Mail Transfer Protocol (SMTP);

inițierea și recepționarea 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 fișiere 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 fișierelor multimedia (vizionarea filmelor, ascultarea melodiilor în format MP3, etc.);

accesarea diferitelor aplicații (clienți ERP, navigatori Global Positioning System – GPS, dicționare, jocuri, etc.);

etc.

Motivul pentru care dispozitivele mobile au suferit transformări de la simple terminale de inițiere și recepționare a apelurilor telefonice și până la terminale cu funcții suplimentare asemeni celor sus menționate, s-a datorat necesității oamenilor de a accesa informația „oriunde și oricând”. Acest „oriunde și oricând” s-a putut realiza doar prin intermediul unor dispozitive mobile de mici dimensiuni. Cu timpul cerințele în afaceri au determinat ca personalul unei companii să fie permanent conectat la business (în adevaratul sens al cuvântului – nu numai să poată accesa resursele din companie atunci când resursa umană nu se află fizic la sediu, ci și atunci când angajații se află în timpul liber și pot efectua operațiuni de rutină ce nu necesită un efort deosebit – fapt care a determinat ca unele companii să își plătească angajații chiar și când aceștia sunt plecați în vacanță).

În cele ce urmează vom încerca să prezentăm cum anume pot fi realizate aplicații destinate dispozitivelor mobile, ce anume avem nevoie pentru crearea acestora, vom exemplifica cu un tip de aplicație ceva mai complexă, iar în finalul acestei lucrări vom puncta câteva concluzii referitoare la dezvoltarea aplicațiilor mobile pe platforma .NET. Pentru început ținem să precizăm că aplicațiile mobile se pot dezvolta pe mai multe platforme folosind diferite limbaje de programare.

Tabelul nr. 1 Scurtă descriere a principalelor platforme Platforma Descriere

Java ME Micro Edition sau Java ME oferă suportul pentru crearea aplicațiilor care rulează pe dispozitivele mici fără fir (telefoane mobile, asistenți 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 asemănătoare cu cea J2SE, diferențele constând în faptul că dispozitivele pentru care sunt destinate aplicațiile J2ME folosesc resurse limitate. Astfel, pentru a crea astfel de

Page 4: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

4

aplicații 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ă mașini virtuale: C Virtual Machine (CVM) și K Virtual Machine(KVM). Acestea ocupă puțină memorie și necesită mult mai puține resurse decât mașina virtuală pentru J2EE sau J2SE. Mediul J2ME este furnizat de către Sun în cadrul pachetului Java 2 Micro Edition Wireless Toolkit (J2MEWTK).1 Actualmente (la data scrierii acestei lucrări) pachetul este găsit sub denumirea Sun Java Wireless Toolkit for Connected Limited Device Configuration versiunea 2.5.2.2

Symbian Este una din cele mai perfomante platforme de dezvoltare pentru dispozitivele mobile Nokia, Fujitsu, Sony Ericsson, Motorola – dispozitivele mobile ale căror sistem de operare este Symbian. Platforma cea mai răspândită actualmente este S60 (în proporție de 67%).3

.NET Compact Framework

Folosit în dezvoltarea aplicațiilor mobile ale căror sistem de operare este Windows Mobile. Spre deosebire de Java ME, .NET Compact Framework folosește în întregime librările .NET Framework (dar adaptate pentru dispozitivele mobile). Ultima versiune a fost lansată de către Microsoft la data de 25 Ianuarie 2008 sub numele .NET Compact Framework 3.5.

Palm OS Inițial sistem de operare destinat dispozitivelor mobile personal digital assistants (PDAs) actualmente deținut de catre Palm, Inc.4

Tabelul nr. 2 Evaluare comparativă a principalelor platforme Platforma Limbaje

programare Ușurință învățare

Emulator IDE Costuri

Java ME Java Medie Gratis – disponibil în kitul Sun Java Wireless Toolkit for CLDC 2.5.2

Eclipse, NetBeans Mobility Pack.

Gratis

Symbian C++ Dificil În funcție de platforma există emulatoare ce pot fi folosite cu sau fără eforturi financiare.

Eclipse, Microsoft Visual Studio, NetBeans, etc.

Gratis sau cu eforturi financiare în funcție de utilitarele folosite.

.NET Compact Framework

VB.NET, C# Medie Disponibil odată cu IDE-ul sau gratis descărcând gratis kitul de pe siteul companiei Microsoft.

Microsoft Visual Studio 2003 / 2005 / 2008.

Gratis sau cu eforturi financiare în funcție de utilitarele folosite.

Palm OS C, C++ Excelent Sunt disponibile gratis doar anumite emulatoare.

Eclipse. Gratis sau cu eforturi financiare în funcție de utilitarele folosite.

1 Ștefan, T., Cristian, O., Stefan, A., Java de la 0 la expert, Editura Polirom, Iasi, 2003 pg 27-28 2 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)

Page 5: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

5

Ultima versiune a sistemului de operare destinat dispozitivelor mobile și dezvoltat de către compania Microsoft este Windows Mobile 6.15 (lansat la data de 1 Aprilie 2008). Este un sistem de operare compact și orientat către zona de business și poate fi găsit sub forma a trei versiuni (în funcție de performanțele hardware ale dispozitivului mobil):

Windows Mobile Standard – este destinat telefoanelor mobile cu funcții avansate (eng. Smartphone) precum: e-mail, mesaje text, browser internet, etc. (fiind o versiune cu mai puține funcționalități decât Windows Mobile Classic sau Windows Mobile Professional).

Windows Mobile Classic – este destinat dispozitivelor smart PDA (eng. Personal Digital Assistant) ce nu îndeplinesc și funcția de telefon mobil. Spre deosebire de smartphone, aceste dispozitive au ecran senzitiv al cărui rezoluție este de cel puțin 240 X 320 pixeli, tastatură cu mai mult de 12 taste, procesor mult mai performant, memorie de capacitate ridicată, adaptor de rețea wireless, etc. Versiunea sistemului de operare destinat acestor dispozitive oferă inclusiv facilitățile Microsoft Office Mobile.

Windows Mobile Professional – este destinat dispozitivelor smart PDA ce indeplinesc și funcția de telefon mobil. Versiunea sistemului de operare destinat acestor dispozitive oferă toate funcțiile oferite de celelalte versiuni.

Anterior am spus că Windows Mobile este un sistem de operare orientat către zona de business. Motivul pentru care am afirmat acest lucru se datorează în principal faptului că versiunea 6.1 oferă funcționalități frecvent cerute în zona afacerilor:

conține o versiune Office6 adaptată dispozitivelor mobile – Word, Excel, PowerPoint (permite scrierea și vizualizarea de fișiere Office – inclusiv cele generate cu Microsoft Office 2007);

oferă facilități de conectare la căsuța poștală 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 funcții avansate;

navigare internet cu ajutorul unei versiuni a Internet Explorer9; player de conținut multimedia – Microsoft Media Player Mobile10; agendă ce poate fi sincronizată cu clientul Outlook de pe calculatorul personal; oferă posibilitatea conectării la distanță Remote Desktop; compatibil WEB 2.0; are preinstalat unui sistem de gestiune a bazelor de date cât ș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 facilități de implementare de politici de securitate);

etc.;

Dezvoltarea de aplicații pentru dispozitivele mobile ale căror sistem de operare este

Windows Mobile poate fi făcută folosind limbajul nativ C++ sau limbajele C# și VB.NET care sunt gestionate de mașina virtuală Common Language Runtime (CLR). Spre deosebire de aplicațiile scrise folosind C++, aplicațiile dezvoltate prin intermediul C# și VB.NET sunt mai ușor 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 execuție

5 Microsoft - http://www.microsoft.com/Windowsmobile/default.mspx (accesat pe 07/06/2008) 6 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)

Page 6: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

6

(eng. thread management), colectorul de gunoaie (eng. garbage collection), etc. Aplicațiile scrise în C# și VB.NET la momentul compilării lor vor fi convertite într-un limbaj intermediar low-level – Common Intermediate Language (CIL). La momentul execuției aplicațiilor, mașina 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 execuția aplicației, aplicațiile ce se folosesc de mașina virtuală CLR vor fi mai lente decât aplicațiile scrise în cod C++. În cazul dispozitivelor mobile, indicat ar fi scrierea aplicațiilor folosind C++ deoarece aceste dispozitive de mici dimensiuni nu au posibilitatea de a oferi performanțe hardware considerabile, dar în funcție de timpul pus la dispoziție pentru dezvoltarea unei aplicații, de nivelul de cunoștințe și experiența cu limbajul de programare C++ pe care o au programatorii, de complexitatea aplicației, etc. se poate alege și varianta în care la execuția unei aplicații va fi folosită mașina virtuală CLR.

.NET Compact Framework

.NET Compact Framework12 este o versiune adaptată pentru dispozitivele mobile a .NET Framework. Folosește aceeași structură de clase ca și versiunea destinată calculatoarelor, cu mențiunea că la versiunea destinată dispozitivelor mobile unele metode și proprietăți au fost eliminate (din criterii de performanță) și au fost adăugate un set de clase specifice pentru controlarea / gestiunea device-urilor. Trebuie amintit faptul că aplicațiile smart dezvoltate în oricare limbaj de programare .NET, pentru a putea fi funcționale trebuiesc a fi executate de pe un dispozitiv care în prealabil are instalat framework-ul .NET (corespunzător versiunii sub care acestea au fost dezvoltate). Versiunile Windows Mobile anterioare (5.0 / 2003 SE / 2003 / etc.) nu aveau preinstalată componenta .NET, dar pentru că numărul de aplicații destinate dispozitivelor Windows Mobile a crescut și pentru a ușura etapa de deployment, Microsoft a inclus în mod implicit Compact Framework în versiunile Windows Mobile 6.0 și 6.1. Actualmente .NET Compact Framework se află la versiunea 3.5, dar schimbările esențiale s-au făcut odată cu trecere la versiunea 2.0 (lansată în Octombrie 2005).

Microsoft SQL Server Compact 3.5

Microsoft SQL Server Compact 3.513 este cel mai nou sistem de gestiune a bazelor de date relaționale, produs de către Microsoft și destinat dezvoltării de aplicații desktop cât și pentru dispozitivele mobile (Pocket PC, Smartphone). Trebuie să reținem faptul că SQL Server Compact 3.5 nu oferă o funcționalitate atât de puternică precum SQL Server 2005 sau SQL Server 2008. Este o versiune mai simplă, dar care oferă multe facilități:

baza de date SQL Server Compact Edition este încapsulată într-un singur fișier, acest lucru facilitând instalarea ușoară a aplicațiilor prin simpla copiere dintr-un loc în altul (față de alte SGBD-uri care necesită export/import de date);

SQL Compact Edition oferă posibilitatea criptării bazei de date. Nu doar protejează accesul la date prin intermediul unei parole, ci și întreg conținutul bazei de date este criptat prin algoritmul RSA pe 128 biți, iar în cazul în care baza de date ajunge pe mâini nepotrivite, slabe sunt șansele ca datele să fie descifrate;

dimensiunea unei baze de date poate atinge maxim 4GB (în viitorul apropiat, cu siguranță va dispare această limitare);

integritate referențială deplină (permite inclusiv actualizări în cascadă); ACID – Atomicitate, Consistență, Izolare, Durabilitate (suport tranzacțional);

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

Page 7: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

7

se instalează ușor atât pe desktop cât și pe dispozitivele mobile; folosește tehnologia ADO.NET în implementare; suportă replicarea datelor; etc.;

Pentru a putea dezvolta aplicații care să ruleze pe dispozitivele mobile (Smartphone, Pocket

PC, etc., ale căror 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 descărcată gratuit (în versiune trial) de pe site-ul Microsoft.

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

Page 8: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

8

Scenariu de aplicație în mediile mobile O bază de date distribuită reprezintă o colecție de date integrate din punct de vedere logic,

dar care sunt distribuite pe mai multe platforme conectate printr-o rețea. Replicarea este un proces prin care serverul de baze de date este responsabil a actualiza și păstra datele aflate pe mai multe servere (copii / transferuri de înregistrări și obiecte ale bazei de date). În anumite cazuri, replicarea poate duce la o creștere a performanțelor și a disponibilității datelor pentru aplicații. Principalul dezavantaj al sistemelor centralizate, îl reprezintă întreruperea funcționalității aplicațiilor în cazul apariției unor disfuncționalități la nivelul serverului, pe când, sistemele distribuite prin intermediul replicării pot:

păstra copii ale acelorași date pe mai multe mașini de lucru (astfel aplicațiile vor putea accesa o bază de date locală mult mai repede decât pot accesa datele unei baze de date aflate pe un server îndepărtat);

efectua operații complexe ce necesită citiri și prelucrări îndelungate, dar care nu afectează performanțele întregului sistem;

îmbunătăți timpii de citire / prelucrare a datelor; permite lucrul cu datele bazei de date în mod deconectat, iar la cerere și în cazul în care se

poate accesa canalul de comunicație, se vor actualiza posibilele modificări apărute. Microsoft SQL Server suportă mai multe tipuri de replicări15:

replicarea snapshot; replicarea tranzacțională; replicarea de tip sincronizare (eng. merge replication). Dintre aceste trei tipuri de replicare a datelor, doar replicarea sincronizată (eng. merge

replication) este compatibilă și cu Microsoft SQL Server Compact Edition. Înainte de a trece mai departe în a descrie modul de configurare și utilizare a replicării de tip merge într-o aplicație destinată dispozitivelor smart, este necesar a cunoaște câțiva termeni frecvent folosiți pe parcursul acestei lucrări. Editorul (eng. Publisher) – server de baze de date ce poate avea una sau mai multe publicații ale cărui principale roluri sunt de a permite efectuarea replicării cu alte servere și de a identifica și salva modificările apărute. Abonatul (eng. Subscriber) – server de baze de date care primește date (pentru care s-a facut subscriere și care au fost transmise de editor ca urmare a procesului de replicare). Distribuitorul (eng. Distributor) – serverul care administrează fluxul de date al procesului de replicare (distribuie și stochează modificările datelor). Articol (eng. Article) – o colecție de date (o tabelă; o porțiune dintr-o tabelă: anumite coloane, anumite înregistrări; etc.). Publicație (eng. Publication) – set de articole ce se doresc a fi replicate. Subscriere (eng. Subcription) – solicitarea efectuării de copii a datelor și obiectelor ce se doresc a fi replicate. Instantaneu (eng. Snapshot) – imaginea parțială sau integrală a conținutului bazei de date la un moment dat. Agentul snapshot – cel ce pregătește instantaneul (snapshotul), respectiv fișierele sursă ale bazei de date (fișiere ce sunt salvate într-un „folder snapshot” aflat la distribuitor). De fiecare dată când agentul snapshot este pornit, automat el va verifica modificările apărute și va genera fișierele sursă a bazei de date (.sch – scheme, .dri – constrângeri și indecși, .trg – declanșatoare, .sys – tabele cu date sistem, .cft – conflicte între tabele, .bcp – date). Agentul de distribuție – cel ce păstrează istoricul și statisticile replicărilor efectuate. Agentul de sincronizare (eng. merge agent) – cel ce aplică instantaneul (snapshotul) precum și modificările apărute la abonat sau editor.

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

Page 9: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

9

Bază date distribuție (eng. Distribution database) – bază de date sistem folosită doar pentru replicare și care nu conține alte tabele utilizator (are rolul de a păstra tranzacțiile efectuate până când acestea sunt propagate către destinatari).

De ce replicarea de tip sincronizare? Replicarea sincronizată16 (eng. merge replication) este replicarea ce permite efectuarea

sincronizării dintre un abonat și un editor, atunci când aceștia pot comunica prin intermediul unei rețele, fiind permisă realizarea unor schimburi de date în ambele sensuri. Acest tip de replicare este recomandat a fi folosit în următoarele situații:

mai mulți abonați pot efectua multiple actualizări asupra datelor, iar schimbările apărute vor putea fi propagate către editor (astfel fiind posibil ca și alți abonați să poată „vedea” modificările survenite);

abonații pot efectua modificări asupra datelor în mod deconectat, ulterior efectuându-se sincronizarea cu editorul pentru a propaga schimbările către acesta;

abonații pot obține date filtrate; în procesul de sincronizare vor fi transmise modificările nete (dacă o înregistrare se modifică

de „n” ori la abonat înainte de a se efectua sincronizarea, înregistrarea va fi modificată o singură dată la editor în momentul în care sunt propagate schimbările).

Agentul snapshot și agentul de sincronizare vor implementa replicarea de tip sincronizare. Implicit agentul snapshot analizează fișierele din folderul snapshot, iar în anumite condiții intervine prin a efectua schimbări la nivelul lor. Este foarte important ca agentul snapshot să actualizeze respectivele fișiere, deoarece în funcție de conținutul lor va fi revizuită și schema bazei de date a abonatului. Agentul de sincronizare va aplica snapshotul asupra abonatului (abonatul trebuie să aibă aceași schemă a bazei de date ca și editorul) și va propaga modificările ce apar la editor și la abonat. Agentul de distribuție în cazul replicării de tip sincronizare are rolul de a păstra istoricul și statisticile replicărilor efectuate.

APLICAŢIE CLIENT APLICAŢIE CLIENT

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

EDITOR ABONAT

DISTRIBUITOR AGENT MERGE

ISTORIC DATE

BAZĂ DATE DISTRIBUŢIE

MODIFICĂRI ALE

DATELOR

MODIFICĂRI ALE

DATELOR

Figură 1 Arhitectura generală a replicării de tip sincronizare (eng. Merge Replication)

(Sursă: http://msdn2.microsoft.com/en-us/library/ms151329.aspx)

În continuare prezentăm un posibil scenariu ce ar solicita replicarea datelor aflate pe dispozitive mobile.

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

Page 10: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

10

Scenariu Gripa aviară face să planeze amenințarea unei pandemii greu de controlat cu mijloace

actuale de protecție. Există două posibilități 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 putându-se transmite precum gripa umana, dar cu efectele gripei aviare. A doua posibilitate ar fi ca H5N1 să sufere o mutație spontană prin care să se transmită direct de la om la om.

Având în vedere că din totalul persoanelor infectate (cei care au intrat în contact cu animale bolnave), jumătate au decedat, o posibilă pandemie de gripă, ar fi de temut dacă virusul H5N1 al gripei aviare s-ar adapta la om. Potrivit Organizației Mondiale a Sănătății, o pandemie ar putea face până la o sută de milioane morți.

Virusul gripei aviare se manifestă la om într-un mod mult mai grav decât cel al gripei umane. Debutul este brutal, violent, cu simptome de febră ridicată (39-40 grade Celsius), frisoane, dureri de cap, de gât, mialgii (dureri musculare), astenie și nas înfundat. După câteva zile de la instalarea acestor semne, apare o tuse seacă, iritantă. Aceste manifestări apar și în cazul gripei umane, însă principala diferență între cele două tipuri de gripă (umană și aviară) o reprezintă insuficiența respiratorie (pacientul simte ca nu mai poate respira și are dureri în piept). La gripa aviară, senzația de sufocare este determinată de instalarea unei pneumonii virale (plămânul se încarcă cu lichid, care nu mai permite transferul de gaze).

Având în vedere că boala evoluează foarte rapid (aproximativ zece zile) și se poate transmite relativ ușor, este de importanță vitală să se transmită într-un timp cât mai scurt toate datele care sugerează infecția cu virusul gripei aviare, în așa fel încât specialiștii să se poată pronunța cât mai precoce în privința diagnosticului și a instaurării carantinei.

Un posibil ajutor oferit de către noile tehnologii, ar fi, ca medicii să se deplaseze în diferite zone cu risc crescut de epidemie și să culeagă date referitoare la pacienții cărora le vor efectua consultații medicale. Datele despre pacienți vor fi completate și salvate în baze de date Microsoft SQL Server Compact Edition (.sdf), prin intermediul formularului aplicației „H5N1”, iar la anumite intervale de timp modificările vor fi transmise prin intermediul tehnologiilor de comunicație fără fir (ex: GPRS), către 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 către specialiști.

Figură 2 Arhitectura propusă pentru realizarea aplicației H5N1

Înainte de a trece efectiv la partea de implementare a aplicației H5N1, este necesar a pregăti

(configura) canalele de comunicație prin intermediul cărora vor putea fi replicate datele aflate la abonați și editor.

Abonaţi

IIS

Editor +

Distribuitor

Page 11: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

11

Model de implementare a aplicațiilor în mediul mobil

1. Configurarea adaptorului de rețea și a serverului IIS de pe mașina pe care se vor afla distribuitorul și editorul

Pentru a ne asigura de reușita implementării aplicației prezentate pe parcursul acestui capitol, indiferent dacă exista, sau nu, un adaptor de rețea instalat pe mașina locală, trebuie instalat un adaptor de loopback (mesajele sunt transmise și recepționate printr-un singur canal de comunicație):

se acceseză panoul de control (Control Panel) și se alege modul de vizualizare clasic; se face dublu click pe Add Hardware, apoi se apasă butonul Next; din capătul listei Installed Hardware se va selectea Add a new harware device, apoi se va

apăsa butonul Next; se alege opțiunea Install the hardware that I manually selected from list (Advanced); din lista Common hardware types se va selectea Network Adapters; din zona Manufacturer se va alege Microsoft, iar din zona Network Adapter click pe

Microsoft Loopback Adapter, apoi se apasă butonul Next; se apasă butonul Next pentru a efectua instalarea; click pe Finish pentru a finaliza instalarea.

Configurarea adaptorului (setarea adresei IP):

din panoul de control (Control Panel) se va selecta Network Connections, urmând a configura Local Area Connection (click dreapta Properties);

din zona This connection uses the following items se va selecta Internet Protocol (TCP/IP) și apoi click pe Properties;

se va seta adresa IP (IP address: 192.168.0.1; Subnet Mask: 255.255.255.0).

Figură 3 Setările adaptorului de rețea

Page 12: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

12

Pentru a verifica corectitudinea setărilor efectuate se va testa din consola Windows comanda ping 192.168.0.1. Rezultatul ar trebui să fie asemănător cu cel din imaginea alăturată.

Figură 4 Verificarea configurării adaptorului de rețea

Crearea paginii principale a serverului IIS: Folosind editorul de texte Notepad se va realiza următoarea 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> Fișierul va fi salvat în calea Home Directory a serverului IIS (%homedrive%\Inetpub\wwwroot), dându-i denumirea index.htm (File - Save As - index.htm). Prin intermediul browserului se va verifica rezultatul obținut accesând adresa http://192.168.0.1.

Figură 5 Noua pagină principală a serverului IIS

Page 13: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

13

Pentru a efectua setări suplimentare serverului IIS:

se va accesa panoul de control (Control Panel) și se va alege modul de vizualizare clasic; se va deschide consola Administrative Tools și Internet Information Services; din structura arborescentă se va selecta Default Web Site (click dreapta Properties).

2. Configurarea dispozitivelor mobile (abonații) Device Emulator Manager (Start - All programs - Microsoft Device Emulator 2.0 Preview), se

accesează Windows Mobile 5.0 Pocket PC VGA Emulator și se va efectua operațiunea de conectare prin apăsarea butonului Connect;

după ce a fost pornit emulatorul, se vor accesa proprietățile acestuia (File - Configure...), alegând cadrul de pagina Network și activând NE2000 PCMCIA network adapter and bind to;

din listă se va alege adaptorul de rețea existent pe mașina de lucru (Microsoft Loopback Adaptor - Virtual Machine Network Services Driver – în cazul în care a fost instalat adaptorul loopback);

de pe dispozitivul Pocket PC se va accesa Network Cards (Start - Settings - Connections); din combobox-ul My network card connects to, se va alege opțiunea The Internet; se accesează NE2000 Compact Ethernet Driver și se configurează adaptorul prin intermediul

căruia dispozitivul Pocket PC va putea comunica cu mașina pe care este instalat serverul de baze de date Microsoft SQL Server (IP address: 192.168.0.2; Subnet mask: 255.255.255.0);

Figură 6 Adresa IP a abonatului

după ce s-a configurat adaptorul, trebuie reefectauată operațiunea de conectare cu

adaptorul de rețea (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 afișarea paginii principale găzduită pe serverul IIS cu adresa IP 192.168.0.1).

3. Schema bazei de date a aplicației H5N1 Deși am fi putut aduce baza de date a aplicației H5N1, la o formă care să permită o flexibilitate ridicată, am decis a simplifica pe cât posibil lucrurile și propunem ca schema bazei de date BD_H5N1 să fie alcătuită din două tabele (MEDICI – are rolul de a păstra date referitoare la medicii care vor efectua consultații pacienților; ANAMNEZA – va reține date privind pacienții și consultația efectuată lor).

Page 14: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

14

Figură 7 Schema bazei de date a aplicației H5N1

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

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

Din meniul File – New, se va selecta Query with Current Connection pentru a deschide o nouă fereastră prin intermediul căreia vor putea fi transmise fraze SQL către SGBD. Următoarele secvențe de cod au ca rezultat generarea bazei de date BD_H5N1. CREATE DATABASE BD_H5N1 GO

Page 15: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

15

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 înregistrări. INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Abramovici Cristian','acristian','acristian','Str. M.Eminescu, nr.42','0780111111') GO INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Marinescu Loredana','mloredana','mloredana','Str. I.L.Caragiale, nr.1','0780111112') GO INSERT INTO MEDICI (nume_prenume_medic,nume_cont,parola_cont,adresa_contact,telefon_contact) values ('Simion Laura','slaura','slaura','Str. Stefan Cel Mare, nr. 22','0780111110') GO

4. Pregătirea agentului snaphot Se va deschide panoul de control (Control Panel) și se va alege modul de vizualizare clasic; Se va accesa Computer Management aflat în directorul sistem Administrative Tools; creați un nou utilizator accesând System Tools – Local Users and Groups – Users:

Câmp Valoare User name: agent_snapshot

Page 16: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

16

Password: Abc_123 Confirm Password: Abc_123 User must change password at next logon

deselectat

Password never expires selectat

5. Pregătirea directorului snapshot Se va deschide Windows Explorer, apoi din meniul Tools – Folder Options... – View, se va

deselecta opțiunea Use simple file sharing; Se va realiza un nou director cu denumirea director_snapshot (ex:

%SystemDrive%\director_snapshot); Noul directorul creat va fi partajat - Sharing and Security...; Se va selecta Share this folder, apoi vor fi setate permisiunile (Permissions); Se va apăsa butonul Add iar în zona Enter the object name to select se va introduce agentul

snapshot – computername\agent_snapshot (unde computername se va înlocui cu denumirea stației locale, denumire ce poate fi aflată apelând comanda echo %computername% din consola Windows);

Pentru utilizatorul agent_snapshot trebuiesc setate permisiunile Change și Read; În cadrul de pagina Security se va adăuga utilizatorul agent_snapshot și îi vor fi atribuite

permisiunile Read & Execute, List Folder Contents, Read și Write; Se va apăsa butonul OK pentru a permanentiza setările.

6. Realizarea publicației bazei de date BD_H5N1 Se va reveni în zona Object Explorer a SQL Server Management Studio:

Din structura arborescentă se va selecta Replication iar din meniul contextual se va alege crearea unei noi publicații (New – Publication).

Se va apăsa pe butonul Next din cadrul primei ferestre a wizard-ului;

Figură 9 Wizard-ul folosit pentru realizarea publicației bazei de date BD_H5N1

În cazul în care aceasta este prima publicație realizată, wizard-ul va cere să îi fie specificat

serverul ce se va comporta ca Distribuitor. Se va selecta prima opțiune pentru a alege serverul local.

Page 17: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

17

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

În următoarea fereastră va trebui tastată adresa UNC a folderului snapshot

(\\computername\director_snapshot - unde computername va fi înlocuit cu denumirea stației locale).

Următorul pas constă în a selecta baza de date ce se dorește a fi publicată - BD_H5N1. Așa 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 abonați ce vor efectua sincronizări, vom alege doar Microsoft Server Compact Edition (se va alege opțiunea SQL Server 2005 Compact Edition).

Page 18: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

18

Următorul pas ce trebuie efectuat constă în a selecta articolele ce se doresc a fi publicate (ANAMNEZA și MEDICI).

Figură 11 Selectarea articolelor ce se doresc a fi publicate

Toate articolele ce vor fi publicate necesită existența unei coloane de tip

UNIQUEINDENTIFIER. Noua fereastră a wizard-ului informează faptul că acest tip de coloană va fi adăugat pentru cele două tabele ce vor fi publicate. Tipul de date UNIQUEIDENTIFIER ocupă un spațiu de 16 octeți per valoare și de obicei operează cu identificatori globali unici (eng. Globally Unique Indetifiers – GUIDs). Un GUID este un număr 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 obținută prin două metode:

o folosind funcția NEWID() – în acest caz, cel ce va genera identificatorul global unic este SGBD-ul.

o folosind funcțiile API – generatorul identificatorului global unic este dat de aplicația client.

GUID este o valoare generată pe baza numărului unic de indentificare a adaptorului de rețea și a numărului unic al procesorului. O tabelă a unei baze de date poate conține 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 replicării de tip sincronizare, valorile atributelor de tip UNIQUEIDENTIFIER sunt cele care asigură unicitatea înregisitrărilor și permit copierea de date de la abonat la editor (și viceversa), fără 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 înțeles, generate aleator; o valorile ocupă un spațiu de stocare mult mai mare decât valorile tipurilor numerice;

Page 19: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

19

o operațiile 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 cărora

abonații vor primi de la editor doar înregistrările care le sunt exclusiv adresate lor.

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

În cazul în care nu s-ar aplica filtre, un medic de fiecare dată când va cere realizarea sincronizării cu editorul ar „descărca” întregul conținut al tabelei MEDICI (respectiv toți pacienții consultați, inclusiv pacienții consultați de colegii lui), fapt care duce la o încărcare inutilă a bazei de date aflate pe dispozitivul smart al medicului, costuri ridicate privind comunicațiile, încetinirea aplicației pe măsură ce numărul pacienților consultați va crește, etc. Folosind filtrele, operația de sincronizare va trimite către dispozitivul smart Windows Mobile aflat în poseseia medicului, doar înregistrările cu privire la pacienții consultați de el. În cazul nostru filtrarea înregistrărilor se va realiza pe baza numelui utilizatorului prin care se realizează autentificarea la serverul SQL (se poate obține folosind funcția SUSER_SNAME()). Interesul nostru este de a realiza filtrarea doar pe tabela ANAMNEZA pe baza condiției cod_medic=(SELECT cod_medic FROM MEDICI WHERE nume_cont=SUSER_SNAME()). Vom apăsa butonul Add și alegem opțiunea Add Filter..., selectăm tabela ANAMNEZA, iar în secțiunea Filter statement se va completa condiția de filtrare.

Page 20: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

20

Figură 13 Condiția de filtrare a datelor tabelei ANAMNEZA

Totuși de ce nu efectuăm filtrări și pe tabela MEDICI?

o Numărul medicilor este cu mult mai mic decât numărul pacienților, iar efectuarea filtrării datelor pe tabele cu un număr mic de înregistrări nu ar îmbunătății cu mult performanțele aplicației.

o Medicii pot schimba dispozitivele smart Windows Mobile între ei (efectuează consultații pe schimburi de lucru), așadar este necesar ca la autentificarea în aplicația H5N1, pe dispozitivul smart să existe toate datele cu privire la conturile medicilor.

o Apariția unui medic nou în cadrul echipelor de consultații va însemna realizarea unui nou cont de access la aplicație (operație 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. Următorul pas al wizard-ului (Snapshot Agent) permite setarea realizării snapshotului precum

și a frecvenței cu care agentul snapshot va fi activat. Se vor alege ambele opțiuni Create a snapshot immediately, respectiv Schedule the Snapshot Agent to run at the following times apoi se va apăsa butonul Next.

Din fereastra de dialog Agent Security vom face click pe Security Settings... o Se va alege opțiunea Run under the following Windows account:

Câmp Valoare Process account: computername\agent_snapshot17 Password: Abc_123 Confirm Password: Abc_123

17 computername va fi înlocuit cu denumirea staţiei locale

Page 21: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

21

o Ca și modalitate de conectare la editor alegem By impersonating the process account.

La următorul pas al wizard-ului se va alege opțiunea Create the publication. Atribuim publicației denumirea PUBLICATIE_H5N1 și cerem finalizarea wizard-ului prin

apăsarea butonului Finish. După generarea publicației de către wizard, se va apăsa butonul Close.

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 stânga 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 stației locale) – se va apăsa butonul Check Names pentru a verifica corectitudinea datelor introduse, apoi click stânga pe butonul OK.

o Din panoul de navigație se va face click pe User Mapping, iar din lista de baze de date disponibilă vom selecta distribution și BD_H5N1 (pentru fiecare bază de date în parte se va alege rolul db_owner).

Figură 14 Crearea și setarea permisiunilor contului agentului snapshot

o Se va apăsa butonul OK pentru a genera contul de acces.

Page 22: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

22

Agentul IIS: o Pașii sunt asemănători cu cei parcurși î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 stației 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 specificațiilor din tabelul următor:

Câmp Valoare Login name: acristian Password: acristian Confirm Password: acristian Enforce password policy deselecat

o Din panoul de navigație 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 apăsa butonul OK. Din fereastra de proprietăți a publicației (din zona Object Explorer a SQL Server

Management Studio, parcurgem structura arborescetă până la publicația PUBLICATIE_H5N1, click dreapta – Properties), selectăm din panoul de navigație Publication Access List și folosind butonul Add vom adăuga 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ă până la publicația PUBLICATIE_H5N1, accesăm View Snapshot Agent Status (click dreapta pe publicație iar din meniul contextual se va alege View Snapshot Agent Status). În noua fereastră vom apăsa butonul Start pentru a genera snapshotul. La final trebuie sa ne asigurăm că instantaneul a fost generat în totalitate.

9. Configurarea serverului IIS După ce s-a creat publicația, s-au setat permisiunile de acces și a fost generat instantaneul, va trebui configurat serverul IIS pentru a permite comunicarea serverelor SQL Compact Edition cu serverul SQL 2005. Spre a ușura cât mai mult lucrurile, pentru configurarea serverului IIS există un wizard ce poate fi accesat din meniul contextual al publicației PUBLICATIE_H5N1 (opțiunea Configure Web Synchronization...):

Figură 15 Configurarea serverului web pentru a permite realizarea sincronizării dintre abonați și editor

Page 23: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

23

La apariția primei ferestre a wizard-ului se va apăsa butonul Next. În cel de-al doilea pas (Subscriber Type) se va alege opțiunea SQL Server Compact Edition. Pentru pasul Web Server se va specifica denumirea mașinii pe care este instalat serverul IIS

(implicit completată de către wizard) și vom alege opțiunea Create a new virtual directory. În cazul în care suntem întâmpinati de o căsuță de mesaj asemănătoare cu cea din imaginea

alăturată, î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 atenționare – determină instalarea SQL Server Compact Edition server components.

Figură 16 Mesajul afișat în cazul în care nu ați instalat SQL Server Compact Edition server components

Finalizarea pasului Web Server se realizează prin selectarea Default Web Site (căruia îi va fi

adăugat un director virtual).

Figură 17 Configurarea serverului web pentru a permite

realizarea sincronizării dintre abonați și editor

Pasul Virtual Directory Information presupune completarea casetei de text Alias cu denumirea ce se dorește a fi dată directorului virtual (ex: H5N1). Cel mai probabil, după apăsarea butonului Next vom fi întâmpinați de două casete de mesaj (o casetă de mesaj prin

Page 24: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

24

care suntem informați că directorul cu denumirea menționată în caseta de text alias nu există, și cea dea doua casetă de mesaj, prin care suntem informați de efectuarea unei copii și a unei înregistrării a agentului SQL Server Compact Edition).

Următorul pas (Secure Communications) presupune specificarea tipului de mediu de comunicație dintre abonat și serverul IIS (folosirea unui canal de comunicație securizat sau nesecurizat). Deoarece nu ne aflăm î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 setările implicite. La pasul Snapshot Share Access se va menționa adresa UNC a directorului snapshot (ex:

\\computername\director_snapshot – unde computername va fi înlocuit cu denumirea stației locale).

În fereastra de dialog a pasului Complete the Wizard vor fi prezentate un sumar al setărilor efectuate pe parcursul wizard-ului.

Se va apăsa butonul Finish pentru a finaliza configurarea serverului IIS. Verificarea corectitudinii setărilor efectuate se realizează prin accesarea din browserul web, a adresei http://192.168.0.1/H5N1/sqlcesa30.dll?diag.

10. Realizarea subscrierii Înainte de a realiza subscrierea, este necesar a crea o nouă baza de date (ex.: H5N1_MEDIC) SQL Compact.

Se va realiza conexiunea cu baza de date SQL Compact Edition. Din zona Object Explorer a SQL Server Management Studio, vom accesa wizard-ul folosit

pentru generarea subscrierii (se parcurge structura arborescentă Replication – Subscriptions, iar din meniul contextual se va alege opțiunea New Subscriptions...).

Figură 18 Realizarea subscrierii folosind SQL Server Management Studio

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

Page 25: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

25

Î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 autentificării, se va selecta publicația creată în pașii anteriori

(PUBLICATIE_H5N1) apoi se va face click pe butonul Next.

Figură 19 Selectarea publicației la care se dorește realizarea subscrierii

În pasul Identify Subscription se va completa caseta de de text Subscription name cu

SUBSCRIERE_H5N1, sau oricare altă denumire sugestivă. Pentru a trece la pasul următor se va apăsa butonul Next.

Web Server Authentication presupune completarea adresei de acces (http://192.168.0.1/H5N1) către 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 opțiunea Use SQL Server Authentication with the following SQL Server user name and password.

Câmp Valoare User name: acristian Password: acristian

Apăsați butonul Finish pentru a finaliza wizard-ul. SqlCeReplication18 Principala noutate ce va fi întâlnită în codul aplicației H5N1 este dată de folosirea unor obiecte de tipul SqlCeReplication (spațiul de nume System.Data.SqlServerCe), care prin intermediul apelării anumitor metode, ne vor ajuta să realizăm sincronizarea dintre abonați și editor.

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

Page 26: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

26

Tabelul nr. 3 Constructorii clasei SqlCeReplication SqlCeReplication() Inițializează o nouă instanță a tipului

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)

Inițializează o nouă instanță a tipului SqlCeReplication și totodată sunt setate valorile principalelor proprietăți necesare conectării la publicație. 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 publicației; subscriber – denumirea abonatului; subscriberConnectionString – stringul de

conectare la baza de date; 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)

Aceeași funcționalitate ca și constructorul precedent doar că acceptă în plus transmiterea valorilor a încă doi parametri:

publisherLogin – numele de cont folosit pentru conectarea la editor;

publisherPassword - parola contului folosit pentru conectarea la editor.

Tabelul nr. 4 Principalele proprietăți ale clasei SqlCeReplication CompressionLevel Oferă posibilitatea setării nivelului de comprimare a datelor.

Valorile ce pot fi atribuite prin intermediul acestei proprietăți sunt de tip Short și cuprinse între 0 și 6 (valoarea 0 va avea ca efect anularea comprimării datelor; valoarea 1 reprezintă un grad de comprimare scăzut; valoarea 6 reprezintă cel mai mare grad de comprimare). Cu cât gradul de comprimare este mai ridicat, cu atât va crește și timpul de procesare a datelor de către serverul IIS.

ConnectionRetryTimeout Permite setarea numărului de secunde în care SQL Server Compact Edition va încerca să restabilească o conexiune eșuată. Unele canale de comunicație se confruntă cu frecvente întreruperi ce pot apare în momentul realizării sincronizării 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. Atenție!!! A nu se confunda cu intervalul de timp acceptat pentru

Page 27: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

27

realizarea primei conexiuni. ConnectTimeout Prin intermediul acestei proprietăți se poate seta sau obține

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 realizării sincronizării este anulată. Valoarea maxim admisă este de 360 000 milisecunde (360 secunde).

Distributor Prin intermediul acestei proprietăți este specificat numele distribuitorului. Distribuitorul este mașina pe care este instalat Microsoft SQL Server și care conține instantaneul (snapshotul), istoricul și statisticile replicărilor efectuate. Aceasta proprietate este opțională, iar în cazul în care nu îi este specificată o valoare, se consideră că editorul și distribuitorul sunt instanțe ale aceluiași server SQL.

DistributorPassword Proprietatea permite setarea parolei de acces folosită la conectarea cu distribuitorul (doar în cazul în care tipul de autentificare folosit este DBAuthentication).

DistributorAddress Permite specificarea adresei de rețea (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 proprietăți atunci când proprietatea DistributorNetwork are setată o valoare cu totul alta decât DefaultNetwork.

DistributorLogin Proprietatea permite setarea numelui de cont folosit pentru autentificarea cu distribuitorul. Este necesară setarea acestei proprietăți atunci când tipul de autentificare folosit este DBAuthentication.

DistributorNetwork Prin intermediul acestei proprietăți se poate seta sau returna tipul protocolului folosit în comunicarea cu distribuitorul (DefaultNetwork, MultiProtocol, TcpipSockets).

DistributorSecurityMode 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 proprietăților DistributorLogin respectiv Distributor Password.

NTAuthentication – autentificare pe baza conturilor existente la nivelul sistemului de operare.

ExchangeType Permite setarea modului în care se va realiza sincronizarea dintre abonat și editor.

BiDirectional – modificările apărute la abonat se vor reflecta către editor și viceversa.

Upload – vor fi transmise către editor doar modificările apărute la abonat.

HostName Pe baza valorii acestei proprietăți se pot efectua filtre asupra înregistrărilor trimise către abonat. Publicațiilor de tip Merge li se pot atribui filtre folosind funcții Transact-SQL precum SUSER_SNAME() și / sau HOST_NAME(). Aceste funcții vor fi incluse în clauza „where” din pasul Filter Table Rows al wizard-ului de generare de publicații. Așadar, dacă în schema bazei de date există o tabela cu un atribut ce păstrează denumirile mașinilor ce se vor conecta la editor, pe baza acestui atribut se pot efectua filtre folosind funcția Transact-

Page 28: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

28

SQL HOST_NAME(). Obiectele de tip SqlCeReplication ale mașinilor de lucru ce doresc a se conecta la editor sunt obligate a seta proprietatea HostName cu valori pe baza cărora se vor efectua filtrări.

InternetLogin Primește ca valoare numele de cont folosit la autentificarea cu agentul SQL Server Compact Edition. Implicit nu este setată nicio valoare.

InternetPassword Permite setarea parolei contului folosit la autentificarea cu agentul SQL Server Compact Edition.

InternetUrl Permite specificarea adresei URL folosită pentru contactarea agentului SQL Server Compact Edition.

LoginTimeout Prin intermediul acestei proprietăți se poate specifica numărul maxim de secunde în intervalul cărora se poate realiza conexiunea dintre serverul IIS și editor / distribuitor. Valoarea implicită este de 15 secunde.

Publication Setează denumirea publicației ce a fost generată pentru a se putea realiza replicarea cu abonații.

Publisher Setează denumirea serverului SQL cu rol de editor. PublisherAddress Proprietate prin intermediul căreia se specifică adresa (un string de

forma „adresaIP:port”) folosită pentru conectarea cu editorul (atunci când agentul SQL Server Compact Edition și editorul se află pe mașini de lucru separate).

PublisherChanges Proprietatea este ReadOnly și returnează numărul de modificări (inserări, actualizări, ștergeri înregistrări) ce au fost permanentizate la abonat în urma operațiunii de sincronizare.

PublisherDatabase Proprietatea permite setarea denumirii bazei de date publicate. PublisherLogin Setează numele de cont pe baza căruia se va face autentificarea la

editor (doar în cazul în care tipul de autentificare folosit este DBAuthentication). Pe baza acestei valori se vor efectua filtrări ale înregistrărilor transmise către abonat (doar în cazul în care clauza „where”, din pasul Filter Table Rows al wizard-ului de generare de publicații, are specificată o condiție ce folosește funcția Transact-SQL SUSER_SNAME()).

PublisherNetwork Setează protocolul folosit în comunicarea cu editorul (DefaultNetwork, MultiProtocol, TcpipSockets).

PublisherPassword Setează parola de acces folosită la conectarea cu editorul. PublisherSecurityMode 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. QueryTimeout Setează sau returnează intervalul maxim de timp (în secunde)

alocat efectuării procesarilor interne (ale serverului SQL). Valoarea implicită este de 300 secunde.

ReceiveTimeout Returnează sau setează intervalul de timp (în milisecunde) în care obiectul SqlCeReplication așteaptă răspuns de la server. Dacă intervalul de timp stabilit este depașit, atunci cererea adresată serverului este anulată. Valoarea implicită este 60 000 milisecunde (60 secunde), iar maximul admis este de 360 000 milisecunde (360 secunde).

SendTimeout Returnează sau setează intervalul de timp (în milisecunde) pe care

Page 29: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

29

obiectul SqlCeReplication îl va aștepta pentru a transmite cereri către server. Valoarea maxim admisă este de 360 000 milisecunde (360 secunde).

Subscriber Proprietatea primește ca valoare denumirea subscrierii. SubscriberChanges Proprietatea este ReadOnly și returnează numărul de modificări

(inserări, actualizări, ștergeri înregistrări) ce au fost permanentizate la editor în urma operațiunii de sincronizare.

SubscriberConnectionString Prin intermediul acestei proprietăți se specifică stringul de conectare la baza de date SQL Server Compact Edition.

Tabelul nr. 5 Principalele metode ale clasei SqlCeReplication AddSubscription (addOption As AddOption)

Se va crea o nouă subscriere la o publicație Microsoft SQL Server. Parametrul de tip AddOption poate lua următorele valori:

CreateDatabase – presupune crearea bazei de date SQL Server Compact Edition pe baza snapshotului, precum și transferul de înregistrări.

ExistingDatabase – presupune descărcarea de date (înregistrări) de la editor și permanentizarea lor în baza de date existentă la abonat.

După apelarea metodei AddSubscription va trebui apelată metoda Synchronize.

ReinitializeSubscription (uploadBeforeReinitialize As Boolean)

Metoda va marca subscrierea pentru reinițializare. În cazul în care parametrului uploadBeforeReinitialize îi este atribuită valoarea TRUE, înainte de a se reinițializa subscrierea, se vor trimite modificările către editor. Implicit valoarea parametrului uploadBeforeReinitialize este FALSE. Reinițializarea subscrierii se va efectua la primul apelul al metodei Synchronize.

LoadProperties Metoda va extrage din tabelele sistem ale bazei de date, informații referitoare la proprietățile sincronizării apoi va încărca obiectul ce a apelat metoda, cu valorile extrase.

Synchronize 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.

SaveProperties Metoda va salva informațiile referitoare la proprietățile sincronizării (încarcate în obiectul SqlCeReplication ce apelează metoda), în tabelele sistem ale bazei de date.

Page 30: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

30

Realizarea aplicației H5N1 Aplicația H5N1 va fi alcătuită din trei formulare ce îi vor permite utilizatorului (medicului):

autentificarea la aplicație (pe baza unui nume de cont și a unei parole); sincronizarea cu editorul (sediul central de prelucrare a datelor); introducerea / modificarea datelor consultațiilor efectuate;

Formularul Autentificare este alcătuit dintr-o serie de componente vizuale ce îi permit

utilizatorului: autentificarea la aplicație, sincronizarea „anonimă” cu editorul, închiderea aplicației. Autentificarea la aplicația 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 apăsării butonului de autentificare, în funcție de datele introduse, aplicația H5N1 va trebui să efectueze o căutare în baza de date aflată pe dispozitivul smart (H5N1_MEDIC.sdf). În cazul în care datele completate nu sunt valide, aplicația H5N1 va afișa mesajul de avertizare „Ai introdus gresit numele de cont sau parola!”. Completarea corectă a datelor de autentificare va determina afișarea formularului AppH5N1, de unde utilizatorul va putea accesa oricare alte funcționalități ale aplicației. Formularul Autentificare oferă și posibilitatea realizării sincronizării „anonime” cu editorul. În urma acestei operațiuni toate modificările apărute la abonat vor fi reflectate către editor, iar către abonat vor fi transmise doar înregistrările ce alcătuiesc tabela MEDICI. Am denumit această sincronizare ca fiind „anonimă”, deoarece operația de sincronizare se poate realiza și fără ca utilizatorul să fie autentificat la aplicație. De fapt autentificarea la editor se va face pe baza contului computername\IUSR_computername (unde computername va fi înlocuit cu denumirea stației locale). Această funcționalitate (sincronizare „anonimă”) îi va permite oricărui medic nou să se alăture echipelor existente și să se autentifice de pe oricare din dispozitivele smart aflate la medicii ce efectuează consultații î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 operația de sincronizare). Ieșirea din aplicație se va realiza prin apăsarea „Iesire app H5N1” din meniul formularului Autentificare.

lblNumeDeCont

txtNumeDeCont

txtParolaCont lblParola

mbtnAutentificare

mbtnSincronizareAnonima

mbtnIesire

Figură 20 Macheta generală a formularului Autentificare

Page 31: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

31

Formularul AppH5N1 va putea fi accesat doar dacă utilizatorul aplicației s-a autentificat cu un nume de cont valid. Acest formular permite: realizarea sincronizării cu editorul, accesul la formularul de introducere / editare date consultații pacienți, realizarea deautentificării, ieșirea din aplicație. Operațiunea de sincronizare ce poate fi declanșată din formularul AppH5N1, de data aceasta va efectua autentificarea la editor pe baza datelor contului cu care s-a realizat autentificarea la aplicație. În urma operațiunii de sincronizare, modificările efectuate de abonat vor fi reflectate către editor, iar editorul va transmite către abonat toate înregistrările din tabela MEDICI precum și înregistrările (doar cele ce îndeplinesc condiția de filtrare) din tabela ANAMNEZA. Odată autentificați la aplicația H5N1, medicii vor putea introduce / edita date privind consultațiile pacienților, respectiv vor accesa (prin intermediul opțiunilor Consultație pacient / Consultații efectuate) cel de-al treilea formular al aplicației – Consultație. Deautentificarea se va putea realiza prin apăsarea „Sfarsit sesiune” din meniul formularului AppH5N1, caz în care aplicația va direcționa utilizatorul către formularul Autentificare.

lblInfMedic

mbtnConsultatiiEfectuate

mbtnSfarsitSesiune

mbtnIesire

mbtnSincronizare

mbtnConsultPacient

Figură 21 Macheta generală a formularului AppH5N1

Formularul Consultație va îndeplini două funcționalități (formular de introducere date

consultație pacient, respectiv formular de editare date consultații pacient), în funcție de care anumite controale vizuale vor fi activate / dezactivate ori vor avea culori sau mesaje diferite. În cazul introducerii de date:

Titlul formularului va conține 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 afișa mesajele „Salveaza date pacient nou”,

respectiv „Reseteaza formular”. După confirmarea salvării datelor pacientului, utilizatorul va fi direcționat către formularul

AppH5N1.

Page 32: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

32

În cazul editării datelor: Titlul formularului va afișa mesajul „Modifica date pacienti!”. Componenta ComboBox cmbAlegePacient va fi activată și va conține numele și prenumele

pacienților consultați. Textul tuturor elementelor vizuale de tip TextBox, NumericUpDown, RadioButton, Button, va

fi de culoare roșie (System.Drawing.Color.DarkRed). În cazul în care medicul autentificat are consultații efectuate, la deschiderea formularului

Consultație, automat toate componentele vizuale vor fi completate cu datele primului pacient din componența ComboBox cmbAlegePacient.

Componentele btnSalveaza și btnReseteaza vor afișa mesajele „Salveaza modificari pacient!” respectiv „Renunta modificari pacient!”. De asemeni aceste componente vor fi active doar în cazul în care medicul autentificat la aplicație are cel puțin un pacient consultat.

După confirmarea salvării modificărilor datelor pacientului, formularul Consultație va rămâne activ.

cmbAlegePacient txtNumePrenume

nudVarsta

txtAdresa

rbnUrban

rbnRural txtNrTelefon

Figură 22 Macheta generală a formularului Consultație (cadrul de pagină Date pacient)

Page 33: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

33

txtTemperatura

rbnDureriCapNu rbnDureriCapDa

rbnDureriGatDa

rbnDureriMusculareDa

rbnNasInfundatDa

rbnConjunctivitaDa

rbnTuseDa

rbnSenzatieSufocareDa

rbnInsuficientaRespiratorieDa

rbnContactAnimaleDa

rbnDureriMusculareNu

rbnDureriGatNu

rbnNasInfundatNu

rbnConjunctivitaNu

rbnTuseNu

rbnSenzatieSufocareNu

rbnInsuficientaRespiratorieNu

rbnContactAnimaleNu

nudNrZileAparitieSimptome

Figură 23 Macheta generală a formularului Consultație (cadrul de pagină Anamneza)

Page 34: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

34

txtInformatiiSuplimentare

btnSalveaza

btnReseteaza

Figură 24 Macheta generală a formularului Consultație (cadrul de pagină Salveaza)

Realizarea conexiunii cu baza de date H5N1_MEDIC.sdf Se va creea un nou proiect Windows Mobile 5.0 Pocket PC cu denumirea H5N1, apoi se vor

realiza cele trei formulare (formularul Consultație va fi creat în forma prezentată ca „introducere date pacienti”) respectând denumirile obiectelor vizuale așa cum sunt prezentate în imaginile de mai sus. Următorul pas constă în a realiza conexiunea cu baza de date H5N1_MEDIC.sdf folosind wizard-ul pus la dispozitie de mediul Visual Studio (vom încărca setul de date local cu toate obiectele existente în baza de date și îi vom atribui denumirea setul_de_date_H5N1). După ce s-a realizat conexiunea cu baza de date, va trebui să creăm noi metode de încărcare cu datele tabelei MEDICI din setul de date local. Deschidem schema setului de date local prin accesarea fișierului setul_de_date_H5N1.xsd, se accesează meniul contextual al tabelei MEDICI – Add – Query.... La pasul „Specify a SQL SELECT statement” a wizard-ului, se va introduce fraza SQL – SELECT cod_medic, nume_prenume_medic, nume_cont, parola_cont, adresa_contact, telefon_contact, rowguid FROM MEDICI WHERE nume_cont=@nume_cont AND parola_cont=@parola_cont.

Page 35: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

35

Figură 25 Frază SQL parametrizată ce va fi folosită pentru a încărca cu date

tabela MEDICI din setul de date local. În pasul Choose Methods to Generate, formularul wizard-ului va fi completat cu denumiri sugestive asemănătoare cu cele din imaginea alăturată.

Figură 26 Denumirile asociate metodelor de încarcare

cu date a tabelei MEDICI din setul de date local

Page 36: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

36

Asemănător 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 aplicației H5N1 ar trebui să fie asemănătoare cu schema prezentată în imaginea alăturată.

Figură 27 Schema setului de date local al aplicației H5N1

Medic.vb & Sincronizare.vb Pentru a ne ușura cât mai mult munca, am decis realizarea a două clase:

Medic – are rolul de a păstra date referitoare la persoana autentificată la aplicație; Sincronizare – va reda funcționalitatea necesară aplicației pentru a realiza replicarea datelor.

Fiecare clasă va fi creată într-un fișier separat cu extensia .vb (din fereastra Solution Explorer – click dreapta – Add – Class...). Medic.vb – vezi Anexa 1

Tabelul nr. 6 Constructorul clasei Medic Medic(cod_medic As Integer, nume_prenume_medic As String, nume_cont As String, parola_cont As String, adresa_contact As String, telefon_contact As String)

Creează o nouă instanță a tipului Medic. Parametrii:

cod_medic – codul intern asociat medicului;

nume_prenume_medic – reprezintă numele și prenumele medicului autentificat la aplicația H5N1;

nume_cont – numele de cont cu care medicul s-a autentificat la aplicație;

parola_cont – parola introdusă de mediul autentificat la aplicație;

adresa_contact – adresa medicului; telefon_contact – numărul de telefon al

medicului; Valorile acestor parametrii vor fi preluate din baza

Page 37: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

37

de date aflată pe dispozitivul smart.

Tabelul nr. 7 Metodele clasei Medic get_adresa_contact() Returnează o valoare de tip String ce va conține adresa medicului

autentificat la aplicația H5N1. get_cod_medic() Returnează o valoare de tip Integer ce va conține codul medicului

autentificat la aplicația H5N1. get_nume_cont() Returnează o valoare de tip String ce va conține numele de cont al

medicului autentificat la aplicația H5N1. get_nume_prenume_medic() Returnează o valoare de tip String ce va conține numele și

prenumele medicului autentificat la aplicația H5N1. get_parola_cont() Returnează o valoare de tip String ce va conține parola asociată

contului medicului autentificat la aplicația H5N1. get_telefon_contact() Returnează o valoare de tip String ce va conține numărul de telefon

al medicului autentificat la aplicația H5N1. Sincronizare.vb – vezi Anexa 2

Tabelul nr. 8 Constructorii clasei Sincronizare Sincronizare() Creează o instanță a tipului Sincronizare. Apelul

metodei sincronizare() sau reinitializare_subscriere_si_sincronizare() a unui obiect instanțiat cu acest constructor, va determina realizarea sincronizării 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, făcând astfel posibil ca apelul metodei sincronizare() sau reinitializare_subscriere_si_sincronizare(), să determine sincronizarea cu editorul, autentificarea cu acesta făcându-se pe baza datelor obiectului transmis ca parametru.

Indiferent de constructor, la inițializare, membru privat repl al clasei Sincronizare va fi „încărcat” cu o serie de date ce permit conectarea la publicație:

InternetUrl – adresa URL a agentului SQL Server Compact Edition; Publisher – denumirea editorului; PublisherDatabase – denumirea bazei de date publicate; Publication – denumirea publicației; Subscriber – denumirea abonatului; SubscriberConnectionString – stringul de conectare la baza de date;

Toate aceste date vor fi păstrate de membrii privați ai clasei Sincronizare, iar valorile cu care aceștia sunt initializați corespund configurației prezentate pe parcursul acestui capitol (în cazul în care nu ați folosit aceleași denumiri, adrese IP, etc., valorile membrilor privați vor trebui schimbate conform configurației alese de dumneavoastră).

Tabelul nr. 9 Metodele clasei Sincronizare aceeasi_subscriere() Apelul acestei metode va determina extragerea de

informații referitoare la proprietățile ultimei sincronizării (se vor fi obține din tabelele sistem

Page 38: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

38

__sysMergeArticles, __sysMergeArticles, __sysMergeArticles ale bazei de date H5N1_MEDIC.sdf). Datele extrase vor fi comparate cu datele din membrul privat repl, în funcție de care se va retuna TRUE sau FALSE.

sincronizare() Apelul acestei metode va determina apariția unei casete de mesaj prin intermediul căreia utilizatorul va confirma (sau nu) sincronizarea cu editorul.

reinitializare_subscriere_si_sincronizare() Apelul acestei metode va avea efect asemănător cu metoda sincronizare(), diferența fiind dată de faptul că noua metodă va efectua și o reinițializare a subscrierii.

Implementarea funcționalității aplicației H5N1 Autentificare.vb – vezi Anexa 3 AppH5N1.vb – vezi Anexa 4 Înainte de a scrie codul formularului Consultație, este necesar a realiza legătura 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 cerințe prin parcurgerea a cinci pași simpli:

se deschide formularul Consultație și se va selecta componenta vizuală cmbAlegePacient; pentru proprietatea DataSource se va alege tabela ANAMNEZA a setului local;

Figură 28 Conectarea componentei ComboBox cmbAlegePacient

la tabela ANAMNEZA

Page 39: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

39

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

Figură 29 Stabilirea principalelor proprietăți pentru cmbAlegePacient

setul de date și adaptorul generate de wizard vor fi redenumite conform imaginii următoare;

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

Consultatie.vb – vezi Anexa 5

Page 40: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

40

Împachetarea și distribuirea aplicațiilor mobile

Împachetarea și distribuirea aplicațiilor destinate dispozitivelor smart, nu sunt procese relativ simplu de efectuat (comparativ cu modalitățile de împachetare și distribuire ale aplicațiilor destinate desktop-urilor). După ce o aplicație a fost realizată și testată, următorul pas constă în a o distribui utilizatorilor. Este foarte important de avut în vedere faptul că nivelul cunoștințelor din domeniul utilizării noilor tehnologii, diferă de la un utilizator la altul, mai mult decât atât, dispozitivele smart au configurații hardware și software diferite. Scopul acestui capitol este de a explica modul în care putem împacheta și distribui aplicațiile, având în vedere „piedicile” enumerate.

Trebuie amintit faptul că aplicațiile smart dezvoltate în oricare limbaj de programare .NET, pentru a putea fi funcționabile trebuiesc a fi executate de pe un dispozitiv care în prealabil are instalat framework-ul .NET (corespunzător versiunii sub care acestea au fost dezvoltate). Există vești bune în acest sens, dispozitivele smart al căror sistem de operare este Windows Mobile 6.0/6.1, au implicit instalate Microsoft .NET Compact Framework 2.0 și Microsoft SQL Server Compact Edition. În cazul în care se încearcă a fi executată o aplicație dezvoltată într-una din platformele .NET, de pe un dispozitiv smart ce nu are instalat în prealabil framework-ul .NET, utilizatorul va fi informat de acest lucru prin intermediul unui mesaj suficient de sugestiv.

Figură 31 Mesajul prin care utilizatorul este înștiințat de necesitatea instalării în prealabil a Microsoft .NET Compact Framework

Principalii pași ce trebuiesc realizați, sunt: stabilirea fișierelor ce alcătuiesc aplicația; realizarea fișierului .CAB (fișier în care aplicația va fi împachetată) – practic din acest moment

aplicația poate fi distribuită către utilizatori, dar pentru realizarea unui pachet de instalare,

Page 41: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

41

care executat de pe stația locală să efectueze instalarea aplicației pe dispozitivul smart atașat, trebuiesc realizați și restul pașilor;

realizarea unui fișier .dll în care vor fi specificate acțiunile ce se vor efectua după / înainte de instalare/dezinstalare;

realizarea pachetului de instalare în care vor fi împachetate toate fișierele necesare pentru ca aplicația să poată fi instalată direct de pe desktop-ul utilizatorului;

Modalități de distribuire a aplicațiilor prin intermediul serverelor web: utilizatorul folosind browserul (Microsoft Internet Explorer

Mobile) va accesa pagina web de unde poate fi descărcat fișierul .CAB, urmând apoi a efectua instalarea.

prin intermediul poștei electronice: utilizatorul primește fișierul .CAB ca atașament al unui e-mail, urmând a-l descarcă și executa.

prin intermediul cardurilor de memorie: utilizatorul atașează un card de memorie (pe care este stocat fișierul .CAB) la dispozitivul smart de unde își va descărca și instala aplicația.

prin intermediul unui director partajat: utilizatorul accesează de pe dispozitivul smart un director partajat de unde va putea accesa fișierul .CAB.

prin intermediul ActiveSync: utilizatorul va atașa dispozitivul smart la stația locală, va realiza sincronizarea prin intermediul aplicației ActiveSync și va executa pachetul de instalare de pe unitatea desktop, iar aplicația va fi transferată și înregistrată pe dispozitivul mobil.

etc.

Împachetarea și distribuirea aplicației H5N1 În cele ce urmează, se va prezenta modalitatea în care aplicația H5N1 (a se vedea capitolul

referitor la replicarea bazelor de date) poate fi împachetată și distribuită către utilizatori (am considerat ca aplicația H5N1 să fie luată drept exemplu, deoarece ea pare a fi cea mai completă și mai în măsură să acopere subiectele de interes ale acestui capitol).

Stabilirea fișierelor ce alcătuiesc aplicația După ce am scris și rulat aplicatia pentru prima dată, observăm că structura fișierelor (din

directorul unde aplicația a fost copiată pe dispozitivul smart) nu este chiar complexă.

Avem așadar două fișiere: H5N1.exe H5N1_MEDIC.sdf

Cel mai probabil, dacă e să fi utilizat emulatorul, iar sistemul de operare ales a fost Windows Mobile 5.0, înainte de a trece fișierele pe dispozitivul smart, mediul integrat Visual Studio 2008 a efectuat verificări în privința resurselor software necesare execuției aplicației, iar în cazul în care acestea nu existau, automat s-ar fi efectuat instalarea lor.

Totuși, nu tot timpul aceaste resurse software necesare aplicației pot fi instalate automat, însă unele dintre ele (în cazul nostru SQL Server Compact Edition) permit ca atunci când o serie de fișiere .dll sunt incluse în proiect și distribuite împreună cu aplicația, instalarea să nu mai fie obligatorie.

Dacă avem curiozitatea și accesăm directorul în care se află distribuțiile SQL Server Compact Edition (Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500) vom găsi o serie de directoare în care sunt fișiere .CAB și .dll. Însă, oare de ce atâtea directoare și fișiere care fac același lucru? Ei bine, denumirile directoarelor sunt acronime de la diferite tipuri de procesoare ale

Page 42: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

42

dispozitivelor smart. Așadar fiecare director în parte va conține fișiere .CAB și .dll specifice tipului de procesor cu denumirea directorului accesat.

Deci, pentru a evita situația în care aplicația 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 aplicația și câteva fișierele .dll (sqlceca30.dll, sqlcecompact30.dll, sqlceer30en.dll, sqlceme30.dll, sqlceoledb30.dll, sqlceqp30.dll, sqlcese30.dll).

O altă posibilă întrebare ar fi: „Aceleași fișiere .dll cu denumirile susmenționate se găsesc î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ă aplicația va fi executată, iar pentru a avea garanția că nu vor fi probleme, vom fi nevoiți a face mai multe distribuții (fișiere .CAB în care aplicația va fi împachetată) pentru fiecare tip de procesor în parte. Ca exemplu, am decis a realiza distribuțiile pentru ARMV4I, SH4 și X86.

De asemeni, oricare alte fișiere ce sunt necesare funcționării corecte a aplicației, vor trebui

identificate pentru a putea fi împachetate și distribuite odată cu ea.

Realizarea fișierului .CAB 1. Se va deschide proiectul H5N1 în mediul Visual Studio 2008. 2. Din fereastra Configuration Manager (Build – Configuration Manager), se va seta Release

pentru Active solution configuration.

Figură 32 Pentru optimizarea codului aplicației se va alege modul de compilare Release

3. Completarea informațiilor de ansamblare a aplicație: se acceseaza meniul contextual al proiectului H5N1, apoi se deschide fereastra de proprietăți. În secțiunea Application se va apăsa butonul Assembly Information.

Page 43: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

43

Figură 33 Fereastra de proprietăți a proiectului H5N1 (cadrul de pagină Application)

Figură 34 Fereastra în care vor fi completate informațiile de ansamblare a aplicației

4. Următorul pas constă în adăugarea unui nou proiect de tip Smart Device CAB la soluția existentă (File – Add – New Project, din panoul stâng 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”.

Page 44: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

44

Figură 35 Conținutul ferestrei Solution Explorer după ce a fost adăugat noul proiect de tip Smart Device CAB

5. Completarea proprietăților proiectului „H5N1.ARMV4I”: se va selecta noul proiect, apoi din fereastra Properties se vor efectua modificări asemănătoare cu cele din imaginea alăturată.

Figură 36 Fereastra de proprietăți a proiectului H5N1.ARMV4I

6. Specificarea fișierelor 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 Conţine informaţii referitoare la aplicaţia care va fi instalată prin intermediul pachetului.

Page 45: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

45

Figură 37 Meniul contextual prin intermediul căruia sunt incluse în proiect fișierele necesare instalării aplicației H5N1

Figură 38 Fereastra Add Project Output Group prin intermediul căreia sunt incluse în proiect fișierele necesare instalării aplicației H5N1

7. Ca rezultat, în zona de conținut a secțiunii Application Folder va apărea o nouă intrare denumită Primary output from H5N1. În același timp, în arborele soluției se populează folderul Detected Dependencies cu fișierele necesare aplicației. Dintre respectivele fișiere este foarte important a include în folderul în care se află aplicația, fișierul System.Data.SqlServerCe.dll (se va selecta respectivul fișier iar din meniul contextual se va debifa Exclude – în consecintă acesta va fi adus în zona de conținut a secțiunii Application Folder).

Page 46: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

46

Figură 39 Includerea în proiect a fișierului System.Data.SqlServerCe.dll

8. Dacă tot discutăm despre fișierele adiacente aplicației, este momentul a include și restul fișierelor (baza de date H5N1_MEDIC.sdf, fișierul .ico – în cazul în care s-a optat pentru o pictogramă, precum și fișierele .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 operațiuni, în pachetul de instalare va fi adăugată baza de date precum și pictograma asociată (fișierul .ico).

b. adăugarea fișierelor .dll se va face prin intermediul ferestrei Add Files (meniul contextual Application Folder – Add – File), se accesează directorul în care se află fișierele .dll pentru tipul de procesor ARMV4I, iar apoi click pe butonul Open.

Figură 40 Includerea fișierelor .dll 9. În cazul în care se dorește ca după instalarea aplicației, în directorul Programs (accesibil din

meniul Start) a dispozitivului smart, să fie realizată o „legatură rapidă”, atunci:

Page 47: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

47

a. în folderul Application Folder, acționăm click dreapta pe zona Primary output from H5N1 și selectăm opțiunea Create Shortcut to Primary output from H5N1.

b. noul fișier va fi redenumit „H5N1”. c. din panoul din stânga ferestrei File System se va face click dreapta pe File System on

Target Machine – Add Special Folder – Programs Folder.

Figură 41 Specificarea directorului în care se dorește adăugarea legăturii rapide

d. pentru a definitiva în mod corect problema legăturii rapide, mai este necesară deplasarea ei în folderul Programs Folder prin tehnica drag&drop.

10. Finalmente conținutul proiectului „H5N1.ARMV4I” ar trebui să fie asemănător cu imaginea alăturată.

Figură 42 Forma finală a proiectului H5N1.ARMV4I

11. Tot ce ne mai rămâne de făcut este să compilăm proiectul (din fereastra Solution Explorer click dreapta H5N1.ARMV4I – Build). Rezultatul acestei operațiuni constă în generarea unui fișier cu extensia .CAB în directorul Release a proiectului. Din acest moment aplicația poate fi distribuită către utilizatori.

Page 48: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

48

Pentru realizarea fișierelor .CAB compatibile și celorlalte arhitecturi, va trebui să parcurgem aceeași pași parcurși ca și în cazul proiectului „H5N1.ARMV4I”, diferența fiind dată de schimbarea fișierelor .dll cu cele specifice procesorului pentru care se realizează împachetarea.

Specificarea acțiunilor ce se vor efectua în timpul instalării/dezinstalării20 În cadrul aceleiași soluții se va adăuga un nou proiect Windows Visual Basic de tip Class

Library căruia îi va fi atribuită denumirea „H5N1_conditii_instalare_dezinstalare”. Implicit noul proiect va conține un fișier „Class1.vb” pe care va trebui să îl redenumim în „Conditii_Instalare_Dezinstalare.vb”.

Figură 43 Conținutul ferestrei Solution Explorer după ce a fost adăugat noul proiect de tip Class Library

Înainte de a implementa clasa „Conditii_Instalare_Dezinstalare” este necesar a adăuga proiectului curent două referințe – System.Configuration.Install, respectiv System.Windows.Forms. Acestă operațiune se poate realiza prin accesarea ferestrei Add Reference (din fereastra Solution Explorer se accesează opțiunea 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ă efectuăm compilarea proiectului „H5N1_conditii_instalare_dezinstalare” (din fereastra Solution Explorer se accesează opțiunea Build din meniul contextual al proiectului).

20 Etapă necesar a fi efectuată doar dacă se doreşte realizarea pachetului de instalare care să permită instalarea aplicaţiei direct de pe staţia locală.

Page 49: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

49

Realizarea fișierului .ini Managerul de aplicații (CEAppMgr.exe) poate fi găsit în directorul unde a fost instalat Microsoft ActiveSync, el fiind „responsabil” cu transferul fișierelor .CAB de pe stația locală, pe dispozitivul smart atașat (o altă îndatorire a managerului de aplicații este de a identifica pachetul compatibil arhitecturii dispozitivului mobil). Așadar, managerul de aplicații va trebui sa acceseze un fișier .ini care va conține informații (versiune, scurtă descriere, fișiere .CAB21, etc.) referitoare la aplicația ce urmează a fi instalată. Folosind editorul de texte Notepad, creați pe discul local (de preferat în directorul rădăcină al soluției H5N1) fișierul „setup.ini”.

setup.ini

[CEAppManager] Version = 1.0 Component = H5N1 [H5N1] Description = Aplicatie consultatii pacienti CabFiles = H5N1.ARMV4I.CAB,H5N1.SH4.CAB,H5N1.X86.CAB Odată finalizat și fișierul setup.ini, tot ce mai rămâne de făcut este să realizăm pachetul de instalare ce va fi executat de utilizator direct de pe stația locală.

Se va reveni în mediul Visual Studio 2008, iar în cadrul soluției H5N1 va fi adăugat un nou proiect de tip Setup Project (File – Add – New Project, din panoul stâng al ferestrei Add New Project se va extinde nodul Other Project Types, se va alege Setup and Deployment, iar din panoul din dreapta ferestrei se va face click pe Setup Project), căruia îi va fi atribuită denumirea „H5N1_setup”.

Figură 44 Adăugarea unui nou proiect de tip Setup Project

21 În cazul în care există mai multe distribuţii, denumirile fişierelor .CAB vor fi despărţite prin virgulă (înainte şi după virgulă nu sunt admise spaţii libere).

Page 50: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

50

Din fereastra Solution Explorer se va selecta noul proiect, iar din meniul contextual al acestuia prin intermediul opțiunilor Add – File vor fi adăugate fișierele:

H5N1.ARMV4I.CAB H5N1.SH4.CAB H5N1.X86.CAB H5N1_conditii_instalare.dll setup.ini

Figură 45 Fișierele incluse în pachetul de instalare

După ce au fost adăugate la proiect fișierele necesare, urmează etapa în care va trebui să specificăm acțiunile ce trebuiesc efectuate pe stația 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 acțiuni personalizate (click dreapta Add Custom Action ...).

Figură 46 Specificarea acțiunilor personalizate ce se vor efectua după instalare/dezinstalare

Ultimele operațiuni necesarare a fi efectuate constau în a:

completa proprietățile Author, Manufacturer, ProductName, Title; compila pachetul de instalare.

Page 51: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

51

Figură 47 Proprietățile pachetului de instalare

După ce pachetul de instalare a fost compilat, în directorul Release al proiectului „H5N1_setup” veți găsi două fișiere (H5N1_setup.msi, setup.exe) care vor putea fi distribuite către utilizatori. Folosind pachetul de instalare, pentru a înregistra aplicația H5N1 pe dispozitivul smart, utilizatorul nu trebuie decât să realizeze sincronizarea dintre stația locală și dispozitivul mobil, apoi să execute unul dintre cele două fișiere create cu ajutorul mediului Visual Studio 2008.

Page 52: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

52

Concluzii Ar fi nepotrivit să menționăm un numar mare de concluzii în privința dezvoltării aplicațiilor

mobile pe platforma .NET doar prin prisma acestei lucrări. Totuși din experiența acumulată până în momentul de față, putem afirma că platforma .NET este o platformă flexibilă, ușor de învățat și ușor de folosit. Mai mult decât atât, în privintă aplicațiilor ce privesc strict domeniul economic, limitele sunt date doar de capacitățile intelectuale ale dezvoltatorilor.

Așa cum am spus de la bun început, platforma oferită de către Microsoft pentru dezvoltarea aplicațiilor destinate dispozitivelor mobile nu diferă foarte mult de platforma folosită în cazul dezvoltării de aplicații pentru sistemele clasice. Microsoft pune la dispoziție un set de instrumente excepționale pentru dezvoltarea de produse profesionale. Dacă e să luăm în calcul cerințele unui client ce dorește să îi fie dezvoltat un produs software, cu siguranță acesta va cere ca produsul său să fie dezvoltat în cel mai scurt timp cu putință, să fie un produs care poate fi ușor de implementat și utilizat, să fie portabil și nu în ultimul rând 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 lângă instrumentele puternice oferite de IDE, dezvoltatorii beneficiază de un set de clase puternice (care sunt îmbunătățite și extinse de la o versiune la alta) ce obligă programatorii să se concentreze asupra logicii aplicației. Spre exemplu, odată cu apariția .NET Compact Framework 3.5, programatorii pot beneficia de facilitățile oferite de Language Integrated Query (LINQ) prin intermediul căruia se reduc simțitor numărul liniilor de cod scrise pentru efectuarea unor operațiuni complexe. În plus, LINQ este foarte asemănător sintaxei SQL, ceea ce determină ca un programator care are cunoștinte medii despre limbajul de interogare SQL să poată învăța să utilizeze funcționalitățile oferite de LINQ în mai puțin de câteva ore. Chiar dacă trebuie să fie capitol de incheiere este imposibil să nu exemplificam cele anterior menționate.

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 conține minim patru agenți ale caror numere de telefon difera și un altul care nu are număr de telefon (proprietatea Telefon va avea valoarea NULL/NOTHING). Să se scrie secvența de cod prin care se va afișa lista agenților ordonați după nume și grupată după primele patru caractere din numărul de telefon.

Varianta 1 (varianta clasică) – vezi Anexa 7

Varianta 2 (varianta ce folosește LINQ) – vezi Anexa 8

Din secvențele de cod prezentate anterior se vede clar o îmbunătățire în ceea ce privește numărul de linii de cod scrise. Dacă e să luăm în calcul și timpul alocat rezolvării acestei probleme, o persoană ce posedă cunoștințe medii de programare .NET va găsi ș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-menționată nu este de foarte mare complexitate, dar ce ar fi dacă la cerința actuală s-ar adăuga și condiția ca datele să fie sortate după mai multe criterii (ascendent sau descendent în funcție de atribut), grupate după mai multe atribute, lista cu agenți să fie joncționată cu o alta listă și poate chiar și efectuate ceva operațiuni de agregare? În acest caz variantă clasică cu siguranța ar determina programatorul să scrie

Page 53: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

53

câteva zeci (bune) de linii de cod, pe când folosind facilitățile LINQ rezolvarea s-ar limita la câteva instrucțiuni simple (evident doar dacă persoana care rezolvă problema stăpânește bine LINQ sau are o oarecare experiența cu limbajul SQL).

Momentan dispozitivele ale căror sistem de operare este Windows Mobile domină piața de business doar pentru simplul fapt că sunt foarte ușor 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 dezvoltării produsului software folosind platforma .NET.

În privința costurilor de producție chiar dacă dezvoltarea produselor software pe platforma Microsoft presupune anumite costuri, în ultima perioadă lucrurile s-au mai schimbat datorită faptului că numărul dezvoltatorilor din zona Microsoft a crescut simțitor, determinând astfel ca celelalte platforme care nu presupun cheltuieli în privința utilizării respectivei tehnologii să devină mai scumpe datorită creșterilor cheltuielilor cu resursa umană (un număr de specialisti mult mai redus). Evident, creșterea cheltuielilor pentru realizarea unui produs dezvoltat pe o platformă free sunt determinate și de alți factori, dar cheltuielile cele mai mari sunt cele salariale (factor principal).

Finalizăm prin a afirma că platforma .NET este flexibilă și ideal a fi folosită în dezvoltarea aplicațiilor mobile.

Page 54: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

54

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

Page 55: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

55

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

Page 56: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

56

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

Page 57: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

57

Anexa 3: Autentificare.vb Public Class Autentificare 'Instanțierea membrului privat "sinc" (apelul metodelor acestei 'instanțe va determina realizarea sincronizării anonime dintre 'abonat și editor). Private sinc As New Sincronizare 'Instanțierea adaptorului prin intermediul 'căruia se vor efectua căutări î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 'Instanțierea 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 aplicației 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 când 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 când 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 'intrărilor făcute de utilizatorul aplicației 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 'conține doar o singură înregistrare, se presupune 'că intrările (numele de cont si parola) 'utilizatorului sunt valide, în consecință îi va fi 'permis accesul la aplicație.

Page 58: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

58

'Pe baza datelor extrase din baza de date (date 'referitoare la contul utilizatorului aplicației 'H5N1), se va crea o instanția 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 căreia 'îi sunt transmise prin intermediul parametrilor: '* date referitoare la medicul autentificat la aplicație '* o nouă instanță a clasei Sincronizare '* referința obiectului curent Dim formular As New AppH5N1(medic, New Sincronizare(medic), Me) 'Se golește formularul utilizat 'la autentificarea utilizatorilor. Me.txtNumeDeCont.Text = "" Me.txtParolaCont.Text = "" Me.txtNumeDeCont.Focus() Cursor.Current = Cursors.Default 'Se afișează 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 cărui cont 'să fie asociat numelui de cont și parolei introduse 'de utilizator, nu va fi permis accesul la celelalte 'formulare ale aplicației. 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

Page 59: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

59

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 'următorele secvențe 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 următoarele secvențe de cod 'pentru a determina dacă se va folosi, sau nu, metoda prin care 'sincronizarea cu editorul este insoțită și de o reinițializare '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. Secvențele de cod ale acestei metode 'pot fi văzute în fișierul AppH5N1.Designer.vb din 'directorul proiectului H5N1. Rolul acestei metode este de a 'inițializa 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 încărcat în memorie. Private Sub AppH5N1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Textul etichetei lblInfMedic va afișa informații despre 'medicul autentificat la aplicație. 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 când utilizatorul

Page 60: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

60

'va apăsa butonul mbtnConsultatiiEfectuate '("Consultații efectuate") al aplicației 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 căreia 'îi sunt transmise prin intermediul parametrilor: '* referinta_formular_AppH5N1 - referința obiectului curent; '* pacient_nou - valoarea FALSE, prin care 'formularul va prelua comportamentul formularului de editare 'consultații pacienți. Dim formular_vizualizare_modificare_pacienti As New Consultatie(Me, False) Cursor.Current = Cursors.Default 'Se afișează formularul Consultatie. formular_vizualizare_modificare_pacienti.Show() 'Formularul curent va fi "ascuns". Me.Hide() End Sub 'Procedură eveniment ce va fi apelată atunci când utilizatorul 'va apăsa butonul mbtnConsultPacient ("Consultatie pacient") 'al aplicației 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 'consultații pacienți. 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 când utilizatorul 'va apăsa 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 aplicației

Page 61: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

61

'dorește realizarea sincronizării cu editorul, și: '* acest proces este cerut a se realiza pentru 'prima oara de când utilizatorul s-a autentificat 'la aplicație; '* datele referitoare la subscriere nu aparțin 'utilizatorului autentificat; 'atunci procesul de sincronizare va fi însoțit 'și de o reinițializare a subscrierii. If sinc.reinitializare_subscriere_si_sincronizare() Then prima_sincronizare_cu_reinitializare = False End If Else 'În cazul în care utilizatorul aplicației a mai 'efectuat sincronizari cu editorul, sau ultima 'subscriere îi aparține medicului autentificat, 'atunci noua cerere nu va trebui a fi însoțită 'și de o reinițializare 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 când utilizatorul 'va apăsa butonul mbtnSfarsitSesiune ("Sfarsit sesiune") al 'aplicației 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 când utilizatorul 'va apăsa 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 aplicației. referinta_formular_autentificare.Close() End Sub End Class

Page 62: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

62

Anexa5: Consultatie.vb Public Class Consultatie 'Se declară membrul privat referinta_formular_AppH5N1 de tip AppH5N1 '(clasa formularului AppH5N1), folosit în următoarele secvențe de cod 'pentru a controla comportamentul formularului AppH5N1. Private referinta_formular_AppH5N1 As AppH5N1 'Membrul privat pacient_nou va fi folosit în următoarele secvențe de 'cod pentru a determina comportamentul formularului (introducere date 'consultație pacient / editare date consultație pacient). Private pacient_nou As Boolean 'Membrul privat rand_pacient este de tip ANAMNEZARow iar în 'următoarele secvențe de cod va prelua datele consultației 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ă consultație. Me.Text = "Date consult pacient!" cmbAlegePacient.Enabled = False Else 'Formatul formularului în cazul în care se dorește 'vizualizarea/modificarea datelor unei anumite consultații. 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

Page 63: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

63

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 aplicației '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

Page 64: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

64

'Metodă al cărei rol este de a completa formularul aplicației '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

Page 65: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

65

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 consultații, 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

Page 66: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

66

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 dorește: '* ca modificările efectuate să nu fie permanentizate; '* formularul să fie adus la forma de dinaintea efectuării 'modificărilor; '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 când 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 păstra motivele pentru care salvarea datelor 'referitoare la consultație nu se poate efectua datorită 'completării eronate a formularului. Dim motiv_formularul_nu_este_corect_completat As String = "" 'Se efectuează simple verificări 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

Page 67: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

67

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

Page 68: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

68

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

Page 69: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

69

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ă consultație, iar formularul este corect 'completat, atunci datele despre noua consultație '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 modificării datelor unei consultații, 'iar formularul este corect completat, atunci 'modificările 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")

Page 70: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

70

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

Page 71: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

71

Anexa 6: Conditii_Instalare_Dezinstalare.vb Imports System.Windows.Forms Imports System.Diagnostics Imports System.Reflection Imports System.IO Imports 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 'Secvențe de cod ce vor fi executate atunci când aplicația '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 'Secvențe de cod ce vor fi executate atunci când aplicația '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 'Funcția are rolul de a verifica dacă 'Managerul de Aplicații CE este instalat pe stația locală. 'Se verifică dacă printre regiștrii stației 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 Aplicații este instalat, 'se va returna valoarea registrului (calea de pe discul 'local unde poate fi găsit CEAPPMGR.EXE). Return cheie_registru.GetValue("") Else 'În caz contrar, utilizatorului 'îi va fi afișat un mesaj de eroare! MessageBox.Show("Managerul de Aplicatii CE nu este instalat!", "Nu am gasit Managerul de Aplicatii CE!", MessageBoxButtons.OK,

Page 72: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

72

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

Page 73: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

73

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

Page 74: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

74

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

Page 75: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

75

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

Page 76: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

76

Anexa 8: Varianta 2 (varianta ce folosește LINQ) Public Class Agent Public IntCodAgent As Integer Private StrNumePrenume As String Private StrNumeCont As String Private StrParola As String Private StrAdresa As String Private StrTelefon As String Sub New(ByVal CodAgent As Integer, ByVal NumePrenume As String, ByVal NumeCont As String, ByVal Parola As String, ByVal Adresa As String, ByVal Telefon As String) Me.CodAgent = CodAgent Me.NumePrenume = NumePrenume Me.NumeCont = NumeCont Me.Parola = Parola Me.Adresa = Adresa Me.Telefon = Telefon End Sub Public Property CodAgent() As Integer Get Return Me.IntCodAgent End Get Set(ByVal value As Integer) Me.IntCodAgent = value End Set End Property Public Property NumePrenume() As String Get Return Me.StrNumePrenume End Get Set(ByVal value As String) Me.StrNumePrenume = value End Set End Property Public Property NumeCont() As String Get Return Me.StrNumeCont End Get Set(ByVal value As String) Me.StrNumeCont = value End Set End Property Public Property Parola() As String

Page 77: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

77

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

Page 78: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

78

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

Page 79: Iftode Viorel - Aplicatii Mobile (Lucrare Licenta)

79

Bibliografie

1. Anderson, C., Freeman., James, L., Johnston, A. Ljung, S., Mobile Media and Applications, From Concept to Cash: Successful Service Creation and Launch, Wiley, 2006

2. Andy, W., Peter, R., Building .NET Applications for Mobile Devices, Microsoft Corporation, 2002

3. Andy, W., Stephen, W., Microsoft .NET Compact Framework, Microsoft Press, Washington, 2003

4. 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

5. Erik, R., Ronnie, Y., Microsoft® .NET Compact Framework Kick Start, Sams Publishing, 2004 6. Fotache, M., Proiectarea bazelor de date, Editura Polirom, Iași, 2005

7. Jaokar, A., Fish, T., Mobile Web 2.0: The Innovator’s Guide to Developing and Marketing Next Generation Wireless/Mobile Applications, 2006

8. MacDonald, M., Szpuszta, M., Pro ASP.NET 2.0 in C# 2005, Apress, New York, USA, 2005 9. McPherson, F., How to Do Everything with Windows Mobile, McGraw-Hill Osborne Media, 2006

10. Octavian, D., Viorel, I., Aplicații mobile pe platforma .NET, Editura Universității „Alexandru Ioan Cuza”, Iași, 2007

11. Susman, D., Homer, A., ASP.NET 2.0 Visual Web Developer 2005 Express Edition, Wiley Publishing Inc., Indianopolis, Indiana, USA, 2006

12. Microsoft - http://channel9.msdn.com/wiki/mobiledeveloper/homepage 13. Microsoft - http://msdn.microsoft.com/en-us/library/ms171850.aspx 14. Microsoft - http://msdn.microsoft.com/en-us/library/ms151198.aspx 15. Microsoft - http://msdn.microsoft.com/en-us/netframework/aa497273.aspx 16. Microsoft - http://www.microsoft.com/sql/editions/compact/default.mspx 17. Microsoft - http://www.microsoft.com/windowsmobile/default.aspx


Recommended