LIMBAJE DE PROGRAMARE
Capitolul 1
MODELE, METODE ŞI TEHNICI FOLOSITE ÎN ELABORAREA PROGRAMELOR 1. Definirea şi clasificarea limbajelor de programare Limba (DEX) – sistem de comunicare alcătuit din sunete articulate, specifice omului, prin care acesta îşi exprimă gândurile sau dorinţele. Noţiunea de limbaj: este definită ca un sistem pentru comunicare. Limbajele scrise folosesc simboluri (care sunt caractere) pentru a construi cuvinte. Întreg setul de cuvinte formează vocabularul limbajului. Modul în care cuvintele pot fi combinate pentru a fi înţelese este definit de sintaxa şi gramatica limbajului. Sensul dat de cuvinte sau combinaţii de cuvinte este definit de semantica limbajului. În domeniul computerelor, limbajele umane sunt denumite limbaje naturale. Din nefericire computerele nu sunt de ajuns de sofisticate pentru a înţelege limbajele naturale. Prin urmare comunicarea cu computerele se face prin intermediul unor limbaje specifice computerelor denumite limbaje de programare. Limbajele de programare sunt sisteme convenţionale (limbaje artificiale) create de om şi care servesc la exprimarea sub formă de acţiuni executabile mijlocit sau nemijlocit de către sistemul de calcul a algoritmului sau logicii de rezolvare a unei probleme. Noţiunea de limbaj de programare: este definită ca fiind ansamblul format de un vocabular şi un set de reguli gramaticale, necesar instruirii unui computer pentru a realiza anumite activităţi. Altfel spus limbajul de programare este o notaţie sistematică prin care se descrie un proces de calcul. Orice limbaj (natural sau artificial) presupune definirea sintaxei, semanticii şi pragmaticii lui. Sintaxa este un set de reguli ce guvernează alcătuirea propoziţiilor dintr-un limbaj. În cazul limbajelor de programare echivalentul propoziţiei este programul. Semantica este un set de reguli ce determină „înţelesul” sau semnificaţia propoziţiilor într-un limbaj. Pragmatica indică utilitatea practică a limbajului )uşurinţa utilizării, independenţa de sistemul de calcul etc.) După modul cum au evoluat în timp limbajele de programare pot fi: • limbaje de prima generaţie: limbajul maşină (machine language); • limbaje de generaţia a doua: limbajul de asamblare (assembly language); • limbaje de generaţia a treia: limbajele de înalt nivel (high-level programming languages); • limbaje de generaţia a 4-a : limbaje mai apropiate de limbajul uman decât limbajele de înalt nivel;
•
limbaje de generaţia a 5-a – îndreptate spre exploatarea bazelor de cunoştinţe , crearea sistemelor expert şi spre rezolvarea problemelor legate de inteligenţa artificială.
Limbajul maşină Reprezintă nivelul cel mai elementar al limbajelor de programare. Când un computer urmează instrucţiunile unui program se spune că programul este în execuţie (running). Înainte de a fi executat programul trebuie să fir rezident în memorie.. Adică programul trebuie să ocupe un set de bytes consecutivi în memorie. Totodată programul trebuie scris într-un limbaj maşină intern. Fiecare tip de procesor are propriul limbaj maşină. Acesta este conceptul de bază cu privire la modul de execuţie a unui program. Faptul că programul ce se execută este stocat (chiar şi parţial) în memoria principală (RAM) duce la concluzia că numai prin schimbarea programului din memoria RAM computerul poate trece la execuţia altui proces (task)/program. Aşa cum s-a prezentat mai sus toate computerele au un limbaj maşină intern (specific tipului de procesor). Acest limbaj este codat într-o reprezentare binară şi este foarte greoi (plictisitor) de utilizat pentru scrierea unui program. Majoritatea instrucţiunilor programului vor conţine astfel două părţi: • o parte care se referă la operaţia de codare – se vor indica ordinea operaţiilor; • o parte care se referă la adresa din meorie - indică locaţia de memorie ce se va utiliza ca operand al instrucţiunii. operation address meaning code 00010101 10100001 load c(129) into accumulator 00010111 10100010 add c(130) to accumulator 00010110 10100011 store c(accumulator) in location 131 Astfel programatorii care utilizează limbajul maşină vor trebuie să fie atenţi în ce zone de memorie se vor stoca date şi în ce zone de memorie se vor executa programele (instrucţiunile). Astfel pot apărea erori de programare datorate suprapunerii scrierii instrucţiunilor peste date. Prin urmare programarea în limbaj maşină presupune o bună capacitate de a interpreta datele şi instrucţiunile la nivel de bit. Totodată aceasta reprezintă si posibilitatea de a se genera alte programe şi de a le executa. Concluzii: • este limbajul pe care computerul îl înţelege în mod direct; • în limbajul maşină programele se scriu în cod binar: succesiuni de 0 şi 1; • fiecare instrucţiune din limbajul maşină este o combinaţie de 4 bits (LOAD-0000; ADD-0001); • programatorul trebuie să cunoască detaliat structura hardware a computerului; • programatorul trebuie să gestioneze fără greşeală alocarea adreselor de memorie pentru un program; 3
•
pot apărea multe erori datorită: concepţiei programului, sintaxei, suprapunerii adreselor de memorie, etc.
Limbajul de asamblare Permite folosirea codurilor simbolice pentru adrese, date şi operaţii. Atenţia necesară evitării ocupării aceloraşi adrese de memorie este foarte solicitantă (greoaie) în programarea în limbaj maşină. Astfel dacă programatorul modifică un program şi decide să mai introducă ceva atunci toate celelalte adrese de memorie utilizate până atunci se vor schimba şi trebuie să examineze întregul program din nou şi să decidă iarăşi cu privire la modul cum va aloca memoria datelor şi instrucţiunilor. Astfel au apărut începând cu 1950 limbajele de asamblare care sunt forme mai prietenoase ale limbajului maşină. Astfel comenzile limbajului maşină au fot înlocuite de comenzi mnemonice (gestionează memoria!!! – nu e foarte ortodoxă). Astfel limbajul de asamblare are grijă să convertească comenzile mnemonice în comenzile corespunzătoare limbajului maşină. Programatorul poate folosi adrese simbolice pentru reprezentarea datelor. Acest limbaj va atribui adresele în limbaj maşină şi va verifica dacă datele distincte nu se suprapun la stocare. Astfel scurtul program de mai sus se poate scrie în limbaj de asamblare astfel: Operation address code LOAD A ADD B STORE C Evident acest limbaj evită o multitudine de erori de alocare a memoriei. Limbajul de asamblare presupune existenţa unui program numit assembler (asamblor) care să traducă programele în limbaj maşină. Asamblorul înlocuieşte codarea mnemonica (cum ar fi ADD) cu coduri binare corespunzătoare limbajului maşină şi alocă adrese de memorie pentru toate variabilele simbolice utilizate (A, B, C ) şi se asigură că aceste adrese sunt distincte. Astfel prin uşurarea procesului de programare s-a introdus un nou nivel de procesare pentru computer. Astăzi limbajele de asamblare sunt încă utilizate pentru unele programe critice deoarece aceste limbaje conferă programatorului un control foarte precis a ceea ce se întâmplă în computer. Limbajele de programare încă necesită ca programatorul să aibă foarte bune cunoştinţe cu privire la structura internă a computerului. Limbajele de asamblare sunt şi ele specifice computerului pe care rulează astfel că programatorul trebuie sa-şi rescrie programul pentru un alt tip de computer. Concluzii: • programele se scriu în mod text pentru ca apoi sa fie traduse intr-o formă binară corespunzătoare limbajului maşină; • limbajul de asamblare este tradus în limbaj maşină de către assembler; operaţia se numeşte asamblare; 4
• •
limbajele de asamblare încă solicită programatorului cunoaşterea de multe detalii hardware; sunt specifice anumitor tipuri de computere; limbajul de asamblare împreună cu limbajul maşină formează categoria limbajelor de nivel scăzut (lowlevel languages).
Limbajele evoluate (High level Languages) Evident că de la apariţia computerului tot s-a pus problema de a se obţine un proces de programare cât mai uşor. Aceasta ar presupune ca activitatea de programare sa se poată face cu un bagaj de cunoştinţe cu privire la funcţionarea internă a computerului cât mai mic. După cum s-a văzut anterior limbajul maşină şi limbajul de asamblare presupune o bună cunoaşterea funcţionării interne a computerului. O altă direcţie pentru uşurarea programării ar fi aceea ca programele să fie prezentate într-o limbă cât mai familiară persoanei care doreşte să programeze (să rezolve o anumită problemă). Astfel au apărut programarea de înalt nivel care permite formularea soluţiilor problemei de rezolvat în termeni mai apropiaţi de cei folosiţi de oameni. Aceste limbaje au fost concepute pentru a permite programării să fie mult mai uşoară şi cu mai puţine erori iar programatorul nu trebuie să cunoască detalii cu privire la structura internă a unui anumit tip de computer. Aceste limbaje sunt mult mai apropiate de limbajul uman. Primul limbaj evoluat a fost FORTRAN II apărut în 1958. Programul prezentat mai sus se poate scrie în acest limbaj astfel: C=A+B Se observă că spre deosebire de limbajul maşină şi limbajul de asamblare expresia de mai sus este mul mai uşor de înţeles, mai rapid de scris şi evită multe erori de scriere. Pentru a putea fi executate, ca şi în cazul limbajului de asamblare, computerul nu înţelege în mod direct aceste limbaje evolute şi de aceea ele trebuie procesate printr-un program specializat care traduce limbajele evolute în limbajul maşină intern al computerului respectiv. Instrucţiunile în limbajele evoluate se numesc enunţuri şi se aseamănă mult cu limbajul uman sau cu convenţiile de scriere în matematică. După modul cum se face această transpunere a programelor evoluate există două tipuri de astfel de programe specializate: • interpretor: traduce succesiv instrucţiunile de înalt nivel într-o formă intermediară care este apoi executată. • compiler (compilator): traduce instrucţiunile de înalt nivel direct în limbaj maşină. Avantajul interpretorului este că poate execută un program imediat. Compilatorul necesită mai mult timp. Programele produse de compilator rulează mul mai rapid decât cele produse de interpretor.
5
Majoritatea programelor evolute au la dispoziţie atât compilator cât şi interpretor. De obicei interpretorul se foloseşte în timpul realizării unui program pentru testarea unor mici secţiuni ale programului. Unele limbaje evoluate sunt concepute să lucreze numai cu interpretor (BASIC, LISP). Un alt mare avantaj al limbajelor evoluate este acela că dacă limbajele sunt standardizate atunci fiecare producător de computere (procesoare) va putea să realizeze compilatorul care să respecte standardele şi să traducă programele în limbajul maşină specific producătorului. Astfel devine posibil ca un program, respectându-se aceste standarde, să poată fi compilat pe diverse computere şi apoi executat. Prin scrierea unui program într-un limbaj evoluat se face o economie imensă de timp. Astfel programatorul pierde mai puţin timp pentru scrierea într-un limbaj mult mai apropiat de cel uman decât dacă acelaşi program ar fi scris în limbaj maşină. Timpul de compilare al programului este de ordinul secundelor.
Generatia a 4-a cuprinde limbajele orientate către utilizatorii finali. Folosind aceste limbaje, utilizatorii neinformaticieni pot să-şi rezolve singuri propriile probleme, dialogând cu calculatorul. Se elimină etapa de programare şi se asigură o implicare şi un interes mai mare din partea utilizatorului. Majoritatea specialiştilor grupează limbajele din generaţia a 4-a în următoarele produse: • limbaje de interogare (SQL) • generatoare de rapoarte (Easytrieve Plus, Datatrieve, Mark V. etc) • generatoare de aplicaţii şi/sau proiecte (FOCUS, Mantis, Natural, NOMAD2, IDEAL MAPPER, pachete de aplicaţii – DeskTop Publishing) • generatoare de grafice (independente – Tell-al graph, SAS, ADRS/B6 încorporate în spreadsheet-uri LOTUS, EXCEL, QUATTRO, încorporate în SGBD - FoxGraph); • instrumente de sprijinire a deciziilor ( programe de calcul tabelar-Quattro, Lotus, Excel sau pachete program statistice – SPSS, SAS etc)
Generatia a 5-a cuprinde limbajele care sunt sau vor fi îndreptate spre exploatarea bazelor de cunoştinţe, crearea sistemelor expert şi mai general spre rezolvarea problemelor legate de inteligenţă artificială. Un rol deosebit revine limbajelor pentru programarea orientată pe obiecte (Samlltalk, C++, MANDALA, LISP, PROLOG). Folosind alt criteriu de clasificare – modalitatea de descriere a problemei de rezolvat, limbajele de programare pot fi grupate în: • Limbaje procedurale • Limbaje neprocedurale Limbajele procedurale descriu pas cu pas algoritmii de rezolvare a unei probleme. În această categorie se înscriu limbaje de nivel înalt ca BASIC, COBOL, FORTRAN, PASCLA, etc. Limbajele neproce4durale sunt limbaje de nivel foarte înalt care definesc scopul urmărit fără a da detalii asupra modului de rezolvare a acestuia. Din această categorie fac parte Smalltalk, Prolog etc. J.E. Sammet împarte limbajele în: • Limbaje procedurale (LP), de nivel înalt, numite şi limbaje algoritimice folosite pentru descrierea algoritmică printr-un set ordonat de instrucţiuni;
6
• • •
Limbaje neprocedurale (LNP), de nivel foarte înalt, în care succesiunea instrucţiunilor din program nu influenţează decât în foarte mică măsură succesiunea execuţiei; Limbaje specializate orientate pe problemă/aplicaţie, limbaje cu caracter neprocedural, bazate pe o mulţime de funcţii ce pot fi referite explicit; Limbaje conversaţionale, care asigură dialogul utilizator-sistem pe parcursul execuţiei unui program.
2. Metode şi tehnici de programare 2.1. Programe şi produse program – definire şi clasificare Programul reprezintă totalitatea instrucţiunilor şi/sau comenzilor pregătite şi ordonate în prealabil conform unei logici prestabilite, stocate în memoria calculatorului şi utilizate pentru rezolvarea unei anumite probleme. Ansamblul activităţilor de concepere, dezvoltare şi întreţinere a programelor se numeşte programare. Conceptul de program sau produs – program desemnează atât programul propriu-zis cât şi operaţiile manuale şi documentaţia necesare pentru dezvoltarea, utilizarea şi întreţinerea lui. Programele pot fi grupate în: • Programe de bază – ce servesc ca interfaţă logică între resursele sistemului informatic şi programele de aplicaţii; • Programele aplicative – ce se compun din programe care coordonează calculatorul în execuţia/realizarea sarcinilor precise de prelucrare a datelor conform cerinţelor utilizatorului final. Pe piaţa programelor informatice sunt profilate două tendinţe: • Cumpărarea de către utilizatorii finali, direct de la furnizori, a programelor „la cheie”, ce folosesc limbaje conversaţionale şi naturale şi care pot fi folosite pe o gamă largă de calculatoare; • Abandonarea, în activitatea de programare, a limbajelor tehnice şi a limbajelor procedurale, în favoarea limbajelor neprocedurale şi a celor naturale, care se apropie de limbajul uman. Există mai multe metode de elaborare a produselor program. Caracteristicile principale ale acestor metode se regăsesc în metodele şi tehnicile utilizate şi în prezent.
2.2. Metoda programării clasice Prin programarea clasică se face referire la primii ani de dezvoltare a programelor, respectiv începutul anilor ’50, perioadă în care existau puţine reguli, majoritatea vizând scrierea programelor. De aceea, programarea clasică este impropriu numită metodă, însă se face delimitarea de evoluţiile ulterioare din domeniul programării calculatoarelor. Programarea clasică presupune conceperea monolitică a programului prin parcurgerea unor etape1: 1
Grama, A., Filip, M., Medii de programare in economie, Editura Sedcom Libris, Iaşi, 2000
7
• analiza problemei în vederea stabilirii exacte a cerinţelor informaţionale ale utilizatorilor; • elaborarea schemei logice a programului; • scrierea programului sursă; • compilarea şi ansamblarea programului; • testarea şi corectarea programului; • exploatarea programului. Dezvoltarea programelor în această perioadă prezenta o serie de neajunsuri dintre care mai importante erau: elaborarea intuitivă sau artizanală a algoritmilor de rezolvare a problemei; existenţa numeroaselor operaţii de salt (instrucţiuni GOTO) ce conduc la un timp mare de execuţie a programului şi fac dificilă înţelegerea programului şi modificarea acestuia, chiar dacă acesta dispune de documentaţie; imposibilitatea desfăşurării activităţii de programare în echipă; ineficienţa şi slaba productivitate a activităţii de programare, mai ales în cazul programelor mai mari etc. Acestea sunt doar câteva din motivele care au determinat progrmatorii să identifice şi să formuleze reguli care să-i ghideze în activitatea lor şi care au condus la apariţia unor metode de programare.
2.3. Metoda programării modulare Programarea modulară poate fi considerată prima metodă de programare propriu-zisă. Premisele apariţiei ei au fost create odată cu apariţia limbajului FORTRAN, care oferea posibilitatea utilizării subprogramelor şi compilării lor separate. Compilarea separată a dus la apariţia bibliotecilor de subprograme. Programarea modulară este o metodă de concepere a programelor care presupune descompunerea problemei de rezolvat în mai multe subprobleme mai simple, conform preceptelor gândirii carteziene: orice problemă, oricât de complexă ar fi, poate fi descompusă în subprobleme rezolvabile mai uşor decât problema iniţială. În acest mod, programatorii se pot concentra numai asupra unei subprobleme, considerând-o ca o problemă de sine stătătoare, dar care este mai simplă şi mai uşor de rezolvat. Trebuie remarcat deja interesul pentru instituirea de reguli în conceperea programelor şi nu doar pentru scrierea programelor, precum şi considerarea lor ca activităţi independente; proiectarea modulelor programului se face independent de limbajul de programare ales, doar la scrierea programelor ţinându-se cont de specificul fiecărui limbaj. Fiecărei subprobleme îi va corespunde, în principiu, un modul de program, iar produsul-program va fi constituit prin integrarea modulelor componente, dezvoltate separat. De aici derivă şi numele metodei – programarea modulară. Modulul este considerat o unitate structurală de sine stătătoare, fie program, fie subprogram, fie o unitate de program2. Un modul poate fi format, la rândul său, din mai multe module. Modulele sunt relativ independente, ceea ce înseamnă că modificarea unui modul nu implică neapărat modificarea celorlalte module. Astfel, în cazul modificării structurii unui program, dacă funcţia pe care o realizează un modul nu este afectată, atunci acel modul va fi utilizat în continuare fără modificări. În fapt, obiectivul principal urmărit la proiectarea modulelor constă în identificarea unor module cât mai generale şi mai independente între ele, care să permită reutilizarea lor în cazul modificării programelor. De asemenea, modulele pot comunica între ele prin transmiterea de date. 2
Frenţiu, M., Pârv, B., Elaborarea programelor. Metode şi tehnici moderne, Editura Promedia, 1994
8
Fiecare modul are rolul său bine precizat şi realizează o funcţie în cadrul întregului program, în conformitate cu rezultatele descompunerii funcţionale a problemei de rezolvat, realizată prin aplicarea strategiei descendente (“top-down”). De fapt, din abordarea modulară s-a desprins şcoala descompunerii funcţionale 3. Metoda presupune identificarea funcţiilor pe care le va realiza programul în vederea rezolvării problemei, asocierea unui modul pentru una sau mai multe din funcţiile identificate, stabilirea legăturilor dintre module, obţinându-se astfel structura programului. După ce structura programului este clar definită, se trece la transpunerea modulelor în construcţii sintactice specifice limbajului de programare ales (scrierea programelor-sursă), compilarea acestora şi realizarea celorlalte faze necesare obţinerii programelor executabile. Avantajele programării modulare sunt multiple, printre cele mai importante se numără: • creşterea calităţii programelor obţinute; ele conţin mai puţine erori, sunt mai uşor de înţeles şi de modificat. • Sporirea productivităţii şi eficienţei în activitatea de programare, prin facilitarea lucrului în echipă şi utilizarea bibliotecilor de subprograme. • Uşurarea testării programului prin efectuarea unei testări la nivelul modulelor. • Obţinerea unor produse-program extensibile, ceea ce permite adăugarea unor noi module în programul existent dacă ulterior se doreşte realizarea unei noi funcţii.
2.4. Metoda programării structurate Metoda programării structurate reprezintă o dezvoltare a metodei programării modulare prin introducerea unor noi principii, instrumente şi tehnici, cu scopul unei mai bune stăpâniri a complexităţii programelor mari. Complexitatea programului priveşte dificultatea elaborării produselor-program odată cu creşterea dimensiunii acestora. Complexitatea programelor creşte exponenţial şi nu liniar cu dimensiunea sa. De aceea, obiectivul principal al programării structurate a fost acela de a introduce ordine şi rigoare în elaborarea de produse-program, ca o cale de stăpânire a complexităţii. Fără a intra în detalii, să spunem că până în prezent metoda programării structurate a reuşit să realizeze doar parţial obiectivul propus. Principiile programării structurate au fost introduse de Bohm şi Jacopini în 1966, atunci când ei au demonstrat că pentru a exprima logica internă a oricărui program sunt suficiente trei tipuri de structuri de control: structura secvenţială, structura alternativă şi structura repetitivă, iar fiecare din aceste structuri, ca parte dintr-un program, are o singură intrare şi o singură ieşire. Prin umare, programarea structurată ar putea fi definită ca programarea fără instrucţiunea GOTO. Programarea structurată a fost consacrată la începutul anilor ’70 prin contribuţiile a numeroşi autori: Dijkstra, Hoare, Mills, Baker, Wirth, Dahl, Warnier etc. În această perioadă, aplicarea tehnicilor structurate era limitată la activitatea de scriere a programelor, urmărindu-se oferirea unor soluţii la următoarele probleme: Cum ar trebui să arate un program? Care este legătura dintre structura statică şi structura dinamică a unui program? Cum poate fi controlată complexitatea unui program atunci când mărimea lui creşte? 3
Oprea, D., Analiza şi proiectarea sistemelor informaţionale economice, Editura Polirom, Iaşi, 1999
9
Un alt obiectiv urmărit în programarea structurată priveşte modul de scriere a unui program astfel încât el să fie uşor de înţeles şi modificat. Claritatea unui program poate fi obţinută, în afara utilizării celor trei structuri de control fundamentale, prin respectarea următoarelor două reguli: • scrierea indentată a textului programului şi • inserarea de comentarii în textul programului. Metoda programării structurate a evoluat continuu, în sensul introducerii disciplinei nu doar în scrierea programelor, ci şi în celelalte faze ale elaborării programelor: analiza, proiectarea, testarea etc. Astfel, programarea structurată poate fi definită într-un sens restrâns şi unul larg4. În sens restrâns, programarea structurată face referire la activitatea de codificare (scriere a programelor) şi reprezintă o metodă de construire a programelor în conformitate cu un set de reguli care solicită utilizarea unui format strict, a structurilor de control standard şi a unui set de construcţii logice. În sens larg, programarea structurată reprezintă o metodologie care impune disciplină asupra formei programelor, în analiza, proiectarea, scrierea şi testarea programelor; ea este o metodologie de programare pentru construirea de programe modulare, ordonate ierarhic, prin utilizarea structurilor de control standard. Astăzi, prin programare structurată se face referire la sensul său larg, motiv pentru care se vorbeşte de filozofia structurată. În concluzie, meritul principal al tehnicilor structurate este acela de a fi preluat toate practicile şi experienţele acumulate în programare şi de a le fi formalizat şi standardizat. Programarea structurată preia principiile programării modulare pe care le dezvoltă, dar se deosebeşte de aceasta cel puţin prin două aspecte: • modularizarea ierarhică a programelor şi • utilizarea structurilor de control fundamentale. Avantajele oferite de metoda programării structurate sunt numeroase, reţinând în continuare doar câteva dintre acestea: • creşterea calităţii programelor; • sporirea flexibilităţii programelor, ceea ce uşurează întreţinerea lor; • organizarea raţională a întregului proces de dezvoltare a programelor; • creşterea productivităţii în dezvoltarea programelor de aplicaţie prin specializarea activităţilor.
2.5. Metoda programării orientată-obiect Programarea orientată-obiect pune în centrul atenţiei noţiunea de obiect, considerată drept o entitate care se poate distinge de alte entităţi şi care are o semnificaţie în contextul aplicaţiei modelate. Obiectul asociază datele şi prelucrările în cadrul aceleiaşi entităţi, rămânând vizibilă doar interfaţa obiectului. Obiectele cu proprietăţi similare, comportament similar şi relaţii similare faţă de alte obiecte constituie o clasă de obiecte. Un obiect comportă un aspect static, reprezentat prin intermediul unor variabile de stare numite atribute şi un aspect dinamic, reprezentat de comportamentul obiectului şi implementat prin intermediul metodelor asociate obiectului respectiv. Aspectul static este ascuns de aspectul dinamic. În acest fel, abordarea orientatăobiect se distinge de abordarea structurată. În locul unei structurări separate a datelor şi a funcţiilor (reprezentate de prelucrări), se modelează entităţi active formate din structuri de date ascunse de funcţii. Un program este privit într-o manieră globală, 4
Martin, J., McClure, C., Op. cit., pp. 41-42
10
ca un ansamblu de obiecte care interacţionează prin intermediul mesajelor, fiecare obiect având asociat propriul set de operaţii. Obiectul, în viziunea programării orientate-obiect, are următoarele caracteristici: • identitate: obiectul este o entitate discretă care poate fi distinsă de alte entităţi; • clasificare: obiectele cu aceleaşi atribute şi operaţii sunt grupate în clase, iar un obiect este considerat o instanţă a clasei din care face parte; • polimorfism: aceeaşi operaţie poate avea comportament diferit în funcţie de obiectul la care este ataşată, implementarea concretă a unei operaţii într-o anumită clasă numindu-se metodă; • moştenire: atributele şi operaţiile se transmit de la o clasă la alta de-a lungul unei relaţii ierarhice. Pentru transmiterea similarităţilor de la o clasă de obiecte la alta, în condiţiile păstrării diferenţelor între acestea, se utilizează generalizarea şi moştenirea. Generalizarea este relaţia dintre o clasă şi una sau mai multe versiuni rafinate ale ei, în care clasa care se rafinează se numeşte superclasă, iar fiecare versiune mai rafinată se numeşte subclasă. Atributele şi operaţiile comune sunt grupate în superclasă şi se spune că sunt moştenite de subclase. Punctele forte ale abordării orientată-obiect constau în capacitatea de a modela obiecte complexe, de a exprima într-o manieră integrată dinamica obiectelor, încapsularea acestor obiecte pentru a ascunde implementarea lor, posibilitatea reutilizării unor componente ale produsului-program. Punctele slabe sunt reprezentarea monolitică a aplicaţiilor, ceea ce nu corespunde cu adevărat percepţiei ce o avem asupra realităţii şi marele efort de abstractizare. Preceptele abordării orientată-obiect au fost aplicate cu succes mai întâi în domeniul programării, iar de la începutul anilor ’90, ca şi în cazul tehnicilor structurate, s-au accentuat preocupările specialiştilor pentru implementarea lor şi în celelalte faze ale elaborării programelor. În consecinţă, au apărut mai multe metode orientate-obiect de relizare a produselor-program. În vederea simplificării procesului de dezvoltare a programelor prin abordarea orientată-obiect, s-au înregistrat numeroase preocupări de integrare a diferitelor metode orientate-obiect existente. Dintre aceste încercări, cea mai cunoscută şi mai reuşită s-a concretizat în standardul UML (Unified Modeling Language). UML a rezultat prin integrarea a trei din cele mai cunoscute metode orientate-obiect: OOD (Object Oriented Design) propusă de Booch, OMT (Object Modelling Technique) propusă de Rambaugh şi OOSE (Object-Oriented Software Engineering) propusă de Jacobson. În 1996, OMG – Object Management Group şi-a manifestat interesul pentru rezultatele muncii celor trei autori, în vederea adoptării UML ca standard în modelarea orientată obiect. În urma colaborării şi cu alţi specialişti din domeniu, UML a fost adoptat ca standard OMG în septembrie 1997, fiind astfel utilizat de majoritatea producătorilor de instrumente de dezvoltare a sistemelor informatice şi specialişti în domeniu. OMG şi-a asumat responsabilitatea dezvoltării ulterioare a standardului UML.
2.6. Programarea vizuală Complexitatea mediilor de dezvoltare a aplicaţiilor şi bariera artificială ce se interpune între programator şi aplicaţii sunt doar două impedimente pe care le elimină programarea vizuală. În plus, uşurinţa de învăţare şi exploatare a limbajelor constituie
11
un argument hotărâtor în favoarea programării vizuale. Obiectivul declarat al acesteia este ca programarea să devină mai uşoară pentru programatori şi mai accesibilă nespecialiştilor, indiferent de destinaţia limbajului: proiectarea rapidă a aplicaţiilor, prototipizare, simulări etc. În oricare domeniu, limbajele vizuale trebuie să permită utilizatorului să se concentreze asupra problemei ce o are de rezolvat şi mai puţin asupra limbajului de programare propriu-zis Notaţiile vizuale au fost utilizate, practic, de la apariţia programării, ele devenind treptat tot mai complexe. Programatorii au înţeles facilităţiile şi puterea pe care le conferă notaţiile vizuale, mai ales în contextul tehnologiilor tot mai sofisticate. În mod natural, oamenii se raportează la lumea reală în mod grafic, iar imaginile se constituie ca şi componentă principală a gândirii creative. În aceste condiţii, limbajele de programare textuale s-au dovedit destul de dificil de învăţat pentru oameni dealtfel creativi şi inteligenţi. Prin reducerea sau eliminarea completă a necesităţii de a traduce ideile vizuale în reprezentări textuale, uneori artificiale, devine posibilă atenuarea curbei de învăţare a unui limbaj de programare. Programarea vizuală îmbracă mai multe forme şi acoperă o arie largă de aplicaţii, de unde şi diversitatea opiniilor şi a punctelor de vedere. Astfel, unii specialişti consideră că acest concept a apărut odată cu mediile de programare precum Visual Basic sau Visual C++. Pentru alţii, Visual Basic este nereprezentativ pentru domeniul vast al tehnologiilor care poartă eticheta vizual. Ei consideră că programare vizuală înseamnă Prograph (Pictorius), Visual AppBuilder (Novell) sau Parts (Digitalk). Nu există o definiţie unanim acceptată pentru programarea vizuală, dar majoritatea specialiştilor sunt de acord că este limbaj de programare vizuală acela care-şi realizează toate sarcinile de programare într-o manieră vizuală, fără a face uz de reprezentarea textuală. O definiţie frecvent citată consideră că programarea vizuală înseamnă utilizarea de expresii vizuale (grafice, icon-uri, desene) în procesul de programare5. Mai este întâlnit în literatura de specialitate termenul de programare vizuală pură care are în vedere modul de proiectare al unui program, prin operare directă asupra unui set de elemente grafice. Operarea directă se realizează prin intermediul unor tehnici de interacţiune, iar programul se dezvoltă fără a scrie instrucţiuni sub formă de text. Pentru Visual Basic şi altele asemenea există noţiunea de limbaje de programare transformate vizual, care au implementate anumite tehnici de reprezentare vizuală a informaţiilor, ce se suprapun unor limbaje textuale6. Un alt concept este cel al mediilor de programare vizuală, definite de unii autori ca şi mediile în care sunt implementate limbajele de programare vizuală. În alte opinii, mediile de programare vizuală (Visual Programming Environment) asigură dezvoltarea rapidă a aplicaţiilor (RAD – Rapid Application Development). Ele se caracterizează printr-un grad ridicat de utilizare a elementelor grafice şi sunt utilizate în scopul accelerării dezvoltării şi distribuţiei aplicaţiilor, motiv pentru care sunt denumite şi medii de dezvoltare vizuală a aplicaţiilor. Ar fi poate utilă o separare între aceste două concepte – limbaje de programare vizuală şi medii de programare vizuală. Primul are în vedere limbajele care se sprijină pe tehnicile vizuale pe întreg parcursul procesului de programare: proiectarea, testarea, depanarea şi execuţia se realizează în acelaşi mediu vizual. Mediul de Shu, N.C., Visual Programming Languages: A Perspective and Dimensional Analysis, International Symposium on New Directions in Computing, Norway, 1985 6 Menzies, T., Evaluation Issues for Visual Programming Languages, www.cse.unsw.edu.au 5
12
programare vizuală lucrează adesea cu reprezentări vizuale suprapuse elementelor textuale. Cele mai des întâlnite în practică sunt limbajele de proiectare a interfeţelor grafice care, combinate cu elemente textuale sunt utilizate în proiectarea de aplicaţii. Caracteristicile programării vizuale, care se concretizează în simplificarea şi optimizarea procesului de programare din punct de vedere al timpului necesar construirii aplicaţiei au transformat mediul de programare vizuală într-un mediu RAD. În categoria mediilor RAD se încadrează: Visual Basic, Visual FoxPro şi Visual C + + (Microsoft), Delphi (Borland), Visual Objects (Computer Associates), PowerObjects (Oracle), Power Builder (Power Software), SQL Windows (Gupta), VisualAge (IBM). Liderul pieţei RAD este Visual Basic, produs de Microsoft. Cei de la Microsoft au observat la timp apariţia unei noi categorii de utilizatori, numită generic power users. Aceasta a derivat din cea a utilizatorilor finali şi poate fi numită “utilizatori finali avansaţi” care, fără a fi profesionişti, au acumulat suficiente cunoştinţe şi îşi pot rezolva singuri o bună parte din problemele curente folosind aceste medii de programare. Într-un mediu de dezvoltare vizuală se cuprind7: • mediul de lucru integrat, care asigură dezvoltarea aplicaţiei şi permite accesul la toate componentele unei aplicaţii; • instrumente vizuale de descriere a interfeţei, folosite pentru a defini form-uri, ferestre de dialog, machete de rapoarte etc. Plasarea controalelor se face prin drag&drop, iar definirea proprietăţilor printr-un “inspector de obiecte”; • limbajul de programare, care este în continuare necesar, în ciuda tuturor facilităţilor vizuale oferite de aceste medii de lucru. Acesta este mai mult sau mai puţin orientat obiect (exemple: diverse variante de Basic, Pascal, limbaje xBase, SmallTalk); • suportul pentru conectarea la diferite surse de date conectivitatea prin ODBC (Open DataBase Connectivity) este cea mai frecvent întâlnită; • componentele vizează obţinerea unui spor de productivitate în dezvoltarea aplicaţiilor şi se referă la două aspecte: utilizarea de componente prefabricate şi reutilizarea codului de la o aplicaţie la alta; • suportul pentru activităţile specifice distribuţiei (compilarea aplicaţiei, realizarea discurilor de instalare, a documentaţiei etc.). Figura de mai jos ilustrează o parte dintr-o aplicaţie scrisă în Visual Basic. Se observă că este vorba despre o fereastră intitulată CALCUL AMORTIZARE, ceea ce indică scopul utilizării ei. Ea poartă numele de form, termen întâlnit la noi şi ca formular sau chiar formă. Form-ul reprezintă zona principală de lucru, o aplicaţie constând de regulă din mai multe form-uri, legate între ele în funcţie de logica ei. Practic, întreaga aplicaţie se desfăşoară în limitele form-urilor, pe care sunt plasate diverse componente ce au ataşate secvenţe de cod. Aşa cum se observă în figură, astfel de componente sunt: casetele de text (text box), etichete (label), butoane de comandă (command button). Ele sunt denumite generic controale (în engl. controls) şi sunt de fapt obiecte, descrise printr-o parte statică (descriptivă) şi una dinamică. Numărul lor este extrem de mare, în fiecare mediu de dezvoltare existând posibilitatea de a lucra şi cu 7
Sârbu, M., Dezvoltarea rapidă a aplicaţiilor, în Byte, nr. 10/1995, pp. 75-77
13
controale externe (numite third-party components, deoarece pot fi create de alte firme şi înglobate în aplicaţii). În fine, trebuie precizat aici că însăşi form-ul este tratat ca un obiect, având toate caracteristicile care sunt descrise în continuare. Ca şi obiect programabil, un control este definit în primul rând printr-un ansamblu de proprietăţi. O proprietate poate fi definită ca un atribut nominalizat al unui obiect programabil. Proprietăţile definesc atât caracteristicile unui obiect (dimensiune, culoare, poziţie pe ecran), cât şi modul în care se comportă un obiect (de exemplu, un obiect poate fi la un moment dat, activ sau inactiv, sau poate fi afişat pe form sau ascuns). Orice proprietate a unui obiect are o valoare care se poate modifica la proiectare şi/sau execuţie. form-ul etichete
casete de text
butoane de comandă
Form-ul CALCUL AMORTIZARE, realizat în Visual Basic
Oricât de multe proprietăţi ar avea, un obiect este complet descris cu ajutorul metodelor, pentru că acestea indică ce face obiectul. Deci, proprietăţile descriu un obiect, în timp ce metodele permit unui obiect să facă ceva. Proprietăţile sunt date, metodele sunt secvenţe de instrucţiuni. O metodă reprezintă o procedură asociată sau incorporată, un bloc de cod care poate fi invocat pentru a asocia o anumită acţiune unui obiect. În Visual Basic, o metodă nu se poate modifica. Există totuşi o clasă specială de metode care se pot modifica, numite proceduri eveniment. Procedura eveniment este un subprogram ataşat unui obiect care conţine răspunsul obiectului la proceducerea unui eveniment. Procedurile eveniment sunt cele care particularizează comportamentul unui obiect într-o aplicaţie. În varianta Visual Basic - ca şi a celorlalte medii vizuale de dezvoltare programul constă dintr-un ansamblu de rutine, cele mai multe având dimensiuni reduse. Acestea se numesc proceduri eveniment şi fiecare tratează un eveniment individual. O astfel de procedură se execută dacă şi numai dacă se produce evenimentul pentru care ea a fost scrisă. Altfel spus, un program va răspunde unui eveniment care se produce la rulare numai dacă a fost scrisă o procedură pentru evenimentul respectiv, altfel acesta va fi ignorat. Fiecare control plasat pe un form suportă mai multe evenimente. De exemplu, o casetă de text poate răspunde la unul din următoarele evenimente: clic, dublu clic, introducerea unui text. Dacă pentru evenimentul clic este scrisă o procedură, atunci
14
când rulează aplicaţia şi se execută clic pe caseta de text (se produce în acest fel evenimentul) – se va lansa automat în execuţie procedura definită. Cele prezentate mai sus ne îndreptăţesc să considerăm mediile de dezvoltare vizuală a aplicaţiilor mai mult drept limbaje/medii multiparadigmă, ele reunind principii ale: • programării vizuale (manipularea de reprezentări vizuale); • programării OO (lucrul cu obiecte, principiile încapsulării şi reutilizării); • programării dirijate de evenimente; • programării structurate (utilizarea structurilor de control fundamentale în cadrul procedurilor).
3. ELABORAREA PRODUSELOR-PROGRAM Elaborarea unui produs-program constituie o activitate deosebit de complexă, care necesită utilizarea unei metodologii clare şi unitare. De regulă, o asemenea activitate se desfăşoară în echipe de lucru complexe în care sunt incluşi analişti, specialişti ai domeniului pentru care se dezvoltă produsul-program, programatori, specialişti în testarea şi implementarea produselor-program, utilizatori etc. Literatura de specialitate pune în discuţie o multitudine de probleme legate de metodologia elaborării produselor-program şi subliniază în mod deosebit necesitatea existenţei unei metodologii unitare. Totuşi, putem afirma că în forma sa finală orice produs-program poate fi privit ca un sistem cu funcţii şi componente proprii, cu intrări, ieşiri, prelucrări specifice şi buclă de autoreglare şi cu un scop bine stabilit.
3.1. Modele de elaborare a produselor-program Din punct de vedere practic, elaborarea unui produs-program presupune parcurgerea unui anumit număr de activităţi specifice obţinerii acestuia. Există un număr însemnat de modele pentru elaborarea unui produs-program, dintre care cele mai importante sunt: modelul în cascadă, modelul în V, modelul spirală, modelul liniar, modelul incremental, modelul RAD. 3.1.1. Modelul în cascadă Dintre toate modelele enumerate mai sus, modelul în cascadă este cel mai des utilizat în practică. Activităţile avute în vedere la elaborarea produselor-program în cazul modelului în cascadă (vezi şi figura) sunt: •definirea problemei; •analiza; •proiectarea; •dezvoltarea; •testarea; •implementarea; •întreţinerea.
15
Definirea problemei Validare -Verificare Analiză Validare -Verificare Proiectare Validare -Verificare Dezvoltare problemei Validare -Verificare Testare Validare -Verificare Implementare Validare -Verificare Exploatare-Întreţinere Validare -Verificare
Modelul în cascadă de elaborare a unui produs-program
Acest model a fost dezvoltat de către Royce în 1970 şi este cel mai familiar programatorilor. Aşa după cum se observă în figura precedentă, caracteristica fiecărei etape constă în a se finaliza cu o verificare şi o validare în scopul eliminării eventualelor anomalii care ar putea să apară în cadrul fiecăreia. Dacă se constată eventuale anomalii, atunci se va reveni la etapa precedentă până când acestea vor fi eliminate. În acest fel se realizează o minimizare a costului pentru produsul-program dezvoltat. În acelaşi timp, trecerea de la o fază la alta, în sus şi în jos, oferă modelului un caracter iterativ şi incremental. 3.1.2. Modelul în V Modelul în V poate fi considerat ca un caz particular al modelului în cascadă prin faptul că activităţile necesare elaborării produsului-program sunt reprezentate grafic sub forma lui „V”. Esenţa modelului constă în aceea că separă primele etape ale procesului de dezvoltare în sub-activităţi ce au legătură cu construcţia sistemului. Această organizare sub forma literei „V” este dată de faptul că se pune în relaţie directă de dependenţă primele etape cu cele aflate în partea de jos din modelul în cascadă. În acest model se delimitează următoarele activităţi8 [Grama, 2000,55]: 1. analiza cerinţelor şi studiul de fezabilitate; 2. specificarea globală; 3. proiectarea de ansamblu; 4. proiectarea de detaliu; 5. programarea; 6. testarea unitară; 7. integrarea şi testul de integrare; 8. testul de acceptare; 9. implementarea şi testul sistem. 8
Grama, A., Filip, M., Medii de programare în economie, Editura Sedcom Libris, Iaşi, 2000, p. 55
16
Constatăm că din lista de mai sus activităţile 1-5 influenţează în mod permanent o activitate din 6-9, ceea ce permite o mai bună organizare a etapelor finale. Dezavantajul acestui model constă în că nu pune în evidenţă posibilitatea reluării unei activităţi deja parcurse, ceea ce poate să conducă la depistarea unor anomalii funcţionale ale produsului-program în faza de implementare. Acest lucru va duce la reluarea întregului proces de elaborare a produsului program cu costuri corespunzătoare şi pierderi de timp. 3.1.3. Modelul incremental În modelele prezentate anterior rezultă că după o descompunere în elementele componente, acestea sunt dezvoltate independent unele după altele, în paralel sau secevenţial potrivit cu resursele disponibile. În modelul incremental, la un moment dat se dezvoltă un singur subansamblu de componente. Iniţial se dezvoltă un nucleu, iar apoi succesiv se dezvoltă incrementţii care sunt totodată şi integraţi în sistemul propriu-zis. Avantaje: • fiecare dezvoltare în parte este mai puţin complexă; • integrările sunt progresive; • după fiecare integrare de increment sistemul poate fi exploatat. Dezavantaj: • necesitatea ca specificarea nucleului, a incremenţilor şi interacţiunea lor să fie stabilite de la începutul proiectului. 3.1.4. Modelul în spirală Modelul în spirală a fost propus în 1988 de către B. W. Boehm şi este cel mai cunoscut model evolutiv. El are la bază două premise9: • natura iterativă a dezvoltării şi nevoia de planificare şi evaluare a riscurilor fiecărei iteraţii; • realizarea validării cât mai devreme posibil şi de cât mai multe ori, prin construirea prototipurilor. Obiectivul principal urmărit prin modelul spirală este gestiunea atentă a riscurilor prin combinarea modelului cascadă cu prototipizarea. Se construieşte mai întâi o primă versiune a sistemului, sub forma unui prototip, în care nu este definit întregul sistem ci sunt luate în considerare doar caracteristicile sale principale. După transpunerea prototipului în aplicaţie, aceasta este evaluată de către beneficiari, iar în funcţie de rezultatul evaluării se pot defini şi implementa noi caracteristici ale sistemului, construindu-se un nou prototip ce va fi supus evaluării. Acest proces se reia de mai multe ori, următoarele prototipuri fiind versiuni din ce în ce mai complete ale sistemului propus. Modelul cascadă se va regăsi în cadrul fiecărei iteraţii. Modelul spirală este descompus în mai multe activităţi-cadru – maxim 6, cum sunt prezentate în continuare: • comunicarea cu beneficiarul (stabilirea şi menţinerea contactului dintre beneficiar şi proiectant); • planificarea (definirea resurselor, a termenelor limită de realizare); • analiza riscului (riscuri tehnice şi de organizare); • proiectarea (definirea uneia sau mai multor reprezentări ale aplicaţiei); 9
Oprea, D., Analiza şi proiectarea sistemelor informaţionale economice, Ed. Polirom, Iaşi, 1999, p. 68
17
• construirea şi lansarea; • evaluarea beneficiarului (feed-back din partea beneficiarului asupra schimbărilor din noua versiune instalată). Cea mai cunoscută variantă a modelului este cea bazată pe 4 elemente majore, ca în figura de mai jos. Printre avantajele modelului spirală se pot enumera: • diminuarea riscurilor la nivel de prototip, prin angajarea treptată în proiect a echipei de dezvoltare şi a beneficiarilor; • valorificarea experienţei anterioare în planificarea activităţilor pentru prototipul următor; • evaluarea riscurilor asociate proiectului în mai multe momente; • simplificarea operaţiunilor de evaluare a ceea ce este necesar în etapa (prototipul) următoare, inclusiv prin prisma costurilor. Analiza
Planificare
riscului
Evaluarea beneficiarului
Proiectare
Ilustrarea modelului în spirală
Aplicarea cu succes a modelului spirală este condiţionată de profesionalismul echipei de dezvoltare şi flexibilitatea în acţiune, inclusiv în alocarea de fonduri, dar şi în definirea activităţilor de întreprins. 3.1.5. Modelul RAD Dezvoltarea aplicaţiilor trebuie să răspundă, ca orice domeniu de activitate, principiului productivităţii şi eficienţei economice. Detaliind, putem identifica mai multe aspecte ce trebuie avute în vedere în dezvoltarea unei aplicaţii10: •productivitatea resurselor; •calitatea produsului; •timpul de realizare; •simplificarea întreţinerii; •satisfacţia utilizatorului. Modelul RAD îşi propune să pornească de la sursă, adică de la nevoile utilizatorilor. Utilizatorul se găseşte în centrul atenţiei, fiind clientul sistemului ce se realizează. Silvestre, P., Verlhac, D., Le development de systemes d’information, Edition Hermes, Paris, 1996, p. 112 10
18
RAD reprezintă un arhetip revoluţionar de succes în software-ul anilor ’90, caracterizat pe scurt prin “mai repede, mai bine, mai ieftin”, ceea ce este posibil de realizat printr-o abordare foarte riguroasă, bazată pe echipe mici de specialişti bine pregătiţi, pe utilizarea prototipurilor şi impunerea unor limite rigide de timp în planificarea activităţilor. RAD se bazează pe modelul spirală, ceea ce permite dezvoltarea incrementală şi repetitivă. Deşi nu reiese din figura modelului, trebuie precizată influenţa metodelor orientate-obiect, ce asigură o eficienţă sporită pentru RAD, prin utilizarea de componente pre-fabricate. De asemenea, RAD apelează la generarea automată a codurilor prin sisteme CAPS (Computer-Aided Prototyping System), care înlocuiesc scrierea manuală, mai înceată a codului şi minimizează erorile. În fine, RAD înseamnă flexibilitate, prin faptul că permite utilizatorilor să folosească propriile limbaje de interogare sau generatoare de rapoarte. După definirea de către J. Martin a filosofiei RAD11 a urmat un val de propuneri de modele de dezvoltare a aplicaţiilor de tip RAD. Planificarea cerinţelor
Proiectare
Construire
Finalizare
Fazele unui ciclu de dezvoltare RAD
RAD se individualizează prin următoarele caracteristici: • utilizarea de echipe mixte, formate în medie din 6 persoane, incluzându-i pe utilizatorii finali, manageri şi pe dezvoltatorii sistemului (această denumire face referire la specialistul “multilateral”, ce are atât cunoştinţe specifice analizei de sistem, cât şi de proiectare şi programare). Trebuie precizat că experienţa anterioară este deosebit de importantă, iar succesul proiectului este asigurat prin implicarea activă a utilizatorilor, ca şi prin comunicarea şi colaborarea permanentă între membrii echipei; • utilizarea de instrumente specializate care asigură: • dezvoltarea “vizuală”, • crearea de prototipuri, • planificarea şi gestiunea timpului, • colaborarea şi lucrul în echipă, • folosirea componentelor re-utilizabile şi a componentelor API, • controlul versiunilor; • renunţarea la caracteristici sau componente secundare (în special cu rol de îmbunătăţire a interfeţei sau a dialogului cu utilizatorul) pentru a asigura încadrarea în termenele stabilite. De regulă, întregul proces de dezvoltare are o durată maximă de 6 luni; • prototipizarea iterativă, evolutivă. Etapele unui ciclu de dezvoltare RAD pot fi prezentate şi în succesiunea: analiză, proiectare, realizare şi integrare, testare şi implementare, dar într-un mod 11
Martin, J., Rapid Application Development, Macmillan, 1991
19
diferit faţă de modelul clasic. Pentru ilustrare ne vom opri asupra ciclului de dezvoltare James Martin, cel mai reprezentativ dintre ciclurile de dezvoltare RAD. Există în acest ciclu 4 faze: (1) identificarea şi planificarea cerinţelor, (2) proiectare, (3) construire, (4) finalizare. Planificarea cerinţelor are ca obiectiv determinarea funcţiunilor sistemului. Utilizatorul trebuie să aibă un rol activ în această fază. Faza se desfăşoară în aşanumitele ateliere de lucru (workshop), de tip Joint Requirements Planning. Activităţile desfăşurate pot fi grupate în: evidenţierea problemelor, identificarea şi precizarea cerinţelor, planificarea sarcinilor. Proiectarea realizează modelarea sistemului prin prototipuri şi alte instrumente de modelare. Activitatea se desfăsoară în ateliere de lucru de tip Joint Application Design. După stabilirea modelului de lucru se întocmeşte rapid prototipul. Fiecare prototip va fi testat şi validat în atelierele de lucru. Construirea sistemului este apanajul specialiştilor informaticieni, care transpun modelele fazei anterioare în programe. Utilizatorii testează componentele şi le validează sau solicită, dacă e necesar, ameliorarea acestora. Faza se încheie prin integrarea componentelor în sistemul final. Aşa cum reiese şi din figură, această fază şi precedenta se constituie într-un ciclu iterativ, până la obţinerea rezultatului dorit (Iterate Until Done). Pe parcursul acestui ciclu prototipurile definite şi revizuite pot evolua în prototipuri operaţionale. Finalizarea se referă la punerea în exploatare a sistemului. Această fază continuă testările asupra produsului final, impune schimbări organizaţionale, formează şi instruieşte utilizatorii finali. În sinteză, modelul RAD se bazează pe următoarele soluţii12: • Includerea utilizatorilor în echipa de realizare a aplicaţiei şi implicarea activă a acestora. S-a pornit de la faptul că utilizatorii sunt sursa cerinţelor informaţionale, ca şi beneficiari direcţi ai aplicaţiei, deci opinia lor este determinantă pentru succesul aplicaţiei. Implicarea directă şi continuă a utilizatorilor în procesul de dezvoltare este esenţială pentru succesul RAD. Ea prezintă importanţă în detectarea din timp a eventualelor erori, ştiind că dacă defectul este descoperit mai repede, costul remedierii va fi mai scăzut. Costul corectării erorilor creşte odată cu trecerea dintr-o etapă a ciclului de viaţă în alta. • Gestiunea optimă a timpului. Se fixează intervale scurte de timp pentru realizarea componentelor. Un proiect de dimensiuni mari va fi descompus în subproiecte cu posibilităţi de realizare în paralel. Pentru a asigura respectarea termenelor, se vor realiza mai întâi versiuni care vor cuprinde doar funcţionalităţile de bază. În final, se vor integra şi funcţionalităţile complementare. • Dezvoltarea incrementală, numită şi ciclu de elaborare în spirală. Este un factor ce contribuie la sporirea vitezei de realizare a aplicaţiilor. În loc să se lanseze direct produsul final, aplicaţia va apare în versiuni succesive. Se realizează prototipuri ale aplicaţiei prin parcurgerea a 3 etape: determinarea cerinţelor informaţionale, transpunerea lor sub formă de aplicaţie, testarea acesteia de către utilizatori. Utilizarea prototipurilor permite ca utilizatorii să observe şi să corecteze sistemul. • Reutilizarea. O aplicaţie nu mai este văzută ca un ansamblu de programe executabile împreună cu un ansamblu de date, care comunică prin intermediul unor interfeţe. Aplicaţia reprezintă un ansamblu de servicii/componente care răspund unor obiective sau cerinţe. 12
Silvestre, P., Verlhac, D., Op. cit., pp. 112-113
20
• Utilizarea de instrumente CASE pentru generarea rapidă şi fără erori a programelor.
3.2. ALGORITMI ŞI TEHNICI DE REPREZENTARE 3.2.1. Noţiunea de algoritm Conceptul de algoritm desemnează o mulţime finită de operaţii (instrucţiuni, comenzi) cunoscute, care executate într-o ordine bine stabilită, pornind de la un set de valori de intrare produc în timp finit, un alt set de valori, de ieşire. Pentru a fi programabil, orice algoritm, trebuie să îndeplinească cumulativ anumite condiţii, cum sunt: • să fie clar şi coerent, exprimând cu rigurozitate şi fără ambiguităţi operaţiunile de prelucrare a datelor şi ordinea lor de succesiune; • să fie complet, descriind etapă cu etapă procesul de prelucrare a datelor, fără omisiuni; • să aibă caracter finit, adică să fie asigurată încheierea algoritmului după un anumit număr de paşi. Algoritmizarea unei probleme presupune parcurgerea etapelor următoare: • definirea unui enunţ precis al problemei; • transformarea acestui enunţ în enunţ algoritmic; • reprezentarea enunţului algoritmic cu ajutorul instrucţiunilor specifice (organigrame, tabele de decizie, limbaje algoritmice etc); Observaţie. Aceeaşi problemă poate fi algoritmizată sub mai multe forme, neimpunându-se existenţa unui algortim unic.
• • • •
3.2.2. Reprezentarea algoritmilor Cele mai utlizate tehnici de reprezentare sunt: schemele logice/flowchart pseudocodurile diagramele arborescente tabele de decizie.
3.2.2.1. Schemele logice – au rolul de a reprezenta grafic fluxul general al datelor şi a algoritmului de prelucrare. Se disting 2 tipuri de scheme logice: Schemele logice de sistem – care au rolul de a indica sistemul de resurse afectat pentru obţinerea rezultatelor scontate. Acestea schmatizează relaţiile dintre informaţii şi suporturile de date, fluxul informatizat preconizat, operaţiile ce se efectuează asupra informaţiilor prin procedee automate sau manuale. În cadrul lor există unul sau mai multe blocuri de prelucrare ce reprezintă proceduri independente de prelucrare şi deci programe diferite pentru calculator. Scheme logice de program – sintetizează succesiunea etapelor de rezolvare a unei probleme constituind o reprezentare grafică a funcţiilor algoritmului utlizat. Şi în cadrul acestor scheme se folosesc simboluri standard, cărora li se asociază în principiu anumite instrucţiuni. Schema logică reprezintă de fapt un graf orientat în care există cel puţin următoarele elemente: • o instrucţiune de pornire (START) şi una de oprire (STOP); • instrucţiuni de :
21
citire a datelor; decizie; atribuire; scriere/afişare a rezultatelor prelucrării. • săgeţi care indică sensul fluxului de prelucrare, deci ordinea de execuţie a operaţiilor elementare. Ordinea în care instrucţiunile programului sunt executate constituie structura de control a acestuia. Structurile de control se împart în general în 2 categorii: • structuri secvenţiale • structuri nesecvenţiale Cele secvenţiale sunt folosite în cazul programelor simple, în care ordinea execuţiei instrucţiunilor sau modulelor de instrucţiuni coincide cu ordinea sintactică a acestora. Forma generală a unei structuri secvenţiale este: o o o o
a(1) a(2) a(3) .unde a(1), a(2),…..a(n) sunt acţiuni ce se execută în această ordine . . a(n) În exemplul: citeşte a,b,c m:=(a+b+c)/3 scrie m
• • •
a(1) a(2) a(3)
sunt implicate 3 acţiuni a(1), a(2), a(3) care constau în: citirea a 3 valori calculul mediei aritmetice afişarea rezultatului Structurile nesecvenţiale apar în cazul în care instrucţiunile se execută numai în anumite condiţii şi/sau se repetă în funcţie de rezultatul evaluării unor condiţii. Structurile nesecvenţiale pot fi: • alternative (de decizie sau selecţie) • repetitive • multiple/mixte Structura alternativă este acea structură în care se efectuează un ciclu de operaţii sau altul în funcţie de o anumită condiţie (C) impusă de logica de rezolvare a problemei. Condiţia poate fi de: • verificare a conţinutului şi a naturii unor zone de memorie; • verificare a conţinutului unui contor, a cărui valoare poate creşte sau descreşte; • verificare a corectitudinii unor date de intrare etc. Cazul general de program (P) cu structură alternativă are forma:
22
P=M1; {M2 dacă C=DA şi M3 dacă C=NU}; M4 în care M1, M2, M3, M4 sunt modulele programului P, iar C condiţia evaluată. Derularea programului se realizează astfel: • sub forma P=M1; M”; M4 când condiţia C este îndeplinită; • sub forma P=M1. M3; M4 când condiţia C nu este îndeplinită Schematic structura alternativă (IF – THEN - ELSE) se prezintă astfel:
Structura alternativă Dacă M3 nu conţine instrucţiuni se obţine o structură alternativă cu ramură vidă: Derularea programului este: • P=M1 dacă C=DA, atunci M2; M4 • P=M1, dacă C=NU atunci M4
23
Structura alternativă cu ramură vidă Structura repetitivă – permite reluarea identică de mai multe ori a aceluiaşi modul de instrucţiuni. Numărul de repetări poate fi predefinit (FOR) sau condiţionat de rezultatul evaluării unei condiţii (WHILE-DO sau DO - UNTIL). În primul caz este vorba de structura repetitivă cu un număr definit de paşi (DO FOR), numărul de repetiţii este controlat de o variabilă V, numită variabilă de control, care are o valoare iniţială Vi şi una finală Vf, ambele prestabilite şi o raţie R (un increment) care se adaugă la valoarea curentă a variabilei de control, după fiecare execuţie a modulului repetitiv. Ieşirea din structura repetitivă se realizează atunci când variabila de control depăşeşte valoarea finală.
Structura repetitivă controlată prin FOR 24
Derularea structurii repetitive controlată prin FOR, pentru o secvenţă de program SP se realizează astfel: Sp=MODUL pentru V
MODUL INIŢIAL
DA MODUL REPET
C NU MODUL FINAL
SFÂRŞIT Structura repetitivă condiţionată anterior În structura repetitivă condiţionată posterior evaluarea condiţiei se realizează după fiecare execuţie a modulului. Reluarea execuţiei modulului are loc atât timp cât condiţia nu este adevărată. Derularea structurii repetitive condiţionate posterior se prezintă astfel: Sp=Execută MODUL REPET până când C=DA Structura multiplă este recomandată în cadrul programelor complexe când pe diverse niveluri de organizare se reîntâlnesc toate tipurile de structuri prezentate. Practica a demonstrat că pentru definirea structurii de control a oricărui program sunt suficiente structura secvenţială, cea alternativă şi cea repetitivă condiţionată anterior, numite şi structuri fundamentale de control.
ÎNCEPUT 25
MODUL INIŢIAL
MODUL REPET DA C
NU
MODUL FINAL
SFĂRŞIT Structură repetitivă condiţionată posterior 3.2.2.2. Pseudocoduri Pseudocodul este un limbaj de proiectare a programelor de nivel intermediar, fiind între limbajele formale şi cele naturale. Logica acestuia este apropiată de limbajele de programare utilizând însă cuvinte şi expresii uzuale din limbajul natural. El are puţine reguli sintactice lăsând programatorului o mare libertate în programare. În dicţionarul de informatică, pseudocodul este definit ca „limbaj utlizat în proiectarea şi documentarea programelor obţinut prin grefarea unor reguli sintactice pe limbajul natural”. Structurile de control sunt reprezentate prin folosirea unor cuvinte cheie (dacă….atunci….altfel…..; execută….până când …….etc) şi printr-o anumită aliniere a liniilor de program în pagină. Poate fi utilizat în toate fazele proiectării de sus în jos, precum şi ca mijloc de documentare. Nu există restricţii de definire unică a formei pe care trebuie să o aibă un pseudocod, deşi în unele reprezentări se folosesc propoziţii simple şi propoziţii complexe. Propoziţiile simple descriu operaţiile ce se vor codifica ulterior direct cu ajutorul instrucţiunilor limbajelor de programare: deschide fişier, citeşte articol, scrie articol etc. Propoziţiile complexe descriu operaţiile ce urmează a fi detaliate ulterior şi sunt precedate de semnul #. Fiecare propoziţie începe cu un verb care trebuie să exprime operaţiunea descrisă. Cu ajutorul pseudocodurilor pot fi reprezentate toate structurile fundamentale. Structura secvenţială
26
Fiecare operaţiunea, în acest caz, se reprezintă printr-o propoziţie. Ele sunt flancate de termenii început şi sfârşit fiind aliniate pe verticală în ordinea desfăşurării operaţiunilor. De exemplu, pentru stabilirea valorii produselor, cunoscându-se cantitatea şi preţul unitar, pseudocodul poate avea structura: _ Început citeşte CODPROD, DENPROD, CANT, PREŢ calculează VALOARE=CANT*PRET scrie DENPROD, VALOARE _ Sfârşit Structura alternativă Această structură presupune existenţa unei condiţii în funcţie de care în program are loc o ramificare. Formatul general pentru un pseudocod cu structura alternativă este: Început Dacă condiţie adevărată Atunci Propoziţia 1 Propoziţia 2 … … Propoziţia m Altfel Propoziţia 1 Propoziţia 2 … … propoziţia n sfârşit Sfârşit
alternativa1
alternativa 2
Exemplu de pseudocod, cu structură alternativă pentru calculul salariilor. Se acceptă de la terminal ca date de intrare: Marca , numele salariatului, numărul de ore lucrate şi tariful pe o oră. Calculul se va realiza numai dacă salariatul are ore lucrate. Început Acceptă de la terminal: MARCĂ, NUME,NR_ORE, TARIF Dacă NR_ORE≠ 0 Atunci #calculează SALARIU=NR_ORE*TARIF altfel afişează mesajul „articol care nu se prelucrează” Sfârşit Sfârşit
27
Structura alternativă cu o ramură vidă – apare atunci când una din ramificaţiile din program nu conţine instrucţiuni sau comenzi. Pseudocodul pentru o astfel de structură are formatul general: Început Dacă condiţie adevărată Atunci Propoziţia 1 Propoziţia 2 … … Propoziţia n Sfârşit Sfârşit Sfârşit De exemplu, actualizarea unei baze de date presupune adăugarea de noi articole, modificarea sau ştergerea unor articole existente. La un moment dat poate fi executată doar una din aceste operaţii, controlul fiind asigurat de variabila I. Această variabilă nu poate lua decât valorile 1 – pentru adăugare, 2 – pentru modificare şi 3 – pentru ştergere. Început precizează i dacă i=1 atunci # adaugă articol dacă i=2 atunci #modifică articol dacă i=3 atunci #şterge articol sfârşit sfârşit sfârşit Structura repetitivă condiţionată anterior – are formatul general Început Cât timp condiţie adevărată Execută Propoziţia 1 Propoziţia 2 … … sfârşit sfârşit sfârşit
28
De exemplu, pentru stabilirea soldurilor pentru produsele existente în stoc se poate folosi următorul pseudocod care codifică o structură repetitivă condiţionată anterior: Început Cât timp STOC>0 Calculează SOLD=STOC*PREŢ Afişează DENPROD, STOC, SOLD Sfârşit Sfârşit Structura repetitivă condiţionată posterior – are formatul general: Început Execută Propoziţia 1 Propoziţia 2 … … Propoziţia n Până când condiţia este adevărată Sfârşit Pentru acelaşi calcul al soldurilor produselor din stoc, pseudocodul cu structura repetitivă condiţionată posterior se poate prezenta astfel: Început Execută Calculează SOLD=STOC*PREŢ Afişează DENPROD, STOC, SOLD Până când STOC <0 Sfârşit Pentru a asigura apropierea de limbajele de programare la ora actuală în multe cazuri se adoptă o notare în limba engleză pentru marcarea structurilor de control. De exemplu o structură alternativă generalizată devine o structură de t ip IF..THEN..ELSE.. astfel: IF condiţie adevărată THEN Propoziţie 1 ELSE Propoziţie 2 ENDIF 3.2.2.3. Diagramele arborescente – îmbină descompunerea descendentă cu utilizarea structurilor de control astfel încât parcurgerea lor se face de sus în jos (topdown) şi de la stânga la dreapta (left-right). Diagrama arborescentă propusă de Tabourier este cea mai apropiată de teoria programării structurate, motiv pentru care sunt prezentate în continuare structurile folosite în cadrul acesteia.
29
Structura secvenţială (BLOCK, S1, S2) BLOCK
S1
S2
Structura alternativă (IF..THEN..ELSE, C, S1, S2) sau cu o ramură visă (IF..THEN, C, S) IF THEN ELSE
C
IF THEN
S1
S2
C
S
Structură repetitivă condiţionată anterior (WHILE DO, C, S) WHILE DO C
S
Structură repetitivă condiţionată posterior (DO UNTIL, S, C) DO UNTIL S
C
3.2.2.4. Tabele de decizie O tabelă de decizie este un instrument adaptat pentru rezolvarea unei probleme care comportă un număr mare de alternative. Ele exprimă o extindere a logicii matematice în general şi a logicii booleene în special, fiind un mijloc accesibil de concepere modulară a programelor. Acest mijloc de analiză permite inventarierea tuturor acţiunilor care pot fi posibile prin combinarea condiţiilor precizate. O tabelă de decizie este compusă din patru părţi: Enunţul condiţiilor Introducerea condiţiilor Enunţul acţiunilor Acţiuni de executat După caz, tabelele de decizie se pot prezenta sub diferite forme:
30
cu intrări extinse – folosite atunci când toate condiţiile sunt prezentate „în clar” fiind importante; cu intrări limitate – atunci când condiţiile nu sunt enunţate în clar ci sub formă booleană; înlănţuite – când condiţiile pot fi disociate, acţiunea putând să cuprindă un apel la alte tabele de decizei; simplificate – când sunt suprimate incompatibilităţile şi imposibilităţile
31
Capitolul 2
SISTEMUL DE GESTIUNE A BAZELOR DE DATE VISUAL FOXPRO 1. Aspecte generale ale SGBD-ului Visual FoxPro Visual FoxPro este un sistem de gestiune a bazelor de date relaţionale, ce dispune de un limbaj de programare procedural, puternic şi flexibil, util în descrierea datelor şi a aplicaţiilor. Se va prezenta versiunea Visual FoxPro 5, ce face parte din pachetul integrat de medii de dezvoltare de aplicaţii Microsoft Visual Studio 97 pentru Windows şi Internet. Produsul foloseşte facilităţile oferite de noul stil de programare, în principal modelul orientării pe obiecte, modelul programării conduse de evenimente şi cel al programării vizuale. SGBD-ul Visual FoxPro are în componenţă un gestionar al aplicaţiilor (Project Manager) care controlează întreaga activitate, punând la dispoziţie elementele utile tuturor operaţiunilor necesare cum ar fi: generatoare (Designers), asistenţi integraţi (Builders) şi asistenţi speciali (Wizards). Altfel spus, Visual FoxPro este un SGBD care îmbină caracteristicile modelului relaţional de organizare a datelor cu cele ale programării orientate pe obiect. Fiind o componentă a pachetului Microsoft Visual Studio 97 pentru Windows şi Internet, Visual FoxPro (prescurtat în cele ce urmează VFP) are o interfaţă cu utilizatorul modernizată, cu un aspect unitar cu cel al programelor sistemului de operare Windows 9x. Fereastra principală a unei sesiuni Visual FoxPro este redată în figura 4.1. Prin sesiune de lucru se înţelege totalitatea comenzilor VFP executate între o lansare a programului şi comanda de părăsire a mediului (QUIT). Modurile de lucru ce pot fi folosite de utilizator în cadrul unei sesiuni de lucru sunt: • modul de lucru asistat sau interfaţa Visual FoxPro - cel mai simplu mod de lucru, dar şi cel mai restrictiv, întrucât nu sunt folosite toate facilităţile oferite de VFP. Acesta constă în activarea şi folosirea meniurilor implicite, respectiv a opţiunilor acestora din bara de meniuri; Bara de meniuri Bara de instrumente Bara de titlu
Suprafaţa de lucru
Figura 1
Fereastra de comenzi
32
• modul de lucru direct sau comandă - modul de lucru implicit la deschiderea unei sesiuni de lucru VFP. Acestui mod de lucru îi este specifică fereastra de comenzi (Command), în care se introduce, pe fiecare rând, câte o comandă. • modul de lucru programat - cel în care sunt create programele; presupune cunoaşterea aprofundată a comenzilor şi funcţiilor VFP pentru a putea fi exploatate performant. Sintaxa generală a unei comenzi cuprinde elementele: verb [lista expresii] [FIELDS listă câmpuri] [domeniu] [FOR expr_log1] [WHILE expr_log2] [TO FILE nume_fişier TO PRINTER TO ARRAY masiv TO variabila_memorie] [ALL [LIKE EXCEPT mască]] [IN alias] [NOOPTIMIZE] unde: • verb este un cuvânt rezervat, obligatoriu, reprezentând numele comenzii şi acţiunea de executat; • lista expresii cuprinde şiruri de operanzi legaţi între ei prin operatori; • FIELDS listă câmpuri - este clauza prin care sunt specificate câmpurile ce răspund la comanda dată; • domeniu - clauza prin care se stabileşte cât din fişier va fi exploatat de comandă; • FOR expr_log1 - clauza cu ajutorul căreia sunt selectate doar înregistrările pentru care condiţia expr_log1 este adevărată; • WHILE expr_log2 – clauza este aplicată începând de la articolul curent şi acţionează cât condiţia este adevărată; prima înregistrare ce nu îndeplineşte condiţia duce la abandonarea comenzii; • TO FILE nume_fişier TO PRINTER TO ARRAY masiv TO variabila_memorie – rezultatele obţinute în urma comenzii pot fi salvate într-un fişier, la imprimantă, într-un masiv sau o variabilă de memorie. • ALL [LIKE EXCEPT mască – indică includerea/excluderea de sub incidenţa comenzii a unor fişiere, câmpuri sau variabile de memorie conform „măştii”; • IN alias – permite manipularea datelor dintr-o altă zonă de lucru; • NOOPTIMIZE – inhibă tehnica Rushmore de accesare rapidă a înregistrărilor. În formatul general al comenzilor VFP sunt utilizate următoarele convenţii de sintaxă: - cuvintele rezervate sunt scrise cu litere mari; - denumirile date de utilizator sunt scrise cu litere mici; - parantezele pătrate indică clauze opţionale; - bara verticală indică opţiunile exclusive în mod reciproc; - literele mici ce apar ca prefix în faţa numelui variabilei indică tipul de dată pentru respectiva variabilă: c pentru date de tip character, n pentru numeric, l pentru logical, d pentru date, t pentru time, y pentru currency, o pentru object şi e pentru alte expresii. O comandă este lansată, după scriere, prin acţionarea tastei 〈Enter〉 . Ea poate fi refolosită, fără a fi necesară tastarea din nou a acesteia, prin
33
mutarea cursorului pe rândul ce conţine comanda respectivă şi apăsarea tastei 〈Enter〉 . Modul de lucru direct este folosit, de obicei, pentru familiarizarea utilizatorului cu formatele generale ale comenzilor în vederea creării ulterioare a programelor sau în exploatarea ocazională a bazelor de date.
2. Tipuri de date în Visual FoxPro Tipul unei date este o caracteristică ce stabileşte modul în care data este înregistrată pe suportul de memorie al sistemului de calcul, precum şi modul de interpretare şi prelucrare a acesteia. Tipurile de date folosite în VFP sunt: • logic sau boolean (logical) – folosit pentru gestiunea pe un octet a datelor ce pot lua doar două valori: adevărat (true) sau fals (false); construcţia afişată are forma .T. sau .F. • şir de caractere (character) – folosit pentru introducerea a maxim 254 de caractere, alinierea datelor de acest tip fiind implicit la stânga; • caracter binar (binary) - asemănător cu tipul caracter, dar datele sunt memorate în format binar; • numeric (numeric) – pentru manipularea numerelor de până la 20 de cifre, din care 19 pot fi zecimale; atunci când numerele au o valoare informativă (numere de telefon, numere de cont, de factură etc.), este de preferat declararea lor ca date de tip caracter; alinierea datelor de acest tip este implicit la dreapta; • valută sau monetar (currency) - pentru memorarea valorilor exprimate în bani; dimensiunea implicită este de 8 octeţi, cu 4 poziţii zecimale; • flotant (float) – reprezentarea datelor în memoria internă este în virgulă flotantă; este folosit, de obicei, în calculele ştiinţifice, cu grade mari de precizie; • numeric dublu (double) - pentru memorarea numerelor foarte mari, în virgulă mobilă, cu dublă precizie; dimensiunea implicită este de 8 octeţi; • numeric întreg (integer) – folosit pentru stocarea datelor numerice ca valori binare, pe 4 octeţi, ceea ce înseamnă economie de spaţiu de memorare pentru fiecare înregistrare; • dată calendaristică (date) – pentru gestionarea datelor calendaristice, într-un format de 8 octeţi; ordinea implicită este formatul american ll/zz/aa, acesta putând fi modificat prin comenzi de tip SET DATE nume_format; • dată calendaristică şi timp (date time) – pentru introducerea suplimentară, pe lângă data calendaristică, a timpului, în format hh:mm:ss AM/PM; memorarea datelor se face pe 8 octeţi, 4 pentru dată şi 4 pentru timp; • memo (memo) – pentru prelucrarea şirurilor de caractere de dimensiuni mari sau variabile, sau cu un anumit grad de confidenţialitate; datele sunt memorate în blocuri ce au dimensiunea predefinită de 64 octeţi; • memo binar (binary) – asemănător cu tipul memo, dar datele sunt memorate în format binar; • general (general) – pentru stocarea unor elemente create cu ajutorul altor programe (documente, foi de calcul, imagini etc.) utilizând tehnica OLE, de încorporare şi legare a obiectelor.
3. Crearea bazelor de date relaţionale
34
O bază de date relaţională reprezintă o structură folosită la memorarea şi gestionarea datelor, descriind un anumit tip de obiecte. În VFP o bază de date relaţională are asociat un fişier special (cu extensia .dbc) în care sunt memorate tabelele componente, relaţiile permanente între tabele, dicţionarul de date asociat bazei de date etc. În modul de lucru direct, o bază de date se creează scriind în fereastra de comenzi următoarea comandă: CREATE DATABASE [DatabaseName | ?] în care: DatabaseName - reprezintă numele dat de către utilizator bazei de date; ? - deschide o fereastră în care, în zona de editare, se poate tasta un nume nou sau se poate alege unul din cele afişate. Exemplu. În modul de lucru direct, baza de date biblioteca.dbc se creează cu comanda: CREATE DATABASE biblioteca În modul de lucru asistat se folosesc comenzile File New Database, pictograma New File. Indiferent de modul de lucru folosit, se deschide fereastra Database Designer, cu propria bară de instrumente, iar în meniul sistem apare un nou submeniu numit Database. Bara de instrumente conţine butoane pentru realizarea diferitelor operaţii (Add Table, New Table etc.), opţiuni ce se regăsesc şi în submeniul Database.
4. Crearea tabelelor Un tabel reprezintă o structură în care se pot memora date ce descriu un anumit tip de elemente. Fiecare caracteristică a elementelor alcătuieşte un câmp, iar elementele propriu-zise sunt memorate în înregistrări. Tabelele pot fi libere (free) sau incluse în baza de date. 4.1. Metode directe de creare a tabelelor În modul de lucru direct, pentru a crea un tabel, se foloseşte comanda: CREATE [FileName | ?] în care: [FileName] este numele tabelului, dat de utilizator; ? – este un parametru ce deschide o fereastră în care, în zona Enter Table, se poate edita un nume nou pentru tabel sau se poate alege unul din cele afişate. În modul de lucru asistat, se alege submeniul File, opţiunea New, butonul New Table şi apoi pictograma New File (figura 2). Dacă se doreşte crearea unui tabel inclus într-o bază de date, se alege din submeniul Database opţiunea New Table. Extensia implicită a unui tabel este .dbf. Indiferent de modul de lucru folosit, se deschide fereastra Table Designer, în care vor fi completate caracteristicile noului tabel. În figura 3 este prezentată structura tabelului cititori.dbf.
35
Figura 2 Fereastra Table Designer conţine o zonă inferioară în care pot fi exploatate facilităţile specifice containerelor (validări de câmpuri, valori prestabilite etc.). Definirea unui tabel presupune specificarea numelui tabelului, a câmpurilor componente, a caracteristicilor acestora şi a indecşilor folosiţi la ordonarea datelor din tabel. Fiecare câmp al tabelului este caracterizat prin: • name (nume) – specifică numele fiecărui câmp (trebuie să fie unic); • type (tip) – specifică tipul datelor ce pot fi memorate în câmp; • width (lungime) – specifică numărul de caractere pe care îl ocupă fiecare dată memorată în câmpul respectiv; • decimal (numărul de zecimale) – pentru câmpurile numerice, se specifică numărul de cifre de după punctul zecimal; lungimea totală specificată la width trebuie să cuprindă şi numărul de zecimale, precum şi punctul zecimal propriu-zis; • index (fanionul de indexare) – indică dacă se stabileşte un index pe baza câmpului respectiv; • null (fanionul de valoare nulă) – indică dacă în câmpul respectiv se poate memora o valoare nulă. Exemplu. Crearea tabelului cititori.dbf constă în următoarea secvenţă de paşi: • scrierea comenzii CREATE cititori; • completarea ferestrei Table Designer cu următoarea structură (figura 4.3): nr_permis N (numeric) 5 nume C (character) 15 prenume C (character) 8 cnp C (character) 13 localitatea C (character) 10 telefon C (character) 10 36
Figura 3 Asemănător cu modul de creare a tabelului cititori.dbf s-au creat şi tabelele carte, domeniu şi imprumut, componente ale bazei de date biblioteca, cu următoarele structuri: - pentru tabelul carte.dbf: cota N 6 nume_a C 10 prenume_a C 10 titlu C 20 coddomeniu N 2 editura C 10 an_aparitie N 4 nr_volume N 3 pret N 6 valoare N 9 - pentru tabelul imprumut.dbf: cota N 6 nr_permis N 5 data_i D 8 data_r D 8 - pentru tabelul domeniu.dbf: coddomeniu N 2 denumire C 15 Toate aceste caracteristici se completează în fereastra Table Designer, pagina Fields. În figura 4, este prezentată baza de date biblioteca.dbc cu cele patru tabele componente: carte.dbf, cititori.dbf, domeniu.dbf şi imprumut.dbf. Pagina etichetată Indexes este asociată paginii Fields şi conţine informaţii atunci când s-au stabilit chei de indexare. Tot aici (figura 5), pot fi stabilite sensul ordonării (în coloana Order), numele etichetei index (în coloana Name), tipul de index (din lista Type), cheia de indexare (coloana Expression) şi un filtru care să restrângă accesul la înregistrările din tabel, pe baza unor condiţii impuse de utilizator (coloana Filter). 37
Pagina Table (figura.6) afişează informaţii privind tabelul care se creează (nume, număr câmpuri, lungime etc.). După ce a fost stabilită structura tabelului, se activează butonul OK. Se deschide o fereastră în care este afişată o întrebare referitor la introducerea de înregistrări în tabel. Dacă răspunsul este pozitiv, se deschide o nouă fereastră ce cuprinde macheta de încărcare a primului articol din tabel. Dacă răspunsul este negativ, tabelul se închide, fiind salvată doar structura lui. Ulterior, prin comenzi de adăugare, se pot încărca articole.
Figura 4
Figura 5 Conţinutul fiecărui tabel (carte, cititori, imprumut, domeniu), component al bazei de date biblioteca, este dat în figurile 7, 8, 9 şi 10. Înregistrările acestor tabele vor fi supuse ulterior diferitelor prelucrări.
38
Figura 6
Figura 7
Figura 8
Figura 9
39
Figura 10
5. Deschiderea şi închiderea bazelor de date şi a tabelelor 5.1. Deschiderea şi închiderea bazelor de date În modul de lucru asistat, se apelează meniul File, opţiunea Open; în zona de editare Files of Types se alege Database (*.dbc), iar în zona File name se precizează numele bazei de date. Dacă se alege modul de lucru direct, în fereastra de comenzi se scrie comanda OPEN DATABASE, care are ca efect deschiderea bazei de date cu numele specificat. Sintaxa comenzii este: OPEN DATABASE [FileName | ?] Dacă numele bazei de date nu este specificat şi se foloseşte parametrul ?, se deschide fereastra Open, din care se selectează numele bazei de date ce se doreşte a fi deschisă. Exemplu. Se deschide baza de date biblioteca, urmând ca ulterior să se efectueze operaţii asupra acesteia: OPEN DATABASE biblioteca Comanda cu care se închide o bază de date are formatul general: CLOSE DATABASE [ALL] Clauza ALL închide toate bazele de date deschise. Dacă este omisă clauza, comanda va închide doar baza de date activă. 5.2. Deschiderea şi închiderea tabelelor În modul de lucru asistat, un tabel poate fi deschis alegând din submeniul File, opţiunea Open şi apoi completând în fereastra deschisă cele două zone de editare, astfel: în zona Files of types - tipul fişierului - Table (*.dbf), iar în zona File name - numele fişierului. O altă posibilitate, asemănătoare cu cea de mai sus, este următoarea: din submeniul Window se alege opţiunea Data Session. Se deschide o fereastră cu acelaşi nume ca al opţiunii (figura 11). Se acţionează butonul Open care deschide o fereastră de dialog pentru alegerea tabelului dorit, identică cu cea descrisă mai sus. Tabelul ales va fi afişat în lista din stânga a ferestrei Data Session. Dacă tabelul este încorporat într-o bază de date, atunci deschiderea sa va determina implicit şi deschiderea bazei de date din care face parte. Exemplu. Se deschide tabelul carte.dbf, din baza de date biblioteca.dbc. Figura 4.12 prezintă fereastra Data Session, având în partea stângă tabelul carte şi în partea
40
de jos numele bazei de date din care face parte tabelul deschis (Database: Biblioteca), numărul zonei de lucru ocupate (Work area: 1) şi numărul total de înregistrări din tabelul deschis (Records:12).
Figura 11
Figura 12 Într-o sesiune de lucru pot fi deschise simultan 32767 de tabele. Sistemul alocă pentru fiecare din ele câte o zonă de memorie numită zonă de lucru (work area). La un moment dat poate fi activă doar o singură zonă de lucru numită zonă curentă. Selectarea unei anumite zone de lucru se face cu comanda SELECT, cu următorul format general: SELECT nWorkArea | cTableAlias unde: - nWorkArea specifică numărul zonei selectate; - cTableAlias – specifică aliasul tabelului ce se activează (aliasul reprezintă un nume suplimentar de identificare a tabelului ce se deschide). Comanda ?SELECT () returnează numărul zonei de lucru curente, iar ?SELECT(1) – selectează ultima zonă nefolosită. În modul de lucru direct, comanda folosită pentru deschiderea unui tabel este USE, cu sintaxa: USE [[DatabaseName.]Table | SQLViewName | ?] [IN nWorkArea | cTableAlias]
41
• DatabaseName. Table | SQLViewName | ? – indică numele tabelului ce va fi deschis sau a vederii SQL. Dacă se foloseşte parametrul ?, se deschide fereastra de dialog Open prezentată anterior. Cea mai utilizată clauză suplimentară este: • IN nWorkArea | cTableAlias - determină deschiderea tabelului într-o zonă de lucru specificată, alta decât cea curentă. Exemplul 1. Pentru deschiderea tabelului cititori.dbf în zona de lucru 2, comanda este următoarea: USE cititori IN 2 Comenzii USE îi sunt asociate funcţiile: • ALIAS([nWorkArea | cTableAlias]) – întoarce alias-ul zonei de lucru specificate; • DBF([cTableAlias | nWorkArea]) – returnează numele tabelului deschis în zona de lucru specificată; • USED([nWorkArea | cTableAlias]) – întoarce valoarea logică de adevăr .T. sau de neadevăr .F., după cum zona specificată conţine sau nu un tabel. Exemplul 2. Se cere aflarea alias-ului pentru tabelul carte: USE carte ALIAS biblio ? ALIAS() Pe ecran va fi afişat cuvântul biblio, reprezentând alias-ul tabelului carte. Exemplul 3. Se afişează pe ecran numele tabelului deschis împreună cu calea lui de acces: USE carte ?DBF() Pe suprafaţa de lucru va fi afişat următorul rezultat: C:\PROGRAM FILES\DEVSTUDIO\VFP\CARTE.DBF Exemplul 4. Se verifică dacă zona de lucru este ocupată sau nu, în funcţie de anumite operaţii efectuate cu tabele. USE carte ?USED()
&& deschide în zona 1 tabelul carte && verifică dacă zona este ocupată
Rezultatul afişat pe suprafaţa de lucru este .T., ceea ce înseamnă că zona de lucru este ocupată. Simbolurile && marchează o zonă de comentarii. SELECT 2 ?USED()
&& este selectată zona de lucru 2 && verifică dacă zona este ocupată
Rezultatul afişat pe suprafaţa de lucru este .F., ceea ce înseamnă că zona de lucru nu este ocupată. Închiderea tabelelor se realizează cu comenzile: USE CLOSE ALL
&& închide tabelul curent && închide toate fişierele deschise
Pentru părăsirea sesiunii de lucru Visual FoxPro şi reîntoarcerea în sistemul de operare Windows se foloseşte comanda QUIT.
42
6. Afişarea şi modificarea structurii tabelelor Structura unui tabel creat anterior poate fi afişată folosind una din comenzile LIST STRUCTURE sau DISPLAY STRUCTURE, cu sintaxa: LIST DISPLAY STRUCTURE Figura 13 afişează pe ecran structura tabelului cititori. Modificarea structurii unui tabel se poate face în modul de lucru asistat, cu comanda View Table Designer. În modul de lucru direct, comanda ce realizează modificarea structurii unui tabel este MODIFY STRUCTURE. Indiferent de modul de lucru folosit, pe ecran apare fereastra Table Designer, identică cu cea activată în cazul creării tabelului. Modificările ce pot fi efectuate sunt: schimbarea numelui câmpurilor, a tipului de dată, a dimensiunii, introducerea de noi câmpuri (cu butonul Insert), ştergerea de câmpuri (cu butonul Delete). Întrucât prin această comandă se pot pierde informaţii din tabel, se recomandă crearea în prealabil a unei copii de siguranţă. În figura 4.4 este afişată fereastra Table Designer pentru tabelul cititori.
Figura 13
7. Afişarea conţinutului unui tabel Atunci când nu interesează în mod deosebit aspectul rezultatelor obţinute, pentru afişare se folosesc comenzile LIST şi DISPLAY cu sintaxa: LIST DISPLAY [[FIELDS] FieldList] [Scope] [FOR lExpression1] [WHILE lExpression2] În mod implicit, comanda LIST determină afişarea tuturor câmpurilor tabelului. Clauza FIELDS se foloseşte pentru a afişa doar anumite câmpuri ce vor fi introduse în listă. Clauzele Scope, FOR şi WHILE indică domeniul
43
înregistrărilor ce vor fi afişate. Celelalte clauze din format au aceleaşi funcţiuni ca şi cele din comenzile anterioare. Domeniul implicit pentru comanda LIST este ALL. Exemplu. Pe ecran se afişează informaţii din tabelul carte.dbf, dar numai câmpurile Nume_a, Titlu, An_aparitie pentru cărţile apărute după 1995. USE carte LIST FIELDS nume_a, titlu, An_aparitie >1995
FOR;
An_apariţie
Pe suprafaţa de lucru sunt afişate informaţiile ce respectă condiţiile impuse (figura 14).
Figura 14 Deşi comanda DISPLAY are format comun cu LIST, totuşi, în utilizarea lor, există câteva diferenţe şi anume: • Domeniul implicit pentru DISPLAY este înregistrarea curentă, iar pentru LIST este ALL, aşa încât expresiile DISPLAY ALL şi LIST, respectiv DISPLAY şi LIST NEXT, sunt echivalente. • Pentru expresia DISPLAY ALL afişarea este „ecran cu ecran”, iar pentru LIST „în defilare continuă”. Conţinutul unui tabel mai poate fi afişat în format tabelar, cu ajutorul comenzii BROWSE (figura 15).
Figura 15
44
8. Prelucrarea înregistrărilor din tabele Prelucrarea înregistrărilor din tabele constă în actualizarea înregistrărilor, în fapt, în adăugarea de noi date, modificarea sau ştergerea logică şi/sau fizică a datelor existente. Principalul instrument pentru realizarea diferitelor prelucrări a datelor din tabele este fereastra Browse. Conţinutul tabelului este afişat într-o formă tabelară asemănătoare unei pagini din Excel, coloanele reprezentând câmpurile, iar liniile fiind înregistrările tabelului. Deschiderea ferestrei Browse se poate realiza prin mai multe modalităţi, şi anume: • în fereastra de comenzi se scrie comanda BROWSE; • se apelează comanda View Browse; • în fereastra Data Session, din submeniul Window, după selectarea tabelului, se acţionează butonul Browse. Odată deschisă fereastra Browse, în meniul sistem este adăugat un nou submeniu, Table, care conţine comenzi pentru realizarea diferitelor prelucrări asupra tabelului. 8.1. Adăugarea de noi înregistrări în tabele Adăugarea de noi înregistrări într-un tabel se poate face, în funcţie de poziţia pe care o va ocupa noua înregistrare, la sfârşitul tabelului sau în interiorul tabelului. Pentru a adăuga o nouă înregistrare la sfârşitul tabelului, fiind deschisă fereastra Browse, se alege opţiunea Append Mode din submeniul View, sau din submeniul Table, opţiunea Append New Record. Comanda de adăugare a unei înregistrări la sfârşitul tabelului este APPEND, iar pentru o înregistrarea goală, APPEND BLANK, urmând ca informaţiile să se încarce mai târziu prin alte comenzi. Comanda APPEND permite şi extinderea tabelului curent prin adăugarea la sfârşitul lui a unor articole preluate dintr-un alt fişier. Acelaşi lucru se obţine dacă, odată deschisă fereastra Browse, din submeniul Table se alege opţiunea Append Records….Se va deschide fereastra Append From în care se va introduce numele tabelului din care se adaugă înregistrări. În funcţie de criteriile impuse de utilizator, se vor completa zonele afişate în urma acţionării butonului Options, respectiv Fields sau For (figura 17).
Figura 17
45
Exemplu. Lucrând în modul direct, la sfârşitul tabelului cititori.dbf se adaugă date dintr-un alt tabel, cititori1.dbf, tabel cu aceeaşi structură. Se adaugă numai cititorii din localitatea Iasi. În final, se va afişa tabelul. Secvenţa de instrucţiuni necesară acestor operaţii este următoarea: USE cititori APPEND FROM cititori1 FOR localitate =”IASI” BROWSE Pentru a introduce o înregistrare în interiorul unui tabel, se foloseşte comanda INSERT. Dacă se foloseşte şi clauza BEFORE, atunci noua înregistrare va fi plasată înaintea celei curente. Clauza BLANK are acelaşi efect ca şi în cazul comenzii APPEND. 8.2. Modificarea conţinutului unui tabel Modificarea datelor dintr-un tabel se poate face în modul de lucru direct cu una din comenzile: BROWSE, CHANGE, EDIT, REPLACE. Comenzile CHANGE şi EDIT sunt identice şi deschid ferestre verticale asemănătoare cu cele de încărcare a înregistrărilor. Comanda BROWSE este cea mai utilizată referitor la prelucrările de efectuat asupra înregistrărilor dintr-un tabel. Comanda REPLACE este comanda de modificare propriu-zisă, înlocuind fiecare câmp specificat cu rezultatul evaluării expresiei asociate. Sintaxa comenzii este: REPLACE FieldName1 WITH eExpression1 [ADDITIVE] [, FieldName2 WITH eExpression2 [ADDITIVE]] ... [Scope] [FOR lExpression1] [WHILE lExpression2] [IN nWorkArea | cTableAlias] [NOOPTIMIZE] Clauza ADDITIVE poate fi folosită numai pentru câmpurile de tip memo, efectul constând în adăugarea noului conţinut la cel iniţial. Domeniul implicit al comenzii este înregistrarea curentă. Dacă se doreşte modificarea altei înregistrări sau a unui grup de înregistrări, se folosesc clauzele Scope, FOR sau WHILE. Exemplu. În tabelul carte, deoarece câmpul valoare nu conţine şi valoarea TVA-ului, se va modifica acest câmp: USE carte REPLACE ALL valoare WITH valoare*1.19 BROWSE Pentru obţinerea aceluiaşi rezultat, fiind deschisă fereastra Browse, se apelează submeniul Table, opţiunea Replace Field. Se afişează o fereastră de dialog în care, din lista Field, se selectează câmpul valoare. Expresia cu care se va înlocui acest câmp este valoare*1.19 (figura 18). Din lista Scope se alege domeniul All, modificarea realizându-se astfel pentru toate înregistrările tabelului.
46
Figura 18 8.3. Ştergerea înregistrărilor dintr-un tabel Ştergerea înregistrărilor unui tabel se poate face la nivel logic sau fizic. Realizarea operaţiei presupune utilizarea comenzilor sau a meniului sistem, respectiv submeniul Table. În cazul ştergerii logice, înregistrarea nu este ştearsă propriu-zis din tabel, ci este marcată pentru ştergere cu semnul *. Comanda folosită pentru realizarea acestei operaţii este DELETE, cu următorul format general: DELETE [Scope] [FOR lExpression1] [WHILE lExpression2] [IN nWorkArea | cTableAlias] Domeniul implicit al comenzii este înregistrarea curentă. Clauzele din formatul general au acelaşi rol ca la celelalte comenzi precedente. Cu comanda SET DELETED ONOFF este controlat accesul la înregistrările marcate pentru ştergere. Opţiunea implicită este OFF şi admite accesarea tuturor înregistrărilor indiferent de marcajul lor de ştergere. Opţiunea ON împiedică accesul comenzilor FoxPro la înregistrările marcate pentru ştergere. Exemplul 1. Vor fi şterse din tabelul carte toate cărţile de la editura ECONOMICA şi vor fi afişate pe ecran informaţii doar din câmpurile titlu şi editura: USE carte DELETE FOR editura =”ECONOMICA” LIST FIELDS titlu, editura Rezultatul secvenţei de instrucţiuni de mai sus este redat în figura 19. Se observă că în dreptul înregistrărilor ce respectă condiţia impusă de utilizator apare semnul *.
47
Figura 19 Pentru ca înregistrările marcate pentru ştergere să nu fie luate în considerare la prelucrare, se foloseşte comanda: SET DELETED ON LIST FIELDS titlu, editura Rezultatul este vizibil în figura 20, observându-se dispariţia celor două înregistrări marcate anterior cu semnul *. Testarea marcajului de ştergere al unei înregistrări se face cu funcţia DELETED() care returnează valoarea logică True (.T.) dacă înregistrarea curentă este marcată pentru ştergere şi False (.F.) în caz contrar. Exemplul 2. În tabelul carte, se testează dacă înregistrările cu numerele 3 şi 4 sunt marcate pentru ştergere. După deschiderea tabelului, cu comanda GO, se realizează poziţionarea pe articolul cu numărul 3, apoi pe cel cu numărul 4. USE carte GO 3 ?DELETED() Rezultatul obţinut în urma secvenţei de instrucţiuni de mai sus este valoarea .T., ceea ce înseamnă că înregistrarea cu numărul 3 este marcată pentru ştergere. GO 4 ?DELETED() Rezultatul obţinut este valoarea .F., însemnând că înregistrarea cu numărul 4 nu este marcată pentru ştergere.
48
Figura 20 Înregistrările marcate pentru ştergere pot fi refăcute, redevenind accesibile tuturor comenzilor. Comanda ce realizează această operaţie este RECALL, cu sintaxa: RECALL [Scope] [FOR lExpression1] [WHILE lExpression2] Comanda are aceleaşi clauze ca DELETE. Exemplul 3. În tabelul carte se va anula marcajul de ştergere pentru titlul FINANTE (figura 21), folosind următoarele instrucţiuni: USE carte RECALL FOR titlu=”FINANTE” LIST FIELDS titlu, editura Se vor afişa pe suprafaţa de lucru doar informaţiile referitoare la titlul cărţilor şi editura la care au apărut.
49
Figura 21 Dacă se foloseşte fereastra Browse, marcarea pentru ştergere se realizează prin alegerea opţiunii Delete Records… din submeniul Table sau, mai simplu, printr-un clic pe marcatorul de ştergere din dreptul înregistrării respective. Acest marcator este un comutator plasat într-o coloană specială din partea stângă a ferestrei (figura 22). Demarcarea unei înregistrări şterse logic se realizează prin deselectarea marcatorului din dreptul înregistrării sau prin alegerea opţiunii Recall Records… din submeniul Table. Ştergerea fizică presupune eliminarea permanentă a înregistrărilor din tabel. Comenzile folosite sunt PACK şi ZAP.
Figura 22 Comanda PACK elimină permanent toate înregistrările marcate în prealabil pentru ştergere. După executarea comenzii, înregistrările şterse nu mai pot fi recuperate. Comanda ZAP şterge definitiv toate înregistrările din tabelul curent, fără ca acestea să fi fost marcate pentru ştergere înainte; este echivalentă cu secvenţa de instrucţiuni: DELETE ALL PACK Dacă se foloseşte fereastra Browse, ştergerea fizică a înregistrărilor marcate logic se realizează prin alegerea opţiunii Remove Deleted Records din submeniul Table.
50
9. Ordonarea înregistrărilor din tabele Exploatarea unui tabel implică ordonarea după anumite criterii a datelor conţinute de acesta. De obicei, încărcarea datelor se realizează într-un mod aleatoriu, iar actualizarea se face după necesităţi obiective ce nu coincid întotdeauna cu ordinea din tabele. Ordonarea unui tabel presupune stabilirea unui criteriu după care să fie parcurse înregistrările. Criteriul de ordonare, numit şi cheie de ordonare, este o expresie alcătuită dintr-un câmp sau o combinaţie de câmpuri ale tabelului. Există două metode de ordonare a unui tabel: • ordonarea fizică a tabelului sau sortarea • ordonarea logică sau indexarea tabelului. 9.1. Sortarea înregistrărilor din tabele Sortarea presupune schimbarea înregistrărilor între ele, după un anumit algoritm, până se obţine ordinea dorită. Se obţine astfel un nou tabel, cu nume diferit, dar cu aceeaşi structură, care conţine aceleaşi înregistrări cu ale tabelului iniţial, dar ordonate după criteriul impus. Sortarea se realizează cu ajutorul comenzii SORT, cu sintaxa: SORT TO TableName ON FieldName1 [/A | /D] [/C] [, FieldName2 [/A | /D] [/C] ...] [ASCENDING | DESCENDING] [Scope] [FOR lExpression1] [WHILE lExpression2] [FIELDS FieldNameList Tabelul care se obţine în urma operaţiei de sortare trebuie specificat în clauza TO. Criteriul de sortare se stabileşte în clauza ON şi poate conţine unul sau mai multe câmpuri, numite chei de sortare. Pentru fiecare câmp cheie, se pot asocia parametri suplimentari: /A pentru ordonare crescătoare după câmpul respectiv, /D pentru ordonare descrescătoare. Parametrul /C (Case sensitive) este folosit în cazul câmpurilor de tip şir de caractere, atunci când se doreşte ignorarea diferenţei prioritare între literele mari şi literele mici. Clauzele ASCENDING şi DESCENDING sunt asemănătoare cu parametrii /A şi /D, dar diferă prin faptul că acţionează la nivel de înregistrare. Prin folosirea clauzelor opţionale [Scope], [FOR], [WHILE], [FIELDS], tabelul rezultat în urma sortării poate să conţină doar înregistrările care satisfac condiţiile de selecţie. Exemplu. Plecând de la tabelul cititori, se vor ordona înregistrările după cheia de sortare nume, selectând doar cititorii din localitatea IASI. În figura 24, în fereastra de comenzi (Command), este prezentată secvenţa corespunzătoare de instrucţiuni, iar într-o fereastră Browse tabela cititsort obţinută în urma sortării.
51
Figura 24 9.2. Indexarea înregistrărilor din tabele Indexarea, spre deosebire de sortare care realizează un nou tabel, presupune o ordonare logică a datelor din tabele, prin crearea unui nou fişier numit fişier index asociat tabelului. Acest fişier nu conţine înregistrări, ci doar informaţii privind ordinea de accesare a înregistrărilor. Prin indexare, ordinea fizică a înregistrărilor din tabel nu se modifică. Se schimbă modul în care utilizatorul are acces la datele respective. 9.2.1. Crearea fişierelor index În versiunile mai vechi de FoxPro există două clase de indecşi: simpli şi compuşi. Indecşii simpli conţin un singur criteriu de indexare, iar cei compuşi mai multe astfel de criterii. Indecşii compuşi sunt şi ei de două tipuri: structurali (memoraţi într-un fişier index cu acelaşi nume cu al tabelului) şi nestructurali (memoraţi în fişiere cu nume diferite de cel al tabelului). Indecşii structurali sunt deschişi automat la deschiderea tabelului, iar cei nestructurali trebuie deschişi explicit. În versiunile Visual FoxPro, indecşii compuşi structurali sunt creaţi implicit, devenind astfel mai avantajoşi. Aceşti indecşi sunt memoraţi întrun singur fişier cu extensia .cdx. Fiecărui index dintr-un asemenea fişier i se atribuie un nume, numit etichetă index. La acest nume se face referire în comenzile de prelucrare. Indecşii compuşi structurali pot fi de mai multe tipuri, şi anume: • normal (Regular) care construiesc pentru fiecare înregistrare a tabelului câte o înregistrare în fişierul respectiv, indiferent de multiplicarea cheii de indexare. Altfel spus, într-un tabel indexat toate înregistrările sunt accesibile, indiferent de valoarea cheii de indexare. • unic (Unique) care permit o valoare unică a cheii de indexare. În cazul tabelelor cu valori repetate ale cheii de indexare, se include în fişierul index numai prima apariţie a înregistrării cu valoarea respectivă a cheii, următoarele înregistrări cu aceeaşi valoare a cheii de indexare fiind ignorate, deşi fizic există.
52
•
candidat (Candidate) - sunt asemănători cu cei unici, dar interzic încărcarea de înregistrări care dublează valoarea cheii de indexare, generând un mesaj de eroare. • cheie primară (Primary) - sunt folosiţi în cazul în care se creează relaţii între tabele, fiind criteriul care identifică în mod unic înregistrările tabelului. Responsabilitatea stabilirii tipului de index îi revine programatorului. Astfel, pentru tabelul cititori.dbf nu se pot stabili indecşi de tip unic, candidat sau cheie primară pentru câmpul nume, întrucât pot exista mai mulţi cititori cu acelaşi nume. În cazul unui index unic, a doua persoană din tabel cu acelaşi nume nu va fi accesibilă, iar în cazul indecşilor candidat sau cheie primară, nu va putea fi introdusă înregistrarea corespunzătoare celei de-a doua persoane. Câmpul nr_permis sau cnp (cod numeric personal) ar putea fi index unic, candidat sau cheie primară, întrucât acestea identifică în mod unic fiecare persoană. Indecşii compuşi structurali pot fi precizaţi odată cu crearea tabelului, direct în fereastra Table Designer, pagina cu eticheta Indexes, după ce în pagina Fields, în câmpul respectiv, a fost marcat fanionul de indexare. Fiecare element ce trebuie introdus în această fereastră a fost descris la crearea tabelelor, pagina Indexes (figura 4.5). O altă modalitate de creare a indecşilor simpli şi compuşi constă în folosirea comenzii INDEX, cu formatul general: INDEX ON eExpression TO IDXFileName | TAG TagName [OF CDXFileName] [FOR lExpression] Prin clauza ON eExpression este precizată ordinea de accesare a înregistrărilor; eExpression poate fi de tip numeric, caracter şi dată calendaristică, incluzând câmpuri din tabel, funcţii, operatori, constante, variabile din memorie. Clauza TO IDXFileName permite crearea unui fişier index simplu (numit şi index de sine stătător), cu extensia implicită .idx şi numele specificat de utilizator. Fiecare fişier conţine un singur index şi este independent de celelalte. Clauza TAG TagName [OF CDXFileName] permite crearea unui fişier index compus, cu extensia .cdx. Într-un astfel de fişier, se poate stoca un număr nelimitat de expresii de indexare distincte. Fişierele structurale se creează implicit prin clauza TAG TagName (nume etichetă) şi au acelaşi nume cu al tabelului. Aşa cum am mai amintit, acest tip de index se deschide automat odată cu tabelul. Fişierele nestructurale se creează cu ajutorul clauzei OF CDXFileName, numele lor fiind specificat explicit de către utilizator. Clauza FOR lExpression permite ca indexul astfel creat să acţioneze ca un filtru asupra tabelului. Următoarele funcţii pot fi asociate operaţiei de indexare: • NDX(), cu sintaxa: NDX(nIndexNumber [, nWorkArea | cTableAlias]), ce returnează numele fişierului index simplu deschis în
53
zona de lucru specificată (nWorkArea) şi care corespunde numărului de ordine dat (nIndexNumber). • MDX() şi CDX() au acelaşi format ca şi NDX() şi returnează numele fişierului index compus deschis. • TAG() – returnează numele fiecărei etichete a indexului compus curent. • KEY() – returnează cheia de indexare. Exemplu. Se va crea pentru tabelul carte un index compus structural pentru accesul cărţilor după valoare, în ordine crescătoare. În fereastra de comenzi se va introduce următoarea secvenţă de instrucţiuni: USE carte DISPLAY ALL INDEX ON valoare TAG valoare DISPLAY ALL ?CDX(1) && afişează numele indexului structural Pe suprafaţa de lucru va fi afişat numele şi calea de acces a fişierului index structural obţinut: C:\PROGRAM FILES\DEVSTUDIO\VFP\CARTE.CDX) Indexarea tabelului presupune crearea fişierului carte.cdx, în care se memorează poziţiile înregistrărilor din tabel, în ordinea dorită (în exemplul considerat, ordine crescătoare, după câmpul valoare). Accesul la datele din tabelul indexat carte se face după schema din figura 25. Dacă se doreşte citirea datelor referitoare la cartea cu valoarea a 5-a ca mărime, se procedează astfel: Sistemul citeşte din fişierul index asociat (carte.cdx) înregistrarea din poziţia a 5-a, care conţine atât valoarea cheii pentru înregistrarea respectivă, cât şi indicatorul către înregistrarea corespunzătoare din tabel. Pe baza acestui indicator, se stabileşte poziţia fizică a înregistrării corespunzătoare din tabel (în exemplul din figura 4.25, după cum indică săgeata, este înregistrarea 1). Se citesc apoi datele din tabel. Carte.cdx Carte.dbf Valoar Poziţi Nr.înre Nume_a … … Valoare Figura 4.25 e e g 89250 10 1 EMINESCU 178500 10710 2 2 BACOVIA 107100 9.2.2. 0 3 REBREANU 142800 Deschiderea 12852 9 4 SADOVEANU 266560 şi închiderea 0 5 VINTILA 226100 fişierelor 14280 3 6 STANCU 476000 index 0 7 PETRUS 178500 17850 1 … … … … … Fişierele 0 index pot fi 17850 7 deschise cu ajutorul mai multor comenzi, dintre care cele 0 mai utilizate sunt: USE, SET ORDER, SET INDEX. 20230 8 0 …. … 54
În cazul comenzii USE, formatul general a fost explicat la paragraful referitor la deschiderea tabelelor, inclusiv clauzele specifice deschiderii fişierelor index (INDEX…, ORDER… etc.). Un tabel poate avea mai mulţi indecşi, dar la un moment dat doar unul este activ. Ordinea în care este parcurs tabelul este determinată de indexul activ. Pentru a activa un alt index, după deschiderea tabelului, se foloseşte comanda SET ORDER cu sintaxa: SET ORDER TO [nIndexNumber | IDXIndexFileName | [TAG] TagName [OF CDXFileName] [IN nWorkArea | cTableAlias] [ASCENDING | DESCENDING]] Clauzele au aceleaşi semnificaţii ca în cazul comenzii INDEX. Exemplul 1. Având creaţi indecşii nume.idx şi cititori.cdx (cu eticheta „oras”), vor fi accesaţi cititorii după eticheta „oras”. Instrucţiunile care se introduc în fereastra de comenzi sunt: USE cititori INDEX nume.idx, cititori.cdx SET ORDER TO TAG oras BROWSE ?TAG(1) && returnează numele etichetei indexului curent Pe suprafaţa de lucru se va afişa rezultatul obţinut şi anume ORAS. Comanda SET INDEX este folosită pentru deschiderea ulterioară a unor fişiere index pentru tabelul curent. Sintaxa comenzii este: SET INDEX TO [IndexFileList | ? ] [ORDER nIndexNumber | IDXIndexFileName | [TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]] [ADDITIVE] Clauzele au aceeaşi semnificaţie ca în cazul comenzii INDEX, cu precizarea că în cazul clauzei ADDITIVE fişierele specificate sunt adăugate la lista deja existentă. Pentru a reactualiza toate fişierele index deschise şi asociate tabelului curent, se foloseşte comanda REINDEX. Pentru închiderea fişierelor index din zona de lucru curentă, cu excepţia celui structural, se folosesc comenzile: SET INDEX TO – fără nici o clauză suplimentară CLOSE INDEX Comenzile CLOSE ALL, USE şi CLOSE DATABASE închid şi fişierele index deschise. Exemplul 2. Se actualizează indecşii nume.idx şi cititori.cdx asociaţi tabelului cititori.dbf. Următoarea secvenţă de instrucţiuni presupune deschiderea tabelului şi a indecşilor precizaţi şi, apoi, actualizarea tabelului: USE carte INDEX nume.idx, cititori.cdx REINDEX
10. Relaţii între tabele 10.1. Stabilirea relaţiilor între tabelele unei baze de date
55
Modelul relaţional al bazelor de date implică organizarea datelor în tabele legate între ele prin relaţii. Aceste relaţii pot fi: • temporare sau dinamice, create prin comenzi în programele de prelucrare, fiind disponibile numai la rularea acestora; • permanente, create automat de sistem la deschiderea bazei de date care conţine tabelele legate, fiind memorate în fişierul bazei de date. Pentru a crea relaţii permanente între tabele, tabelul părinte (conducător) trebuie să aibă un index candidat sau primar şi tabelul copil (condus) – orice fel de index. Faptul că în tabelul părinte indexul este candidat sau primar determină stabilirea unor relaţii de tip 1:1 sau 1:m, întrucât tipul indexului nu permite existenţa mai multor înregistrări cu aceeaşi valoare a cheii de indexare. Exemplul 1. Fiind deschisă baza de date biblioteca.dbc, cu tabelele componente carte.dbf, cititori.dbf, imprumut.dbf şi domeniu.dbf, se cere stabilirea relaţiilor dintre ele. Indecşii necesari stabilirii relaţiilor sunt: - pentru tabelul carte: index primar – câmpul cota şi index normal – câmpul coddomeniu; - pentru tabelul domeniu: index primar – câmpul coddomeniu; - pentru tabelul cititori: index primar – câmpul nr_permis; - pentru tabelul imprumut: index primar – câmpul cota şi index candidat – câmpul nr_permis. În fereastra Database Designer, pentru a realiza legătura între tabelul domeniu.dbf (tabel părinte) şi tabelul carte.dbf (tabel copil), se trage cu mouse-ul indexul coddomeniu din tabelul copil carte.dbf peste indexul cu acelaşi nume din domeniu.dbf. Relaţia stabilită este de tip 1:m. Expresia după care s-a stabilit legătura între aceste două tabele este câmpul comun coddomeniu. Între tabelele împrumut(părinte) şi cititori(copil), precum şi împrumut (părinte) şi carte (copil) se stabilesc relaţii de tip 1:1, în acelaşi mod ca în exemplul precedent. Fereastra Database Designer, cu relaţiile stabilite între tabele, arată ca în figura 26. Stabilirea unei relaţii între două tabele se poate realiza şi cu ajutorul comenzii SET RELATION, cu formatul general: SET RELATION TO [eExpression1 INTO nWorkArea1 | cTableAlias1 [, eExpression2 INTO nWorkArea2 | cTableAlias2 ...] [IN nWorkArea | cTableAlias] Comanda stabileşte o relaţie între tabelul părinte şi unul sau mai multe tabele copii, specificate prin zonele de lucru sau alias-urile lor. Criteriile după care o înregistrare din tabelul copil corespunde unei înregistrări din tabelul părinte sunt specificate prin expresiile eExpression1, eExpression2…
56
Figura 26 Exemplul 2. Se va stabili o relaţie între tabelele domeniu şi carte, indexate, în prealabil, după câmpul comun coddomeniu. USE carte SELECT 2 && selectează zona de lucru 2 USE domeniu SET ORDER TO coddomeniu && activează fişierul index SELECT 1 && selectează prima zonă de lucru SET RELATION TO coddomeniu INTO 2 GOTO 5 && poziţionează cursorul pe înregistrarea 5 DISPLAY SELECT 2 DISPLAY && afişează înregistrarea pentru care valoarea câmpului coddomeniu este identică cu cea din înregistrarea 5 a tabelei carte. Înlăturarea unei relaţii dintre două tabele se face cu comanda: SET RELATION OFF INTO child table care şterge relaţia specificată dintre tabelul activ şi tabelul copil (child table). Comanda SET RELATION TO fără alte clauze şterge toate relaţiile tabelului activ. 10.2. Integritate referenţială Integritatea referenţială reprezintă un ansamblu de reguli impuse tabelelor între care s-au stabilit relaţii. Aceste reguli sunt utile atunci când se doreşte modificarea unor date din tabel. Modificările dintr-un tabel afectează relaţia acestuia cu un alt tabel.
57
Adăugarea unei înregistrări noi, ştergerea sau modificarea unei înregistrări sunt câteva dintre evenimentele tratate prin integritate referenţială. Opţiunile referitoare la integritatea referenţială a unei relaţii se specifică în fereastra Referential Integrity Builder. Pornind din fereastra Database Designer, se execută dublu clic pe linia de legătură dintre cele două tabele şi apoi, din fereastra de dialog Edit Relationship, se selectează butonul Referential Integrity …. Fereastra Referential Integrity Builder (figura 27) conţine trei pagini, fiecare dintre ele controlând câte un eveniment, astfel: • Rules for Updating conţine reguli pentru actualizare, ce includ opţiunile referitoare la modificarea datelor din tabelele legate şi anume: - Ignore (ignorare) – sunt permise modificările unor date din tabelul părinte, chiar dacă înregistrările din tabelul copil rămân fără corespondent. - Restrict (restricţionare) – modificarea este oprită în cazul în care există înregistrări corespunzătoare în tabelul copil. - Cascade (modificare în cascadă) – sunt modificate automat toate înregistrările din tabelul copil conform noii valori a cheii relaţiei. • Rules for Deleting – reguli pentru ştergere; includ opţiunile referitoare la ştergerea înregistrărilor din tabelul părinte ale unei relaţii, astfel: - Ignore (ignorare) – este permisă ştergerea, chiar dacă în tabelul copil există înregistrări legate de înregistrarea ştearsă din tabelul părinte. - Restrict (restricţionare) – opreşte ştergerea atunci când există înregistrări corespunzătoare în tabelul copil. - Cascade (ştergere în cascadă) - sunt şterse automat toate înregistrările din tabelul copil legate de înregistrarea părinte ştearsă. • Rules for Inserting – reguli pentru inserare; cuprind opţiunile referitoare la adăugarea de noi înregistrări la tabelele legate, astfel: - Ignore (ignorare) – este permisă adăugarea noii înregistrări în tabelul copil, indiferent dacă există sau nu corespondent în tabelul părinte. - Restrict (restricţionare) – este generat un mesaj de eroare atunci când se încearcă adăugarea unei înregistrări în tabelul copil fără să existe corespondent în tabelul părinte.
58
Figura 27
11. Generatoare în Visual FoxPro Generatoarele sunt instrumente încorporate în pachetul VFP, care, cu minim de informaţii oferite de utilizator, permit executarea rapidă a unei game largi de acţiuni asupra tabelelor sau a bazelor de date. Ele asigură realizarea uşoară a ecranelor, meniurilor, rapoartelor, interogărilor şi a etichetelor, fără a scrie programe sursă. Principiul de funcţionare a generatorului cere ca utilizatorul să-şi specifice, prin intermediul interfeţei VFP, opţiunile şi cerinţele sale, iar VFP să genereze programe obiect pe baza acestora. În secţiunile următoare se prezintă câteva noţiuni privind realizarea rapoartelor, etichetelor, meniurilor, formelor şi proiectelor cu ajutorul generatoarelor. Generatorul de filtre a fost prezentat în paragraful referitor la interogarea bazelor de date. 11.1. Generatorul de rapoarte Rapoartele reprezintă liste cu structuri complexe ce cuprind ansambluri de informaţii construite pe baza datelor din tabele, informaţii care urmează a fi afişate pe ecran, salvate într-un fişier text sau listate la imprimantă. Generatorul de rapoarte este un utilitar al sistemului VFP care permite utilizatorului construirea raportului în mod interactiv, prin folosirea diferitelor ferestre de dialog, opţiuni etc. Lansarea generatorului de rapoarte se poate face în modul de lucru direct, cu comanda: CREATE REPORT [FileName | ?] sau, în modul de lucru asistat, prin alegerea din meniul File a opţiunii New, butonul Report, pictograma New File sau Wizard. Indiferent de modul de lucru folosit, în bara meniului sistem devine disponibil meniul Report (figura 40) şi se deschide fereastra Report Designer pentru configurarea noului raport (figura 41).
Figura 4.40 Implicit, fereastra de configurare prezintă 3 benzi orizontale (figura.41): • banda Page Header (antet de pagină), în care se pot plasa texte, constante, variabile care vor fi afişate sau tipărite în partea superioară a fiecărei pagini a raportului final (de exemplu: titlu, antet, număr de pagină, dată).
59
• banda Detail (detalii) – reprezintă conţinutul propriu-zis al raportului şi conţine informaţii din baza de date folosite în raport. Pot fi şi câmpuri calculate pe baza expresiilor construite de utilizator. • banda Page Footer (subsol de pagină) cuprinde texte, constante, variabile ce vor fi afişate sau tipărite în partea inferioară a fiecărei pagini din raport. Implicit, în această bandă figurează funcţia Date() şi variabila Page No care afişează data sistemului şi numărul paginii.
Figura.41 Pe lângă aceste benzi, mai pot fi afişate ulterior şi altele, prin alegerea unor opţiuni din meniul Report. Astfel, benzile Title şi Summary sunt afişate prin alegerea opţiunii Title/Summary şi activarea comutatoarelor respective din fereastra de dialog deschisă. Banda Title (titlu) conţine un titlu ce se afişează o singură dată pe prima pagină a raportului. Banda Summary (rezumat) poate cuprinde, pe ultima pagină a raportului, informaţii rezumative şi/sau calcule generale privind datele din raport. Atunci când se doreşte gruparea articolelor după criterii stabilite de utilizator, în fereastra de configurare devin disponibile benzile Group Header (antetul grupului) - ce conţine informaţii care asigură identificarea fiecărui grup în parte şi Group Footer (subsolul grupului) – ce poate conţine calcule intermediare pe baza datelor din fiecare grup, rezumate şi/sau subtotaluri realizate pe baza informaţiilor din grup. Definirea grupurilor de articole se realizează cu opţiunea Data Grouping din meniul Report. Pentru o grupare corectă, înaintea lansării generatorului de rapoarte, este necesară indexarea tabelului după criteriul folosit ca element de grupare. Se pot obţine şi aşa numitele rapoarte rapide prin alegerea opţiunii Quick Report din meniul Report. În fereastra de dialog deschisă (figura 42), se stabileşte structura raportului rapid.
60
Figura 4.42 Butoanele de comandă Field layout stabilesc cum vor fi plasate câmpurile în banda de detalii, respectiv pe coloane sau pe linii. Dacă se activează caseta de validare Titles, atunci, în antetul raportului, vor fi afişate, pe coloane, numele câmpurilor. Dacă se activează şi caseta Add alias, la numele câmpurilor din banda de detalii se va ataşa şi aliasul tabelului din care fac parte. Caseta Add table to data environment activată salvează informaţiile privind starea mediului VFP. Butonul Fields permite selectarea din fereastra Field Picker a câmpurilor ce vor face parte din raport. În benzile rapoartelor pot fi incluse, cu ajutorul instrumentelor din bara utilitară Report Controls Toolbar, activată din meniul View, diferite tipuri de obiecte precum texte, câmpuri ale tabelelor sau câmpuri calculate, elemente grafice (linii, chenare), imagini. Modificarea structurii unui raport creat anterior se face fie prin alegerea din meniul File a opţiunii Open şi apoi a numelui raportului respectiv, fie cu ajutorul comenzii MODIFY REPORT care are următoarea sintaxă: MODIFY REPORT [FileName | ?] Executarea unui raport se realizează cu comanda REPORT FORM: REPORT FORM FileName1 | ? FileName1 reprezintă numele raportului. Exemplu. Se foloseşte tabelul carte, din care se va obţine un raport cu titlul „SITUAŢIA FONDULUI DE CARTE”, în care articolele se grupează după codul domeniului (coddomeniu). Pentru fiecare domeniu, se calculează valoarea totală a cărţilor, iar în finalul raportului, valoarea totală a întregului fond de carte. USE carte INDEX ON coddomeniu TO domen CREATE REPORT carte Din meniul Report se alege opţiunea Quick Report pentru a se obţine un raport rapid. Pentru scrierea titlului, se activează opţiunea Title Band, apoi butonul Label din Report Controls Toolbar si se scrie titlul în zona dorită. Pentru gruparea datelor, din meniul Report se va selecta Data Grouping Insert. Se va activa butonul cu trei puncte pentru a lansa constructorul de expresii (Expression Buider). Din fereastra acestuia, se selectează câmpul după care se doreşte gruparea datelor (coddomeniu) şi după care s-a realizat indexarea bazei de date. Pentru calcularea valorii totale, în banda Group Footer se selectează din bara de instrumente butonul ab (field) şi din fereastra constructorului de expresii (Expression Builder)
61
se selectează câmpul valoare. Se revine apoi la butonul Calculations, de unde se alege tipul de calcul dorit - în cazul exemplului propus - Sum (suma). În banda Summary se calculează asemănător suma totală pentru întregul fond de carte. Fereastra Report Designer va arăta, în final, ca în figura 43.
Figura 43 Pentru previzualizarea raportului obţinut, se foloseşte View Preview, rezultatul fiind cel din figura 44.
Figura 44 11.2. Generatorul de etichete Informaţiile din tabele sau baze de date pot fi prezentate în etichete, sub formă simplificată. Sunt folosite pentru obţinerea cărţilor de vizită, a invitaţiilor, etichetelor produs, etichetelor pentru corespondenţă, fluturaşilor pentru salarii etc. Lansarea generatorului de etichete (Label Designer) se face în modul de lucru asistat, prin apelarea meniului File, opţiunea New, butonul Label şi pictograma New File sau Wizard sau în modul de lucru direct cu comanda: CREATE LABEL [FileName | ?] 62
Pe ecran se deschide fereastra New Label care permite alegerea, dintr-o listă predefinită, a parametrilor fizici ai etichetei ce se va obţine (lăţime, înălţime, număr de etichete pe o pagină). Crearea etichetelor se aseamănă cu crearea rapoartelor, la definirea lor fiind folosit acelaşi meniu Report, împreună cu bara de instrumente Report Controls Toolbar. După alegerea tipului de etichetă, se deschide fereastra de configurare Label Designer, asemănătoare cu fereastra Report Designer. În această fereastră, poate fi obţinută o etichetă rapidă prin activarea opţiunii Quick Report din meniul Report. Într-o astfel de etichetă sunt incluse primele 5 câmpuri din tabelul curent. Pentru configurarea unei etichete personalizate, se folosesc butoanele din Report Controls Toolbar. Modificarea unei etichete create se realizează folosind meniul File, opţiunea Open sau cu comanda: MODIFY LABEL [FileName | ?] Exemplu. Se obţine, plecând de la tabelul carte, o etichetă care va cuprinde cota cărţii (cota) şi codul domeniului din care face parte cartea (coddomeniu). Se deschide tabelul carte. Se scrie comanda CREATE LABEL; se alege tipul de etichetă, iar din meniul Report se selectează opţiunea Quick Report (figura.45).
Figura 45 Field Layout - pentru dispunerea câmpurilor pe verticală. Fields şi eticheta Field Picker. Se aleg câmpurile cota şi coddomeniu în lista Selected fields, apoi butonul OK (figura 4.46).
63
Figura 46
Figura 47 Dacă se doreşte introducerea unui câmp calculat se foloseşte bara de instrumente Report Controls Toolbar, respectiv butoanele pentru text (A) şi pentru câmpuri (ab). Selectarea butonului ab are ca efect deschiderea ferestrei Report Expression. În continuare, selectând butonul cu trei puncte (…) se lansează constructorul de expresii (Expression builder), cu ajutorul căruia se introduce expresia dorită (figura 47). Fereastra Label Designer este prezentată în figura 48.
Figura 48 Previzualizarea etichetei obţinute (carte.lbx) se obţine apelând meniul View, opţiunea Preview (figura 49).
64
Figura 49
12. Elemente de programare clasică 12.1. Scrierea, programelor
modificarea,
depanarea
şi
execuţia
Programul sursă reprezintă totalitatea instrucţiunilor şi/sau comenzilor pregătite şi ordonate conform unui algoritm, utilizate pentru rezolvarea unei anumite probleme sau realizarea unei acţiuni. Ansamblul activităţilor de concepere, dezvoltare şi întreţinere a programelor se numeşte programare. Scrierea şi modificarea programelor sursă se poate realiza cu ajutorul unui editor de texte încorporat în sistemul VFP, lansat cu comanda MODIFY COMMAND sau, altfel, apelând File New Program New File. Formatul general al comenzii este: MODIFY COMMAND [FileName | ?] [NOEDIT] [NOMENU] [NOWAIT] [RANGE nStartCharacter, nEndCharacter] [[WINDOW WindowName1] [IN [WINDOW] WindowName2 | IN SCREEN]] [AS nCodePage] [SAME] [SAVE] Clauza NOEDIT permite vizualizarea programului în fereastra de editare fără posibilitatea de a-l modifica. Clauza NOMENU inhibă afişarea meniului Format din bara meniului sistem. Clauza NOWAIT anulează în program pauza determinată de comanda MODIFY COMMAND, închizând fereastra de editare. Clauza RANGE nStartCharacter, nEndCharacter permite selectarea unei părţi din fişierul de comenzi şi încărcarea acesteia în fereastra de editare. Zona selectată este specificată prin cele două expresii numerice ce delimitează prima şi ultima linie. Clauza WINDOW WindowName1 specifică fereastra ale cărei caracteristici le va prelua fereastra de editare. Clauza IN [WINDOW] WindowName2 | IN SCREEN include fereastra de editare în fereastra specificată sau pe ecran. Clauza SAME permite editarea ferestrei înainte ca aceasta să fie activă. Clauza SAVE permite ca, după părăsirea ferestrei de editare, aceasta să rămână vizibilă pe ecran. Fişierul obţinut în urma editării are extensia .prg. Lansarea în execuţie a programului realizat se efectuează cu comanda DO, urmată de numele programului, prevăzut cu extensie. Dacă extensia este omisă, sistemul va căuta şi executa fişierele cu acelaşi nume şi extensiile .exe (fişier executabil), .app (aplicaţie), .fxp (fişier compilat), .prg (fişier sursă), în această ordine. În timpul execuţiei comenzii DO, 65
sistemul realizează şi compilarea programului. Se verifică dacă instrucţiunile editate sunt corecte din punct de vedere sintactic. Dacă există erori, programul este întrerupt, urmând ca acestea să fie corectate. După compilare, se obţine un fişier cu extensia .fxp. Chiar dacă instrucţiunile sunt corecte din punct de vedere sintactic, pot exista erori la conceperea algoritmului de lucru, erori ce duc la blocarea programului. Acestea pot fi depistate la rularea programului. Pentru a nu realiza blocarea calculatorului prin rularea la infinit a programului, se poate întrerupe execuţia lui cu ajutorul butoanelor Cancel, Suspend, Ignore din fereastra de dialog Program Error sau cu comenzile RETURN (abandonează execuţia programului şi predă controlul programului apelant), CANCEL (termină execuţia şi predă controlul ferestrei de comenzi), QUIT (închide sesiunea de lucru Visual FoxPro). Procesul de detectare şi eliminare a erorilor dintr-un program poartă numele de depanare. Depanatorul inclus în VFP (Debugger) este unul performant, oferind facilităţi precum rularea pas cu pas a instrucţiunilor, rularea la viteză redusă, rularea continuă până la un anumit punct, vizualizarea dinamică a conţinutului variabilelor folosite în programul depanat etc. O dată pornit depanatorul, execuţia unui program este însoţită de urmărirea sa în depanator şi invers, un program rulat în depanator îşi produce efectele în VFP. Altfel spus, programul apare rulând în ambele aplicaţii (depanator şi VFP), în depanator urmărindu-se instrucţiunile executate, iar în SGBD efectul acestora. 12.2. Structuri de control În cadrul modelului programării structurate există trei structuri fundamentale: secvenţială sau liniară, alternativă sau ramificată şi repetitivă. Structura liniară este cea în care instrucţiunile sunt executate una după alta, în ordinea în care apar în program. Structura alternativă condiţionează executarea unui grup de instrucţiuni de rezultatul evaluării unei condiţii. Sunt folosite comenzile IF…ENDIF (structura alternativă cu o ramură şi două ramuri), DO CASE… ENDCASE (structura alternativă cu mai multe ramuri) şi funcţia IIF(). Comanda IF…ENDIF are sintaxa următoare: IF lExpression [THEN] Commands [ELSE Commands] ENDIF Este evaluată expresia (lExpression) şi dacă este adevărată se execută tot grupul de instrucţiuni până la ELSE sau, dacă lipseşte ELSE, până la ENDIF. Dacă nu este îndeplinită condiţia şi ELSE există, atunci se execută tot grupul de instrucţiuni de la ELSE până la ENDIF. Funcţia IIF() are un efect asemănător cu al comenzii IF…ENDIF. Formatul general al funcţiei este: IIF(lExpression, eExpression1, eExpression2)
66
Se evaluează condiţia şi, dacă este îndeplinită, se returnează valoarea eExpression1, în caz contrar returnându-se valoarea eExpression2. Structura alternativă cu mai multe ramuri permite selectarea unei singure alternative din mai multe posibile. Este implementată prin comanda DO CASE… ENDCASE: DO CASE CASE lExpression1 Commands [CASE lExpression2 Commands ... CASE lExpressionN Commands] [OTHERWISE Commands] ENDCASE Execuţia comenzii are loc astfel: este evaluată prima expresie logică şi, dacă este adevărată, se execută secvenţa de instrucţiuni (Commands). În caz contrar, este evaluată următoarea expresie logică şi se execută secvenţa de instrucţiuni corespunzătoare etc. După identificarea primei expresii logice adevărate şi executarea secvenţei de comenzi corespunzătoare, comanda se încheie, programul continuând cu prima instrucţiune de după ENDCASE. Dacă toate expresiile logice evaluate sunt false, se execută grupul de comenzi corespunzător clauzei OTHERWISE, iar în cazul în care clauza este absentă, se încheie execuţia comenzii. Comanda DO CASE simulează o cascadă de IF-uri, aşa încât orice IF poate fi înlocuit cu o structură DO CASE care are o singură ramură CASE. Structurile repetitive alcătuiesc aşa numitele „bucle”, ce reprezintă secvenţe de comenzi executate de mai multe ori. Aceste secvenţe de instrucţiuni se împart în două grupe: - cu număr cunoscut de paşi – în care un grup de comenzi se execută de un număr cunoscut de ori. - cu număr nedefinit de paşi – în care un grup de comenzi se execută de un număr variabil de ori, dependent de o condiţie a comenzii. Comenzile folosite în cazul primei grupe sunt FOR…ENDFOR şi SCAN…ENDSCAN. Comanda FOR are sintaxa: FOR Var = nInitialValue TO nFinalValue [STEP nIncrement] Commands [EXIT] [LOOP] ENDFOR | NEXT Comanda determină executarea repetată a grupului de instrucţiuni (Commands). Variabila Var contorizează numărul de execuţii ale buclei FOR. Valoarea iniţială a variabilei contor va fi nInitialValue. După fiecare execuţie a grupului de instrucţiuni, dacă există clauza STEP, variabila este incrementată/decrementată cu o valoare de increment (nIncrement); dacă această clauză lipseşte, valoarea de incrementare este 1. La prima 67
execuţie a grupului de instrucţiuni, variabila Var va avea valoarea iniţială (Initial Value), la a doua execuţie – valoarea iniţială plus valoarea de increment, la a treia execuţie – valoarea iniţială plus valoarea de increment luată de două ori etc. Atunci când valoarea variabilei (Var) creşte peste valoarea finală (Final Value) sau scade sub valoarea finală (în cazul incrementului negativ), se va ieşi din buclă, programul continuând cu următoarea instrucţiune de după ENDFOR. Comanda LOOP determină reluarea executării comenzii FOR, iar EXIT – ieşirea forţată din ciclul FOR şi continuarea execuţiei programului cu comanda imediat următoare de după ENDFOR. Cea de-a doua comandă din cadrul primei grupe, SCAN…ENDSCAN are formatul general: SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2] [Commands] [LOOP] [EXIT] ENDSCAN Comanda este specializată în lucrul cu tabele şi realizează parcurgerea tabelului curent şi executarea grupului de instrucţiuni (Commands) pentru fiecare înregistrare care aparţine domeniului specificat prin clauzele Scope, FOR şi WHILE. Cel de-al doilea tip de buclă, cu număr nedefinit de paşi, este implementat prin intermediul comenzii DO WHILE…ENDDO. Formatul general al comenzii este: DO WHILE lExpression Commands [LOOP] [EXIT] ENDDO Comanda determină execuţia repetată a grupului de instrucţiuni (Commands), atât timp cât valoarea expresiei logice (lExpression) este adevărată (.T.). Dacă în urma evaluării expresiei logice se obţine valoare falsă (.F.), execuţia comenzii se încheie. Dacă este îndeplinită condiţia, se vor executa comenzile dintre DO WHILE şi ENDDO până când, în urma evaluării expresiei logice, se obţine valoarea fals; în acest caz, execuţia buclei se încheie şi programul continuă cu prima instrucţiune de după ENDDO. Comenzile LOOP şi EXIT au aceeaşi semnificaţie ca la comanda FOR…ENDFOR. Se prezintă în continuare câteva exemple în care se folosesc comenzile precedente. Exemplul 1. Pornind de la tabelul cititori, următoarea secvenţă de program va afişa care cititori sunt din IASI şi care nu. Comanda ? este folosită pentru afişarea pe ecran a unor expresii. USE cititori DO WHILE NOT EOF() IF localitatea="IASI" ?"Cititorul "+ nume+"este din IASI" 68
ELSE ?"Cititorul "+ nume +"nu este din IASI" ENDIF SKIP ENDDO Rezultatul obţinut în urma execuţiei secvenţei de program de mai sus este redat în figura 50.
Figura 50 Exemplul 2. Acelaşi efect ca în exemplul precedent îl are şi secvenţa de program corespunzătoare acestui exemplu. Se foloseşte funcţia IIF() în locul comenzii IF…ENDIF. USE cititori DO WHILE NOT EOF() ? IIF(localitatea="IASI", "cititorul " + nume +; "este din Iasi", "cititorul" + nume + "nu este din IASI") SKIP ENDDO Rezultatul obţinut în urma execuţiei sevenţei de instrucţiuni de mai sus este la fel cu cel prezentat în figura 4.28. Exemplul 3. Se creează un program cu câteva opţiuni legate de operaţii cu tabele (adăugare înregistrări, modificare, listare). Utilizatorul va alege o opţiune dintr-o listă, urmând ca programul, în funcţie de alegere, să execute operaţiile. Pentru început, se afişează meniul de opţiuni. În continuare, în program, se foloseşte comanda INPUT, cu ajutorul căreia utilizatorul va introduce opţiunea proprie. Secvenţa de program corespunzătoare este: USE cititori ? "1. Introducere noi înregistrări" ? "2. Modificare înregistrări " ? "3. Listare" ? "4. Ieşire” INPUT "Introduceţi opţiunea " TO var DO CASE CASE var = 1 APPEND CASE var = 2
69
BROWSE CASE var = 3 LIST OTHERWISE QUIT ENDCASE Ca rezultat al execuţiei programului din exemplu, pe ecran se va afişa meniul de opţiuni creat (figura 51), urmând ca ulterior utilizatorul să introducă opţiunea dorită, iar programul să execute operaţiile.
Figura 51 Exemplul 4. Plecând de la tabelul carte, se afişează titlul şi autorul cărţilor apărute la editura POLIROM. În acest scop, se va folosi comanda SCAN…ENDSCAN. USE carte SCAN FOR editura="POLIROM" ? titlu, nume_a ENDSCAN Rezultatul obţinut în urma execuţiei secvenţei de comenzi este prezentat în figura 52.
Figura 52 Exemplul 5. Considerând tabelul carte, se calculează şi se afişează pe ecran valoarea totală a cărţilor. Vor fi folosite variabilele de memorie nr (iniţializată prin funcţia RECCOUNT() care returnează numărul total de înregistrări din tabel) şi total (care va însuma valoarea tuturor cărţilor din tabel). Astfel, secvenţa de program va cuprinde instrucţiunile: USE carte nr =RECCOUNT() total=0 FOR i=1 TO nr GO i total = total +valoare ENDFOR ?"Valoarea totala a cărţilor este:", total, "lei"
70
După execuţia programului de mai sus, pe suprafaţa de lucru va fi afişat textul Valoarea totala a cărţilor este: şi rezultatul obţinut în urma calculului, respectiv 2474130 lei.
71
CAPITOLUL 3
NOŢIUNI DE BAZĂ PRIVIND PROGRAMELE DE CALCUL TABELAR Foaia de calcul, registrul de lucru, tipuri de date, formule, funcţii, comenzi, macro-comenzi Instrumentul specific de lucru al programelor de calcul tabelar este centralizatorul electronic. Centralizatorul electronic reprezintă un tabel de dimensiuni foarte mari, structurat în linii şi coloane, în care se pot defini simplu modelele de rezolvare a problemelor. În literatura de specialitate de la noi este întâlnit şi sub alte denumiri: foaie de calcul electronică, tabel electronic sau chiar "spreadsheet", după denumirea din limba engleză. În literatura de specialitate din alte ţări apare, de asemenea, sub diverse denumiri: spreadsheet (worksheet) în engleză, feuille de calcul electronique, respectiv tableur în franceză, chiffreur în franceza canadiană, hoja de calculo în spaniolă. Foaia de calcul electronică oferă posibilităţi de introducere a datelor şi definire a modelelor, posibilităţi de calcul, posibilităţi de vizualizare, posibilităţi de exprimare grafică, posibilităţi de simulare etc (vezi fig. nr. 3.1). Registrul de lucru (workbook) este un fişier cu extensia .xls în care sunt stocate modelele definite şi datele în Excel. Un registru de lucru poate conţine mai multe foi de calcul (sheet, worksheet), ceea ce permite reunirea şi organizarea unor tipuri variate de informaţii într-un singur fişier. Astfel, un grafic poate fi plasat în foaia de calcul ce conţine datele sau într-o foaie distinctă (chart sheet) care va fi inclusă în registrul de lucru. În Excel, numele foilor de calcul apar în partea de jos a ferestrei de lucru (vezi fig. nr. 3.2), având asociate implicit numele Sheet1, Sheet2 ş.a.m.d., nume pe care utilizatorul le poate modifica după dorinţă. Când se execută clic pe numele unei foi de calcul, această devine foaia de calcul curentă.
72
indicator c ăsuţă curentă
linia de titlu
linia de meniu
linia de editare
linia de stare
buton de derulare orizontal ă
linii de instrumente
linia de derulare vertical ă
3.1. Model de analiză a rentabilităţii pe produse în EXCEL
foaia de calcul curentă
Fig. nr.
foi de calcul
deplasare la următoarea/precedenta foaie de calcul deplasare la prima/ultima foaie de calcul
Fig. nr. 3.2. Dispunerea foilor de calcul într-un registru de lucru
Fiecare căsuţă (casetă, celulă) poate fi referită printr-o adresă (referinţă) care indică linia şi coloana la întretăierea căreia se află. Sunt două stiluri practicate pentru specificarea adreselor: •
stilul consacrat de LOTUS: A1; A2; F5; …;IV16384;
• stilul consacrat de MULTIPLAN: R1C1; R2C1; R5C6; …;R16384C256. În mod implicit, EXCEL utilizează stilul A1, în care coloanele sunt identificate cu o literă (de la A la IV, pentru cele 256 de coloane), iar liniile cu numere (de la 1 la 65536). Se poate trece la stilul R1C1, prin comanda Options din meniul Tools, din care se selectează opţiunea R1C1 reference style din pagina General. Acest stil este util atunci când se lucrează 73
cu macrouri, deoarece face posibilă calcularea poziţiei rândurilor sau coloanelor din foaia de calcul. Pentru a face referire la un grup de căsuţe, se vor indica adresa colţului stânga-sus şi adresa colţului dreapta-jos ale zonei de specificat, separate prin caracterul : (două puncte). Într-o foaie de calcul se pot referi şi date din alte foi de calcul ale aceluiaşi registru, sau chiar din alt registru de lucru. În acest caz, adresa căsuţei va fi precedată de numele foii de calcul (având ca separator caracterul !), iar dacă este dintr-un alt registru, se va specifica şi numele acestuia, între paranteze pătrate (vezi exemplele de mai jos). Exemple:
• A20 (căsuţa aflată pe coloana A şi pe rândul 20) • F10:F20 (grupul de căsuţe de pe coloana F, pe rândurile de la 10 la 20) • B12:E12 (grupul de căsuţe de pe rândul 12, pe coloanele de la B la E) • 6:6 (toate căsuţele de pe rândul 6) • 4:8 (toate căsuţele de pe rândurile de la 4 la 8) • C:G (toate căsuţele de pe coloanele de la C la G) • Studenti!C5 (căsuţa C5 din foaia de calcul Studenti, din acelaşi registru) • [d:\utilizatori\medii.xls]Evaluare!D2 (căsuţa D2 din foaia de calcul Evaluare, din registrul de lucru salvat în fişierul medii.xls)
Programele de calcul tabelar lucrează, în principiu, cu două tipuri esenţiale de date: date numerice şi date tip şir de caractere. Sistemul detectează tipul datei după natura primului caracter introdus sau după conţinut. În principiu, dacă primul caracter este o literă data este considerată de tip şir de caractere, dacă începe cu o cifră data este considerată de tip numeric. Programele de calcul tabelar gestionează şi date calendaristice: intern ele sunt reprezentate ca valori numerice, iar afişarea se poate face în diferite formate. De exemplu, pentru ca raportul din fig. nr. 3.1. să conţină data calendaristica de 11-Feb-99, trebuie ca în caseta B3 să introducem numărul 36202 (vezi fig. nr. 3.3.) şi să solicităm prin comanda Format, Cells afişarea ca dată calendaristică. De regulă, Excel recunoaşte o dată calendaristică atunci când este introdusă în formatul ll/zz/aa. Astfel, 01/25/00 va fi interpretat ca data de 25 ianuarie 2000. În legătură cu specificarea anului prin ultimele două cifre, se aplică următoarele reguli: • anii 2000 – 2029 sunt recunoscuţi atunci când se scriu valorile 00, 01, …, până la 29 (spre exemplu, 5/21/23 este interpretat ca 21 mai 2023); • anii 1930 – 1999 sunt recunoscuţi atunci când se scriu valorile 30, 31, …, până la 99. Trebuie precizat că programul de calcul tabelar Excel poate lucra cu 2 sisteme pentru date calendaristice: sistemul 1900 (utilizat implicit de Excel pentru Windows) şi sistemul 1904 (utilizat implicit de Excel pentru Macintosh). În sistemul 1900, pentru 1 ianuarie 1900 corespunde valoarea numerică 1, iar pentru 31 decembrie 9999 valoarea 2958465. Sistemul 1904 începe numărătoarea cu 2 ianuarie 1904, ce are asociată valoarea 1 şi o finalizează cu 31 decembrie 9999, pentru care asociază valoarea 2957063. Pentru a schimba sistemul 1900, din meniul Tools se alege Options, unde se alege opţiunea 1904 date system din pagina Calculation. 74
Conţinutul unei căsuţe poate fi şi o formulă sau o funcţie. Formulele şi funcţiile încep printr-un caracter special: =; +; -; @; etc. Prin intermediul acestora se poate exprima o mare diversitate de calcule. De fapt, formulele şi funcţiile sunt elementele esenţiale ale centralizatorului electronic, din care derivă performanţa şi capacităţile de simulare. Printr-o formulă se defineşte conţinutul unei căsuţe în funcţie de conţinutul altor căsuţe. Relaţia rămâne adevărată pentru orice conţinut al căsuţelor folosite ca argumente în formule. Dacă se schimbă conţinutul căsuţelor folosite ca argumente, instantaneu se modifică şi conţinutul căsuţei care conţine formula. Modelul prezentat în fig. nr. 3.3. poate fi utilizat în analiza rentabilităţii mai multor categorii de produse. Este suficient să introducem datele de intrare, iar pe baza formulelor existente vom obţine imediat rezultatele. Întrucât graficul din fig. nr. 1. este construit pe baza datelor din prima parte a modelului, de fiecare dată se va modifica şi graficul. Dacă sunt mai multe produse vom trece la inserarea de linii, respectiv la copierea formulelor deja introduse.
Fig. nr. 3.3. Formule şi funcţii utilizate în modelul de rezolvare EXCEL
O formulă/funcţie care specifică o relaţie de calcul valabilă pentru mai multe rânduri sau coloane poate fi copiată; adresele căsuţelor se vor actualiza corespunzător. În cazul mutării unei formule, adresele nu se actualizează. Astfel, dacă formula =D5-C5 din E5 este copiată în E6 ea devine =D6-C6. Acest tip de adrese se numesc adrese relative. În schimb, dacă se copie formula =E5*$F$3 din G5 în G6 aceasta devine =E6*$F$3 şi nu =E6*F4. $F$3 face parte din categoria adreselor absolute. Dacă dorim ca o căsuţă să conţină aceeaşi valoare ca şi o altă căsuţă, se va introduce semnul egal, urmat de adresa căsuţei ce conţine valoarea respectivă. Căsuţa ce conţine această
75
formulă se numeşte căsuţă dependentă: atunci când se modifică valoarea din căsuţa referită, ca efect al recalculării automate, se va modifica şi conţinutul căsuţei dependente. Corectarea formulelor introduse, ştergerea conţinutului unor căsuţe sau grupuri de căsuţe se poate face la fel de simplu şi rapid ca în procesoarele de texte. Pentru corectare se utilizează linia de editare (vezi fig.nr. 3.1), care se apelează prin executarea unui clic sau prin apăsarea tastei F2. Ştergerea se realizează cu ajutorul tastelor Delete sau Backspace. De asemenea, există posibilitatea atribuirii de nume unor căsuţe sau grupuri de căsuţe astfel că scrierea formulelor devine mai simplă, mai rapidă şi mai aproape de logica problemei de rezolvat. De exemplu, =SUM(costuri); =SUM(preturi); =SUM(profit) sunt mult mai semnificative din punct de vedere al analizei rentabilităţii decât =SUM(C5:C7); =SUM(D5:D7); =SUM(E5:E7) (vezi fig.nr. 3.3). În acest scop, grupului C5:C7 i se atribuie numele costuri, grupului D5:D7 i se atribuie numele preturi, iar grupului E5:E7 i se atribuie numele profit. Funcţiile reprezintă formule predefinite în sistem. Utilizatorul trebuie doar să specifice numele funcţiei şi argumentele, respectând regulile de sintaxă. Numărul şi natura argumentelor depind de tipul funcţiei: matematice, logice, financiare, speciale, statistice, pentru baze de date, pentru date calendaristice etc. În fig. nr. 3.3. s-a exemplificat utilizarea funcţiei statistice SUM. În locul funcţiei =SUM(C5:C7) se putea folosi şi formula: =C5+C6+C7. La fel ca limbajele de programare din generaţiile anterioare, programele de calcul tabelar dispun de comenzi şi macro-comenzi prin care se pot defini şi declanşa anumite operaţiuni sau parametri (inserare de linii, coloane, căsuţe etc.; stabilire parametri de format; gestionare ferestre de afişare etc.). Comenzile permit declanşarea unor operaţiuni în foaia de calcul şi sunt desemnate prin cuvinte cheie. Comenzile sunt grupate în meniuri şi submeniuri cu mai multe niveluri. În versiunile sub MS-DOS se utilizau, de obicei, meniuri tip linie. În versiunile sub Windows se utilizează meniuri derulante (vezi fig. nr. 3.4.). Concomitent se asigură posibilitatea folosirii rapide a comenzilor mai des întâlnite prin intermediul pictogramelor din liniile de instrumente afişate în partea superioară a ecranului. De asemenea, există şi posibilitatea definirii şi utilizării de linii de instrumente personalizate.
Fig. nr. 3.4. Secvenţă din sistemul de comenzi EXCEL
76
Tabelul nr. 3.1. Exemplu de macrou Excel
EXCEL versiunea 7.0 ' ' Macro1 Macro ' Macro recorded 02-12-00 by StEcon ' Sub Macro1() ActiveCell.FormulaR1C1 = "=NOW()" Selection.NumberFormat = "d-mmmyy" Selection.Columns.AutoFit End Sub
Macro-comenzile (macro-urile) sunt similare instrucţiunilor şi comenzilor din limbajele de programare clasice şi permit descrierea grupurilor de operaţiuni repetitive. În acest fel nu mai este necesară repetarea comenzilor ci doar apelarea modulelor de program realizate. Modulele de program poate fi asociate unor combinaţii de taste, unor obiecte sau pot fi organizate în meniuri şi submeniuri similare celor oferite de sistem. Primele versiuni ale programelor de calcul tabelar utilizau un limbaj de macro-uri asemănător limbajelor de asamblare (se bazau pe mnemonice obţinute din iniţialele comenzilor). Ultimele versiuni folosesc ca limbaj de macro-uri un limbaj evoluat (ex. EXCEL foloseşte limbajul Visual Basic for Applications). În plus oferă şi posibilitatea înregistrării automate a macro-urilor. În tabelul 3.1 se exemplifică un modul de program pentru inserarea datei calendaristice în EXCEL. Dacă iniţial programele de calcul tabelar se bazau doar pe utilizarea facilitaţilor oferite de foile de calcul, pe măsura evoluţiei ele au devenit instrumente software integrate. Asfel un program de calcul tabelar integrează, în general, instrumente destinate următoarelor lucrări: • definirea modelelor în foile de calcul; • reprezentarea grafică a datelor din modelele definite; • crearea şi editarea de obiecte grafice (Drawing toolbar); • baze de date (liste); • definirea de programe, utilizând tehnica macro-urilor; • instruire sau facilităţi de tip Help; • navigare Web; • import/export de date de la/către alte programe de calcul tabelar sau SGBD-uri.
Sistemul de ajutor La fel ca majoritatea aplicaţiilor din categoria 4GL, programele de calcul tabelar se învaţă lucrând. În cazul Excel, se oferă asistenţă interactivă extinsă, îmbunătăţită de la o versiune la alta. Astfel, utilizatorul are 3 alternative pentru a obţine rapid informaţia solicitată (vezi şi fig. nr. 3.5):
77
• căutare în indexul interactiv (meniul Help, opţiunea Contents and Index); • formularea unei întrebări (meniul Help, opţiunea Microsoft Excel Help sau Office Assistant din linia de instrumente); • obţinerea de informaţii despre elementele afişate pe ecran (meniul Help, opţiunea What’s this sau butonul Help contextual din linia de instrumente). Help contextual Office Assistant
Fig. nr. 3.5. Linia de instrumente Standard. Butoanele Help
Comanda Contents and Index din meniul Help deschide fereastra Help Topics, în care sunt incluse 3 categorii de comenzi, grupate în 3 pagini: • Contents afişează informaţii grupate în funcţie de acţiunile întreprinse (crearea unei foi de calcul, exportul de date, formatarea căsuţelor ş.a.m.d.); • Index afişează o listă a tuturor operaţiunilor, comenzilor şi opţiunilor Excel, în ordine alfabetică. Este posibilă deplasarea directă în cadrul listei prin tastarea uneia sau mai multor litere sau a cuvintelor căutate; • Find permite căutarea în toate resursele Help a unor cuvinte cheie specifice, definite de utilizator. O modalitate mai prietenoasă de a obţine informaţii interactiv este dialogul cu asistentul (Office Assistant), care se poate apela din meniul Help, din linia de instrumente sau prin apăsarea tastei F1 (cu menţiunea că, prin opţiunea utilizatorului, tasta F1 poate fi asociată şi comenzii Contents and Index din meniul Help). În toate produsele Microsoft Office asistentul apare sub numele Clippit, iar forma de prezentare este cea din imaginea alăturată. Dialogul cu asistentul arată ca în fig. nr. 3.6. Utilizatorul va formula întrebarea şi o va specifica în caseta text, după care va lansa comanda Search. Office Assistant înlocuieşte facilităţile de ajutor Answer Wizard şi Tip Wizard din versiunile anterioare Excel.
Fig. nr. 3.6. Dialogul cu asistentul în EXCEL
78
În fine, utilizatorul poate afla explicaţii despre ceea ce este afişat pe ecran folosind sistemul de help contextual, care se apelează din meniul Help (opţiunea What’s this), din linia de instrumente sau prin combinaţia Shift-F1. La apelarea acestei opţiuni cursorul îşi modifică aspectul, ataşându-i-se un semn de întrebare. Dacă se doresc explicaţii asupra semnificaţiei unui element de pe ecran, se plasează indicatorul mouse-ului pe elementul respectiv şi se execută clic. Este exemplificată alături o astfel de explicaţie, pentru comanda asociată butonului Format Painter din linia de instrumente standard. Trebuie precizat ca help-ul contextual rămâne activ până la selectarea unui element pentru care se doresc explicaţii. El mai poate fi dezactivat prin apăsarea tastei Esc sau prin clic pe butonul corespunzător din linia de instrumente. O variantă a help-ului contextual este Tooltip prin care se afişează numele comenzilor asociate butoanelor din liniile de instrumente de pe ecran atunci când indicatorul mouse-ului este poziţionat pe un buton. Această opţiune (Show Tooltips) poate fi activată sau inhibată din meniul View, Toolbars.
79
PRINCIPII DE REALIZARE A APLICAŢIILOR INFORMATICE ÎN PROGRAMELE DE CALCUL TABELAR Reguli de respectat în proiectarea şi utilizarea aplicaţiilor în programele de calcul tabelar Programele de calcul tabelar reprezintă instrumente orientate către utilizatorii finali, care oferă modele şi tehnici de lucru apropiate de modalităţile curente de rezolvare a problemelor. Astfel proiectarea aplicaţiilor este la latitudinea utilizatorilor. Dar realizarea de aplicaţii eficiente şi interschimbabile solicită respectarea anumitor reguli13. R1. În formule şi funcţii se recomandă să nu se folosească ca argumente constantele. În principiu, orice formulă sau funcţie reprezintă un potenţial model de simulare. Utilizarea constantelor ca argumente elimină, din start, acest potenţial. Reutilizarea modelului va solicita de fiecare dată rescrierea formulelor sau funcţiilor. Dacă modelul de rezolvare presupune utilizarea unor constante, acestea vor fi plasate în căsuţe distincte şi vor fi apelate prin referinţe absolute. R2. Dimensionarea mărimii liniilor şi coloanelor se face în funcţie de datele cele mai semnificative şi nu de construcţiile cu rol explicativ din antetul de linie sau coloană. Se recomandă ca această operaţiune să fie efectuată la terminarea construirii modelului în foaia de calcul. În mediul WINDOWS dimensionarea mărimii liniilor şi coloanelor se poate realiza rapid cu ajutor mouse-ului sau prin comenzi de tip Format/Row/AutoFit sau Format/Column/AutoFit. R3. Pentru lucrările frecvente (facturi, ordine de plată, state de salarii etc.) se recomandă utilizarea "şabloanelor" oferite de sistem (Spreadsheet Solutions) sau definite de utilizatori în fişiere de tip Template (cu extensia .xlt în Excel). R4. Deplasarea în foaia de calcul, din raţiuni de eficienţă, nu se va realiza exclusiv prin utilizarea tastelor de deplasare tip săgeată (←;↑;→;↓). Enumerăm, mai jos, câteva soluţii eficiente de deplasare în foaia de calcul: • utilizarea de taste care permit deplasarea mai rapidă: PgUp; PgDown; Home; • utilizarea de combinaţii de taste: • CTRL + → sau ←;↑;↓; • END + → sau ←;↑;↓; • utilizarea butoanelor de deplasare, respectiv a liniilor de deplasare verticale sau orizontale din fereastra de vizualizare a foii de calcul;
Oprea, D., Airinei, D., Meşniţă, G., Dumitriu, F., Aplicaţii cu macro-uri LOTUS 1-2-3, Editura Policromia, Piatra Neamţ, 1995, pp. 36-39. 13
80
• inserarea de butoane suplimentare pentru deplasarea rapidă de la o zonă la alta din foaia de calcul; • utilizarea comenzilor de tip GOTO sau GOTO Special combinate cu atribuirea de nume diferitelor zone din modelul de rezolvare R5. Când se lucrează cu foi de calcul multidimensionale se recomandă atribuirea de nume semnificative fiecărei foi, în raport de componentele modelului de rezolvare (ex. în loc de Sheet1, Sheet2, Sheet3, …, Sheetn se vor folosi denumiri cum ar fi: Meniuri, Help, Preluare facturi, Centralizare, Tiparire etc. ). R6. Înainte de a trece la utilizarea modelului realizaţi salvarea acestuia, prin comenzi de tip SAVE, într-un fişier cu nume adecvat lucrării (Facturi, Stat_sal, Casa, Devize etc.). În caz contrar, riscaţi să pierdeţi tot ce aţi lucrat dacă la execuţie sistemul se blochează sau intervine un incident neprevăzut. Pentru mai multă siguranţă, realizaţi chiar salvări periodice. Dacă lucraţi pe un calculator utilizat de mai multe persoane, atunci e recomandabil să aveţi un subdirector propriu în care să depozitaţi toate lucrările. R7. Componentele modelului de rezolvare se dispun în cascadă în cadrul aceleiaşi foi de calcul sau în foi de calcul diferite. În acest fel se evită alterarea componentelor modelului de rezolvare la actualizarea unora prin inserarea de linii sau coloane. R8. La terminarea construirii modelului se trece la protejarea tuturor zonelor definite în afară de zonele rezervate datelor de intrare. Dacă zonele sunt protejate nu se mai pot face nici un fel de modificări asupra conţinutului. În acest mod se evită riscul deteriorării voluntare sau involuntare a modelului de rezolvare. Protecţia şi asigurarea confidenţialităţii aplicaţiilor poate fi asigurată şi prin tehnica ascunderii de linii sau coloane. De asemenea, pentru a preveni supraîncărcarea registrului de lucru sau pentru a proteja anumite date, şi foile de calcul pot fi ascunse. Se utilizează în acest scop comenzile Hide/Unhide corespunzătoare elementelor respective (Sheet, Row, Column). R9. Pentru lucrările mai complexe se recomandă utilizarea macro-comenzilor prin limbajul de macro-uri disponibil. Prelucrările repetitive sunt astfel încorporate în programe ce se apelează ori de câte ori sunt necesare de efectuat. Majoritatea versiunilor din programele de calcul tabelar oferă facilităţi de înregistrare automată a macro-urilor. R10. Nu reinventaţi roata!!! Foarte multe din problemele economice sunt deja rezolvate în programele de calcul tabelar, trebuie doar să furnizaţi corect argumentele unor funcţii sau să apelaţi la modulele de asistenţă/ajutor (ex.: calculul dispersiei - VAR; calculul mediei aritmetice - AVERAGE; determinarea trendului unui fenomen - TREND; determinarea ratei interne de rentabilitate - IRR etc.)
81
CATEGORII DE FUNCŢII DIN PROGRAMELE DE CALCUL TABELAR ŞI POSIBILITĂŢI DE UTILIZARE ÎN SIMULĂRI Funcţiile din programele de calcul tabelar reprezintă formule des utilizate, prin care se poate executa o mare varietate de calcule, în mod rapid şi comod. Se pot efectua calcule financiare, matematice, statistice, cu şiruri de caractere, cu date calendaristice etc. De asemenea, funcţiile se pot folosi pentru crearea de expresii condiţionale sau pentru efectuarea de căutări în tabele. Alături de formule şi macro-uri, funcţiile asigură performanţele sporite programelor de calcul tabelar, mai ales în simulări. Deoarece fiecare program de calcul tabelar, respectiv fiecare versiune, are anumite particularităţi ne vom opri la o prezentare de principiu a pricipalelor categorii de funcţii din EXCEL, cu particularizare pe versiunea 8 (Excel 97).
Sintaxa funcţiilor În Excel funcţiile sunt precedate de semnul =. Pentru utilizatorii de Lotus, Excel asigură compatibilitatea, astfel că se pot introduce funcţiile precedate de caracterul @. Fiecare funcţie are o anumită sintaxă. Dacă sintaxa funcţiei nu este respectată, sistemul nu o poate interpreta, fiind generat un mesaj de eroare (vezi subcapitolul 3.4.5). Funcţiile din Excel au următorul format general: FUNCŢIE( ) sau FUNCŢIE(argument_1,argument_2,...,argument_n) FUNCŢIE reprezintă numele funcţiei. argument_1,argument_2,...,argument_n reprezintă datele pe care funcţia le va utiliza în calcule. Dacă funcţia are în sintaxă argumente, acestea trebuie să fie incluse în paranteze rotunde. Chiar dacă argumentele lipsesc, se vor preciza parantezele. Argumentele precizează obiectul funcţiilor, acele valori utilizate de funcţii pentru a realiza operaţiuni sau calcule specifice. Ele se exprimă prin adresele căsuţelor (referinţele) ce conţin valorile, prin nume atribuite căsuţelor sau prin constante. De exemplu, în funcţia SUM(C10..C15), argumentul C10..C15 precizează că se vor aduna valorile întâlnite în grupul de căsuţe C10..C15. Argumentele dintr-o funcţie pot fi: valori numerice, şiruri de caractere, referinţe de căsuţe şi condiţii. Observaţii:
• Când argumentul este o valoare numerică se poate utiliza un număr, o formulă (expresie) de tip numeric, un nume de grup sau adresa unei căsuţe care conţine un număr sau o formulă de tip numeric. • Când argumentul este de tip şir de caractere se poate utiliza o constantă tip şir de caractere (orice secvenţă de litere, cifre sau alte caractere, delimitată la stânga şi la dreapta
82
de caracterul " (ghilimele)), o formulă de tip şir, un nume de grup sau adresa unei căsuţe care conţine un şir sau o formulă de tip şir. • Când argumentul este o referinţă de căsuţă, se poate utiliza un nume de grup sau o adresă. • Când argumentul este o condiţie se foloşeste o expresie logică (o formulă în care se utilizează un operator logic (de comparare) sau un nume de grup ori o adresă de căsuţă care conţine o expresie logică). Totuşi, ca argument tip condiţie se pot folosi expresii numerice sau de tip şir, valori numerice, constante de tip şir sau referinţe de căsuţe.
Operatorii specifică tipul de calcule care se execută asupra argumentelor. Sunt 4 tipuri de operatori: •
aritmetici (+, -, /, *, %, ^);
•
de comparare (<, >, =, <>, <=, >=);
•
de tip şir (&, utilizat pentru concatenarea şirurilor de caractere);
•
de tip referinţă (caracterul “:”, utilizat pentru specificarea grupurilor de căsuţe, caracterul ”,” utilizat pentru reuniune, caracterul “spaţiu” pentru intersecţia a două zone din foaia de calcul).
Tabelul nr. 3.7. Exemple de utilizare a operatorilor
Calculul soldului final al unui cont de activ
Afişarea numelui şi prenumelui într-o singură căsuţă Sporirea unei valori numerice cu 5% Combinarea unui text cu data calendaristică Calculul totalului în funcţie de o valoare aflată într-o altă zonă Calculul unei valori totale în funcţie de rezultatul evaluării a 2 condiţii
Presupunem că: în D11 este rulajul debitor, în E11 este rulajul creditor, iar în C8 este soldul iniţial. Formule de calcul: =C8+D11-E11 =SUM(C8,D11,-E11) Presupunem că: în B4 este numele, în C4 este prenumele. Pentru a afişa în formatul “prenume nume”: =C4&” “&B4 Pentru a afişa în formatul “nume, prenume”: =B4&”, “&C4 Presupunem că valoarea respectivă este în C6. Sunt 2 variante: 1. dacă folosim o constantă: =C6*(1+5%) 2. dacă procentul este în căsuţa B2: =C6*(1+$B$2) Presupunem că data documentului este stocată în E4. Se scrie: =”Incheiat la data de “&TEXT(E4,”d-mmm-yyyy”) Presupunem că avem lista facturilor dintr-o lună şi dorim să aflăm valoarea totală a facturilor emise în data de 24 ianuarie 2000 (zona B2:B96 conţine data facturii, iar zona E2:E96 valoarea). Formula de calcul: =SUMIF(B2:B96,”01/24/2000”,E2:E96) Presupunem că dispunem de lista prezentată mai sus şi dorim să obţinem suma facturilor din săptămâna 24-29 ianuarie. Formula: =SUM(IF(B2:B96>=DATEVALUE(”01/24/2000”), IF(B2:B96<=DATEVALUE(”01/29/2000”), E2:E96))) Obs.: aceasta este o formulă de tip array şi trebuie introdusă prin combinaţia CTRL+SHIFT+ENTER
Numărarea apariţiilor unei valori
Presupunem că din lista de mai sus dorim să aflăm numărul facturilor emise pe data de 25 ianuarie 2000. Se scrie: =COUNTIF(B2:B96,”01/25/2000”)
83
Reguli sintactice de bază La introducerea funcţiilor trebuie să ţinem cont de următoarele recomandări: 1) 2) 3) 4) 5) 6) 7) 8)
Numele funcţiei trebuie să fie precedat de semnul =. Indiferent de tipul literelor folosite la tastarea numelui funcţiei, mici sau mari, sistemul le va afişa cu majuscule. Nu se lasă spaţii între numele funcţiei şi argumente şi nici între argumente. Întotdeauna includeţi argumentele funcţiilor între paranteze rotunde. Când o funcţie devine argument al altei funcţii, fiecare dintre ele trebuie să aibă argumentele cuprinse între paranteze. Exemplu: =IF(SUM(A1..A5)>0,B1,B2). Dacă sunt mai multe argumente, acestea se separă prin , (virgulă) sau ; (punct şi virgulă), corespunzător delimitatorului stabilit. O funcţie poate avea ca argument o altă funcţie. Sistemul atribuie valoarea zero tuturor căsuţelor libere ale căror adrese sunt folosite ca argumente în funcţiile financiare, logice sau matematice.
Observaţie: Pentru a vizualiza toate formulele/funcţiile dintr-o foaie de calcul se foloseşte combinaţia de taste CTRL+` (vezi fig. nr. 3.18). Prin aceeaşi combinaţie de taste se revine la afişarea valorilor calculate.
Fig. nr. 3.18. Afişarea formulelor într-o foaie de calcul
Categorii de funcţii În Excel, funcţiile sunt grupate în 11 categorii: (i) Funcţiile statistice: execută calcule statistice asupra unor serii de date; (ii) Funcţiile financiare: realizează calcule economice pentru împrumuturi, anuităţi sau fluxuri financiare; (iii) Funcţiile logice: calculează rezultatul unei expresii condiţionale; (iv) Funcţiile matematice şi trigonometrice: execută o mare varietate de calcule complexe cu valori numerice; (v) Funcţiile de căutare: identifică o valoare într-un tabel sau într-o listă; (vi) Funcţiile pentru date calendaristice şi timp: calculează valorile ce reprezintă data calendaristică şi timpul;
84
(vii) Funcţiile pentru baze de date: efectuează calcule statistice şi interogări asupra bazelor de date; (viii) Funcţiile tip şir de caractere: lucrează cu şiruri (texte, expresii tip şir) sau constante tip şir; (ix) Funcţiile tehnice: efectuează calcule tehnice; (x) Funcţiile de informare oferă informaţii despre căsuţe şi despre mediul de lucru; (xi) Funcţiile definite de utilizator (User Defined Functions): execută calcule specifice aplicaţiilor fiecărui utilizator. Funcţii statistice Funcţiile statistice clasice sunt prezentate în tabelul 3.8. De regulă, aceste funcţii lucrează doar cu valori numerice, dar sunt definite şi variante ale acestor funcţii care extind tipurile de date acceptate. Spre exemplu: funcţia AVERAGE acceptă doar valori numerice, iar funcţia AVERAGEA acceptă şi date de tip logic sau text (în mod similar, sunt definite funcţiile COUNTA, MAXA, MINA etc.). Tabelul nr. 3.8. Principalele funcţii statistice
Funcţia AVERAGE COUNT MAX MIN STDEV SUM VAR
Rolul funcţiei Calculează media aritmetică a valorilor din listă. Numără căsuţele cu un conţinut diferit de spaţiu din lista indicată. Determină valoarea maximă dintr-o listă de valori. Determină valoarea minimă dintr-o listă de valori. Calculează abaterea medie pătratică a valorilor dintr-o listă. Însumează valorile dintr-o listă. Calculează dispersia valorilor dintr-o listă.
Funcţii financiare O parte dintre funcţiile financiare nu sunt prezente în configuraţia standard. Ele pot fi instalate prin programul SETUP, din care se alege componenta Analysis Toolpak. Semnificaţiile argumentelor ce se regăsesc cel mai frecvent în funcţiile financiare, cu excepţia celor pentru calculul amortizării, sunt: • valoarea viitoare (future value – fv), adică valoarea investiţiei sau împrumutului după ce au fost efectuate toate plăţile; • numărul de perioade (number of periods – nper) care arată numărul total de plăţi sau de perioade (ani, luni, zile) ale investiţiei; • vărsământul (payment – pmt), adică suma plătită periodic pentru o investiţie sau un împrumut; • valoarea prezentă (present value – pv) care se referă la valoarea actuală a încasărilor sau plăţilor ce se vor efectua în viitor; • rata dobânzii (rate);
85
• tipul (type) care precizează intervalul de timp la care se efectuează plata (spre exemplu, la începutul lunii sau la sfârşitul lunii). Dacă acest argument lipseşte sau are valoarea 0 se consideră că plata se face la sfârşitul perioadei, iar dacă are valoarea 1, plata se face la începutul perioadei. Observaţie: În scrierea funcţiilor financiare, sumele care reprezintă plăţi sunt introduse ca valori negative, iar sumele care reprezintă încasări ca valori pozitive. Tabelul nr. 3.9. Principalele funcţii financiare
Funcţia Amortizare imobilizări DDB
Rolul funcţiei
Calculează amortizarea imobilizărilor după metoda degresivă (Double-Declining Balance depreciation). Calculează amortizarea imobilizărilor după metoda liniară (Straight-LiNe depreciation). Calculează amortizarea imobilizărilor după metoda însumării cifrelor anilor (Sum-of-the-Years'-Digits).
SLN SYD
Anuităţi FV
Determină valoarea viitoare (Future Value) a unei investiţii curente, pe bază de vărsăminte egale şi la o rată constantă a dobânzii. Determină suma care trebuie plătită periodic, pentru rambursarea unui împrumut. Determină valoarea prezentă (Present Value) a unei investiţii curente, pe bază de vărsăminte viitoare egale.
PMT PV
Obiective financiare NPER
Determină numărul de perioade necesare pentru obţinerea unei valori viitoare, pe baza unor vărsăminte egale şi o rată a dobânzii constantă. Determină procentul de dobândă pentru o anuitate.
RATE
Previziuni IRR NPV
Determină rata internă de rentabilitate (Internal Rate of Return), pentru o serie de venituri (încasări) generate de o investiţie. Calculează valoarea actualizată netă prezentă (Net Present Value) a unei serii de încasări viitoare generate de o investiţie.
Recomandări pentru utilizarea funcţiilor financiare: • Într-o funcţie financiară, durata (numărul de perioade) şi rata dobânzii trebuie să se refere la aceeaşi unitate de timp. • Rata dobânzii poate fi exprimată fie în procente, fie în valori zecimale. Dacă s-a folosit forma procentuală, automat se realizează conversia în format zecimal. • În funcţiile financiare care lucrează cu anuităţi se iau în considerare vărsăminte egale, efectuate la intervale regulate de timp. O anuitate obişnuită este o anuitate în care plata se face la sfârşitul fiecărui interval de timp.
86
Funcţii logice Principalele funcţii logice sunt prezentate în tabelul 3.10. Funcţiile AND, OR, NOT înlocuiesc operatorii logici similari. Ele evaluează una sau mai multe condiţii precizate ca argumente şi returnează valoarea logică adevărat sau fals. Tabelul nr. 3.10. Funcţii logice
Funcţia AND FALSE IF NOT OR TRUE
Rolul funcţiei Dă valoarea logică 1 (adevărat) dacă toate condiţiile evaluate sunt adevărate (operatorul “şi logic” – conjuncţie). Dă valoarea logică 0 (fals). Codifică structura de control alternativă. Dacă se îndeplineşte condiţia se execută o acţiune, în caz contrar se execută altă acţiune. Preschimbă valoarea logică a argumentului (negaţie). Dă valoarea logică 1 (adevărat) dacă una dintre condiţiile evaluate este adevărată (operatorul “sau logic” – disjuncţie). Dă valoarea logică 1 (adevărat).
Funcţii matematice Principalele funcţii din această categorie sunt incluse în tabelul 3.11. Tabelul nr. 3.11. Principalele funcţii matematice
Funcţia Generale ABS EXP INT LN LOG MOD RAND RANDBETWEEN
ROMAN ROUND SQRT
Rolul funcţiei Calculează valoarea absolută. Calculează ex, x fiind un anumit exponent. Determină valoarea întreagă a unei valori numerice. Calculează logaritmul natural (în baza e). Calculează logaritmul în baza 10 (zece). Calculează restul împărţirii a două valori numerice. Generează un număr aleator cuprins între 0 şi 1. Generează un număr aleator dintr-un interval specificat. Converteşte cifrele arabe în cifre romane. Rotunjeşte o valoare pentru un număr dat de poziţii zecimale. Calculează rădăcina pătrată dintr-un număr pozitiv.
Trigonometrice ACOS ASIN ATAN COS PI SIN TAN
Calculează arccosinus. Calculează arcsinus. Calculează arctangentă. Calculează cosinus. Dă valoarea numărului PI (3.1415926536). Calculează sinus. Calculează tangenta.
Funcţii de căutare Aceste funcţii sunt utilizate pentru căutarea de valori în cadrul listelor sau în baze de date, sau pentru identificarea referinţelor unei căsuţe. Cele mai importante funcţii de căutare sunt prezentate în tabelul 3.12.
87
Tabelul nr. 3.12. Principalele funcţii de căutare
Funcţia ADRESS
CHOOSE
COLUMN HLOOKUP
INDEX ROW VLOOKUP
Rolul funcţiei Construieşte adresa unei căsuţe specificate prin numărul rândului şi al coloanei, având precizat şi tipul de adresă dorit printr-un argument numeric (1 sau lipsă pentru adresă absolută, 4 pentru adresă relativă etc.). Exemplu: ADRESS(2,3) dă $C$2. Alege o valoare numerică dintr-o listă de valori numerice sau de şiruri, pe baza unui index numeric.Exemplu: CHOOSE(2, “Ianuarie”,”Februarie”, “Martie”) va da valoarea “Februarie” Oferă numărul coloanei corespunzător adresei specificate ca argument. Exemplu: COLUMN(C2) dă valoarea 3. Efectuează cautări, după un criteriu specificat, într-un grup de căsuţe şi dă ca rezultat conţinutul căsuţei situate la intersecţia coloanei în care s-a identificat elementul căutat şi a liniei specificate ca argument. Căutarea se face pe linie. Efectuează cautări, într-un grup de căsuţe sau într-un tablou (array) şi dă ca rezultat conţinutul căsuţei situate la intersecţia liniei şi coloanei ale căror numere au fost specificate ca argumente. Oferă numărul rândului corespunzător adresei specificate ca argument. Exemplu: ROW(A15) dă 15. Efectuează cautări, după un criteriu specificat, într-un grup de căsuţe şi dă ca rezultat conţinutul căsuţei situate la intersecţia liniei în care s-a identificat elementul căutat şi a coloanei specificate ca argument. Căutarea se face pe coloană.
Funcţii pentru date calendaristice şi timp Tabelul nr. 3.13. Funcţii pentru date calendaristice şi timp
Funcţia DATE
DATEVALUE DAY
MONTH
YEAR
Rolul funcţiei Calculează un număr corespunzător datei calendaristice specificate prin valori numerice ale anului, lunii şi zilei. Exemplu: pentru 8 martie 1999 funcţia DATE(99,3,8) dă valoarea 36227 (format General) sau 03/08/99 (format Date). Converteşte şiruri care reprezintă data calendaristică în numărul echivalent. Exemplu: DATEVALUE("8-Mar-99") dă numărul 36227. Calculează numărul zilei din lună pe baza argumentului care se referă la numărul de zile trecute de la 1 ianuarie 1900 sau a datei specificată ca un şir de caractere. Exemplu: DAY(36227) sau DAY(“03/08/99”) dă valoarea 8. Calculează numărul lunii din an pe baza argumentului care se referă la numărul de zile trecute de la 1 ianuarie 1900 sau a datei specificată ca un şir de caractere. Exemplu: MONTH(36227) sau MONTH(“03/08/99”) dă valoarea 3. Determină anul calendaristic, exprimat prin două sau patru cifre, conform formatului selectat, pe baza argumentului care se referă la numărul de zile trecute de la 1 ianuarie 1900 sau a datei specificată ca un şir de caractere. Exemplu: YEAR(36227) dă valoarea 1999.
88
Funcţia
Rolul funcţiei
HOUR
MINUTE
NETWORKDAYS
NOW SECOND
TIME
TIMEVALUE TODAY
Pornind de la un număr subunitar sau de la ora specificată ca un şir de caractere, determină ora corespunzătoare din zi. Exemplu: HOUR(0.437615) dă valoarea 10, deoarece 0.437615 este asociat la ora 10:30:10 AM; HOUR(“5:15 PM”) dă valoarea 17. Pornind de la un număr subunitar sau de la ora specificată ca un şir de caractere, determină minutul corespunzător din oră. Exemplu: MINUTE(0.437615) dă valoarea 30, deoarece 0.437615 este asociat la ora 10:30:10 AM; MINUTE(“18:15:00”) dă 15. Calculează numărul de zile lucrătoare dintre două date calendaristice specificate cu ajutorul funcţiei DATEVALUE. Determină valoarea care corespunde datei şi orei curente, după orologiul calculatorului. Exemplu: NOW() dă valoarea 36227.437615 (format General) sau 3/8/99 10:30 (în format Date). Pornind de la un număr subunitar sau de la ora specificată ca un şir de caractere, determină secunda corespunzătoare din minut. Exemplu: SECOND(0.437615) dă valoarea 10, deoarece 0.437615 este asociat la ora 10:30:10 AM. Calculează un număr (cu valori între 0 şi 0.9999999) corespunzător timpului scurs din zi, specificat prin valorile numerice ale orei, minutului şi secundei. Exemplu: pentru 10:30:10 AM, funcţia TIME(10,30,10) dă valoarea 0.437615. Converteşte şiruri care reprezintă ora în numărul echivalent. Exemplu: TIMEVALUE("10,30,10") dă numărul 0.437615. Determină valoarea care corespunde datei curente, după orologiul calculatorului. Este o pseudofuncţie calendaristică, întrucât se realizează de sistem prin funcţiile INT(NOW()). Exemplu: TODAY() dă valoarea 36227 (în format General) sau 3/8/99 (în format Date).
Recomandări pentru utilizarea funcţiilor calendaristice: • Numărul asociat de Excel, versiunea pentru Windows, datei calendaristice reprezintă un număr întreg din intervalul 1 - 2958525. Astfel, se atribuie zilei de 1 ianuarie 1900 valoarea 1, zilei de 1 februarie 1900 valoarea 32, iar ultima valoare corespunde zilei de 31 decembrie 9999. • Numărul asociat de Excel orei exacte reprezintă un număr zecimal din intervalul 0.000000 – 0.99999999. Astfel, se atribuie orei 0 (ce marchează începutul unei noi zile) valoarea 0.000000, orei 12 (amiază) valoarea 0.500000, iar pentru 23:59:59 valoarea 0.99999999. • De regulă, Excel recunoaşte o dată calendaristică şi o afişează în formatul specific, dar pentru ca data sau ora să apară într-un alt format se foloseşte comanda Format, Cells. • Chiar dacă funcţia NOW nu are argumente, este obligatorie prezenţa parantezelor – altfel se obţine eroarea #NAME?. Funcţii pentru baze de date Aceste funcţii sunt asemănătoare cu funcţiile statistice (vezi tabelul 3.14). 89
Tabelul nr. 3.14. Principalele funcţii pentru baze de date
Funcţia DAVERAGE DCOUNT DGET
DMAX DMIN DSTDEV DSUM DVAR
Rolul funcţiei Calculează media aritmetică a valorilor unui câmp dintr-o bază de date, doar pentru înregistrările care îndeplinesc un anumit criteriu. Numără căsuţele ce conţin valori numerice dintr-un câmp al bazei de date, după un anumit criteriu. Determină valoarea asociată câmpului specificat din înregistrarea pentru care condiţia este adevărată. Dacă nici o înregistrare nu verifică acea condiţie, se afişează #VALUE!, iar dacă mai multe înregistrări o verifică se afişează #NUM!. Determină valoarea maximă dintr-un câmp al bazei de date, după un anumit criteriu. Determină valoarea minimă dintr-un câmp al bazei de date, după un anumit criteriu. Calculează abaterea medie statică a valorilor dintr-un câmp al bazei de date, după un anumit criteriu. Însumează valorile dintr-un câmp al bazei de date, după un anumit criteriu. Calculează dispersia valorilor dintr-un câmp al bazei de date, după un anumit criteriu.
Recomandări pentru utilizarea funcţiilor tip bază de date: • Toate funcţiile pentru baze de date trebuie să aibă trei argumente: grup de intrare, câmp, criteriu. • Grupul de intrare trebuie să conţină baza de date. Poate fi o adresă sau un nume atribuit zonei care conţine baza de date. În exemplul din fig. nr. 3.19, grupul de intrare (baza de date) este în zona A1:D7. • Câmpul este precizat prin numărul de ordine al coloanei pe care se găseşte. Numărul de ordine corespunde poziţiei ocupate de coloana care conţine câmpul, în zona de intrare. Primei coloane i se asociază numărul 1, celei de-a doua, numărul 2 ş.a.m.d. Dacă numărul de ordine este o valoare mai mare decât numărul de câmpuri, funcţia va afişa mesajul de eroare #VALUE!. În exemplul dat, grupul de intrare este alcătuit din 4 câmpuri, identificate prin numere de la 1 la 4. Câmpul poate fi precizat şi prin numele său, scris între ghilimele (în loc de 4 se poate scrie “Salariu”). • Criteriul este zona în care se specifică restricţiile de selecţie. O zonă de criterii trebuie să includă numele câmpului (aşa cum este specificat în grupul de intrare) şi condiţia de selecţie. Condiţia se introduce în căsuţa de sub cea cu numele câmpului. Criteriul poate fi adresa zonei sau un nume atribuit acesteia. În exemplul de mai jos (fig. nr. 3.19) sunt definite 3 criterii: F1:F2, G3:H4 (condiţia 1 şi condiţia 2), H6:H7.
90
Fig. nr. 3.19. Funcţii statistice pentru bazele de date. Exemple
Fig. nr. 3.20. Funcţii statistice pentru bazele de date. Scrierea formulelor
Funcţii tip şir de caractere Cu ajutorul funcţiilor de tip şir de caractere se poate lucra cu date de tip text în formule sau funcţii. Spre exemplu, se poate determina lungimea unui şir de caractere sau se poate converti un text în majuscule. Spre exemplu, formula de mai jos exemplifică utilizarea funcţiei TODAY ca argument al funcţiei TEXT, ce transformă data calendaristică în text (vezi rezultatul în fig. nr. 3.21): =”Raport de activitate la data “&TEXT(TODAY( ),”dd-mmm-yyyy”)
Fig. nr. 3.21. Utilizarea funcţiei TEXT Tabelul nr. 3.15. Funcţii tip şir de caractere
Funcţia CHAR CLEAN CODE CONCATENAT E EXACT FIND LEFT LEN LOWER
Rolul funcţiei Dă caracterul care are codul ASCII specificat ca argument. Exemplu: CHAR(65) dă A. Şterge caracterele netipăribile din şirul specificat. Dă codul ASCII al primului caracter din şirul specificat. Exemplu: CODE(“Alfa”) afişează A. Uneşte mai multe şiruri de caractere într-unul singur. Dă valoarea logică 1 (adevărat) dacă cele două şiruri sunt identice şi valoarea logică 0 (fals) dacă cele două şiruri sunt diferite. Calculează poziţia primului caracter din şirul căutat care a fost identificat în şirul în care se face căutarea. Extrage primele n caractere din şirul precizat ca argument. Calculează numărul de caractere din şirul precizat ca argument. Converteşte toate literele, din şirul precizat ca argument, în litere mici.
91
Funcţia MID PROPER REPT REPLACE RIGHT SEARCH TEXT TRIM UPPER VALUE
Rolul funcţiei Extrage un anumit număr de caractere, din interiorul unui şir precizat ca argument. Converteşte prima literă, din fiecare cuvânt al şirului precizat ca argument, în literă mare, iar restul literelor din cuvânt le converteşte în litere mici. Realizează duplicarea şirului specificat ca argument de un număr precizat de ori. Înlocuieşte caracterele specificate ale unui şir cu alte caractere. Extrage ultimele n caractere din şirul precizat ca argument. Este similară cu FIND, doar că, spre deosebire de aceasta, nu face diferenţa între litere mici şi litere mari. Transformă o valoare numerică într-un şir, folosind formatul specificat. Elimină spaţiile de la începutul şi sfârşitul şirului specificat. Converteşte toate literele, din şirul precizat ca argument, în litere mari. Converteşte un şir ce reprezintă un număr într-o valoare numerică.
Funcţii de informare Funcţiile de informare oferă date privind conţinutul căsuţelor sau mediul de lucru.
92
Tabelul nr. 3.16. Principalele funcţii de informare
Funcţia
Rolul funcţiei
CELL
Dă informaţii despre conţinutul, formatul datelor sau poziţia (numărul rândului sau coloanei) unei căsuţe. Exemple: CELL(“contents”,A2) afişează “Nume şi prenume” CELL(“row”,D31) afişează 31 CELL(“format”,A2) afişează G (adică formatul General) Numără căsuţele goale (libere) dintr-un grup de căsuţe precizat. Oferă informaţii asupra mediului de lucru curent. Argumentul este un text predefinit care se referă la tipul de informaţii solicitat. Exemplu: INFO(“directory”) afişează numele directorului curent; INFO(“release”) numele versiunii Excel utilizate etc. Funcţiile IS… confirmă/infirmă tipul datei specificat prin numele funcţiei, având corespunzător rezultatul TRUE (Adevărat) sau FALSE (Fals). Spre exemplu, ISBLANK dă valoarea TRUE dacă respectiva căsuţă este goală sau FALSE în caz contrar. În mod similar, ERR se referă la valori de tip eroare, LOGICAL la valori logice, NA la eroarea #N/A, NONTEXT la valori diferite de text, NUMBER la valori numerice, REF la referinţe, iar TEXT la şiruri de caractere. ODD şi EVEN indică prezenţa de valori impare sau pare. Argumentele acestor funcţii pot fi adresa căsuţei sau o valoare concretă. Returnează tipul datei sub forma unui număr. Astfel, dacă este o valoare numerică se afişează 1, dacă este text se afişează 2 ş.a.m.d.
COUNTBLANK INFO
ISBLANK ISERR ISLOGICAL ISNA ISNONTEXT ISNUMBER ISREF ISTEXT ISEVEN ISODD TYPE
Funcţii tehnice Funcţiile tehnice se împart în 3 categorii: •
funcţii ce lucrează cu numere complexe;
• funcţii pentru conversia numerelor între diverse sisteme de numeraţie (binar, zecimal, octal, hexazecimal); • funcţii pentru conversia valorilor între diverse sisteme metrice (spre exemplu, din km în mile). Trebuie precizat că aceste funcţii nu sunt prezente în versiunea standard, fiind incluse în componenta Analysis ToolPak, ce poate fi instalată prin SETUP.
Funcţii definite de utilizator În aplicaţiile în care trebuie efectuate calcule complexe, pentru care nu sunt definite funcţii Excel, utilizatorul îşi poate defini propriile funcţii, folosind limbajul VBA (Visual Basic for Applications).
93
FACILITĂŢI GRAFICE ÎN PROGRAMELE DE CALCUL TABELAR Principalele tipuri de grafice Orice program de calcul tabelar oferă cinci tipuri fundamentale de grafice: liniar, histogramă, xy (nor de puncte), zonal, diagramă de structură (cerc). În fapt, numărul tipurilor de grafice este mai mare, iar dacă se au în vedere şi subtipurile, utilizatorul are la dispoziţie câteva zeci de variante de grafice. Sub mediul de lucru Windows, pentru majoritatea tipurilor de grafice există atât reprezentare 2 D, cât şi 3 D. Column Graph (histogramă) constă dintr-o serie de bare verticale, fiecare reprezentând o valoare numerică. Asigură reprezentarea seriilor dinamice de date. Un tip particular de histogramă este cea orizontală (bar graph), care permite o mai bună reprezentare comparativă a valorilor, în detrimentul reprezentării dinamice (în timp). Ambele tipuri de histograme au şi varianta de reprezentare tridimensională, precum şi varianta stivă, în care se evidenţiază relaţia dintre parte şi întreg. Line Graph (grafic liniar) reprezintă grafic evoluţia, în timp, a unuia sau a mai multor fenomene sau procese. Fiecare linie reprezintă o categorie de date, iar fiecare punct de pe linie reprezintă o valoare a unei date la un moment dat. Sunt utile pentru urmărirea trendului şi pentru previziuni. Pie Chart (diagrama de structură) este folosit pentru a evidenţia, prin sectoare de cerc, ponderea fiecărei componente a mulţimii reprezentate. Pentru a scoate şi mai mult în relief anumite elemente, se poate apela la facilitatea de expandare a sectoarelor de cerc. Un mod asemănător de reprezentare a unei structuri este graficul de tip doughnut (grafic de tip inel). Acesta prezintă avantajul că poate reprezenta mai multe serii de date. Area Graph (grafic zonal) realizează ca şi cel liniar reprezentarea evoluţiei în timp, dar indică mai clar magnitudinea schimbărilor în timp. XY Graph (grafic de tip XY sau nor de puncte) scoate în evidenţă corelaţiile existente între două şiruri de date numerice. Aceste grafice sunt redate prin linii, desenate în sensul dat de valorile de reprezentat ca puncte din grafic. Spre deosebire de graficele tip linie, cele de tip XY folosesc o scală numerică şi pe axa Ox. O variantă a acestui grafic este cel denumit bubble, în care punctele sunt înlocuite de cerculeţe, ale căror dimensiuni indică valoarea unei a treia variabile. Pe lângă acestea, în programele de calcul tabelar se regăsesc şi alte tipuri particulare de grafice. Astfel, în Excel utilizatorul mai poate alege dintre următoarele tipuri: •
Radar, în care fiecare categorie reprezentată are propria axă, pornind
din acelaşi punct central al diagramei;
94
•
Surface, utilizat pentru a găsi combinaţiile optime dintre două seturi
de date. Este o reprezentare tridimensională, asemănătoare cu o hartă topografică, prezentând în culori diferite datele ce se regăsesc în acelaşi interval de valori; •
High-low-close, utilizat adesea pentru prezentarea fluctuaţiilor de
preţuri pe piaţa bursieră (vezi cele trei componente: cel mai mare, cel mai mic şi preţul la închidere), dar şi pentru reprezentarea datelor ştiinţifice (de exemplu, a fluctuaţiilor de temperatură). Există şi variante ale acestui tip de grafic, precum Open-high-low-close sau Volume-high-low-close; •
Cone,
Cylinder,
Pyramid,
care
realizează
reprezentări
tridimensionale ale valorilor numerice în formă de con, cilindru sau piramidă, având ca atu un aspect deosebit faţă de un grafic clasic, cum este cel de tip Column. La toate acestea se adaugă tipurile de grafice personalizate sau definite de utilizator. Acesta are posibilitatea de a adăuga în lista de opţiuni un tip nou de grafic, derivat din cele oferite de sistem, care va apare în listă la utilizările viitoare, sub un nume stabilit de utilizator. Aşa cum se observă din fig. nr. 3.25, utilizatorul poate selecta pentru un grafic unul dintre tipurile standard sau, dacă doreşte unul dintre tipurile personalizate, va executa clic pe Custom Types şi va selecta din listă opţiunea dorită. Tipuri personalizate de grafice
Tipuri de grafice standard
Subtipuri de grafice
Tipuri de grafice EXCEL
Fig. nr. 3.25.
Procedura generală de creare a graficelor Orice grafic se creează pe baza datelor din foile de calcul, cu menţiunea că valorile reprezentate grafic vor fi actualizate ori de câte ori se modifică datele din foaia de calcul sursă. Majoritatea programelor de calcul tabelar au un asistent (în Excel se numeşte Chart Wizard), care îl îndrumă pe utilizator în crearea graficului. Procedura generală de lucru este 95
structurată în mai mulţi paşi, care se parcurg cu ajutorul comenzilor Next şi Back (înainte/înapoi) şi care pot fi sistematizaţi astfel: •
alegerea tipului de grafic (fig. nr. 3.25);
• selecţia zonei de căsuţe care conţine datele de exprimat grafic (dacă nu a fost selectată înainte de lansarea Wizard-ului) şi precizarea informaţiilor despre dispunerea seriilor de date (pe linie/pe coloană), aşa cum se poate vedea în fig. nr. 3.26; Observaţie: Este posibilă selectarea de zone neadiacente, dacă după selectarea primei zone, se menţine apăsată tasta CTRL în timp ce se selectează celelalte zone. Atenţie! Selecţiile neadiacente trebuie să formeze un dreptunghi.
Fig. nr. 3.26 Specificarea datelor de reprezentat grafic
• specificarea opţiunilor pentru îmbunătăţirea graficului (vezi fig. nr. 3.27): titlu grafic (Titles), titluri şi format pentru axe (Axes), legendă (Legend), etichete pentru date (Date Labels), linii orizontale şi/sau verticale (Gridlines) etc.
96
Fig. nr. 3.27. Definirea opţiunilor pentru personalizarea graficului
• indicarea poziţiei (locaţiei) graficului (vezi fig. nr. 3.28). Astfel, graficul poate fi: •
•
un obiect inclus într-o foaie de calcul (embedded chart), care poate fi plasat cu uşurinţă în orice zonă a acesteia, poate fi redimensionat după cerinţe şi poate fi copiat într-o altă aplicaţie (de exemplu, Word) prin mecanismul Clipboard; introdus într-o foaie independentă, denumită Chart Sheet.
Fig. nr. 3.28. Plasarea graficului
• terminarea operaţiunilor prin selectarea butonului Finish. Aşa cum se observă şi în figurile de mai sus, utilizatorului îi este prezentat graficul în fiecare etapă intermediară (într-o zonă de tip Preview), astfel că el poate mai uşor face modificări ale aspectelor care nu corespund dorinţelor sale. Se poate reveni oricând la etapele anterioare (butonul Back) pentru a realiza modificările dorite.
Fig. nr. 3.29. Linia de instrumente Chart
Fiecare componentă a graficului (seriile de date, axele, titlurile, legenda etc.) pot fi modificate individual după terminarea graficului. Fiecare dintre ele are definit un meniu cu comenzi specifice (numit meniu shortcut), ce se apelează prin clic dreapta. De asemenea, pentru modificarea unui grafic există linia de instrumente Chart, care se activează automat la selectarea graficului (vezi fig. nr. 3.29).
97
Observaţie: Utilizatorul poate crea extrem de rapid, într-un singur pas, un grafic pentru datele selectate din foaia de calcul, folosind tipul implicit de grafic (Column, dacă nu a fost schimbat de utilizator). Pentru creare se apasă tasta F11 (pentru un grafic salvat într-o foaie Chart) sau butonul Default Chart (dacă lipseşte se poate adăuga prin View, Toolbars) din linia de instrumente, pentru un grafic inclus în foaia de calcul curentă.
Prezentăm în continuare câteva operaţiuni ce se pot efectua după realizarea unui grafic: • modificarea aspectului graficului (tip, titluri, legendă, etichete, etc.), prin alegerea comenzilor corespunzătoare din linia de instrumente Chart sau din meniul de tip shortcut; • adăugarea de noi date, modificând zona datelor (Data Range) sau utilizând comenzile Copy şi Paste; • ştergerea unei serii de date din grafic (se apasă tasta Delete după selectarea seriei din grafic); • protejarea graficului, împiedicând modificarea lui prin comanda Protection din meniul Tools; • realizarea de simulări; • adăugarea unei linii de trend
98