Sisteme Informatice de Gestiune

Sisteme Informatice de Gestiune

Cuprins

Introducere

Capitolul 1. Sisteme Informatice

1.1. Definire

1.2. Ciclul de viatã al unui sistem informatic

Capitolul 2. Proiectarea Sistemelor Informatice

2.1. Proiectarea tehnicã a unui sistem

2.2. Elaborarea programelor

2.3. Implementarea, exploatarea și intreținerea

Capitolul 3. Limbajul de programare C

3.1 Definire

3.2 Tipuri și Declarații

3.3 Constante

3.4 Instrucțiuni

3.5 Funcții

3.6 Clase

Capitolul 6. Microsoft SQL Server

4.1 Prezentare

4.2 Baze de date

4.3 Bazele de date prestabilite în SQL Server

4.4 Crearea unei baze de date

4.5 Tipuri de date și crearea tebelelor într-o baza de date

Capitolul 5. Aplicației ’ANDGest’

5.1 Descrierea aplicației

Capitolul 6. Concluzii Finale

Bibliografie

2

Introducere

Conceptul de sistem apare în forme embrionare în filosofia antică greacă. Afirmând că "întregul este mai mult decât suma păților", Aristotel dă o primă definiție noțiunii de sistem care se va dezvolta și va evolua timp de peste 2000 de ani pentru a ajunge la forma actuală abia la începutul secolului XX.

Un sistem poate fi definit ca o secțiune a realității în care se identifică un ansamblu de fenomene, obiecte, procese, ființe sau grupuri, interconectate printr-o mulțime de relații reciproce, precum și cu mediul înconjurător și care acționează în comun în vederea realizării unor obiective bine definite.

Caracteristic pentru noțiunea de sistem este posibilitatea ca ansamblul de elemente componente ale sistemului să poata fi divizat în subsisteme.

Structurarea sistemului în subsisteme se face după reguli stabilite în funcție de scopul urmărit.

Mulțimea relațiilor dintre componentele unui sistem precum și relațiile între

componente și ansamblu formează structura sistemului, iar mulțimea caracteristicilor

unui sistem, la un moment dat, determină starea sa.

Relațiile dintre elemente se analizează observând și studiind logic funcțiile și mecanismele lor individuale. După precizarea acestor funcții și mecanisme, orice soluție avută în vedere poate fi evaluată pentru întregul sistem, tinând seama de diverse criterii de eficiență și de restricțiile practice asociate elementelor funcționale.

Elementele unui sistem pot avea relații între ele (relații endogene) cât și relații cu mediul înconjurător (relații exogene).

Ca urmare, pentru a caracteriza noțiunea de sistem este necesar să punem în evidență următoarele 5 laturi:

– mulțimea elementelor

– relațiile între elemente -relații endogene

– intrările și ieșirile în și din sistem-relații exogene

– caracterul variabil în timp al elementelor sistemului

– scopul, finalitatea sistemului

Pentru descrierea unui sistem și a evoluției sale se asociază "starea sistemului" care este un șir de variabile, un vector ale cărui componente variabile în timp permit cunoașterea sistemului în orice moment.

Folosind vectorul de stare al sistemului, și vectorii de intrare, ieșire, comandă etc. se poate asocia sistemului un sistem de ecuații de stare care permit studiul și sinteza unor clase de sisteme.

Pentru analiza comportamentului sistemelor, în ansamblul lor, s-a propus conceptul de "cutie neagră" care reprezintă sistemul ca un tot, făcând abstracție de procesele sale interne.

Analiza de sistem poate fi considerată un mijloc de abordare a cercetării, sau chiar disciplină în sine, deoarece acest concept a început să fie folosit pe scară largă în mai toate domeniile.

Analiza sistemelor presupune parcurgerea următoarelor etape:

3

1. Prima etapă constă în formularea problemei. Pentru toate lucrările ulterioare este important ca analistul să examineze critic formularea problemei de către utilizator. Este bine să se aibă în vedere că la acest prim contact între analist și utilizator pot apare probleme de comunicare între cei doi, datorate unor incompatibilități de limbaj. Orice eroare minoră în formularea problemei sau orice înțelegere eronată poate genera mari inconveniente prin amplificarea ei cu fiecare etapă parcursă.

2. De asemenea este deosebit de important să se examineze minuțios formularea obiectivelor pentru că în acest domeniu sunt posibile inconsecvente: "să se maximizeze eficiența concomitent cu încadrarea în cheltuielile minime".

3. Adeseori în optimizarea sistemelor apar dificultăți cauzate de faptul că este greu

sau chiar imposibil să se analizeze întreaga problemă. Se poate recurge în astfel de situații la optimizarea fiecărui subsistem analizat, dar sistemul în întregul său nu poate fi decât suboptimal fiind necesară deci precizarea clară a limitelor problemei.

4. Analiza cerințelor utilizatorului constă în identificarea și evaluarea necesităților

lui reale.

5. Precizarea criteriilor de măsurare a eficienței sistemului trebuie făcută înainte de evaluarea soluțiilor propuse prin stabilirea unui grup de mărimi reprezentative.

6. Analiza funcțională se concretizează într-o listă amănunțită a funcțiunilor și aprecierilor care trebuie îndeplinite. La analizele funcționale o deosebită importanță o are reprezentarea grafică în scheme bloc.

7. Pe masură ce se completează lista restricțiilor care acționează asupra sistemului devine posibilă cercetarea efectelor interacțiunii lor asupra întregului sistem. Identificarea restricțiilor și evaluarea efectului lor asupra eficienței sistemului reprezintă un alt aspect important.

8. Pe măsura avansării în analiza sistemului se conturează diferitele soluții posibile care satisfac restricțiile impuse. Obiectivul acestei faze este de a identifica diversele variante fără a adâncii analizele privind cheltuielile pe care le implică. Într-un sistem informatic, de exemplu, este necesar să se determine gradul în care hardware-ul și software-ul avute în vedere oferă posibilități de dezvoltare ulterioară.

9. După precizarea variantelor posibile se trece la compararea și evaluarea

acestora. Este de dorit ca atât cheltuielile cât și eficiența să fie exprimate banește.

Proiectarea sistemelor este un proces de concepție tehnică, asociat de obicei cu dezvoltarea sau cu modificarea importantă a unui sistem.

Acest proces se împarte în:

– proiectarea propriuzisă a sistemelor și

– proiectarea operării sistemelor

4

Capitolul 1

Sisteme Informatice

1.1. Definire

Deși la început calculatorele electronice erau folosite în exclusivitate pentru

calcule tehnico-știintifice, începând cu cel de-al șaptelea deceniu al secolului nostru, acestea sunt utilizate pe o scară tot mai largă pentru prelucrarea automată a datelor referitoare la procesele și fenomenele economice, la rezolvarea pe cale automată a unor probleme generate în procesul decizional.

Prelucrarea automată a datelor a apărut odată cu utilizarea calculatoarelor electronice în realizarea proceselor informaționale.

Pentru definirea sistemului informatic prezint un set de trei definiții unanim acceptate, dar care pun accentul pe una sau alta dintre trăsături, completându-se reciproc.

 Atunci când în sistemul informațional predomină utilizarea calculatoarelor electronice, se spune că el este un sistem informatic.

 Un sistem informatic poate fi definit ca un ansamblu tehnico-organizatoric de automatizare a culegerii și prelucrării informațiilor destinate desfășurării procesului de conducere, în scopul asigurării unei eficiențe cât mai mari a activității economico-sociale respective.

 Partea componentă a sistemului informațional prin care se asigură, pe baza

folosirii tehnicii de calcul și în primul rând a calculatoarelor electronice, tratarea rațională a datelor și a informației, cu eficiență sporită, constituie un sistem informatic.

În timp ce prima definiție pune accentul pe aspectul tehnic, adică pe utilizarea

calculatoarelor, cea de-a doua vizează aspectul de organizare și raționalizare a circuitului informațiilor destinate conducerii. Ultima definiție este cea care reunește cele două aspecte subliniate de primele definiții adăugând și relația de incluziune a sistemului informatic în sistemul informațional.

Sistemul informatic se asociază obligatoriu unui sistem informațional și este subordonat unui proces decizional. Prin tratarea datelor cu tehnica de calcul sunt eliminate erorile de informare care se repercutează negativ asupra calității desfășurării activităților.

Sistemul informatic este format, în esență, din următoarele categorii de elemente:

1. calculatoare electronice și alte echipamente

2. metode și tehnici de tratare a datelor și a informației

3. colecții organizate de date

4. proceduri și programe de tratare a datelor

5. cadre de specialitate

În cadrul sistemelor informatice, calculatorul electronic devine un factor de sprijinire a analizei și deciziei de maximă importanță, prin rezolvarea problemelor de optimizare, atât la nivelul elaborării programelor de activitate, cât și pe parcursul executării lor.

Un sistem informatic este conceput prin colaborarea dintre specialiști din domenii conexe iar realizarea unui sistem informatic este un proces complex, de durată și care necesită activități specifice de analiză, proiectare, programare și implementare.

5

Sistemul informațional trebuie să devină, prin introducerea sistemului informatic, instrument de reglare și autoreglare a sistemului economic. Obiectivul global urmărit este creșterea fiabilității sistemului economic studiat.

Din activitatea practică de realizare a sistemelor informatice se desprind următoarele

principii pentru realizarea sistemelor informatice.

1. Sistemul este pentru beneficiar, ceea ce implică:

• participarea permanentă a beneficiarului în toate etapele de realizare a

sistemului;

• întocmirea documentațiilor orientate către beneficiar într-un limbaj accesibil acestuia;

• aprobarea de către beneficiar a tuturor propunerilor făcute în proiect;

• responsabilitatea viitorului utilizator pentru implementarea sistemului, pentru

corectitudinea datelor folosite și pentru pregătirea personalului necesar exploatării

sistemului;

2. Problema cheie este cea a oamenilor nu a echipamentelor, și în special a analiștilor- proiectanți de sisteme, specialiști care au o influență hotărâtoare asupra modului de realizare a sistemelor.

3. Sistemele informatice trebuiesc justificate din punct de vedere cantitativ și calitativ, deoarece reprezintă investiții importante.

4. Realizarea sistemului informatic este un proces iterativ, ceea ce înseamnă că întâi trebuie stabilit numai cadrul general, detalierea făcându-se apoi treptat, în mai multe iterații.

5. Când nu putem să planificăm ceva nu putem să facem corect acel lucru, principiu valabil nu numai în informatică. În virtutea acestui principiu trebuie permanent urmărite și reactualizate planificările inițiale pe măsura realizării sistemului. De asemenea, trebuie acordată o deosebită atenție modului de etapizare a lucrărilor și mărimii etapelor pe care vrem să le realizăm.

6. Procedurile manuale sunt la fel de importante ca și programele, de corecta lor

proiectare depinzând durata de implementare și modul de funcționare a sistemului.

7. Trecerea de la vechiul sistem la noul sistem este ea însăși un sistem și de aceea

trebuie tratată cu mare atenție. Proiectantul de sistem are de fapt în față trei sisteme:

cel vechi, cel nou și cel care face trecerea de la vechiul mod de lucru la cel nou.

8. Sistemul trebuie să aibă o bună documentație în toate etapele de realizare.

1.2. Ciclul de viață al unui sistem infomatic

Din cele prezentate anterior se constată că restructurarea unui sistem informațional este un proces complex. Analistul de sistem trebuie să parcurgă o serie de etape și să rezolve o mulțime de probleme.

Analiza de sistem înseamnă cunoașterea sistemului, cunoaștere care se traduce printr-o reprezentare la nivel cerebral a sistemului în ansamblul la vechiul sistem la noul sistem este ea însăși un sistem și de aceea

trebuie tratată cu mare atenție. Proiectantul de sistem are de fapt în față trei sisteme:

cel vechi, cel nou și cel care face trecerea de la vechiul mod de lucru la cel nou.

8. Sistemul trebuie să aibă o bună documentație în toate etapele de realizare.

1.2. Ciclul de viață al unui sistem infomatic

Din cele prezentate anterior se constată că restructurarea unui sistem informațional este un proces complex. Analistul de sistem trebuie să parcurgă o serie de etape și să rezolve o mulțime de probleme.

Analiza de sistem înseamnă cunoașterea sistemului, cunoaștere care se traduce printr-o reprezentare la nivel cerebral a sistemului în ansamblul său. De fapt prin analiză s-a transpus realitatea mai întâi într-un model cerebral pe care analistul îl va transforma și îl va prezenta sub forma unui model matematic, grafic, etc..

Această activitate de percepere și reprezentare a realității nu este de loc ușoară și presupune participarea activă a tuturor membrilor echipei de proiectare dar și a

6

beneficiarului sistemului într-un context uman, material și organizatoric, propice realizării sistemului.

Mediul de proiectare al unui sistem informatic constă în unitatea proceselor de dezvoltare, a metodelor de definire, descriere, abstractizare, modificare, rafinare și documentare precum și modalitatea de automatizare a aplicării metodelor.

Când vorbim despre procesul de reorganizare a unui sistem informațional, trebuie să

descriem un model care să prevadă ceea ce va apărea în procesul de dezvoltare. Această etapizare va arăta ce trebuie făcut, cum va fi realizat, când va fi terminat și cine va folosi ceea ce s-a realizat.

Un bun model al procesului de prelucrare trebuie să respecte trei cerințe principale.

 Trebuie să aibă o mare putere descriptivă, putând să descrie esențialul în mod

realist.

 Trebuie să permită descrierea însuși a procesului de dezvoltare și a modului de conducere a dezvoltării procesului.

 Trebuie de asemenea să acopere cazurile neprevăzute și schimbările continue care intervin într-un astfel de proces.

În general, modelul trebuie să aibă capacitatea de a putea descrie o mare varietate de sisteme și de subsisteme ale acestora. Există un mare număr de modele care descriu procesul de realizare a unui sistem informatic denumite generic "modele ale ciclului de viată".

Modelul WATERFALL (în cascadă):

Este cel mai vechi și cel mai cunoscut model. A fost dezvoltat în perioada anilor

'60, caracteristica principală constând în parcurgerea unor etape numite "faze".

1. Analiza cerințelor. Definirea și analiza necesităților utilizatorului.

2. Specificația. Translația cerințelor într-o descriere generală a sistemului.

3. Proiectarea. Crearea unei abstractizări a sistemului în concordanță cu

specificațiile anterioare.

4. Implementarea. Crearea sistemului care implementează ceea ce s-a proiectat.

5. Testarea. Determină dacă implementarea satisface cerințele.

6. Mentenanța. Modificarea sistemului necesară pentru a fixa problemele apărute.

Ciclul de viață se repetă în cadrul acestei faze.

Se constată că fiecare fază constituie o trecere de la un nivel de abstractizare ridicat

(puține detalii) la un nivel mai scăzut de abstractizare (mai multe detalii). Cu toate că există o bogată experiență și tradiție în aplicarea cu succes a modelului, există unele probleme.

În primul rând modelul nu este suficient de descriptiv în ceea ce privește activitățile care interferă prin toate fazele ciclului de viață cum ar fi: conducerea proiectului, asigurarea calității, verificarea și validarea. Spre exemplu o eroare de specificare poate să nu fie descoperită decât

foarte târziu, și este extrem de greu de revenit la faza la care s-a produs eroarea.

În al doilea rând modelul a fost dezvoltat într-o perioadă când sistemele de mici

dimensiuni și cu arhitectură compactă erau dominante.

În ultimul rând modelul nu se pretează la transpunerea sa pe calculator. El a fost dezvoltat într-o perioadă când proiectarea asistată de calculator nu era deloc înțeleasă. Modelul INCREMENTAL (RAPID-PROTOTYPING):

7

Acest model (al prototipizării rapide) a fost creat pentru a acoperi deficiențele modelului WATERFALL cu care se aseamănă din mai multe puncte de vedere. Diferența principală constă în introducerea conceptului de dezvoltare incrementală.

Dezvoltarea incrementală constă în crearea unor mici salturi de la vechea variantă

de sistem la noua variantă care conține un plus de funcțiuni. Produsul final nu este văzut ca un sistem monolit livrabil integral la o singură dată, ci este realizat și livrat dintr-o serie de etape succesive corespunzătoare fiecărei iterații. Numai la sfârșit sistemul este disponibil integral, dar până atunci fiecare increment poate lucra ca un sistem de sine stătător.

Modelul incremental elimină necesitatea furnizării cerințelor, specificațiilor generale și a

celor detaliate înaintea începerii etapei de proiectare. Aceste specificații numite "builds" (baselined intermediate software products) sunt în mod formal specificate la începutul fiecărui increment. Acest lucru permite posibilitatea schimbării cerințelor prin adăugarea lor în pasul următor.

Modelul ciclului de concepție în “V”:

Dezvoltarea unui sistem urmărind abordarile anterioare poate fi descompusă într- o succesiune de faze: specificații, concepție, programare și mentenanță după unii autori sau analiză preliminară, proiectare logică, proiectare tehnică, programare, implementare, exploatare și întreținere, după altii. (variante ale modelului Waterfall).

Modelul OPERAȚIONAL:

Acest model pornește de la o altă abordare decât modelele anterioare și anume prin concentrarea efortului de definire asupra aspectului operațional. Mecanismul implementării nu este ascuns ci stă la baza specificațiilor de definire. Cu alte cuvinte, modelul operațional creează specificații executabile (numite și specificații operaționale) care sunt ulterior transformate într-o eficientă implementare. Astfel comportamentul extern al sistemului există implicit în cadrul specificațiilor în timp ce structura internă nu.

În acest tip de model proiectarea se referă direct la condițiile de mediu în timp ce celelalte modele pun accentul pe separarea cerințelor (comportamentul extern) de structura internă a sistemului.

Prin realizarea legăturii între specificațiile operaționale și structura internă a

sistemului, se constată că modelul operațional este "orientat pe problemă" spre deosebire

de celelate modele care sunt "orientate pe implementare".

Unul dintre avantajele modelului operațional este marea sa putere descriptivă orientată direct spre rezolvarea problemei. Spre deosebire de modelul incremental care pornește de la o descriere liberă a specificațiilor de definire, modelul operațional are descrieri formale, riguroase și care pot fi ușor analizate. Acest fapt îi permite să poată foarte ușor să fie transpus pe calculator.

