Sistem Informational Intranet de Gestionare a Datelor Bibliotecii Colegiului
ADNOTARE
Lucrarea dată reprezintă un sistem informațional Intranet de gestionare a datelor bibliotecii colegiului Programul este creat în baza tehnologiei XML, XSL și C# și face posibil accesul direct și indirect la baza de date creată în MSSQL7.0 de pe server prin intermediul Browser-ilor ceea ce ușurează administrarea, gestionarea și accesarea informației necesare din bibliotecă. Avantajul major al acestui sistem constă în implementarea unei noi tehnologii de acces simplu la informație cu cheltuieli minime și rezultate maxime datorită utilizării calculatoarelor.
Cuvintele cheie sunt: Internet, server Itnernet, informații, baze de date, SQL, XML, XSL, C#, mediul de programare Visual Studio, MySQL, cereri, componente vizuale, obiecte, metode, cîmpuri, înscrieri, securitatea datelor, criptare.
Capitolul I conține descrierea structurii bibliotecii.
Capitolul II include noțiuni despre particularitățile utilizării SQL. Conține descrierea comenzilor principale ale SQL.
Capitolul III conține descrierea XML, XSL, limbajului C#, protocolului ASP.NET.
Capitolul IV explică funcționarea instrumentelor de gestionare a bazei de date “Biblioteca”.
Capitolul V conține partea economică, sînt examinate principiile generale ale planificării rețea, este calculat și construit graful rețea.
Capitolul VI conține informația despre protecția muncii și sanitaria de producere, și examinează influiența factorilor dăunători caradiația ș.a. asupra omului.
ANNOTATION
This work describes an Intranet information system of administering library’s data from coledj. The source code (program), created on XML, XSL based technology, and on C# language make possible the direct and indirect access to MSSQL7.0 DataBase from a server by the Internet Browsers. The way described above makes easier the administration and accessing of required information from the library. The important advantage of this system consists in the new technology implementation of simple access to the information with minimal costs and maximum results due to computer application.
Keywords: Internet, internet server, information, databases, SQL, XML, XSL, C#, Visual Studio integrated development environment, MySQL, queries, visual components, objects, methods, fields, records, data security, encryption.
First chapter conteins description of library struct.
Second chapter contains general information on using SQL, describes main SQL commands.
Third chapter describes XML, XSL, C# language, ASP.NET protocol.
Fourth chapter presents the tools to handle and organize the “Library” databases.
Fifth chapter discusses the general concepts of grid planification, calculates and builds the grid graph.
Sixth chapter contains information on work hygiene and protection and examines various harmful factors effects and hygiene standards
INTRODUCERE
Fiecare colegiu își are biblioteca sa proprie, unde sunt păstrate diferite articole, broșuri, cărți, și altă documentație . La momentul dat în Moldova în cadrul bibliotecilor interne trebuie efectuată reorganizarea informațională a cadrelor bibliotecilor. Cheltuielile de timp a bibliotecarului sunt de multe ori mai mari decât rezultatele așteptate. De exemplu se fac cheltuieli de timp pentru căutarea cărții dorite, căutarea informației despre beneficiarul dat, mult lucru cu diferite documente, cartele, cataloage în care informația se introduce și se păstrează in formă scrisă . Mai apare problema introducerii greșite a informației ori pierderea ei. În rezultat trebuie de efectuat revizuirea totală a cataloagelor, fișelor pentru a detecta eroare, cea ce duce la un lucru neefectiv a personalului bibliotecii.
Luând în considerație cele spuse mai sus se vede că este actuală elaborarea și implementarea mijloacelor informaționale, sistemelor informaționale, scopul cărora este de a mări productivitatea colaboratorilor bibliotecilor. Un caz particular de așa sistem informațional poate servi SGBD (Sistem de Gestionare a Bazelor de Date), care este compus din baze de date, care memorează masive de informație și programelor de lucru, care răspund de prelucrarea și emiterea din baza de date a informației într-o formă eficientă și clară pentru utilizatori.
În lucrarea prezentă se examinează caracteristicile de bază, principiile de funcționare și modul de realizare ale unui sistem informatic. Și se v-a proiecta o bază de date relațională în cadrul unei organizații ce conține datele evidenței bibliotecare al unui colegiu. Baza de date al evidenței bibliotecare este o bază de date vizualizată în Internet. Pentru aceasta e nevoie de tehnologii noi ca Visual Studio care are ca limbaj C# și pentru vizualizare se va folosi XML, XSL.
Acest SOFT a fost realizat pe baza tehnologiei client-server. Din mai multe limbaje de programe (Visual Basic, Delphi, C#, C++, C++ Builder s.a.) a fost ales limbajul C# care permite realizarea acestui program mai eficient și unul dintre cele mai recente programe. Deoarece avem tehnologia client-server a apărut necesitatea de a instala și un server pe care s-a instalat limbajul de cereri structurate SQL pe care și se afla baza cu datele din bibliotecă.
Această bază de date pentru evidența bibliotecara prevede:
citirea și afișarea totală a bazei de date ;
afișarea pe categorii a informației din baza de date;
căutarea informației în baza de date, etc.
Pe lângă operațiile descrise mai sus, administratorul va mai putea efectua și următoarele operații-manipulări asupra bazei de date:
adăugarea noilor date;
editarea (schimbarea conținutului) bazei de date;
ștergerea atât parțială cît și totală a datelor;
lista cărților împrumutate;
căutarea informației dorite;
lista membrelor bibliotecii;
lista cărților împrumutate;
lista celor datori etc.
Capitolul I v-a conține analiza situației în domeniul problemei care trebuie rezolvată în cadrul proiectului de diplomă. Aici se v-a descrie cum este structurată o bibliotecă, după ce criterii sunt împărțite cărțile, broșurele, articolele în bibliotecă.
Capitolul II v-a descrie tehnologiei SQL. Se examinează în linii generale Microsoft SQL server. Se examinează modul de accesare a bazelor de date MS SQL Server din programe C# prin intermediul componentei ASP.NET.
Capitolul III este destinat studierii particularităților XML-ului, XSL-ului, limbajului C# și protocolului ASP.NET. Se studiază arhitectura XML-ului, XSL-ului. Particularitățile limbajului C#.
Capitolul IV reprezintă o realizare a unui sistem – sistemul informațional "Biblioteca". Se descrie structura sistemului, structura bazei de date, componentele sistemului (destinația și modul de realizare), modul de utilizare a sistemului de către bibliotecar.
Capitolul V v-a conține calculare indicilor economici unde se v-a face aprecierea cheltuielilor economice și determinarea eficienței economice ale proiectului de diplomă.
Capitolul VI reprezintă "Protecția muncii" care include: aprecierea pericolului la monitor, cerințele economice privind locul de muncă, condiționarea aerului, cerințele securității tehnice la începutul lucrului, cerințele securității tehnice în timpul de lucru.
CAPITOLUL 1. STRUCTURA ȘI SERVICIILE BIBLIOTECII
Căutarea informației
Cărți, broșuri: toate documentele prezente in biblioteca sub forma de cărți si broșuri sunt sistematizate si aranjate pe rafturi.
Structura bibliotecii
CZU concepe totalitatea cunoștințelor umane ca o singura unitate împărțita in zece clase, notate cu cifre arabe de la 0 la 9. (cifrele claselor si subclaselor coincid cu cifrele de pe divizionarele de raft)
Clasele:
Generalități
Filozofie
Religie. Teologie
Științele sociale
Științe tehnice.
Matematica. Științele naturale
Științele aplicate. Tehnica medicina
Arta. Distracții. Sport
Lingvistica. Literatura
Geografie. Biografie. Istorie
Materiale inedite: materialele inedite cumulate în bibliorafturi sunt sistematizate pe subiecte cu denumirea subiectului sau tematicii, sau sunt adunate la întâmplare cu denumirea biblioraftului “Diverse” si sunt înzestrate cu liste cu conținutul biblioraftului. Fiecare material este separat de celălalt material cu divizionare numerotate care coincid cu cifrele din listele bibliografice
Materiale digitalizate: materialele scanate pe CD –uri sunt bibliografiate în liste aparte pe fiecare CD. Listele conțin denumirea materialului scanat si numărul după care poate fi găsit pe CD .
1.2. Înregistrarea cititorilor
Pentru înregistrarea beneficiarilor bibliotecii sunt folosite fise care conțin date personale despre cititor și unde se notează materialele împrumutate cu indicația termenului împrumutului.
Fiecare carte este înzestrată cu fisa cărții care conține scurta informație despre carte și se notează data împrumutului si numele beneficiarului. (Fisele cărților împrumutate sunt păstrate aparte de fisele cititorilor in ordinea alfabetica a materialelor împrumutate).
Pentru înregistrarea materialelor împrumutate în lipsa bibliotecarului este folosit un registru preliminar cu indicația materialului împrumutat, numele beneficiarului si data împrumutului.
1.3. Deservirea beneficiarilor
1.3.1. Înregistrarea materialelor împrumutate sau consulate
1. Materialele selectate de cititor se înregistrează în:
registrul preliminar in care se notează materialul împrumutat sau consultat, numele beneficiarului si data înregistrării;
fișa personală a beneficiarilor cu indicația materialelor împrumutate și a termenului împrumutului.
2. Apoi din carte se scoate fisa cărții unde se notează data împrumutului si numele beneficiarului
(Fisele cărților împrumutate sunt păstrate aparte de fisele cititorilor in ordinea alfabetica a materialelor împrumutate).
1.3.2. Restituirea materialelor
Fisa cărții se introduce in cartea restituită.
Bibliotecarul semnează în fisa personală pentru materialul restituit.
CAPITOLUL II. MICROSOFT SQL SERVER.
Istoria produsului Microsoft SQL Server al firmei incepe pe la sfarsitul anilor '80, o data cu cumpararea aplicatiei cu acelasi nume de la Informix. Aceasta se baza pe modelul relational, matur si puternic, acesta fiind si astazi modelul folosit preponderent la stocarea si regasirea datelor.
Spre deosebire de bazele de date de pe sisteme mainframe, un server de baze de date este accesat de utilizatori de pe calculatoare distincte. Este nevoie de mecanisme care sa rezolve problemele care apar la accesarea simultana a datelor de pe zeci sau chiar sute de calculatoare, unde fiecare acces poate sa prelucreze zone al bazei de date independent de datele aflate pe server. In cadrul unei infrastructuri server – client, serverul raspunde si de conexiunile cu sistemele client. Aceasta se face prin integrarea cu elementele de comunicatie si prin cooperarea stransa cu sitemul de operare pe care ruleaza.
Desi SQL Server este folosit in mod obisnuit la manipularea a milioane de inregistrari, exista o serie de instrumente care ajuta la administrarea sistemului si a bzelor de date si tabelelor sale. Instrumentele cu interfata Windows sau linie de comanda care insotesc SQL Server ne permit sa intram intram in contact cu elementele diferite ale sale: Aceste instrumente pot fi utilizate pentru:
administrarea bazelor de date
controlul accesului la datele aflate in bazele de date
controlul manipularii datelor din bazele de date
Enterprise Manager (EM) reprezinta o aplicatie modul pentru consola de administrare Microsoft (Microsoft Management Console – MMC). Este vorba despre a aplicatie de server care va fi folosita pentru a efectua aproape toate operatiile de administrare pentru server locale sau aflate la distanta. EM poate fi utilizat si pentru:
a porni sau opri serviciile SQL Server
gestionarea sesiunilor deschise din conturile utilizatorilor
salvarea si restaurarea bazelor de date si a jurnalelor de tranzactii
pornirea, oprirea si configurarea serverelor
verificarea coerentei bazelor de date
afisarea de statistici privind functionarea serverului
crearea si gestionare se notează materialele împrumutate cu indicația termenului împrumutului.
Fiecare carte este înzestrată cu fisa cărții care conține scurta informație despre carte și se notează data împrumutului si numele beneficiarului. (Fisele cărților împrumutate sunt păstrate aparte de fisele cititorilor in ordinea alfabetica a materialelor împrumutate).
Pentru înregistrarea materialelor împrumutate în lipsa bibliotecarului este folosit un registru preliminar cu indicația materialului împrumutat, numele beneficiarului si data împrumutului.
1.3. Deservirea beneficiarilor
1.3.1. Înregistrarea materialelor împrumutate sau consulate
1. Materialele selectate de cititor se înregistrează în:
registrul preliminar in care se notează materialul împrumutat sau consultat, numele beneficiarului si data înregistrării;
fișa personală a beneficiarilor cu indicația materialelor împrumutate și a termenului împrumutului.
2. Apoi din carte se scoate fisa cărții unde se notează data împrumutului si numele beneficiarului
(Fisele cărților împrumutate sunt păstrate aparte de fisele cititorilor in ordinea alfabetica a materialelor împrumutate).
1.3.2. Restituirea materialelor
Fisa cărții se introduce in cartea restituită.
Bibliotecarul semnează în fisa personală pentru materialul restituit.
CAPITOLUL II. MICROSOFT SQL SERVER.
Istoria produsului Microsoft SQL Server al firmei incepe pe la sfarsitul anilor '80, o data cu cumpararea aplicatiei cu acelasi nume de la Informix. Aceasta se baza pe modelul relational, matur si puternic, acesta fiind si astazi modelul folosit preponderent la stocarea si regasirea datelor.
Spre deosebire de bazele de date de pe sisteme mainframe, un server de baze de date este accesat de utilizatori de pe calculatoare distincte. Este nevoie de mecanisme care sa rezolve problemele care apar la accesarea simultana a datelor de pe zeci sau chiar sute de calculatoare, unde fiecare acces poate sa prelucreze zone al bazei de date independent de datele aflate pe server. In cadrul unei infrastructuri server – client, serverul raspunde si de conexiunile cu sistemele client. Aceasta se face prin integrarea cu elementele de comunicatie si prin cooperarea stransa cu sitemul de operare pe care ruleaza.
Desi SQL Server este folosit in mod obisnuit la manipularea a milioane de inregistrari, exista o serie de instrumente care ajuta la administrarea sistemului si a bzelor de date si tabelelor sale. Instrumentele cu interfata Windows sau linie de comanda care insotesc SQL Server ne permit sa intram intram in contact cu elementele diferite ale sale: Aceste instrumente pot fi utilizate pentru:
administrarea bazelor de date
controlul accesului la datele aflate in bazele de date
controlul manipularii datelor din bazele de date
Enterprise Manager (EM) reprezinta o aplicatie modul pentru consola de administrare Microsoft (Microsoft Management Console – MMC). Este vorba despre a aplicatie de server care va fi folosita pentru a efectua aproape toate operatiile de administrare pentru server locale sau aflate la distanta. EM poate fi utilizat si pentru:
a porni sau opri serviciile SQL Server
gestionarea sesiunilor deschise din conturile utilizatorilor
salvarea si restaurarea bazelor de date si a jurnalelor de tranzactii
pornirea, oprirea si configurarea serverelor
verificarea coerentei bazelor de date
afisarea de statistici privind functionarea serverului
crearea si gestionarea replicarii bazelor de date
2.1. Noțiuni generale
SQL prezintă din sine un limbaj structurat de interpelări. Acesta este un limbaj care dă posibilitate de a crea baze de date relaționale și a lucra cu ele. Baza de date este un set de informație legată, care se păstrează în tabel.
Spațiul informațional devine tot mai unificat. Asta a adus la necesitatea creării unui limbaj standard, care s-ar putea folosi în diferite tipuri a mediilor de calculatoare. Limbajul standard va da posibilitatea utilizatorilor, care cunosc un set de comenzi, să le folosească pentru crearea, găsirea, modificarea și transferarea informației – independent de faptul, că ei lucrează la calculator personal, la o stație lucrătoare de rețea, sau la calculator universal.
În lumea calculatoarelor, utilizatorul care are limbajul dat, are un mare avantaj în utilizarea și generalizarea informației dintr-un șir de surse cu ajutorul unui mare număr de metode.
Eleganța și independența de la specificul tehnologiilor informaționale, și susținerea lui de către liderii industriei în sfera tehnologiei bazelor de date relaționale, a făcut limbajul SQL limbaj standard de bază. Din această cauză oricine care dorește să lucreze cu bazele de date a anilor 90, trebuie să cunoască SQL.
Standardul SQL este determinat de ANSI (American National Standart Institute) și în momentul de față el este acceptat și de ISO (Organizația Internațională a Standardelor). Însă majoritatea programelor comerciale a bazelor de date îl lărgesc fără a pune la cunoștință ANSI, adăugând diverse particularități în acest limbaj, care, cum ei cred că ele vor fi forte folositoare. Câteodată ele ceva schimbă standardul limbajului, dar ideile bune au tendința de a se dezvolta și curând devin standarde a "pieței" de la sine ele în puterea folositoare a calităților sale.
Aplicațiile Delphi se adresează la date prin intermediul BDE (Borland Database Engine). Tipul de acces la bazele de date variază în funcție de tipul bazei de date. Bazele de date locale Paradox, dBASE, MS Access și FoxPro sunt apelate de BDE prin intermediul driver-ilor standarde. Datele din serverele SQL sânt primite datorită utilizării sistemului special de driver-e SQL Links. Un rol important în prelucrarea și trimiterea interpelării îl joacă sistemul de prelucrare ainterpelărilor – componentă a procesorului BD. Toate sistemele de gestionare a bazelor de date nu utilizează limbajul SQL ca mijloc principal în lucru cu datele. Cu toate acestea, BDE cu ajutorul driver-ului standard respectiv translează cererile ce vin de la aplicații într-o formă înțeleasă de sistemul de gestiune al bazei de date și primește răspuns. Deoarece cererea către orice BD locală se execută de un singur mecanism, există o sintaxă unică SQL pentru lucru a astfel de date. Această variantă poartă denumirea de SQL local și este o parte componentă din standardul SQL92.
Toate serverele BD care lucrează cu BDE prin SQL Links sunt niște sisteme industriale complicate și lucrează pe baza extensiilor proprii ale limbajului. În acest caz BDE pur și simplu transmite cererea la server, fără a o transla sau modifica. Este evident că, în acest caz elaboratorul aplicației trebuie să cunoască această variantă SQL.
2.2. Componența limbajului SQL
Limbajul SQL este destinat pentru manipularea datelor în baze de date relaționale , determinarea structurii bazei de date și dirijarea cu drepturile de acces la date într-un mediu cu mulți utilizatori.
Și de atâta, în limbajul SQL în calitate de părți componente întră:
limbaj de manipulare a datelor (Data Manipulation Language, DML)
limbaj de determinare a datelor (Data Definition Language, DDL)
limbaj de dirijare a datelor (Data Control Language, DCL).
O să subliniem, că acestea nu sânt limbaje aparte, ci sânt diverse comenzi a unui limbaj. Astfel de divizare sa făcut numai din punctul de vedere a diverselor valori funcționale a comenzilor date.
Limbajul de manipulare a datelor se utilizează, cum se vede din denumire, pentru manipularea datelor în tabelele bazei de date. El este format din 4 comenzi de bază.
Comenzile de bază a limbajului SQL Tab.1
Din punctul de vedere a interfeței aplicate există două tipuri de comenzi SQL:
SQL interactiv
SQL incorporat.
SQL interactiv se utilizează în utilize speciale (de tipul WISQL sau DBD), care dau posibilitatea în regim interactiv introducerea interpelărilor cu utilizarea comenzilor SQL, trimiterea lor pentru execuție la server și pentru a primi rezultate în ferreastra care este destinată pentru aceasta. SQL incorporat se folosește în programele aplicate, și le permite să trimită interpelări la server și să prelucreze rezultatele primite, și cu tot mai mult combinând orientare – set și orientarea – record.
2.3. Operații relaționale. Comenzile limbajului de manipulare cu datele
Sarcina principală de pregătire a interpelării – crearea legăturii dintre sistemul de gestiune al BD care va executa interpelarea, și setul de date al componentei TQuery respective. Dacă acest lucru a fost realizat, atunci se determină modalitatea de executare a interpelării – accesul local prin intermediul driver-ului standard sau transmiterea textului cererii la server. După aceasta se setează valorile pentru variabilele parametrilor interpelării.
Dacă interpelarea se execută local, atunci ea se transmite prin intermediul driver-ului standard la sistemului de gestiune al BD respectiv pentru a fi executată de acesta. Prin legătura creată la pregătirea interpelării rezultatul se transmite în setul de date al aplicației.
Dacă interpelarea a fost adresată serverului SQL, atunci se presupune că ea are o sintaxă specifică, corespunzătoare serverului dat. În acest caz toată pregătirea specială a parametrilor interpelării se execută de partea serverului. BDE asigură numai transmiterea interpelării și întoarcerea rezultatului de execuție la setul de date al aplicației.
Încă o modalitate de executare a interpelărilor pentru serverul SQL – adresarea directă la funcțiile API a serverului respectiv. Aceasta însă, este metoda cea mai rapidă, dar și cea mai complicată pentru elaboratori.
Cea mai importantă comandă a limbajului de manipulare cu datele este comanda SELECT. După simplitatea sintaxei ei se ascunde o mare bogăție de posibilități.
Forma cea mai simplă a instrucțiunii SELECT este:
SELECT * FROM table_name;
Unde table_name este numele tabelului din care vom obține datele, iar asteriscul (*) înseamnă selectarea a tuturor câmpurilor din tabel.
Sintaxa instrucțiunii SELECT este următoarea:
SELECT [DISTINCT] columns
FROM tables
WHERE <search_conditions>
[GROUP BY column HAVING <search_condition>]
ORDER BY <sort_order>;
Descrierea clauzelor:
SELECT columns Lista câmpurilor ce vor fi selectate
DISTINCT Cuvânt-cheie opțional care elimină înscrierile duble
FROM tables Identifică tabelele care vor fi utilizate
WHERE <search_conditions> Specifică condiția de căutare care va fi utilizată pentru a limita numărul înscrierilor obținute la subset al numărului total de înscrieri valabile.
GROUP BY column Grupează înscrierile obținute în acord cu valoarea coloanei specificate.
HAVING <search_conditions> Specifică condiția de căutare care va fi utilizată împreună cu clauza GROUP BY.
ORDER BY <sort_order> Specifică ordinea de sortare a înscrierilor care vor fi întoarse de SELECT.
Ordinea clauzelor în instrucțiunea SELECT este importantă, însă numai SELECT și FROM sunt clauzele strict necesare.
SELECT poate, de asemenea, întoarce date din multiple tabele, setând lista numelor tabelelor în clauza FROM, separate prin virgulă.
WHERE
Clauza WHERE a instrucțiunii SELECT urmează după clauzele SELECT și FROM.
Dacă utilizăm clauza ORDER BY, atunci clauza WHERE trebuie folosită înaintea ei. Clauza WHERE testează datele după condiția dată, iar clauza SELECT întoarce numai înscrierile ce satisfac condiției respective. De exemplu, instrucțiunea:
SELECT NAME_S, NAME_L, KD_Jud
FROM S_NAM_PR
WHERE KD_Jud = "08";
întoarce numai înscrierile pentru care KD_jud este “08”.
WHERE condition;
column –câmp din tabel
operator – operator de comparare (descris în tabelul de mai jos)
value – este o valoare sau un set de valori cu care se compară câmpul respectiv. Value poate fi compusă din două sau mai multe valori ca operanzi ai operatorilor aritmetici.Condiția de căutare folosește următoarele tipuri de operatori.
2.4. Operatori. Descrierea.
Operatori de comparare. Se folosește pentru a compara data din câmpul respectiv cu valoarea din condiția de căutare. Exemple <, >, <=, >=, =, and <>. Alți operatori includ BETWEEN, CONTAINING, IN, IS NULL, LIKE, și STARTING WITH.
Operatori aritmetici Se folosesc pentru a calcula și evalua valorile condițiilor de căutare. Operatorii sunt +, -, *, și /.
Operatorii logici Se folosesc pentru a combina condițiile de căutare sau nega condiția. Operatorii logici: NOT, AND, și OR.
Când înscrierea respectivă se compară la condiția de căutare, una din cele trei valori este întoarsă:
True: Înscrierea a satisfăcut condiției specificate în clauza WHERE.
False: Înscrierea nu a satisfăcut condiției specificate în clauza WHERE.
Unknown: Câmpul din clauza WHERE conține o valoare necunoscută care nu poate fi evaluată din cauza valorii NULL.
2.4.1. Operatorul LIKE
Operatorul LIKE ne dă posibilitatea de a folosi caractere speciale în text. Caracterele speciale sînt acele caractere care au o semnificație specială când sînt folosite în condiția de căutare. Caracterul (%) va semnifica – unul sau mai multe caractere, (_) – un singur caracter.
2.4.2. Operatorii Logici
Toate exemplele de până acum au inclus numai câte o condiție de căutare. Însă, în SQL avem posibilitatea de a include orice număr de condiții de căutare în clauza WHERE combinându-le cu ajutorul operatorilor AND sau OR.
Când AND apare între condițiile de căutare, ambele condiții trebuie să fie adevărate pentru ca înscrierea să fie întoarsă.
Când OR apare între condițiile de căutare, numai una din condiții trebuie să fie adevărată pentru ca înscrierea respectivă să fie întoarsă.
Când introducem condiții de căutare compuse, trebuie să ținem cont de ordinea de evaluare a condițiilor.
2.4.3. Funcțiile agregate
SQL pune la dispoziție funcții agregate care calculează o singură valoare dintr-un grup de valori. Grupul de valori sunt toate datele dintr-un câmp particular pentru setul dat de înscrieri. Funcțiile agregate pot fi folosite în cadrul clauzei SELECT, sau oriunde în cadrul instrucțiunii SELECT unde se folosește valoarea.
2.4.4. Clauza HAVING
La fel ca și clauza WHERE care reduce numărul înscrierilor întoarse de clauza SELECT, clauza HAVING poate fi folosită pentru a reduce numărul de înscrieri întoarse de clauza GROUP BY. La fel ca și clauza WHERE, clauza HAVING are condiție de căutare. În clauza HAVING condiția de căutare corespunde tipic unei funcții agregate folosite în clauza SELECT.
De obicei, cererea întoarce înscrieri în “ordinea naturală”, ordine în care înscrierile sînt găsite în tabel. Deoarece păstrarea datelor în tabele este de obicei neordonată (nesortată), rezultatul cererii va fi de asemenea nesortat. Clauza ORDER BY sortează rezultatul în acord cu câmpul specificat. Fiecare coloană din clauza ORDER BY trebuie de asemenea să apară și în clauza SELECT a instrucțiunii.
2.4.5. Insert
Insert înscrie unul sau mai multe tuple de date într-un tabel sau view existent. Insert este una din privilegiile bazei de date controlate de către comenzile GRANT și REVOKE.
Valorile sunt înscrise în tuplu în ordinea coloanelor din tabelă, doar dacă nu este indicată o listă de coloane vizate. Dacă lista de coloane vizate prezintă un subset al coloanelor disponibile, valorile nule sau implicite automat sunt înscrise în toate coloanele nevizate.
Dacă lista opțională a coloanelor vizate este omisă, clauza VALUES trebuie să asigure valori pentru introducerea în toate coloanele tabelei.
Pentru a introduce un singur tuplu de date, clauza VALUES trebuie să asigure o listă specifică de valori pentru insertare.
Pentru a introduce mai multe tuple de date, trebuie să fie specificată o select expresie care extrage datele dintr-o tabelă pentru a le introduce în tabela aceasta. Coloanele selectate trebuie să corespundă cu coloanele vizate pentru introducere.
Este permis de a alege câmpuri de date din același tabel în care dorim să efectuăm introducerea, dar așa practică nu se recomandă deoarece poate cauza in introducerea infinită de tuple.
2.4.6. Update
Modifică parțial sau în întregime tuplul existent de date dintr-un tabel sau view. Disponibil în SQL, DSQL și isql.
UPDATE modifică unul sau mai multe tuple dintr-un tabel sau view existent. UPDATE este una din privilegiile SGBD controlate de către GRANT și REVOKE
2.4.7. Delete
Modifică parțial sau în întregime tuplul existent de date dintr-un tabel sau view. Disponibil în SQL, DSQL și isql.
DELETE specifică unul sau mai multe tuple pentru ștergere din tabel sau view care poate fi modificat. DELETE este una din privilegiile SGBD controlate de către GRANT și REVOKE.
CAPITOLUL III. XML, XSL ȘI C#.
3.1. Limbajul XML.
3.1.1. Originile XML-ului
XML-ul isi are originea undeva in anul 1998, atunci cand cativa membrii ai W3C care sperau sa gaseasca o solutie pentru a satisface cele mai mari probleme ale web-ului din zilele noastre. Avand in vedere ca Web-ul nu este o retea foarte rapida, cate-odata avem de-a face cu un "World Wide Wait". Iar web-ul fiind considerat o librarie enorma, devenim foarte frustrati sa observam cate click-uri avem de apasat pentru a obtine o informatie dorita. Aceste probleme ne pot duce inapoi la anatomia HTML, de care stim pana acum cat ne ajuta la construirea unor pagini serioase. Marile companii din zilele noastre creeaza pagini web prin care sa poata comunica cu clientii, astfel incat acestia din urma sa poata cumpara produse, sau sa apeleze la unele servicii direct de pe pagina celui care detine respectiva afacere, si multe altele.
Una dintre deficientele HTML-ului este inabilitatea de a marca semantic anumite cuvinte. Cum ar fi expresia foca. Aceste tag-uri nu ne transmit o anumita informatie, deci nu definiteste obiectul aflat intre tag-urile . Ceea ce e cert e ca denota ca foca va fi afisat in bold dar nu-l si explica; ar putea fi: o radiera, creion, pix, bicicleta, etc… Pentru a se rezolva aceasta problema membrii corporatiei mai sus amintite au inceput sa lucreze la o extensie a limbajului HTML prin anul 1996. Acest studiu s-a bazat insa pe o specificatie deja existenta si anume Standard Generalized Markup Language (SGML), care este un standard ISO si care a fost folosit pentru a pune bazele limbajului HTML.
XML-ul furnizeaza dezvoltatorilor de software un mecanism usor pentr a-si creea propriile etichete, asa-zisele tag-uri. Astfel ca acestia isi pot impune standarde despre informatiile pe care le conduc, astfel cum acestea ar putea fi descrise si structurate. De aceea (si din alte motive, binenteles) se tinde ca toata informatia de pe web sa fie trecuta in XML.
3.1.2. Introducere în XML.
Extensible Markup Language, abreviat XML, descie o clasă de obiecte numite documente XML și descrie parțial comportamentul unor programe de computer care le procesează. XML este o aplicație profil sau o formă restrictivă a SGML-ului, Standard Generalized Markup Language [ISO8879]. Prin construcție, documentele XML se conformează documentelor SGML.
Documentele XML sunt realizate din unități de stocare numite entități, ce conțin date parsate sau neparsate. Datele parsate sunt realizate din caractere, unele dintre ele formând date caracter iar altele ca marcaje. Marcajele codifică o descriere a schemei de stocare a documentului și structura logică. XML furnizează un mecanism pentru a impune constrîngeri asupra schemei de stocare și a structurii logice.
Un modul software numit procesor XML este utilizat pentru a citi documente XML și pentru a da acces la structura și conținutul lor. Se consideră că un procesor XML își face munca în spatele unui alt modul, numit aplicație. Această specificație descrie comportamentul cerut unui procesor XML în termeni ce spun cum trebuie să citească datele XML și ce informații trebuie să-i furnizeze aplicației.
3.1.3. Terminologie.
Terminologia utilizată pentru a descrie documentele XML este definită în corpul acestei specificații. Termenii definiți în lista următoare sunt utilizați în construcția definițiilor și în descrierea acțiuniilor unui procesor XML:
poate (may)
Documentele care se conformează și procesoarele pot să facă acest lucru dar nu trebuie să se comporte conform descrierierii.
trebuie (must)
Documentele care se conformează și procesoarele trebuie să se comporte conform descrierii; altfel vor da o eroare.
eroare (error)
O violare a regulilor din această specificație; rezultatele sunt nedefinite. Software-ul specific poate să detecteze și să raporteze aceste erori și poate să le soluționeze.
eroare fatală (fatal error)
O eroare pe care un procesor XML specific trebuie să o detecteze și să o raporteze aplicației. După întâlnirea unei astfel de erori, procesorul poate continua căutarea unor astfel de erori și poate să le raporteze aplicației. În loc să proceseze erorile procesorul poate face disponibilă aplicației informația din document, sub formă neprocesată (cu toate datele caracter și cu marcaje). Oricum, odată ce o eroare fatală a fost descoperită, procesorul trebuie să nu mai continuie procesarea normală. (de exemplu nu mai trebuie să-i furnizeze aplicației în continuare datele și informațiile despre structura logică a documentului).
la cererea utilizatorului (to the user option)
Software-ul specializat poate sau trebuie (depinde de verbul modal din propoziție) să se comporte conform descrierii; dacă o fac, atunci ele trebuie să le furnizeze utilizatorilor posibilitatea de a permite sau nu comportamentul respectiv.
cosntrângere de validitate (validity constraint)
O regulă care se aplică tuturor documentelor XML valide. Violarea acestor constrângeri de validitate sunt erori; ele trebuie, la cererea utilizatorului, să fie raportate de câtre procesoarele XML ce fac și validare.
cânstrângere pentru documentele bine formate (well-formedness constraint)
O regulă care se aplică tuturor documentelor XML bine formate. Violarea acestor constrângeri sunt erori fatale.
potrivire (match)
(A numelor și a șirurilor:) Două șiruri sau nume ce sunt comparate trebuie să fie identice. Caracterele cu mai multe reprezentări posibile în ISO/IEC 10646 (de exemplu caracterele cu formă atât precompusă cât și bayă+diacritică) se potrivesc numai dacă au aceiași reprezentare în ambele șiruri. La cererea utilizatorului, procesoarele pot normaliza asemenea caractere la anumite forme canonice. Nu se fac nici un fel de convertiri de mărimi ale caracterelor. (A șirurilor și regulilor din gramatică:) Un șir se potrivește cu o producție gramaticală dacă aparține limbajului gramaticii generate de acea poducție.
pentru compatibilitate (for compatibility)
O facilitate a XML inclusă doar pentru a asigura faptul că XML-ul rămâne compatibil cu SGML-ul.
pentru interoperabilitate (for interoperability)
O recomandare inclusă pentru a crește șansele ca documentele XML să poată fi procesate de pocesoarele existente de SGML, ce se supun la WebSGML Adaption Annex to ISO 8879.
3.1.4. Documentele
Un obiect de tip dată este un document XML dacă este bine format, după specificațiile acestui document. Un document poate fi și valid, pe deasupra, dacă mai îndeplinește câteva constângeri în plus.
Fiecare document are atât o structură logică cât și una fizică. Fizic, documentul este compus din unități numite entități. O entitate poate face referințe la alte entități pentru a cauza includerea lor în document. Un document începe într-o rădăcină sau o entitate document. Logic, documentul este compus din declarații, elemente, comentarii, referințe la caractere și instrucțiuni de procesare, toate fiind indicate în document prin marcaje explicite. Structura fizică și cea logică trebuie să se îmbine corect.
3.1.4.1. Documente XML bine formate
Un obiect de tip text este un document XML bine format dacă:
Luat ca și întreg, se potrivește cu producția numită document.
Îndeplinește toate constrângerile pentru documentele bine formate date în această specificație.
Fiecare entitate parsată ce este referită direct sau indirect în document este bine formată.
Potrivirea cu producția document semnifică:
Conține unul sau mai multe documente.
Este un singur element numit rădăcină (root), sau element document, a cărui parte nu va apare in conținutul altui element. Pentru toate celelalte elemente, dacă marcajul de început este în conținutul altui element, marcajul de sfârșit trebuie să fie în același element. Mai simplu spus, elementele delimitate de marcaje tebuie să coexiste unul în celălalt.
Ca și consecință a acestui lucru, pentru fiecare element C care nu este rădăcină în document, există un alt element P în document, astfel încât C să fie conținut de acesta, dar nu în conținutul nici unui alt element care este și el în conținutul lui P. P este numit părintele (parent) lui C, iar C este copilul (child) lui P.
3.1.5. Caracterele
O entitate parsată conține text, o secvență de caractere, ce pot reprezenta un marcaj sau o dată caracter. Un caracter este un unitate atom al unui text, după cum spun specificațiile ISO/IEC 10646 [ISO 10646]. Caracterele legale sunt tab, enter (CR), sfârșit de linie LF și caracterele legale ale Unicode și ISO/IEC 10646. Utilizarea "caracterelor compatibile", definite în secțiunea 6.8 a [Unicode], este descurajată.
Mecanismul pentru codificarea valorilor caracterelor în secvențe de biți poate varia de la entitate la entitate. Toate procesoarele XML trebuie să accepte codificările UTF-8 și UTF-16 ale lui 10646; mecanismul pentru recunoașterea a cărui dintre cele două este utilizat sau pentru a intoduce și alte codificări, este discutat mai târziu în Secțiunea 4.3.3: Codificarea caracterelor în entități.
3.1.6. Constructori sintactici comuni
Această secțiune definește câteva simboluri utilizate frecvent în gramatică.
S (spațiu alb) constă din unul sau mai multe caractere spațiu (#x20), enter, sfârșit de linie sau tab-uri.
Caracterele sunt clasificate pentru simplitate în litere, cifre sau alte caractere. Literele constau în caracter dintr-un alfabet sau o un caracter da bază a unei silabe, urmată probabil de unul sau mai multe caractere combinate sau de un caracter ideografic.
Un nume (Name) este un cuvânt ce începe cu o literă sau cu unul dintre puținele caractere de punctuație. El poate continua cu litere, cifre, cratime, liniuțe de subliniere, două puncte sau cu puncte, toate cunoscute ca și caractere pentru nume. Numele ce încep cu șirul "xml" sau cu alte șiruri ce se potrivesc cu (('X' | 'x') ('M' | 'm') ('L' | 'l')) sunt rezervate pentru standardizare în următoarele versiuni ale acestei specificații.
NOTĂ: Caracterul două puncte din numele XML este rezevat pentru experiment ca și spații între nume. Înțelesul lui, se așteaptă să devină standardizat undeva în viitor, punct în care acele documente care le utilizează în scop experimental vor trebui reactualizate. (Nu este nici o garanție că că orice mecanism de spații între nume adoptat pentru XML va utiliza două puncte ca și delimitator între nume.) În practică, acest lucru semnifică că autorii nu ar trebui să utilizeze două puncte în numele XML, excepție făcând acele documente utilizate pentru experimentarea spațiilor dintre nume, dar procesoarele XML ar trebui să accepte două puncte ca și caracter din nume.
Un cuvânt nume (Nmtoken) este un mixaj dintre mai multe caractere pentru nume.
Datele literale sunt orice șir de caractere cuprins între ghilimele ce nu conține în el același tip de ghilimele ca și delimitatori pentru acel șir. Literali sunt utilizați pentru a specifica conținutul entitățiilor interne (EntityValue), valorile unror atribute (AttValue) și identificatori externi (SystemLiteral). De menționat că peste un literal system (SystemLiteral) se poate trace fără a mai fi necesară o parsare.
3.1.7. Datele caracter și marcajele
Textul constă din îmbinarea dintre date caracter și marcaje. Marcajul (markup) ia una dintre formele: macaje de început, marcaje de sfârșit, marcaje pentru elemente goale, referințe la entirăți, referințe la caractere, comentarii, delimitatori de secțiuni CDATA, declarații de tipuri de document și instrucțiuni de procesare.
Tot textul care nu face parte dintr-un marcaj reprezintă datele caracter (character data) ale documentului.
Caracterul and (&) și paranteza unghiulară deschisă (<) pot apărea în forma lor literală numai atunci când este utilizat ca și delimitator de marcaj sau într-un comentariu, o instrucțiune de procesare sau o secțiune CDATA. Ele sunt, de asemenea, legale între valorile entitățiilor literale a unei declarații de entitate internă. Dacă este nevoie de ele în altă parte, ele vor trebui să fie incluse utilizându-se fie referințele numerice la caractere sau șirurile "&" și respectiv "<". Paranteza unghiulară închisă (>) poate fi reprezentată utilizând șirul ">" și trebuie, pentru compatibilitate, să fie inclusă utilizând ">" sau o referință la caracter atunci când ea apare în șirul "]]>", când șirul nu delimitează o secțiune CDATA.
În conținutul elementelor, datele caracter sunt orice șir de caractere ce nu conține delimitatorul de început al unui marcaj. Într-o secțiune CDATA, datele caracter sunt orice șir de caractere ce nu include delimitatorul de sfârșit al secțiuni CDATA, "]]>".
Pentru a permite valorilor atributelor să conțină atât apostroafe simple cât și duble, caracterul apostrof sau ghilimeaua (') trebuie să fie reprezentată ca și "'", iar caracterul ghilimele (") ca și """.
3.1.8. Comentariile
Comentarile pot apărea oriunde în document în afara altor marcaje; în plus ele pot apare în declarația tipului de fișier în locurile permise de gramatică. Ele nu fac parte din datele caracter ale documentului; un procesor XML poate, dar nu este nevoie, să dea un acces aplicațiilor la comentarii. Pentru compatibilitate, șirul "–" (liniuță dublă) nu trebuie să apară în comentarii.
3.1.9.Instrucțiuni de procesare
Instrucțiunile de procesare (processing instructions – PI) permit documentelor să conțină instrucțiuni pentru aplicații.
Instrucțiunile de procesare nu sunt părți ale datelor caracter, dar trebuie trimise aplicației. Instrucțiunile de procesare încep cu o țintă (PITarget) utilizată pentru a identifica aplicația căreia îi este destinată instrucțiunea. Numele de ținte de forma 'XML', 'xml' sau alte combinații posibile, sunt rezervate pentru standardizare în această versiunea sau pentru versiuni ulterioare. Mecanismul de notații al XML poate fi utilizat pentru declarații formale ale unor ținte PI.
3.1.10. Prologul și Declararea Tipului de Document
Documentele XML pot și ar trebui să înceapă cu o declarație XML (XML declaration) care specifică versiunea limbajului XML utilizat. De exemplu, următorul exemplu este un document XML bine format, dar care nu este valid:
<?xml version="1.0"?>
<greeting>Hello, world!</greeting>
la fel este și:
<greeting>Hello, world!</greeting>
Numărul versiunii "1.0" ar trebui să fie utilizat pentru a indica conformarea la această versiune de specificații; este o eroare dacă se utilizează versiunea "1.0" dacă nu se conformează la această versiune de specificații. Intenția grupului de lucru XML este de a da următoarelor veriuni de specificații alte numere diferite de "1.0", dar această intenție nu indică o obligație de a produce versiuni ulterioare ale XML și nici dacă acestea vor fi produse, utilizarea unei anumite scheme de numere. Odată ce la versiunile următoare nu se lucrează, această construcție este furnizată pentru a permite recunoașterea automată a versiuni și ar trebui să devină necesară. Procesoarele pot semnala o eroare dacă primesc documente cu versiuni pe care nu le suportă.
Funcția unui marcaj într-un document XML, este de a descrie ceea ce conține și structura logică și pentru a asocia perechi de atribute-valori la structura lui logică. XML furnizează un mecanism, numit declarația tipului de document, pentru a defini constrângeri pe structura logică și pentru a suporta unități de stocare predefinite. Un document XML este valid dacă are asociată o declarație de tip de document și dacă documentul este conform constrângerilor din ea.
Declarația tipului de document trebuie să apară înaintea primului element din document.
Declarația tipului de document XML (document type declaration) conține sau indică spre declarațile de marcaje ce furnizează o gramatică pentru o clasă de documente. Această gramatică este cunoscută sub numele de definiția tipului de document sau DTD. Declarația tipului de document poate indica spre un subset extern (un tip special de entitate externă) ce conține declarații de marcaje sau poate conține declarații de marcaje direct într-un subset intern sau în ambele părți. DTD-ul unui document este format din ambele subseturi luate împreună.
Declarația unui marcaj (markup declaration) este o declarare a unui tip de element, o declarare a unei liste de atribute, declararea unei entități sau a unei declarații de notație. Toate aceste declarații pot fi conținute în întregime sau numai o parte dintre ele între entitățiile parametru, după cum sunt descrise în censtrângerile documentelor bine formate și valide.
Declarația marcajului poate fi în întregime sau numai în parte formată din textul de înlocuit de la entitățiile parametru. În producțiile de mai târziu din această specificație referitoare la nonterminali individuali, sunt descrise declarațiile după ce toate entitățiile parametru au fost incluse.
VC (Constrângere de validitate): Tipul de element rădăcină. Numele (Name) în declarația tipului de document trebuie să se potrivească cu tipul elementului rădăcină.
VC (Constrângere de validitate): Declarație/ Includerea entitățiilor parametru propice. Textul de înlocuit al entității parametru trebuie să fie inclus propice în declarația de marcaj. Altfel spus, dacă primul caracter sau ultimul caracter al unei declarații de marcaj (markupdecl mai sus) este conținut în textul de înlocuit pentru referința la o entitate parametru, ambele trebuie să fie conținute în același text de înlocuit.
WFC (Constrângere de document bine format): Entitățile parametru din subsetul intern. În subsetul intern al DTD-ului, referințele la entitățile parametru pot apare numai unde pot apare și declarațile de marcaje. (Aceasta nu se aplică la referințele ce apar în entitățiile parametru externe sau în subsetul extern.)
Ca și subsetul intern, subsetul extern și orice entitate parametru externă referită în DTD trebuie să conste dintr-o serie de declarații de marcaje complete al tipurilor permise de simboli neterminali markupdecl, întrețesute cu spații albe sau referințe entitate parametru. Oricum, porțiuni ale conținutului al subsetului extern sau al entităților parametru externe pot fi condițional ignorate, prin utilizarea construcției de secțiuni condiționale; acest lucru nu este permis în subsetul intern.
Subsetul extern și entitățile parametru externe diferă, de asemenea, de subsetul intern, prin faptul că în ele referințele entitate parametru sunt permise în declarațiile de marcaje, nu numai între declarațiile de marcaje.
Un exemplu de document XML cu o declarație de tip de document:
<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>Hello World!</greeting>
Identificatorul sistem "hello.dtd" este URI-ul unui DTD al unui document.
Declarațiile pot fi date și local ca în exemplul de mai jos:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
<!ELEMENT greeting (#PCDATA)>
]>
<greeting>Hello World!</greeting>
Dacă sunt utilizate ambele subseturi, atât cele externe, cât și cele interne, se consideră că subsetul intern va apare înaintea subsetului extern. Aceasta va avea ca și efect faptul că declarațiile entitatăților și a listelor de atribute în subsetul intern vor avea o precedență față de cele din subsetul extern.
3.1.11. Tratarea spațiilor albe
În editarea documentelor XML, este adesea convenabil să fie utilizate "spații albe" (spații, taburi și linii goale notate toate cu nonterminalul S în această specificație) pentru a separa marcajele pentru a crește claritatea la citire. Asemenea spații albe nu se intenționează a fi incluse în versiunea trimisă a documentului. Pe de altă parte, "spațiile albe" semnificante ce trebuie reținute în versiunea expediată sunt comune, de exemplu într-o poezie sau în cod sursă.
Un procesor XML trebuie întotdeauna să trimită toate caracterele ce nu sunt marcaje spre aplicație. Un procesor XML validator trebuie să informeze aplicația care dintre aceste caractere constituie spații albe ce apar în conținutul unui element.
Un atribut special numit "xml:space" poate fi atașat unui element pentru a semnala o intenție că în acel element, spațiile albe ar trebui păstrate de către aplicație. În documentele valide, acest atribut, ca și celelalte trebuie să fie daclarat dacă este utilizat. Când este declarat, trebuie dat ca și tip enumerație, a cărui valori posibile sunt "default" și "preserve". De exemplu:
<!ATTLIST poem xml:space (default | preserve) 'preserve'>
Valoarea "default" semnalează că modurile de procesare implicite ale spațiilor albe ale aplicațiilor sunt acceptabile pentru acest document; valoarea "preserve" indică intenția ca aplicația să păstreze toate spațiile albe. Această intenție declarată se consideră că se aplică la toate elementele din conținutul elementelor în care a fost specificată, mai puțin acolo unde a fost suprascrisă cu o altă instanță a atributului "xml:space".
Elementul rădăcină al oricărui document se consideră că nu are nici o intenție în ceea ce privește manipularea spațiilor de către aplicație, mai puțin atunci când furnizează o valoare a acestui atribut sau când atributul este declarat cu o valoare implicită.
3.1.12. Identificarea limbajului
În procesarea documentului, este adesea util să identificăm natura limbajului formal în care este scris conținutul. Un atribut special numit "xml:lang" poate fi inserat în document pentru a specifica limbajul utilizat în conținut și în valorile atributelor oricărui element din documentul XML. În documentele valide, acest atribut, ca și oricare altul, trebuie declarat înainte de a fi utilizat
Codul limbajului (Langcode) poate fi unul dintre următoarele:
un cod de limbaj de două litere precum este definit în [ISO639], "Codes for the representation of names of languages"
un identificator de limbaj înregistrat cu Internet Assigned Numbers Autority (IANA); acestea încep cu prefixul "i-"(sau cu "I-")
un identificator de limbaj asociat de către utilizator sau agreat între părți pentru un uz privat; acestea trebuie să înceapă cu prefixul "x-" sau "X-" pentru a fi siguri că nu intră în conflict cu nume standardizate sau înregistrate mai târziu cu IANA.
Pot fi oricâte segmente de subcod (Subcode); dacă primul segment de subcod există și dacă Subcode are două litere, atunci trebuie să fie un nume de țară din [ISO3166], "Codes for the representation of names of countries." Dacă primul subcod are mai mult de două litere, trebuie să fie un subcod pentru limba în discuție, înregistrată cu IANA, excepție fiind atunci când codul imbajului (Langcode) începe cu prefixul "x-" sau "X-".
Este un obicei să se dea codul limbajului cu litere mici și codul țării (dacă există) cu litere mari. De menționat că aceste valori, spre deosebire de alte nume în documentele XML, nu sunt senzitive la mărimea literelor.
3.1.13. Declarațiile listelor de atribute
Atributele sunt utilizate pentru a asocia elementelor perechi de nume și valorii. Specificațiile atributelor pot să apară numai în marcajele de început și în marcajele de elemente. Declarațiile listelor de atribute pot fi utilizate:
Pentru a defini un set de atribute ce aparțin unui tip de element.
Pentru a stabili constrângeri legate de tipul acestor atribute.
Pentru a da valori implicite pentru atribute.
3.1.14. Tipuri de atribute
Tipurile de atribute XML sunt de trei feuri: de tip string, un set de tipuri de cuvinte și de tip enumerat. Tipul string poate lua ca și valoare orice șir literal ; tipurile de cuvinte pot avea constrângeri semantice și lexicale.
3.1.14.1. Valoriile implicite ale atributelor
O declarație de atribut furnizează informația dacă prezența atributului este necesară, iar dacă nu, cum trebuie să reacționeze procesorul XML dacă un atribut declarat lipsește din document.
Dacă este declarată o valoare implicită, atunci când un procesor XML întâlnește un atribut omis, el va trebui să se comporte ca și cum atributul ar fi prezent și ar avea valoarea implicită.
Valoarea implicită declarată trebuie să se supună constrângerilor lexicale din declarația tipului de atribut.
3.1.14.2. Normalizarea valoriilor atributelor
Înainte ca valoarea unui atribut să fie trecută aplicației, sau verificată pentru validare, procesorul XML trebuie să o normalizeze după cum urmează:
referință la un caracter este procesată prin adăugarea caracterului referit la valoarea atributului
referință la o entitate este procesată recursiv prin înlocuirea a textului de înlocuit
un caracter spațiu (#x20, #xD, #xA, #x9) este procesat prin adăugarea valorii #x20 la valoarea normalizată, cu excepția că doar un singur caracter #x20 este adăugat pentru o secvență "#xD#xA" ce este parte a unei entități externe parsate sau a unei valori a unei entități literale dintr-o entitate internă parsată
alte caractere sunt normalizate prin adăugarea lor la valoarea normalizată
3.1.15. Structuri fizice
Un document XML poate consta dintr-una sau mai multe unității de stocare. Acestea poartă denumirea de entități (entities); toate au un conținut (content) și toate pot fi identificate printr-un nume (name) (excepție face entitatea document – vezi mai jos – și subsetul DTD extern). Fiecare document XML are o entitate numită entitatea document, ce servește ca și punct de pornire pentru un procesor XML și ce poate conține întregul document.
Entitățile pot fi parsate sau neparsate. Conținuturile unei entităților parsate (parsed entity) sunt referite pentru textele înlocuitoare; acest text este considerat o parte integrantă a documentului.
O entitate neparsată (unparsed entity) este o resursă al cărei conținut, poate sau nu poate să fie text, iar dacă este text, poate să nu fie XML. Fiecare entitate neparsată are asoiată o notație, identificată prin nume. În spatele cerinței ca un procesor XML să-i facă disponibile unei aplicații, identificatorii entității și ai notației, XML-ul nu face nici o restricție asupra conținutului entităților neparsate.
Entitățile parsate sunt invocate prin nume, utilizând referințe la entități; entitățile neparsate prin nume, dat ca și valoare a atributelor ENTITY sau ENTITIES.
Entitățile generale (general entities) sunt entitățile ce sunt utilizate în conținutul unui document. În această specificație, entitățile generale sunt uneori referite cu ajutorul termenului necalificat entitate, atunci când acesta nu produce confuzii. Entitățile parametru sunt entități parsate ce sunt utilizate în interiorul DTD-ului. Aceste două tipuri de entități utilizează forme diferite de referințe și sunt recunoscute în contexte diferite. Mai mult, ele ocupă diferite domenii de nume; o entitate parametru și o entitate generală cu același nume, sunt două entități distincte.
3.1.16. Entități interne
Dacă prin definiție, entitatea este o valoare de tip entitate (EntityValue), entitatea definită este numită entitate internă (internal entity). Nu există obiecte de stocare fizice separate, iar conținutul entității este dat în declarație. De menționat că anumite procesări ale unor referințe la caractere și la entități, pot cere ca în valoarea entității literale să fie pus textul corect de înlocuit.
O entitate internă este o entitate parsată.
Exemplu al unei declarații a unei entități interne:
<!ENTITY Pub-status "This is a pre-release of the specification.">
3.1.17. Entități externe
Dacă entitatea nu este internă, atunci ea este o entitate externă (external entity).
URI-urile relative sunt relative la locația resurselor în interiorul căreia apare declarația entității. Un URI poate fi astfel relativ la entitatea document, la entitatea ce conține DTD-ul extern sau la alte entități parametru externe.
Un procesor XML ar trebui să trateze un caracter non-ASCII dintr-un URI prin reprezentarea lui în setul UTF-8 prin unul sau mai mulți octeți și apoi prin schimbarea acestor octeți printr-un mecanism de schimbare URI (de exemplu prin cenvertirea fiecăriu octet la forma %HH, unde HH este o reprezentare hexazecimală a valorii octetului).
În plus la un identificator sistem, un identificator extern poate să-i includă un identificator public (public identifier). Un procesor XML ce încearcă să încarce conținutul unei entități poate utiliza identificatorul public pentru a încerca să genereze un URI alternativ. Dacă procesorul este incapabil să facă acest lucru, atunci el trebuie să utilizeze URI-ul specificat în literalul sistem. Înainte de a se încerca o potrivire, toate șirurile de spații albe din identificatorul public trebuie să fie normalizate la câte un singur caracter spațiu (#x20), iar spațiile albe de la început și de la sfârșit trebuie înlăturate.
Exemple de declarații de entități externe:
<!ENTITY open-hatch
SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
"http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
SYSTEM "../grafix/OpenHatch.gif"
NDATA gif>
3.1.18. Entități parsate
3.1.18.1. Declarație de text
Fiecare entitatate parsată externă poate începe cu o declarație de text.
Declarația de text trebuie să fie furnizată literal, nu prin referință la o entitate parsată. Nici o declarație de text nu poate apare în orice poziție, ci doar la începutul unei entități externe parsate.
3.1.18.2. Entități parsate bine formate
Entitatea document este bine formată dacă se potrivește cu producția etichetată document. O entitate generală externă parsată este bine formată dacă se potrivește cu producția etichetată extParsedEnt. O entitate parametru externă este bine formată dacă se potrivește cu producția etichetată extPE.
O entitate generală internă parsată este bine formată dacă textul ei de înlocuit se potrivește cu producția etichetată content. Toate entitățile parametrice interne sunt bine formate prin definiție.
O consecință a entităților bine formate este faptul că structurile fizică și logică a unui document XML sunt bine îmbricate; nici un marcaj de început, de sfârșit, nici un marcaj marcaj gol, nici un element, comentariu, instrucțiune de procesare, referință caracter sau referință entitate nu poate începe într-o entitate și să se termine în alta.
Tratamentul aplicat de către procesorul XML entitățiilor și referințelor
Tabelul de mai jos sumarizează contextele în care pot apare referințe la caractere, referințe la entități și invocări ale entităților neparsate și modul în care trebuie să se comporte procesoarele XML în fiecare dintre cazuri. Etichetele din coloana stânga numesc contextul:
Referință în conținut
determină o referință aflată oriunde între marcajul de început și marcajul de sfârșit al unui element; corespunde non-terminalului content.
Referință în valoarea atributelor
determină o referință aflată în valoarea unui atribut într-un marcaj de început sau dat ca și valoare implicită în declarația unui atribut; corespunde non-terminalului AttValue.
Apare ca și valoare a unui atribut
determină un nume (Name), nu o referință, ce apare ca și valoare a unui atribut ce a fost declarată de tip ENTITY sau ce apare ca și una dintre unitațile (tokens) separate prin spațiu, în valoarea unui atribut ce a fost declarat de tip ENTITIES.
Referință în valoarea entității
determină o referință dintr-un parametru sau o valoare literale a unei entități interne în declararea unei entități; corespunde non-terminalului EntityValue.
Referință în DTD
determină o referință aflată într-un subset DTD intern sau extern, dar în afara unei valori a unei entității (EntityValue) sau a unei valori a unui atribut (AttValue).
3.1.19. Entitățile predefinite
Referințele la caractere și la entități pot fi utilizate pentru a înlocui paranteza unghiulară stângă, and-ul și alți delimitatori. În acest scop este specificat un set de entități generale (amp, lt, gt, apos, quot). Pot fi utilizate și referințe numerice la caractere; ele vor fi expandate imediat ce sunt recunoscute și trebuie să fie tratate ca și date caracter, deci referințele numerice la caracterele "<" și "&" pot fi utilizate pentru a înlocui < și & când acestea apar în datele caracter.
Toate procesoarele XML trebuie să recunoască aceste entități chiar dacă sunt declarate sau nu. Pentru interoperabilitate, documenetele XML valide trebuie să declare aceste entități, împreună cu celelalte entități, înainte de a le utiliza.
3.1.20. Entitatea document
Entitatea document (document entity) stă pe post de rădăcină în arborele entităților și este un punct de pornire pentru procesorul XML. Această specificație nu descrie modul în care este localizată entitatea document de către procesor; spre deosebire de celelalte entități, entitatea document nu are nume și poate, foarte bine, să apară la o intrare a procesorului fără nici o identificare.
3.2. Documentele XSL
3.2.1. Notiuni despre XSL
Spre deosebire de HTML, XML nu definește modul în care documentul trebuie să fie afișat, adică programul analizator are libertatea de a „alege” modul de reprezintare a informației. Această cerință e înaintată de principiul de separare a structurii interne a documentului de modul de reprezentare a acestei informații. De exemplu definind în document un element: <floare>trandafir</floare> doar indicăm faptul că trandafir este floare, dar informația despre cum trebuie să arate acest element la client sau dacă în general trebuie el să fie atașat nu e dată într-o așa definire.
Iată un exemplu simplu de un document XSL pentru formatarea fragmentului <flower>rose</flower>:
< xsl >
<rule>
<target-element type="flower"/>
<p color="red" font-size="12">
<children/>
</p>
</rule>
</ xsl >
XSL este un limbaj de transformare a unor documente XML în alte documente XML. XSL este o pagină de stil pentru limbajul XML. XSL include un vocabular XML pentru o formatare specifică. XSL specifică stilul unui document XML, XSL nu este gîndit cu intenția de a transforma limbajul XML.
Totuși necesitatea de a transforma informația din XML într-o altă formă este foarte acută, fie că e vorba de o transformare în formatul HTML sau fie că e vorba de un alt format de reprezentare a informației. Pentru așa acțiuni a fost elaborat XSL(eXtensible Stylesheet Language) care permite transformarea XML documentului în alt format electronic.
Principiul de prelucrare al XML documentelor cu ajutorul XSL constă în următoarele: programa analizator parsează documentul XSL prelucrează instrucțiunile acestuia, și fiecărui element din XML document îi pune în corespondență modul de formatare definit de secțiunea respectivă a documentului XSL. Altfel spus, noi definim un șablon de formatare pentru pentru elementele din XML, iar acest șablon la rândul său poate să aibă o structură care corespunde structurii fragmentului XML respectiv. Instrucțiunile XSL definesc locul exact al elementului XML în arbore, deci există posibilitatea de a aplica diferite stiluri de oformare pentru elemente cu același nume, în dependență de contextul lor
Conținutul documentului XSL:
< xsl >
<rule>
<root/>
<HTML>
<BODY bgcolor="white">
<center><hr width="80%"/><b>Library</b><hr width="80%"/><br/>
<table width="80%" border="2">
<children/>
</table></center>
</BODY>
</HTML>
</rule>
<rule>
<element type="book">
<target-element type="author"/>
</element>
<td align="center">
<p color="red" font-size="14"> <b>
<children/>
</b></p></td>
</rule>
<rule>
<element type="article">
<target-element type="author"/>
</element>
<td align="center">
<p color="red" font-size="14" font-style="italic"><children/></p></td>
</rule>
<rule>
<target-element type="book"/>
<tr><children/></tr>
</rule>
<rule>
<target-element type="article"/>
<tr><children/></tr>
</rule>
<rule>
<target-element/>
<td align="center"><p><children/></p></td>
</rule>
<rule>
<target-element type="books"/>
<tr><td colspan="3" bgcolor="silver" >Books</td></tr>
<children/>
</rule>
<rule>
<target-element type="articles"/>
<tr><td colspan="3" bgcolor="silver" >Articles</td></tr>
<children/>
</rule>
</ xsl >
3.3. C# – limbajul nativ pentru Microsoft .NET
3.3.1. Elemente de bază în C#
C# este un nou limbaj de programare special conceput de Microsoft pentru dezvoltarea serviciilor și aplicațiilor internet care vor rula pe noua platformă Microsoft .NET. Aplicațiile web bazate pe componente, dezvoltate în C#, sunt la fel de performante ca și cele bazate pe arhitectura client/server, deoarece Microsoft .NET Framework este constituit dintr-un mediu de execuție numit Common Language Runtime (CRL) și un set de biblioteci de clase, care oferă o platformă de dezvoltare compatibilă cu diverse limbaje și unelte specifice.
Există o probabilitate destul de mare că după citirea a n articole, toate cu același subiect, al n+1-ulea să poată fi parcurs cu ochii închiși. În general, abordări diverse pot avea multe aspecte comune, deși subiectul pare inepuizabil. Se poate să fie și cazul celor care citesc acest articol, dar sper să fie cel mult al n-ulea, încercând să afle cât mai multe despre C#.
Vom vorbi despre tipuri de date și cuvinte cheie în C#. Orice limbaj nou de programare poate fi mai ușor de înțeles atunci când este comparat cu un set de limbaje deja familiare..
Raționamente (locul C# în cadrul platformei .NET)
Tipuri de date în .NET Framework (și implicit în C#)
Tipuri fundamentale
Tipuri primitive
Tipuri referință
Tipuri valoare
Tipuri auxiliare
Cuvinte rezervate în C#
Instrucțiuni de salt (cuvinte cheie: break, continue, goto, return, throw)
Blocuri de control cu multiple selectii (cuvinte cheie: switch, case, default)
Iterarea unei colecții de date (cuvinte cheie: foreach, în)
Verificarea depășirii domeniului de valori (cuvinte cheie: checked, unchecked)
Transmiterea parametrilor prin valoare și prin referință (cuvinte cheie: ref, out)
Utilizarea constantelor în C# (cuvinte cheie: const, readonly)
Identificarea tipurilor în momentul execuției (cuvinte cheie: as, is)
Supraîncărcarea operatorilor (cuvânt cheie: operator)
3.3.2. C# – limbaj de programare…
În caz că nu te rezumi doar la înmulțiri și împărțiri, un limbaj de programare este un instrument
Pe care îl creezi și îl dezvolți pe cont propriu;
Pe care îl împrumuți și fie îl dezvolți mai departe, fie te folosești de el în alte scopuri.
Orice s-ar spune, vei dori în final să utilizezi acest instrument pentru a dezvolta o tehnologie. Deci, un limbaj de programare este un instrument cu care poți exploata o tehnologie și doar atât; cu care te folosești de o tehnologie pentru a crea și dezvolta o tehnologie nouă.
C# este un instrument cu care poți exploata Microsoft .NET. C# este limbajul nativ pentru .NET Framework și o mare parte din această platformă ("millions of code lines") este scrisă în C# cu care te folosești de Microsoft .NET pentru a dezvolta, spre exemplu, Servicii WEB.
Dacă ar fi să urmărim istoricul limbajelor dezvoltate de Microsoft, putem specula apariția limbajului C# ca urmare a conflictelor ("bumpy relantionships") dintre Microsoft și Sun în ceea ce privește producția Visual J++. Acest limbaj era (și încă mai este) complet orientat obiect, mai ușor și mai modern decât C++ și deosebit de productiv în COM development. Programatorii din Redmond întotdeauna au recunoscut aceste calități și, răniți în orgoliul lor, au jurat răzbunare. Eu, unul, așa aș fi făcut.
C#, așa cum reiese din signatură, face parte din familia limbajelor C și se dorește să combine ce este mai bun din C++, Java și Visual Basic. Fără discuție, este un limbaj puternic, sigur, complet orientat obiect ("everything is an object"), simplu, productiv, modern și elegant."
3.3.3. C# – tipuri, obiecte și valori
În .NET Framework (și implicit în C#) există tipuri fundamentale și tipuri auxiliare de date.
3.3.3.1. Tipuri fundamentale
Am observat că orice discuție legată de tipurile de date .NET atrage atenția publicului. Spre exemplu, lui Jeffrey Richter i-au trebuit trei articole în MSDN Magazine pentru a le descrie și Don Box a insistat, ori de câte ori a avut ocazia, asupra tipurilor, obiectelor și valorilor, împreună catalogate fundamental abstractions" ale .NET
fig.1 Modelul obiectual al C#.
Tipurile fundamentale de date în C# nu sunt decât imagini ale Common Type System, astfel încât să fie permisă interoperabilitatea cross-language: un tip de data definit în C#, spre exemplu, poate fi utilizat în orice alt limbaj compatibil .NET Framework. În momentul execuției, un tip de dată C# devine practic un tip din Common Type System. În .NET Framework există trei tipuri fundamentale de date: tipuri primitive, tipuri referință și tipuri valoare.
3.3.3.2. Tipuri primitive
Sunt numite astfel deoarece sunt folosite frecvent. Compilatorul permite manipularea lor cu o sintaxă simplificată: asociază fiecărui tip primitiv tipul corespunzător descris în Base Class Library. Un programator nu poate să definească un tip de dată primitiv deoarece nu poate să își definească propriile tipuri ca fiind din Base Class Library.
Exemplu 1:
Cod C#
/* Următoarele două linii de cod sunt echivalente */
System.String trueStr = System.Boolean.TrueString;
string trueStr = bool.TrueString;
Tipurile primitive existente în C# sunt prezentate mai jos.
Tipurile primitive existente în C# Tab.2
3.3.3.3. Tipuri auxiliare
Sunt tipuri valoare sau referință (deci nu sunt tipuri hibride), cu unele proprietăți specifice. Voi descrie tipurile sealed și tipurile imutabile.
În ierarhia tipurilor .NET Framework, tipurile sealed (definite cu modificatorul sealed) reprezintă nodurile frunză. Prin urmare, aceste tipuri nu pot fi superclase pentru alte tipuri (nu pot fi derivate). Câteva exemple sunt: System.String, System.DateTime sau System.Threading.Mutex.
O instanță a unui tip imutabil nu deține membri care să poată să îi schimbe valoarea (mutatori). Din punctul de vedere al transmiterii parametrilor, tipurile imutabile sunt interesante pentru că au comportamentul asemănător cu tipurile valoare, dar nu pot fi scrise ca tipuri valoare. Prin urmare, un tip imutabil este un tip referință imutabil. Exemple: System.String sau System.Text.Regular Expressions.Regex.
3.3.4. Tipuri referință și tipuri valoare
Modelul obiectual al platformei de dezvoltare .NET, descris de Virtual Object System (VOS), definește un set de reguli pentru definirea oricărui tip de dată compatibil .NET. Două dintre aceste reguli sunt:
Orice obiect derivă (direct sau indirect) din tipul System.Object.
Nu este permisă moștenirea multiplă.
C# este limbajul reprezentativ pentru Microsoft .NET Framework și bineînțeles că aceste reguli se aplică și în cazul nostru.
Cod C#
// Următoarele definiții de tipuri sunt identice
class MyClass
{
//…
}
class MyClass : System.Object
{
//…
}
Cod C#
class ABaseClass
{
//…
}
class AnotherBaseClass
{
//…
}
// Eroare: moștenirea multiplă nu este permisă
class ADerrivedClass : AbaseClass, AnotherBaseClass
{
//…
}
În C# există o ierarhie a tipurilor, în care:
Nodul rădăcină este System.Object.
Orice alt tip X este:
Fie un nod intern al ierarhiei, care permite unui alt tip Y să moștenească pe X (spre exemplu, clasa System.Windows.Forms.Form).
Fie un nod frunză al ierarhiei, care nu permite nici unui alt tip Y să îl moștenească (spre exemplu, clasa System.String).
În fig.2 sunt exemplificate câteva ramuri din ierarhia de tipuri existente în C#. Vom reveni asupra acestei figuri în paragrafele următoare.
fig.2 Câteva ramuri din ierarhia de tipuri existente în C#.
Pentru a putea descrie tipurile referință și tipurile valoare, precum și diferențele care apar între aceste tipuri, vom analiza pe scurt următoarele cuvinte cheie din C#: class, interface, delegate, enum, struct și namespace.
Descrierea cuvintelor cheie. Tab.3
3.3.5. Declarații/Definiții
Un tip referință este declarat/definit utilizând doar cuvintele cheie class, interface și delegate. Un tip valoare este declarat/definit utilizând cuvintele cheie enum și struct.
Exemplul 2:
Cod C#
using System;
// Declararea unui domeniu de tipuri global-unice
namespace Domeniu
{
// Declararea unei interfețe
interface IDomeniu
{
void Write (EDomeniu aState);
}
// Declararea unei clase abstracte
abstract class ACDomeniu
{
protected EDomeniu state;
public event DDomeniu StateChanged;
public abstract void Write ();
public void changeInternalState ()
{
state = EDomeniu.Sleeping;
this.StateChanged ();
}
}
// Definirea unei clase
class CDomeniu : ACDomeniu
{
public CDomeniu ()
{
state = EDomeniu.Working;
base.StateChanged += new DDomeniu (Write);
}
public override void Write ()
{
Console.WriteLine ("Internal state: {0}.", state);
}
~CDomeniu ()
{
base.StateChanged -= new DDomeniu (Write);
Console.WriteLine ("One CDomeniu object destroyed");
}
}
// Declararea unui delegat
public delegate void DDomeniu ();
// Declararea unui tip valoare enumerativ
public enum EDomeniu
{
Working,
Sleeping
}
// Definirea unui tip valoare
public struct SDomeniu : IDomeniu
{
public EDomeniu state;
public void Write (EDomeniu aState)
{
Console.WriteLine ("Received state: {0}.", aState);
}
public static void Smth ()
{
CDomeniu obj = new CDomeniu ();
Console.WriteLine ("*****<CDomeniu>*****");
ACDomeniu acObj = obj;
acObj.Write ();
acObj.changeInternalState ();
Console.WriteLine ("*****</CDomeniu>*****");
SDomeniu val = new SDomeniu ();
Console.WriteLine ("*****<IDomeniu>*****");
IDomeniu iObj = val;
iObj.Write (val.state);
Console.WriteLine ("*****</IDomeniu>*****");
}
public static void Main ()
{
SDomeniu.Smth ();
Console.ReadLine ();
}
}
}
3.3.6. Instanțierea tipurilor în C#
Singurele tipuri care pot fi instanțiate sunt cele definite (clasele și delegații – tipuri referință și structurile – tipuri valoare). Oricum, pentru tipurile care nu pot fi instanțiate se pot declara variabile de acel tip. O instanță a unui tip referință este numită obiect și o instanță a unei structuri este numită valoare sau obiect cu tip valoare.
Clasele declarate cu modificatorul abstract sunt doar parțial definite, în sensul că ele pot fi utilizate doar ca tipuri de bază pentru alte clase. Astfel de clase nu pot fi instanțiate.
3.3.7. Obiecte și valori în C#. Creare și stocare
Utilizăm următoarele notații:
MH (Managed Heap) este zona de memorie (COM+) în care sunt alocate obiectele.
MM (Memory Manager) este o componentă din Common Language Runtime (CLR) care gestionează lucrul cu MH în .NET Framewok.
GC (Garbage Collector) este un motor apelat de MM în momentul în care se decide o acțiune de curățare a MH. În principal, scopul acțiunii de curățare este de a elibera din MH referințele care nu mai pot fi accesate.
ST este stiva firului de execuție curent, pe care se alocă valorile.
Exemplul 3:
Cod C#
// Definirea unui tip referință
class CDomeniu : ACDomeniu
{
//…
}
// Definirea unui tip valoare
public struct SDomeniu
{
//…
}
// Instanțierea unui tip referință: obținem o variabilă de tip referință ce adresează un obiect
CDomeniu obj = new CDomeniu ();
// Instanțierea unui tip valoare: obținem o valoare sau o variabilă de tip valoare
SDomeniu val = new SDomeniu ();
Un obiect este creat cu operatorul new (instrucțiunea CIL corespunzătoare este newobj). Din punctul de vedere al gestionării memoriei, mediul de lucru .NET este auto-controlat (managed); programatorul nu poate curăța manual o zonă de memorie (nu există nici un operator dual pentru new). Când se utilizează new pentru instanțierea unui tip referință, două operații majore sunt realizate:
– Alocare. Se alocă pe MH numărul de octeți necesari pentru a reprezenta tipul obiectului. Suplimentar, pot fi configurați anumiți octeți pentru componente cum ar tabela virtuală (v-table).
– Inițializare. Sunt inițializați membrii obiectului.
Operatorul new întoarce adresa la care s-a alocat un obiect. În exemplul de mai sus, variabila "obj" este o adresă la biții de stare ai obiectului proaspăt alocat pe MH; "obj" poartă numele de variabilă de tip referință (vtr).
O instanță a unui tip valoare se obține fie prin new, fie doar declarând o variabilă de acel tip. Spre deosebire de un obiect, o valoare nu este alocată pe MH, ci pe ST. În exemplu de mai sus, variabila "val" va conține chiar biții de stare ai obiectului alocat pe ST; "val" este numită variabilă de tip valoare (vtv).
O noutate în .NET Framework este modul în care tipurile sunt reprezentate: împachetate (boxed) sau despachetate (unboxed).
Mecanismul de împachetare (boxing) permite unei valori V să se comporte ca un obiect: este alocat un obiect O pe MH și se copie biții de stare ai valorii în obiectul alocat. Sistemul marchează pe O ca fiind un wrapper (o formă împachetată a unei valori) astfel încât se se permită și procedeul invers, de despachetare (unboxing). Deoarece doar asupra wrapper-elor se poate aplica procedeul de unboxing (sunt marcate!), este clar că tipurile referință nu pot fi reprezentate în formă despachetată.
3.3.8. C# – cuvinte cheie
C#, așa cum este de așteptat, impresionează prin numărul și prin facilitățile oferite prin cuvintele cheie. Descrierea pe scurt doar a câteva cuvinte cheie, mai atractive și mai utilizabile, prin scopul lor. Lista tuturor cuvintelor cheie C# poate fi consultată în tabelul de mai jos.
Lista cuvintelor cheie în C# Tab.4
break, continue, goto, return, throw
Aceste cuvinte cheie reprezintă instrucțiuni de salt. Rolul lor este de a transfera controlul unei aplicații în afara blocului curent de instrucțiuni.
switch, case, default
Expresia switch se folosește pentru a declara un bloc de control pentru multiple selecții. Controlul este pasat unui bloc intern case sau default.
switch (expresie)
{
case expresie-constantă:
secvență-de-instrucțiuni;
secvență-de-salt;
[default:
secvență-de-instrucțiuni;
secvența-de-salt;]
}
M-am oprit asupra acestui cuvânt rezervat deoarece el aduce două îmbunătățiri semnificative.
În primul rând, "expresie" desemnează fie un tip șir de caractere (string), fie un tip întreg. Probabil mulți programatori Java/C++ s-au întrebat de ce literalii șiruri de caractere nu pot fi manipulați cu switch.
Fiecare bloc de selecție intern trebuie să se termine cu o instrucțiune de salt (break, goto case expresie-constantă, goto default, return), excepție făcând blocurile vide, care nu au încorporate secvențe de instrucțiuni. Cu alte cuvinte, în C# nu este permisă trecerea automată dintr-un bloc intern în altul consecutiv, decât dacă programatorul dorește acest lucru, folosind goto.
Exemplul 3:
Cod C#
string strSmth = "b";
// prelucrează strSmth
switch (strSmth)
{
case ("a"):
Console.WriteLine ("Este a");
break;
// OK
case ("b"):
Console.WriteLine ("Este b");
goto default;
// OK
case ("c"):
// Secvență nulă de instrucțiuni
// OK
case ("e"):
Console.WriteLine ("Este e");
return;
// OK
case ("d"):
Console.WriteLine ("Este d");
goto case "f";
// OK
case ("f"):
Console.WriteLine ("Este f");
// ERROR, lipsește instrucțiunea de salt
case ("g"):
break;
// OK, pot să am aici doar o instrucțiune de salt
default:
Console.WriteLine ("Este " + strSmth);
// ERROR, lipsește instrucțiunea de salt, chiar dacă este ultimul bloc intern din switch
}
Programatorii Perl, PHP sau TCl/Tk se vor simți ca acasă atunci când vor utiliza foreach în C#.
foreach (tip identificator in expresie) bloc-de-instrucțiuni
foreach oferă un mod mai elegant de a itera elementele unei colecții de obiecte, care implementează interfața System.Collections.IEnumerable. Exemple de astfel de mulțimi sunt Array, ArrayList, String, XmlNodeList și XmlNode.
Exemplul 4:
Cod C#
XmlDocument doc = new XmlDocument ();
doc.LoadXml (
"<noduri>" +
"<nod tip='XML'>" +
"Informație" +
"</nod>"+
"<nod tip='în-gât'>" +
"Emoție" +
"</nod>"+
"<nod tip='pescăresc'>" +
"Imobilitate" +
"</nod>" +
"</noduri>"
);
Ca și în cazul supraîncărcării operatorilor în C++, sunt multe observații de care trebuie să se țină seama.
Toate metodele corespunzătoare operatorilor supraîncărcați trebuie definite publice (public) și statice (static).
În cazul în care se supraîncarcă operatorul true (false), tipul returnat trebuie să fie System.Boolean. În restul cazurilor, nu există nici o restricție asupra tipului returnat. Dar aduceți-vă aminte de discuția legată de intuiție!
Nu puteți schimba aritatea sau precedența unui operator.
Dacă supraîncărcați un operator 1-ar, atunci argumentul metodei corespunzătoare trebuie să aibă tipul clasei/structurii în care ați decis să supraîncărcați operatorul (în exemplul nostru MyClass). Dacă operatorul supraîncărcat este 2-ar, atunci primul argument trebuie să fie de tipul clasei/structurii în care vă aflați, iar al doilea argument poate fi de orice tip.
Probabil că vă întrebați ce operatori pot fi supraîncărcați și cum pot fi aceștia redefiniți.
Operatorii ce pot fi supraîncărcați în C# Tab5
3.3.9. Microsoft .Net si C#
Combinația între familia .Net si C# va aduce probabil o mai mare putere și liberate dezvoltatorilor de software. Potențialul tip “disruptive technologies” este enorm și este greu de anticipat care va fi impactul imediat pe piață. C# impreună cu Visual Studio.Net fac posibilă crearea și raspîndirea Web services aproape automat; aplicațiile Web scrise pentru ASP.Net și distribuite către IIS (Internet Information Server) 6.0 vor fi mult mai performante, stabile și scalabile în raport cu tradiționalul ASP.
3.4. Protocolul ASP.
3.4.1. Noțiuni despre ASP.NET.
Primele tentative de combatere a .Net-ului vin de la Ximian, o companie care ofera interfața utilizator Gnome pentru Linux. Oferta lor se numeste "Mono" și se vrea un concurent pentru Microsoft .Net. Specialistii sustin că, în cazul unui succes al acestei oferte, va creste popularitatea și importanta .NET-ului ca o strategie software-as-a-service fără a submina controlul Microsoft asupra soft-ului propriu-zis. Dar, adauga ei, deoarece .Net-ul este o tehnologie în formare, orice "clona" va fi și mai "imatura" decat parintele ei. Red Hat, cel mai important concurent al Microsoft-ului, deși nu a comentat planurile Ximian, și-a exprimat sprijinul pentru orice efort care încearca să restranga controlul Microsoft în lumea IT. Cei de la Red Hat au declarat ca nu e nevoie să creeze alternative proprii la .Net, deoarece sunt atatea initiative pe piata pe care sunt dispuși să le sustina. Oficiali ai Ximian au declarat ca lucreaza cu o versiune proprie a .Net-ului, în mai anul acesta compania lansînd SOAP, o versiune a soft-ului care intra în componenta .Net și acum devenit standard industrial. Alt comercializator Linux, Caldera International, și-a manifestat interesul față de o versiune a .Net pentru Linux. Microsoft .Net este o strategie larga care ofera servicii de tipul e-commerce și address book-uri online, ceea ce a transformat dominanta Microsoft în soft-ul desktop în dominanta și pe Internet. De aceea, orice miscare open-source care ar încerca să se opune strategiei Microsoft ar avea un parcurs relativ lent comparativ cu strategia originala. Alte companii care au încercat să ofere "servicii Web" au putut să utilizeze bazele .Net-ului, care nu este ideea exclusiva a Microsoft. Mai mult, ECMA, grup pentru standarde, încearca să ofere o versiune standard a soft-ului utilizat pentru a rula serviciile web pe orice calculator, dar și pentru a crea o versiune a soft-ului pentru versiunea FreeBSD a Unix. Microsoft susține de asemenea gasirea unor standarde pentru soft-urile web. Protocolul SOAP (Simple Object Access Protocol) permite diferitelor calculatoare să schimbe date și comenzi descrise de Extensible Markup Language (XML). Web Services Description Language (WDSL) descrie ce poate să facă un anumit serviciu Web. Și Universal Description, Discovery și Integration (UDDI) catalogheaza și gaseste serviciile Web. Toate acestea integrate în .Net ofera caracteristici de nivel înalt care nu vor fi disponibile programatorilor din afară. ASP.Net, un update al Active Server Pages-ului pentru crearea paginilor Web la cere și ADO.Net, soft-ul pentru accesul în baza de date. Deși compania susține ca se va putea intra pe .Net de pe orice dispozitiv, se va face în așa fel ca accesul să se facă prin Windows, comenteaza analistii. Și mai ingrijorator este soft-ul Passport pe care îl utilizază Microsoft pentru a identifica utilizatorul serviciilor Hailstorm, soft pe care multi îl doresc open-source. Oficiali Microsoft declara ca ar fi foarte greu de realizat un produs open-source pentru acest soft parere confirmata și de catre analistii. Dar, aduagă ei, singura preocupare pentru moment este aceea de a face tot posibilul pentru ca Microsoft să nu "detină" Internet-ul.
CAPITOLUL IV. FUNCȚIONAREA BD “BIBLIOTECA”.
4.1. Sistemul Informațional “Biblioteca”.
Această sistemă informațională este creată în baza tehnologiei client-server și încadrată într-o rețea de tip Internet. Sistema este bazată pe componenta Administrator (bibliotecar).
În acest compartiment se pune accentul pe interfața grafică. Deoarece programele se accesează prin intermediul browserilor, paginile sau elaborat după modelele paginilor Internet. Adică informația dorită să fie primită în formă clară, bine structurată și cu o reprezentare grafică cât mai atrăgătoare.
4.2. Structura generală a sistemului "Biblioteca"
Navigarea prin conținutul bibliotecii se începe din pagina principală. Bibliotecarul are șase alternative care pot fi alese:
Autori ;
Datorii;
Cărți la cititorii;
Cititori;
Categorii ;
Cărți.
Autori – va afișa lista autorilor.
Datorii – va afișa lista celor datori. Sistemul automat controlează cărți la cititori și introduce în datorii cei ce trecut limita de reținere a cărților.
Cărți la cititori – va afișa lista cărților la cititori.
Cititori – va afișa lista cititorilor.
Categorii – lista categorilor care sunt în bibliotecă;
Cărți – lista cărților.
Pagina principală conține următoarele cîmpuri și butoane(fig.3):
Search by;
Value;
Search;
Refresh.
Search by – butonul de căutare care conține:
Autori ;
Datorii;
Cărți la cititorii;
Cititori;
Categorii ;
Cărți.
Deci putem apela sau la Search by sau activăm una din cele șase opțiuni păsînd dublu clic.
În cîmpul Valuie indicăm (căutarea după un cuvînt cheie, conform desrierii conținute în tabele) ceea ce dorim să căutăm(căutarea parțială sau totală).
După îndeplinirea cîmpurilor Search by și Valuie pentru a căuta în baza de date apăsăm butonul Search.
Pentru a înțelege pentru ce este destinat fiecare buton atît din pagina principală cît și din celelalte pagini s-a modelat o fereastră pentru ca în ea să apară comentariu la fiecare buton de pe pagină. Adică, când se deplasează mousul pe suprafața butonului dorit, v-a apărea comentariul necesar.
fig.3 Pagina principală a BD
Baza de date “Biblioteca” conține tabele în care se introduc date, dar și tabele care conțin la rîndul lor legături logice dintre tabele. De exemplu în tabelul Cărți nu putem introduce date noi pînă nu introducem date în tabelul Autori, Categorii(nu putem introduce o carte nouă dacă nu avem autorul dat și categoria dată din care face ea parte).
4.2.1. Pagina “Autori”.
Această pagină(tabel) conține următoarele cîmpuri:
ID – codul de identificare;
aNume – conține numele autorului;
aDescriere – conține descrierea(cuvintele cheie).
În baza de date acest tabel este sub numele tblAuthors.
Această pagină la fel conține Search by, Value, butoanele Search, Refresh și au aceleași funcții. Dar mai sunt butoanele:
New item – înscrie un nou autor;
Edit – putem face schimbări la autorul dat;
Delete – putem șterge autorul dat.
În acest tabel Search by caută după ID, Nume of Autor, Descriere.
fig.4. Pagina Autori
4.2.2. Pagina Categorii
Această pagină se v-a genera datorită deplasării maosului în cîmpul Categorii și activării acestuia din pagina principală.
Această pagină conține trei cîmpuri:
ID – codul categoriei,
cNume – denumirea categoriei;
cDescriere – ceva descrieri(cuvinte cheie), în acest câmp se indică mai detaliat ce domenii cuprinde categoria dată.
Și, de asemenea , conține tot aceleași butoane cu aceleași funcții.
Fig.5. Pagina Categorii
4.2.3. Pagina Cărți
Această pagină se v-a genera datorită deplasării maosului la cîmpul Carti și activării lui din pagina principală.
Ea conține așa cîmpuri ca:
ID
bNume – denumirea cărții;
bAuthor – autorul cărții;
bCategorii – din ce categorie face parte această carte;
bPublishing – anul publicării acestei cărți;
bCode – codul cărții în bibliotecă;
bDateCreated – data cînd a fost adusă în bibliotecă.
\
fig.6. Pagina Cărți.
Observăm că pe linia de jos ne arată, în cazul dat, cîte cărți avem și care ne le arată.
La fel avem posibilitatea de a introduce cărți noi, de a corecta, de a șterge informația despre o carte.
4.2.4. Pagina Cititori
Ea conține următoarele cîmpuri:
ID
uNumIdentific – numărul(codul) cititorului după care se identifică;
uNumele – numele cititorului;
uPrenumele – prenumele cititorului;
uZiNaster – luna/ziua/anul nașterii;
uPassportNumb – numărul de identificare din pașaport;
uPhone – numărul de telefon de la domiciliu;
uAdres – adresa cititorului.
fig.7 Pagina Cititori.
Introducerea noilor cititori, cu alte cuvinte, înregistrarea cititorilor se face apăsînd butonul New Item. După apăsare va apărea:
fig. 8 Introducerea datelor unui nou cititor.
4.2.5. Pagina Cărți la cititori
Conține următoarele cîmpuri: ID;
uNumIdentific – numărul(codul) cititorului după care se identifică;
bNume – denumirea cărții;
aNume – numele autorului.
fig.9 Pagina Cărți la cititori
Bibliotecara apăsînd butonul New Item va putea da cărți la cititori. Aceasta este vizualizat în pagina din fig.10. Cîmpurile acestei pagini conțin lista cititorilor și lista cărților ce sunt înregistrate în bibliotecă.
fig.10. Înregistrarea eliberarii cărților la domiciliu.
Dacă vom introduce, de exemplu, greșit data cînd a fost luată cartea sistemul ne va da eroare, și pănă nu o vom corecta mai departe nu vom putea lucra. Deci data trebuie să meargă în ordinea următoare: luna/data/anul. Iată un exemplu de astfel de greșeală:
fig. 11 Ilustrarea erorilor.
4.2.6. Pagina Datorii
Această pagină este o conexiune logică dintre tabelele Cititori și Carți la cititori.
fig.12 Pagina Datorii.
Controlează dacă a trecut termenul ținerii cărții trece cititorul dat în acest tabel. El conține cîmpurile ID, Numele, Prenumele, PassportNumber din tabelul Cititori și Nume, Data din tabelul Cărți.
În fiecare tabel fiecare cîmp poate fi sortat în creștere sau în descreștere. BD este relațională și este normalizată conform formei 4, cu toate avînd legături.
La fiecare pagină pe rîndul de jos sunt indicate cîte linii conține pagina dată și la a cîta ne aflăm. Ea mai conține patru butoane care au funcțiile de: primul – se întoarce la prima linie, al doilea – se întoarce cu zece înregistrări mai înainte, a treilea – se mută cu următoarele zece întegistrări mai înainte, a patra – se mută la sfîrșit.
CAPITOLUL V. ESTIMAREA ECONOMICĂ A PROIECTULUI
5.1. Planificarea rețea pentru elaborarea a bazei de date „Biblioteca”.
Proiectele tehnologice contemporane sunt caracterizate de următoarele particularități:
tehnica nouă utilizată este foarte complexă și este construită utilizând ultimele elaborări științifice.
accelerării vitezei de elaborare a proiectelor.
proiectele referitoare la complexele tehnicii de calcul și softului sunt supuse uzurii morale foarte rapide.
necesitatea proiectării de sistemă la elaborarea softului și sistemelor tehnice.
Toate acestea au dus la necesitatea de creare a noi metode de planificare. Una din aceste metode prezintă modelarea procesului de elaborare, adică prezentarea legăturilor și caracteristicilor lucrărilor în procesul elaborării proiectului.
Metodele tradiționale de planificare presupun utilizarea celor mai simple modele de tipul construirea diagramelor de tip consecutive și ciclice.
Dar în asemenea diagrame nu este posibil de a prezenta legăturile dintre niște lucrări, de unde rezultă imposibilitatea de a afla cât de importantă este lucrarea dată pentru executarea scopului final. Pot apărea diferite întârzieri în timp, ce apar pe porțiuni de interconectare a lucrărilor, care sunt complicat de prezentat în diagrame. De obicei, în procesul dirijării se culege informația despre lucrările efectuate și aproape nu se culege și nu se prezintă informația referitor la prognoza finisării lucrărilor viitoare, de aceia este imposibil de a prognoza rezultatele diferitor variante de soluționare la modificările planului inițial de lucru. Este de asemenea complicat de a reflectași dinamica lucrărilor, de a corecta toată diagrama în legătură cu schimbarea termenilor de efectuare a unei lucrări, ce este necesar de a efectua ca să nu schimbăm termenul de efectuare a întregului complex de lucrări.
Aceasta este doar o parte mică din neajunsurile metodelor utilizate în prezent pentru planificare și prezentarea grafică a planurilor de pregătire a producerii. Aceste neajunsuri în mare pare sunt excluse de către sistemele de planificare și dirijare în rețea utilizate în prezent.
Sistemele de planificare și gestiune în rețea prezintă un complex de metode grafice și de calcul, metode de control și de organizare, care asigură modelarea, analiza și reconstruirea dinamică a planului de executare a proiectelor complexe.
Sistemele de planificare și gestiune în rețea este o metodă cibernetică creată pentru gestiunea cu sisteme dinamice complexe cu scopul asigurării condiției de optim pentru careva indicatori. Așa indicatori, în dependență de condițiile concrete, pot fi:
timpul minim pentru elaborarea întregului complex de lucrări;
costul minim al elaborării proiectului;
economia maximală a resurselor;
Particularitățile sistemului de planificare și gestiune în rețea în general sunt următoarele:
se realizează metoda proiectării de sistem la rezolvarea problemelor de organizare a gestiunii proceselor.
se utilizează modelul informațional-dinamic special (graful-rețea) pentru descrierea matematico-logică a procesului și calculul automat (conforma algoritmului) a parametrilor acestui proces (durata, costul, forțele de muncă, etc.)
se utilizează sisteme de calcul pentru prelucrarea datelor operative pentru calcului indicatorilor și primirea rapoartelor analitice și statistice necesare.
Documentul de bază în sistemul de planificare și gestiune în rețea este graful-rețea (modelul rețea), care prezintă modelul informațional-dinamic, în care sunt prezentate legăturile și rezultatele tuturor lucrărilor, necesare pentru atingerea scopului final.
Biblioteca evenimentelor și lucrărilor, efectuate în procesul elaborării BD “Biblioteca”Tab.6.
În fig. 13 este prezentată schema reprezentării grafice a grafului-rețea :
Fig.13 Structura grafului-rețea.
unde: cercul – un eveniment;
săgeata – o lucrare;
tij – durata lucrului ij;
Rlij – rezerva liberă de timp a lucrului ij;
Rdij – rezerva deplină de timp a lucrului ij;
Tdi – timpul devreme de începere a evenimentului i;
Tti – timpul târziu de terminare a evenimentului i;
Ri – rezerva liberă de timp a evenimentului i;
Ni – numărul evenimentului i;
Tdj – timpul devreme de începere a evenimentului j;
Ttj – timpul târziu de terminare a evenimentului j;
Rj – rezerva liberă de timp a evenimentului j;
Nj – numărul evenimentului j.
S
Durata efectuării lucrărilor. Tab. 7
Pentru calculul parametrilor grafului-rețea am elaborat un sistem care după transferarea datelor de intrare în baza de date (SQL) permite lansarea unui set de proceduri care calculează parametrii grafului-rețea.
Parametrii calculați ai grafului rețea sunt prezentați în tab.8.
Calculele parametrilor grafului rețea. Tab.8
5.2. Evaluarea economică a proiectului
Din graful rețea vedem că realizarea proiectului durează 58 de zile – adică 11,6 saptamâni (saptamâna cu 5 zile lucrătoare a câte 8 ore lucrătoare).
Componența grupului de lucru. Tab.9.
5.3. Evaluarea economică a bazei de date „Biblioteca”.
Executarea lucrărilor de către lucrători. Tab.10.
Pentru salariu remunerat de bază sau cheltuit
Sb = 295,0+830,0+2280,0+2180,0=5585,0 lei.
Salariu auxiliar (25%)
Sa = 5585,0 0,25 = 1396,25 lei.
Defalcări în Fondul Social (28%)
Cfs = (5585,0+1396,25) 0,28 = 1954,75 lei.
Cheltuielile totale pentru achitarea salariului
Ct = 6981,25+ 1954,75 = 8936,0 lei
Să calculăm cheltuielile de energie electrică. Un calculator personal obișnuit nu are o putere mai mare de 200 W. Toate calculatoarele în sumă vor cheltui 400 W. Pe parcursul proiectului, timp de 58 de zile vor fi consumate:
400 51 8 = 163200 W = 163,2 kW h
La momentul actual un kW h costă 0,67 lei, deci cheltuielile vor fi:
163,2 0,68 = 110,976 111 lei
Costul softului procurat Tab. 11
Costul materialelor utilizate Tab. 12
Cheltuielile pentru amortizarea programelor Visual Studio: Costul inițial 1000USD, 3 licențe, amortizarea timp de 2 ani. Următorul produs Visual Studio va fi cumpărat cu 0.5 preț (la prezentarea licențelor actuale).
Deoarece procurarea hardului și a softului în domeniul Tehnologiilor Informaționale este considerată ivenstiție de capital, v-om amortiza aceste cheltuieli timp de 2 ani – termen in care totul din acest domeniu se uzează moral:
[S/(A*365)]*Z
unde: S – suma ce trebuie de amortizat;
A – perioada de amortizare în ani;
Z – perioada proiectului în zile.
[16200/(2*365)]*51 =1131,78 lei
5.4. Evaluarea eficacității economice de la implementarea SI “Biblioteca”
Evaluarea eficității perfecționării Sistemelor Informaționale cu ajutorul formulei :
Ean =[(Cv+En*Kv)-(Cn+ En*Kv)]*Nsoft
Unde : Kv – costul fondurilor fixe pentru sistemul vechi;
Cv – cheltuielile de exploatare a sistemului vechi;
Kn – costul fondurilor fixe pentru sistemul nou;
Cn – cheltuielile de exploatare sistemului nou;
En- coeficientul normativ a eficienți investițiilor capitale;
Nsoft- numărul de sisteme informaționale perfecționate.
Toate datele se raportează la un an de exploatare. Pentru sisteme soft coeficientul En este egală cu 0,35. În tabelul următor tab.8 este evaluată eficiența implementării proiectului dat, adică se arată diferența dintre un mod vechi de lucru și unul nou, avînd în vedere perfecționarea și dezvoltarea modului vechi în unul mai performant și comod în utilizare.
Efectul social de la implementarea SI “Biblioteca” Tab. 13
Programul necesită calculatoare moderne. Necesită sisteme de operare Windows 2000 sau Windows NT pentru server.
Este clar că crearea unui astfel de sistem informațional necesită cheltuieli mari și eforturi serioase din partea programatorilor, de aceea acest sistem informațional nu va fi chiar atît de ieftin și accesibil pentru toți. Dacă luăm în considerație faptul că cu ajutorul acestui sistem informațional se lucrează mai repede, mai efectiv, mai comod, atunci acele cheltuieli pentru acest sistem se recuperează destul de repede.
CAPITOLUL VI. PROTECȚIA MUNCII
6.1. Aprecierea pericolului la monitor
Odată cu dezvoltarea tehnicii de calcul tot mai mult se atrage atenția asupra problemelor protecției utilizatorilor, оn special acelor care lucrează la calculator, adică lвngă monitor. Principalii factori dăunători, care influențează asupra sănătății omului, cвnd acesta lucrează lвngă monitor sunt:
radiația sau iradieri ionizate;
câmpul electrostatic;
câmpul electromagnetic, etc.
Iradieri Ionizate reprezintă iradierea electro-magnetică cu o capacitate de ionizare a moleculelor. Dacă se provoacă ionizarea moleculelor organismului uman, atunci legăturile între molecule se distruge și ca rezultat apar diferite boli. Capacitatea de ionizare o au următoarele particule: a, b, X, g – iradieri, fluxul de electroni, substanțele radioactive.
În cazul monitoarelor cel mai semnificativ tip de iradiere ionizată este b – iradiere, care însă este foarte mică, de obicei nu depășește normele biologice. Celelalte tipuri de iradieri pot fi neglijate deoarece greu pot fi depistate.
b – iradierea apare în urma ciocnirii electronilor cu atomii substanței luminofore sau cu atomii ecranului din sticlă.
Pentru a micșora iradierea ionizată a monitoarelor moderne, pe suprafața lor se aplică o foaie metalică străvezie, care atenuează fluxul de iradiere. O altă cale de apărare împotriva iradierii ionizate este procurarea unui ecran protector, care se instalează pe monitor și are același efect ca și foaia metalică străvezie.
În genere iradierea ionizată asupra omului poate provoca următoarele acțiuni:
locale – acțiuni de scurtă durată cu doze mari, care aduce la traume locale: îmbolnăvirea pieii, pierderea pieii, pierderea unghiilor, defectarea oaselor, cancer;
totale – reprezintă iradieri îndelungate cu doze mici, aduce la îmbolnăvirea sângelui (leucemie).
Câmpul electrostatic, care apare pe ecranul monitorului este rezultatul bombardării permanente a monitorului cu fascicolul de electroni emis de catod. Astfel sarcina electrică, case se acumulează pe suprafață monitorului, formează câmpul electrostatic. Fenomenul electrizării statice este legat și de starea aerului din mediu. În condiții normale aerul se caracterizează cu proprietăți izolatorii înalte, însă sub acțiunea razelor solare și celor cosmice, radiației materialelor radioactive a scoarței pământului și a altor factor ionizatori, moleculele neutrale a aerului se ionizează, formând ioni pozitivi și negativi – purtători ai sarcinii electrice. Dacă intensitatea câmpului electric, format de materialele, de dispozitivele de curent continuu și de obiectele, care ușor se electrizează, este mare, atunci ionii liberi obțin energie cinetică suficientă pentru a forma ioni noi la ciocnirea lor cu moleculele neutre. În urma ionizării aerul își pierde proprietatea sa de izolator (devine conductibil) și descărcarea electrică latentă se transformă într-o descărcare sferică, adică are loc o străpungere electrică a aerului.
Descărcarea electricității statice poate provoca o explozie, incendiu și alte accidente. La unele оntreprinderi, care produc substanțe sintetice, polimeri și produse din aceste substanță, și care posedă proprietăți dielectrice оnalte, electrizarea micșorează productivitatea muncii și este unul din motive care duc la scăderea calității producției.
Influența sistematică a câmpului electrostatic de intensitate înaltă asupra corpului omului poate duce la unele dereglări funcționale a sistemului central nervos, a sistemului cardio-vascular și a altor organe. Din aceste motive, intensitatea maxim-admisibilă a câmpului electric la locurile de muncă este normată:
Intensitatea maxim-admisibilă a câmpului electric la locurile de muncă Tab. 14
Intensitățile admisibile a câmpului electrostatic sînt indicate fără a lua în considerație influența asupra omului a descărcărilor electrice. Normele indicate pentru intensitatea câmpului electrostatic mai mare de 20 kW/m se utilizează numai cu condiția, restul timpului a zilei de lucru intensitatea nu întrece 20 kW/m. Dacă intensitatea câmpului electrostatic întrece valorile indicate, atunci se aplică unele măsuri de micșorare a ei.
Măsurile principale de micșorare a intensității câmpului electric în zona de lucru sânt:
îndepărtarea surselor a câmpurilor electrostatice din zona personalului care deservește aparatura;
ecranarea sursei câmpului sau a locului de muncă;
utilizarea neutralizatorilor de sarcini electrice statice;
umezirea materialului care se electrizează;
schimbarea materialelor, care ușor se electrizează cu materiale ce nu se electrizează;
alegerea suprafețelor care contactează conform condițiilor de electrizare minimă;
modificarea procesului tehnologic în așa mod ca să se micșoreze nivelul de electrizare;
alegerea materialelor și suprafețelor care greu electrizează alte corpuri sau le electrizează cu sarcini de polaritate diferită;
instalarea în toate încăperile, unde se află oameni, a podelelor care conduc curentul electric.
Оn calitate de măsură de protecție individuală a omului de la electricitatea electrostatică poate servi оncălțămintea ce conduce curentul electric, albituri, halat, etc. adică tot ce asigură legătura electrică a corpului omului cu pămвntul.
În majoritatea monitoarelor moderne problema câmpului electrostatic este parțial rezolvată prin introducerea tehnologiei antistatice. Datorită acestei tehnologii câmpul electrostatic se micșorează până la 10% din intensitatea inițială a acestuia. În afară de această majoritatea ecranelor protectoare, care micșorează iradierea ionizată, mai sigură și atenuarea considerabilă a câmpului electrostatic.
Câmpul electromagnetic creat de monitor este de asemenea un factor dăunător sănătății omului.
Influența câmpurilor electromagnetice de mare intensitate asupra omului constă în absorbția de către țesuturile corpului uman a energiei, însă influența principală îi revine câmpului electric. Nivelul de influență a câmpurilor electromagnetice asupra omului depinde de frecvență, de puterea emisiei, de durata acțiunii, de regimul de emisie (prin impulsuri sau continuu), și de asemenea de proprietățile individuale ale organismului. Influența câmpului electric de frecvență joasă provoacă dereglări în activitatea funcțională a sistemului cardio-vascular, și chiar la schimbări privind componența sângelui.
Influența câmpului electromagnetic de frecvență înaltă se reflectă sub forma efectului termic, care duce la ridicarea temperaturii corpului, la supraîncălzirea locală a țesuturilor corpului și a organelor cu o termoreglare slabă. Ca rezultat unii lucrători suferă din cauză insomniei, simt dureri în regiunea inimii, dureri de cap, ușor obosesc.
Pentru a micșora puterea de emisie a sursei câmpului electromagnetic pot fi utilizate următoarele mijloace tehnice:
utilizarea unui astfel de regim de lucrul, în care dispozitivul lucrează cu o putere mai mică decât cea proiectată;
lichidarea locurilor de emisie suplimentară;
micșorarea undelor reflectate prin ajustarea sarcinilor, etc.
Alegerea corectă a regimului de lucru a personalului și a utilajului permite micșorarea prezenței omului în zona de acțiune a câmpurilor electromagnetice.
Utilizarea sistemelor de dirijare la distanță cu utilajul permite personalului să-și îndeplinească funcțiile în afara zonei de acțiune a câmpurilor electromagnetice.
Procesul de ecranare, des utilizat cu scopul de micșora influența câmpurilor electromagnetice, utilizează fenomenul de absorbție și reflectare a energiei câmpului electromagnetic. Pentru confecționarea ecranului se utilizează materiale cu o conductibilitate electrică înaltă (aluminiu, cupru, oțel), și cu proprietăți de absorbție și reflectare sub formă de foi și plasă. Ecranele obligatoriu se unesc la pământ.
Eficacitatea acțiunii de ecranare a materialului se caracterizează prin adâncimea infiltrării câmpului electromagnetic în ecran, care depinde de materialul de confecționare.
Adâncimea infiltrării câmpului electromagnetic, la care acest câmp scade de 2,718 ori:
unde
m – permeabilitatea magnetică relativă a materialului ecranului, Hn/m;
s – conductibilitatea relativă a materialului ecranului, cm/m;
f – frecvența câmpului electromagnetic Hz.
Adâncimea infiltrării a frecvențelor înalte și supraînalte în ecran de obicei nu întrece un milimetru, astfel grosimea ecranului se alege din considerente constructive.
6.2. Calcularea Iluminatorului Natural
Iluminarea suficientă a locurilor de muncă este o condoție principală a lucrului productiv și stării normale a sănătății omului. Iluminarea locului de mincă poate fi naturală, artificială și combinată.
Iluminatorul natural se batorează energiei solare. Regulamentul cere ca în încăperile de lucru să fie obligatoriu iluminatul natural pate fi lateral (prin ferestre), de sus (prin prin felinare) și mixt.
Iluminatorul natural poate fi neuniform.
Iluminarea locurilor de muncă să corespundă următoarei condiții:
nivelul de iluminare a suprafeței de lucru trebuie să corespundă normelor igienice pentru lucrul de tipul dat;
trebuie să fie asigurată omagenitatea și stabilitatea nivelului de iluminat în încăpere, lipsa contrastelor între iluminarea suprafeței de lucru și spațiului înconconjurător;
sursele de lumină și alte obiecte nu trebuie să genereze reflecții în cîmpul de vedere;
iluminul artificial după spectrul său trebuie să apropie de spectrul iluminatorului natural.
O mare importanță pentru asigurarea capacității înalte de muncă și bunei dispoziții are iluminarea optimă a locului de lucru. Iluminatorul poate fi natural (se folosește energia solară), artificial (cu ajutorul becurilor incandescente sau fluorescente) și susprapus.
Calcularea iluminatorului natural constă în calcularea ariei totale a ferestrelor, felinarelor m2 .
unde
Sf – suprafața ferestrei la iluminatul lateral;
Sn – suprafața podelei în încăpere a 12 m2 ;
En – valoarea normală a calculării iluminatorului artificial (CIN);
En4=En3*m*c,
unde
En3 – valoarea CIN; En3=2.0.
m – coeficientul zonei climatice; m=0.9
c – coeficientul zonei solare; că0.95.
Ks – coeficientul suplimentar; Ks=1.2
Nf – caracteristica de lumină a ferestrei la iluminatul natural; Nf=7.5
Kcl – coeficientul care ține cont de întunecare a ferestrelor de late clădiri; Kcl=1
– coeficient complex de pătrundere a luminii, sedetermină după formula:
0ă1*2*3*4*5, unde
1 – coeficient de trecere a luminii pentru materialele date; 1=0.8
2 – coeficient care ține cont de pierderi ale luminii la trecere prin ferestre; 2=0.75
3 – coeficient care ține cont de pierderi ale luminii în condiții de bază; 3=1.0
4 – coeficient care ține cont de pierderi ale luminii în intervalele de slăbire a luminii; 4=0.65
5 – coeficient care ține cont de pierderi de lumină în plasă de protecție a felinarelor: =0.5
0=0.8*0.1*0.75*0.65*0.9=0.04
r1 – coeficient care țime cont de majorarea CIN al iluminatorului natural, datorită luminii încăperii; r1 =2.25
Sf=8.46 m2
6.3.Analiza condițiilor de muncă.Factorii dăunători și periculoși la locul de lucru
Analiza condițiilor de lucru și aprecierea factorilor dăunători se efectuiază conform cerinceșor și standartelor elaborate special de comisiile pentru Tehnica Securității care sunt ca criterii de bază pentru analiza condițiilor la locul de lucru. Analiza se efectuiază conform SRAS 12.1.05
Factorii dăunători și periculoși la locul de lucru Tab.15
6.4 Cerințele ergonomice privind locul de muncă
Ergonomica și estetica procesului de producere sunt părți componente ale culturii procesului de producere, adică complexului măsurilor de organizare a muncii îndreptate spre crearea condițiilor de lucru prielnice. La baza ridicării culturii de muncă stau cerințele organizării științifice a procesului de muncă. Cultura procesului de muncă poate fi atinsă prin organizarea corectă a procesului de muncă și a relațiilor între colaboratori, organizarea locurilor de muncă, transformarea estetică a mediului înconjurător. Pentru crearea condițiilor de muncă plăcute este necesar de a considera particularitățile psihofiziologice a omului și condițiile igienice generale.
Iluminarea rațională a încăperilor de lucru stă la baza ridicării eficacității de lucru, preîntâmpină oboseala generală și a văzului, creează condiții psihologice optimale și determină dispoziția bună. Iluminarea naturală suficientă creează simțul de legătură directă cu mediul înconjurător. Este necesar de subliniat acțiunea biologică binevenită a razelor solare. De aceea este necesar de amplasat locurile de muncă în așa mod încât ele să nimerească în zona atingerii razelor solare. În dependență de condițiile de muncă și particularitățile lucrului îndeplinit, pentru iluminarea artificială pot fi folosite instalațiile de iluminat, generale și locale, cu o anumită caracteristică de lumină. Lămpile de lumină directă au fost folosite limitate din cauza creării umbrelor abrupte. Lămpile de lumină reflectată pot fi folosite în cazuri când este necesitatea de a lumină omogenă și slabă. Lămpi de lumină semireflectată ce sunt echipate cu abajur din sticlă mată, care posedă proprietăți de a dispersa lumina se află pe masa de lucru. În calitate de instalație de iluminat general este recomandabil de folosit lămpi cu lumina dispersată. Lămpile de iluminare locală trebuie să fie mobile și la necesitate să asigure shimbarea direcției luminii. Fiecare loc de muncă, indiferent de amplasarea lui față de ferestre trebuie să aibă și instalație de lumină locală. Este recomandabil de folosit lămpi luminiscente,
Fig 15. Amplasarea instalațiilor de iluminat general față de locurile de muncă ale operatorilor
1 – ferestre; 2 – instalațiile de iluminat; 3 – locul de muncă;
spectrul luminii cărora aproape coincide cu cel al luminii naturale. Pentru a exclude reflectarea razelor directe ale luminii de pe ecranul monitorului instalațiile de iluminare se aranjează pe ambele părți de la locul de muncă, paralel cu direcția văzului operatorului, și peretele cu ferestre (fig.15).
O astfel de amplasare a instalațiilor de iluminat permite de a le conecta consecutiv în dependență de mărimea iluminatului natural și exclude iritarea ochilor de către linii alterate de lumină și umbră, care apare la amplasare lor paralelă.
Oformarea cu culori a încăperilor și înverzirea lor nu numai micșorează tensiunea nervoasă dar și permanent susține buna dispoziție a lucratorilor și inspirația creativă în lucru.
Culoarea încăperilor de lucru influențează esențial asupra iluminării, stării psihofiziologice a omului, ansamblului arhitectural al încăperii. Este cunoscut că nuanțele întunecate au proprietatea de a consuma o parte mare a luminii și prin aceasta micșorează iluminarea încăperii. Pentru oformarea cu culori a încăperilor se propune de a folosi în primul rând acele culori care reflectă cel puțin 40-50% de lumină care cade pe o suprafață. Culorile pentru oformare a încăperilor trebuie să fie alese în conformitate cu condițiile climaterice. Culorile galben-verzi și verde-albastru influențează în mod liniștitor, pe când culorile albastru deschis, albastru, violet pot influența în mod depresiv. La oformare cu culori a încăperilor trebuie de luat seamă de amplasarea ferestrelor, particularitățile arhitecturale ale încăperilor. Pentru asigurarea condițiilor de lucru optimale, oformarea cu culoare trebuie să fie alese ținând cont de culorile monitorului. În cazul paletei monocrome, peretele înaintea operatorului trebuie să fie vopsite cu culoarea verde deschisă sau bej, iar în cazul paletei colorate – culoarea bej.
Un rol important îl joacă organizarea locului de muncă, care trebuie să satisfacă cerințele comodității a efectuării lucrului și economisirii energiei și a timpului operatorului și utilizării raționale ale suprafețelor de lucru. Este necesar de stabilit zonele de atingere a mîinilor operatorului de display-ul, imprimantă și alte dispozitive periferice. Zonele date sunt stabilite pe baza datelor antropometrice ale corpului uman, permit de a amplasa corect elementele de dirijare.
Mișcările lucrătorului trebuie să fie de așa fel, ca grupurile de mușchi ale lui vor fi încărcate omogen, iar mișcările neproductive vor fi excluse.
Locurile de muncă trebuie să fie aranjate tot în conformitate cu cerințele comodității lucrului și optimizării mișcării. Locul de muncă de obicei este constituit dintr-un birou, scaun, o poliță pentru literatura profesională des folosită. Distanțele între componentele menționate trebuie să fie optimale, care nu limitează mișcările și în acelaș timp nu provoacă mișcări de prisos.
6.5. Condiționarea aerului
Parametrii necesari al microclimei în încăperile de producție se asigură prin diferite metode. Pentru menținerea normelor aflării substanțelor dăunătoare în aer la locul de lucru se iau măsuri spre izolarea izvoarelor de substanțe dăunătoare, limitarea timpului de aflare a oamenilor în încăperile cu conținutul atmosferic dăunător, folosirea tehnologiilor avansate pentru micșorarea conținutului de substanțe dăunătoare în aer.
Una din tehnicile de folosire în procesul de producție pentru eliminarea substanțelor dăunătoare din aerul zonei de lucru este ventilarea. Sistemele de ventilare asigură parametrii necesari ai microclimei în aerul de lucru. Ventilarea este divizată în două categorii în dependență de natura acestea: ventilarea naturală și ventilare artificială.
La ventilarea artificială schimbul de aer se efectuează cu ajutorul ventilatorului prin sistemele de canale cu aer. Reieșind din principiul de lucru a ventilatorului, ventilarea artificială se clasifică în următoarele categorii: de tragere, de extragere, de tragere-extragere. În sistemele de ventilare artificială aerul tras în încăperea de lucru poate fi uscat, umezit, răcit. Adică parametrii aerului tras, la ventilarea artificială pot fi schimbați.
În prezent pentru asigurarea normativelor de ventilare a aerului zonei de lucru sunt folosite dispozitive de condiționare a aerului. Cu ajutorul dispozitivului de condiționare aerul poate fi uscat, umezit, ozonat, dezozonat, răcit sau încălzit.
Conform normativelor sanitar-igienice fiecărui lucrător trebuie de asigurat de la 20 m3/oră pînă la 30 m3/oră. Raportul între volumul încăperii și numărul de persoane care lucrează în această încăpere nu trebuie să fie mai mic decît 20 m3.
În lipsa substanțelor dăunătoare în încăpere, dacă volumul de aer pentru un lucrător e mai mare de 40 m3, normativele de ventilare nu sunt reglamentate.
Deoarece sala laboratorului catedrei intră în categoria I – raportul volumului de aer din laborator și numărul de persoane care se află în laborator în timpul lucrărilor este mai mic decît 20 m3 pentru o persoană, aerul zonei laboratorului trebuie ventilat. Volumul de aer care trebuie să fie tras să fie în diapazonul de 20m3/oră pentru o persoană pînă la 30 m3/oră. Deci trebuie de ales un așa tip de dispozitiv de condiționare care ar asigura cerințele expuse mai sus.
Un așa tip de aparat poate servi dispozitivul de tip BK – 1000, care are următorii parametrii tehnici:
Volumul de aer tras – 1000 m3/oră;
Tensiunea de alimentare 220 V, 50 Hz
Schema de lucru a unui dispozitiv de condiționare tipic este arătată în desenul de mai jos:
fig.16. Schema de lucru a unui dispozitiv de condiționare
1-canalul aerului din afară;
2-canalul aerului recirculant ;
3-filtrul;
4,7 –încălzitoare de aer;
5 – injectoare;
6 – separatorul de picături;
8 –aerul condiționat;
Pentru eliminarea substanțelor dăunătoare din zona de lucru, pentru fiecare substanță se determină volumul necesar al schimbului de aer.
, m3/h
, m3/h
……………………
unde G1 , G2 ,G3 ,… – cantitatea de substanțe dăunătoare degajate în zona de lucru , mg/h ;
CCLA1, CCLA2, CCLA3, … – concentrația limită admisibilă a substanței dăunătoare ( STAS 12.1.00.- 88)
Cabs1, Cabs2, Cabs3, … – concentrația acestor substanțe în aerul absorbit ( dinafară).
6.6. Cerințele securității tehnice la începutul lucrului
Pînă la începutul propriu zis a lucrului practic în lucrătorii sunt obligați să studieze locul său de lucru: dislocația dispozitivelor aflate sub tensiune, a întreprinderilor de curent, caracteristica tehnică a utilajului, instrucțiunile de exploatare a dispozitivelor folosite la efectuarea lucrărilor de laborator. Trebuie de studiat principiul de lucru a echipamentului și metodele de operare inofensive în timpul lucrului.
6.7. Cerințele securității tehnice în timpul de lucru
Este interzisă cuplarea echipamentului la rețea fără permisiunea persoanei responsabile de lucrări; cuplarea în rețea a echipamentului care în timpul efectuării lucrării de laborator nu este folosit.
Dacă în procesul de lucru apar cazuri ieșite din comun (miros de izolație arsă, fum) utilajul se decuplează, urgent de la rețea informând despre acesta dirigintele de lucrări sau responsabilul de laborator.
6.8. Acțiuni în cazuri fatale
Dacă vre-o persoană nimerește sub tensiune, este nesesar de urgență de decuplat tensiunea, despre ce se informează dirigintele de lucrări.
Dacă persoana în cauză a rămas în conștiință trebuie să-i creăm condiții de liniște și odihnă. Apoi în caz de necesitate chemăm medicul. Dacă individul a pierdut cunoștința și nu respiră este necesar de a-i face respirație artificială, chemînd totodată salvarea. Respirația artificială se aplică pînă vine medicul sau pănă se restabilește respirația.
Pentru toate cazurile fatale se fac procese verbale conform regulamentului.
CONCLUZIE
Cercetînd lucrul efectuat, rezultă că întregul sistem “Biblioteca” s-a primit eficient, și anume reieșind din următoarele considerente :
Folosește tehnologii noi, tehnologie cu elaborări simple,
Ușor elaborează scripturile client,
Aranjarea flexibilă a dizainului anchetelor,
Tehnologia listelor dicționarelor cu citirea și redactarea oricăror tabele legate logic și nu,
Utilizarea simplă,
Viteză mare,1
Acces simplu, căutare rapidă după mai multe caractere.
La realizarea acestui program în cadrul proiectului de diplomă am studiat tehnologiile noi de programare ca:
instrumentarul de programare Internet care în timpul de față are o dezvoltare rapidă și o întrebuințare largă în lume;
studierea SQL server, care tot mai des se întâlnesc la elaborarea programelor Client-Server;
luarea cunoștințelor cu Web designul care permite de a face interfața utilizatorului mai atrăgătoare;
studierea limbajelor XML, XSL pentru vizualizarea BD în Internet.
studierea unui nou limbaj și anume C#.
folosirea protocolului ASP.NET
interacțiunea programelor C# cu serverul bazei de date SQL.
Cunoscând toate acestea în timpul de față putem spune sigur că ne vom găsi un loc de muncă pe profesia dată.
BIBLIOGRAFIE
Tom Archer, "Inside C#", Microsoft Press, 2001
Ileana Popescu, Modelarea bazelor de date, Editura Tehnică 2000.
Ben Albahari, Peter Drayton, Brad Merrill, C# Essentials, Editura O'Reilly 2001.
Балабанов И. Т. "Основы финансового менеджмента " Москва Финансы и статистика 1995
Павлов С. П., Губонина З. И. Охрана труда и приборостроение. Москва Высшая школа 1986
Ю. Тихомиров " Microsoft SQL Server 7.0" Москва 2000
http://www.citforum.ru/internet/xslt/xslt07.shtml
http://www.citforum.ru/internet/xml/part3.shtml
www.microsoft.com/xml/
http://www.w3.org/TR/WD-
http://www.w3.org/xml
http://www.citforum.ru/operating_systems/ms_ex/glava55.shtml
http://www.citforum.ru/book/description/asponexample.html
www.microsoft.com/sql/default.asp
www.epress.ro/er/online/no22/er/bdd.html
www.teora.ro/cuprins/ 0645%20cal%20comert%20electronic%20ASP.htm
www.epress.ro/er/online/no21/er/bdd.html
www.microsoft.com/Romania/DotNet/artc1.htm
students.infoiasi.ro/~microsoft/ articole/5Februarie2002.html
www.computerworld.ro/index.cfm?t=articol&idn=1941 – 21k
www.pcworld.ro/index.cfm?t=articol&idn=916 – 42k
www.microsoft.com/Romania/Instrumente/
www.prodavisro.com/prodavis/crystal/crystal.html – 8k
http://msdn.microsoft.com/subscriptions/resources/subdwnld.asp
http://msdn.microsoft.com/msdnmag/default.asp
=== ANEXA1 ===
Anexa 1
Listingul principal:
namespace AG.WJIN.WP.DictionaryList
{
using System;
using System.Data;
using System.Collections;
using System.Drawing;
using System.Web;
using System.Xml;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Collections;
using AG.PB.Kernel;
using AG.WJIN.WP.DictionaryList;
using AG.WJIN.Utils;
/// <summary>
/// Summary description .
/// </summary>
///
// – Defining delegates –
public delegate void PageChangingRequest(object sender, CommandEventArgs e);
public delegate void SimpleRequest();
public class CItemsListControl : CAbstractWebPart
{
//– Useful public varables –
public CItemsDispatcher cilcParent; // – For toggle functionality in 'Dispatcher'
public string g_strObjectIdentifier; // – Object Type for 'Custom Tables' navigation
public string g_strObjectName; // – Object Name for 'Custom Tables' navigation
//– User Rights –
public bool canUpdate;
public bool canCreate;
public bool canDelete;
// – SQLCommands declaration
protected System.Data.SqlClient.SqlConnection custSQLConnection;
protected System.Data.SqlClient.SqlDataAdapter custSQLDataAdapter;
protected System.Data.SqlClient.SqlCommand custSQLSelectCommand;
protected System.Data.SqlClient.SqlCommand custSQLCommand;
// – Custom constants ––
protected const char smbSortUp = '\u25B2';
protected const char smbSortDown = '\u25BC';
// – Custom variables ––
protected string strDebug;
public string strMainTableName;
public string idValue;
public string idField;
protected string strDataGridTableName;
protected string strConnectionString="";
protected int intView_SelectedIndex;
protected string strTblFields;
protected string strTblValues;
protected string strTblUpdate;
// – Table Field Info –-
protected string[] strTblFieldID;
protected SqlDbType[] dbtTblFieldType;
protected int[] intTblFieldDim;
protected bool[] bTblFieldIsRequired;
// – Declaration of Data pulls
protected System.Data.DataView custDataView;
protected System.Data.DataSet custDataSet ;
// – WebControls declaration
// – Paging Panel –-
protected wucPageNavigator PageNavigator;
// – ToolBar Panel –
protected wucToolBar ToolBar;
// – DictionaryNavigator
protected wucDictionaryNavigator DictionaryNavigator;
// – Form elements –-
protected System.Web.UI.WebControls.Button OKButton;
protected System.Web.UI.WebControls.Button CancelButton;
protected System.Web.UI.WebControls.Label lblFormIDtxt;
protected System.Web.UI.WebControls.Label lblFormIDval;
protected System.Web.UI.WebControls.Label lblFormHeader;
protected System.Web.UI.WebControls.Label lblFormAction;
// – Message fields –
protected System.Web.UI.WebControls.Label lblAlertMessageDetailPanel;
protected System.Web.UI.WebControls.Label lblAlertMessageListPanel;
protected System.Web.UI.WebControls.Label PageInfo;
// – Active panels –
protected System.Web.UI.WebControls.Panel DetailPanel;
protected System.Web.UI.WebControls.Panel ListPanel;
// – DataGrid –-
protected System.Web.UI.WebControls.DataGrid custDataGrid;
// – ??? ––
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.TextBox Textbox1;
public ArrayList fields
{
get
{
return (ArrayList) ViewState["fields"];
}
set
{
ViewState["fields"]=value;
}
}
public ArrayList types
{
get
{
return (ArrayList) ViewState["types"];
}
set
{
ViewState["types"]=value;
}
}
public CItemsListControl()
{
// – Connection String –-
strConnectionString = "server=NATAHA;database=Library;uid=wjinuser;pwd=wjinuser";
//strConnectionString = "server=WS3\\SHURAM;database=GUUAM;uid=guuamuser;pwd=guuamuser";
setConnString();
// – Default Data Grid Table Name –-
strDataGridTableName = "DataGridTable";
}
protected void setConnString()
{
string connPS="";
try
{
connPS = CUtil.GetPartStorage(this.wpID).SelectSingleNode("DBConnectionString").InnerText.ToString();
}
catch{}
if(connPS!="") strConnectionString=connPS;
}
public ArrayList getFields()
{
setConnString();
return this.getFields(strMainTableName);
}
protected int intDGPageSize()
{
int intPSize ;
// – DataGrid Page Size –-
try
{
intPSize = int.Parse(GetConstant("DLPageSizeID"));
}
catch{ intPSize = 0; }
if(intPSize <= 0)
{
try
{
intPSize = int.Parse(CUtil.GetPartStorage(this.wpID).SelectSingleNode("PageSize").InnerText.ToString());
}
catch{intPSize = 10;}
}
return 10;
}
public ArrayList getRelations(string tableName)
{
setConnString();
SqlCommand comm = new SqlCommand();
comm.Connection=new SqlConnection(strConnectionString);
comm.CommandType=CommandType.StoredProcedure;
comm.CommandText="sp_fkeys";
comm.Parameters.Add("@pktable_name", SqlDbType.VarChar);
comm.Parameters.Add( "@pktable_owner", SqlDbType.VarChar);
comm.Parameters.Add( "@pktable_qualifier", SqlDbType.VarChar);
comm.Parameters.Add( "@fktable_name", SqlDbType.VarChar);
comm.Parameters.Add( "@fktable_owner", SqlDbType.VarChar);
comm.Parameters.Add( "@fktable_qualifier", SqlDbType.VarChar);
comm.Parameters["@fktable_name"].Value=tableName;
comm.Connection.Open();
SqlDataAdapter reader = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
reader.Fill(ds) ;
ArrayList list = new ArrayList();
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
TableForeignKey tfk = new TableForeignKey();
tfk.PKName = ""+ds.Tables[0].Rows[i].ItemArray[3];
tfk.PKTable =""+ ds.Tables[0].Rows[i].ItemArray[2];
tfk.FKName = ""+ds.Tables[0].Rows[i].ItemArray[7];
getDBGridField(tfk);
list.Add(tfk);
}
comm.Connection.Close();
return list;
}
private void getDBGridField(TableForeignKey tfk)
{
ArrayList flds = getFields(tfk.PKTable);
ArrayList tps = getTypesOfFields(tfk.PKTable);
for(int i=0;i<flds.Count;i++)
{
if( ((string)flds[i]).EndsWith("Name") || ((string)flds[i]).EndsWith("name"))
{
tfk.FieldForDBGrid=(string)flds[i];
tfk.TypeOfFieldForDBGrid=(string) tps[i];
}
}
if(tfk.FieldForDBGrid=="")
{
tfk.FieldForDBGrid=(string)flds[1];
tfk.TypeOfFieldForDBGrid=(string) tps[1];
}
}
public ArrayList getFields(string tableName)
{
SqlCommand comm = new SqlCommand("SELECT * FROM "+tableName);
comm.Connection=new SqlConnection(strConnectionString);
comm.Connection.Open();
SqlDataAdapter reader = new SqlDataAdapter();
reader.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
reader.Fill(ds);
}
catch(Exception ex)
{
Response.Write(comm.Connection.ConnectionString);
}
ArrayList list = new ArrayList();
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
list.Add(ds.Tables[0].Columns[i].ColumnName);
}
comm.Connection.Close();
return list;
}
public ArrayList getFieldDescriptions(string tableName)
{
ArrayList fields = getFields(tableName);
SqlCommand comm = new SqlCommand("select smallid,value from sysproperties,sysobjects "+
"where sysproperties.id=sysobjects.id AND sysobjects.name='"+tableName+"'");
comm.Connection=new SqlConnection(strConnectionString);
comm.Connection.Open();
SqlDataAdapter reader = new SqlDataAdapter();
reader.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
reader.Fill(ds);
}
catch(Exception ex)
{
Response.Write("Error :"+ex.Message);
}
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
int cnt = -1;
try
{
cnt = Int32.Parse(""+ds.Tables[0].Rows[i]["smallid"]);
}
catch{}
if(cnt>0) fields[cnt-1] = ds.Tables[0].Rows[i]["value"];
}
comm.Connection.Close();
return fields;
}
public ArrayList getTypesOfFields()
{
return this.getTypesOfFields(strMainTableName);
}
public ArrayList getTypesOfFields(string tableName)
{
SqlCommand comm = new SqlCommand("SELECT * FROM "+tableName);
comm.Connection=new SqlConnection(strConnectionString);
comm.Connection.Open();
SqlDataAdapter reader = new SqlDataAdapter();
reader.SelectCommand = comm;
DataSet ds = new DataSet();
try
{
reader.Fill(ds);
}
catch(Exception ex)
{
System.Console.WriteLine(ex.StackTrace);
}
ArrayList list = new ArrayList();
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
list.Add(ds.Tables[0].Columns[i].DataType.Name);
//HttpContext.Current.Response.Write(""+i+"–-"+ds.Tables[0].Columns[i].DataType.Name+"<br/>");
}
comm.Connection.Close();
return list;
}
protected void whenNotIsPostBack()
{
BindDataGrid();
// – Init drop down list – Search By
ToolBar.listSearchBy.Items.Clear();
foreach(DataGridColumn colDataGrid in custDataGrid.Columns)
{
string[] arrSE = colDataGrid.SortExpression.Split(':');
if(!(arrSE.Length == 2 && ((arrSE[0] == "n") || (arrSE[0] == "s")|| (arrSE[0] == "d")))) continue;
ToolBar.listSearchBy.Items.Add(new ListItem(colDataGrid.HeaderText.ToString(),colDataGrid.SortExpression.ToString()));
}
}
protected void onInitializeComponent()
{
// – SQL Command Init
this.custSQLConnection = new System.Data.SqlClient.SqlConnection();
this.custSQLDataAdapter = new System.Data.SqlClient.SqlDataAdapter();
this.custSQLSelectCommand = new System.Data.SqlClient.SqlCommand();
this.custSQLCommand = new System.Data.SqlClient.SqlCommand();
// – Data Set & Data View Init –-
this.custDataSet = new System.Data.DataSet();
this.custDataView = new System.Data.DataView();
// – Standard Event handlers –
ToolBar.onShowAllItems += new SimpleRequest(this.ShowAllItems);
ToolBar.onSearchItems += new SimpleRequest(this.SearchItems);
ToolBar.onNewItem += new SimpleRequest(this.NewItem);
DictionaryNavigator.onAllDictionaries += new SimpleRequest(this.SwitchToAllDictionaries);
PageNavigator.onPageChanging += new PageChangingRequest(this.NavigationButtonClick);
this.custDataGrid.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.custDataGrid_PageIndexChanged);
this.custDataGrid.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.custDataGrid_SortRows);
this.custDataGrid.EditCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.custDataGrid_EditCommand);
this.custDataGrid.DeleteCommand += new System.Web.UI.WebControls.DataGridCommandEventHandler(this.custDataGrid_DeleteCommand);
this.CancelButton.Click += new System.EventHandler(this.CancelButton_Click);
this.OKButton.Click += new System.EventHandler(this.OKButton_Click);
// – custSQLConnection
setConnString();
this.custSQLConnection.ConnectionString = strConnectionString;
// – custSQLSelectCommand
this.custSQLSelectCommand.Connection = this.custSQLConnection;
try
{
ToolBar.btnAllItems.Text = Locale.Translate(ToolBar.btnAllItems.Text,ToolBar.btnAllItems.Text);
ToolBar.btnNewItem.Text = Locale.Translate(ToolBar.btnNewItem.Text,ToolBar.btnNewItem.Text);
ToolBar.btnSearch.Text = Locale.Translate(ToolBar.btnSearch.Text,ToolBar.btnSearch.Text);
ToolBar.lblSearchBy.Text = Locale.Translate(ToolBar.lblSearchBy.Text,ToolBar.lblSearchBy.Text);
ToolBar.lblSearchValue.Text = Locale.Translate(ToolBar.lblSearchValue.Text,ToolBar.lblSearchValue.Text);
string txt = DictionaryNavigator.lbtnAllDictionaries.Text;
DictionaryNavigator.lbtnAllDictionaries.Text = Locale.Translate(txt,txt);
PageNavigator.items = Locale.Translate(PageNavigator.items,PageNavigator.items);
PageNavigator.of = Locale.Translate(PageNavigator.of,PageNavigator.of);
}
catch{}
}
protected void SwitchToAllDictionaries()
{
cilcParent.DispatcerPanel.Visible = true;
cilcParent.PlaseHolderPanel.Visible = false;
cilcParent.phDispatcher.Controls.Clear();
}
protected void custDataGrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
// – Custom Functions –-
DeleteItem(e); // e.Item.Cells[0].Text.ToString()
// –
string KeyFieldName = custDataGrid.DataKeyField.ToString();
string KeyFieldValue = e.Item.Cells[0].Text.ToString();
this.custSQLCommand.Connection = this.custSQLConnection;
this.custSQLCommand.CommandText = "DELETE FROM " + strMainTableName + " WHERE ( " + KeyFieldName + " = " + KeyFieldValue + " )";
// – sql Command processing –-
try
{
custSQLCommand.Connection.Open();
custSQLCommand.ExecuteNonQuery();
}
catch(System.Exception se)
{
this.lblAlertMessageListPanel.Text = "The Item was not deleted due to error: " + se.Message.ToString();
}
finally
{
custSQLCommand.Connection.Close();
}
// – Init Page Attributes
if(custDataGrid.SelectedIndex + 1 == custDataGrid.Items.Count)
{
if(custDataGrid.SelectedIndex > 0) custDataGrid.SelectedIndex -= 1;
else
{
if(custDataGrid.CurrentPageIndex > 0) custDataGrid.CurrentPageIndex -= 1;
else
{
custDataGrid.CurrentPageIndex = 0;
custDataGrid.SelectedIndex = -1;
}
}
}
// – DataGrid Bind ––-
BindDataGrid();
// – Log Writing –
ActionLog.WriteEvent("dictItemDeleteID" ,strMainTableName + ", ID = " + KeyFieldValue );
}
protected void BindDataGrid()
{
// – Filling Data View –-
FillDataView();
// – DataGrid Bind ––-
custDataGrid.DataSource = custDataView;
custDataGrid.DataBind();
// – current page number –
PageNavigator.currentPage_Init(custDataGrid, custDataView.Count);
}
protected void custSortRows_Init(string strOrderField, bool bIsToggle)
{
// – Sorting Expressions –
string obd = (string)this.ViewState["ORDER_DIRECTORY"];
string obh = (string)this.ViewState["ORDER_HEADER"];
string obf = (string)this.ViewState["ORDER_FIELD"];
string smbSort = smbSortDown.ToString(); // DESC
// – If selected the same field – changing the sorting direction
if(obf == strOrderField && bIsToggle)
{
if(obd == "ASC")
{
ViewState["ORDER_DIRECTORY"] = "DESC";
obd = "DESC";
}
else
{
ViewState["ORDER_DIRECTORY"] = "ASC";
obd = "ASC";
}
}
if(obd == "ASC") smbSort = smbSortUp.ToString();
// – Text of column Header
foreach(DataGridColumn colDataGrid in custDataGrid.Columns)
{
string[] arrSE = colDataGrid.SortExpression.Split(':') ;
if(arrSE.Length < 2) continue;
// – Init column Header
if(arrSE[1] == obf) colDataGrid.HeaderText = obh;
// – Adding symbol of sorting direction
if(arrSE[1] == strOrderField)
{
ViewState["ORDER_HEADER"] = colDataGrid.HeaderText;
colDataGrid.HeaderText = colDataGrid.HeaderText + " " + smbSort;
}
}
ViewState["ORDER_FIELD"] = strOrderField;
}
protected void custDataGrid_SortRows(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
string strOrderField = e.SortExpression.Split(':')[1];
custSortRows_Init(strOrderField, true);
BindDataGrid();
}
protected void SearchItems()
{
custDataGrid.CurrentPageIndex = 0;
BindDataGrid();
}
protected void ShowAllItems()
{
ToolBar.strSearchValue = "";
custDataGrid.CurrentPageIndex = 0;
BindDataGrid();
}
protected virtual void DeleteItem(System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
}
protected virtual void EditItem()
{
}
protected virtual void NewItem()
{
}
protected virtual void OKButton_Click(object sender, System.EventArgs e)
{
}
virtual protected void modifyCustomDataSet(DataSet custDataSet)
{
}
protected void FillDataView()
{
// – Init Sorting Expressions –
string obd = (string)this.ViewState["ORDER_DIRECTORY"];
string obf = (string)this.ViewState["ORDER_FIELD"];
string obh = (string)this.ViewState["ORDER_HEADER"];
if (!(obd is string)) {this.ViewState["ORDER_DIRECTORY"] = "DESC" ; obd = "DESC"; }
if (!(obf is string)) {this.ViewState["ORDER_FIELD"] = custDataGrid.DataKeyField.ToString(); obf = custDataGrid.DataKeyField.ToString();}
if (!(obh is string)) this.ViewState["ORDER_HEADER"] = "ID";
// – Filling DataView
custSQLDataAdapter.SelectCommand = this.custSQLSelectCommand;
try
{
custSQLDataAdapter.Fill(this.custDataSet, strDataGridTableName);
modifyCustomDataSet(custDataSet);
custDataView = this.custDataSet.Tables[strDataGridTableName].DefaultView;
custDataView.Sort = obf + " " + obd;
// – Row filter –
if(ToolBar.listSearchBy.SelectedItem is object && ToolBar.strSearchValue.Length > 0)
{
string[] arrSB = ToolBar.listSearchBy.SelectedItem.Value.Split(':');
if( arrSB[0] == "n" )
{
int intRes;
try
{
intRes = int.Parse(ToolBar.strSearchValue);
custDataView.RowFilter = arrSB[1]+ " = '" + ToolBar.strSearchValue+"'" ;
}
catch
{
custDataView.RowFilter = "FALSE";
}
}
if( arrSB[0] == "d" )
{
custDataView.RowFilter ='['+ arrSB[1]+ "] = '" + ToolBar.strSearchValue+"'" ;
}
if(arrSB[0] == "s") custDataView.RowFilter = arrSB[1] + " LIKE '*" + ToolBar.strSearchValue.ToString() + "*'";
}
}
catch(System.Exception se )
{
lblAlertMessageListPanel.Text = "Error: " + se.Message.ToString();
}
}
protected override void Render(HtmlTextWriter output)
{
output.Write(strDebug);
base.Render(output);
}
protected void custDataGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
custDataGrid.CurrentPageIndex = e.NewPageIndex;
custDataGrid.SelectedIndex = 0;
intView_SelectedIndex = custDataGrid.CurrentPageIndex * custDataGrid.PageSize + custDataGrid.SelectedIndex;
BindDataGrid();
}
protected void NavigationButtonClick(object sender, CommandEventArgs e)
{
string direction = e.CommandName.ToString();
switch (direction.ToUpper())
{
case "FIRST" :
custDataGrid.CurrentPageIndex = 0;
break;
case "PREVIOUS" :
custDataGrid.CurrentPageIndex =
Math.Max(custDataGrid.CurrentPageIndex -1, 0);
break;
case "NEXT" :
custDataGrid.CurrentPageIndex =
Math.Min(custDataGrid.CurrentPageIndex + 1,
custDataGrid.PageCount – 1);
break;
case "LAST" :
custDataGrid.CurrentPageIndex = custDataGrid.PageCount – 1;
break;
default :
break;
}
BindDataGrid();
}
protected void custDataGrid_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
// – Indexes of positioning
custDataGrid.SelectedIndex = e.Item.ItemIndex;
intView_SelectedIndex = e.Item.DataSetIndex;
// – Filling data fields of the form
FillDataView();
DetailPanel.DataBind();
// – Current mode –
lblFormAction.Text = "Edit";
// – Init Form View –
ShowRequiredFields();
lblFormIDval.Visible= true; // ID value
lblFormIDtxt.Visible= true; // ID label
ListPanel.Visible = false; // Maternal Panel
DetailPanel.Visible = true; // Child Panel
setEditValues();
EditItem();
}
protected virtual void setEditValues(){;}
protected void CancelButton_Click(object sender, System.EventArgs e)
{
intView_SelectedIndex = custDataGrid.CurrentPageIndex * custDataGrid.PageSize + custDataGrid.SelectedIndex;
BindDataGrid();
ListPanel.Visible = true;
DetailPanel.Visible = false;
}
protected void ShowRequiredFields()
{
for (int i=0; i < strTblFieldID.Length ; i++)
{
try
{
Label lblReqField = (Label)DetailPanel.FindControl("r_" + strTblFieldID[i]);
lblReqField.Visible = bTblFieldIsRequired[i];
}
catch{}
}
}
protected void onNewItem_Init()
{
// – Current mode –
lblFormAction.Text = "New";
// – Init Form View –
ShowRequiredFields();
lblFormIDval.Visible= false; // ID value
lblFormIDtxt.Visible= false; // ID label
ListPanel.Visible = false; // Maternal Panel
DetailPanel.Visible = true; // Child Panel
}
protected void onSave_Init()
{
//HttpContext.Current.Response.Write("Fuuuuuuuuuukkkkkkkkkk");
strTblFields ="";
strTblValues ="";
strTblUpdate ="";
// – Create Parametric part of sql Command
// – init –
if(strTblFieldID.Length > 0)
{
//strTblFields = strTblFieldID[0] ;
//strTblValues = "@" + strTblFieldID[0] ;
// strTblUpdate = strTblFieldID[0] + " = @" + strTblFieldID[0] ;
///this.custSQLCommand.Parameters.Add(new SqlParameter("@" + strTblFieldID[0], dbtTblFieldType[0], intTblFieldDim[0], strTblFieldID[0]));
}
// – loop through fields ––
for (int i=1; i < strTblFieldID.Length ; i++)
{
//HttpContext.Current.Response.Write(i+" <br>");
strTblFields += strTblFieldID[i] ;
strTblValues += "@" + strTblFieldID[i] ;
strTblUpdate += strTblFieldID[i] + " = @" + strTblFieldID[i] ;
if(i!=strTblFieldID.Length-1)
{
strTblFields +=",";
strTblValues +=",";
strTblUpdate +=",";
}
this.custSQLCommand.Parameters.Add(new SqlParameter("@" + strTblFieldID[i], dbtTblFieldType[i], intTblFieldDim[i], strTblFieldID[i]));
}
//HttpContext.Current.Response.Write(strTblFields+" <br>");
//HttpContext.Current.Response.Write(strTblValues+" <br>");
custSQLCommand.Connection = this.custSQLConnection;
}
protected int onSave_Process()
{
int flagErr = 0;
// – Data fields validation –
try
{
/*for (int i=1; i < strTblFieldID.Length ; i++)
{
if((custSQLCommand.Parameters["@" + strTblFieldID[i]].Value.ToString() == "") && bTblFieldIsRequired[i])
{
this.lblAlertMessageDetailPanel.Text = "Enter " + ((Label)DetailPanel.FindControl("l_" + strTblFieldID[i])).Text + ", please.";
flagErr = 1;
break;
}
}*/
}
catch(System.Exception e3)
{
flagErr = 1;
this.lblAlertMessageDetailPanel.Text = "Form fields Error!" + e3.ToString();
}
if (flagErr == 0)
{
// – On Creating new Item –-
if (lblFormAction.Text == "New")
{
// – forming sql Command Text –
this.custSQLCommand.CommandText = "INSERT INTO " + strMainTableName + "(" + strTblFields + ") VALUES (" + strTblValues + ")";
// – Sorting direction –-
this.ViewState["ORDER_DIRECTORY"] = "DESC" ;
custSortRows_Init(custDataGrid.DataKeyField.ToString(),false);
custDataGrid.CurrentPageIndex = 0;
}
// – On Edit –-
if (lblFormAction.Text == "Edit")
{
string strDataKeyField = custDataGrid.DataKeyField.ToString();
string strDataKeyFieldValue = ((Label)DetailPanel.FindControl("lblFormIDval")).Text;
// – forming sql Command Text –
this.custSQLCommand.CommandText = "UPDATE " + strMainTableName + " SET " + strTblUpdate + " WHERE( " + strDataKeyField + " = " + strDataKeyFieldValue + " )";
}
// – sql Command processing –-
custSQLCommand.Connection.Open();
try
{
custSQLCommand.ExecuteNonQuery();
// – DataGrid Bind ––-
BindDataGrid();
ListPanel.Visible = true;
DetailPanel.Visible = false;
}
catch (SqlException se)
{
if (se.Number == 2627)
this.lblAlertMessageDetailPanel.Text = "ERROR: A record already exists with the same primary key";
else
this.lblAlertMessageDetailPanel.Text = se.Message + "ERROR: Could not save record, please ensure the fields are correctly filled out";
flagErr = se.Number;
}
catch(System.Exception sysE)
{
this.lblAlertMessageDetailPanel.Text = "ERROR: " + sysE.Message ;
}
finally
{
custSQLCommand.Connection.Close();
}
}
return flagErr;
}
//––––––––––
//– InitCustomDataView ––
//––––––––––
protected DataView InitCustomDataView(string strTableName)
{
// – SQLCommands declaration
SqlConnection connSQL;
SqlDataAdapter dadSQLConstant = new System.Data.SqlClient.SqlDataAdapter();
SqlCommand scmdSQL = new System.Data.SqlClient.SqlCommand();
DataView dviewResult = new System.Data.DataView();
// – Command Text –
string strCustCommandText;
strCustCommandText = "SELECT * FROM " + strTableName ;
try
{
// – Select Command –
connSQL = new System.Data.SqlClient.SqlConnection(strConnectionString);
scmdSQL.Connection = connSQL;
scmdSQL.CommandText = strCustCommandText;
dviewResult.Table = new DataTable(strTableName);
// – Data Adapter and filling DataView Table –
dadSQLConstant.SelectCommand = scmdSQL;
dadSQLConstant.Fill(dviewResult.Table);
}
catch{}
finally
{
scmdSQL.Connection.Close();
}
return dviewResult;
}
//––––––––––––
public string GetConstant(string constKey)
{
string scValue = "";
DataView dviewConstant = new System.Data.DataView();
dviewConstant = InitCachedConstantsDataView();
if((bool)Cache["bRebuildSystemConstantsTable"] == false)
{
try
{
dviewConstant.RowFilter = "scType = 1"; // scType = 1 for Single Constants
dviewConstant.Sort = "scGroup";
int Index = dviewConstant.Find(constKey);
scValue = dviewConstant[Index]["scValue"].ToString();
}
catch{}
}
return scValue;
}
public DataView GetCustomDataView(string tableKey)
{
DataView dtblDataView = new System.Data.DataView();
dtblDataView = InitCachedConstantsDataView();
if((bool)Cache["bRebuildSystemConstantsTable"] == false)
{
dtblDataView.RowFilter = "scGroup = '" + tableKey + "' AND scType = 2"; // scType = 2 for Multiple Constants
dtblDataView.Sort = "scValueID";
}
return dtblDataView;
}
protected DataView InitCachedConstantsDataView()
{
// – SQLCommands declaration
SqlConnection connSQLConstant;
SqlDataAdapter dadSQLConstant = new System.Data.SqlClient.SqlDataAdapter();
SqlCommand scmdSQLConstant = new System.Data.SqlClient.SqlCommand();
DataView dviewConstant = new System.Data.DataView();
// – Command Text –
string strCommandTextForConst;
strCommandTextForConst = "SELECT scName, scValue, scValueID, scGroup, scType FROM tblSystemConstants ORDER BY scGroup";
if (Cache["bRebuildSystemConstantsTable"] == null)
Cache["bRebuildSystemConstantsTable"] = true;
// – Rebuild System Constants Table –
if ((bool)Cache["bRebuildSystemConstantsTable"])
{
try
{
// – Select Command –
connSQLConstant = new System.Data.SqlClient.SqlConnection(strConnectionString);
scmdSQLConstant.Connection = connSQLConstant;
scmdSQLConstant.CommandText = strCommandTextForConst;
dviewConstant.Table = new DataTable("tblConstants");
// – Data Adapter and filling DataView Table –
dadSQLConstant.SelectCommand = scmdSQLConstant;
dadSQLConstant.Fill(dviewConstant.Table);
Cache["dtblSystemConstants"] = dviewConstant.Table;
Cache["bRebuildSystemConstantsTable"] = false;
}
catch{}
finally
{
scmdSQLConstant.Connection.Close();
}
}
else
{
dviewConstant.Table = (DataTable)Cache["dtblSystemConstants"];
}
return dviewConstant;
}
protected void setUserRights()
{
ToolBar.buttonNewItem.Visible = canCreate;
OKButton.Visible = canUpdate;
if(custDataGrid!=null)
custDataGrid.Columns[custDataGrid.Columns.Count – 1].Visible = canDelete;
}
//–––––––––––-
}
}
Anexa 2
Codul XML al paginii principale:
<?xml version="1.0" encoding="utf-8" ?>
<XML>
<HEAD>
<title>WebForm1</title>
<meta content="Microsoft Visual Studio 7.0" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
<LINK href="/AGP.Net/PortalStyles/PBS-H/CSS/standard.css" rel="stylesheet">
</HEAD>
<body background="file:///C:\Inetpub\wwwroot\Images\Fiesta Bkgrd.jpg">
<form name="Form1" method="post" action="WebForm1.aspx" id="Form1">
<input type="hidden" name="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" value="" />
<script language="javascript">
<!–
function __doPostBack(eventTarget, eventArgument) {
var theform = document.Form1;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// –>
</script>
<TABLE id="Table1" cellSpacing="0" cellPadding="0" width="100%" border="0">
<TR>
<TD align="right"><IMG alt="" src="file:///C:\Inetpub\wwwroot\Images\Lib.gif" align="right"></TD>
<TD align="middle" colSpan="" rowSpan=""><span id="Biblioteca" style="color:Transparent;font-size:X-Large;font-weight:bold;">Biblioteca</span></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD align="middle" colSpan="3">
<div id="Dispatcher1_DispatcerPanel" style="width:100%;">
<div id="Dispatcher1_ListPanel" style="width:100%;">
<TABLE id="Table1" width="100%" border="0">
<TR>
<TD align="right">
<TABLE id="tToolBar" cellSpacing="1" cellPadding="1" width="100%" border="0">
<TR>
<TD class="SearchHead" bgColor="activeborder" colSpan="" rowSpan=""><IMG src="/Images/head_search.gif"></TD>
<TD class="SearchSelect" noWrap>
<span id="Dispatcher1_ToolBar_lblSearchBy" style="font-weight:bold;">Search by:</span> </TD>
<TD class="SearchSelect" noWrap><select name="Dispatcher1:ToolBar:dlstSearchBy" id="Dispatcher1_ToolBar_dlstSearchBy">
<option value="s:toName"> Dictionary</option>
<option value="s:toDescription"> Description</option>
</select></TD>
<TD class="SearchSelect" noWrap>
<span id="Dispatcher1_ToolBar_lblSearchValue" style="font-weight:bold;">Value:</span> </TD>
<TD class="SearchSelect" noWrap width="100%"><input name="Dispatcher1:ToolBar:tbxSearchValue" type="text" id="Dispatcher1_ToolBar_tbxSearchValue" style="width:100%;" /></TD>
<TD class="SearchSelect" noWrap>
<input type="submit" name="Dispatcher1:ToolBar:btnSearch" value="Search" id="Dispatcher1_ToolBar_btnSearch" style="color:Black;background-color:Gainsboro;border-color:Black;border-width:1px;border-style:Solid;font-weight:bold;width:72px;" />
</TD>
<TD class="SearchSelect" noWrap>
<input type="submit" name="Dispatcher1:ToolBar:btnAllItems" value="Refresh" id="Dispatcher1_ToolBar_btnAllItems" style="background-color:Gainsboro;border-color:Black;border-width:1px;border-style:Solid;font-weight:bold;" /> </TD>
<TD class="SearchSelect" noWrap>
</TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD>
<table cellspacing="0" align="Center" rules="all" border="1" id="Dispatcher1_custDataGrid" style="width:100%;border-collapse:collapse;">
<tr style="color:Black;background-color:LightGrey;border-color:Black;border-width:1px;border-style:Solid;font-weight:bold;">
<td><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl2:_ctl4','')" style="color:Black;"> Dictionary</a></td><td><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl2:_ctl5','')" style="color:Black;"> Description</a></td>
</tr><tr style="background-color:LemonChiffon;">
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl3:_ctl0','')">Autori</a></td><td>Lista autorilor</td>
</tr><tr style="background-color:WhiteSmoke;">
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl4:_ctl0','')">Datorii</a></td><td>Lista celor datori</td>
</tr><tr>
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl5:_ctl0','')">Carti la cititori</a></td><td>Lista cartilor la cititori</td>
</tr><tr style="background-color:WhiteSmoke;">
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl6:_ctl0','')">Cititori</a></td><td>Lista cititorilor</td>
</tr><tr>
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl7:_ctl0','')">Categorii</a></td><td>Lista categoriilor</td>
</tr><tr style="background-color:WhiteSmoke;">
<td style="font-weight:bold;"><a href="javascript:__doPostBack('Dispatcher1:custDataGrid:_ctl8:_ctl0','')">Carti</a></td><td>Lista Cartilor</td>
</tr>
</table></TD>
</TR>
<TR bgColor="gainsboro">
<TD align="right">
<TABLE cellSpacing="1" cellPadding="0" border="0">
<TR>
<TD vAlign="center" noWrap align="middle">
<input type="image" name="Dispatcher1:PageNavigator:ibtnFirstPage" id="Dispatcher1_PageNavigator_ibtnFirstPage" disabled="disabled" src="/Images/first_page_un.gif" alt="First Page" align="Middle" border="0" />
</TD>
<TD vAlign="center" noWrap align="middle">
<input type="image" name="Dispatcher1:PageNavigator:ibtnPrevPage" id="Dispatcher1_PageNavigator_ibtnPrevPage" disabled="disabled" src="/Images/prev_page_un.gif" alt="Previous Page" align="Middle" border="0" />
</TD>
<TD noWrap align="middle" bgColor="#ffffff"> <B>
<span id="Dispatcher1_PageNavigator_PageInfo">Items 1 - 6 of 6</span></B>
</TD>
<TD vAlign="center" noWrap align="middle">
<input type="image" name="Dispatcher1:PageNavigator:ibtnNextPage" id="Dispatcher1_PageNavigator_ibtnNextPage" disabled="disabled" src="/Images/next_page_un.gif" alt="Next Page" align="Middle" border="0" />
</TD>
<TD vAlign="center" noWrap align="middle">
<input type="image" name="Dispatcher1:PageNavigator:ibtnLastPage" id="Dispatcher1_PageNavigator_ibtnLastPage" disabled="disabled" src="/Images/last_page_un.gif" alt="Last Page" align="Middle" border="0" /></TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD align="middle" colSpan="2">
<span id="Dispatcher1_lblAlertMessageListPanel" style="color:Red;width:100%;"></span></TD>
</TR>
</TABLE>
</div>
</div>
</TD>
</TR>
</TABLE>
</form>
</body>
</XML>
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Sistem Informational Intranet de Gestionare a Datelor Bibliotecii Colegiului (ID: 148788)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
