Proiectarea Unui Sistem de Gestionare a Bazei de Date Micului Business

Introducere.

În prezent produsele soft se implementează foarte rapid, din cauza dezvoltării enorme a tehnologiilor informaționale, acumulării cunoștințelor și bibliotecilor de date, creării rețelelor pentru comunicare și schimb de informații.

Produsele Inprise InterBase și Inprise Delphi, utilizate pentru implementarea sistemului informațional “Proiectarea unui sistem de gestionare Bazei de Date micului business” se referă la mediile de programare de tip RAD – Rapid Application Development (Construirea rapidă a aplicațiilor). Aceste produse prezintă limbaje de programare de nivel înalt, orientate pe obiect, cu componente vizuale și biblioteci de clase gata pentru utilizare. Aceste biblioteci de componente sunt destinate pentru crearea cât mai rapidă a interfețelor pentru program, fie pentru crearea interfețelor de gestiune a programului de către utilizator sau a interfețelor de comunicare a programului cu alte programe. Pe lângă asigurarea creării rapide a interfețe aceste medii de programare acordă și o colecție de componente care sunt utilizate forte des de către programatori, de exemplu diferite metode de sortare deja implementate, arbori, liste, etc.

Sistemul informațional implementat se bazează pe baza de date și pe programele scrise care interacționează cu ea. Alegerea sistemului de gestiune al bazei de date este un lucru foarte important, deoarece trebuie de ținut cont de posibilitățile diferitor SGBD, de necesitățile lor pentru lucru (sistemul tehnic) și costul lor.

Revoluția informațională care a avut loc în ultimii ani în lume, în o foarte mare măsură este datorată apariției și dezvoltării bazelor de date relaționale. Standardizarea a permis ca datele de la un SGBD să fie transferate în alt SGBD fără măcar mici dificultăți. SGBD relaționale moderne permit manipularea foarte comodă cu datele, inclusiv toate sistemele bancare sunt realizate în asemenea SGBD.

Pentru implementarea bazei de date a sistemului informațional am ales SGBD InterBase care posedă caracteristicile unui SGBD de dimensiuni medii, care optimal corespunde cerințelor impuse de către sarcina de lucru, adică să poată prelucra și păstra informații voluminoase.

1. Descrierea generală a SGBD InterBase

Sistemul de gestiune a bazei de date (SGBD) InterBase prezintă implementarea modernă a bazelor de date relaționale, bazate pe tranzacte. SGBD InterBase poate prelucra în paralel atât un volum mare de tranzacții mici cât și tranzacții cu prelucrarea de lungă durată datelor. InterBase are o tehnologie unică de delimitare a tranzacțiilor, care nu blochează comenzile de citire și înscriere, fiindcă tranzacțiile nu necesită blocarea tuplelor folosite. Și aceste tranzacții nu necesită programare adăugătoare.

Arhitectura sa SuperServer mărește performanța și optimizează resursele sistemului, în special pentru un număr mare de utilizatori, fiindcă este realizată pe prelucrare în procese paralele. Un concept de bază a arhitecturii SuperServer este colectarea centralizată a informației despre utilizatori, a statisticii despre Baza de Date și apelurile clienților. Aceasta permite păstrarea informației des utilizate în cache și îmbunătățește timpul de răspuns.

Instalarea serverului necesită doar 10 MB de memorie ceea ce ne permite să nu ne gândim la spațiu liber la instalare. Alt lucru la care nu trebuie de pierdut timpul este ajustarea parametrilor, fiindcă InterBase optimizează tranzacțiile pentru d-stă.

Să enumerăm unele din posibilitățile principale:

notificatorii de evenimente;

trighere;

proceduri stocate;

restricții de integritate a datelor.

Notificatorii de evenimente permit de a notifica pe cineva în cazul apariției unui eveniment concret, fără a apela Baza de Date în continuu. De exemplu, InterBase poate notifica un manager, prin e-mail, că în stoc se termină un produs oarecare.

Trigherele pot să asigure respectarea business regulilor pe server, astfel toate aplicațiile ce folosesc date corporative respectă aceste reguli automat. Cu atât mai mult că trigherele pot să automatizeze răspunsurile la evenimente pe server, de exemplu să ceară validarea datelor când un tuplu este schimbat.

Procedurile stocate permit mărirea vitezei de răspuns prin delegarea lucrărilor de rutină de la client la server. Totodată procedurile stocate încurajează proiectarea modulară și fac exploatarea și reutilizarea mai simplă și mai sigură prin limitarea operațiilor la cele definite în proceduri. Funcțiile definite de utilizatori extind capacitățile de calcul și posibilitățile de creare a operațiilor business dorite. InterBase are o bibliotecă de funcții standarde gata, astfel nu va trebui să începeți de la zero.

Restricțiile de integritate a datelor fac posibil menținerea relațiilor dintre tuplele păstrate în Baza de Date. InterBase asigură patru tipuri de restricții de integrității datelor:

Unique și Primary Key: asigură să nu existe două tuple cu același valori pentru o mulțime de coloane;

Integritatea referințelor în cascadă: validează relațiile părinte-copil între tabele pentru asigurarea sincronizării și modificările sau ștergerile în cascadă;

Check: condiția asociată va fi validată pentru orice tuplu al tabelului;

Domain: permite crearea tipurilor noi de date și specificării integrității la nivel de coloane. Domeniile pot fi utilizate pentru a specifica un segment de valori acceptabile sau o listă de valori valide și o valoare implicită. Aceasta înseamnă că după definirea domeniului, el poate fi utilizat în orice loc al aplicației ca o referință la un tip de date mai sofisticat.

În 1986, InterBase a elaborat primul SQL server cu suport a două tipuri de date avansate. BLOb (sunet, imagine, grafică sau informație binară) și masive multidimensionale (până la 16 dimensiuni într-un câmp). Aceasta a făcut ca InterBase să fie alegerea pentru aplicațiile științifice și multimedia cum atunci atât și acum. Azi, WWW și aplicațiile de telefonie utilizează BLOb foarte des pentru a oferi soluții multimedia. Și cu InterBase serverul este adoptat automat la utilizarea filtrelor, compresoarelor și convertoarelor de date, de exemplu să transforme o fotografie scanată într-un fișier jpeg.

Să admitem că doriți să mutați Baza de Date de pe un calculator pe o soluție Client/Server. Sau aveți nevoie să lărgiți aplicația în așa mod ca să fie utilizată de mai multe departamente. În orice caz, InterBase este o soluție ideală fiindcă el a fost proiectat în special pentru medii de Baze de Date distribuite.

InterBase poate prelucra tranzacțiile muli-server. Această posibilitate automat asigură ca modificările distribuite să fie acceptate (commited) fără vreo intervenție specială din partea aplicației. Când o tranzacție se extinde pe mai multe servere, InterBase automat apelează serverele pentru să se asigure că ele lucrează, apoi transmite instrucțiunea commit pentru a termina tranzacția. Pe lângă aceasta InterBase permite, dacă ceva sa întâmplat, de a anula tranzacția pe toate serverele implicate.

InterBase este implementat utilizând ANSI SQL-92. Această interfață standard reduce considerabil timpul de adoptare la InterBase a elaboratorilor noi. El se utilizează la implementarea procedurilor stocate, trigherelor, restricțiilor și declarațiilor de integritate a datelor.

În InterBase se poate de folosit UNICODE la păstrarea datelor. Această posibilitate permite păstrarea informațiilor în mai multe limbi în același tabel.

InterBase este disponibil pe o listă mare de platforme UNIX și Windows.

Specificațiile tehnice a SGBD InterBase

Dimensiunile Bazei de Date, utilizând fișiere multiple poate ajunge la Terabytes. Un fișier poate avea 2 GB. Celelalte restricții sunt prezentate în tabelul 3.

Restricțiile fizice a SGBD InterBase Tabelul 1.1.

Pentru sistemul informațional implementat utilizăm InterBase Server v. 5.1. pentru platforma Windows NT. Pentru lucrul minim, acest server necesită 64 Mb memorie operativă, de dorit însă să fie 128 Mb.

2. Descrierea instrucțiunilor ANSI SQL utilizate în SGDB InterBase.

2.1. CREATE DOMAIN

Creează un tip de date pentru coloane global în toată baza de date.

Sintaxa:

CREATE DOMAIN domain [AS] <datatype>

[DEFAULT { literal | NULL | USER}]

[NOT NULL] [CHECK ( <dom_search_condition>)]

[COLLATE collation];

< datatype> = {

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} [ <array_dim>]

| {DECIMAL | NUMERIC} [( precision [, scale])] [ <array_dim>]

| DATE [ <array_dim>]

| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}

[(1…32767)] [ <array_dim>] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [(1…32767)] [ <array_dim>]

| BLOB [SUB_TYPE { int | subtype_name}] [SEGMENT SIZE int]

[CHARACTER SET charname]

| BLOB [( seglen [, subtype])]

}

<array_dim> = [[x:]y [, [x:]y …]]

<dom_search_condition> = {

VALUE <operator> <val>

| VALUE [NOT] BETWEEN <val> AND <val>

| VALUE [NOT] LIKE <val> [ESCAPE <val>]

| VALUE [NOT] IN ( <val> [ , <val> …])

| VALUE IS [NOT] NULL

| VALUE [NOT] CONTAINING <val>

| VALUE [NOT] STARTING [WITH] <val>

| ( <dom_search_condition>)

| NOT <dom_search_condition>

| <dom_search_condition> OR <dom_search_condition>

| <dom_search_condition> AND <dom_search_condition>

}

< operator> = {= | < | > | <= | >= | !< | !> | <> | !=}

Note referitor la sintaxa structurii CREATE DOMAIN:

Nu este posibil de a specifica clauza COLLATE pentru coloanele de tip Blob.

Pentru declararea masivelor trebuie utilizate parantezele pătrate. De exemplu următoarea segvență creează un masiv 5×5 de elemente tip string cu lungime maximă de 6 caractere:

my_array = varchar(6)[5,5]

Utilizați : pentru definirea masivelor numerotarea la care se începe diferit de 1. Următorul exemplu creează un masiv de numere întregi care se începe la 10 și se sfârșește la 20:

my_array = integer[20:30]

În structurile SQL transmise către DSQL omiteți simbolul ; după declararea tipului, în aplicații cu SQL inclus ca exemplu C, C++ și în isql se utilizează simbolul ; ca semn de sfârșit al instrucțiunii.

Descrierea operatorilor utilizați. Tabelul 2.1.

CREATE DOMAIN creează un tip de date pentru coloanele definite cu CREATE TABLE sau ALER TABLE. Definirea tipului de date (domeniului) conține un set de caractere, care includ:

Tipul de date;

Opțional: valoarea vidă;

Opțional: interzicerea valorilor vide;

Opțional: restricții la date;

Opțional: o clauză collation.

Notă: Aveți grijă la crearea domeniilor cu restricții contradictorii, așa ca declararea domeniului NOT NULL și atribuirea valorii implicite DEFAULT NULL.

Coloanele care sunt create în baza domeniilor moștenesc toate caracteristicile domeniului. Valoarea implicită a domeniului, clauza collation, și NOT NULL pot fi rescrise când definim o coloană în baza unui domeniu. O coloană bazată pe un domeniu poate adăuga restricții suplimentare la clauza CHECK.

Exemple:

Următorul isql exemplu creează un domeniu numeric care trebuie să posede o valoare pozitivă mai mare decât 1000 cu valoarea implicită de 9999. Cuvântul cheie VALUE substituie numele coloanei care se va baza pe acest domeniu.

CREATE DOMAIN CUSTNO

AS INTEGER

DEFAULT 9999

CHECK (VALUE > 1000);

În următorul isql exemplu valorile introduse în domeniu la 4 valori specifice:

CREATE DOMAIN PRODTYPE

AS VARCHAR(12)

CHECK (VALUE IN (’software’, ’hardware’, ’other’, ’N/A’));

În următorul isql exemplu, prima instrucțiune creează un domeniu utilizând USER pentru valoarea implicită. Următoarele instrucțiuni creează un tabel care include o coloană, ENTERED_BY, creată în baza domeniului USERNAME.

CREATE DOMAIN USERNAME AS VARCHAR(20)

DEFAULT USER;

CREATE TABLE ORDERS (ORDER_DATE DATE, ENTERED_BY USERNAME, ORDER_AMT

DECIMAL(8,2));

INSERT INTO ORDERS (ORDER_DATE, ORDER_AMT)

VALUES (’1-MAY-93’, 512.36);

Instrucțiunea INSERT nu include o valoare pentru coloana ENTERED_BY, de aceia InterBase automat va introduce denumirea utilizatorului a utilizatorului curent, JSMITH:

SELECT * FROM ORDERS;

1-MAY-93 JSMITH 512.36

2.2. CREATE TABLE

Se utilizează pentisql exemplu valorile introduse în domeniu la 4 valori specifice:

CREATE DOMAIN PRODTYPE

AS VARCHAR(12)

CHECK (VALUE IN (’software’, ’hardware’, ’other’, ’N/A’));

În următorul isql exemplu, prima instrucțiune creează un domeniu utilizând USER pentru valoarea implicită. Următoarele instrucțiuni creează un tabel care include o coloană, ENTERED_BY, creată în baza domeniului USERNAME.

CREATE DOMAIN USERNAME AS VARCHAR(20)

DEFAULT USER;

CREATE TABLE ORDERS (ORDER_DATE DATE, ENTERED_BY USERNAME, ORDER_AMT

DECIMAL(8,2));

INSERT INTO ORDERS (ORDER_DATE, ORDER_AMT)

VALUES (’1-MAY-93’, 512.36);

Instrucțiunea INSERT nu include o valoare pentru coloana ENTERED_BY, de aceia InterBase automat va introduce denumirea utilizatorului a utilizatorului curent, JSMITH:

SELECT * FROM ORDERS;

1-MAY-93 JSMITH 512.36

2.2. CREATE TABLE

Se utilizează pentru a crea un tabel nou într-o bază de date existentă.

Sintaxa:

CREATE TABLE table [EXTERNAL [FILE] ’ <filespec>’]

( <col_def> [, <col_def> | <tconstraint> …]);

<col_def> = col {< datatype> | COMPUTED [BY] (< expr>) | domain}

[DEFAULT { literal | NULL | USER}]

[NOT NULL]

[ <col_constraint>]

[COLLATE collation]

< datatype> = {

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION} [ <array_dim>]

| {DECIMAL | NUMERIC} [( precision [, scale])] [ <array_dim>]

| DATE [ <array_dim>]

| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}

[( int)] [ <array_dim>] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [( int)] [ <array_dim>]

| BLOB [SUB_TYPE { int | subtype_name}] [SEGMENT SIZE int]

[CHARACTER SET charname]

| BLOB [( seglen [, subtype])]

}

<array_dim> = [[x:]y [, [x:]y …]]

< expr> = O expresie SQL care întoarce o valoare.

<col_constraint> = [CONSTRAINT constraint] <constraint_def>

<constraint_def> = {UNIQUE | PRIMARY KEY

| CHECK ( <search_condition>)

| REFERENCES other_table [( other_col [, other_col …])]}