Ca dezavantaje se constată contradicția dintre necesitatea transformării cerințelor

externe într-o structură internă înainte ca aceasta să fi fost definită. Deoarece modelul nu este prea răspândit evaluarea posibilităților sale este dificil de făcut mai ales pentru sisteme de mari dimensiuni. El este în schimb mai folosit pentru realizarea sistemelor mici.

Din parcurgerea sumară a acestor modele se observă că modelul Waterfall este un model atractiv care se bazează pe o lungă perioadă de aplicare, fapt care îi conferă avatajul numeroaselor experimentări în situații dintre cele mai diferite.

8

Modelul Incrememtal include în ciclul de viață activități de conducere și dezvoltare prin pași succesivi, realizând un feed-back rapid între proiectanți și utilizatori.

Modelul de concepție în “V” pune în evidență faptul că o fază o validează pe precedenta (similar modelului Waterfall) dar și faptul că numai fazele terminale realizează adevărata validare a etapelor de început.

Modelul Operațional realizează specificații "executabile", mărește rolul

automatizării și stabilește o strânsă legatură între specificații și implementare.

Cu toate acestea se constată că un model perfect bazat pe ciclul de viață al

sistemului informatic nu se poate realiza, mai ales datorita unor condiții subiective. Adesea un proiect trebuie început de la dorințele unui viitor utilizator care are o vagă idee despre ceea ce va trebui să se realizeze, și numai după ce sistemul s-a realizat aproape integral se hotărăște că nu este de fapt ceea ce a dorit. Practica ne-a demonstrat că folosirea unui model imperfert și incomplet este totuși mult mai utilă decât renunțarea la orice fel de model.

Dar modelul nu este totul. Avem nevoie de un set de prescripții pentru desfășurarea activităților cerute de etapele unui model bazat pe ciclul de viață, prescripții utilizate pentru proiectarea sistemului. Am definit prin aceasta metoda de proiectare. Metoda de proiectare are o dublă responsabilitate:

 de a creea produsul

 de a implementa o parte din modelul ciclului de viață.

Încercarea de a găsi cea mai bună metodă de realizare a sistemelor informatice este un

subiect de cercetare deosebit de important. Problema cu cele mai multe metode este că ele au atât reguli implicite cât și explicite. Regulile explicite sunt prezentate de obicei în documentația de realizare dar cele implicite nu sunt prezentate nicăieri.

Când se realizează un sistem informatic apar o multitudine de probleme și este aproape imposibil să se repete procesul original pentru crearea unui alt sistem. Metoda nu furnizează numai pașii care trebuie parcurși ci precizează și ce decizii trebuiesc luate în pașii respectivi. Este foarte important, în acest caz, ca la livrarea proiectului să se furnizeze și metoda după care a fost realizat.

Ultimul aspect care trebuie abordat este "automatizarea" metodei de proiectare. Acest termen este preferat termenului de "instrumente de dezvoltare" (software tools), care vizează punctual o anumită operație. Automatizare înseamnă un suport pentru o metoda și este o parte integrată în procesul de dezvoltare a sistemului informatic. Dar soluționarea cu succes a problematicii constă în integrarea coerentă a metodelor folosite într-o metodologie, și nu în automatizarea lor.

Automatizarea are o mulțime de avantaje. Cel mai important constă în reducerea muncii în aplicarea metodelor, și într-un anume fel este cea mai realistă manieră de aplicare a metodelor. Apectul birocraic al celor mai multe metode presupune păstrarea unei cantitați mari de informații care este imposibil de gestionat manual pentru sisteme de o anumită mărime.

Automatizarea implică o scădere a costurilor de dezvoltare și planificare rezultând o creștere calitativă a activității creative deoarece proiectanții și conducătorii proiectului sunt degrevați de aspectele de rutină. De cele mai multe ori automatizarea facilitează învățarea și comunicarea între membrii proiectului.

9

Capitolul 2

Proiectarea sistemelor informatice

2.1. Proiectarea tehnică a unui Sistem

Este etapa în care se definitivează mijloacele tehnice necesare (echipamente, programe, proceduri manual, etc.) prin care fluxul informațional este transformat într-un flux cu prelucrare automată a datelor. Efortul principal este de proiectare pură.

Frecvent, datele furnizate din proiectarea logică pot fi găsite incomplete, astfel că vor fi necesare iterații și corecții care pot afecta soluția propusă din puct de vedere tehnologic, economic sau operațional.

În această etapă obiectivul principal îl reprezintă elaborarea componentelor funcționale

detaliate ale sistemului și a specificațiilor de definire a programelor. Sarcina activităților din această etapă ce se desfașoară la nivelul subsistemelor sau chiar al aplicațiilor revine integral analiștilor de sistem. Activitățile desfășurate în această etapă sunt:

 proiectarea funcțională detaliată pe componente și a legăturilor dintre acestea;

 stabilirea cerințelor și a condițiilor tehnice de realizare a programelor;

 elaborarea programelor de lucru pentru etapa următoare și stabilirea resurselor necesare.

Activitățile de proiectare tehnică au ca obiectiv materializarea concepției sistemului informnatic prin proiectarea funcțională amanunțită a componentelor sistemului și a legăturilor dintre componente. Pe baza definirii complete și precise a sistemului informatic din etapele precedente, în etapa de proiectare tehnică sunt concepute specificațiile de realizare pe compnnente (subsistem, aplicație). Proiectul tehnic rezultat din desfășurarea activităților etapei, pentru o componentă, constituie baza programării și a implementării componentei respective.

Plecând de la ieșirile informaționale dorite de utilizator, sunt elaborate modelele de obținere a ieșirilor din intrările disponibile prin definirea colecțiilor de date și a procedurilor de tratare a datelor din colecții. Aceste activități urmăresc definirea detaliată a tehnologiei de prelucrare a datelor. În elaborarea tehnologiei de prelucrare a datelor, o deosebită atenție trebuie acordată proiectării fluxului tratării datelor urmărind ca, prin colecțile de date și fluxul prelucrărilor să se reflecte fidel realitatea. De asemenea, prezintă interes major verificarea funcționalității componentelor proiectate sub aspectul completitudinii și al corectitudinii operațiilor de tratare a datelor. Perfornanțele sistemului informatic sunt determinate, în mare măsură, de metodele de organizeare a datelor.

Modalitățile de constituire a colecțiilor de date sunt determinante asupra prelucrărilor, în timp ce organizarea colecțiilor de date este condiționată la rândul ei de definirea fluxului tehnologic al datelor.

În organizarea datelor sunt determinante: studiile pentru delimitarea ariei și a legăturilor

externe ale sistemului informatic, modelele de obținere a ieșirilor din intrări, volumul

datelor de prelucrat, cerințele de informare ale conducerii.

Metodelele utilizate în organizarea datelor sunt :

• metoda fișierelor independente,

• metoda bazei de date.

10

Metoda fișierelor independente constă în crearea de fișiere pe suport accesibil prelucrării automate a datelor, pentru înmagazinarea datelor prelucrate în cadrul fiecărei componente a sistemului informatic. Un fișier este constituit dintr-o submulțime de date omogene relative la o clasă de elemente a sistemului informațional. (ex. fișierul de stocuri din aplicația de gestiunea materialelor).

În general pentru fiecare entitate distinctă a sistemului informațional (materiale, produse,

personal, etc.) se constiuie fișiere cu caracter permanent care reflectă starea elementelor la un moment dat. Operațiile curente din sistemul economic constituie tranzacții și sunt reflectate în fișiere temporare. (ex:intrări și ieșiri de materiale). Prin aplicarea datelor operaționale conținute în fișierele temporare asupra datelor de structură din fișierele permanente rezultă ieșirile informaționale scontate și se asigură actualizarea fișierelor permanente. În urma actualizărilor fișierele permanente vor cuprinde starea entităților "la zi".

Fișiere permanente (cartoteci, registre, cataloage etc.) și fișiere temporare

(centralizatoare, jurnale …) sunt utilizate și în condițiile prelucrării manuale a datelor.

Metoda fișierelor independente asigură rapiditate în organizarea datelor și a prelucrărilor. În același timp efortul de definire completă și corectă a sistemului informatic este mai redus prin proiectarea tehnică detaliată a fiecărei componente și integrarea ulterioară a componentelor proiectate în sistemul informatic. Această metodă este frecvent utilizată în practică pentru probleme de mici dimensiuni.

Creșterea complexității sistemului duce la creșterea numărului de fișiere necesare ceea ce generează dificultăți sporite de întreținere. Utilizarea de fișiere independente conduce la o flexibilitate redusă a sistemului informatic, modificarea structurii fișierelor implicând refacerea programelor care le utilizează. Prin duplicarea datelor în mai multe fișiere se generează redundanțe informaționale, utilizarea nerațională a suporților de informație și dificultăți în actualizarea și controlul datelor.

Pornind de la aceste neajunsuri constatate la organizarea datelor în fișierelor independente se poate folosi ca alternativa metoda bazelor de date. Datele din sistemul informatic sunt organizate în colecții care se numesc baze de date și care au o serie de proprietăți și caracteristici ce vor fi arătate ulterior. Trecerea de la fișierele independente către bazele de date s-a făcut în timp prin mai multe etape:

• fiecare program de calcul utiliza date și fișiere specifice, proprii pentru obținerea

rezultatelor dorite. (metoda fișierelor independente).

• mai multe programe folosite în rezolvarea unor probleme similare, utilizau date și

fișiere comune, grupate în colecții mai mari specifice domeniului respectiv.

• toate programele utilizate folosesc o colecție unică de date, o așa zisă "bază de date"

în care sunt incluse toate datele necesare .

Necesitatea unor mari baze de date comune a fost simțită nu numai de fabricanții de

calculatoare și de proiectanții de sisteme informatice, ci și de utilizatorii sistemelor elaborate. Toți au constatat că în sistemele de o anumită mărime, în care se lucrează cu volume mari de date, este nevoie să se găsească o serie de modalități, tehnici și metode eficiente pentru definirea organizarea, memorarea și actualizarea datelor în forme din ce în ce mai performante. Sistemele informatice în care se utilizeaza conceptul de bază de date prezintă unele avantaje:

11

• Reducerea considerabilă a nivelului de redundanță al datelor memorate. Folosind bazele de date comune se pot obține informații uniforme, atât temporal cât și fizic. Se evită actualizarile parțiale a acelorași date în fișiere diferite.

• Utilizarea acelorași date în mai multe activități. Având un sistem unitar pentru

definirea și regăsirea datelor, implementarea unor noi programe se face relativ ușor. Procedurile folosite pe măsura construirii și dezvoltării sistemului fiind cât mai uniforme, exploatarea se face mult mai sigur și eficient.

• Controlul centralizat, integritatea și securitatea datelor sunt posibile în astfel de

sisteme deoarece definirea structurilor de date, modul lor de gestionare și accesul la acestea sunt în mâna unui singur grup coordonator (denumit în general administrator al bazei de date).

• Independența datelor fața de programe și suporții fizici de memorare generează

creșterea calității și fiabilității sistemului informatic.

Deoarece nu există o definiție general acceptată, vom denumi o bază de date "un absamblu unitar organizat și structurat de date a cărui gestionare se face printr-un sistem specializat denumit sistem pentru gestionarea bazelor de date (SGBD)". Prin gestionarea bazelor de date se întelege îndeplinirea unor funcții specifice de operare asupra lor: creare/generare, actualizare/ținere la zi, interogare și reorganizare.

Ansamblul format din:

•baza de date,

•sistemul care o gestionează (SGBD),

•echipamentele de calcul utilizate pentru înregistrarea, memorarea și pentru prelucrările efectuate asupra datelor din baza de date,

• procedurile automate și neautomate suplimentare necesare pentru gestionarea

datelor, în afara celor din SGBD, reprezintă BANCA DE DATE.

În concepția modernă de realizare a sistemelor informatice "banca de date" devine subsitemul central, prin el realizându-se principalele legături dintre majoritatea celorlalte subsisteme și aplicații în primul rând a celor care lucreazâ cu datele din baza de date.

Un SGBD are trei componente principale:

• utilizatorul sistemului;

• administratorul bazei de date;

• gestionarul bazei de date.

Utilizatorul primește răspuns la cererile de informații pe care le face direct pentru el

sau pentru alte persoane. Sunt mai multe categorii de utilizatori:

• utilizatorul profesionist care pentru a primi răspunsurile solicitate scrie programe, deci are cunoștințe de programare;

• utilizatorul nespecialist, care pentru formularea unor întrebări, scrie o serie de comenzi sau instrucțiuni relativ simple, dar pentru a căror utilizare are nevoie de un anumit instructaj (câteva zile);

• utilizatorul nespecialist, de cele mai multe ori un conducător, care nu trebuie să facă

decât niște operații elementare pentru a obține informațiile dorite (utilizatori "press- button").

Administratorul bazei de date este o funcție absolut necesară pentru buna funcționare a SGBD-ului. Se constată că administratorul bazei de date este necesar totdeauna în cadrul sistemelor informatice chiar când nu folosim conceptul de bază de date. El este

12

reprezentat de o persoană sau un grup de persoane care controlează și coordonează modul de introducere a datelor, modificările ce li se aduc și accesul la ele.

Administratorul trebuie să acorde o deosebită atenție factorilor care afectează memorarea și regăsirea datelor și de aceea are nevoie de cunoștințe aprofundate privind datele necesare în cadrul organizației și modul cum acestea sunt folosite.

Gestionarul nu mai este o persoană sau un grup de persoane ca în cazul primelor două

componente, ci o combinație de echipamente de calcul și de programe care asigură accesul la date conform instrucțiunilor primite de la utilizatori și de la administrator. În acest scop gestionarul trebuie să aibă o interfață cu toate limbajele de programare convenționale admise de SGBD-ul respectiv. Gestionarul îndeplinește unele funcții care în sistemele anterioare erau îndeplinite de compilatoare, asambloare, editoare de legături, programe utilitare, etc.. Gestionarul formează un fel de graniță între programele de aplicație și mecanismele de acces la date. Gestionarul interpretează cererile de date "logice" ale diverșilor utilizatori și cu ajutorul mecanismelor sale de acces extrage și transferă datele solicitate de aceștia. Utilizatorul nu știe cum și unde sunt memorate datele. Se spune că tot acest proces este "transparent" utilizatorului, în sensul că este parcurs fără a fi cunoscut de el în mod intim, ci numai în principiu.

Prin metoda bazei de date se urmărește organizarea datelor din sistem astfel încât datele memorate să răspundă necesităților de prelucrare și utilizare ale tuturor componentelor sistemului informatic și ale tuturor utilizatorilor. Respectarea principiilor privind unicitatea datelor, independența datelor, consultarea concurentă a datelor necesită efectuarea analizei și proiectării sistemului informațional prin abordare globală și structurarea lui detaliată.

Activitățile ce ar trebui realizate pentru determinarea specificației logice de

definire a bazei de date sunt:

1. Trecerea în revistă a tuturor cerințelor de informare necesare pentru rezolvarea diverselor probleme. Cu acest prilej se va stabili o ordine de prioritate în înlocuirea subsistemelor și lucrărilor manuale cu cele în care gestiunea datelor și furnizarea rezultatelor se face prin intermediul tehnicii de calcul.

2. Se examinează toate datele necesare pentru satisfacerea cerințelor de informare cu

stabilirea legăturilor informaționale care trebuie să existe între acestea.

3. Se realizează o serie de analize și studii detaliate privind datele care se vor utiliza

în sistem. Abia acum se poate vedea dacă avem nevoie de un SGBD.

4. Se întocmește pe baza rezultatelor obținute în activitățile anterioare, specificația

pentru baza de date, care este o documentație ce cuprinde:

• datele și structurile de date propuse a fi incluse în baza de date;

• o schemă care să reprezinte legăturile informaționale dintre subsisteme și aplicații;

• schema cu structurile logice de date și legăturile dintre ele;

• restricțiile hardware și software avute în vedere;

• cerințele suplimentare pentru SGBD-ul care urmează să fie utilizat cum ar fi: volumul intrărilor, al ieșirilor, timpii de răspuns solicitați, principalele prelucrări, etc.

În funcție de datele de memorat și de relațiile dintre ele într-o bază de date pot să apară următoarele tipuri de structuri:

• structura punctuală pentru entități independente;

13

• structura ierarhică liniară pentru entități cu relații liniare între ele;

• structura ierarhică arborescentă pentru descrierea relațiilor dintre entități de tipul

“un tată are mai mulți fii”;

• structura de tip rețea pentru entități cu relații complexe între ele, rezultată prin

generalizarea structurilor ierarhice liniare și arborescente;

• structura relațională când datele nu mai sunt privite ca înregistrări ci ca relații.

Buna funcționare a unui sistem informatic lucrând cu conceptul de baza de date depinde în mare măsură de modul cum se proiectează această bază de date.

Alegerea variantei de proiectare a circuitului informațional este condiționată de modul în care aceasta asigură funcționalitatea componentei respective. Verificarea funcționalității necesită stabilirea posibilităților de obținere a datelor de ieșire din datele de intrare ale componentei proiectate.

2.2. Elaborarea programelor

După ce specificațiile de realizare au fost întocmite și aprobate, ele vor fi repartizate diverselor grupe de specialiști care au responsabilitatea să le execute și ulterior să le asambleze. Etapa este consacrată elaborării programelor și procedurilor manuale, aferente componentelor sistemului informatic, precum și testării componentelor. În funcție de necesitățile problemei dar și de cunoștințele proiectanților, în această etapă se pot folosi tehnici de programare ca:

• programarea modulară;

• programarea structurată;

• programarea orientată pe obiecte;

sau , eventual soluții hibride conform nivelului de stăpânire a tehnicilor respective. Programarea modulara: Operația de împărțire a unei probleme complexe, concepută din punct de vedere logic ca un tot unitar, nu este ușoară pentru că întotdeauna trebuie avut în vedere ca părțile în care a fost descompus întregul să nu-i schimbe scopul inițial și totodată să permită, relativ usor, reconstituirea întregului atunci când este necesar. În acest sens trebuie respectate două reguli:

• fiecare componentă trebuie să îndeplinească o anumită funcție bine precizată în

cadrul întregului;

• între componente este necesar să se stabilească foarte exact legăturile, astfel ca fiecare parte să-și poată realiza relativ independent funcția specificată și în același timp să poată contribui la funcțiile generale ale întregului.

Prin modularitate înțelegem proprietatea sau posibilitatea ca un proces să poată fi descompus în parți componente, cu legături bine stabilite între ele, astfel ca obiectivul general al procesului să poată fi cât mai eficient realizat. Una din definițiile date noțiunii generale de modularitate considera că un sistem este modular atunci când este realizat dintr-o mulțime de elemente căreia îi este asociată o lege de structură. A găsi legea de structură înseamnă a prospecta interfața dintre module. După același autor, proiectarea interfeței dintre module este simplificată dacă modulele au fost concepute astfel încât să aibă o funcționalitate bine definită.

Modularizarea sistemelor informatice ține seamă de unele caracteristici ale acestora:

• sunt realizate și implementate într-un timp îndelungat (de ordinul anilor);

• introducerea sistemelor informatice conduce la cheltuieli importante;

14

• sistemele informatice sunt folosite de un număr mare de utilizatori, răspândiți uneori

pe zone întinse;

• cerințele utilizatorilor sunt mereu schimbate și completate.

Ținând seama de cele de mai sus se poate face o modularizare pe trei nivele a sistemelor

informatice:

a) nivelul 1 – sistem;

b) nivelul 2 – subsistem;

c) nivelul 3 – aplicație.

a) Sistemul informatic trebuie să urmărească și să contribuie la realizarea obiectivelor generale ale întreprinderii, fixate pe o perioadă lungă de timp. Deoarece obiectivele și restricțiile generale se pot schimba în timpul realizării sistemului informatic este necesară o revedere și o redefinire periodică a acestora. Acolo unde planurile de perspectivă ale întreprinderii, sunt cunoscute pentru o perioadă mai scurtă decât cea prevazută pentru realizarea și implementarea sistemului informatic, pot aparea neconcordanțe imprevizibile, care pot conduce la efecte negative.

b) Subsistemul corespunde, de regulă, unor obiective derivate din cele generale, rezultate prin detalierea acestora. Există unele tendințe de împărțire a sistemelor informatice în subsisteme după structura ierarhică și organizatorică astfel:

• strategic

• tactic

• operativ,

sau după precizarea funcțiilor sale:

• producție

• comercial

• financiar-contabil

• personal

• cercetare- dezvoltare.

Între aceste componente (subsisteme) trebuie să existe legături (interfețe) clare,

cât mai puține și cât mai rigide, în sensul că odată stabilite să nu mai fie practic

modificate.

c) Aplicația, ca unitate componentă a subsistemului, contribuie în general la satisfacerea unor obiective specifice și se dezvoltă de obicei la nivelul unor compartimente sau activități din cadrul întreprinderii. În structura sistemului pe trei nivele aplicația se găsește pe ultimul nivel, și construirea sistemului informatic se face treptat prin realizarea de aplicații asamblate în cadrul nivelurilor superioare.

Adâncind nivelul de detaliere al sistemului informatic putem adăuga încă două nivele:

d) program;

e) modul de program.

d) Aplicația la rândul ei este constituită dintr-o serie de programe și proceduri manuale legate între ele și care îndeplinesc funcțiile cerute.

e) La rândul lor programele sunt de cele mai multe ori divizate în mai multe părți, numite "module program" independente din punct de vedere logic. Modulele sunt compuse din instrucțiuni scrise într-un limbaj de programare.

La nivelul programelor modularitatea se mai numește și micro modularitate. Corelarea modulelor sau cuplarea modulelor este o măsura a independenței modulelor, și poate avea mai multe forme:

15

• corelarea externă, când modulele utilizează aceleași date globale ale sistemului;

• corelarea prin control, când unul din module controlează execuția celorlalte în mod

explicit, prin chei de control sau variabile de control a căror valoare indică modul de continuare a execuției;

• corelarea internă sau prin conținut, când un modul referă direct alt modul;

• corelarea prin date, când la apelarea unui modul de către altul toate datele de intrare

sau de ieșire ale modulului apelat sunt comunicate sub formă de parametrii.

Un alt element caracteristic este ponderea sau tăria modulelor care reflectă modul de

formare și conținutul modulului. Există mai multe posibilități de divizare a programelor în module și anume:

•divizarea întâmplătoare, care dă tăria cea mai slabă modulelor căci programul este împărțit arbitrar în module;

• divizarea logică, are ca rezultat module ce efectuează o funcție la fiecare apelare;

• divizarea clasică, prin care modulul efectuează mai multe funcții necorelate între ele

prin date;

• divizarea prin comunicare, când modulele efectuează mai multe funcții corelate prin

date;

• divizarea funcțională, când modulele efectuează o singură funcție care le este specifică.

Modularizarea este una din sarcinile principale ale proiectanților de sisteme informatice și este în cele mai multe cazuri, o operație complicată de care depinde în mare măsură modul cum va funcționa în final sistemul. În acest scop, în cadrul proiectelor mari, pe baza unor experiențe anterioare, adaptate la specificul respectiv, se elaborează reguli și chiar norme care trebuie avute în vedere la împărțirea în componente la toate nivelurile. În fond, aceste reguli decurg din conceptul general de modularitate, stabilind în principal că un modul trebuie:

• să îndeplinească o funcție unică, lucru extrem de avantajos atunci când se fac modificări;

• să fie complet;

• să aibă cât mai puține interfețe cu ale module;

• să permită o înțelegere ușoară a problemelor pe care le rezolvă;

• să se poată încadra în diversele tipuri de modularitate ale sistemului.

Avantaje ale modularizării:

1) Posibilitatea divizării întregului în părți mai simple și mai ușor de realizat.

2) Independența modulelor permite elaborarea și testarea separată a acestora.

3) Fiecare modul poate fi realizat prin tehnicile (limbajele) cele mai adecvate funcției

pe care o îndeplinește.

4) Posibilitatea construiri a unei biblioteci de module testate (module standard)

disponibile tuturor proiectanților.

5) Simplificarea întreținerii sistemului (programului).

6) Permite abordarea de la simplu la complex și permite o încărcare echilibrată a

fiecarui membru din echipa de proiectare.

Dezavantajele modularizarii:

1) Mulți proiectanți nu înțeleg modularizarea sau nu se pot acomoda cu ea.

2) Modularitatea cere eforturi suplimentare în faza de proiectare.

3) Proiectanții nu cunosc problema în ansamblu ci numai parți ale ei.

16

4) Concepția modulară duce la realizarea de programe care încarcă suplimentar unitatea centrală a calculatorului cu funcțiile de dispecerizare și comunicare între module.

Noțiunea de modularitate este însoțită aproape întotdeauna de un alt concept, cel de "top-

down". "Top-down" înseamnă "de sus în jos" sau "descendent". În linii mari el ar putea fi explicat astfel: în procesul general de cunoaștere se începe cu aspectul general, "în mare" al fenomenului, după care, treptat, acesta se detaliază, se cunoaște în profunzime, până la un anumit nivel, considerat suficient pentru scopul urmărit. Dacă modularizarea înseamnă procesul de descompunere a unui întreg în părți componente, metoda cea mai obișnuită, pentru ca împărțirea să fie corect făcută, este tocmai cea "top-dovn".

Trăgând o concluzie mai generală, se poate spune că în orice fel de proces de cunoaștere din lumea reală, metoda universal valabilă este cea a analizei descendente, "top-down". Programarea structurată: Pentru abordarea unei probleme complexe în realizarea a unui sistem informatic se impun preocupări pentru scăderea raportului cost/ performanță, prin aplicarea unor principii de structurare atât în fazele de proiectatre cât și în cele de realizare a sistemelor informatice. Principiile generale privind realizarea acestor produse informatice trebuie aplicate în mod consecvent în toate fazele de realizare. Aceste principii se referă în primul rând la:

• Identificarea funcțiilor necesare pentru realizarea produsului, analog cu

determinarea părților componente ale unui produs industrial.

• Descompunerea consecvent descendentă (top-down) în procesul de identificare a funcțiilor componente ale proiectului. Introducând noțiunea de "nivel al functiilor" (Nf) și punând convențional nivelul rădăcinii structurii Nf=0, putem defini nivelul unei funcții oarecare ca fiind egal cu nivelul funcției din care descinde plus unu. Funcțiile cu nivelul cel mai ridicat se mai numesc și "primitive" ale structurii iar cea cu nivelul zero se numește rădăcina structurii.

• Realizarea modulară a produsului, presupune izolarea funcțiilor găsite în faza de identificare, apoi determinarea interfețelor dintre module.

• Normalizarea primitivelor structurilor funcționale (primitivele structurii).

La un anumit nivel de descompunere în ierarhia funcțiilor unei structuri se găsesc

algoritmii de rezolvare ai subproblemelor. Pentru realizarea oricărui algoritm este suficientă utilizarea unui set restrâns de structuri funcționale primitive. Aceste structuri vor fi considerate structuri elementare.

Tehnica de programare care își propune să respecte aceste principii și care va fi tratată în

continuare este numită programarea structurată.

Pentru a crea o imagine generală a efortului de definire a programării structurate

prezint o serie de definiții posibile apărute pe o perioadă mai lungă de timp, cu mențiunea că cele din anii de început ai conceptului prezintă mai mult constatări de circumstanță și au o notă ușor ironică:

1. Este o întoarcere la bun-simt.

2. Este metodă generală după care programează cei mai buni programatori.

3. Este programarea fără GO TO.

4. Este procesul prin care se controlează numărul de interacțiuni dintre un proces și contextul său, astfel încât numărul de interacțiuni să fie o funcție liniară depinzând de câțiva parametrii ai procesului.

5. Este programarea TOP-DOWN.

17

6. Programarea structurată se ocupă de convertirea unor scheme logice arbitrar de mari și complexe în forme standard, astfel încât să poată fi reprezentate prin iterarea și compunerea unui număr mic de structuri logice de control standard.

7. Este o manieră de a organiza și codifica programe astfel încât să fie cât mai ușor de

înțeles și de modificat.

8. Scopul programării structurate este de a controla complexitatea prin teorie și

disciplină.

9. Programarea structurată poate fi caracterizată nu prin absența instrucțiunii GO TO

ci prin prezența structurii.

10. O funcție majoră a structurii programelor este de a face posibilă demonstrarea

corectitudinii lor.

11. Programarea structurată nu este o soluție totală, ea constă, de fapt, în folosirea

unor notații formale pentru a gândi ordonat.

12. Procesul de organizare a gândirii care duce la o expresie inteligibilă a procesului

de calcul într-un timp rezonabil.

13. Arta simplității.

Sintetizând se poate ajunge la următoarea definiție:

"Programarea structurată constă dintr-o mulțime de restricții și reguli de programare care forțează programul să urmeze o formă strânsă, în acest fel eliminându-se mulți din factorii care conduc la erori și care complică activitatea de testare și întreținere." Examinarea structurii interne a unui program, evidențiază existenta unei structuri ierarhice între componentele unui program, fiecare componentă fiind coordonată de componenta de nivel superior și coordonând componenta de nivel inferior. Ideea structurilor încuibate (nested-logic) conduce la o dispunere a elementelor componente într-o formă în care să se poată distinge nivelele ierarhice, astfel încât fiecare nivel de prelucrare să reprezinte o detaliere a nivelelor precedente. Pentru definirea structurii “nested-logic” a unui program se utilizează ca instrument de lucru diagrama de structură. Blocurile “nested-logic” folosite în diagrama de structură sunt:

• SECVENȚA care marchează grupul de enunțuri care se execută în ordinea în

care au fost scrise.

• SELECȚIA care marchează separarea enunțurilor în două grupe și executarea unei sau alteia din aceste grupe în funcție de o anumită condiție.

• ITERAȚIA care marchează un grup de enunțuri cu execuție repetată de un număr de ori (inclusiv repetarea de zero ori ceea ce echivalează cu eliminarea grupului de enunțuri).

Regulile de structurare ale blocurilor sunt:

• punctul de intrare într-un bloc este unic;

• punctul de ieșire dintr-un bloc este unic;

• blocul iterativ începe prelucrarea prin testarea condiției de ieșire din ciclu;

• un bloc poate conține orice combinație de blocuri care satisfac condițiile de mai sus.

Blocurile diagramei de structură sunt reprezentate prin dreptunghiuri identificate printr- un nume înscris în interior.

Diagrama de structură este reprezentarea grafică a unei structuri de prelucrare pe nivele de detaliere conform următoarelor reguli:

• nivelele de detaliere se parcurg de sus în jos;

• fiecare nivel reprezintă o detaliere a nivelului precedent;

18

• blocurile situate pe un același nivel ierarhic se parcurg de la stânga la dreapta;

• terminarea parcurgerii unui nivel presupune parcurgerea următorului bloc din

nivelul anterior.

Programarea orientata pe obiecte: Pentru problemele de natură economică, în limbajele

de programare clasice, cea mai mare parte a atenției era acordată descrieirii structurilor de date deoarece, practic, prelucrările efectuate asupra lor sunt destul de simple și nu necesită un efort de programare deosebit. În timp, odată cu creșterea complexității programelor, a apărut necesitatea unei organizări riguroase a muncii. Ca o etapă superioară capabilă să rezolve în bună măsură problemele ivite, s-a impus programarea structurată. De-a lungul anilor, în special datorită creșterii dimensiunii produselor software, și acest instrument a devenit la rându-i depășit. Sporirea complexității programelor aducea după sine dificultăți reale legate de întreținerea unor programe mamut. Cu alte cuvinte, deși prețul produselor era în creștere, calitatea lor tindea să scadă.

Deși teoria programării orientate pe obiecte era bine fundamentată de peste 20 de ani, ideea nu a prins cu adevărat decât în ultimii ani. Programarea pe obiecte în loc să separe iremediabil datele de cod nu face altceva decât să contopească cele două elemente.

Primele limbaje cu adevărat demne de acest nume au fost SIMULA (1965) și

SIMULA-2 (1967), iar prin anii '70 SMALLTALK.

Cel mai mare dezavantaj al lor, din punct de vedre al penetrării pe piață, a fost însuși faptul că au apărut ca limbaje de sine stătătoare, având o răspândire relativ redusă. Din acest motiv puțini programatori erau dispuși să abandoneze limbajele consacrate în acele momente, doar de dragul de a lucra obiectual. O bună perioadă de timp metoda programării obiectuale a fost uitată.

În anii '80 în urma acceptării definitive a limbajului C, un colectiv condus de Bjarne Stroustrup încearcă introducerea conceptului de "clasă" într-un dialect numit "C with classes". Ideea prinde contur și în 1983 ia naștere prima versiune a noului limbaj C++. Aproape imediat apar și partizanii fanatici ai OOP-ului aflat acum la a doua tinerețe. Termenul de OOP provine din "Object Oriented Programming" care desemnează disciplina programării obiectuale sau orientată-obiect.

Profitând deci de marea popularitate în rândul soft-iștilor și de multitudinea domeniilor de aplicație (de la grafica interactivă la exploatarea rețelelor de calculatoare și chiar până la proiectarea compilatoarelor) moftul devine modă și moda certitudine. Acest succes extraordinar s-a datorat faptului că limbajul C++ nu face nimic altceva decât să-i dea un nou avânt unuia dintre cele mai la moda limbaje ale momentului "C".

OOP introduce conceptul de INCAPSULARE prin care se ating următoarele

obiective:

• facilitatea deosebită de localizare a erorilor

• modularizarea problemei de rezolvat.

Notiunea de “clasă” conține declarații de variabile și declarații de funcții care operează

asupra variabilelor. Funcțiile se numesc funcții membru sau metode iar variabilele variabile membru. Cu ajutorul claselor, un programator îsi poate defini orice tip de dată dorit, împreună cu setul de operații. Toate aceste informatii sunt încapsulate într-o “clasă”. Astfel prin “clasă” vom înțelege un tip abstract de dată, definit de utilizator.

Un “obiect” este o variabilă declarată ca fiind de tipul “clasă”. Altfel spus un

“obiect” este o instanțiere (o realizare) a unei clase. Prin intermediul claselor se pot

19

separa informațiile de implementare (mecanism intern) de cele de utilizare (mecanism extern).

Un alt termen introdus de OOP, este “moștenirea”. În urma definirii unei clase, cu un minim de efort și timp se pot preciza seturi de clase asemănatoare, având totuși o trăsătură distinctivă. Având o clasă B putem defini o altă clasă D care să moștenească sau să preia toate caracteristicile clasei B la care să se poată adăuga altele noi, proprii doar acesteia din urmă. Prima clasă se va numi "clasă de bază" iar cea de-a doua "clasă derivată". Moșetenirea stă la baza altor concepte novatoare cum ar fi “polimorfismul” dar elementul esențial al programarii obiectuale rămâne "încapsularea".

“Polimorfismul” constă în faptul că într-o ierarhie de clase obținute prin

moștenire, o metodă poate avea forme diferite de la un nivel la altul, specifice respectivului nivel din ierarhie. Așa cum în lumea vie hrănirea este universal valabilă ea deosebindu-se de la o clasă la alta de vietăți, tot așa și în cazul OOP metoda poate avea forme diferite de la o clasă la alta.

În momentul de față piața informatică este invadată de biblioteci și colecții de clase. Menirea lor este de a permite un coeficient cât mai ridicat de reutilizare a codului scris. Pe de altă parte, pornind de la aceste clase, utilizatorul poate crea prin moștenire alte clase, care să-l ajute să-și rezolve problema în mod optim. În plus, programatorul are garanția folosirii unor proceduri scurte, inteligibile și nu în ultimul rând corecte.

Un alt domeniu de utilizare a bibliotecilor de clase este cel al realizării prototipurilor unor produse software. Prin prototip se înțelege un program funcțional, simplificat și care să dea o imagine clară a produsului final. Utilitatea lor constă în faptul că, într-un timp foarte scurt și cu un efort minim din partea producătorului, clientul poate avea o imagine destul de clară asupra produsului final. Pentru o aplicație oarecare prototipul nu trebuie să conțină algoritmul optim, clientul urmând să poată înlocui doar acele module care sunt deficitare din anumite puncte de vedere.