[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

<tconstraint> = CONSTRAINT constraint <tconstraint_def>

<tconstraint_def> = {{PRIMARY KEY | UNIQUE} ( col [, col …])

| FOREIGN KEY ( col [, col …]) REFERENCES other_table

[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

[ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]

| CHECK ( <search_condition>)}

<search_condition> =

{ <val> <operator> { <val> | ( <select_one>)}

| <val> [NOT] BETWEEN <val> AND <val>

| <val> [NOT] LIKE <val> [ESCAPE <val>]

| <val> [NOT] IN ( <val> [ , <val> …] | <select_list>)

| <val> IS [NOT] NULL

| <val> {[NOT] {= | < | >} | >= | <=}

{ALL | SOME | ANY} ( <select_list>)

| EXISTS ( <select_expr>)| SINGULAR ( <select_expr>)

| <val> [NOT] CONTAINING <val>| <val> [NOT] STARTING [WITH] <val>

| ( <search_condition>)| NOT <search_condition>

| <search_condition> OR <search_condition>

| <search_condition> AND <search_condition>}

<val> = {

col [ <array_dim>] | : variable| <constant> | <expr> | <function>

| udf ([ <val> [, <val> …]])| NULL | USER | RDB$DB_KEY | ?

} [COLLATE collation]

<constant> = num | ' string' | charsetname ' string'

<function> = {

COUNT (* | [ALL] <val> | DISTINCT <val>)| SUM ([ALL] <val> | DISTINCT <val>)

| AVG ([ALL] <val> | DISTINCT <val>)| MAX ([ALL] <val> | DISTINCT <val>)

| MIN ([ALL] <val> | DISTINCT <val>)| CAST ( <val> AS <datatype>)

| UPPER ( <val>)| GEN_ID ( generator, <val>)

}

<operator> = {= | < | > | <= | >= | !< | !> | <> | !=}

<select_one> = SELECT numai la o coloană, întoarce exact o valoare.

<select_list> = SELECT numai la o coloană, întoarce zero sau mai multe valori.

<select_expr> = SELECT numai la o coloană, întoarce zero sau mai multe valori.

Descrierea operatorilor utilizați. Tabelul 2.2.

Continuarea tabelului 2.2.

CREATE TABLE implementează în o bază de date existentă un nou tabel, coloanele lui și restricțiile pentru integritate. Utilizatorul care creează tabelul este proprietarul tabelului și posedă toate privilegiile pentru el, incluzând posibilitatea de a extinde aceste privilegii și pentru alți utilizatori, trighere, proceduri ai BD utilizând clauza GRANT.

CREATE TABLE posedă următoarele opțiuni pentru definirea coloanelor:

Coloanele locale specifică numele și tipul de date pentru informația ce va fi introdusă în coloană.

Coloanele calculate (Computed by) sunt bazate pe o expresie. Valorile coloanei sunt calculate de fiecare dată când tabelul este accesat. Dacă tipul de date nu este specificat InterBase evaluează unul corespunzător. Coloanele la care există referințe în expresii trebuie să existe înainte ca coloanele să fie definite.

Coloanele în baza domeniilor moștenesc toate proprietățile domeniului, cu posibilitatea de a introduce unele modificări (vezi descriere pentru CREATE DOMAIN).

Tipurile de date CHAR, VARCHAR, sau Blob pentru coloanele textuale pot include clauza CHARACTER SET pentru specificarea unui set particular pentru o singură coloană. Dacă nu specificăm setul de caractere coloane va utiliza setul implicit de caractere. Dacă setul de caractere al bazei de date este schimbat, toate coloanele create apoi vor utiliza acest set ca setul implicit, însă coloanele deja create vor păstra setul de caractere la momentul creării.

NOT NULL este un atribut care previne introducerea valorilor vide sau necunoscute în coloană. NOT NULL afectează operațiunile INSERT și UPDATE.

Instrucțiunea DECLARE TABLE trebuie să preceadă CREATE TABLE în aplicațiile SQL incluse dacă același program creează tabelul și introduce date în el.

Opțiunea EXTERNAL FILE creează un tabel datele căruia se află într-un fișier extern, diferit de baza de date InterBase. Utilizați această opțiune pentru:

A defini un tabel InterBase compus din datele unei surse externe, așa ca datele în fișiere gestionate de către alte sisteme de operare ori de către aplicații non-SGBD.

Transferarea datelor într-un tabel existent al InterBase dintr-un fișier extern.

Restricțiile de integritate a datelor.

Se pot defini restricții de integritate la momentul creării tabelului. Aceste restricții sunt reguli pentru validarea datelor prin introducerea relațiilor coloană – tabel și tabel – tabel. Ele verifică toate tranzacțiile care accesează baza de date și sunt automat susținute de către sistem. CREATE TABLE permite crearea următoarelor restricții de integritate:

PRIMARY KEY (cheia principală) prezintă una sau mai multe coloane, conținutul cărora colectiv este garantat că va fi unic. Coloanele care aparțin la PRIMARY KEY trebuie să nu fie vide, adică să posede atributul NOTT NULL. Un tabel poate avea doar o cheie primară PRIMARY KEY.

Cheia UNIQUE (unică) asigură că într-o coloană sau un set de coloane nu vor exista 2 tuple cu valori egale. O coloană unică de asemenea trebuie să specifice atributul NOT NULL. Un tabel poate avea una sau mai multe chei unice. O cheie unică poate fi referită de către FOREIGN KEY în alt tabel.

Restricțiile de referință (REFERENCES) asigură că valorile în coloanele specificate (cunoscute ca FOREIGN KEY (cheie străină)) sunt aceleași valori în cheia pe care se fac referințe (fie PRIMARY sau UNIQUE) în alt tabel. Cheile PRIMARY sau UNIQUE trebuie să fie definite înainte ca să fie definită restricția REFERENCES la alt tabel. Opțiunile ON DELETE și ON UPDATE la REFERENSES descriu acțiunea asupra cheii străine când cheia primară este ștearsă sau modificată. Valorile posibile pentru ON DELETE și ON UPDATE sunt următoarele:

Descrierea operatorilor utilizați. Tabelul 2.3.

Este posibil de a crea referințe FOREIGN KEY pentru tabele create de către alți utilizatori, dacă ei au creat acces de tip REFERENCES la tabelele corespunzătoare. Orice utilizator care modifică cheia străină trebuie să posede privilegiile REFERENCES sau SELECT asupra cheii primare a tabelului.

Condiția CHECK asigură o verificare pentru date la introducere și modificare la tabelul specificat. Search_condition poate necesita o combinație de valori ori poate compara valoarea introdusă cu datele din alte coloane.

Specificația USER ca valoare pentru Search_condition specifică numele login al utilizatorului care încearcă să scrie în tabelul dat.

Crearea cheilor PRIMARY KEY și FOREIGN KEY necesită acces exclusiv la baza de date.

Pentru restricții care nu posedă nume, sistemul generează un nume unic pe care îl păstrează în tabelul de sistem RDB$RELATION_CONSTRAINTS.

Exemple:

Următoarea isql structură creează un tabel simplu cu o cheie primară:

CREATE TABLE COUNTRY

(

COUNTRY COUNTRYNAME NOT NULL PRIMARY KEY,

CURRENCY VARCHAR(10) NOT NULL

);

Următorul set de instrucțiuni creează restricții UNIQUE la nivel de coloană și la nivel de tabel.

CREATE TABLE STOCK

(MODEL SMALLINT NOT NULL UNIQUE,

MODELNAME CHAR(10) NOT NULL,

ITEMID INTEGER NOT NULL,

CONSTRAINT MOD_UNIQUE UNIQUE (MODELNAME, ITEMID));

Următorul exemplu în isql reflectă instrucțiunile PRIMARY KEY, FOREIGN KEY de nivel de tabel și restricția CHECK. Restricția PRIMARY KEY se bazează pe trei coloane, de asemenea acest exemplu ilustrează crearea unui masiv de VARCHAR (string de lungime variabilă).

CREATE TABLE JOB

(

JOB_CODE JOBCODE NOT NULL,

JOB_GRADE JOBGRADE NOT NULL,

JOB_COUNTRY COUNTRYNAME NOT NULL,

JOB_TITLE VARCHAR(25) NOT NULL,

MIN_SALARY SALARY NOT NULL,

MAX_SALARY SALARY NOT NULL,

JOB_REQUIREMENT BLOB(400,1),

LANGUAGE_REQ VARCHAR(15) [5],

PRIMARY KEY (JOB_CODE, JOB_GRADE, JOB_COUNTRY),

FOREIGN KEY (JOB_COUNTRY) REFERENCES COUNTRY (COUNTRY),

CHECK (MIN_SALARY < MAX_SALARY)

);

În următorul exemplu coloana F2 este o cheie străină care posedă referință la cheia primară P1 a tabelului T1. Când se modifică un tuplu în T1 schimbările automat se propagă la toate tuplele afectate în T2. Dacă un tuplu în T1 este șters, toate tuplele afectate în F2 a tabelei T2 vor fi setate la NULL.

CREATE TABLE T1 (P1 INTEGER NOT NULL PRIMARY KEY);

CREATE TABLE T2 (F2 INTEGER FOREIGN KEY REFERENCES T1.P1

ON UPDATE CASCADE

ON DELETE SET NULL);

Următorul exemplu prezintă un tabel în care valoarea unei coloane este calculată:

CREATE TABLE SALARY_HISTORY

( EMP_NO EMPNO NOT NULL,

CHANGE_DATE DATE DEFAULT ’NOW’ NOT NULL,

UPDATER_ID VARCHAR(20) NOT NULL,

OLD_SALARY SALARY NOT NULL,

PERCENT_CHANGE DOUBLE PRECISION

DEFAULT 0

NOT NULL

CHECK (PERCENT_CHANGE BETWEEN -50 AND 50),

NEW_SALARY COMPUTED BY

(OLD_SALARY + OLD_SALARY * PERCENT_CHANGE / 100),

PRIMARY KEY (EMP_NO, CHANGE_DATE, UPDATER_ID),

FOREIGN KEY (EMP_NO) REFERENCES EMPLOYEE (EMP_NO)

);

În următorul isql exemplu prima coloană menține ordinea collate implicită pentru setul de caractere implicit al bazei de date. A doua coloană posedă a ordine diferită collate și a treia coloană include un alt set de caractere și o alt ordine collate:

CREATE TABLE BOOKADVANCE (BOOKNO CHAR(6),

TITLE CHAR(50) COLLATE ISO8859_1,

EUROPUB CHAR(50) CHARACTER SET ISO8859_1 COLLATE FR_FR);

2.3. CREATE TRIGGER

Această instrucțiunea creează un trigher, incluzând definirea mecanismului de activare, și a acțiunilor efectuate de către el. Disponibil în DSQL și isql.

Sintaxa:

CREATE TRIGGER name FOR table

[ACTIVE | INACTIVE]

{BEFORE | AFTER}

{DELETE | INSERT | UPDATE}

[POSITION number]

AS <trigger_body> terminator

<trigger_body> = [ <variable_declaration_list>] < block>

<variable_declaration_list> =

DECLARE VARIABLE variable <datatype>;

[DECLARE VARIABLE variable <datatype>; …]

< block> =

BEGIN

<compound_statement>

[ <compound_statement> …]

END

<compound_statement> = { <block> | statement;}

<datatype> = {

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION}

| {DECIMAL | NUMERIC} [( precision [, scale])]

| DATE | {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}

[( int)] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [( int)]}

Descrierea operatorilor utilizați. Tabelul 2.4.

CREATE TRIGGER definește un trigher nou pentru baza de date. Trigher se numește un program asociat cu o tabelă sau view care se execută automat când un tuplu în tabel sau view este modificat, șters sau introdus.

Un trigher nu se apelează niciodată direct. Când a aplicație sau utilizatorul încearcă se efectueze una din operațiile INSERT, UPDATE, sau DELETE asupra unui tuplu din tabel, trigherele asociate cu acest tabel și cu această operație sunt executate imediat. Trigherele definite pentru UPDATE în view fără posibilități de modificare se execută chiar când nu se execută modificări.

Trigherele sunt compuse din cap (header) și corp (body).

Capul trigherului conține:

Numele trigherului, unic în baza de date, care distinge acest trigher de la alte trighere.

Numele tabelului, care identifică tabelul cu care va fi asociat acest trigher.

Instrucțiunile care determină când trigherul va fi activat.

Corpul trigherului conține:

O listă opțională de variabile locale și tipul lor de date.

Un bloc de instrucțiuni implementate in limbajul de proceduri și trighere al InterBase, cuprinse de către BEGIN și END. Aceste instrucțiuni vor fi executate la activarea trigherului. Un bloc de instrucțiuni poate la rândul lui include alte blocuri, asigurând în așa mod mai multe nivele logice pentru programare (nesting).

Deoarece fiecare instrucțiune din corpul trigherului trebuie să se sfârșească ci simbolul ; trebuie de a defini un alt simbol pentru a specifica sfârșitul corpului trigherului. În isql, includeți instrucțiunea SET TERM înainte CREATE TRIGGER pentru a specifica un terminator altul decât ;. După corpul trigherului, includeți alt SET TERM pentru a schimba terminatorul înapoi la simbolul ;.

Trigherul este asociat cu un tabel. Proprietarul tabelului și utilizatorii la care li sau acordat privilegii referitor la tabel automat primesc drepturile de a acționa trigherele asociate.

Trigherilor li se pot acorda privilegii asupra tabelelor la fel ca și la alte proceduri. Utilizați instrucțiunea GRAND, dar în loc de a utiliză TO username folosiți, TO TRIGGER trigger_name. Privilegiile trigherilor pot fi extrase similar utilizând instrucțiunea REVOKE.

Când utilizatorul efectuează acțiunea care lansează trigherul spre executare, trigherul va avea privilegiile în caz când măcar una din următoarele condiții este adevărată:

Trigherul are privilegiile pentru acționare;

Utilizatorul are privilegiile pentru a acționa.

Limbajul pentru proceduri și trighere al InterBase este un limbaj de programare complet pentru proceduri (stored procedures) și trighere (trigger). El include:

SQL instrucțiuni de manipulare cu datele (SQL DML) : INSERT, UPDATE, DELETE și instrucțiunea SELECT.

SQL operatorii și expresiile, incluzând UDF legate cu executarea aplicațiilor și generatorilor.

Extensii puternice pentru SQL, incluzând instrucțiuni de atribuire, de control a fluxelor, variabile de context, instrucțiuni de generare a evenimentelor, excepții și structuri de prelucrare a erorilor. Următorul tabel sumează extensiile limbajului pentru trighere.

Descrierea operatorilor utilizați. Tabelul 2.5.

Continuarea tabelului 2.5.

Exemple:

Următorul trigher, SAVE_SALARY_CHANGE, face modificări corespunzătoare la tabelul SALARY_HISTORY când este efectuată modificarea salariului lucrătorului în tabelul lucrătorilor EMPLOYEE:

SET TERM !! ;

CREATE TRIGGER SAVE_SALARY_CHANGE FOR EMPLOYEE

AFTER UPDATE AS

BEGIN

IF (OLD.SALARY <> NEW.SALARY) THEN

INSERT INTO SALARY_HISTORY

(EMP_NO, CHANGE_DATE, UPDATER_ID, OLD_SALARY, PERCENT_CHANGE)

VALUES (OLD.EMP_NO, ’now’, USER,OLD.SALARY,

(NEW.SALARY – OLD.SALARY) * 100 / OLD.SALARY);

END !!

SET TERM ; !!

Următorul trigher, SET_CUST_NO, utilizează un generator pentru a crea numere unice pentru clienți când un nou client este introdus în tabela pentru clienți CUSTOMER:

SET TERM !! ;

CREATE TRIGGER SET_CUST_NO FOR CUSTOMER

BEFORE INSERT AS

BEGIN

NEW.CUST_NO = GEN_ID(CUST_NO_GEN, 1);

END !!

SET TERM ; !!

Următorul trigher, POST_NEW_ORDER, generează un eveniment “new_order” de fiecare dată când un nou tuplu este introdus în tabelul SALES:

SET TERM !! ;

CREATE TRIGGER POST_NEW_ORDER FOR SALES

AFTER INSERT AS

BEGIN

POST_EVENT ’new_order’;

END !!

SET TERM ; !!

Următoarele patru fragmente demonstrează de cap de trighere demonstrează cum opțiunea POSITION determină ordinea de lansare a trigherilor.

CREATE TRIGGER A FOR accounts

BEFORE UPDATE

POSITION 5 … /* Corpul trigherului urmează */

CREATE TRIGGER B FOR accounts

BEFORE UPDATE

POSITION 0 … /* Corpul trigherului urmează */

CREATE TRIGGER C FOR accounts

AFTER UPDATE

POSITION 5 … /* Corpul trigherului urmează */

CREATE TRIGGER D FOR accounts

AFTER UPDATE

POSITION 3 … /*Corpul trigherului urmează*/

Când această modificare are loc:

UPDATE accounts SET account_status = 'on_hold'

WHERE account_balance <0;

Ordinea de lansare a trigherilor este:

Trigherul B este lansat.

Trigherul A este lansat.

Este efectuată operația de UPDATE.

Trigherul D este lansat.

Trigherul C este lansat.

2.7. CREATE INDEX

Creează un index în una sau mai multe coloane a bazei de date. Disponibil în SQL, DSQL și isql.

Sintaxa:

CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]

INDEX index ON table ( col [, col …]);

Descrierea operatorilor utilizați. Tabelul 2.9.

Se implementează un index în una sau mai multe coloane a tabelului. Utilizați CREATE INDEX pentru a mări viteza de acces la date. Utilizând un index pentru coloane care apar în WHERE clauze poate îmbunătăți performanțele căutării.

Nu este posibil crearea indexurilor pentru coloanele de tip Blob sau masive.

Un index UNIQUE nu poate fi creat în o coloană, sau un set de coloane dacă ele deja conțin valori duble, ori valori vide (NULL).

ASC și DESC specifică ordinea în care sunt sortate indexurile. Pentru răspunsuri mai rapide în cereri care necesită valori sortate, creați ordinea în indexuri ca ele să coincidă cu cererea ORDER BY. Pot fi create două indexuri cu ASC și DESC pe aceleași coloane pentru a accesa datele în diferite cereri cu diferite sortări.

Pentru a îmbunătăți performanțele indexurilor, utilizați SET STATISTICS pentru a recalcula selectivitatea indexurilor, ori reconstruiți indexul prin deactivarea lui și apoi activarea lui, utilizând instrucțiunea ALTER INDEX [1].

Exemple

Următoarea isql instrucțiune creează un index unic:

CREATE UNIQUE INDEX PRODTYPEX ON PROJECT (PRODUCT, PROJ_NAME);

Următoarea isql instrucțiune creează un index descrescător:

CREATE DESCENDING INDEX CHANGEX ON SALARY_HISTORY (CHANGE_DATE);

Următoarea isql instrucțiune creează un index bazat pe două coloane:

CREATE INDEX NAMEX ON EMPLOYEE (LAST_NAME, FIRST_NAME);

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

Clauza TRANSACTION poate fi utilizată în SQL aplicații cu tranzacte multiple pentru specificarea care tranzact dirijează operația de INSERT. Clauza TRANSACTION nu este disponibilă în DSQL sau isql.

Sintaxa:

INSERT [TRANSACTION transaction] INTO <object> [( col [, col …])

{VALUES ( <val> [, <val> …]) | <select_expr>};

unde:

<object> = tablename | viewname

<val> = {

: variable | <constant> | <expr>

| <function> | udf ([ <val> [, <val> …]])| NULL | USER | RDB$DB_KEY | ?

} [COLLATE collation]

<constant> = num | ' string' | charsetname ' string'

<expr> = O SQL expresie care întoarce o valoare validă pentru insertare.

<function> = {

CAST ( <val> AS <datatype>)| UPPER ( <val>)| GEN_ID ( generator, <val>)

}

<select_expr> = O structură SELECT care întoarce 0 sau mai multe tuple și unde numărul de coloane în fiecare tuplu este egal cu numărul de obiecte care trebuie să fie introduse.

Exemple.

Următoarea segvență de SQL inclus într-o aplicație adaugă un tuplu la un tabel, atribuind valori de la variabile la două coloane:

EXEC SQL

INSERT INTO EMPLOYEE_PROJECT (EMP_NO, PROJ_ID) VALUES (:emp_no ,

:proj_id );

următoarea structură în isql specifică valorile de insertare într-un tabel prin clauza select:

INSERT INTO PROJECTS

SELECT * FROM NEW_PROJECTS

WHERE NEW_PROJECTS.START_DATE > ’6-JUN-1994’;

2.10. UPDATE

Modifică parțial sau în întregime tuplul existent de date dintr-un tabel sau view. Disponibil în SQL, DSQL și isql.

Sintaxa:

în SQL:

UPDATE [TRANSACTION transaction] { table | view}

SET col = < val> [, col = <val> …]

[WHERE <search_condition> | WHERE CURRENT OF cursor];

în DSQL și isql:

UPDATE { table | view}

SET col = < val> [, col = <val> …]

[WHERE <search_condition>

<val> = {

col [ <array_dim>] | : variable| <constant> | <expr> | <function>

| udf ([ <val> [, <val> …]])| NULL | USER | ?}

[COLLATE collation]

<array_dim> = [[x:]y [, [x:]y …]]

<constant> = num | ' string' | charsetname ' string'

<expr> = O expresie SQL corectă care întoarce o valoare.

<function> = {

CAST ( <val> AS <datatype>)| UPPER ( <val>)| GEN_ID ( generator, <val>)}

<search_condition> = Vezi CREATE TABLE pentru o descriere detailată.

Descrierea operatorilor utilizați. Tabelul 2.10.

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.

Clauza WHERE este utilizată pentru a restrânge tuplele din tabelă la un subset care va fi modificat. Fără clauza WHERE vor fi modificate toate tuplele din tabel.

Exemple:

Următoarea isql structură modifică toate tuplele din tabel:

UPDATE CITIES

SET POPULATION = POPULATION * 1.03;

Următorul exemplu de SQL inclus folosește o clauză WHERE pentru a reduce modificare tuplelor la un subset:

EXEC SQL

UPDATE PROJECT

SET PROJ_DESC = :blob_id

WHERE PROJ_ID = :proj_id;

2.11. DELETE

Modifică parțial sau în întregime tuplul existent de date dintr-un tabel sau view. Disponibil în SQL, DSQL și isql.

Sintaxa în DSQL și SQL:

DELETE [TRANSACTION transaction] FROM table

{[WHERE <search_condition>] | WHERE CURRENT OF cursor};

pentru isql utilizăm:

DELETE FROM TABLE [WHERE <search_condition>];

Descrierea operatorilor utilizați. Tabelul 2.12.

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.

Clauza TRANSACTION specifică tranzacția care dirijează cu operația DELETE și este utilizată pentru aplicațiile cu mai multe SLQ tranzacții. Clauza TRANSACTION nu este disponibilă în DSQL și isql.

Clauza WHERE este utilizată pentru a restrânge tuplele din tabelă la un subset care va fi șters. Fără această clauză vor fi șterse toate tuplele din tabel.

Exemple:

Următoarea isql structură șterge toate tuplele din tabel:

DELETE FROM EMPLOYEE_PROJECT;

Următorul exemplu de SQL inclus folosește un cursor și clauza WHERE CURRENT OF pentru a șterge tuple din tabelul CITIES cu o populație mai mică de variabila gazdă min_pop. Este declarat și deschis un cursor care găsește orașele ce corespund condiției, atribuie tuplele la cursor și apoi șterg tuplul curent indicat de către cursor.

EXEC SQL

DECLARE SMALL_CITIES CURSOR FOR

SELECT CITY, STATE

FROM CITIES

WHERE POPULATION < :min_pop;

EXEC SQL

OPEN SMALL_CITIES;

EXEC SQL

FETCH SMALL_CITIES INTO :cityname, :statecode;

WHILE (!SQLCODE)

{

EXEC SQL

DELETE FROM CITIES

WHERE CURRENT OF SMALL_CITIES;

EXEC SQL

FETCH SMALL_CITIES INTO :cityname, :statecode;

}

EXEC SQL

CLOSE SMALL_CITIES;

2.12. COMMIT

Face ca modificările efectuare de către tranzacții în baza de date să fie permanente, și încheie tranzacția. Disponibil în SQL, DSQL și isql.

Sintaxa:

COMMIT [WORK] [TRANSACTION name] [RELEASE] [RETAIN [SNAPSHOT]];

Descrierea operatorilor utilizați. Tabelul 2.13.

COMMIT este utilizat pentru a încheia tranzacția și:

A înscrie toate modificările în baza de date;

A efectua modificările tranzacției vizibile la următoarele SNAPSHOT tranzacții ori pentru a citi tranzacțiile înscrise (READ COMMITED).

A închide cursoarele deschise, nu în cazul dacă folosim argumentul RETAIN.

Un tranzact care s-a încheiat cu COMMIT se consideră încheiat cu succes. Întotdeauna trebuie de utilizat COMMIT sau ROLLBACK pentru a încheia tranzactele implicite.

După utilizarea tranzactelor numai pentru citire utilizați COMMIT în loc de ROLLBACK. Efectul este același, dar performanțele tranzacțiilor ce urmează sunt mai ridicate și resursele de sistem utilizate de ele sunt reduse.

Argumentul RELEASE este prezent numai pentru compatibilitate cu versiunile precedent ala InterBase. Pentru a efectua deconectarea de la baza de date utilizați DISCONNECT.

Exemple:

Următorul exemplu în isql face permanente toate modificările la baza de date efectuate de către tranzacția implicită.

COMMIT;

Următoarele SQL instrucțiuni incluse confirmă modificările unui tranzact numit:

EXEC SQL

COMMIT TR1;

Următorul exemplu de SQL instrucțiuni incluse utilizează COMMIT RETAIN pentru a păstra modificările, însă menținând contextul tranzactului curent.

EXEC SQL

COMMIT RETAIN;

2.13. ROLLBACK

Restabilește baza de date la starea precedentă începutului tranzacției. Disponibil în SQL, DSQL, și isql.

Sintaxa:

ROLLBACK [TRANSACTION name] [WORK] [RELEASE];

Descrierea operatorilor utilizați. Tabelul 2.14.

ROLLBACK “întoarce” modificările efectuate în baza de date de către tranzactul curent, apoi încheie tranzactul. Rupe legătura programului cu baza de date și eliberează resursele de sistem. Utilizați RELEASE în ultimul ROLLBACK pentru a închide toate bazele de date deschise. Așteptați până când programul nu mai are nevoie de baza de date pentru a elibera resursele de sistem.

Clauza TRANSACTION este utilizată pentru a specifica tranzactul “întors” într-o aplicație cu mai multe tranzacte deschise. Dacă este omis, tranzactul implicit este “întors”. Clauza TRANSACTION nu este disponibilă în DSQL.

Exemplu:

Următorul isql exemplu “întoarce” tranzactul implicit:

ROLLBACK;

2.14. SELECT

Pentru vizionarea informației din baze de date relaționale care susțin limbajul SQL trebuie de utilizat instrucțiunea SELECT. SELECT are o sintaxă foarte complicată, ceea ce ne dă, în schimb, posibilități enorme de obținere a datelor din tabele. 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ă.

Ca exemplu, să culegem următoarea instrucțiune SQL:

SELECT DEPARTMENT, DEPT_NO, FULL_NAME, EMP_NO

FROM DEPARTMENT, EMPLOYEE

WHERE DEPARTMENT = "Engineering" AND MNGR_NO = EMP_NO;

Această instrucțiune întoarce câmpurile specificate pentru salariatul care este managerul departamentului Engineering. Deseori numele câmpului se întâlnește în mai multe tabele din cadrul aceleiași cereri (query). În acest caz câmpurile trebuie să fie diferențiate, precedând fiecare nume a câmpului cu numele tabelului și punct (.).

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 LAST_NAME, FIRST_NAME, PHONE_EXT

FROM EMPLOYEE

WHERE LAST_NAME = "Green";

întoarce numai înscrierile pentru care LAST_NAME este “Green”.

WHERE condition;

În această clauză:

condition = column operator value [log_operator condition]

value = value arith_operator value

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:

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

Condițiile de căutare pot folosi următoarele tipuri de valori:

Tipurile de valori Descrierea

Valori literale Numere și șiruri de caractere a căror valoare dorim să testăm (de exemplu, numărul 1138 sau the string-ul "Smith").

Valori derivate Funcții și expresii aritmetice, de exemplu: SALARY * 2 sau LAST_NAME || FIRST_NAME.

Subcereri O instrucțiune SELECT care întoarce una sau mai multe valori. Valorile întoarse se folosesc la testarea condiției de căutare.

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.

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.

De exemplu:

SELECT LAST_NAME, FIRST_NAME, EMP_NO FROM EMPLOYEE

WHERE LAST_NAME LIKE "%an";

Ca rezultat vom obține:

LAST_NAME FIRST_NAME EMP_NO

Ramanathan Ashok 45

Steadman Walter 46

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ă. De exemplu:

SELECT DEPT_NO, LAST_NAME, FIRST_NAME, HIRE_DATE

FROM EMPLOYEE

WHERE DEPT_NO = 623 AND HIRE_DATE > "01-Jan-1992";

Această cerere întoarce informație despre salariații departamentului 623 care au fost angajați la lucru după 1 Ianuarie 1992.

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

Ca exemplu de utilizare a operatorului OR vom folosi cererea de mai jos:

SELECT CUSTOMER, COUNTRY

FROM CUSTOMER

WHERE COUNTRY = "USA" OR COUNTRY = "Canada";

Această cerere întoarce înscrierile ce se referă la cumpărătorii din USA și Canada.

Când introducem condiții de căutare compuse, trebuie să ținem cont de ordinea de evaluare a condițiilor. Să presupunem că dorim să obținem salariații din departamentul 623 sau 600 care au fost angajați la serviciu mai târziu de 1 Ianuarie 1992.

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.

Tabelul de mai jos prezintă funcțiile agregate valabile în InterBase:

Funcția Ce face această funcție

AVG(value) Întoarce valoarea medie pentru un grup de înscrieri.

COUNT(value) Calculează numărul înscrierilor care satisfac clauzei WHERE.

MIN(value) Întoarce valoarea minimă dintr-un grup de înscrieri.

MAX(value) Întoarce valoarea maximă dintr-un grup de înscrieri.

SUM(value) Adună valorile numerice într-un grup de înscrieri.

De exemplu, să presupunem că dorim să știm câte coduri de lucru diferite există în tabelul JOB.

Vom introduce următoarea instrucțiune

SELECT COUNT(JOB_CODE) FROM JOB;

Rezultatul este:

COUNT

31

Însă, acesta nu este rezultatul dorit, deoarece cererea include coduri de lucru dublate în cadrul contorului. Pentru a calcula numai coduri de lucru unice, vom folosi cuvântul cheie DISTINCT:

SELECT COUNT(DISTINCT JOB_CODE) FROM JOB;

Rezultatul corect va fi:

COUNT

14

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.

Ca exemplu vom introduce o cerere care va afișa numai departamentele principale a căror bugete totale sînt mai mari de 2,000,000:

SELECT HEAD_DEPT, SUM(BUDGET)

FROM DEPARTMENT

GROUP BY HEAD_DEPT

HAVING SUM(BUDGET) > 2000000;

Această cerere va genera următorul rezultat:

HEAD_DEPT SUM

000 3500000.00

100 3800000.00

600 2350000.00

Clauza ORDER BY

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.

De exemplu, vom culege instrucțiunea:

SELECT LAST_NAME, FIRST_NAME, PHONE_EXT

FROM EMPLOYEE

ORDER BY LAST_NAME;

Această cerere sortează rezultatul după numele de familie a salariaților.

Joncțiunea tabelelor

JOIN permite instrucțiunii SELECT să primească date din două sau mai multe tabele din baza de date. Tabelele sînt listate în clauza FROM. Clauza opțională ON poate reduce numărul de înscrieri întoarse, iar clauza WHERE va reduce ulterior numărul de înscrieri întoarse.

Din informația din SELECT care descrie joncțiunea, InterBase creează un tabel care conține rezultatele operației de joncțiune, tabelul rezultat, numit deseori tabel dinamic sau virtual.

InterBase suportă două tipuri de bază de joncțiune: joncțiune internă și joncțiune externă.

Joncțiunile interne leagă înscrierile din tabele bazându-se pe condiții de joncțiune specificate și întorc numai acele înscrieri care satisfac condiției de joncțiune. Dacă câmpul care va fi joncționat conține valoarea NULL pentru înscrierea dată, această înscriere nu va fi inclusă în tabelul rezultat. Joncțiunele interne sunt mai larg utilizate deoarece ele restricționează datele întoarse și prezintă relația clară dintre două sau mai multe tabele.

Joncțiunile externe leagă înscrierile din tabele bazându-se pe condiții de joncțiune specificate dar întoarce înscrieri indiferent dacă acestea satisfac condițiilor de joncțiune sau nu.

Joncțiunea internă

Există trei tipuri de joncțiuni interne:

Joncțiunea de egalitate (equi-joins) – leagă înscrierile bazându-se pe valoarea comună sau egalitatea relațională în câmpurile de legătură.

Joncțiunea care leagă înscrierile bazându-se pe compararea diferită de egalitate în câmpurile de legătură. Nu există o denumire oficial recunoscută pentru astfel de joncțiuni, dar pentru simplicitate ele pot fi numite joncțiuni comparative (comparative joins) sau (non-equi-joins).

Joncțiuni reflexive (reflexive sau self-joins), compară valorile in cadrul câmpului a unui singur tabel.

Pentru a specifica instrucțiunea SELECT ca o joncțiune internă, trebuie să listăm tabelele care vor fi joncționate în clauza FROM, și să listăm câmpurile care vor fi comparate în clauza WHERE. Sintaxa simplificată este:

SELECT <columns>

FROM <left_table> [INNER] JOIN <right_table>

[ON <searchcondition>]

[WHERE <searchcondition>];

Condiția de căutare bazată pe câmpul din tabelul din dreapta poate fi specificată în clauza opțională ON urmând referința tabelului din dreapta.

De exemplu, să considerăm următoarea cerere acre include joncțiune internă:

SELECT D.DEPARTMENT, D.MNGR_NO, E.SALARY

FROM DEPARTMENT D JOIN EMPLOYEE E

ON D.MNGR_NO = E.EMP_NO

AND E.SALARY*2 > (SELECT SUM(S.SALARY) FROM EMPLOYEE S

WHERE D.DEPT_NO = S.DEPT_NO)

ORDER BY D.DEPARTMENT;

Clauza SELECT de mai sus folosește nume corelaționale D pentru DEPARTMENT și E pentru EMPLOYEE (cum este specificat în clauza FROM) pentru a selecta numele departamentului și numărul managerului din tabelul DEPARTMENT și salariul managerului din tabelul EMPLOYEE.

Clauza ON conține o condiție de joncțiune compusă:

Câmpul MNGR_NO din tabelul DEPARTMENT trebuie să coincidă cu câmpul EMP_NO din EMPLOYEE.

Salariul managerului dublat (E.SALARY*2) trebuie să fie mai mare decât suma tuturor salariaților din departament. Cu alte cuvinte, salariul managerului trebuie să fie mai mare decât jumătate din suma salariilor tuturor salariaților din departament.

Joncțiunea externă

Joncțiunea externă produce tabelul rezultat care conține câmpuri din orice înscriere dintr-un tabel și un subset de înscrieri din alt tabel. Sintaxa joncțiunii externe este foarte asemănătoare cu cea a joncțiunii interne:

SELECT col [, col …] | *

FROM <left_table> {LEFT | RIGHT | FULL} [OUTER] JOIN

<right_table> [ON <searchcondition>]

[WHERE <searchcondition>];

Însă, în cazul joncțiunii externe este necesar de a specifica tipul joncțiunii. Există trei posibilități:

Joncțiunea externă de stânga obține toate înscrierile din tabelul din stânga a joncțiunii, și fiecare înscriere din tabelul din dreapta care satisfac condiției de căutare specificate în clauza ON.

Joncțiunea externă de dreapta obține toate înscrierile din tabelul din dreapta a joncțiunii, și fiecare înscriere din tabelul din stânga care satisfac condiției de căutare specificate în clauza ON.

Joncțiunea externă totală obține toate câmpurile din ambele tabele din joncțiune neluând în considerație condiția de căutare specificată în clauza ON

Joncțiunea externă este utilă în așa cazuri când dorim, de exemplu, când afișăm salariații care sînt încadrați în proiect, poate fi interesant de a vedea salariații ce nu sînt încadrați în acest proiect.

Joncțiunea externă de mai jos întoarce numele salariaților din tabelul EMPLOYEE și ID-urile proiectelor din tabelul EMPLOYEE_PROJECT, pentru salariații ce sînt încadrați în proiect.

SELECT PROJ_ID, FULL_NAME

FROM EMPLOYEE LEFT OUTER JOIN EMPLOYEE_PROJECT

ON EMPLOYEE.EMP_NO = EMPLOYEE_PROJECT.EMP_NO;

În exemplul de mai sus sunt specificați toți salariații din tabelul EMPLOYEE, cu excepția celor care sînt incluși în proiect, deoarece EMPLOYEE este tabelul din stânga joncțiunii.

3. Structura mecanismelor și surselor de protecție a BD de la acces neautorizat.

3.1. Baze de date

3.1.1 Terminologia

Baze de date sunt numite acumulatoarele electronice de informație, accesul la care este efectuat prin intermediul a unuia sau câtorva calculatoare.

Sistemele de conducere cu BD (SCBD) – sunt mijloace program, destinate pentru crearea, adăugarea, înnoirea și ștergerea BD. Se deosebesc trei tipuri de bază:

1. industriale cu destinație universală;

2. industriale cu destinație specială;

3. elaborate pentru client concret.

SCBD specializate se creează pentru conducerea cu BD cu destinație concreta: de contabilitate, de depozit, bancare etc. SCBD universale nu au limite în utilizare și sunt elaborate "pentru toate cazurile vieții", ca rezultat sunt destul de complicate și cer de la utilizatori un bagaj de cunoștințe corespunzător. Atât SCBD universale, cât și cele specializate sunt relativ ieftine, destul de sigure și sunt gata pentru ilici-i!| imediat, în același timp când cele la comandă necesită cheltuieli considerabile. iar pregătirea și elaborarea lor ocupă un timp îndelungat (de la câteva luni până la câțiva ani). Dar în comparație cu cele industriale, SCBD comandate în grad maximal consideră specificul lucrului clientului, iar interfața lor de obicei este înțeleasă intuitiv de utilizatori și nu necesită de la ei cunoștințe speciale.

În dependență de localizarea SCBD se deosebesc SCBD locale și distribuite. Toate părțile SCBD locale sunt situate pe un calculator al utilizatorului de BD. Dacă la o BD se adresează în același timp câțiva utilizatori, atunci fiecare calculator personal trebuie să aibă copia sa a SCBD. Spre deosebire de aceasta, o parte importantă a mijloacelor program și aparataj a SCBD este centralizată și situată pe un calculator puternic (server), pe când calculatoarele utilizatorilor conțin o parte mică n SCBD, care se numește client. SCBD locale pot lucra în rețea, dar pot și să nu o utilizeze, pe când SCBD distribuite (client – server) lucrează numai în rețea. Trebuie de subliniat că localizarea bazei de date de loc nu influențează asupra specificului SCBD. Caracteristica cea mai importantă a sistemelor client-server este posibilitatea comandării centralizate cu accesul la BD. în așa sisteme BD în măsură considerabilă este protejată cum de la denaturări eronate a informației, așa și de la cele îndreptate. în ele este mai simplu de realizat integritatea datelor.

Unitatea informației ce se păstrează în BD este tabela. Fiecare tabelă prezintă prin sine o totalitate de rânduri și coloane, unde rândurile corespund exemplarului obiectului, evenimentului concret, iar coloanele – atributelor (însușirilor, caracteristicilor, parametrilor) obiectului, evenimentului. în tab. l se conțin informații despre eliberarea sumelor de bani clienților prin intermediul bancomatelor. Coloanele prezintă așa parametri, ca numarul inregistrarii a automobilului,culoare, tipul mașinii, virsta masinii si alta informatie. Fiecare rând conține informații despre un eveniment concret –automobilul ce il poseda intreprinderea. În terminologia BD coloanele tabelului se numesc câmpuri, iar rândurile – înscrieri.

Tabelul 1

Exemplul tabelului „Mașini”.

Între diferite tabele a BD pot exista legături. De exemplu, informația despre ruta în tabelul de mai sus poate fi completată de următorul tabel:

Tabelul 2

Exemplul tabelului „Ruta”.

Dacă între diferite tabele a BD există legătură, atunci aceste BD se numesc relaționale (de la relation – legătură, relație).

Relațiile între tabele acționează reciproc după principiul principala (master) subordonata (detail). În exemplul de mai sus tabelul "Mașini" este principal, iar „Ruta” – subordonat. Tabelul principal se mai numește părinte, iar cel subordonat copil. Unul și același tabel poate fi principal față de un tabel și subordonat față de altul.

3.1.2. Cheile primare și secundare.

În fiecare tabel a BD poate fi cheie primară – câmp sau set de câmpuri, ce identifică neândoit înscrierea. Valoarea cheii primare în tabelul BD trebuie să fie unică, adică în tabel nu trebuie să existe două sau mai multe înscrieri cu aceeași valoare a cheii primare.

Deoarece cheia primară trebuie să fie unică, pentru ea pot fi utilizate nu toate câmpurile tabelului. În exemplu numele clientului nu poate fi unic, deaceea câmpul • ”Clientul” nu poate fi utilizat în calitate de cheie primară. Este mai rară coincidența telefoanelor a diferitor clienți, deaceea câmpul "Telefon" într-o măsură mai mare poate fi ca cheie primară. Dacă în tabelă nu-s câmpuri, valorile cărora pot fi unice, pentru crearea cheii primare se introduc în ea se întroduce un câmp numeric adăugător, valorile căruia SCBD le poate utilizat cum dorește. Dacă, de exemplu. în tabelul "Clientul" adăugăm câmpul ".NW, atunci tabelele legate vor avea următoarea formă:

Sunt posibile două schimbări, care vor aduce la pierderea legăturii între înscrierile tabelei părinte și copil:

modificarea valorii câmpului legăturii în tabela-părinte fără schimbarea valorilor câmpurilor de legătură în înscrierile corespunzătoare a tabelei-copil;

modificarea valorii câmpului legăturii m una din înscrierile tabelei-copii fără schimbarea corespunzătoare a valorii câmpurilor de legătură în tabelele copil și părinte.

SQL Links

Draivere pentru lucrul cu serverele de date îndepărtate, așa ca Sybase, MS SQL Server, Oracle.

BDE Administrator

Utilită pentru instalarea pseudonimelor (numelor) BD, parametrilor BD și draiverelor BD pe un calculator concret. în timpul lucrului cu BD din aplicații, create cu ajutorul Delphi, accesul la BD se înfaptuiește după pseudonimul ei. Parametrii determinați de pseudonimul BD acționează numai pentru această BD; parametrii, instalați pentru draiverul BD, acționează pentru toate BD ce utilizează draiverul. În afară de aceasta, în utilita BDE Administrator se poate de instalat pentru toate BD așa parametri ca formatele datei și timpului, formatele afișării valorilor numerice, draiverul limbajului utilizat etc.

Database Desktop (DBD)

Mijloc pentru crearea, modificarea și afișarea BD. Această utilită este orientată la lucrul cu tabelele locale a SCBD.

SQL Explorer

Utilită universală, ce înlocuiește multe funcții a BDE Administrator și DBD. Cu ajutorul ei se poate de creat și de afișat pseudonimele BD, de afișat structura și conținutul tabelelor BD, de format cereri la BD în limbajul SQL, de creat dicționare de date (șabloane de câmpuri a tabelelor).

OLEnterprise

Complexul mijloacelor program a corporației Inprise pentru susținerea tehnologiilor OLE for Enterprise.

Datapump

Mijloc pentru transportarea datelor între BD de tip diferit (de exemplu trecerea de la sistema locală la cea distribuită).

Data Module

Componentele nevizuale Data Module se utilizează pentru centralizarea seturilor de date în aplicații, ce lucrează cu BD. Una din principalele facilități a utilizării Data Module este posibilitatea conectării cu fiecare set de regulilor date pentru conducerea cu datele – regulile – business. Regulile-business determină reacția sistemei la adăugarea, modificarea, ștergerea datelor și realizează blocarea acțiunilor ce pot distruge integritatea de referință sau de sens.

Componentele nevizuale pentru lucrul cu Delphi

Componentele nevizuale Delphi servesc pentru conectarea aplicațiilor cu tabelele BD m sistemele locale și distribuite. Cu ajutorul componentelor nevizuale se înfăptuiește conectarea la BD, formarea cererilor la ele, manipularea cu tabelele, crearea clienților și serverelor în arhitectura de trei noduri.

Componentele vizuale pentru lucrul cu BD

Componentele vizuale sunt destinate pentru vizualizarea înscrierilor seturilor de date și a câmpurilor lor aparte. Ele servesc instrumentul de bază la elaborarea interfeței utilizatorului a accesului la date.

Componentele pentru construirea dărilor de seamă

Pe baza cererilor la BD ele creează utilizatorului documentele necesare lui.

3.1.8. Argumentarea alegerii tipului BD

Sunt 4 tipuri de bază de BD:

Locale

Fail-server

Client-server

Arhitectura multi-nod

În BD locale și fail-servere BD pot fi localizate pe mașina clientului sau pe fail-serverul de rețea.

Evident, că varianta locală real poate asigura accesul la date a unui utilizator. Această variantă în lucrul corporativ practic nu se întâlnește.

În BD fail-server datele se localizează pe fail-serverul de rețea, care poate fi accesibil concomitent câtorva utilizatori, deaceea la așa BD este posibil regimul de acces multiutilizator. Datele în BD se păstrează într-un exemplar, iar fiecare client în fiecare moment de lucru lucrează cu o copie locală a acestor date, iar conducerea este complect efectuată de programele-client. Anume ele trebuie să aibă grijă de sincronizarea copiilor locale a datelor pe fiecare loc a clientului cu conținutul BD de bază (și unice).

În ambele cazuri BDE este situată pe mașina clientului și împreună cu programa formează SCBD, numărul copiilor căreia este egal cu nLimarii utilizatorilor. În așa sisteme, în principiu, este posibil accesul îndepărtat, dacă rețeaua utilizată m ele permite utilizatorului să se afle în afara oficiului (varianta rețelelor locale ramurale, rețelele de serviciu regionale, rețele cu ieșirea la Internet).

Arhitectura fail-server nu este efectivă cel puțin din două considerente:

1. La efectuarea cererii în BD, situată pe serverul-fișier, m realitate are loc cererea la copia localâ a datelor pe calculatoml utilizatorului. Deaceea înaintea efectuării cererii datele m copia locală în întreg volum se înnoiesc din BD reală. Dacă tabela BD constă din 10000 de înscrieri, iar pentru îndeplinirea cererii sunt necesare numai 10 înscrieri, tot una clientului îi vor fi transmise 10000 de înscrieri. În așa mod, nu este nevoie de mulți utilizatori și cereri de la ei pentru a încărca concret rețeaua, ce evident se va răsfrânge asupra vitezei ei.

2. Integritatea BD este asigurată de programele client. Acestea sunt sursa potențială a erorilor, ce încalcă integritatea fizică și logică a datelor, deoarece diferiți clienți pot să efectueze controlul integrității în mod diferit sau să nu o efectueze în genere. Cu mult mai efectivă este comandarea BD dintr-un singur loc și după aceleași legi. De aceea siguranța în timpul lucrului în arhitectura fail-server nu este înaltă și tot timpul este prezent elementul nedeterminării. În așa arhitectură este greu de asigurat securitatea datelor și protejarea lor: tabelele se păstrează pe server în forma fișierelor simple, deaceea orice cine are acces la directoriile serverului de rețea, unde se păstrează BD, poate să schimbe tabelele, să le copie, să le schimbe etc.

În arhitectura client-server între BDE și BD apare un important nod intermediar – serverul BD (programă specială, ce comandă cu BD, Anexa-5).

Clientul formează cererea la server în limbajul SQL (Structure Query Language – limbajul structurizat a cererilor), ce este un standard industrial pentru BD relaționale. SQL-server asigură interpretarea cererii, îndeplinirea ei, formarea rezultatului și oferirea lui clientului. Pe când resursele calculatorului clientului nu participă la îndeplinirea fizică a cererii: calculatorul clientului doar transmite cererea la BD a serverului și primește rezultatul, după ce-1 interpretă m mod cuvenit și-1 prezintă utilizatorului. Deoarece aplicației clientului i se transmite numai rezultatul efectuării cererii, pe rețea se transmit numai acele date care într-adevăr sunt necesare clientului. În rezultat se micșorează sarcina rețelei. În afară de aceasta, SQL-server, dacă este posibil optimizează cererea primită în așa mod, ca el să fie executa în timp minimal. Tot aceasta mărește viteza sistemei și micșorează timpul de așteptare a rezultatului cererii.

La executarea cererilor de server se mărește considerabil nivelul siguranței datelor, deoarece regulile integrității datelor sunt determinate pe server și sunt unice pentru toate aplicațiile, ce utilizează această BD. în rezultat se exclude posibilitatea apariției regulilor contradictorie de menținere a siguranței. Aparatul puternic de tranzacții, susținut de SQL-servere, blochează schimbarea simulară a acelorași date de către diferiți utilizatori și prezintă posibilitatea întoarcerilor la starea precedentă când introducerea schimbărilor în BD s-a terminat avariat.

Datele în BD server fizic se păstrează pe disc în forma unui fișier mare, care împreună cu parolele și privilegiile oferite fiecărui utilizator mărește considerent protejarea datelor de la nimicire și furturi.

În arhitectura client-server se utilizează servere industriale de tipul Oracle, Gupta, Informix, Sybase, MS SQL Server, DB2, InterBase și altele.

Dezvoltarea ideilor arhitecturii client-server a adus la apariția arhitecturii multinod de acces la BD (în literatură se mai numește arhitectura cu trei noduri, N-tier sau multi-tier).

Arhitectura client-server – cu două noduri: primul nod în ea este programa clientului, al doilea – serverul BD și însăși BD.

În arhitectura multinod se creează o programă ajutătoare, în care se includ toate componentele-surse de date, ce au fost precedent (în arhitectura client-server) proprietatea aplicațiilor clienților, la fel și componentele Tdatabase și Tsession. Apoi această programă se înregistrează în calitate de COM- sau CORBA-server pe toate mașinile clienților, după ce ea devine serverul aplicațiilor. Acum mașinile clienților pot să nu posede BDE, iar programele clienților de acum nu includ în ele codurile imense ale componentelor-surse și multe alte componente. Pentru primirea accesului la datele serverului ele se adresează la serverul îndepărtat a aplicațiilor (situat pe altă mașină), care și realizează schimbul datelor necesare (Anexa 3). Subliniez că pe anexă este reprezentată varianta plasării serverului aplicațiilor pe mașina serverului BD. Așa variantă este cea mai bună și mai practică, deoarece micșorează încărcarea rețelei și garantează lucrul concomitent a ambelor servere. În genere aceasta nu este obligatoriu, deoarece serverul aplicațiilor poate fi plasat pe orice mașină de rețea, ce are BDE. Desigur, în acest caz directorul plasării lui să fie accesibil altor mașini de rețea, iar însăși mașina serverului aplicațiilor trebuie să fie conectată în timpul lucrului cu serverul datelor.

Cu ajutorul dicționarelor BD se poate de transferat m componentele-surse și câmpurile legate de ele a business-regulilor, ce ating diferite limitări la valorile datelor introduse. în acest caz datele eronate vor fi respinse de serverul aplicațiilor și nu vor fi transmise serverului BD. în programa-client, care în arhitectura multinod se mai numește clientul subțire (thin client), se plasează setul de date a clientului, care prezintă prin sine copia a unei părți a datelor din BD. Toate modificările efectuate de utilizator asupra datelor, schimbă această copie locală și pot până la un moment oarecare să nu se transmită în BD. În afară de aceasta, la lucrul cu tabelele mari se poate de cerut de la serverul aplicațiilor să transmită în setul local înscrierile tabelei pe porții, îndeajuns pentru vizualizarea concomitentă pe ecranul clientului. Toate aceste măsuri micșorează încărcarea rețelei și, evident, micșorează timpul așteptării rezultatului cererii.

Din arhitecturile examinate eu am ales arhitectura multinod, scopul de bază a câreia este micșorarea cerințelor față de calculatoarele clienților, ca m cazul ideal în calitatea lor să fie utilizate calculatoare ieftine de rețea fară discuri.

Arhitectura dată are următoarele particularități:

parte considerabilă din resursele clientului au fost transferate în nodul intermediar – serverul aplicațiilor;

serverul aplicațiilor este plasat pe calculatorul serverului BD sau pe alt calculator de rețea. Numai el cu ajutorul BDE acționează concomitent cu serverul BD;

soft-ul clientului nu apelează mai mult la BDE și se eliberează de un strat concret de componente-surse, și realizarea în mare măsură a unei părți de business-reguli, care în acest caz se transferă pe serverul aplicațiilor. Ca rezultat se primește clientul "ușurat", care n-are nevoie de mari resurse de memorie și se poate lansa de pe calculatorul de rețea – aceasta este proprietatea principală a arhitecturii multinod. Economia minimală a memoriei pe disc se poate aprecia în felul următor: fișierele DLL a BDE ocupă mai mult de 8 Mbyte și se plasează pe mașina serverului aplicațiilor. în locul lor pe mașina clientului se instalează numai o bibliotecă DBCLIENT.DLL, cu volum mai mic de 212 Kbyte;

accesul centralizat la majoritatea business-reguli, care sunt concentrate acum într-un loc – pe serverul aplicațiilor; această centralizare permite flexibil de schimbat business-regulile fară necesitatea tirajării lor în toate aplicațiile clienților;

micșorarea considerabilă a traficului de rețea din contul înnoirii reglate și volumului reglat a pachetelor de date;

simplitatea distribuirii noilor versiuni a soft-ului clientului, deoarece nu-i necesitatea de a instala pe locurile clienților BDE sau mecanisme asemănătoare de acces la date;

posibilitatea înnoirii reglate a seturilor de date: se poate de primit porția necesară de date, de le păstrat în fișier, de lucrat cu ele autonom (de exemplu în alt oraș), iar apoi să te conectezi cu serverul aplicațiilor și de înnoit pe server modificările efectuate în date;

BD pe server prezintă, de regulă, un fișier, în care se conțin tabelele, limitările integrității și alte componente a BD; de a intra fără acces, de a fura sau a denatura așa BD considerabil este mai greu, deoarece serverul BD efectuează controlul automat corespondența valorilor introduse limitărilor lor și automat execută business-regulile; m afară de aceasta, serverul urmărește nivelele accesului pentru fiecare utilizator și blochează încercările neautorizate ale utilizatorilor; tot aceasta permite de a vorbi de un nivel mai înalt a asigurării siguranței BD, integrității de referință și de sens a informației;

siguranța sistemei se mărește din contul transferului unei mari părți a business-regulilor pe server; fiecare utilizator de acum nu poate să introducă business-regulile lui.

4. Protecția muncii și sanitarie de producere

Proiectul de diplomă prezintă elaborarea unui set de programe pentru culegerea și prelucrarea informației. Rezultă problema protecției muncii atât a persoanelor care elaborează programele, cât și a utilizatorilor ei. Lucrările în sistemul menționat vor fi efectuate utilizând calculatoare personale, adică prezintă lucrul programatorilor și a operatorilor tehnicii de calcul, e necesar de a precauta cerințele pentru protecția muncii la lucrul cu tehnica de calcul, în special a calculatoarelor personale cu diferite sisteme periferice, utilizate de către personalul centrului de calcul (CC) în procesul activității vitale. Evident, integrarea și utilizarea pe larg a calculatoarelor electronice pe lângă factorii pozitivi mai are și nuanțe negative asupra persoanelor care le exploatează.

Lucrul operatorilor tehnicii de calcul necesită o atenție mare, posibilitatea de a rezolva în timp limitat probleme complexe, responsabilitatea față de acțiunile întreprinse ce duce la o tensionare emoțională și stres.

Operatorii tehnicii de calcul, programatorii, și alți colaboratori ai CC sunt supuși unor factori nocivi și periculoși cum ar fi:

nivelul ridicat de zgomot;

insuficiența iluminatului natural;

insuficiența iluminatului locurilor de muncă;

temperatura ridicată a mediului ambiant;

diferite forme de iradieri, etc.

Acțiunea factorilor indicați duce la micșorarea capacității de muncă, ca rezultat al obosirii. Apariția și dezvoltarea obosirii este legată de schimbările, ce apar în procesul muncii în sistemul nervos central, cu procese de încetinire în creier. De exemplu, zgomotul mare conduce la dificultăți în perceperea semnalelor colore, micșorează viteza de percepție a culorilor, adaptarea vizuală, micșorează capacitatea de a acționa rapid și efectiv, micșorează cu 5-12% capacitatea de muncă și duce la deteriorarea auzului.

Aflarea îndelungată a persoanei într-un mediu în care acționează mai mulți factori nocivi poate duce la o îmbolnăvire profesională.

Pentru crearea condițiilor de lucru prielnice e necesar de a lua în considerare particularitățile psiho-fiziologice ale oamenilor, plus starea igienică generală. Un rol important îl are amplasarea postului de lucru, economia energiei electrice și timpului operatorului, utilizarea rațională a suprafețelor utilizate, comodității utilizării tehnicii de calcul, respectarea regulilor de protecție a muncii.

4.1. Zgomotul

Zgomotul este unul din factori care influențează omul când el lucrează cu CE, aceasta este condiționat de funcționarea dispozitivelor ce sunt necesare în CC.

Sursele principale de zgomot în încăperi amenajate cu tehnica de calcul sunt imprimantele, tastatura, instalații pentru condiționarea aerului, dar în CE – ventilatoarele sistemelor de refrigerare și transformatoare.

La influența zgomotului pe un timp îndelungat la colaboratorii CC se observă micșorarea atenției, dureri de cap, se micșorează capacitatea de muncă. În documente de însoțire a utilajului ce produc zgomot se aduc normele timpului de lucru la acest utilaj.

În conformitate cu GOST 12.1.003-91 “Zgomot. Cerințele generale de protecție” caracteristica de normă a zgomotului locurilor de muncă sunt nivelurile presiunii de sonor (zgomot). Nivelurile accesibile a zgomotului, lucrând cu CE, sunt prezentate în tabelul 1:

Nivelurile admisibile a zgomotului. Tabelul 4.1.

Pentru micșorarea zgomotului la locurile de muncă se efectuează următoarele acțiuni:

Arhitectural-planificative. Clădirile se proiectează și se construiesc în așa mod ca la locurile de muncă să nu fie depășit nivelului admisibil. Întrucât sistemul va fi utilizat la CC existent aici se poate de obținut micșorarea zgomotului amplasând în încăperi vecine utilajului cu zgomot ridicat.

Tehnico-organizatorice. Pentru micșorarea zgomotului la CC se efectuează reparația și ungerea utilajului (imprimantelor). Se poate de aranjat utilajul în așa fel ca el să facă mai puțin zgomot.

Acustice. În CC se instalează podele tehnologice și poduri fixate în balamale. Distanța între podul de bază și podul fixat în balamale 0,5-0,8 m, iar înălțimea podelei tehnologice 0,2-0,6 m.

4.2. Securitatea electrică

Utilajul CE este foarte periculos pentru operatori, deoarece lucrând la acest utilaj operatorul poate să atingă unele părți care sunt sub tensiune. Trecând prin om curentul electric efectuează influența optică, biologică termică, ce poate aduce la traumă electrică (GOST 12.1.009-91).

O importanță mare pentru emiterea cazurilor neplăcute și periculoase are organizarea corectă a exploatării utilajului electric, efectuarea lucrărilor de montare și profilactică.

Legarea la nul este o măsură de protejare de electrocutare prin deconectarea strictă și în viteză a rețelei în caz de apariție a tensiunii pe carcasă sau în cazul străpungerea izolării. Deconectarea strictă se efectuează, dacă curentul de scurt circuit format prin faza și firul nul este destul de mare ca declanșatorul să lucreze corect.

Scopul calculării este determinarea secțiunii firului nul, care satisface condiția funcționării protecției maximale de curent. Valoarea protecției se determină după puterea instalației electrice proiectate.

Curentul de scurtcircuit trebuie să fie mai mare de trei ori decât curentul nominal a siguranței Is.c. ≥ 3In

4.3. Microclimatul

Deoarece CE sunt surse de eliminare a căldurii, ce poate ajunge la mărirea temperaturii și micșorarea umidității aerului. În încăperi se atrage atenție la controlul parametrilor microclimatului în Săli de Calcul (SC). În SC mărimea medie a eliminărilor de căldură constituie 310 W/m2. Eliminările de căldură de la instalații de iluminare tot sunt mari, mărimea specifică a lor este 35-60 W/m2. În afară de aceasta la microclimatul încăperi încă influențează surse exterioare de eliminare a căldurii, cum sunt căldura de la radiația solară ce intră prin fereastră, și afluența căldurii prin construcții de barieră ce nu sunt transparente.

Asupra corpului omului și lucrului utilajului a CC influențează foarte mult umiditatea aerului relativă. La umiditatea aerului egală cu 40% lenta magnetică devine mai fragilă, se mărește uzura capilor magnetice și apare câmpul magnetic static la mișcarea purtătorilor de informației în CE.

La efectuarea controlului locurilor de muncă se măsoară temperatura, umiditatea relativă și viteza de mișcare a aerului în încăperi, totodată se efectuează măsurări la începutul, mijlocul și sfârșitul perioadelor calde și rece a anului.

Se măsoară temperatura și umiditatea aerului cu psihometre aspiratoare, iar viteza de mișcarea a aerului – cu electro-anemometre, catatermometre. Ordinea de măsurare a indicilor microclimatului se stabilește în conformitate cu GOST 12.1.005-91. Parametrii se normează după acest GOST și sunt prezentați în tabelul 2.

Normele microclimatului. Tabelul 4.2.

În acest tabel se aduc parametrii pentru categoriile de lucru 1a (mai puțin de 120 kkal/oră, lucrul șezând) și 1b (de la 120 până la 150 kkal/oră, lucrul șezând), deoarece lucrul programatorului sau operatorului se poate atribui la una din aceste categorii.

Pentru crearea la locuri de muncă a condițiilor meteorologice bune se efectuează condiționarea și ventilarea aerului, utilizarea ventilatoarelor înăuntru CE pentru a reduce eliminările de căldură. Utilajul se aranjează în așa fel ca influența căldurii asupra corpul omului va fi cea mai mică.

4.4. Securitatea antiincendiară

Focul este o forță gigantică. Oamenii antici vedeau în el o sursă a vieții și în prezent el încălzește și hrănește doar cu acea diferență că pentru contemporanul nostru la nivelul actual de dezvoltare a condițiilor sociale că această întrebare a scăzut cu mult. Însă acest fapt nu ne permite să neglijăm focul, doar o mică neatenție și marea lui forță poate aduce o nenorocire. Iată de ce e atât de important rolul securității antiincendiare în organizarea protecției muncii la întreprinderi și în încăperi administrative.

Incendiul se numește arderea necontrolată în afara unui focar special care aduce pierderi materiale. Dacă această ardere nu cauzează pierderi materiale, atunci ea se numește inflamare. Explozia este o transformare chimică momentană, caracterizată prin degajarea de energie și crearea de gaze comprimate.

După gradul de ardere (oxidare însoțită de degajarea unei cantități mari de căldură) materialele de construcție se împart în următoarele tipuri: nearzătoare – sub acțiunea focului nu se inflamează, nu se corodează; greu inflamabile – sub acțiunea focului se inflamează, se carbonizează doar în prezența sursei de inflamare, iar după lichidarea ei arderea sau carbonizarea încetează (materialele se gips sau beton, materiale din argilă); inflamabile – sub acțiunea focului se inflamează și se carbonizează și continuă acest proces și după lichidarea sursei de inflamare (toate materialele organice, ce nu corespund cerințelor indicate anterior).

Materialele, ce posedă capacități ridicate de inflamabilitate se numesc periculoase din punct de vedere incendiar, iar capabile de explozii și detonare fără participarea oxigenului.

Cauzele incendiilor și exploziilor pot fi electrice după caracter și neelectrice. La categoria electrice se referă: scânteia în aparatele electrice, descărcările electrostatice, fulgerele ș.a.

Cauzele incendiilor și exploziilor cu caracter neelectric pot fi: exploatarea incorectă a aparatului de sudură cu gaz, pistoalele de lipit, dereglarea dispozitivelor de încălzire, a echipamentului de producție, încălcarea procesului tehnologic ș.a.

În dependență de procesele tehnologice și proprietățile materialelor după gradul de pericol incendiar și exploziv încăperile și clădirile se împart în cinci categorii A, B, V, G, D în conformitate cu normele proiectării tehnologice.

Aceste categorii sînt stabilite și aprobate de către ministerele ramurilor corespunzătoare. Majoritatea clădirilor industriei radioelectronice se referă la categoria V.

Clădirile și edificiile se împart după gradul de stabilitate antiincendiară (SNIP 201.02-85), care se determină de limitele minimale de stabilitate incendiară ale construcțiilor de bază și limitele maximale de răspundere în ele a focului. Aceste limite se determină în baza testării probelor în cuptoare speciale.

Protecția antiincendiară a obiectelor naționale este reglementată de STAS 12.11.033-81 “Cerințe generale”, normelor și regulilor constructive, regulilor protecției antiincendiare a ramurii.

Factorii principali pentru viața omului ce apar în timpul incendiului sunt: focul deschis, temperatura ridicată a aerului și obiectelor, produsele toxice ce ard, fumul, micșorarea concentrației de oxigen în aer, distrugerea încăperilor, echipamentului și explozia.

Pentru prevenirea incendiului trebuie luate următoarele măsuri:

excluderea apariției mediului arzător;

excluderea apariției în mediul arzător a surselor de inflamare;

menținerea temperaturii și presiunii mediului arzător mai jos de nivelul maxim admisibil de ardere.

Pentru prevenirea incendiului sunt aplicate un șir de măsuri. Barajele antiincendiare din clădiri și edificii la care se referă pereții antiincendiari, barajele și acoperirile antiincendiare, ușile și altele trebuie să fie executate din materiale ne inflamabile și de asemenea să fie prevăzută autoînchiderea lor. Ferestrele antiincendiare nu trebuie să aibă posibilitate de deschidere.

Pentru anunțul incendiului se utilizează legăturile radio și telefonice, sirenele, traductoare de semnalizare a incendiului. Fiecare unitate economică trebuie să dispună de mijloace de legătură pentru chemarea urgentă a pompierilor. Toate mijloacele de legătură antiincendiare trebuie să aibă acces deschis în orice timp.

Cel mai răspândit și ieftin mijloc de stingere a incendiului este apa care permite consumarea efectivă a căldurii aruncate de focarele de incendiu. Totodată apa nu poate fi folosită pentru stingerea lichidelor ușor inflamabile (benzină, gazul lampant, uleiuri minerale) și a materialelor care în contact cu ea elimină substanțe inflamabile (carbonatul de calciu).

În încăperile închise pentru lichidarea incendiului se recomandă utilizarea vaporilor de apă atât pentru stingerea materialelor solide cît și a substanțelor lichide.

În condițiile de laborator pentru stingerea incendiului poate fi folosit instinctorul cu volumul de șapte litri ce conține 97% etil bromic și 3% soluție de oxid carbonic. Componența aflată sub presiune în timpul utilizării se elimină sub formă de spumă. Durata funcționării este de circa 40s, distanța de aplicare – 4- 5 metri. El se utilizează la stingerea instalațiilor electrice aflate sub tensiune, deoarece brom etilul nu conduce curentul electric. Pentru protecția oamenilor de produsele toxice ale arderii și de fum se utilizează ventilatoarele și canalele de ventilare.

4.5. Radiație

Intensitatea radiației Roentgen de energie joasă se controlează la locuri de muncă cu monitoare, care lucrează sub tensiunea la cinescop 15 kV și mai mult. Norma nivelului de radiație roentgen este 100 mcP/oră, dar în timpul de azi se utilizează mai mult monitoare cu nivelul radiație mai mică, ce aduce la micșorarea influenței factorilor dăunători asupra programatorului sau operatorului. La efectuarea tezei de licență a fost utilizat monitorul cu tensiunea la cinescop mult mai mică de 15 kV, și de aceea acest factor nu a fost înregistrat de dispozitiv, adică a fost mai puțin de normă.

Încă se măsoară și se normează intensitatea radiației ultraviolete (la lungimea de undă 336 nm) și infraroșie (la lungimea de undă 700 – 1050 nm) ce influențează asupra omului, nu trebuie să depășească 10 W/m2.

Radiația electromagnetică se normează după componente electrice (50 V/m) și magnetice (50 A/m) de aflare în această zonă de radiere în timp de 8 ore. Tensiunea înaltă a câmpului electric între monitorul și operatorul aduce la efecte neplăcute. La distanța de 5 – 30 cm de la monitor tensiunea nu trebuie să depășească nivelul admisibil după norme, ce sunt stabilite în dependența de timpul aflării la locul de muncă. Niveluri admisibile de tensiune sunt prezentate în tabelul 3.

Niveluri admisibile de tensiune. Tabelul 4.3.

Controlul radiației de toate tipurile se efectuează în conformitate cu regulile ce sunt expuse în îndrumare speciale.

4.6. Parametrii vizuali a imaginii

Efectuând controlul asupra condițiilor de lucru la locuri de muncă cu monitoare trebuie să fie măsurate și evaluate următorii parametri a imaginii:

deformarea imaginii;

contrastul de strălucire a imaginii;

variația strălucirii elementelor simbolului;

lungimea, lățimea, raportul lățimii la lungimea;

lățimea liniei de contur a simbolului;

modulație de strălucire a rasterului;

distanța între cuvinte, rânduri;

vibrația și fugă (licărire) imaginilor.

Prezența sau lipsa licăririi imaginii se stabilește după metode experimentale sau de calcul. Metoda experimentală permite de evaluat și vibrarea imaginii. Prezența vibrării se determină prim metodă măsurărilor directe. Celelalte caracteristici a ecranului se stabilesc după rezultatele măsurărilor directe și indirecte. După control, parametrii se compară cu recomandațiile prezentate în tabelul 4.

Parametrii monitorului. Tabelul 4.4.

Totodată o importanță mare are rezoluția ecranului, care se determină de tipul adaptorului grafic (CGA, EGA, VGA, SVGA), adică cât mai mare este rezoluția ecranului atât mai bună este imaginea.

4.7. Efecte psihofiziologice

Lucrul operatorilor cere încordarea mintală și emoțională foarte mare, concentrarea atenției și responsabilitatea de lucrul efectuat. Operatorii foarte des suferă de diferite stări proaste a vederii, dureri de cap, dureri de mușchi în regiunea spatelui. În afară de asta, în mare măsură se exprimă senzația oboselii și încordarea mintală în timpul lucrului; ei nu se simt odihniți după somn de noapte.

Sarcina asupra vederii și caracterul încărcării lucrului provoacă la operatori disfuncția stării a analizatorului de vedere și sistemei nervoase centrale. În procesul de lucru la dânșii se micșorează rezistența vederii clare, sensibilitatea electrică și labilitatea analizatorului de vedere, și încă apar disfuncții a mușchilor ochilor.

Sunt interesante cercetările stării psihofiziologice a operatorilor de introducere a datelor, care efectuează lucrul monoton în timp de 2 ore în condiții favorabile de muncă. Tot odată s-a arătat că din 80% de persoane supuse experienței capacitatea de lucru și activitatea mintală se micșorează peste 45 – 60 minute de lucrului neîntrerupt. În afară de aceasta la persoanele supuse experienței la sfârșitul zilei de lucru sa mărit timpul de reacție și cantitatea greșelilor la executarea problemelor. S-a micșorat frecvența de contractare a inimii de la 64 până la 40 batăi/min; la 74% persoane s-a tulburat bilanțul mușchilor ochiului.

Efectuarea multor operații la CC cer încărcarea îndelungată a mușchilor spatelui, gâtului, mâinilor și picioarelor ce aduce la apariția oboselii. Motive principale de apariția oboselii sunt înălțimea irațională a suprafeței de lucru, masei și scaunului, lipsa spatelui de sprijin și brațelor, unghiuri incomode de îndoire în articulațiile umărului și cubitului, unghiul de înclinare a capului, repartizare incomodă a documentelor, monitoarelor și tastaturii, lipsa spațiului și suportului pentru picioare.

4.8. Iluminatul

La lucrul cu CE o importanță mare are crearea mediului de iluminare optimal, adică organizarea rațională iluminatului natural și artificial în încăperi și la locuri de muncă, deoarece lucrând la CE încărcarea în general cade pe organe de vedere. Dacă omul lucrează mai mult de o jumătate a zilei de lucru la CE la el se observă înrăutățirea vederii, ce constituie 62-94%. Asta în primul rând este oboseala ochilor, dureri foarte mari și simțul de nisip în ochi, mâncărime și senzație de usturare în ochi. Totodată senzațiile dureroase în ochi apar în general la sfârșitul zilei de lucru. Din această cauză toate locurile de muncă cu CE se amplasează în locuri ce sunt protejate de căderea luminii difuzate pe ecranul terminalului. Pentru asta se utilizează încăperi cu iluminarea unilaterală (într-o singură direcție), totodată ferestrele trebuie să fie cu storuri sau jaluzele pentru excluderea efectului de orbire și strălucirea ecranului terminalului.

Iluminarea artificială a locului de muncă se efectuează în felul următor, nivelul iluminării locului de muncă trebuie să corespundă caracterului de lucru vizual, iluminarea încăperii să nu depindă de timpul de afară, fluxurile de lumină să aibă direcția optimală și utilajul trebuie să fie economic, inofensiv, durabil și simplu în exploatare.

La instalarea iluminatului artificial se fac următoarele măsurări:

iluminarea la locuri de muncă;

caracterul de strălucire a ecranului, mesei;

strălucirea petelor reflectate în ecran.

Se efectuează măsurări de control a iluminării și strălucirii la locuri de muncă cu diferite terminale care sunt în încăperi și care se află în diferite condiții de iluminare, acolo unde sunt plângeri ale personalului. Măsurarea iluminatului se efectuează în timpul întuneric a zilei.

Punctele de control pentru măsurările iluminatului la locuri de muncă se amplasează:

în centrul ecranului;

pe tastatură;

pe document în planul amplasării lui;

pe masă în zona de lucru.

Efectuarea măsurărilor se efectuează în conformitate cu GOST 2.4.940-91. Măsurarea caracterului de strălucire a ecranului se efectuează la strălucirea ecranului nu mai puțin de 35 c/m2. Iluminarea locului de muncă se normează după SniP II-4-91 și depinde de caracterul lucrului vizual, contrastul obiectului, fonului și tipul fonului.

4.9. Calcularea iluminatului artificial a încăperii.

Pentru organizarea activității normale a omului o mare însemnătate are crearea condițiilor normale de iluminare naturală și artificială la locul de muncă.

Iluminarea de producție, corect proiectată și îndeplinită, aduce la rezolvarea următoarelor probleme:

ea îmbunătățește condițiile de muncă, micșorează oboseala, contribuie la creșterea productivității muncii și a calității producției, acționează binefăcător asupra mediului de producere, acționează pozitiv din punct de vedere psihologic asupra lucrătorului, ridică securitatea muncii și micșorează traumatismul în producție.

Analizatorul vizual percepe ca lumină oscilațiile electromagnetice cu lungimea de undă 380-770 nm.

Iluminarea optimă se alege în dependență de particularitățile (coeficientul de reflecție) suprafeței de lucru și detaliile ce sunt analizate pe ea (lungimea perioadei de lucru vizual, precizia, caracterul procesului de lucru).

O cerință importantă este menținerea regimului de iluminare. La iluminarea artificială devierile în rețea nu trebuie să depășească + 2.5 – 3 %.

Prin norme sunt introduse valorile minimale a iluminării care permit realizarea cu succes a lucrului vizual.

În dependență de sursa de lumină, iluminarea de producere poate fi de două tipuri: naturală (lumina de zi) și artificială, generată de lămpile electrice.

Iluminatul artificial poate fi de lucru, de pază, de serviciu, de evacuare, de avarii.

Iluminatul de lucru poate fi local, total și combinat.

Este interzis de a folosi la întreprinderile mari iluminatul local, deoarece el trebuie să constituie nu mai puțin de 10 % din iluminatul total.

Normarea iluminatului artificial se efectuează de SNiP-II-4-79.

La fel se normează iluminarea locurilor de muncă în funcție de :

1. categoria lucrului vizual

a) precizie înaltă E =5000 lx

b) fără precizie E =30 lx