2.3. Implementarea, exploatarea și întreținerea

Implementarea este etapa în care sistemul se testează în condiții reale. Etapa începe când componentele individuale, care au fost testate și acceptate, pot fi asamblate pentru testarea și includerea în sistem pe baza specificațiilor și manualelor elaborate în etapa anterioară.

Circuitul informațional existent este înlocuit cu noul circuit prin lansarea în execuție a programelor și verificarea practică a modului de obținere a rezultatelor, acestea constituind activitățile de implementare a sistemului informatic.

Etapa se consideră terminată când sistemul este acceptat de beneficiar. Unele

activități pregătitoare ale implementării pot începe încă din etapa precedentă. Activitățile

aferente implementării sunt următoarele:

• pregătirea implementării;

• executarea procedurilor de conversie;

• testarea în condiții reale;

• evaluarea rezultatelor obținute și verificarea performanțelor sistemului;

• definitivarea documentației.

Etapa de exploatare începe când informațiile din sistem sunt furnizate în mod curent

beneficiarului. În paralel cu exploatarea sistemului se desfășoară întreținerea sistemului.

20

Exploatarea este legată de problemele curente zilnice ale menținerii sistemului în stare de funcționare, în timp ce întreținerea constă în activități de evaluare periodică legate de modificările ce trebuiesc făcute pentru a menține sistemul viabil.

21

Capitolul 3

C++

3.1. Definire

C++ a aparut în vara anului 1983 (C cu clase). Incercari au fost facute înca din

1980. C++ înseamna C incrementat. C++ are ca scop principal scrierea de programe bune mai usor și mai placut pentru programatorul individual. O sursa de inspirație a fost Simula 67; conceptul de clasa a fost împrumutat de aici. C si ANSI C sunt foarte apropiate pentru a fi un subset a lui C++. C++ a fost dezvoltat din C și cu foarte mici exceptii C rãmîne un subset a lui C++.

Un limbaj de programare serveste la doua scopuri înrudite, furnizeaza un mijloc pentru programator de a specifica acțiuni de executat și un set de concepte pentru programator care sa fie utilizate cînd se gîndește în legaturã cu ceea ce poate fi fãcut.

Primul aspect în mod ideal cere un limbaj ce este "strîns legat de mașinã" asa încît toate aspectele unei mașini sã fie manevrate simplu și eficient într-un mod care sã fie rezonabil de clar pentru programator. Limbajul C initial a fost proiectat avînd acest lucru în minte.

Cel de al doilea aspect în mod ideal cere un limbaj care este "strîns legat de problema de rezolvat", asa cã, conceptele unei solutii sã poata fi exprimate direct și concis. Facilitațile adaugate la C pentru a crea C++ initial au fost proiectate avînd acest lucru în minte.

Legãtura dintre limbajul în care noi gîndim programul și dintre cel în care ne imaginãm problemele și soluiile este foarte strînsã. Din acest motiv, restrîngerea caracteristicilor cu scopul de a elimina erorile programatorului este cel mai periculos. Tot asa cu limbajele naturale, exista un beneficiu mare din faptul ca sînt cel putin bilingve. Limbajul furnizeaza programatorului un set de instrumente conceptuale: dacã acestea sînt inadecvate pentru un task, ele pur și simplu vor fi ignorate. De exemplu, restrîngînd serios conceptul de pointer, pur și simplu se forteazã programatorul ca sã utilizeze un vector plus aritmetica întreaga pentru a implementa structuri, pointeri, etc.

Un proiect bun și absenta erorilor nu poate fi garantatã numai prin caracteristicile limbajului.

Sistemul tipurilor ar trebui sã fie în special util pentru task-uri netriviale.

Ideal sarcina de concepere a unui program este împartita în 3 stadii: primul constã în

întelegerea clarã a problemei, apoi identificare conceptelor cheie implicate într-o soluție și în final exprimarea soluției printr-un program. Totuși, detaliile problemei și conceptele unei soluții adesea devin clar întelese numai prin efortul de a le exprima într-un program; acesta este motivul alegerii limbajului de programare. In cele mai multe aplicații exista concepte care nu sînt reprezentate usor într-un program nici printr-un tip fundamental și nici printr-o functie fara date statice asociate. Dindu-se un astfel de concept, se declara o clasa pentru a-l reprezenta în program. O clasã este un tip; adicã, ea specificã cum obiectele din clasã se dezvoltã: cum se creazã, cum pot fi manipulate, cum se anihileazã. O clasã de asemenea specificã cum se reprezintã obiectele, dar la un stadiu mai inițial al proiectãrii programului aceasta nu trebuie sã fie o concepție majorã. Cheia scrierii unui program bun este de a proiecta clasele în asa fel încît fiecare, în mod clar, sã reprezinte un singur concept. Conceptele cu care este mai usor sa ne ocupam sînt cele care au un

22

formalism matematic traditional: numere de toate felurile, mulțimi, forme geometrice, etc.. Se cuvine sã fie biblioteci standard de clase care sã reprezinte astfel de concepte. Unul dintre cele mai puternice instrumente intelectuale pentru tratarea complexitãților este ordonarea ierarhica; adicã organizarea conceptelor înrudite într-o structurã de arbore cu cel mai general concept în rãdãcinã. In C++ clasele derivate reprezintã o astfel de structurã. Un program poate fi adesea organizat ca o mulțime de arbori.

C++ este un limbaj de programare cu scop universal.El conține facilitãți flexibile și eficiente pentru a definii tipuri noi. Programatorul poate partiționa o aplicație în bucati manevrabile prin definiri de tipuri noi, care corespund mai bine la conceptele aplicației. Aceastã tehnicã de construire a programului se numește adesea abstractizare de date. Obiectele unui anumit tip definit de utilizator conțin informație de tip. Astfel de obiecte pot fi folosite convenabil în contextul în care tipul lor poate fi determinat în momentul compilarii. Programele utilizînd obiecte de astfel de tipuri se numesc adesea bazate pe obiecte. Cind se utilizeaza bine, aceste tehnici conduc la programe mai scurte, mai usor de înteles.

Conceptul cheie din C++ este clasa. O clasa este un tip utilizator. Clasele furnizeazã

ascunderea datelor, garantarea inițializarii datelor, conversii de tip implicite pentru tipuri de date utilizator, tipuri dinamice, gestionarea memoriei controlate de utilizator și mecanismul de supraîncarcare a operatorilor. C++ furnizeaza facilitați mai bune pentru verificarea tipului și pentru exprimarea modularitații, decit o face limbajul C.

De asemenea contine îmbunãtãțiri care sînt direct înrudite cu clasele, incluzînd constantele simbolice, substitutia în linie a functiilor, argumente implicite ale functiilor care se supraîncarca, operatori de gestionare a memoriei libere si un tip referinta.

C++ nu are tipuri de date de nivel înalt si nici operatii primitive de nivel înalt. De exemplu, nu exista tipul matrice cu un operator de inversare sau tipul sir cu operatorul de concatenare. Daca un utilizator doreste un astfel de tip, el poate fi definit. Defapt, definirea unui tip nou cu scopuri generale sau specific aplicative este scopul cel mai important al limbajului C++. Un tip definit de utilizator difera de unul predefinit numai în modul de definire și nu și în modul în care este utilizat.

3.2 Tipuri și Declarații

Fiecare nume și fiecare expresie are un tip care determina operațiile care pot fi facute asupra lor. O declaratie este o instrucțiune care introduce un nume într-un program. O declarație specificã un tip pentru acel nume. Un tip definește utilizarea numelui sau a unei expresii. Operațiile de forma +, -, * și / se definesc pentru întregi..

Tipul unui obiect determina nu numai care operații pot fi aplicate asupra lui, ci de asemenea întelesul acelor operații. De exemplu, instructiunea:

cout << inch << "in=" << inch*2.54 << "cm\n"; trateazã corect cele 4 valori de ieșire care sînt diferite. a) Tipuri fundamentale

C++ are un set de tipuri fundamentale ce corespund la cele mai comune unitãți de

memorie ale calculatoarelor și la cele mai fundamentale moduri de utilizare ale lor.

23

Aceste tipuri sunt : – char, short int ,int, long int (pentru a reprezenta întregi de diferite dimensiuni), float, double (pentru a reprezenta numere în flotantã), unsigned char, unsigned short int, unsigned int, unsigned long int (pentru a reprezenta întregi fãrã semn, valori logice, vectori de biti, etc..)

Intregul de tip caracter este cel mai potrivit pentru a menține și manipula caractere pe un calculator dat; acest tip este de obicei pe 8 biti. Depinzînd de hardware, un char este un întreg cu sau fara semn. Tipul caracter fãrã semn este sigur totdeauna fãrã semn (unsigned char) și utilizîndu-l produce programe mai portabile, dar poate sa fie mai puțin eficient decît dacã este folosit ca tip char obișnuit. Motivul pentru a funiza mai multe tipuri de întregi, mai multe tipuri de întregi fãrã semn și mai multe tipuri de flotante este pentru a permite programatorului sã utilizeze avantajos caracteristicile hardware. Pe multe masini exista diferente semnificative în cerințele de memorie, timpul de acces la memorie și viteza de calcul dintre diferite varietãți tipurilor fundamentale. Ceea ce este garantat în legaturã cu dimensiunile tipurilor fundamentale este:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

sizeof(float) <= sizeof(double)

b) Conversie implicitã de tip

Tipurile fundamentale pot fi amestecate liber în expresii. Oricînd este posibil, valorile se convertesc asa ca sã nu se piardã informație .Existã cazuri în care informația se poate pierde sau chiar distruge. Atribuirea unei valori de un tip la o variabilã de un alt tip cu biti mai puțini în reprezentarea ei este în mod necesar o sursa potențiala de erori. De exemplu, sã presupunem cã secvența urmãtoare se executã pe o mașinã în care întregii se reprezintã în complement fața de doi și caracterele pe 8 biti:

int i1 = 256 +255;

char ch = i1; //ch == 255

int i2 = ch; //i2 == ?

Un bit (cel mai semnificativ) este pierdut în atribuirea ch = i1 și ch va pãstra toți biții 1 (adica 8 biti de 1); deci nu existã o cale ca acesta sã poatã deveni 511 cînd se atribuie lui i2! Dar care ar putea fi valoarea lui i2 ? Pe VAX, unde un caracter este cu semn, rãspunsul este 255. C++ nu are un mecanism la execuție care sã detecteze un astfel de tip de problemã, iar detectarea la compilare este prea dificilã în general, asa cã programatorul trebuie sã fie atent la acest fapt.

c) Tipuri derivate

Din tipurile fundamentale (și din tipurile definite de utilizator) se pot deriva alte

tipuri folosind operatorii de declarație:

* pointer

& adresa [] vector () functie

și mecanismul de definitie de structura. De exemplu:

int* a;

24

float v[10];

char* p[20]; //vector de 20 de pointeri spre caractere

void f(int);

struct str{

short length; char* p;

};

Ideea de baza este ca declararea unui tip derivat oglindeste utilizarea lui. De exemplu:

int v[10]; //declarã un vector

i = v[3]; //utilizeazã un element al vectorului

int* p; //declarație de pointer

i = *p; //utilizeazã obiectul spre care se pointeazã

Toate problemele în întelegerea notației pentru tipuri derivate apar din cauza faptului ca * și & sînt operatori prefix iar [] si () sînt postfix, asa cã parantezele trebuie sã fie utilizate pentru a exprima tipuri în care precedența operatorilor este incomoda. De exemplu deoarece [] are o prioritate mai mare decit *:

int *v[10]; //vectori de pointeri int (*p)[10] //pointer spre vector

e) Void

Tipul void se comporta sintactic ca un tip fundamental. El poate totusi, sa fie utilizat numai ca parte a unui tip derivat; nu exista obiecte de tip void. Este folosit pentru a specifica ca o functie nu returneaza o valoare sau ca tip de baza pentru pointeri spre obiecte de tip necunoscut.

void f(); //f nu returneaza o valoare

void* pv; //pointer spre un obiect de tip necunoscut

Un pointer spre orice tip poate fi atribuit la o variabila de tip void*.

Pentru inceput acesta nu pare prea util, deoarece un pointer void* nu poate fi indirectat

dar aceasta restrictie este exact ceea ce face ca tipul void* sa fie util. El se utilizeaza în primul rînd pentru a transfera la funcții pointeri despre care nu se poate face presupunere asupra tipului obiectului spre care pointeza și pentru a returna obiecte fãrã tip dintr-o funcție.

3.3 Constante

C++ furnizeaza o notație pentru valorile de tipuri fundamentale: constante caracter, constatante întregi și constante în virgula flotanta. In plus, zero (0) poate fi utilizat ca și o constanta pentru orice tip de pointer, iar sirurile de caractere sînt constante de tip char[]. Este posibil, de asemenea, sã se specifice constante simbolice. O constanta simbolica este un nume a carui valoare nu poate fi schimbata în domeniul ei de existenta. In C++ exista trei feluri de constante simbolice:

25

– oricarei valori de orice tip i se poate da un nume și sã fie folosita ca o consatnta adaugînd cuviîtul cheie const la definiția ei;

– un set de constante întregi poate fi definit ca o enumerare;

– orice nume de vector sau funcție este o constantã.

a) Constante întregi

Constantele întregi pot fi de patru feluri: zecimale, octale, hexazecimale și constante caracter. Constantele zecimale sînt cele mai frecvent utilizate și aratã asa cum ne asteptam noi:

0 1234 976 12345678901234567890

Tipul unei constante zecimale este int cu conditia ca ea sã încapã într-un int, altfel ea este long. Compilatorul se cuvine sã avertizeze asupra constantelor care sînt prea lungi ca sa fie reprezentate în calculator.O constanta care începe cu zero urmat de x (0x) este hexazecimal, iar o constanta care începe cu zero urmat de o cifra este în octal.

Exemple de constante octale:

0 02 077 0123

Exemple de constante în hexazecimal:

0x0 0x2 0x38 0x53

Literele a, b, c, d, e si f sau echivalentele lor în litere mari se utilizeaza pentru a reprezenta 10, 11, 12, 13, 14 și respectiv 15. Notațiile și hexazecimale sînt mai folosilositoare pentru a exprima structuri pe biti; utilizînd aceste notații pentru a exprima numere adevarate putem ajunge la surprize. De exemplu, pe o mașina pe care un int se reprezintã ca un întreg prin complement fațã de 2 pe 16 biti, întregul 0xffff este numãrul negativ -1; daca s-ar folosi mai mulți biți pentru a reprezenta un int, atunci acesta ar fi

65535.

b) Constante în flotantã

O constanta în flotantã este de tip double. Din nou compilatorul dã un avertisment

despre constante flotante care sînt prea mari pentru a putea fi reprezentate. Iatî citeva constante în virgula flotantã:

1.23 .23 0.23 1. 1.0 1.2e10 1.23e-15

Sã observãm cã nu poate apare un spațiu în mijlocul unei constante flotante. De exemplu:

65.43 e-21 nu este o constantã flotantã ci 4 lexicuri:

65.43 e – 21 și va cauza eroare sintacticã.

Dacã noi dorim o constanta de tip float, noi putem defini una de forma :

const float pi8 = 3.14159265;

c) Constante caracter

26

Deși C++ nu are un tip caracter separat pentru date, ci mai degrabã tip întreg care poate pastra un caracter, trebuie sã avem o notație specialã și convenabila pentru caractere. O constantã caracter este un caracter inclus între caracterele apostrof: de exemplu 'a' si '0'. Astfel de constante caracter sînt constante simbolice adevarate pentru valorile întregi ale caracterelor din setul de caractere al mașinii pe care se executa programul C++ (care nu este în mod necesar același set de caractere ca și cel utilizat de calculatorul pe care se compileazã programul). Astfel, dacã noi executãm programul pe o mașinã care utilizeazã setul de caractere ASCII, valoarea '0' este 48; dacã mașina utilizeazã setul EBCDIC, el este 240. Utilizînd constantele caracter în locul notației zecimale programele devin mai portabile. Cîteva caractere au de asemenea notații standard în care se utilizeazã caracterul backslash (\):

'\b' backspace

'\f' formfeed

'\n' newline

'\r' cariage return

'\t' horizontal tab

'\v' vertical tab

'\\' backslash

'\'' simple quote

'\"' double quote

'\0' null, the integer value 0

Acestea sînt caractere singulare în ciuda aparenței. Este posibil, de asemenea sã reprezentãm un caracter printr-un numãr octal de o cifrã, doua sau trei (\ urmat de cifre octale) sau de un numãr hexazecimal de una, doua sau trei cifre(\x urmat de cifre hexazecimale). De exemplu:

'\6' '\x6' 6 ASCII ack

'\60' '\x30' 48 ASCII '0'

'\137' '\x05f' 95 ASCII '-'

Siruri

string"

Un șir constant este o secvențã de caractere inclusã între ghilimele: "this is a

Orice șir constant conține cu un caracter mai mult decît cele care apar în șir; ele toate se terminã prin caracterul nul '\0', cu valoarea 0. De exemplu:

sizeof("asdf")==5;

Tipul unui șir este "vector de un numãr corespunzãtor de caractere", asa cã "asdf" este de tipul char[5]. Sirul vid se scrie "" (și are tipul char[1]). Sã observam cã pentru orice șir s, strlen(s) == sizeof(s) – 1 deoarece strlen() nu numãrã zeroul terminal. Convenția backslash pentru reprezentarea caracterelor negrafice pot de asemenea sã fie utilizate într-un șir: aceasta face posibil sã se reprezinte ghilimelele sși însuși caracterul backslash într-un șir. Cel mai frecvent astfel de caracter este pe de parte caracterul '\n'. De exemplu:

cout << "beep at end of message\007\n";

27

unde 7 este valoarea ASCII a caracterului bel.

3.3 Instrucțiuni

a) Instrucțiunea expresie

Majoritatea instrucțiunilor sînt instrucțiuni expresie, care au forma:

expression;

De obicei instrucțiunile expresie sînt atribuiri sau apeluri de funcție. De exemplu :

x = 0;

printf(…);

b) Instrucțiunea compusa (blocul)

Instrucțiunea compusă este o grupare de declarații și instrucțiuni închise între acolade. Ele au fost introduse cu scopul de a folosi mai multe instrucțiuni acolo unde sintaxa cere o instrucțiune. Instrucțiunea compusă sau blocul sînt echivalente sintactic cu o singură instrucțiune.

Format:

Instrucțiune-compusă:

listă-declaratoriopt listă-instrucțiuniopt }

Listă-declaratori:

declarație

declarație listă-declaratori

Listă-instrucțiuni:

instrucțiune

instrucțiune listă-instrucțiuni

c) Instrucțiune conditionalã

Cele doua forme ale instructiunii conditionale sint: Format:

if (expresie)

instrucțiune-1 if (expresie)

instrucțiune-1

else instrucțiune-2

Expresia trebuie sã fie de tip aritmetic sau pointer sau un tip de clasã pentru care este definitã o conversie spre tipul pointer sau aritmetic. Expresia este evaluatã și dacã nu este zero, se executã prima subinstrucțiune. Dacã se utilizeazã else se executã cea de a doua subinstrucțiune dacã expresia este zero. De obicei ambiguitatea "else" se rezolvã conectînd un else cu ultimul if intilnit.

d) Instrucțiunea WHILE

Instrucțiunea while are forma:

28

while (expresie)

instrucțiune

Subinstrucțiunea se executã repetat atîta timp cît valoarea expresiei rãmîne diferitã de zero. Testul are loc înaintea fiecarei execuții a instrucțiunii.

e) Instrucțiunea DO

Instrucțiunea do are forma:

do instrucțiune while

(expresie);

Subinstrucțiunea se executa repetat pîãna cînd valoarea devine zero. Testul are loc dupã

fiecare execuție a instrucțiunii.

f) Instrucțiunea FOR Instrucțiunea for are formatul:

for (expresie-1opt; expresie-2opt; expresie-3opt)

instrucțiune

Aceasta instrucțiune este echivalentã cu:

expresie-1;

while (expresie-2) {

instrucțiune;

expresie-3;

}

Expresie-1 constituie inițializarea ciclului și se execută o singură dată înaintea ciclului.

Expresie-2 specifică testul care controlează ciclul

El se execută înaintea fiecărei iterații. Dacă condiția din test este adevărată atunci se execută corpul ciclului, după care se execută expresie-3, care constă de cele mai multe ori în modificarea valorii variabilei de control al ciclului. Se revine apoi la reevaluarea condiției. Ciclul se termină cînd condiția devine falsă.

Oricare dintre expresiile instrucțiunii for sau chiar toate pot lipsi.Dacă lipsește expresie-2, aceasta implică faptul că clauza while este echivalentă cu while (1), ceea ce înseamnă o condiție totdeauna adevărată. Alte omisiuni de expresii sînt pur și simplu eliminate din expandarea de mai sus.

g) Instrucțiunea SWITCH

Instrucțiunea switch transferã controlul unei instrucțiuni dintr-un set de instrucțiuni, în funcție de valoarea unei expresii. Are forma:

switch (expresie) instrucțiune

Tipul expresiei expression trebuie sã fie aritmetic sau pointer. Orice instrucțiune din statement poate avea o etichetã case sau mai multe, dupã cum urmeazã:

case constant_expression :

29

unde expresia constantã trebuie sã fie de același tip cu expresia din switch; de obicei se fac conversii aritmetice. Nu se poate sã existe doua constante identice de tip case în același switch

h) Instrucțiunea BREAK

Instrucțiunea:

break;

Are ca acțiune terminarea celei mai interioare instrucțiuni while, do, for sau switch;

controlul este transferat la instrucțiunea urmãtoare.

i) Instrucțiunea CONTINUE

Instrucțiunea:

continue;

Transfera controlul la partea de continuare a ciclului celui mai interior care o conține;

adicã la sfîrșitul ciclului. Mai exact, în fiecare din instrucțiunile:

while(……)

{…… contin: ;

}

for(……)

{

…… contin: ;

}

do{

}

……

: ;

while(……);

j)Instrucțiunea RETURN

O funcție revine la funcția care a apelat-o prin intermediul instrucțiunii return, care are una din formele:

return;

return expresie;

Prima forma poate fi utilizatã numai în funcții care nu returneazã o valoare, adicã o funcție care returneazã o valoare de tip void. Cea de a doua forma poate fi utilizatã numai în funcții care returneazã o valoare; valoarea expresiei este returnatã la funcția care a fãcut apelul. Dacã este necesar, expresia se convertește ca și într-o inițializare spre tipul

30

funcției în care ea apare. Atingerea sfîrsitului unei funcții este echivalentã cu o

instrucțiune return farã valoare returnatã.

l) Instrucțiunea GOTO

Controlul poate fi transferat necondiționat prin instrucțiunea:

goto identifier;

unde identifier trebuie sã fie o etichetã localizatã în funcția curentã. Nu este posibil sã se transfere controlul peste o declarație cu inițializator, exceptînd transferarea controlului peste un bloc interior fãrã a intra în el.

m) Instrucțiunea etichetatã

Orice instrucțiune poate fi precedatã de o eticheta de forma:

identifier:

care serveste sãa declare pe identifier ca etichetã. Singura utilizare a unei etichete este de a fi utilizatã într-o instrucțiune goto. Domeniul unei etichete este funcția curentã, excluzînd orice subbloc în care același identificator este redeclarat

n) Instrucțiunea NULL

Instrucțiunea null are forma:

;

O instrucțiune null este utilã pentru a introduce o etichetãa înainte de } a unei instrucțiuni compuse sau sa furnizeze un corp nul pentru o instrucțiune ciclicã cum ar fi while.

o) Instrucțiunea declarativã

O instrucțiune declarativã se utilizeazã pentru a introduce un identificator nou într-un

bloc; ea are forma:

declaration_statement: declaration

Dacã un identificator introdus printr-o declarație a fost în prealabil declarat într- un bloc exterior, declarația externã este ascunsã pe domeniul blocului, dupã care el isi reia existența. Orice initializãri ale variabilelor auto și register se fac ori de cite ori se executa instrucțiunile declarative ale lor.

3.4 Funcții

Modul tipic de a face ceva într-un program C++ este de a apela o funcîie care sa facî lucrul respectiv. Definirea unei funcții este o cale de a specifica cum sã se facã o operație. O funcție nu poate fi apelatã dacã ea nu este declaratã.

31

O declarație de funcție dã un nume funcției, tipul valorii returnate (dacã returneazã vreuna) de funcție, numãrul și tipurile argumentelor care trebuie furnizate în apelul unei funcții. De exemplu:

extern double sqrt(double);

extern elem* next_elem();

extern char* strcpy(char* to, const char* from);

extern void exit(int);

Semantica transferului de argumente este identicã cu semantica initializãrii. Tipurile argumentelor se verificã și se fac conversii implicite ale tipurilor argumentelor cînd este necesar. De exemplu, dîndu-se declarațiile precedente:

doublesr2 = sqrt(2); va apela corect funcția sqrt() cu valoarea 2.0.

Fiecare funcție care este apelatã într-un program trebuie sã fie definitã undeva (o singurã datã). O definiție de funcție este o declarație de funcție în care este prezent corpul funcției. De exemplu:

extern void swap(int*, int*); //o declarație void swap(int* p, int* q) //o definiție

{

int t = *p;

*p = *q;

*q = t;

}

spațiu suficient, asa cã argumentul al doilea este 0 pentru a indica faptul cã la conversie sã se utilizeze "exact atîtea caractere cîte sînt necesare". Pentru a elimina apelurile de forma hex(i, 0), funcția se declarã astfel:

extern char* hex(long, int = 0);

Inițializarea pentru cel de al doilea parametru înseamnã cã acesta este un parametru implicit. Adicã, dacã numai un argument este prezent într-un apel, cel de al doilea este utilizat implicit. De exemplu:

cout << "**" << hex(31) << hex(32, 3) << "**";

se interpreteazã astfel:

cout << "**" << hex(31, 0) << hex(32, 3) << "**";

și va imprima:

**1f 20**

Un argument implicit se verificã din punct de vedere al tipului în momentul declarãrii funcției și este evaluat în momentul apelului. Este posibil sã se furnizeze argumente implicite numai pentru argumente din ultimele poziții, asa cã:

32

int f(int, int = 0, char* = 0); //ok

int g(int = 0, int = 0, char*); //error int h(int = 0, int, char* = 0); //error

Sã observãm cã în acest caz spatiul dintre * și = este semnificativ (*= este operatorul de asignare):

int nasty(char *= 0); //syntax error

Adesea este o idee buna de a da la diferite funcții nume diferite, dar cînd niste funcții fac același lucru asupra obiectelor de tipuri diferite, poate fi mai convenabil sã le dãm același nume. Utilizarea aceluiași nume pentru operații diferite pentru tipuri diferite se numește supraîncarcare. Tehnica este deja utilizatã pentru operații de baza în C++; existã un singur nume pentru adunare (+), dar el poate fi utilizat pentru a aduna valori de tipuri întregi, în flotant și pointeri. Aceasta idee se extinde simplu pentru a trata operații definite de programator, adicã funcții. Pentru a proteja programatorul de reutilizarea accidentalã a unui nume, un nume poate fi utilizat pentru mai multe funcții numai dacã este declarat la început ca fiind supraîncãrcat. De exemplu:

overload print; void print(int); void print(char*);

La compilare singurul lucru pe care funcțiile îl au în comun este numele. Probabil cã într-un anumit sens funcțiile sînt similare, dar limbajul nu are restricții asupra lor. Astfel numele supraîncarcat al funcțiilor sînt în primul rînd o convenție de notație. Aceasta convenție este semnificativã pentru funcții cu nume convenționale, cum ar fi sqrt, print și open. Cînd un nume este semantic semnificativ, cum ar fi operatorii +, * și

<< și în cazul constructorilor ,aceasta facilitate devine esențialã. Cînd este apelatã o funcție f() supraîncarcatã, compilatorul trebuie sã stie care funcție este apelatã dintre cele cu numele f. Aceastã se face prin compararea tipurilor argumentelor efective cu tipurile argumentelor formale a tuturor funcțiilor numite f. Gãsirea funcției care sã fie apelatã se face în trei pași separați:

– cautã o corespondența exactã și dacã existã se utilizeazã funcția respectivã;

– cautã o corespondenã utilizînd conversii predefinite și utilizeazã o funcție gasitã

în acest fel;

– cautã o corespondentã folosind conversiile definite de utilizator și dacã existã

un set de conversii unic, se utilizeazã funcția gasitã. De exemplu:

overload print(double), print(int); void f()

{

print(1);

print(1.0);

}

Regula de corespondențã exactã va face ca f() sa scrie pe 1 ca un întreg, iar pe 1.0 ca un numar flotant. Zero, char sau short sînt fiecare o corespondențã exactã pentru un argument int. Analog, un float este o corespondențã exactã pentru double.

33

Pentru argumentele funcțiilor cu nume supraîncarcate, regulile de conversie standard nu se aplicã complet. Conversiile care pot distruge informație nu se aplicã, rãmînînd int spre long, int spre double, zero spre long, zero spre double și conversia de pointeri; zero spre pointer, pointer spre void* si pointer spre clasã derivatã pentru a pointa spre baza clasei . Iatã un exemplu în care este necesarã conversia:

overload print(double), print(long);

void f(int a){print(a);}

Aici a poate fi imprimat sau ca double sau ca long. Ambiguitatea poate fi rezolvatã utilizînd tipul de conversie explicitã (sau print(long(a)) sau print(double(a))).

Dîndu-se aceste reguli, se poate asigura cã cel mai simplu algoritm (functie) va fi

utilizat, cînd eficiența sau precizia calculului diferã semnificativ pentru tipurile implicite. De exemplu:

overload pow; int pow(int, int); double pow(double, double); //din <math.h> complex pow(double, complex); //din <complex.h> complex pow(complex, int); complex pow(complex, double); complex pow(complex, complex);

Procesul de gãsire a corespondenței ignora unsigned și const.

3.5.Clase

Scopul conceptului de clasã C++ este de a furniza programatorului un instrument pentru a crea tipuri noi care pot fi folosite tot atît de convenabil ca și tipurile predefinite. Ideal, un tip definit de utilizator ar trebui sã nu difere de tipurile predefinite în modul în care sînt utilizate, ci numai în modul în care sînt create.

Un tip este reprezentarea concretã a unei idei (concept). De exemplu, tipul float din C++ cu operațiile +, -, *, etc., furnizeazã o versiune restrînsã dar concretã a conceptului matematic de numãr real. Motivul de a desemna un tip nou este de a furniza o definiție concretã și specificã a conceptului care nu are un corespondent direct și evident între tipurile predefinite. De exemplu, cineva poate furniza tipul "trunk_module" într-un program ce se ocupã cu telefoanele sau tipul "list_of_paragraphs" pentru un program de procesare de text.

Clasa este un tip definit de utilizator. Sã considerãm implementarea conceptului

de datã utilizînd o structura pentru a defini reprezentarea unei date și un set de funcții pentru manipularea variabilelor de acest tip:

struct date{ int month, day, year; }; date today; void set_date(date*, int, int, int); void next_date(date*); void print_date(date*);

Nu existã conexiuni explicite între funcții și tipul datei. O astfel de conexiune se poate stabilii declarînd funcțiile ca membri:

struct date{int month, day, year;

void set(int, int, int);

void get(int*, int*, int*);

void next();

void print();

};

34

Funcțiile declarate în acest fel se numesc funcții membru și pot fi invocate numai pentru o variabilã specificatã de tipul corespunzator utilizînd sintaxa standard pentru accesul la membri unei structuri.

Declarația lui date din subsecțiunea precedentã furnizeazã un set de funcții pentru manipularea unei variabile de tip date, dar nu specificã faptul cã acele funcții ar trebui sã fie singurele care sã aibã acces la obiectele de tip date. Aceasta restricție poate fi exprimatã utilizînd o clasã în locul unei structuri:

class date{

int month, day, year;

public:

void set(int, int, int);

void get(int*, int*, int*);

void next(); void print();

};

Eticheta public separãcorpul clasei în doua pãrti. Numele din prima parte, private, pot fi utilizate numai de funcțiile membre. Partea a doua, public, constituie interfața cu obiectele clasei. O structura (struct) este pur și simplu o clasã cu toți membri publici, asa cã funcțiile membru se definesc și se utilizeazã exact ca inainte.

Unitatea de protecție în C++ este clasa, nu un obiect individual al unei clase.

Utilizarea funcțiilor de felul set_data() pentru a furniza inițializarea pentru obiectele clasei nu este eleganta și este inclinatã spre erori.

Intrucît nicãieri nu se afirmã cã un obiect trebuie inițializat, un programator poate uita sã facã acest lucru sau (adesea cu rezultate dezastruoase) sã facã acest lucru de doua ori. O concepție mai bunã este de a permite programatorului sã declare o funcție cu scopul explicit de a inițializa obiecte. Deoarece o astfel de funcție construiește valori de un tip dat, ea se numește constructor. Un constructor se recunoaște deoarece are același nume ca și clasa însasi. De exemplu:

class date{

//…… date(int, int, int);

};

Cînd o clasã are un constructor, toate obiectele acelei clase vor fi inițializate. Dacã constructorul cere argumente, ele pot fi furnizate:

date today = date(23, 6, 1983);

date xmas(25, 12, 0); //forma prescurtata

date my_birthday: //ilegal, lipseste initializarea

Declarațiile de clasã pot fi imbricate. De exemplu:

class set{

struct setmem{

int mem; setmem* next;

35

setmem(int m,setmem* n){ mem=m; next=n; }

};

setmem* first; public:

set(){first = 0;}

insert(int m){first = new setmem(m, first);}

//…….

};

Dacã clasa imbricata nu este foarte simplã, astfel de declarații sînt foarte încurcate. Mai mult decît atît, clasele imbricate sunt mai mult o facilitate în notație, întrucît o clasa imbricatã nu este ascunsã în domeniul clasei care o include din punct de vedere lexical:

class set{

struct setmem{

int mem; setmem* next; setmem(int m, setmem* n);

};

//…….

};

setmem::setmem(int m, setmem* n)

{mem = m;

next = n;

}

setmem m1(1, 0);

Constructorii de forma set::setmem::setmem() nu sînt necesari și nici legali. Singurul mod de ascundere a numelui unei clase este prin utilizarea tehnicii de fișiere_module .

Clasele netriviale este bine sã fie declarate separat:

class setmem{

friend class set; //acces numai prin membri

//lui set

int mem;

setmem* next;

setmem(int m, setmem* n){ mem=m; next=n; }

};

class set{

setmem* first; public:

set(){ first = 0; }

insert(int m){ first = new setmem(m, first); }

};

O clasã este un tip, nu un obiect dat si fiecare obiect al clasei are copia lui proprie a membrilor date ai clasei. Cu toate acestea, unele tipuri sînt implementate mai elegant dacã toate obiectele acelui tip au în comun unele date. Este preferabil ca o astfel de datã

36

comunã sã fie declaratã ca parte a clasei. De exemplu, pentru a gestiona taskuri într-un sistem de operare, este adesea utilã o lista a tuturor taskurilor:

class task{//……..

task* next; static task* task_chain; void schedule(int); void wait(event);

//……..

};

Declarînd membrul task_chain ca static se asigurã cã va fi numai o copie a lui, nu o copie pentru fiecare obiect task. Este încã în domeniul clasei task și poate fi accesat "din afara" numai dacã a fost declarat public. In acest caz, numele lui trebuie sã fie calificat prin numele clasei sale:

task::task_chain

Posibil sã se ia adresa unui membru al unei clase. A lua adresa unei funcții membru este adesea util întrucît tehnicile și motivele pentru a utiliza pointeri la funcții se aplicã în mod egal și la funcții membru. Totuși existã un defect curent în limbaj: nu este posibil sã se exprime tipul pointerului obținut dintr-o astfel de operație. In consecințã trebuie sã folosim trucuri folosind avantajele din implementarea curentã.