2. în dependență de tipul de iluminat-adică total sau local.

3. în dependență de fon.

4. în dependență de contrast.

Raportul dintre fon și contrast indică subcategoria (a,b,c,d).

Iluminatul artificial există datorită becurilor incadiscente și fluoriscente.

Deci după cum știm, iluminatul natural este schimbător în timp sau chiar poate să nu existe, de aceia se folosește iluminatul artificial, iar pentru instalarea corectă a iluminatului artificial se fac careva calcule.

Calcularea iluminatului artificial se face conform metodei randamentului de flux de lumină.

După această metodă se găsește fluxul de lumină a becurilor care asigură iluminarea locurilor de muncă, normarea

unde:

Sp – suprafața podelei

En – iluminarea normată minimală, 500 lx (precizie mijlocie)

z – coeficientul iluminării neuniforme, Z=1.1-1.2

Kr – coeficientul de rezervă, se ține cont de tipul de becuri și de tipul de încăpere.

N – numărul de instalații de iluminat

n – numărul de becuri într-o instalație

Kuf- coeficientul utilizării de către lampele radiante a fluxului de lumina pe

suprafața calculată.

Se determină în dependență de tipul becului, coeficientului de reflectare a podelei, pereților, tavanului, indicile încăperii:

unde

A,B – dimensiunile încăperii

h – înălțimea suspensiei lămpilor de aspra suprafeței de lucru.

Kum – coeficientul de umbrire, se introduce pentru încăperile cu poziția fixă a lucrătorilor, și este egal cu 0.8-0.9.

Înălțimea lampei asupra ariei de iluminare se calculează după formula:

Hc=H-Hl-Ht;

unde

H – înălțimea încăperii 4,00 m.

Hl- distanța de la pod până la partea de jos a lampei, 0,5 m

Ht- distanța de la podea până la suprafața iluminată, 0,75 m

Hc=4,00 – 0,10 – 0,75 = 3,15 m

Calculăm i,

Având coeficientul de reflectare a tavanului și pereților egal cu 0.7 și după indicile calculat i, coeficientul de folosire a fluxului de lumină din tabel egal =0,30

Calculăm

Pentru iluminare utilizăm 10 instalații a câte 2 becuri fiecare. Alegem cea mai apropiată lampă de tipul EA-80 cu fluxul de lumină 5220 lm care asigură pe deplin iluminarea centrului de calcul.

4.10.Ecologia.

Elaborarea și exploatarea produselor soft este una din cele mai curate din punct de vedere ecologic activitatea de producere a oamenilor. Sunt utilizate numai surse de energie electrică. Hârtia nu se utilizează în cantități mari, și ea poate fi ușor reciclată după utilizare. Calculatoarele nu poluează mediul în tipul exploatării.