#include <stream.h>

struct cl{

char* val;

void print(int x){ cout << val << x << "/n"; }

cl(char* v){val = v;}

};

//"se ia" tipul funcțiilor membru: typedef void (*PROC)(void*, int); main()

{cl z1("z1 ");

cl z2("z2 ");

PROC pf1 = PROC(&z1.print);

PROC pf2 = PROC(&z2.print);

z1.print(1);

(*pf1)(&z1, 2); z2.print(3); (*pf2)(&z2, 4);

}

Prin definiție o structurã este pur si simplu o clasã cu toți membri publici, adicã:

struct s{ … este pur și simplu o prescurtare pentru:

class{

public: …

37

Structurile se folosesc cînd ascunderea datelor este nepotrivitã. O reuniune numitã se defineste ca o structurã în care fiecare membru are aceeași adresa .Dacã se stie cã numai un membru al unei structuri va avea o valoare utilã la un moment dat, o reuniune poate salva spatiu

Cînd o clasã are un constructor, el este apelat ori de cîte ori se creazã un obiect al acelei clase. Cînd o clasa are un destructor, el este apelat ori de cîte ori este distrus un obiect al acelei clase.

Obiectele pot fi create ca:

– un obiect automatic: se creazã de fiecare datã cînd se întilneste declarația lui la execuția programului și este distrus de fiecare datã cînd se iese din blocul în

care el a aparut;

– un obiect static: se creazã o datã la pornirea programului și se distruge o datã cu

terminarea programului;

– un obiect în memoria liberã: este creat folosind operatorul new și distrus folosind operatorul delete;

– un obiect membru: ca membru al unei clase ori ca un element de vector.

Un obiect poate de asemenea, sã fie construit într-o expresie prin folosirea explicitã a unui constructor, caz în care el este un obiect automatic.

38

Capitolul 4

SQL Server

4.1 Prezentare

Microsoft SQL Server este un sistem de management a bazelor de date relaționale realizat pe baza standardului SQL(Structured Query Language), cel mai uzual limbaj al bazelor de date. Se ocupã cu stocarea și gestionarea resurselor , a datelor pentru sisteme mari de procesare a datelor și a site-urilor comerciale Web, furnizînd și servicii de stocare a datelor pentru afaceri individuale sau mai mici.

SQL Server este o soluție flexibilã și adaptativã la diversele categorii de clienãți, rãspunzînd la o serie de de nevoi precum nivel ridicat de scalabilitate, performanțã și siguranțã în exploatare.

Se adapteaza foarte bine la cerințele utilizatorilor acest lucru fiind demonstrate prin numãrul mare de ediții și anume 8 la numar, permitînd integrarea MS SQL Serverului pe o gamã variata de echipamente.

Caracteristicile cele mai importante ale acestui sistem sunt urmãtoarele:

– Scalabilitate și performanța – Prin noțiunea de sistem scalabil se întelege acel tip de sistem care pune la dispoziția designe-rilor posibilitatea de a porni de la sisteme mici și de a creste în funcție de necesitãți.Microsoft SQL Server este conceput pentru a suporta baze de date și aplicații uriașe, cum ar fi baze de date “multiterabyte” folosite de milioane de persoane. Acest lucru este atins prin caracteristica numitã scalabilitate care permite user-ilor sã adauge procesoare, memorii și rețele pentru construirea unui singur nod mare, permitînd ca o baza de date imensã sã fie partiționatã într-un grup de servere. Baza de date este consideratã în continuare ca o singurã entitate.

– Integrarea – Sql Server prezintã un nivel ridicat de integrabilitate cu alte servere sau alte aplicații

– Simplitate în administrare- oferã instrumente grafice de configurație și experți wizard pentru realizarea diverselor operații de configurare și administrare a bazelor de date

– Optimizãri dinamice – SQL Server poate fi configurat sã optimizeze dinamic parametri bazei de date pentru a rãspunde la schimbarea caracteristicilor de utilizare. Pentru utilizatorii la nivel de intreprindere, SQL Server se integreazã facil in majoritatea mediilor de management al intreprinderii

– Securitatea ridicatã a datelor.

Serverul de date MS SQL Server oferã la dispozitia clientului tools-uri ( client tools) care sã permite un acces usor la informațiile din bazele de date. Cele mai importante doua tools-uri care sunt puse la dispozitia clientului sunt:

– Enterprise Manager

– Query Analyzer

Diferența cea mai mare între cele doua este aceea cã Enterprise Manger este un tools

grafic pentru administrarea serverului, iar Query Analyzer este un „command-line tools”

realizat pentru a rula interogãri. Mai exista deasemenea 2 tools-uri: „osql” și „sqlcmd”,

39

care se numesc „operating-system command tools” și care pot sã acceseze serverul direct de la linia de comandã.

Una dintre tendințele contemporane o constitue creșterea nevoii de disponibilitate, a cererii pentru sisteme scalabile care să poată corespunde unor eventuale modificări ulterioare, modificări care să poată fi realizate chiar de către utilizator. Aceste nevoi se fac simțite nu doar la nivelul marilor corporații și al clienților guvernamentali, ci și la nivelul consumatorilor individuali sau al micilor întreprinzători. În acest context, Microsoft a încercat să se adreseze acestor noi necesități ale consumatorilor prin pachetul SQL Server 2005, care poate rula la fel de bine în medii de orice dimensiune, prin intermdiul următoarelor versiuni:

– SQL Server Standard Edition ;

– SQL Server 2005 Express Edition

– SQL Server 2005 Mobile Edition.

Dintre cele mai importante schimbări în domeniul disponibilității și scalabilității

introduse de SQL Server 2005 sunt important de reținut următoarele :

– Database mirroring: are rolul de a crește disponibilitatea datelor și de a permite recuperarea de pe urma erorilor, în cazul în care serverul pe care se află baza de date devine nedisponibil. La fel ca și la log shipping, baza de date de pe un server este replicată pe un alt server , „în oglindă”, astfel încât log+urile transacțiilor să nu fie rescrise. Serverul de pe care se face copierea este numit server primar , iar cel pe care se face copierea (server-ul „oglindă”) este numit server secundar. Serverele pot schimba rolurile de primar și secundar între ele. Ceea ce apare nou față de SQL Server 2000 este prezența unui al treile server, care are rolul de a monitoriza operațiile dintre cele două servere, obiectivul principal fiind detecția căderilor prin lipsa răspunsului din partea server-ului principal. Atâta timp cât sincronizarea dintre cele două servere este menținută, server-ul „oglindă ” poate prelua cererile clientului , fără întârziere prea mare (câteva secunde) și fără nici o pierdere de date. Deși mecanismul de „oglindire a bazei de date ” implică trei servere distincte, fiecare dintre ei poate juca roluri diferite în sesiuni de database mirroring diferite.

– restore online : oferă posibilitatea de a restaura datele fără a închide în prealabil

baza de date, cum era cazul versiunilor precedente de SQL Server. Utilizatorii sunt

preveniți doar la accesarea datelor care au fost restaurate.

– indexare online: cheile pot fi create , șterse sau reconstruite (operație desfășurată în mod obișnuit pentru a elimina fragmentarea indecșilor) în acelați timp în care datele din tabel sunt interogate sau modificate. În SQL Server 2000 reconstrucția unei chei străine plasa un lock partajat pe respectivul tabel, care restricționa operațiile premise la cele de SELECT. La reconstrucția unei chei primare, SQL Server 2000 plasa un lock exclusiv asupra tabelului în cauză, care împiedica orice operație asupra tabelului.

– suport atât pentru Windows-ul pe 32 cât și pentru cel pe 64 de biți.

– partiționarea tabelelor: oferă posibilitatea partiționării tabelelor între grupele de

fișiere din baza de date, ceea ce optimizează operațiile pe tabele de dimensiuni mari.

– instantaneu al bazei de date (database snapshot) – snapshot-urile generează o

vedere read-only a bezei de date în cauză, care poate fi folosită, de exemplu, pentru a recupera rapid datele după o modificare eronată. Snapshot-urile(instantanee-le) diefră de copiere deoarece ocupă doar spațiul necesar pentru a conține schimbările aplicate bazei de date după ce aceasta a fost creată. Iyolarea snapshot-urilor oferă acces paralel la ultima

40

înregistrare pe care s-a produs un commit în baza de date și care poate fi folosită pentru a elimina problemele de blocaj care pot apare atunci când mai mulți utilizatori operează simultan asupra aceluiași set de date.

– replicarea – implementarea SQL Server 2000 a fost îmbunătățită prin

introducerea unei noi topologii “peer-to-peer”, a abilitîții de a replica date prin HTTP sau

HTTPS și de replicare din bazele de date Oracle.

– SQL Service Broker – oferă funcționalitatea rutării mesajelor asincrone și garantează livrarea pentru scenarii care implică task-uri de procesare a datelor complexe, simultane, distribuite și interdependente (folosite în special în aplicațiile e-commerce).

– recuperare rapidă – permite conectarea la o bază de date online de îndată de log-

ul transacției a fost rulat.

– referitor la problemele de securitate, SQL Server 2005 implementează

următoarele modificări: setări “secure by default”, noi politici de logare SQL Server privitoare la parole, criptarea nativă a datelor și protejarea acestora prin parole sau certificate, moștenirea autorizărilor. SQL Server Integration Services conțin facilități noi care simplifică extragerea datelor din diferite surse și le prelucrează pentru a le utiliza în aplicații analitice sau de Data Warehouse.

– Introduce un nou tip de date VARCHAR(MAX) , împreună cu

NVARCHAR(MAX) și VARBINARY(MAX) care au proprietatea de a stoca până la

2GB de date, incluzând date de tip TEXT,NTEXT și IMAGE.

– Sistemul de Management SQL Server îmbunătățit

– Reporting Services – oferă posibilitatea de a crea și vizualiza rapoarte . Prin integrarea lui în SQL Server 2005 se elimină necesitatea unor instrumente externe, cum ar fi Crystal Reports.

– Notification Services – oferă posibiltatea de a genera și trimite notificări tipizate printr-o varietate de mecanisme de transmitere a mesajelor, cum ar fi email, telefon sau messenger .

4.2 Baze de date

SQL Server utilizeazã un tip de de bazã de date numit bazã de date relationalã. In bazele de date relaționale, datele sunt organizate în tabele. In tabele sunt grupate informații referitoare la același lucru, dispuse în randuri și coloane. Atunci cînd este nevoie, motorul bazei de date efectueazã conexiuni între diversele tabele. Tabelele sunt foarte strîns legate de ceea ce în cãrțile de teorie se numeste 'relație' sau 'entitate', dar în cazul de fata ne vom stradui sã privim lucrurile din punct de vedere practic. In general, o bazã de date poate fi consideratã o colecție de date corelate.

In SQL Server 2005, o bazã de date nu este neaparat legatã de un anumit fisier;

ea reprezintã mai curând un concept logic, bazat pe o colecție de obiecte corelate. De exemplu, o baza de date din SQL Server nu conține doar datele ca atare, ci și structura bazei de date, indexurile, elementele de securitate și eventual alte obiecte cum sunt vederile sau procedurile memorate referitoare la baza de date respectivã.

Cele mai uzuale obiecte ale bazelor de date relaționale sunt :

– tabelele reprezintã obiectele care contin tipurile de date și datele propriu-zise ;

41

– coloanele sunt pãrțile unui tabel care conțin date. Fiecarei coloane i se atribuie un tip de date și o denumire unicã.

– tipurile de date reprezintã principala formã de stocare a informațiilor. SQL Server pune la dispoziție diverse tipuri de date, cum ar fi caractere, nume sau date calendaristice.

– procedurile memorate sunt similare cu macroinstrucțiunile: se poate scrie o

secvențã de cod Transact-SQL care poate fi stocatã sub un nume. Prin executarea procedurii memorate, se executã de fapt codul T-SQL din cadrul procedurii.

– funcțiile definite de utilizator reprezintã secvențe de cod Transact-SQL foarte asemanatoare cu procedurile memorate.

– declanșatorii sunt proceduri memorate care sunt activate înainte sau dupã adãugarea, modificarea sau stergerea unor informații din baza de date. Aceștia asigurã respectarea anumitor reguli legate de activitatea respectivã sau a regulilor privind integritatea datelor..

– vederile sunt în esența niste interogari stocate în baza de date, care pot face referire la unul sau mai multe tabele. Ele pot fi create și salvate pentru a le utiliza mai ușor în viitor. De obicei, vederile includ numai anumite coloane dintr-un tabel sau leagã între ele doua sau mai multe tabele. De asemenea, pot fi folosite ca mecanisme de securitate.

– indexurile permit organizarea datelor pentru o execuție mai rapidã a interogãrilor.

– Cheile primare, deși nu sunt obiecte propriu-zise, constituie un aspect esențial al bazelor de date relaționale. Ele asigura unicitatea rândurilor unui tabel, oferind o metodã de a identifica în mod unic fiecare element pe care doriți sã-l stocați.

– Cheile strãine reprezintã una sau mai multe coloane care fac referire la cheile primare sau la restricții unice ale altor tabele. In SQL Server se folosesc chei primare și strãine pentru a stabili legaturi între datele aflate în tabele separate la executarea interogarilor.

– restricțiile sunt mecanisme de asigurare a integritãții datelor, bazate pe server și implementate prin sistem.

– regulile asociate cu coloanele garanteazã faptul cã datele introduse se conformeazã anumitor standarde prestabilite. De exemplu, puteți folosi reguli pentru a vã asigura cã numãrul de telefon al unei persoane conține numai cifre.

– valorile prestabilite atribuite campurilor vor fi folosite atunci când nu se introduc

date în cursul unei operații INSERT.

4.3 Bazele de date prestabilite în SQL Server

Unele dintre bazele de date prestabilite (cum sunt master, model, tempdb și MSDB), sunt baze de date sistem și nu pot fi înlãturate fãrã a cauza avarii grave în SQL Server ,iar altele (cum sunt pubs și Northwind), sunt simple aplicați demonstrative pentru a învãța sã utilizați SQL Server, care pot fi înlaturate fãrã nici o problemã din sistemul SQL .

A) Baza de date master – conform celor mentionate anterior, baza master este o

baza fundamentalã pentru funcționarea SQL Server. Ea conține un pointer la fișierul de date principal pt fiecare baza de date instalatã pe sistemul SQL Server, precum și

42

informați esențiale la nivel de server.Aceste informați cuprind mesaje de eroare la nivel de sistem, informați despre conturile de utilizator, procedurile de sistem memorate și serverele conectate sau legate.

B) Baza de date model – baza de date model poate fi consideratã un fel de sablon.

De fiecare datã când se creeazã o noua bazã de date, defapt se creeazã baza de date model, careia i se aplicã dimensiunea și celelalte caracteristici specifice noi baze de date. Orice obiect existent în baza de date model este copiat în noua baza de date, la momentul crearii ei.

C) Baza de date tempdp – baza de date tempdp reprezintã locul în care se efectueazã operațiile de sortare, joncțiunile și alte activitãți care necesitã un spațiu temporar. Baza de date tempdb este reinițializatã la fiecare repornire a lui SQL Server.

D) Baza de date MSDB – baza de MSBD conține suport pentru serviciul SQL

Server Agent, inclusiv informațiile despre operații planificate, avertismente și replicare. De asemena aici se pastreazã informații despre toate activiitãțile de salvare și restaurare.

E) Baza de date pubs – baza de date pubs are rolul unui instrument de învatare. Ea conține o baza de date demonstrativã referitoare la o editurã (informații despre cãrți, autori, vânzãri). Majoritatea exemplelor din SQL Server Books Online sunt baza de pe pubs.

F) Baza de date Northwind – Baza de date Northwind este o bazã de date cu scop pedagogic. La început ea a fost o bazã de date demonstrativã furnizatã împreunã cu Microsoft Access, dar deoarece tot mai mulți utilizatori Access se orienteazã spre SQL Server, baza de date Northwind a fost transferatã în acest sistem.

4.4 Crearea unei baze de date

Pentru a crea o noua baze de date în SQL Server, se poate folosi una din urmãtoarele trei metode:

– Database Creation Wizard

– SQL Server Enterprise Manager

– Instrucțiunea CREATE DATABASE

Când se creazã o nouã bazã de date, se efectueazã defapt o copie a bazei de date model. Dupã ce creați baza de date prin copierea bazei de date model, aceasta se va extinde pânã la dimensiunea specificatã, spațiul suplimentar fiind umplut cu pagini goale. Bazele de date folosesc fișiere pentru stocarea fizicã a datelor de pe disc. Când se creazã o noua bazã de date trebuie specificat cel puțin un fisier pentru stocarea datelor și a tabelelor de sistem, precum și un fișier în care va fi amplasat jurnalul de tranzacții.

In SQL Server singurul parametru absolut necesar pentru a crea o bazã de date

este numele logic al acesteia, NAME. Cu toate cã se poate crea o bazã de date în acest fel, nu este recomandabil. Recomandabil este sã se foloseascã la crearea bazei de date urmãtori parametri numele logic al bazei de date, numele și dimensiunea fișierului de date numele și dimensiunea jurnalului de tranzacții.

Proprietãțile bazei de date sunt împãrțite în trei categorii :

– Access,

– Settings,

– Compatibility.

Opțiunile care se pot aplica unei baze de date sunt :

43

A) Membres of db_owner, dbcreator or sysadmin specificã faptul cã numai menbrii rolului fix db_owners pot utiliza baza de date. Aceastã opțiune este folositã de obicei când admistratorul bazei de date efectueazã operații de întreținere și nu doreste ca utilizatorii obișnuiti sã foloseascã baza de date. Acest atribut este cunoscut sub numele de DBO Use Only

B) Single User specificã faptul cã baza dr date poate fi accesatã de un singur

utilizator la un moment dat. Opțiunea permite defapt o singurã conecsiune la baza de date

C) Read-Only marcheazã baza de date fiind accesibilã numai pentru citire, nefiind

permise nici un fel de modificãri

D) Recovery Model determinã cum se va efectua înregistrarea tranzacțiilor în

jurnal și tipurilor permise de recuperare a bazelor de date. Opțiunile posibile sunt Full, Simple si Bulk-logged.