5. Partea economică a proiectului.

Calcularea indicilor economici

Introducere

La etapa actuală de dezvoltare a țării, când au loc schimbări esențiale în diferite probleme legate de economie, planificare, piață, o cerință principală în pregătirea inginerilor de toate specialitățile este pregătirea organizator economică la un nivel înalt, deoarece aceasta este dictat de trecerea întreprinderilor la autofinanțare, de schimbarea relațiilor între întreprinderi, de trecerea la economia de piață.

Lucrarea de diplomă trebuie să corespundă cerințelor generale, înaintate proiectelor tehnice, pe baza cărora este creată tehnica nouă și în ea trebuie să fie reflectată aprecierea tehnico-economică a proiectelor elaborate și organizarea LEP (lucrare economică de proiectare), care se folosește în organizațiile de proiectare și de cercetări științifice.

Deoarece lucrarea de diplomă conține mai multe lucrări de proiectare și experimentale, ea aparține clasei lucrărilor LEP. Deaceia toate calculele economice sînt efectuate ca pentru LEP.

Planul calendaristic

Pentru un lucru efectiv asupra proiectului de diplomă trebuie de alcătuit un plan calendaristic. Timpul necesar îndeplinirii lucrărilor se determină conform formulei: Ti =(Ai + 4Mi + Bi)/6

unde:

Ai – timpul minim de proiectare pentru fiecare etapă.

Bi – timpul maxim de proiectare pentru fiecare etapă.

Mi – timpul probabil de proiectare pentru fiecare etapă.

Ti – timpul mediu de proiectare pentru fiecare etapă.

Timpul necesar îndeplinirii lucrărilor

Tabelul N1

Timpul necesar pentru elaborarea proiectului a fost calculat cu ajutorul metodei de calcul paralel–consecutive, din cauza că multe procese sau îndeplinit în paralel. Conform planului calendaristic timpul necesar pentru elaborarea proiectului este 69 de zile.

Planul calendaristic a elaborării proiectului de diplomă cu tema:

“Un sistem de gestionare Bazei de Date a unei întreprinderi micului business”

Tabelul N2

Cheltuielile de elaborare a proiectului

Aceste cheltuieli sunt prezentate în tabelul 3.1 de mai jos

Calculul prețurilor pentru a produce o plachetă

Tabela 3.1.

6.4. Calculul remunerării muncii

Remunerarea muncii în procesul de elaborare și testare ocupă un loc de bază. De acest factor depind: calitatea de asamblare, timpul de elaborare, testare, implementare. Salarizarea este un factor important în procesul de elaborare și asamblare .Micșorarea timpului de elaborare conduce la micșorarea cheltuielilor legate de elaborare.

De luat în considerație și alocațiile pentru organele sociale de asigurare, care alcătuiesc 31% din salariu, acesta este în valoare de 296.67 lei. Aceste date le introducem în tabelul N6.3.2.

Calculul salariului și fondului social

Tabela N6.4.1.

Calculul amortizării utilajului

Deasemenea este necesar de a lua în considerație costul utilajului special, care se cumpără, se fabrică și complect se utilizează pentru proiectare și elaborare. În cazul nostru așa utilaj special nu se folosește, ci este folosit numai utilajul, care a fost folosit mai înainte pentru alte scopuri și care va fi folosit și în viitor. Deaceia costul acestui utilaj se exprimă prin cheltuielile de amortizare și sînt reflectate în tabela de mai jos.

Norma amortizării se ia pentru restaurarea complectă a utilajului. Suma de amortizare se primește pe calea înmulțirii timpului de lucru a utilajului la alocările pentru amortizare.

La proiectare în calitate de mijloc principal a fost folosit un calculator IP366Mhz, la un preț de 7800 lei, care avea asigurarea programelor de sistemă și de asemenea programelor pentru proiectare Bazei de Date a fost folosit pachetul de programe Delphi si InterBace.

Amortizarea se calculă în felul următor:

A=P *T*N

unde P – prețul utilajului;

T – timpul de funcționare;

N – norma de amortizare.

AHP=7800*0.17*0.25=331,50lei

AImp=3250*0.022*0.25= 17.9 lei

ADelphi=600*0.1*0.33= 19.8 lei

Calculul amortizației și cheltuielile folosite la amortizarea mijloacelor principale de proiectare

Tabela 6.5

Celelalte cheltuieli

Cheltuieli directe

Cheltuielile directe în cazul dat sunt cheltuieli pe energie. Ele pot fi calculate în dependență de consumul de putere a utilajului, timpului de lucru și costul unui kW/h după formula:

E=P*N*K

unde N – numărul de ore;

P – puterea consumată pentru utilajul electric;

K – prețul 1kW/h.

După planul calendaristic se vede că numărul de zile lucrate la calculator este de 69, iar la imprimantă 36 zile, deci timpul lucrat va fi corespunzător:

Nc =69*8= 552 ore Ni =36*8= 496 ore

Atunci avem că :

Ec = 552*0.13*0.65 = 46.6 lei

Ei = 288*0.13*0.65 = 24.4 lei

Deci totalul cheltuielilor pe energia electrică va constitui 71 de lei.

Calculul cheltuielilor de regie

Cheltuielile suplimentare includ următoarele cheltuieli: cheltuieli legate de gestionare, cheltuieli legate de repararea încăperilor de producție, a utilajului și inventarului, protecția muncii și a mediului ambiant .

Mărimea cheltuielilor suplimentare se calculă în procente și constituie 120-200% de la salariul de bază și cel suplimentar.

În cazul proiectului dat cheltuelele suplimentare vor constitui respectiv :1914 lei.

Calcularea cheltuielilor de proiectarea Bazei de Date.

Cheltuielile de elaborare a sistemului pentru monitorizarea proceselor tehnologice.

Tabelul 6.6.1.

Calculul efectului economic

Pentru a estima efectul economic obținut în urma proiectarii Bazei de Date, se va calcula coeficientul de eficiență științifică și de eficiență tehnico – științifice după formulele:

eficiența științifică –

eficiența tehnico – științifică –

unde: Kf.p. – coeficientul factorului de pondere,

Kc.r. – coeficientul rezultatului.

În tabelele de mai jos sunt prezentați coeficienții rezultatului obținuți, care exprimă diferite caracteristici ale studiului prezent ca: noutatea și utilitatea cercetărilor efectuate, aplicabilitatea rezultatelor obținute, terminabilitatea proiectului, etc. Calculând eficiența științifică și cea tehnico – științifică, și comparându-le cu unitatea ( cu cât sunt mai aproape de unu cu atât eficiența este mai mare ) vom putea trage concluzii finale din punct de vedere economic despre proiectul dat.

Tabela 6.8.1

Tabela 6.8.2

Conform datelor și formulelor prezentate mai sus am obținut următoarele valori:

Kș. = 0.5*0.5 + 0.35*0.6 + 0.15*0.6 = 0.45

Kt.ș. = 0.5*0.5 + 0.3*0.8 + 0.2*0.8 = 0.65

Deoarece utilitatea unei cercetări științifice la prima vedere este greu de estimat, totuși pe baza coeficienților calculați mai sus putem afirma că rezultatele obținute sunt de nivel mediu și reprezintă niște rezultate acceptabile având în vedere proiectul dat și suma mare de bani cheltuită pentru realizarea sa.

5.1. Planificarea rețea pentru elaborarea SI “Proiectarea unui sistem de gestionare Bazei de Date micului business”

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.

Graful-rețea. Tabelul 5.1.

Continuarea tabelului 5.1.

Continuarea tabelului 5.1.

Continuarea tabelului 5.1.

Continuarea tabelului 5.1.

Sch. 5.1. Graful-rețea pentru elaborarea SI “Proiectarea unui sistem de gestionare Bazei de Date micului business”.

Continuarea sch. 5.1. Graful-rețea pentru elaborarea SI “Proiectarea unui sistem de gestionare Bazei de Date micului business”.

Încheiere.

Deoarece baza de date creată este implementată sub formă de SQL script, care corespunde ANSI standardelor, baza de date poate fi creată și exploatată sub un alt sistem de gestiune al bazelor de date moderne, la care UTM ar avea licență, fie și așa sisteme ca Oracle, DB2, Informix, etc. Programul “Baza Auto” nu necesită modificări, trebuie doar create driver-e de legătură cu aceste SGBD utilizând fie ODBC sau BDE.

De asemenea informația din baza de date poate fi utilizată pentru verificarea veridicității documentelor prezentate. De exemplu eventual poate fi efectuată verificarea veridicității diplomelor de studii prezentate dacă există o bază de date a documentelor eliberate în Ministerul Învățământului.

În caz că la exploatarea pe viitor vor apărea necesități de modificare a formelor de intrare, ele trebuie efectuate atât în baza de date, cât și în programele respective. Modificările bazei de date pot fi efectuate la crearea bazei de date, introducând schimbări în SQL scripturi, sau în timpul exploatării sistemului, utilizând instrucțiunile ALTER. Modificările programelor pot fi ușor efectuate, deoarece toate formele de lucru cu baza de date sunt implementate utilizând aceiași tehnologie de interacțiune cu SGBD. Se schimbă componentele necesare pe formă, iar apoi se introduc modificări în SQL instrucțiunea care efectuează cererea la SGBD.

Bibliografie.

InterBase 5 Server. Language Reference. Formă electronică

InterBase 5 Server. Data Definition Guide. Formă electronică

InterBase 5 Server. Operations Guide. Formă electronică

InterBase 5 Server. Programmer’s Guide. Formă electronică

InterBase 5 Server. API Reference Guide. Formă electronică

Страуструп Б. Язык программирования Delphi. Formă electronică.

Шумаков П. В. Delphi 5 и разработка приложений баз данных.-М.: «Нолидж»1999.-704с.

Шилдт Г. Самоучитель Delphi. -СПб.:BHV –688c.

Грофф Дж. SQL полное руководство. -Kieв.:BHV –608c.

Энсор Д. Oracle 8: Рекомендации разработчикам. -Kieв.:BHV –128c.

Стивенс Р. SQL за 24 часа. Освой самостоятельно. -:Бином – 400c.

Грабер М. SQL: справочное руководство -:ЛОРИ – 287c.

Грабер М. Введение в SQL. -:ЛОРИ.

Йордан Э. Структурные модели в объектно-ориентированном анализе и проектировании. -:ЛОРИ.

Бадд Т. ООП в действии. -:Питер – 460с.

Поттс С. Borland Delphi в примерах. -:ПОПУРРИ –751с.

ANEXE.

Anexa nr. 1. SQL pentru crearea bazei de date :

Connect "c:\auto.gdb" USER STELA PASSWORD ****;

create table fio

(

cod_luc int not null primary key,

familia varchar(30) not null,

numele varchar(20) not null,

prenumele varchar(30) not null,

adres1 varchar(30),

adres2 varchar(30),

adres3 varchar(30),

adres4 varchar(30)

);

create table nation

(

cod_nat int not null primary key,

nation varchar(20) not null

);

create table martial

(

cod_mart int not null primary key,

martial varchar(20) not null

);

create table driv_lic

(

cod_driv int not null primary key,

driv_lic varchar(20) not null

);

create table inf_pers

(

cod_luc int not null,

tel1 varchar(20),

tel2 varchar(20),

tel3 varchar(20),

an_nas date,

sex smallint,

cod_nat smallint,

cod_mart smallint,

cod_driv smallint,

foreign key (cod_luc) references fio(cod_luc),

foreign key (cod_nat) references nation(cod_nat),

foreign key (cod_mart) references martial(cod_mart),

foreign key (cod_driv) references driv_lic(cod_driv)

);

create table functii

(

cod_func int not null primary key,

functii varchar(30)

);

create table rute

(

cod_rut int not null primary key,

descriptia varchar(50) not null,

punct_i varchar(20),

punct_f varchar(20),

timp_r int,

km_r int,

venit numeric(10,2) not null

);

create table act_mas

(

cod_act int not null primary key,

activ varchar(20)

);

create table masini

(

cod_mas int not null primary key,

num_inr varchar(10) not null,

color varchar(30),

descriere varchar(50),

tip_mas varchar(20) not null,

varst_mas int,

cod_act smallint,

cod_rut int,

foreign key (cod_rut) references rute(cod_rut),

foreign key (cod_act) references act_mas(cod_act)

);

create table inf_serv

(

cod_luc int not null,

cod_func int,

ore_sapt int,

cod_mas int,

dat_ang date,

foreign key (cod_luc) references fio(cod_luc),

foreign key (cod_func) references functii(cod_func),

foreign key (cod_mas) references masini(cod_mas)

);

create table clienti

(

cod_cli int not null primary key,

den_cli varchar(50) not null,

adres1 varchar(30),

adres2 varchar(30),

adres3 varchar(30),

adres4 varchar(30),

tel1 varchar(20),

tel2 varchar(20),

tel3 varchar(20),

tip_cli char(15) not null,

part_cli char(2)

);

create table comenzi

(

cod_com int not null primary key,

data_c date not null,

cod_mas int not null,

cod_cli int not null,

dur_c smallint,

zil_s smallint,

suma numeric(10,2) not null,

foreign key (cod_cli) references clienti(cod_cli),

foreign key (cod_mas) references masini(cod_mas)

);

create table tipch

(

tip_ch int not null primary key,

desc_ch char(50)

);

create table cheltuieli

(

cod_ch int not null primary key,

data_ch date not null,

tip_ch int not null,

debit varchar(15) not null,

credit varchar(15) not null,

suma_ch numeric(10,2) not null,

foreign key (tip_ch) references tipch(tip_ch)

);

Listingul programei :

program Project1;

uses

Forms,

Main in 'Main.pas' {Form1},

Childwin in 'Childwin.pas' {MDIChild},

TabInfo in 'TabInfo.pas' {Tabel},

Mashw in 'Mashw.pas' {F_MASINI},

WRute in 'WRute.pas' {F_RUTE},

WComenzi in 'WComenzi.pas' {F_COMENZI},

WCheltuieli in 'WCheltuieli.pas' {F_CHELTUIELI},

WClienti in 'WClienti.pas' {F_CLIENTI};

{$R *.RES}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.CreateForm(TTabel, Tabel);

Application.Run;

end.

unit Childwin;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls, ComCtrls, Db, Grids, DBGrids,

IBCustomDataSet, IBQuery, Buttons, Mask, DBCtrls, IBDatabase;

type

TMDIChild = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

DBGrid1: TDBGrid;

IBQuery1: TIBQuery;

DataSource1: TDataSource;

Panel1: TPanel;

PageControl2: TPageControl;

TS_INF_PERS: TTabSheet;

TS_INF_SERV: TTabSheet;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

E_NAT: TEdit;

E_MSTAT: TEdit;

E_PERMCOND: TEdit;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

CB_SEX: TComboBox;

Label13: TLabel;

SP_LEFT: TSpeedButton;

SP_RIGHT: TSpeedButton;

SB_NAT: TSpeedButton;

SB_MSTAT: TSpeedButton;

SB_PERMCOND: TSpeedButton;

Label14: TLabel;

Label15: TLabel;

Label16: TLabel;

Label17: TLabel;

E_OREPES: TEdit;

E_VECSERV: TEdit;

Label18: TLabel;

DTP_DATAANG: TDateTimePicker;

DTP_DATANAST: TDateTimePicker;

UpDown1: TUpDown;

E_FUNCTIA: TEdit;

SB_FUNCTIA: TSpeedButton;

DBLookupComboBox1: TDBLookupComboBox;

IBQ_TEMP: TIBQuery;

DS_TEMP: TDataSource;

Button1: TButton;

E_CODANG: TEdit;

E_FAMILIA: TEdit;

E_NUMELE: TEdit;

E_PRENUMELE: TEdit;

E_ADRESA1: TEdit;

E_ADRESA2: TEdit;

E_ADRESA3: TEdit;

E_ADRESA4: TEdit;

E_TELEFON1: TEdit;

E_TELEFON2: TEdit;

E_TELEFON3: TEdit;

BitBtn1: TBitBtn;

Image1: TImage;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure GetInfo;

procedure FormCreate(Sender: TObject);

procedure ArrowsIni;

function Number_Rec(TableName :String) :Integer;

procedure StrToSql(SQLString :String);

procedure GetData;

procedure FieldChange(Sender: TObject);

procedure InsertRec;

procedure UpdateRec;

procedure SBClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

function IfKeyNull : Boolean;

procedure IfTabGol;

procedure SP_RIGHTClick(Sender: TObject);

procedure SP_LEFTClick(Sender: TObject);

procedure DBGrid1CellClick(Column: TColumn);

private

{ Private declarations }

public

{ Public declarations }

end;

var ChangeVal : Boolean;

v_nat,v_mart,v_driv,v_func : integer;

implementation

uses Main, TabInfo;

{$R *.DFM}

procedure TMDIChild.IfTabGol;

begin

if Form1.Gol(E_CODANG.Text) then

begin

InsertRec;

GetData;

end;

end;

function TMDIChild.IfKeyNull;

begin

Result:=False;

if Form1.Gol(E_Familia.Text) or Form1.Gol(E_Numele.Text) or Form1.Gol(E_PreNumele.Text) then Result:=True;

if (v_mart=-1) or (v_nat=-1) or (v_driv=-1) then Result:=True;

if Result then ShowMessage('Cimpurile de baza sunt goale');

end;

function TMDIChild.Number_Rec(TableName :String) :Integer;

begin

IBQ_TEMP.Close;

IBQ_TEMP.Sql.Text:='SELECT COUNT(*) FROM '+TableName;

IBQ_TEMP.Active:=True;

Result:=IBQ_TEMP.Fields[0].AsInteger;

end;

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action := caFree;

end;

procedure TMDIChild.GetInfo;

begin

IBQuery1.Sql.Text:='SELECT A.*, B.*, C.*'+

'FROM FIO A, INF_PERS B, INF_SERV C WHERE A.COD_LUC=B.COD_LUC AND A.COD_LUC=C.COD_LUC';

IBQuery1.Active:=True;

end;

procedure TMDIChild.GetData;

begin

E_CodAng.Text:=IBQuery1.FieldByName('Cod_luc').AsString;

E_Familia.Text:=IBQuery1.FieldByName('Familia').AsString;

E_Numele.Text:=IBQuery1.FieldByName('Numele').AsString;

E_PreNumele.Text:=IBQuery1.FieldByName('PreNumele').AsString;

E_Adresa1.Text:=IBQuery1.FieldByName('Adres1').AsString;

E_Adresa2.Text:=IBQuery1.FieldByName('Adres2').AsString;

E_Adresa3.Text:=IBQuery1.FieldByName('Adres3').AsString;

CB_Sex.ItemIndex:=IBQuery1.FieldByName('Sex').AsInteger;

DTP_DATANAST.DATE:=IBQuery1.FieldByName('An_Nas').AsDateTime;

E_Telefon1.Text:=IBQuery1.FieldByName('Tel1').AsString;

E_Telefon2.Text:=IBQuery1.FieldByName('Tel2').AsString;

E_Telefon3.Text:=IBQuery1.FieldByName('Tel3').AsString;

if IBQuery1.FieldByName('cod_nat').AsString<>'' then

begin

E_Nat.Text:=Form1.GetValData('nation','cod_nat',IBQuery1.FieldByName('cod_nat').AsString);

v_nat:=IBQuery1.FieldByName('cod_nat').AsInteger;

end else v_nat:=-1;

if IBQuery1.FieldByName('cod_mart').AsString<>'' then

begin

E_MStat.Text:=Form1.GetValData('martial','cod_mart',IBQuery1.FieldByName('cod_mart').AsString);

v_mart:=IBQuery1.FieldByName('cod_mart').AsInteger;

end else v_mart:=-1;

if IBQuery1.FieldByName('cod_driv').AsString<>'' then

begin

E_PERMCOND.Text:=Form1.GetValData('driv_lic','cod_driv',IBQuery1.FieldByName('cod_driv').AsString);

v_driv:=IBQuery1.FieldByName('cod_driv').AsInteger;

end else v_driv:=-1

end;

procedure TMDIChild.ArrowsIni;

begin

SP_Right.Enabled:=not IBQuery1.Eof;

SP_Left.Enabled:= not IBQuery1.Bof;

end;

procedure TMDIChild.FormCreate(Sender: TObject);

begin

ChangeVal:=False;

GetInfo;

GetData;

ArrowsIni;

IfTabGol;

end;

procedure TMDIChild.StrToSql(SQLString :String);

begin

IBQ_Temp.Close;

IBQ_Temp.SQL.Text:=SQLString;

IBQ_Temp.Active:=True;

end;

procedure TMDIChild.InsertRec;

var COD_LUC : integer;

begin

StrToSql('SELECT MAX(COD_LUC) FROM FIO');

cod_luc:=IBQ_Temp.Fields[0].AsInteger+1;

IBQuery1.Active:=False;

StrToSql('INSERT INTO FIO (COD_LUC, FAMILIA, NUMELE, PRENUMELE) VALUES ( '+IntToStr(COD_LUC)+', '' '', '' '', '' '');');

StrToSql('INSERT INTO INF_PERS (COD_LUC) VALUES ( '+IntToStr(COD_LUC)+');');

StrToSql('INSERT INTO INF_SERV (COD_LUC) VALUES ( '+IntToStr(COD_LUC)+');');

IBQuery1.Active:=True;

IBQuery1.Last;

end;

procedure TMDIChild.UpDateRec;

begin