E) ANSI NULL Default atunci cand este selectatã, defineste noile coloane de tabelã cu valoarea NULL sa NOT NULL.

F) Recursive Triggers permite declanșatori recursivi. Un declanșator recursiv apare atunci când modificarea datelor dintr-un tabel activeazã un declansator dintr-un alt tabel

G) Auto Update Statistics funcționeazã împreunã cu Auto Create Statistics. De-a lungul timpului informațiile din coloanele tabelelor se modificã, însã datele statistice despre aceste coloane rãmân neschimbate.Pentru a rezolva aceasta problemã, din când în când trebuie sã actualizați datele statistice. Auto Update Statistics realizeazã acest lucru automat.

H) Torn Page Detection detecteazã momentul în care pe disc apare o pagina scrisã numai partial.

I) Auto Close conservã resursele de pe server pentru o bazã de date care nu este folositã frecvent. Baza de date se închide automat când iese ultimul utilizator.

J) Auto Shrink restrânge automat fișierele de date și fișierele jurnal. Jurnalele se restrâng automat dupã efectuarea unei copi de siguranțã.

L) Auto Create Statistics genereazã automat informați statistice despre distribuția valorilor într-o coloanã de date. Aceste informați sunt utilizate de SQL Server Query Optimizer pentru a genera un plan de interogãri bazat pe costul utilizãrii diferitelor coloane.

M) Use Quoted Identifiers vã permite sã folosiți ghilimelele în cadrul identificatorilor SQL Server. Un idntificator este numele unui obiect, poate fi o variabilã, un tabel etc.

N) Compatibility Level permite sã se specifice nivelul de compatibimitate cu

versiunile anterioare pe care le acceptã respectiva bazã de date.

Pentru a modifica definițiile fișierului și atributele de dimensiune ale unei baze de

date se foloseste instrucțiunea ALTER DATABASE sau SQL Server Enterprise Manager. Pentru a restrânge o bazã de date, trebuie folositã comanda DBCC SHRINKDATABASE sau SHRINKFILE. Pentru a adaugã grupuri de fișiere la baza de date se poate folosi instrucțiunea ALTER DATABASE .

Bazele de date se pot expanda adaugând fisiere suplimentare, care îi mãresc dimensiunea. Se pot adãuga fisiere atât la portiunea de date cât și la porțiunea de jurnale. Crearea mai multor fișiere face puțin mai dificil procesul de întreținere, dar prezintã și avantaje :

44

– fișierele pot fi amplasate pe hard-discuri separate

– performanța se poate înbunãtãți, pentru cã sunt mai multe șanse ca operațiile

de citire și scriere în baza de date sã utilizeze controllere de disc separate

– în cazul efectuãri copiilor de siguranțã, fișierele bazei de date pot fi salvate în

nod independent

– dacã se folosesc grupuri de fișiere, anumite porțiuni de date pot fi amplasate

în anumite fisiere.

Pentru a restrânge întreaga bazã de date se poate utiliza comanda DBCC

SHRINKDATABASE, cu urmãtoarea sintaxa : DBCC SHRINKDATABASE

{

(nume_baza_date

[ , procent_final ]

[ , {NOTRUNCATE | TRUNCATEONLY }])

}

In aceasta sintaxa :

– nume_bazã_date este numele bazei de date ce va fi restrânsa ;

– procent_final este procentul de spațiu liber rãmas în baza de date dupã restrângere ;

– NOTRUNCATE impune menținerea spațiului eliberat în fișierele bazei de date ;

– TRUNCATEONLY impune ca spațiul liber din fișierele de date sã fie cedat sistemului de operare .

Redenumirea unei baze de date se face prin executarea urmãtoarei proceduri de sistem memoratã. Aceasta procedurã este sp_renamedb.

Sintaxa acestei proceduri este :

EXEC sp_renamedb ‘nume_vechi’ ,’nume_nou’

Când se redenumește o baza de date trebuie ținut cont de urmãtoarele aspecte :

– pentru a redenumi o bazã de date trebuie sã fiți membru al rolului de server admin

– este posibil ca funcționarea corectã a unor scripturi SQL sã depindã de numele bazei de date ;

– baza de date trebuie sã se afle în modul de lucru cu un singur utilizator ;

– numele fișierelor bazei de date, numele grupului de fișiere nu sunt afectate de

schimbarea numelui ;

– pentru a executa procedura de sistem memorate sp_renamedb trebuie sã vã

aflați pe baza master.

Uneori poate fi nevoie sã se steargã o baza de date, este posibil sã nu mai fie

nevoie de ea. In orice caz, înlaturarea unei baze de date din SQL Server este un proces relativ simplu. Acest lucru se poate face atât prin SQL Server Enterprise Menager, cât și cu ajutorul instrucțiunilor Transact_SQL. Inainte de a înlãtura o baza de date trebuie avute în vedere urmãtoarele aspecte :

– la ștergerea unei baze de date, se șterg informațiile despre ea din tabelele de

sistem, fișierele de date și fișierele jurnal ;

– o baza de date eliminatã poate fi recreatã numai prin restaurarea unei copii de

siguranțã;

45

– la momentul ștergeri, nici un utilizator nu trebuie sã acceseze baza de date ;

– pentru a înlãtura baza de date, trebuie sã fiti un membru al rolului db_owner

sau al rolului de server sysadmin ;

– când se lanseazã comanda DROP DATABASE, trebuie sã fiți pe baza de date

master .

Sintaxa comenzi DROP DATABASE :

DROP DATABASE nume_bazã_date

4.5 Tipuri de date și crearea tebelelor într-o baza de date

In tabele sunt stocate toate informațiile dintr-o bazã de date, ele sunt alcãtuite din rânduri și coloane. Fiecare coloana dintr-un tabel poate conține un anumit tip de informații sau de date. Un tabel reprezintã o entitate din baza de date, fiecare rând dintr- un tabel este o instanțã a acestei entitãți. Coloanele tabelului descriu atributele acestei entitãți logice.

Fiecare coloanã dintr-un tabel trebuie sã primeascã un nume, un tip de date ,o dimensiune, un atribut de colaționare, și un atribut are indicã dacã este obligatoriu sã se specifice o valoare. Fiecare coloanã trebuie sã aibã un nume unic în tabelul respectiv și sã respecte regulile denumirilor SQL Server.

O bazã de date poate avea maximum 2 miliarde de tabele, fiecare din acestea putând conține pânã la 1024 de coloane. Lungimea maximã a unui rând este de 8192 octeți, mai puțin spațiu suplimentar inevitabil pentru stocarea fizicã a rândurilor în SQL Server. Spațiul de stocare pentru un rând este de 8060 octeți. Lungimea maximã a unei coloane este de 8000 octeți, iar un tabel poate conține maximum 1024 coloane, însã un rând nu poate depãsi o paginã de date(8192 octeți) socotind atât datele cât și spațiul suplimentar.

Toate numele tabelelor din SQL Server, precum și numele coloanelor și ale altor obiecte, trebuie sã respecte urmãtoarele reguli, specifice denumirilor SQL Server :

– denumirile pot avea între 1 și 128 de Caractere Unicode – litere, cifre, simboluri ;

– primul caracter trebuie sã fie o litera sau unul din urmatoarele simboluri : @,

#, _ ;

– dupã primul caracter se pot folosi urmãtoarele simboluri : #, $ si _ ;

– denumirile care încep cu simbolul @ sunt folosite ca variabile locale, simbolul @ poate fi folosit doar pe prima poziție a unei denumiri;

– denumirile care încep cu simbolul # sunt folosite pentru a desemna obiecte temporare ;

– denumirile care încep cu ## desemneazã obiecte temporare globale, la care

pot face referire toți utilizatori bazei de date ;

– denumirile pot conține spații, dar pentru a face referile la obiectele respective trebuie sã fie incluse între ghilimele duble sau paranteze pãtrate .

Tipuri de date

Tipul unei date aratã ce fel de informați sunt stocate într-o anumitã coloanã și cât

spațiu ocupã aceasta. Unele tipuri au o lungime variabilã, iar altele o lungime fixã. Tipurile de date se pot impãrți în urmãtoarele categorii :

– sir : char (n), varchar(n) – stocheazã caracterele ;

46

– valori binare : binary(n), varbinary(n) – stocheazã informații binare în perechi de câte 2 octeți ;

– numere întregi : int, smallint, bigint, tinyint – stocheazã valori întregi ;

– numere aproximative : float, real – stocheazã informații numerice

aproximative;

– numere exacte : decimal, numeric – stocheazã informații numerice exacte ;

– valori speciale : bit, text, image, sql_variant, table – stocheazã un singur bit, informații tip character peste 8000 de octeți sau date sub formã de imagini. sql_variant stocheazã orice fel de date, iar table stocheazã tabele ;

– valori data/ora : datetime, smalldatetime – stocheazã date si ore ;

– valori monetare : money, smallmoney – stocheazã valori monetare ;

– valori cu autoincrementare : rowversion – stocheazã valori care reprezintã

tipuri de date incrementate automat de SQL Server ;

– sinonime asociazã tipuri de date ANSI cu tipuri de date SQL Server

– date Unicode : nchar, ntext, nvarchar – stocheazã date într-un format

unicode(doi octeți per caracter) ;

– date definite de utilizator ;

– coloane calculate – stocheazã expresia utilizatã pentru a calcula coloana, nu se stocheazã date ci numai expresii folosite pentru crearea lor.

La fel ca majoritatea lucrurilor din SQL Server, tabelele pot fi create în douã moduri :

– folosind SQL Server Enterprise Menager ;

– folosind script-uri Transact-SQL .

Create Table se foloseste pentru a crea noi tabele în SQL Server 2005.Tabelele pot fi create prin cod sau cu Enterprise Menager.

Sintaxa comenzii CREATE TABLE :

CREATE TABLE [baza_date.[proprietar.]nume_tabela1 (

nume_coloana tip_date [ Identity| restrictie |NULL|NOT NULL| Collate] […]

)

In aceasta sintaxa :

– nume_tabel este numele noului table

– tip_date este tipul datelor din coloana

– ultimul element este opțional. Se poate specifica proprietate Identiy, restricții

privind câmpul și dacã trebuie neaparat introduse valori

– Collate este opțional, aceastã proprietate permite sã se foloseasca pentru

coloana respectivã un alt atribut de colationare decât cel stabilit pentru baza de date .

In SQL Server Enterprise Menager, se poate șterge un tabel prin click dreapta pe tabelul respectiv și selectarea opțiunii Delete din meniul contextual. Un tabel mai poate fi șters și folosind Transact-SQL, acest lucru se face prin executia instructiuni Drop Table.

47

Capitolul 5. Aplicatia „ANDGest”

5.1 Descrierea aplicației

La deschiderea aplicației va apare o fereastră care conține un meniu în partea de sus, iar pe ecran un set de butoane. Atât opțiunile meniului cât și butoanele sunt grupate în patru categorii. La acționarea unui buton (sau la alegerea unei opțiuni din meniu) se va deschide fereastra de lucru corespunzătoare.

 Conectare: dupa introducerea Utilizatorului si a Parolei aplicatia se va conecta la Baza de Date. In functie de drepturile date fiecarui utilizator acesta va avea acces la anumite campuri si ferestre.

 Configurare : cele 5 butoane vor deschide ferestrele de configurare

corespunzătoare

 Documente

 Intrari : deschide fereastra de gestiune a intrărilor

 Transfer: deschide fereastra unde se fac transferurile intre gestiuni.

 Documente de Iesire : deschide fereastra de eliberare a produselor

 Raportari

 Raportări : deschide fereastra de generare a raportărilor

 Administrare

 Configurare inițială Bazei de Date : necesară doar la instalarea aplicației

Modul de lucru doar din tastatură (valabil pentru toate ferestrele aplicației) : pentru a trece la câmpul sau butonul următor se apasa pe tasta ENTER sau TAB iar pentru a reveni la campul anterior de apasa SHIFT+TAB. Pentru a apăsa pe un buton se apasă tasta SPACE. Listele care afișează informații pe coloane (de ex. Lista de afisare documente de intrare din fereastra Intrari) au facilitatea de a ordona inregistrarile (crecător sau descrescător) după oricare dintre coloane. Pentru a realiza o ordonare se apasă cu click de mouse pe antetul uneia dintre coloane.

Pentru ca operațiile de introducere a documentelor de intrare și scrierea documentelor de iesire să poată fi efectuate, trebuie introduse anumite informații în baza de date prin realizarea următoarelor configurări :

 Configurare Sistem

 Configurare Produse

 Configurare Grupe

 Configurare Gestiuni

 Configurare Furnizori

A) Fereastra Setari sistem

Dialogul permite realizarea configurărilor de sistem, specifice modului de lucru al depozitului:

48

 Informații de identificare a Magazinului:

 Denumire Magazin

 Reprezentant legal

 Localitate

 Județ

 Cod Fiscal

 Comisia de receptie [max 5 membri]

 Membri care se completeaza in cele 5 casute text din imaginea de mai sus vor fi activi in fereastra Rapoartari la sectiunea Date necesare pentru tiparirea unei receptii (comisia de receptie) fara a mai fi nevoiti sa completam de fiecare data membri comisiei la fiecare tiparire de receptie.

 Setari

 Procente TVA – reprezinta procentele TVA folosite in aplicatie. Trebuie introduse valorile separate prin ”;”. Implicit aceste valori vor fi ordonate în căsuța de selecție în ordinea introdusă aici. Dacă procentul cel mai des utilizat este de ex. 9% atunci acesta trebuie trecut primul.

 Nr. Zile afișare – reprezintă numărul de zile anterioare datei curente

utilizat ca filtru pentru afișarea documentelor de iesire, documentelor de

intrare, transferurilor

 Nr.max.poz/iesire – reprezinta numarul maxim de produse diferite acceptate pe un document de iesire.

 Optiuni pentru introducerea/afisarea datelor

 Casutele: Precizare ados comercial, Precizare discount, Precizare forma ambalare daca sunt bifate vor fi active in fereastra Intrari.

 Afisare valoare cu TVA la tiparirea receptiei – daca este bifata casuta atunci cand actionam butonul Tiparire doc. din fereastra Intrari valorile de pe factura vor fi afisa cu TVA inclus, in caz contrar vor fi fara TVA.

 Afisare data expirarii – va aparea in fereastra de Iesiri in lista gestiunilor o coloana noua in care apara data de expirare a medicamentului.

Pentru a salva datele introduse în baza de date trebuie acționat butonul Modifica.

49

B) Fereastra de configurare produse

In acest modul se definesc produsele cu care va lucra aplicatia.

Un produs deja configurat se poate sterge prin actionarea butonului Sterge iar produsul va fi sters numai in cazul in care nu au existat intrari pe el, daca au existat intrari pe acest produs atunci ne va aparea un mesaj de atentionare si nu vom putea sterge inregistrarea.

C) Fereastra de Configuarere Grupe de medicamente

Se vor configura grupele de produse folosite in aplicatie.

Pentru a adauga o noua inregistrare se va apasa butonul Nou, se vor completa denumirea

si codul grupei si se va apasa butonul Adauga. Noua inregistrare va aparea in lista. Pentru a sterge o grupa de produse se va selecta din lista si se va apasa butonul Sterge. Pentru a modifica o grupa de produse se va selecta din lista, se vor face modificarile si se va apasa butonul Modifica.

D) Fereastra de Configuarere a Gestiunilor

Definirea gestiunilor trebuie realizată înaintea introducerii documentelor de intrare sau celor de ieșire. La deschiderea ferestrei, lista din partea stânga sus conține gestiunile definite deja cu datele corespunzătoare : gestiune, tip document ieșire. La selectarea unui element din listă, informațiile referitoare la gestiunea selectată vor fi afișate în căsuțele din zona Gestiunea curentă fiind astfel disponibile pentru modificare.

50

Adăugarea unei gestiuni – pentru a adăuga o noua gestiune în baza de date, trebuie completate câmpurile : Denumire gestiune, Cod Gestiune,Tip doc ieșire celelalte campuri fiind optionale și acționat butonul Adauga.

Acționarea butonului Nou duce la deselectarea elementului din listă, inițializarea controalelor din aria Gestiune curenta și poziționarea cursorului în prima căsuță de editare.

Modificarea unei gestiuni -pentru a modifica datele referitoare la o gestiune deja definită aceasta trebuie selectată din listă. Apoi se modifică câmpurile din zona Gestiunea curenta prin editare sau selecție și se acționează butonul Modifica.

E) Fereastra de configurare a informațiilor despre furnizori

Înainte ca un furnizor să poată fi selectat în dialogul “Intrari”, acesta trebuie introdus în baza de date. Operațiile de adăugare, modificare și ștergere se efectuează similar cu cele descrise anterior.

51

Semnificația câmpurilor:

– Furnizor: denumirea furnizorului

– Cod: cod intern, unic

– Informații bancare: Cod fiscal, Banca, Cont

– Adresa: Str, Localitate, Judet, Telefon

– Date despre factura: Serie Fact

Fereastra pentru gestiunea documentelor de intrare : “Intrari”

Aceasta interfața permite utilizatorului să introducă în gestiune documentele de tip

factură, bon, aviz și medicamentele care intră în stoc pe baza acestor documente.

A) Zonele de lucru ale ferestrei

Fereastra este împarțită în următoarele zone de lucru (marcate cu chenare etichetate cu

roșu) :

1. Selectarea intervalului de afișare (stânga sus)

2. Selectarea gestiunii dorite (optional)

3. Lista documentelor de intrare și informațiile despre documentul selectat

4. Lista medicamentelor de pe documetul selectat și informațiile despre medicamentul ales din listă

5. Valoarea totală a documentului curent (stânga jos): Val totala si Val cu TVA

52

Selectarea intervalului de afișare presupune alegerea datei de început (controlul etichetat Data start) și a datei de sfârsit (Data stop). În urma acționarii butonului Afișare, se va completa lista cu documentele având data cuprinsă în intervalul specificat. Implicit, la deschiderea ferestrei data start este calculata în funcție de valoarea Nr.zile de afișare configurată în fereastra Setari sistem.

Dacă pe parcursul introducerii documentelor se dorește schimbarea intervalului, acest lucru este posibil în orice moment, însă pentru a fi realizată noua afișare trebuie acționat butonul Afisare.

Selectarea gestiunii dorite presupune filtrarea documentelor afisate in lista. Se vor afisa doar documentele care au intrat pe sectia selectata.

Lista documentelor afișează pentru fiecare document din interval următoarele informații : tipul documentului, codul, data, seria, numărul, furnizorul, valoarea totală, valoarea totală cu TVA. Codul documentului este automat atribuit de program pentru a identifica unic un document.

Pentru a vizualiza informațiile referitoare la un singur document (in căsuțele din zona marcata cu eticheta Document curent) și produsele înregistrate pe documentul respectiv, acesta trebuie selectat din listă. Selectarea se face fie prin deplasarea cu tastele sageata sus, sageată jos fie prin click de mouse asupra înregistrarii dorite. În urma selectarii, lista din partea de jos a ferestrei va afișa produsele corespunzătoare documentului.

53

Lista de produse va cuprinde informații despre toate produsele înregistrate pe documentul selectat. Prin selectarea unui produs din listă, informațiile prezente în baza de date pentru acel produs vor fi afișate în căsuțele din zona Produs curent.

Valoarea totală, cu și fără TVA, a documentului selectat va fi permanent afișata în

partea din stânga jos a ferestrei. Aceste valori vor fi automat recalculate o dată cu modificările efectuate.

B) Operațiile de adăugare, ștergere, modificare în cazul documentelor

Adăugarea unui document nou – pentru a adauga un document nou se apasa

butonul DocumentNOU. Utilizatorul trebuie să completeze câmpurile din zona Document curent cu datele dorite, acționând apoi obligatoriu butonul Adauga. În urma acestor operații noile date vor fi introduse în baza de date. Trebuie obligatoriu completate toate câmpurile colorate (în cazul adăugării unui document nou, toate sunt obligatorii).

Pentru ca furnizorul să poată fi ales din căsuța de selecție, informațiile despre furnizori trebuie introduse în prelabil în baza de date prin intermediul ferestrei Configuare furnizori. Imediat după adăugarea în baza de date, lista documentelor este reafișată incluzând și documentul nou introdus.

Restrictii privind adăugarea unui document nou :

Nu este permisă introducerea unui document având seria și numărul unuia deja introdus. Utilizatorul va fi avertizat printr-un mesaj în cazul în care un câmp din cele obligatorii a rămas necompletat sau documentul există deja în baza de date.

Modificarea unui document – se pot modifica ulterior operației de adăugare oricare dintre informațiile următoare : tip, serie, numar, data, furnizor prin selectarea documentului dorit, modificarea câmpurilor și acționarea butonului Modifica document. Dacă pentru un anumit document de intrare s-au înregistrat iesiri dintr-unul dintre produse, data documentului sau gestiunea acestuia nu mai poate fi modificată.

Ștergerea unui document – pentru a șterge un document din baza de date acesta trebuie selectat din listă. Utilizatorul poate comanda ștergerea documentului fie prin acționarea butonului Șterge fie prin acționarea tastei Delete. Nu este permisă ștergerea unui document care conține produse. Pentru a putea șterge un astfel de document trebuie șterse întâi medicamentele care îi corespund.

B) Operațiile de adăugare, ștergere, modificare în cazul produselor

Adăugarea unui produs nou – pentru a adăuga un produs nou pe documentul

selectat, utilizatorul trebuie să completeze câmpurile din zona Produs curent cu datele dorite, acționând apoi obligatoriu butonul Adauga. În urma acestor operații, noile informații vor fi introduse în baza de date. Trebuie obligatoriu completate câmpurile (in cazul adăugarii unui produs nou acestea sunt: cod produs, denumire, cantitate, pret, TVA). Nu este permisă introducerea aceluiași produs pe acelasi document de doua ori. Utilizatorul va fi avertizat printr-un mesaj în cazul în care un câmp din cele obligatorii a rămas necompletat sau dacă produsul există deja în baza de date pe documentul curent. Imediat după adăugarea în baza de date, lista produselor este reafișată incluzând și produsul nou introdus.

Căsuțele de selecție Cod produs și Denumire conțin toate medicamentele

configurate in sectiunea de Configurare Produse, utilizatorul putând alege un produs fie după cod fie după denumire. Prin tastarea primelor caractere din codul sau denumirea produsului, cursorul de selecție va fi automat poziționat pe prima înregistrare care începe cu caracaterele specificate. De exemplu, dacă se tasteaza în căsuța Cod produs

54

caracterele “123” cursorul va fi pozitionat pe medicamentul cu codul 123, lista continuând cu codurile :1230, 1231, 1232, etc.

Cantitatea : trebuie precizat numărul de unitati terapeutice

Pretul : pretul unitar pe unitatea terapeutica

TVA: trebuie ales procentul TVA din valorile configurate în fereastra Setari sistem

Butonul Produs Nou are rolul de a deselecta documentul ales din listă. Implicit

informațiile legate de acesta nu vor mai fi afișate în câmpurile marcate cu eticheta Produs

curent.

Modificarea unui produs – se pot modifica ulterior operației de adăugare oricare dintre informațiile următoare : cantitate, preț, TVA, UM2, data expirării prin selectarea produsului dorit, modificarea câmpurilor și acționarea butonului Modifica produs. Restricții privind modificarea informațiilor unui medicament :

 cantitatea minimă care poate fi precizată pentru modificare este suma cantităților eliberate din medicamentul respectiv (ex : dacă s-au eliberat 100 de unități terapeutice, cantitatea introdusa pe factură trebuie să fie mai mare sau egală cu

100)

 prețul sau TVA-ul unui produs nu poate fi modificat dacă din produsul respectiv

s-au înregistrat deja iesiri

Ștergerea unui produs – pentru a șterge un produs din baza de date acesta trebuie selectat din listă. Utilizatorul poate comanda ștergerea produsului fie prin acționarea butonului Șterge produs fie prin acționarea tastei Delete. Nu este permisă ștergerea unui produs din care s-au înregistrat iesiri.

Pentru a tipări documentul de recepție, se selectează din listă documentul de intrare dorit și se acționează butonul Tiparire doc care va deschide fereastra Raportari care în lista are afișate produsele de pe respectivul document. Acționând Tiparire se deschide fereastra de previzualizare a documentului.

Fereastra pentru Transfer intre gestiuni

Modul de lucru in aceasta fereastra este similar cu cel descrisă anterior in mare parte.

De aceea, în continuare vor fi prezentate doar aspectele care diferă.

In acesta fereastra putem face transfer intre doua gestiuni din cadrul farmaciei

folosind Bon de transfer.

55

La sectiunea Document curent avem de completat mai multe campuri:

 Tip doc – de aici vom selecta Transfer

 Serie – seria transferului, nu este obligatorie

 Numar – este numarul transferului care se doreste sa se faca

 Data – data la care se realizeaza transferul

 Gestiune sursa – gestiunea unde avem produsele sau materialele necesare

 Gestiune destinatie – gestiunea unde dorim sa transferam (sa ajunga)

produsele

In rest se va proceda la fel la la sectiunea de retete prezentata in capitolul anterior. Fereastra „Iesiri”

Zonele de lucru ale ferestrei

– Selectarea intervalului de afișare (stânga sus)

– Lista iesirilor și informațiile ce compun antetul documentului selectat

– Lista medicamentelor conținute de iesire și informațiile despre produsul din listă

– Valoare Totala

56

Intervalul de afișare

Selectarea intervalului de afișare presupune alegerea datei de început (controlul etichetat Data start) și a datei de sfârsit (Data stop). În urma acționarii butonului Afișare, se va completa lista cu rețetele având data cuprinsă în intervalul specificat. Implicit, la deschiderea ferestrei, data start este calculată în funcție de valoarea Nr.zile de afișare configurată în fereastra Setari sistem. Data luată în considerare pentru acestă filtrare este fie data eliberarii, fie data emiterii în funcție de opțiunea aleasă de utilizator prin marcarea unuia dintre butoanele de selecție aflate în dreapta zonei 1.

Dacă pe parcursul introducerii rețetelor se doreste schimbarea intervalului, acest lucru este posibil în orice moment, însă pentru a fi realizată noua afișare trebuie acționat butonul Afișare.

Antetul Documentului

Lista aflată în partea de sus a ferestrei conține toate documentele corespunzătoare intervalului selectat cu informațiile introduse de utilizator. La selectarea unuia dintre documente, controalele din zona Document curent vor afișa valorile câmpurilor din baza de date. în același timp lista de produse va conține toate produsele eliberate de pe documentul respectiv.

Câmpurile care identifică antetul documentului

1. Tipul Documentului – poate fi:

 Factura fiscala

 Bon fiscal

57

2. Seria documentului;

3. Numărul documnentului;

5. Data eliberării – reprezintă data eliberării documentului din magazin (dată ulterioară

datei de emitere)

6. Gestiune: gestiunea din care se vor scade implicit produsele scrise pe document

7. Nume: numele clientului

8. Prenume: prenumele clientului

9. CNP: codul numeric personal al clientului (la adăugarea documentului se face

verificarea de validare a CNP)

Adăugarea unui document nou

Dacă se doreste ca toate câmpurile de editare și selecție să fie goale trebuie apăsat butonul Document Nou. Dacă însă documentul care se dorește a fi introdus are majoritatea câmpurilor identice cu cel selectat, pentru a reduce numărul de informații introduse, pot fi modificate câmpurile care diferă. După ce toate câmpurile obligatorii au valorile completate se acționează butonul Adauga.

La acționarea butonului Adauga utilizatorul este avertizat în cazul în care există câmpuri obligatorii necompletate sau documentul respectiv a fost deja introdus în baza de date. În cazul în care antetul documentului este valid, rețeta este adăugată în baza de date, afișată în listă și selectată automat de către program. În acest moment operațiile permise sunt doar cele de adăugare produse sau ștergere document deoarece nu este permisă stocarea în baza de date a unui document fără produse.

Dacă se dorește adăugarea unui document a cărei date (eliberării) nu este cuprinsă în intervalul Data start-Data stop, utilizatorul este avertizat printr-un mesaj. Pentru a putea continua adăugarea documentului, trebuie selectat un interval care să cuprinda data introdusă, acționat butonul Afișare și apoi Adauga.

Modificarea unui document

Antetul unui document poate fi modificat ulterior introducerii inițiale. Operația de modificare se realizeaza prin selectarea documentului, editarea și selecția câmpurilor dorite și salvarea prin acționarea butonului Modifica document. Oricare dintre câmpuri poate fi modificat înainte de adăugarea primului produs pe document. După introducerea primului produs, următoarele modificări nu mai sunt posibile: tipul documentului și data emiterii documentului.

Ștergerea unui document este permisă doar în cazul în care în prealabil s-au sters toate produsele înregistrate pe el.

Fereastra utilizată pentru generarea raportărilor

Prin intermediul acestui dialog se pot genera raportările tipărite și genera exportul

datelor la sfârsit de lună către CAS.

1. Semnificația câmpurilor care trebuie completate :

Data start , Data stop delimiteaza intervalul de timp luat în calcul pentru raportarea care

urmeaza să fie generată.

Gestiunea : trebuie precizata în cazul generării unei balanțe

Grupa: poate fi utilizată pentru raportarea “Lista centralizata a consumurilor de materiale

-pe comenzi/ defalcata pe sectii/medici” pentru a obține consumurile pentru o anumită grupă de produse (nu este utilizată pentru nici o altă raportare).

Completarea acestor campuri e necesara doar pentru anumite raportari. Tip de raportare: Raportare

58

In aceasta sectiune se gasesc raportari pentru: Iesiri/ Receptii/ Balante/ Centralizatoare/ Consumuri/ Transferuri. Pentru a selecta mai multe gestiuni pentru o anumita raportare va aparea o fereastra intermediara.

De exemplu pentru a efectua raportarea:”Balanta centralizata pe o perioada” va aparea

urmatoarea fereastra de selectie a Gestiunior si a Surselor de Finantare:

Dupa ce s-au facut selectiile necesare si s-a apasat butonul OK raportarea va fi generata: Daca se doreste tiparirea raportarii, ea va arata astfel:

59

Capitolul 6

Concluzii Finale

Prin acest program am încercat sã pun în practicã câteva idei despre comerț, ce se poate realiza cu ușurințã prin intermediul programelor, care la ora actualã sunt destul de rãspândite în toatã lumea, putând fi folosite cu ușurințã de catre toate categoriile de vârstã, datoritã simplitãți de folosire a lor.

Folosind acest program se poate verifica oricând existența produselor și a

stocurilor, putându-se face verificarea balanțelor de gestiune și a raportãrilor de cãtre toți angajați depozitului respectiv, astfel usurându-le foarte mult munca celor ce utilizeazã acest program.

Server-ul pe care va fi pusã baza de date a acestui soft trebuie sã fie cât mai puternic din punct de vedere hardwere, acest lucru fiind foarte important deoarece se preconizeazã un numãr mare de utilizatori simultan, drepturile utilizatorilor se vor putea da în funcție de funcția pe care o ocupa in cadrul entitãți.

Softul a fost proiectat astfel încât sã poatã fi actualizat și îmbunãtãțit în continuu, având și posibilitatea de a fi extins și modificat și pentru alte categorii de entitãți cum ar fi spitatele și farmaciile, fiind adaptat pentru cerințele utilizatorilor acestor entitãți gestionari, medici, asistenți, farmaciști sau cei încredințați cu scrierea și eliberarea rețetelor sau condicelor. Ca și extindere pe viitor se mai poate face și o interfața mai prietenoasã cu utilizatorul, și mai usor de utilizat. Momentan programul poate fi folosit doar de depozitele farmaceutice, dar pe viitor se poate modifica pentru a putea fi utilizat și de farmaciile de stat sau particulare, atât cele cu circuit închis cât și cele cu circuit deschis.

Ca și o îmbunãtãtire la acest soft se prevede în viitor operativitate sporitã și mai multã atenție pentru cei care vor folosi programul, în sensul cã programul se poate adapta pentru a fi folosit și de farmaciile spitalelor și policlinicilor, utilizatorii acestui program putând fi atât medicii, cât și de asistentele care scriu condica, adicã condica poate fi scrisã de cãtre asistenta, sau de cãtre persoana desemnatã sã scrie condica și va putea fi eliberatã din farmacie, de cãtre farmacist, iar verificarea și introducerea stocului putându-se face de cãtre gestionar. Imbunãtãțirea programului pentru a putea fi folosit și de alte entitãți, în afara depozitelor de medicamente, se face prin introducerea și altor câmpurii în fereastra ieșiri cum ar fi : data emiteri, casa farmaciei, numele și parafa medicului, tipul pacientului, etc.

Ca și perspectivã de viitor se întrevede posibiliatea ca produsele din gestiune sã fie scãzute în funcție de data expirãrii, cele cu data expirãri mai micã de șase luni sã fie scãzute din gestiune înaintea celorlalte produse, precum și atențioanrea celor care folosesc programul când un produs se apropie de data de expitare.

60

Bibliografie

1. Dr. Kris Jamsa Lars Klander – Totul despre C si C++ – Manualul fundamental de programare in C si C++

2. Jeff Kent – C++ fara mistere

3. Doina Logofatu – Algoritmi fundamentali in C++. Aplicatii

4. http://www.cplusplus.com/doc/tutorial/

5. Luminita Duta – Programarea calculatoarelor in limbajul C++

6. Constantin Galatan – C++. Introducere in Standard Template Library

7. Laurent Boksenbaum – Informatica de gestiune

8. Ion Ionascu, Andrei Tiberiu Filip, Stere M – Control de gestiune

9. Tr Surcel, R Marsanu, A Reveiu, P Pocatilu, F Alecu, R Bologa – Informatica

Economica

10. Prof.univ.dr. Tr. Surcel, Prof.univ.dr. R. Marsanu, Asist.univ.dr. A. Reveiu – Bazele informaticii economice

11. Ken England, Gavin Powell – Microsoft SQL Server 2005 performance optimization and tuning handbook

12. Richard Waymire – Microsoft SQL Server 2000

13. R. Dollinger, L. Andron – Utilizarea sistemului SQL Server (SQL 7.0, SQL 2000)

14. Marin Fotache – SQL. Dialecte DB2, Oracle, PostgreSQL si SQL Server

15 Marin Fotache – Proiectarea bazelor de date. Normalizare si postnormalizare.

Implementari SQL si Oracle

16.Michel Hurnandez – Proiectarea bazelor de date

17. Felicia Ionescu – Baze de date relationare si aplicatii

61

Bibliografie

1. Dr. Kris Jamsa Lars Klander – Totul despre C si C++ – Manualul fundamental de programare in C si C++

2. Jeff Kent – C++ fara mistere

3. Doina Logofatu – Algoritmi fundamentali in C++. Aplicatii

4. http://www.cplusplus.com/doc/tutorial/

5. Luminita Duta – Programarea calculatoarelor in limbajul C++

6. Constantin Galatan – C++. Introducere in Standard Template Library

7. Laurent Boksenbaum – Informatica de gestiune

8. Ion Ionascu, Andrei Tiberiu Filip, Stere M – Control de gestiune

9. Tr Surcel, R Marsanu, A Reveiu, P Pocatilu, F Alecu, R Bologa – Informatica

Economica

10. Prof.univ.dr. Tr. Surcel, Prof.univ.dr. R. Marsanu, Asist.univ.dr. A. Reveiu – Bazele informaticii economice

11. Ken England, Gavin Powell – Microsoft SQL Server 2005 performance optimization and tuning handbook

12. Richard Waymire – Microsoft SQL Server 2000

13. R. Dollinger, L. Andron – Utilizarea sistemului SQL Server (SQL 7.0, SQL 2000)

14. Marin Fotache – SQL. Dialecte DB2, Oracle, PostgreSQL si SQL Server

15 Marin Fotache – Proiectarea bazelor de date. Normalizare si postnormalizare.

Implementari SQL si Oracle

16.Michel Hurnandez – Proiectarea bazelor de date

17. Felicia Ionescu – Baze de date relationare si aplicatii

Similar Posts