StrToSql('UPDATE FIO SET FAMILIA='''+E_FAMILIA.Text+''',NUMELE='''+E_NUMELE.Text+''',PRENUMELE='''+E_PRENUMELE.Text+''',ADRES1='''+E_ADRESA1.Text+''',ADRES2='''+E_ADRESA2.Text+''',ADRES3='''+E_ADRESA3.Text+''' WHERE COD_LUC='+E_CODANG.Text);

StrToSql('UPDATE INF_PERS SET TEL1='''+E_TELEFON1.Text+''',TEL2='''+E_TELEFON2.Text+''',TEL3='''+E_TELEFON3.Text+''',AN_NAS='''+DATETOSTR(DTP_DATANAST.DATE)+''',SEX='''+INTTOSTR(CB_Sex.ItemIndex)+''',COD_NAT='''+INTTOSTR(V_NAT)+''',COD_MART='''+INTTOSTR(V_MART)+''',COD_DRIV='''+INTTOSTR(V_DRIV)+''' WHERE COD_LUC='+E_CODANG.Text);

ChangeVal:=False;

end;

procedure TMDIChild.FieldChange(Sender: TObject);

begin

ChangeVal:=True;

end;

procedure TMDIChild.SBClick(Sender: TObject);

begin

Case TComponent(Sender).Tag of

1 : begin

tab_name:='nation';

Tabel.Caption:='Nationalitatea'

end;

2 : begin

tab_name:='martial';

Tabel.Caption:='Martial Status'

end;

3 : begin

tab_name:='driv_lic';

Tabel.Caption:='Permis de conducere'

end;

4 : begin

tab_name:='functii';

Tabel.Caption:='Functii'

end;

end;

Tabel.ShowModal;

end;

procedure TMDIChild.Button1Click(Sender: TObject);

begin

if not IfKeyNull then InsertRec;

GetData;

end;

procedure TMDIChild.BitBtn1Click(Sender: TObject);

begin

if not IfKeyNull then UpDateRec;

end;

procedure TMDIChild.SP_RIGHTClick(Sender: TObject);

begin

// if ChangeVal then UpDateRec;

IBQuery1.Next;

GetData;

ArrowsIni;

end;

procedure TMDIChild.SP_LEFTClick(Sender: TObject);

begin

// if ChangeVal then UpDateRec;

IBQuery1.Prior;

GetData;

ArrowsIni;

end;

procedure TMDIChild.DBGrid1CellClick(Column: TColumn);

begin

showmessage('hfggh');

end;

end.

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Db, IBDatabase, StdCtrls, IBCustomDataSet, IBQuery, Buttons, ExtCtrls,

Menus, ActnList, StdActns, ComCtrls, ToolWin, IBTable;

type

TForm1 = class(TForm)

IBQuery1: TIBQuery;

IBDatabase1: TIBDatabase;

IBTransaction1: TIBTransaction;

Panel1: TPanel;

SP_PERS: TSpeedButton;

ActionList1: TActionList;

MainMenu1: TMainMenu;

Window1: TMenuItem;

ArrangeAll1: TMenuItem;

Cascade1: TMenuItem;

Tile1: TMenuItem;

WindowArrange1: TWindowArrange;

WindowCascade1: TWindowCascade;

WindowTileVertical1: TWindowTileVertical;

SP_AUTO: TSpeedButton;

SP_RUTE: TSpeedButton;

SP_CLIENTI: TSpeedButton;

SP_CHELT: TSpeedButton;

SP_COMENZI: TSpeedButton;

View1: TMenuItem;

Personal1: TMenuItem;

Masini1: TMenuItem;

Rute1: TMenuItem;

Clienti1: TMenuItem;

Cheltuieli1: TMenuItem;

Comenzi1: TMenuItem;

procedure SP_PERSClick(Sender: TObject);

function Gol(Stroca :String) : Boolean;

procedure SP_AUTOClick(Sender: TObject);

procedure SP_RUTEClick(Sender: TObject);

function GetValData(TabName,CodName,Val : String) : String;

procedure SP_CLIENTIClick(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure Error(Sender: TObject; E: Exception);

procedure UpDateRec( Table : TIBTable);

procedure SP_CHELTClick(Sender: TObject);

procedure SP_COMENZIClick(Sender: TObject);

procedure Personal1Click(Sender: TObject);

procedure Masini1Click(Sender: TObject);

procedure Rute1Click(Sender: TObject);

procedure Clienti1Click(Sender: TObject);

procedure Cheltuieli1Click(Sender: TObject);

procedure Comenzi1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1 : TForm1;

tab_name : String;

implementation

uses Childwin, Mashw, WRute, WClienti, WCheltuieli, WComenzi;

{$R *.DFM}

function TForm1.Gol (Stroca :String) : Boolean;

begin

while Pos(' ',Stroca)<>0 do delete(stroca,pos(' ',stroca),1);

Result:=Stroca='';

end;

function TForm1.GetValData(TabName,CodName,Val : String) : String;

begin

IBQuery1.Close;

IBQuery1.Sql.Text:='SELECT * FROM '+TabName+' WHERE '+CodName+'='+Val;

IBQuery1.Active:=True;

Result:=IBQuery1.Fields[1].AsString;

end;

procedure TForm1.SP_PERSClick(Sender: TObject);

var Child : TMDIChild;

begin

Child:=TMDIChild.Create(Application);

Child.Height := 396;

Child.Width := 561;

Child.Caption:='Angajatii';

end;

procedure TForm1.SP_AUTOClick(Sender: TObject);

var MasChild : TF_MASINI;

begin

MasChild:=TF_MASINI.Create(Application);

MasChild.Height:=286;

MasChild.Width:=468;

MasChild.Caption:='AutoVehicole';

end;

procedure TForm1.SP_RUTEClick(Sender: TObject);

var RutChild : TF_RUTE;

begin

RutChild:=TF_RUTE.Create(Application);

RutChild.Height := 277;

RutChild.Width := 561;

RutChild.Caption:='Rute';

end;

procedure TForm1.SP_CLIENTIClick(Sender: TObject);

var CliChild : TF_CLIENTI;

begin

CliChild:=TF_CLIENTI.Create(Application);

CliChild.Height:=289;

CliChild.Width:=506;

CliChild.Caption:='Clienti';

end;

procedure TForm1.Error(Sender: TObject; E: Exception);

var S: String;

poz :integer;

begin

S:=E.Message;

if Pos('Field',S)<>0 then

begin

poz:=pos('Field',s);

Delete(S,poz,length('Field'));

Insert('Cimpul',S,poz);

end;

if Pos('must have a value',S)<>0 then

begin

poz:=pos('must have a value',s);

Delete(S,poz,length('must have a value'));

Insert('trebuie sa posede o valoare',S,poz);

end;

ShowMessage(S);

end;

procedure TForm1.UpDateRec( Table : TIBTable);

begin

if Table.State=dsEdit then

begin

if MessageDlg('Sa salvam modificarile ?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then Table.ApplyUpdates else Table.Cancel;

end;

end;

procedure TForm1.FormActivate(Sender: TObject);

begin

Application.OnException:=Error;

end;

procedure TForm1.SP_CHELTClick(Sender: TObject);

var CheltChild : TF_CHELTUIELI;

begin

CheltChild:=TF_CHELTUIELI.Create(Application);

CheltChild.Height:=289;

CheltChild.Width:=506;

CheltChild.Caption:='Cheltuieli';

end;

procedure TForm1.SP_COMENZIClick(Sender: TObject);

var ComChild : TF_COMENZI;

begin

ComChild:=TF_COMENZI.Create(Application);

ComChild.Height:=212;

ComChild.Width:=503;

ComChild.Caption:='Comenzi';

end;

procedure TForm1.Personal1Click(Sender: TObject);

begin

SP_PERSClick(Self);

end;

procedure TForm1.Masini1Click(Sender: TObject); begin

SP_AUTOClick(Self);

end;

procedure TForm1.Rute1Click(Sender: TObject);

begin

SP_RUTEClick(Self);

end;

procedure TForm1.Clienti1Click(Sender: TObject);

begin

SP_CLIENTIClick(Self);

end;

procedure TForm1.Cheltuieli1Click(Sender: TObject);

begin

SP_CHELTClick(Self);

end;

procedure TForm1.Comenzi1Click(Sender: TObject);

begin

SP_COMENZIClick(Self);

end;

end.

unit Mashw;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls, ExtCtrls, Buttons, IBQuery, Db, IBCustomDataSet, IBTable,

Grids, DBGrids, StdCtrls, Mask, DBCtrls;

type

TF_MASINI = class(TForm)

PageControl1: TPageControl;

TS_MAS_TABELAR: TTabSheet;

TS_MAS_DETALIAT: TTabSheet;

P_MASINI_TOP_PANEL: TPanel;

DBG_MASINI: TDBGrid;

DS_MASINI: TDataSource;

IBT_MASINI: TIBTable;

SP_RIGHT: TSpeedButton;

SP_LEFT: TSpeedButton;

Image1: TImage;

DBE_CODMAS: TDBEdit;

DBE_NUMINR: TDBEdit;

DBE_COLOR: TDBEdit;

DBE_TIPMAS: TDBEdit;

DBE_VARSTA: TDBEdit;

DBE_DESCRIERE: TDBEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

E_ACTIVITATEA: TEdit;

SB_ACTIVITATEAMAS: TSpeedButton;

IBQ_MASINI: TIBQuery;

CB_DENUMRUTEI: TComboBox;

Button1: TButton;

Label9: TLabel;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure FormCreate(Sender: TObject);

procedure Insert;

procedure SP_RIGHTClick(Sender: TObject);

procedure SP_LEFTClick(Sender: TObject);

procedure ArrowsIni;

procedure CB_DENUMRUTEIDropDown(Sender: TObject);

procedure SB_ACTIVITATEAMASClick(Sender: TObject);

procedure DBE_CODMASChange(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure CB_DENUMRUTEIChange(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var v_act : integer;

implementation

uses Main, WRute, TabInfo, Childwin;

{$R *.DFM}

procedure TF_MASINI.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

Form1.UpDateRec(IBT_MASINI);

end;

procedure TF_MASINI.Insert;

begin

IBQ_MASINI.SQL.Text:='SELECT MAX(COD_MAS) FROM MASINI';

IBQ_MASINI.Active:=True;

IBT_MASINI.Insert;

DBE_CODMAS.Text:=IntToStr(IBQ_MASINI.Fields[0].AsInteger+1);

end;

procedure TF_MASINI.FormCreate(Sender: TObject);

begin

SP_Left.Enabled:=False;

If IBT_MASINI.IsEmpty then Insert;

end;

procedure TF_MASINI.SP_RIGHTClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_MASINI);

IBT_MASINI.Next;

IBT_MASINI.Next;

ArrowsIni;

if SP_Right.Enabled then IBT_MASINI.Prior;

end;

procedure TF_MASINI.SP_LEFTClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_MASINI);

IBT_MASINI.Prior;

IBT_MASINI.Prior;

ArrowsIni;

if SP_Left.Enabled then IBT_MASINI.Next;

end;

procedure TF_MASINI.ArrowsIni;

begin

SP_Right.Enabled:=not IBT_MASINI.Eof;

SP_Left.Enabled:= not IBT_MASINI.Bof;

end;

procedure TF_MASINI.CB_DENUMRUTEIDropDown(Sender: TObject);

begin

CB_DENUMRUTEI.Clear;

IBQ_MASINI.SQL.Text:='SELECT DESCRIPTIA FROM RUTE';

IBQ_MASINI.Active:= True;

While not IBQ_MASINI.Eof do

begin

CB_DENUMRUTEI.Items.Add(IBQ_MASINI.Fields[0].AsString);

IBQ_MASINI.Next;

end;

end;

procedure TF_MASINI.SB_ACTIVITATEAMASClick(Sender: TObject);

begin

tab_name:='act_mas';

Tabel.Caption:='Activitatea';

Tabel.ShowModal;

IBT_MASINI.FieldByName('cod_act').AsInteger:=v_act;

end;

procedure TF_MASINI.DBE_CODMASChange(Sender: TObject);

begin

Form1.ActiveMDIChild.Caption:='Autovehicole '+IBT_MASINI.FieldByName('num_inr').AsString;

if IBT_MASINI.FieldByName('cod_act').AsString<>'' then E_ACTIVITATEA.Text:=Form1.GetValData('act_mas','cod_act',IBT_MASINI.FieldByName('cod_act').AsString) else E_ACTIVITATEA.Text:='';

if IBT_MASINI.FieldByName('cod_rut').AsString<>'' then CB_DENUMRUTEI.Text:=Form1.GetValData('rute','cod_rut',IBT_MASINI.FieldByName('cod_rut').AsString) else CB_DENUMRUTEI.Text:='';

end;

procedure TF_MASINI.Button1Click(Sender: TObject);

begin

Form1.UpDateRec(IBT_MASINI);

IBT_MASINI.ApplyUpdates;

Insert;

end;

procedure TF_MASINI.CB_DENUMRUTEIChange(Sender: TObject);

begin

IBT_MASINI.Edit;

IBT_MASINI.FieldByName('cod_rut').AsInteger:=CB_DENUMRUTEI.ItemIndex+1;

end;

end.

unit TabInfo;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Db, IBCustomDataSet, IBQuery, DBCtrls;

type

TTabel = class(TForm)

SelBut: TButton;

Button2: TButton;

AddBut: TButton;

DelBut: TButton;

NewRec: TEdit;

ListBox1: TListBox;

procedure FormShow(Sender: TObject);

procedure AddButClick(Sender: TObject);

procedure DelButClick(Sender: TObject);

procedure StrToSql(SqlStr : String);

procedure SelButClick(Sender: TObject);

procedure ListBox1DblClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Tabel: TTabel;

implementation

uses Main, Childwin, Mashw, WCheltuieli;

{$R *.DFM}

procedure TTabel.FormShow(Sender: TObject);

begin

ListBox1.Clear;

StrToSql('SELECT * FROM '+tab_name);

While not Form1.IBQuery1.Eof do

begin

ListBox1.Items.Add(Form1.IBQuery1.Fields[1].AsString);

Form1.IBQuery1.Next;

end;

end;

procedure TTabel.StrToSql(SqlStr : String);

begin

Form1.IBQuery1.Active:=False;

Form1.IBQuery1.Sql.Text:=SqlStr;

Form1.IBQuery1.Active:=True;

end;

procedure TTabel.AddButClick(Sender: TObject);

var ident :integer;

cod : string;

begin

if not Form1.Gol(NewRec.Text) then

begin

StrToSql('SELECT * FROM '+tab_name);

cod:=Form1.IBQuery1.Fields[0].FullName;

ident:=ListBox1.Items.Count;

Repeat

inc(ident);

StrToSql('SELECT COUNT(*) FROM '+tab_name+' WHERE '+cod+'='''+IntToStr(ident)+'''');

until Form1.IBQuery1.Fields[0].AsInteger=0;

StrToSql('INSERT INTO '+tab_name+' VALUES ('''+IntToStr(ident)+''','''+NewRec.Text+''')');

ListBox1.Items.Add(NewRec.Text);

NewRec.Clear;

end;

end;

procedure TTabel.DelButClick(Sender: TObject);

begin

if (ListBox1.Items.Count<>0) and (ListBox1.ItemIndex>=0) then

begin

Try

StrToSql('DELETE FROM '+tab_name+' WHERE '+tab_name+'='''+ListBox1.Items[ListBox1.ItemIndex]+'''');

ListBox1.Items.Delete(ListBox1.ItemIndex);

except ShowMessage('Acest cimp nu se permite de sters !!!');

FormShow(Self);

end;

end;

end;

procedure TTabel.SelButClick(Sender: TObject);

var Child : TMDIChild;

MasChild : TF_MASINI;

CheltChild : TF_CHELTUIELI;

begin

if ListBox1.ItemIndex>=0 then

begin

MasChild:=TF_MASINI(Form1.ActiveMDIChild);

Child:=TMDIChild(Form1.ActiveMDIChild);

CheltChild:=TF_CHELTUIELI(Form1.ActiveMDIChild);

if tab_name='tipch' then

begin

v_chelt:=ListBox1.ItemIndex+1;

CheltChild.DESC_CHELT.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

if tab_name='act_mas' then

begin

v_act:=ListBox1.ItemIndex+1;

MasChild.E_ACTIVITATEA.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

if tab_name='nation' then

begin

v_nat:=ListBox1.ItemIndex+1;

Child.E_NAT.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

if tab_name='martial' then

begin

v_mart:=ListBox1.ItemIndex+1;

Child.E_MSTAT.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

if tab_name='driv_lic' then

begin

v_driv:=ListBox1.ItemIndex+1;

Child.E_PERMCOND.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

if tab_name='functii' then

begin

v_func:=ListBox1.ItemIndex+1;

Child.E_FUNCTIA.Text:=ListBox1.Items[ListBox1.ItemIndex];

end;

Close;

end;

end;

procedure TTabel.ListBox1DblClick(Sender: TObject);

begin

SelButClick(Self);

end;

end.

unit WClienti;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, Mask, DBCtrls, ComCtrls, ExtCtrls, Db, Grids, DBGrids,

IBCustomDataSet, IBTable, Buttons;

type

TF_CLIENTI = class(TForm)

P_TOP_CLIENTI: TPanel;

PageControl1: TPageControl;

TS_TABELAR: TTabSheet;

TS_DETALIAT: TTabSheet;

Button1: TButton;

DBE_CODCLI: TDBEdit;

DBE_DENUMCLI: TDBEdit;

DBE_ADRESA1: TDBEdit;

DBE_ADRESA2: TDBEdit;

DBE_ADRESA3: TDBEdit;

DBE_ADRESA4: TDBEdit;

DBE_TEL1: TDBEdit;

DBE_TEL2: TDBEdit;

DBE_TEL3: TDBEdit;

DBE_TIPCLI: TDBEdit;

DBE_PARTENENTA: TDBEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

IBT_CLIENTI: TIBTable;

DBGrid1: TDBGrid;

DS_CLINTI: TDataSource;

SP_Right: TSpeedButton;

SP_Left: TSpeedButton;

Image1: TImage;

Label9: TLabel;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure SP_RightClick(Sender: TObject);

procedure SP_LeftClick(Sender: TObject);

procedure ArrowsIni;

procedure FormCreate(Sender: TObject);

procedure Insert;

procedure Button1Click(Sender: TObject);

procedure DBE_CODCLIChange(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

implementation

uses Main;

{$R *.DFM}

procedure TF_CLIENTI.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

Form1.UpDateRec(IBT_CLIENTI);

end;

procedure TF_CLIENTI.ArrowsIni;

begin

SP_Right.Enabled:=not IBT_CLIENTI.Eof;

SP_Left.Enabled:= not IBT_CLIENTI.Bof;

end;

procedure TF_CLIENTI.SP_RightClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_CLIENTI);

IBT_CLIENTI.Next;

IBT_CLIENTI.Next;

ArrowsIni;

if SP_Right.Enabled then IBT_CLIENTI.Prior;

end;

procedure TF_CLIENTI.SP_LeftClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_CLIENTI);

IBT_CLIENTI.Prior;

IBT_CLIENTI.Prior;

ArrowsIni;

if SP_Left.Enabled then IBT_CLIENTI.Next;

end;

procedure TF_CLIENTI.Insert;

begin

Form1.IBQuery1.SQL.Text:='SELECT MAX(COD_CLI) FROM CLIENTI';

Form1.IBQuery1.Active:=True;

IBT_CLIENTI.Insert;

DBE_CODCLI.Text:=IntToStr(Form1.IBQuery1.Fields[0].AsInteger+1);

end;

procedure TF_CLIENTI.FormCreate(Sender: TObject);

begin

SP_Left.Enabled:=False;

If IBT_CLIENTI.IsEmpty then Insert;

end;

procedure TF_CLIENTI.Button1Click(Sender: TObject);

begin

Form1.UpDateRec(IBT_CLIENTI);

IBT_CLIENTI.ApplyUpdates;

Insert;

end;

procedure TF_CLIENTI.DBE_CODCLIChange(Sender: TObject);

begin

Form1.ActiveMDIChild.Caption:='Clienti '+IBT_Clienti.FieldByName('den_cli').AsString;

end;

end.

unit WCheltuieli;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ComCtrls, ExtCtrls, Buttons, Mask, DBCtrls, Db,

IBCustomDataSet, IBTable, Grids, DBGrids;

type

TF_CHELTUIELI = class(TForm)

PageControl1: TPageControl;

P_TOP_CHELTUIELI: TPanel;

TS_TABELAR: TTabSheet;

TS_DETALIAT: TTabSheet;

Button1: TButton;

DBE_COD_CHELT: TDBEdit;

DBE_SUMA: TDBEdit;

DBE_DEBIT: TDBEdit;

DBE_CREDIT: TDBEdit;

DTChelt: TDateTimePicker;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

DESC_CHELT: TEdit;

SpeedButton1: TSpeedButton;

Label7: TLabel;

DS_CHELT: TDataSource;

IBT_CHELT: TIBTable;

Image1: TImage;

DBGrid1: TDBGrid;

SP_Left: TSpeedButton;

SP_Right: TSpeedButton;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure SP_RightClick(Sender: TObject);

procedure SP_LeftClick(Sender: TObject);

procedure ArrowsIni;

procedure FormCreate(Sender: TObject);

procedure Insert;

procedure SpeedButton1Click(Sender: TObject);

procedure DBE_COD_CHELTChange(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var v_chelt : integer;

implementation

uses Main, TabInfo;

{$R *.DFM}

procedure TF_CHELTUIELI.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

end;

procedure TF_CHELTUIELI.SP_RightClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_CHELT);

IBT_CHELT.Next;

IBT_CHELT.Next;

ArrowsIni;

if SP_Right.Enabled then IBT_CHELT.Prior;

end;

procedure TF_CHELTUIELI.SP_LeftClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_CHELT);

IBT_CHELT.Prior;

IBT_CHELT.Prior;

ArrowsIni;

if SP_Left.Enabled then IBT_CHELT.Next;

end;

procedure TF_CHELTUIELI.ArrowsIni;

begin

SP_Right.Enabled:=not IBT_CHELT.Eof;

SP_Left.Enabled:= not IBT_CHELT.Bof;

end;

procedure TF_CHELTUIELI.FormCreate(Sender: TObject);

begin

SP_Left.Enabled:=False;

If IBT_CHELT.IsEmpty then Insert;

end;

procedure TF_CHELTUIELI.Insert;

begin

Form1.IBQuery1.SQL.Text:='SELECT MAX(COD_CH) FROM CHELTUIELI';

Form1.IBQuery1.Active:=True;

IBT_CHELT.Insert;

DBE_COD_CHELT.Text:=IntToStr(Form1.IBQuery1.Fields[0].AsInteger+1);

end;

procedure TF_CHELTUIELI.SpeedButton1Click(Sender: TObject);

begin

tab_name:='tipch';

Tabel.Caption:='Tipul Cheltuielii';

Tabel.ShowModal;

IBT_CHELT.FieldByName('tip_ch').AsInteger:=v_chelt;

end;

procedure TF_CHELTUIELI.DBE_COD_CHELTChange(Sender: TObject);

begin

if IBT_CHELT.FieldByName('cod_ch').AsString<>'' then DESC_CHELT.Text:=Form1.GetValData('tipch','tip_ch',IBT_CHELT.FieldByName('cod_ch').AsString) else DESC_CHELT.Text:='';

if IBT_CHELT.FieldByName('data_ch').AsString<>'' then DTChelt.DateTime:=IBT_CHELT.FieldByName('data_ch').AsDateTime;

Form1.ActiveMDIChild.Caption:='Cheltuieli '+DESC_CHELT.Text;

end;

procedure TF_CHELTUIELI.Button1Click(Sender: TObject);

begin

IBT_CHELT.FieldByName('data_ch').AsString:=DateToStr(DTChelt.DateTime);

Form1.UpDateRec(IBT_CHELT);

IBT_CHELT.ApplyUpdates;

Insert;

end;

end.

unit WComenzi;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ComCtrls, ExtCtrls, Mask, DBCtrls, Grids, DBGrids, Db,

IBCustomDataSet, IBTable, Buttons;

type

TF_COMENZI = class(TForm)

P_TOP_COMENZI: TPanel;

PageControl1: TPageControl;

TS_TABELAR: TTabSheet;

TS_DETALIAT: TTabSheet;

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label7: TLabel;

DBECOD_COM: TDBEdit;

DBEMAS: TDBEdit;

ComboBox1: TComboBox;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

DBEDUR: TDBEdit;

DBEZIL: TDBEdit;

DBESUMA: TDBEdit;

SP_Left: TSpeedButton;

SP_Right: TSpeedButton;

IBT_COMENZI: TIBTable;

DSComenzi: TDataSource;

DBGrid1: TDBGrid;

Label8: TLabel;

Image1: TImage;

DTCOM: TDateTimePicker;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure ArrowsIni;

procedure FormCreate(Sender: TObject);

procedure Insert;

procedure SP_RightClick(Sender: TObject);

procedure SP_LeftClick(Sender: TObject);

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

F_COMENZI: TF_COMENZI;

implementation

uses Main;

{$R *.DFM}

procedure TF_COMENZI.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

end;

procedure TF_COMENZI.ArrowsIni;

begin

SP_Right.Enabled:=not IBT_COMENZI.Eof;

SP_Left.Enabled:= not IBT_COMENZI.Bof;

end;

procedure TF_COMENZI.FormCreate(Sender: TObject);

begin

SP_Left.Enabled:=False;

If IBT_COMENZI.IsEmpty then Insert;

end;

procedure TF_COMENZI.Insert;

begin

Form1.IBQuery1.SQL.Text:='SELECT MAX(COD_COM) FROM COMENZI';

Form1.IBQuery1.Active:=True;

IBT_COMENZI.Insert;

DBECOD_COM.Text:=IntToStr(Form1.IBQuery1.Fields[0].AsInteger+1);

end;

procedure TF_COMENZI.SP_RightClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_COMENZI);

IBT_COMENZI.Next;

IBT_COMENZI.Next;

ArrowsIni;

if SP_Right.Enabled then IBT_COMENZI.Prior;

end;

procedure TF_COMENZI.SP_LeftClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_COMENZI);

IBT_COMENZI.Prior;

IBT_COMENZI.Prior;

ArrowsIni;

if SP_Left.Enabled then IBT_COMENZI.Next;

end;

procedure TF_COMENZI.Button1Click(Sender: TObject);

begin

IBT_COMENZI.FieldByName('data_c').AsString:=DateToStr(DTCOM.DateTime);

Form1.UpDateRec(IBT_COMENZI);

IBT_COMENZI.ApplyUpdates;

Insert;

end;

end.

unit WRute;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Grids, DBGrids, ComCtrls, ExtCtrls, Db, IBCustomDataSet, IBQuery,

StdCtrls, Mask, DBCtrls, Buttons, IBTable;

type

TF_RUTE = class(TForm)

P_RUTE_TOP_PANEL: TPanel;

IBQ_RUTE: TIBQuery;

PageControl1: TPageControl;

TS_RUTE_TABELAR: TTabSheet;

TS_RUTE_DETALIAT: TTabSheet;

DBGrid1: TDBGrid;

DS_RUTE: TDataSource;

DBEdit1: TDBEdit;

DBEdit2: TDBEdit;

DBEdit3: TDBEdit;

DBEdit4: TDBEdit;

DBEdit5: TDBEdit;

DBEdit6: TDBEdit;

DBEdit7: TDBEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

SP_Right: TSpeedButton;

SP_Left: TSpeedButton;

IBT_RUTE: TIBTable;

Button1: TButton;

Image1: TImage;

Label8: TLabel;

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Insert;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure SP_RightClick(Sender: TObject);

procedure SP_LeftClick(Sender: TObject);

procedure ArrowsIni;

procedure DBEdit1Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var ChangeVal : Boolean;

implementation

uses Main;

{$R *.DFM}

procedure TF_RUTE.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action:=caFree;

Form1.UpDateRec(IBT_RUTE);

end;

procedure TF_RUTE.Insert;

begin

IBQ_RUTE.Sql.Text:='SELECT MAX(COD_RUT) FROM RUTE';

IBQ_RUTE.Active:=True;

IBT_RUTE.Insert;

DBEdit1.Text:=IntToStr(IBQ_RUTE.Fields[0].AsInteger+1);

end;

procedure TF_RUTE.FormCreate(Sender: TObject);

begin

SP_Left.Enabled:=False;

If IBT_RUTE.IsEmpty then Insert;

end;

procedure TF_RUTE.Button1Click(Sender: TObject);

begin

Form1.UpDateRec(IBT_RUTE);

IBT_RUTE.ApplyUpdates;

insert;

end;

procedure TF_RUTE.SP_RightClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_RUTE);

IBT_RUTE.Next;

IBT_RUTE.Next;

ArrowsIni;

if SP_Right.Enabled then IBT_RUTE.Prior;

end;

procedure TF_RUTE.ArrowsIni;

begin

SP_Right.Enabled:=not IBT_RUTE.Eof;

SP_Left.Enabled:= not IBT_RUTE.Bof;

end;

procedure TF_RUTE.SP_LeftClick(Sender: TObject);

begin

Form1.UpDateRec(IBT_RUTE);

IBT_RUTE.Prior;

IBT_RUTE.Prior;

ArrowsIni;

if SP_Left.Enabled then IBT_RUTE.Next;

end;

procedure TF_RUTE.DBEdit1Change(Sender: TObject);

begin

Form1.ActiveMDIChild.Caption:='Rute '+IBT_RUTE.FieldByName('descriptia').AsString;

end;

end.

Anexa Nr.2 View programului “Baza Auto”

Similar Posts

  • Dispozitiv Wireless Pentru Determinarea Saturatiei de Oxigen In Sange

    CUPRINS INTRODUCERE ANALIZA DISPOZITIVULUI DE DETERMINARE A NIVELULUI DE SATURAȚIE A OXIGENULUI IN SINGE Noțiuni generale Proprietatile fizice folosite in pulsoximetrie 1.3 Rolul saturatiei oxigenului in singe 1.4 Studierea si modul de functionarea a dispozitivului 1.5 Tipul si modul de amplasare a pulsoximetrului 1.6 Importanța pulsoximetriei 2 ALEGEREA COMPONENTELOR SI PROIECTAREA PULSOXIMETRULUI 2.1 Schema bloc…

  • Recunoasterea Obiectelor Folosind Procesarea Imaginilor

    Recunoașterea obiectelor folosind procesarea imaginilor A. Procesarea imaginilor pentru recunoașterea amprentelor 1.Introducere Tehnicile de prelucrare a imaginilor digitale: inceputul anilor 1920 (s-au transmis pentru prima oara imagini digitizate ale agentiilor de stiri prin cablu submarin intre New York si Londra). Procesarea imaginilor este un domeniu al inteligentei artificiale care se ocupa cu reprezentarea, reconstituirea, clasificarea,…

  • Sistem Informatic Pentru Un Cabinet Medical

    Introducere Fenomen de amploare mondială, Internetul cunoaște o evoluție incomparabilă cu cea a altor instrumente media, la dezvoltarea sa continua participând întreg mapamondul. El se extinde cu o viteză fantastică, tot mai mulți utilizatori se conectează zilnic la Internet avizi de informație. Dacă la începuturile acestui fenomen ajuns acum la scara planetară, lumea nu își…

  • Numere P Adice. Corpul Numerelor P Adice

    CAPITOLUL 1 CONSTRUCȚIA NUMERELOR P_ADICE ȘIRURI DE CONGRUENȚE 1.2. ÎNTREGI P_ADICI 1.3. DEZVOLTAREA HENSEL A ÎNTREGILOR P_ADICI 1.4. VALOAREA LUI 1.5 CORPUL AL NUMERELOR P-ADICĂ 1.6. SPAȚIUL METRIC VALORILE ABSOLUTE ALE LUI Q 1.8. VALORILE ABSOLUTE ALE CORPURILOR DE NUMERE CAPITOLUL 2 CORPURI VALUATE ULTRAMETRIC 2.1 VALUĂRI ȘI VALORI ABSOLUTE ULTRAMETRICE 2.2. PROPRIETĂȚI METRICE CORPURI…

  • Procesarea Paginilor Asp.net

    Cuprins ………………………………………………………………………………………….. 3 Introducere …………………………………………………………………………………….. 4 Integrarea temei într-un context teoretic general …………………………………. 5 Programarea …………………………………………………………………………….. 5 Tehnologii ……………………………………………………………………………………… 6 Microsoft Visual Studio …………………………………………………………….. 6 Limbaje de programare ………………………………………………………………7 Limbajul C# ………………………………………………………………………7 Prezentarea generală a temei………………………………………………………………8 Arhitectura N-Tier………………………………………………………………………8 ASP și ASP.NET………………………………………………………………………12 Structura paginilor ASP.NET……………………………………………..13 Procesarea paginilor ASP.NET……………………………………………15 SEO – Search Engine Optimization……………………………………..17 JavaScript, jQuery…………………………………………………………………….18 HTML5…