dare de seama la practic

35
Departamentul Educaţie, Ştiinţă, Tineret şi Sport Universitatea de Stat din Moldova Facultatea de Matematică şi Informatică Catedra Informatica aplicată Dare de seama la practica de producere

Upload: petru-binzari

Post on 16-Jan-2016

23 views

Category:

Documents


2 download

DESCRIPTION

df

TRANSCRIPT

Page 1: Dare de Seama La Practic

Departamentul Educaţie, Ştiinţă, Tineret şi Sport Universitatea de Stat din Moldova Facultatea de Matematică şi Informatică Catedra Informatica aplicată

Dare de seama la practica de producere

Chişinău 2006 Cuprins

Page 2: Dare de Seama La Practic

Întroducere.................................................................................................................3

Scurt istoric al corporaţiei.........................................................................................4

Structura generală a corporaţiei.................................................................................5

Lucrul efectuat în timpul practicii.............................................................................8

Sistemul de Operare UNIX....................................................................................8

ORACLE/SQL. PL/SQL. SQL*PLUS...................................................................10

Pro C....................................................................................................................20

Aplicaţia SGC.....................................................................................................24

Aplicaţia Power Builder......................................................................................26

Concluzie generală..................................................................................................26

2

Page 3: Dare de Seama La Practic

Întroducere

„Cel ce are informaţia – stapîneşte situaţia ”

Societatea modernă se caracterizează prin predominanţa proceselor informaţionale şi a

cunoaşterii, bazate pe tehnologia informaţiei şi a comunicaţiei, care conduc la re –

conceptualizarea şi re –ingineria tuturor sistemelor, la o cerere cît mai mare de servicii şi produse

informatice adecvate.

Termenul uzurii unui calculator este de cca 0.5 – 1 ani, iar al produselor informatice de

cca 3-5 ani, deaceea conform specialiştilor anual 65% aplicaţii se modifică cu o perioadă de

rezolvare de pînă la un an.

Volumul de informaţie creşte an de an vertiginos şi deaceea procesarea automată a

infomaţiei a devenit o cerinţă vitală pentru întreprinderi, asociaţii, organizaţii. Pentru

funcţionarea eficientă a unui produs soft sunt necesare informaţii selective, complete, veridice,

prezentate într-o formă uşor de înţeles şi de aplicat. Iar satisfacerea acestor cerinţe este posibilă

în condiţiile unor mijloace moderne ale informaticii şi telecomunicaţiilor

3

Page 4: Dare de Seama La Practic

Scurt istoric al corporaţiei

Pînă în anul 2000 în Republica Moldova activau 5 întreprinderi distribuitoare de energie electrică iar gestiunea energiei electrice se afla la un nivel inferior. Deconectările de la reţele erau frecvente şi îndelungate ceea ce împiedica dezvoltarea normală a activităţii industriale şi comerciale.

La 7 februarie 2000 în urma unui concurs investiţional, UNION FENOSA a achiziţionat pachetul total de acţiuni a 3 dintre cele 5 întreprinderi: I.C.S. RE Chişinău S.A , I.C.S. RED Centru S.A şi I.C.S. RED Sud S.A..

În rezultatul achiziţionării reţelelor s-a îmbunătăţit considerabil gestuinea acestora. În scurt timp a fost soluţionată problema deconectărilor frecvente şi îndelungate.Peste 750000 ai reţelelor electrice cu o lungime de cca 37 mii km au sesizat că atît condiţiile de livrare a energiei, cît şi calitatea serviciilor prestate s-a îmbunătăţit considerabil.

Din anul 2001 Banca pentru Reconstrucţie şi Dezvoltare (BERD) deţine un mic procent din acţiunile RE Chişinău, RED Centru şi RED Sud în acest mod devenind un partener de nădejde al grupului spaniol în Moldova.

Graţie lucrului constant cu furnizorii şi efortului financiar din partea grupului Union Fenosa deconectările s-au redus în timp scurt, iar încheierea contractelor pentru cumpărarea energiei electrice au devenit de lungă durată. Astfel întreprinderile moldoveneşti au posibilitatea de a activa în mod normal, iar 70% din populaţia ţării care sunt clienţii Union Fenosa nu mai au de suportat deconectări.

Principalul obiectiv al activităţii Union Fenosa în Moldova constă în dezvoltarea, susţinerea şi utilizarea utilajelor de transportare şi distribuire a energiei electrice pentru a asigura prestarea unui serviciu public calitativ, eficient şi sigur care nu afectează mediul ambiant.

Grupul Union Fenosa în Moldova a instalat la întreprinderile sale cele mai performante utilaje tehnice ceea ce a determinat îmbunătăţirea calităţii distribuirii energiei electrice.

În prezent RE Chişinău, RED Centru şi RED Sud distribuie energie electrică pe un arial de cca 21700 km2 , unde locuiesc cca 2300000 locuitori, prin intermediul a 7.8 mii substaţii, 9.1 mii transformatoare cu o capacitate totală de 2723.54 MV. În total în bilanţul RE Chişinău, RED Centru şi RED Sud se află 33405.356 km linii şi 2723.689 km de cablu.

Grupul Union Fenosa în Moldova foloseşte drept sistem informatic un sistem ce este compus din mai multe baze de date cum ar fi: SGCForm, SGCPro. Tot lucrul este asigurat de 2 superservere: unul numit „Serverul PRO” (Serverul de producere) pe care se află toate aplicaţiile finale şi un altul numit „Serverul DEV” (Server Secundar ) – server de control care conţine bazele de date PRE, DEV şi FORM. La datele de pe acest server au acces toţi lucrătorii UNION FENOSA.

Serverul de producere are în dotare 8 procesoare şi 16GB-RAM. Datele de aici sunt accesate doar de administratorii de sistem.

Sistemul şi bazele de date sunt administrate sub SO UNIX. Datele în interior sunt transmise prin linii de 256 Kb iar spre exterior, prin linii de 1024 Kb. Ruterele „CISCO” sunt conectate prin fibră optică reuşindu-se astfel comunicarea rapidă cu filialele din Moldova şi Spania.În cepînd din anul 2005 toate filialele Union Fenosa din Moldova au un singur serviciu tehnic cu sediul la Chiţinău numit „HelpDesk” care în caz de apariţie a problemelor în alte raioane încearcă să rezolve problema prin Remote Access sau se deplasează la faţa locului.

4

Page 5: Dare de Seama La Practic

5

Page 6: Dare de Seama La Practic

Structura generală a corporaţiei

6

Page 7: Dare de Seama La Practic

Departamentul Telecomunicaţii şi Sisteme

7

Page 8: Dare de Seama La Practic

8

Page 9: Dare de Seama La Practic

Lucrul efectuat în timpul practicii

În cadrul practicii au am fost selectat a lucra în secţia Sisteme Comerciale. Pe parcursul a 8 săptamîni de practică am studiat şi am aplicat în practică disciplinele conform planului:

SO UNIX SQL/ORACLE; PL/SQL; SQL*Plus Pro C Aplicaţia SGCForm Power Builder

Sistemul de Operare UNIX SO UNIX apare la sfîrşitul anilor 1960 avînd drept autori pe Ken Thompson şi Dennis

Ritchie. Versiunea era scrisă în limbaj de asamblare. În 1972 SO UNIX este rescris aproape în întregime în limbajul C fiind distribuit gratuit în scopuri academice. Astfel sistemele de operare de tip UNIX sunt astăzi cele mai utilizate pentru gestiunea reţelelor de calculatoare pe arii largi.

Sistemul UNIX este alcătuit din următoarele compartimente: shell –interpretatorul de comenzi, Kernell şi Sistemul de fişiere.

Principalele caracteristici ale SO UNIX sunt:1. Unix este scris în C, este portabil, funcţionează aproape identic pe orice tip de calculatoare.2. E un sistem deschis: permite folosirea celor mai diverse arhitecturi de calcul.3. E multisesiune: se pot deschide mai multe sesiuni de lucru pe acelaşi terminal.4. E multiproces : pot rula concomitent mai multe procese care pot comunica între ele sau pot

crea la rîndul lor alte procese.5. Interpretatorul de comenzi (shell) permite întroducerea de noi comenzi şi combinarea lor.6. Permite utilizarea în comun a resurselor şi facilitează comunicaţia între utilizatori.7. Este sistem multiuser. User-ii se împart în: superuser(root) şi user-i obişnuiţi. User-ii

obişnuiţi pot şi împărţiţi în grupuri de user-i. Într-un sistem multiuser resursele calculatorului gazdă sunt protejate. Utilizatorul este identificat de către gazdă prin nume şi parolă unice.

Sistemul de fişiere are o organizare ierarhică. Fişierele sunt grupate în cataloage care alcătuiesc o structură arborescentă numită rădăcină şi notată cu „/”.Clasificarea fişierelor:

a) fişiere obişnuiteb) fişiere de tip catalogc) fişiere speciale –asociate dispozitivelor I/Od) fişere pipe –conducte de comunicaţie

În UNIX numele unui fişier poate avea lungime variabilă şi constă din caractere alfanumerice, liniuţă şi punct. Fişierele sub UNIX nu au extensii.

Comenzile UNIXO comandă shell are următoarea structură: <nume_comanda> [<options>] [<parameters>], unde nume_comanda –numele comenzii.options –opţiunidesemnate printr-o literă, precedată de semnul „-” sau „+”.parameters –nume de fişere sau şiruri de caractere.

Din punct de vedere al funcţionalităţii comenzile shell pot fi grupate în mai multe categorii:

Comenzi pentru informare (cal, date, time, who, echo, passwd, mail, write, man ş.a) cal [<luna>] [<an>] –afişeată calendarul gregorian;

9

Page 10: Dare de Seama La Practic

date –data curentă; time –timpul curent; who, finger, w –utilizatorii conectaţi la sistem în momentul respectiv; echo [<text>] –afişează un ecou la ieşirea standard; mail [<adress>] –expediere mesaj; write <user>[<terminal>] –transmite un mesaj pe terminalul unui utilizator ce este

conectat; man [<comanda>] –help despre comenzi.

Comenzi pentru gestionarea directoarelor (pwd, cd, mkdir, rmdir, ls, cp -r ş.a) pwd –calea directoriului curent; cd –salt cu un nivel mai sus; mkdir –creare directoriu nou; rmdir –ştergere director; ls –listează conţinutul directoriului curent.

Comenzi pentru gestionarea fişierelor(cat, rm, cp, mv, cmp, chmod, wc, diff, tail ş.a) cat [<options>] [<specificator>] [<redirectare>] –afişarea/crearea/concatenarea

fişierelor; rm <f> -ştergere fişier; cp <file>…[<folder>] –copierea fişierelor; mv <source_file> <dest_file> -mutarea (redenumirea) fişierelor; cmp <file1> <file2> -compară fişierele; chmod <categ_user> <operator> <drept> <file> -schimbarea drepturilor de acces la

fişiere, unde: categ_user poate fi: u –proprietar, g –grup, o –restul utilizatorilor operator: + -adăugare , - -ştergere, = -asignare drept: drepturile oferite de SO : r –citire, w –scriere, x –executie;

wc [<options>] <file> -numărul liniilor (-l), cuvintelor (-w), caracterelor (-e) în fişier; diff <file1> <file2> -compară 2 fişiere; tail <file> -afişează un fragment de text de la începutul sau sfîrşitul fişierului.

Comenzi pentru gestiunea proceselor(ps, kill, sleep) ps [<options>] [<process> …] –afişează stările proceselor; kill [<pid_process>] –terminarea unui proces; sleep <nr_sec> -suspendă temporar execuţia unui proces.

Comenzi pentru gestiunea volumelor(df, du) df [<fisier_sistem>] –indică spaţiile libere pentru sistemele de fişiere montate; du [<options>] <file> -afişează numărul blocurilor alocate pe un disk.

Redactorul „VI” permite scrierea scripturilor (programelor) în UNIX. Un script în UNIX se dă la execuţie astfel: ./<nume_script>.

O variabilă în Unix se declară astfel: var = <valoare>. Valoarea variabilei este accesată prin semnul $.

Operatorii Unix:

Operator Semn

-eq, -nl =, ≠

-lt, -gt <, >

-le, -ge <=, >=

Instrucţiuni Unix

if <condition> then <command1> while <condition>

10

Page 11: Dare de Seama La Practic

[else <command2> do <command>] donefi

until <condition> for <variable> in <list_parameters> do <command> do <commands>done done

case <condition> or <variable> in <template_1>) <commands> ;; <template_2>) <commands> ;; … <template_n>) <commands> ;;esac

ORACLE/SQL. PL/SQL. SQL*PLUS

Bazele Oracle le-am studiat cu ajutorul aplicaţiei Toad, iar practica asupra SQL*Plus şi PL/SQL am desfăşurat-o sub UNIX. În cadrul acestui curs am studiat:Tipurile de date ORACLE, comenzile SQL, funcţiile de prelucrare a şirurilor în SQL, interogări, tranzacţii,restricţii, view-uri , drepturi de acces la baza de date şi la tabele.

Componentele de bază ale ORACLE sunt:

Oracle SQL Server –execută toate comenzile SQL SQL*Plus –mediu de dezvoltare, interfaţa cu utilizatorii PL-SQL –limbaj procedural de dezvoltare a aplicaţiilor

PL/SQL (Procedural Language SQL) e o extensie a limbajului SQL care permite:

Comenzi SQL executate de serverul SQL ORACLE Comenzi procedurale care permit programe ramificate şi ciclice Declarare de variabile Utilizarea variabilelor de legătură cu SQL*Plus Definirea de funcşii şi proceduri Definire de CURSOR pentru accesul la înregistrări Definire de TRIGGER pentru declanşarea unor proceduri de comenzi DML(Data

Modification Language) Definire clase de obiecte şi metode proprii

Forma generală a unui program PL/SQL este:DECLARE<variable>BEGIN<sql_expressions><pl/sql_expressions>EXCEPTION<prelucrare_exceptie>END;În PL/SQL putem utiliza: DML, Select, TranzacţiiSintaxa comenzii Select în PL/SQL:

11

Page 12: Dare de Seama La Practic

SELECT <select_list> INTO {var_name[,var_name] …| record_name}FROM <table>WHERE <condition>;

Cursoare

Sintaxa: CURSOR <nume> IS SELECT <statement>;

Schema de lucru a unui cursor:

Atribute ale cursorelor: %ISOPEN –starea cursorului %NOTFOUND –true, daca nu s-au gasit date %FOUND –true, daca s-au gasit date %ROWCOUNT –numarul de linii selectate

no

yes

Instucţiuni ciclice PL/SQL:

IF <condition> THEN <statements> LOOP[ ELSEIF <condition> THEN <statements>; ] statement1;[ ELSE <statements>;] …END IF EXIT [ WHEN <condition>] END LOOP

FOR <counter> IN [REVERSE] lower_boud .. upper_bound LOOP statements; END LOOP;WHILE <condition> LOOP statementsEND LOOP;

Funcţii PL/SQL:

Sintaxa: CREATE [OR REPLACE] function <nume_f> [(parameters)] RETURN <returnig_datatype> { AS | IS} <declaration section> BEGIN … RETURN ( … ) [EXCEPTION RETURN] END <nume_f>

Declare

Open

Fetch

Close

EMPTY

12

Page 13: Dare de Seama La Practic

Triggere PL/SQL>

Sintaxa: CREATE [ OR REPLACE ] Trigger <nume_t> { BEFORE | AFTER | INSTEAD OF } event ON { table | view } [ FOREACH ROW [ WHEN <condition> ] ] BEGIN … END;

Practica la toată teria ORACLE am făcut-o asupra bazei de date TEMPDB.WORLD care conţine tabelele:Emp ( empno –number(4), ename –varchar2(10), job –varchar2(9), mgr –number(4), hiredate –date, sal –number(7,2), comm –number(7,2), deptno –number(2) ) Dept (deptno –number(2), dname –varchar2(14), loc –varachar2(13) )Salgrade (grade –number, losal –number, hisal -number)Bonus (ename –varchar2(10), job –varchar2(9), sal –number, comm -number).

La sfîrşitul disciplinei ORACLE am avut următorul test de capacitate:

1. Зайти пользователем TEST_SYS/TEST_SYS и выполнить следующие действия:- создать пользователя SIMD---- с паролем SIMD----;- дать пользователю SIMD---- права для подключения к серверу Оракла, для

создания таблицы, представления, синонима, последовательности, UNLIMITED TABLESPACE;

- дать пользователю SIMD---- право на выборку (SELECT) из таблиц EMP и DEPT пользователя TEST_SYS;

2. Зайти пользователем SIMD----

DROP USER simd0929;

CREATE USER simd0929IDENTIFIED BY simd0929;

GRANT CREATE SESSION, CREATE TABLE,

CREATE VIEW, CREATE SEQUENCE, CREATE SYNONYM, UNLIMITED TABLESPACE

TO simd0929;

GRANT SELECT ON test_sys.empTO simd0929;

GRANT SELECT ON test_sys.deptTO simd0929WITH GRANT OPTION;

3. Сделать синонимы для таблиц TEST_SYS.EMP и TEST_SYS.DEPT

CREATE SYNONYM syn_empFOR TEST_SYS.EMP;

CREATE SYNONYM syn_deptFOR TEST_SYS.DEPT;

13

Page 14: Dare de Seama La Practic

4. Создать таблицы EMP и DEPT с такой же структурой и с такими же данными как аналогичные таблицы в схеме SCOTT_SYS (Подсказка: использовать команду CREATE TABLE AS select);

CREATE TABLE emp_simd0929 AS SELECT *

FROM test_sys.emp;

CREATE TABLE dept_simd0929 AS SELECT *

FROM test_sys.dept;

5. Добавить для поля EMPNO таблицы EMP и для поля DEPTNO таблицы DEPT ограничение NOT NULL

ALTER TABLE emp_simd0929MODIFY (empno NOT NULL);

ALTER TABLE dept_simd0929MODIFY (deptno NOT NULL);

6. Создать PRIMARY KEY PK_EMP для таблицы EMP по полю EMPNO и PRIMARY KEY PK_DEPT для таблицы DEPT по полю DEPTNO

ALTER TABLE emp_simd0929ADD CONSTRAINT pk_empPRIMARY KEY(empno);

ALTER TABLE dept_simd0929ADD CONSTRAINT pk_deptPRIMARY KEY(deptno);

7. Создать вторичный ключ FK_EMP_DEPT для таблицы EMP по полю DEPTNO, связанный с PRIMARY KEY таблицы DEPT

ALTER TABLE emp_simd0929ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY(deptno)REFERENCES dept_simd0929(deptno);

8. Вывести для каждого работника строку следующего вида:«<округленное количество отработанных лет> years, since the date <дата начала работы> the employee <имя работника> work in the department <название департамента с заглавной буквы>»Дату нужно выводить в виде «01/01/2006». Упорядочить список по дате начала работы.

WORK_INFO---------------------------------------------------------------------------------------------------------------------------------------25 years, since the date 17/12/1980 the employee SMITH work in the department Research25 years, since the date 20/02/1981 the employee ALLEN work in the department Sales25 years, since the date 22/02/1981 the employee WARD work in the department Sales25 years, since the date 02/04/1981 the employee JONES work in the department Research25 years, since the date 01/05/1981 the employee BLAKE work in the department Sales25 years, since the date 09/06/1981 the employee CLARK work in the department Accounting24 years, since the date 08/09/1981 the employee TURNER work in the department Sales24 years, since the date 28/09/1981 the employee MARTIN work in the department Sales24 years, since the date 17/11/1981 the employee KING work in the department Accounting24 years, since the date 03/12/1981 the employee JAMES work in the department Sales24 years, since the date 03/12/1981 the employee FORD work in the department Research

14

Page 15: Dare de Seama La Practic

24 years, since the date 23/01/1982 the employee MILLER work in the department Accounting19 years, since the date 19/04/1987 the employee SCOTT work in the department Research19 years, since the date 23/05/1987 the employee ADAMS work in the department Research

14 rows selected.

SELECT ROUND((MONTHS_BETWEEN(SYSDATE,hiredate)/12),0) ||' years, since the date '|| TO_CHAR(hiredate,'dd/mm/yyyy')||' the employee '||e.ename||

' work in the department '||INITCAP(d.dname) AS "Work_info"FROM emp_simd0929 e, dept_simd0929 dWHERE e.DEPTNO=d.DEPTNOORDER BY e.HIREDATE;

9. Выведите на экран имена работников и их зарплату, а также имя менежера работника и зарплату менежера для всех работников, у которых зарплата больше, чем зарплата у менежера. Назовите столбцы «Employee», Salary of employee», «Manager» и «Salary of manager» соответственно.

Employee Salary of employee Manager Salary of manager---------- ------------------ ---------- -----------------SCOTT 3000 JONES 2975FORD 3000 JONES 2975 SELECT e.ename AS "Employee", e.sal AS "Salary of Employee", m.ename AS "Manager",m.sal AS "Salary of Manager"FROM emp_simd0929 e, emp_simd0929 mWHERE e.sal >m.sal AND e.mgr=m.empno;

10. Напишите запрос, который выводит на экран список должностей, количество работников, занимающих каждую должность, среднюю зарплату и средние комиссионные по каждой должности, при условии, что средние комиссионные по должности больше 100. Назовите столбцы «JOB», «Number of People», «Salary», и «Commission» соответственно.

JOB Number of People Salary Commission--------- ---------------- ---------- ----------SALESMAN 4 1400 550

SELECT job AS "Job", COUNT(empno) AS "Number of People", NVL(AVG(sal),0) AS "Salary", AVG(comm) AS "Commision"FROM emp_simd0929GROUP BY jobHAVING NVL(AVG(comm),0)>100;

11. Напишите запрос, который выводит на экран по должностям общее количество работников, занимающих эту должность и количество работников, принятых на работу на эту должность в 1980, 1981, 1982 и 1987. Назовите столбцы соответственно.

DNAME 1980 1981 1982 1987-------------- ---------- ---------- ---------- ----------ACCOUNTING 0 2 1 0RESEARCH 1 2 0 2SALES 0 6 0 0

SELECT d.dname, COUNT(DECODE(TO_NUMBER(TO_CHAR(e.hiredate,'yyyy')),1980,1)) AS "1980",

15

Page 16: Dare de Seama La Practic

COUNT(DECODE(TO_NUMBER(TO_CHAR(e.hiredate,'yyyy')),1981,1)) AS "1981",COUNT(DECODE(TO_NUMBER(TO_CHAR(e.hiredate,'yyyy')),1982,1)) AS "1982",

COUNT(DECODE(TO_NUMBER(TO_CHAR(e.hiredate,'yyyy')),1987,1)) AS "1987",COUNT(*) AS "Total"

FROM emp_simd0929 e, dept_simd0929 dWHERE e.deptno=d.deptnoGROUP BY d.dname;

12. Выведите на экран имя работника, номер департамента и зарплату для всех работников, у которых номер департамента и зарплата совпадают с департаментом и зарплатой работников, получающих комиссионные, и у которых зарплата больше, чем хотя бы одна из средних зарплат по департаментам.

ENAME DEPTNO SAL---------- ---------- ----------ALLEN 30 1600

SELECT ename, deptno, salFROM emp_simd0929WHERE (deptno,sal) IN (SELECT deptno,sal FROM emp_simd0929

WHERE comm IS NOT NULL) AND sal > ANY (SELECT AVG(sal) FROM emp_simd0929

GROUP BY deptno );

13. Создайте блок PL/SQL, который добавляет новый департамент в таблицу DEPT или изменяет информацию для существующего департамента. Сохраните ваш блок PL/SQL в файле с названием test_13.sql.

a) Используйте параметр для номера департамента.

b) Используйте параметр для названия департамента.

c) Используйте параметр для местонахождения департамента.

d) Проверьте, если такой номер департамента уже есть, то измените для этого департамента его название и местонахождение. Присвойте внешней переменной SQL*Plus строку «The old departametn was changed».

e) Если такого номера департамента в таблице DEPT не существует, то добавьте новую запись. (Организовать добавление записи через EXCEPTION) Присвойте внешней переменной SQL*Plus строку «The new departametn was added».

f) Выполните ваш блок PL/SQL и выведите на экран новый департамент, который вы создали.

Please enter the department number: 1Please enter the department name: NEWPlease enter the department location: NEW_CITY

PL/SQL procedure successfully completed.

G_MESSAGE------------------------------------------------------------------The new departametn was added

16

Page 17: Dare de Seama La Practic

SQL> select * from dept where deptno = 1;

DEPTNO DNAME LOC---------- -------------- ------------- 1 NEW NEW_CITY

Please enter the department number: 1Please enter the department name: OLDPlease enter the department location: OLD_CITY

PL/SQL procedure successfully completed.

G_MESSAGE------------------------------------------------------------------The old departametn was changed

SQL> select * from dept where deptno = 1;

DEPTNO DNAME LOC---------- -------------- ------------- 1 OLD OLD_CITY

VARIABLE g_mess VARCHAR2(100)VARIABLE g_deptno NUMBERVARIABLE g_dname VARCHAR2(50)VARIABLE g_loc VARCHAR2(50)ACCEPT g_deptno PROMPT 'Please enter the department number:'ACCEPT g_dname PROMPT 'Please enter the department name:'ACCEPT g_loc PROMPT 'Please enter the department location:'DECLARE v_temp dept_simd0929.dname%TYPE;BEGIN SELECT dname INTO v_temp FROM dept_simd0929 WHERE deptno=&g_deptno; IF SQL%ROWCOUNT > 0 THEN UPDATE dept_simd0929 SET dname='&g_dname',loc='&g_loc' WHERE deptno=&g_deptno; COMMIT; :g_mess:='The old departament was changed'; END IF;EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO dept_simd0929 (deptno,dname,loc) VALUES(&g_deptno,'&g_dname','&g_loc'); COMMIT; :g_mess:='The new departament was added';END;/PRINT g_mess

SELECT *FROM dept_simd0929WHERE deptno=&g_deptno;SAVE test_13_simd0929.sql REPLACE

14. Постройте блок PL/SQL, который для введеного департамента просуммирует зарплату первых n работников, упорядоченных по дате приема на работу. Если в качестве номера департамента введен 0 или NULL, то расчет вести по работникам всех департаментов.

17

Page 18: Dare de Seama La Practic

Результат суммы сохранить во внешней переменной SQL*Plus. Требования: сначала сохранить зарплату по работникам указанного департамента из таблицы в переменную типа PL/SQL Table, затем просуммировать n значениий из PL/SQL Table. Обратить внимание, что число n может быть больше, чем количество работников в департаменте.

Please enter the department number: 10Please enter the quantity of employees: 2

PL/SQL procedure successfully completed.

G_SAL_TOTAL----------- 7450

Please enter the department number: 10Please enter the quantity of employees: 4

PL/SQL procedure successfully completed.

G_SAL_TOTAL----------- 8750

Please enter the department number: 0Please enter the quantity of employees: 10

PL/SQL procedure successfully completed.

G_SAL_TOTAL----------- 20625

VARIABLE g_count NUMBERVARIABLE g_sum_total NUMBERACCEPT g_deptno NUMBER PROMPT 'Please enter the department number: 'ACCEPT g_nr_employees NUMBER PROMPT 'Please enter the quantity of employees: 'DECLARE

v_sal1 NUMBER(3); v_sal2 NUMBER(3); v_sal emp_simd0929.sal%TYPE; v_sum_total NUMBER(10):=0;

CURSOR c1(v_deptno NUMBER) IS SELECT sal FROM emp_simd0929 WHERE deptno=v_deptno ORDER BY hiredate; CURSOR c2 IS SELECT sal FROM emp_simd0929 ORDER BY hiredate;

--tip de date

TYPE sal_emp_table IS TABLE OF emp_simd0929.sal%TYPE

18

Page 19: Dare de Seama La Practic

INDEX BY BINARY_INTEGER;sal_table sal_emp_table;

--program principal

BEGIN SELECT COUNT(sal) into v_sal1 FROM emp_simd0929 WHERE deptno=&g_deptno;

SELECT COUNT(sal) INTO v_sal2 FROM emp_simd0929;

IF &g_deptno=0 OR &g_deptno IS NULL THEN OPEN c2; FOR i in 1..v_sal2 LOOP FETCH c2 INTO v_sal; sal_table(i):=v_sal; END LOOP; CLOSE c2; ELSE OPEN c1(&g_deptno); FOR i in 1..v_sal1 LOOP FETCH c1 into v_sal; sal_table(i):=v_sal; END LOOP; CLOSE c1; END IF; IF &g_nr_employees > sal_table.count THEN FOR i in 1..sal_table.count LOOP v_sum_total:=v_sum_total+sal_table(i); END LOOP; ELSE FOR i in 1..&g_nr_employees LOOP v_sum_total:=v_sum_total+sal_table(i); END LOOP; END IF;:g_sum_total:=v_sum_total;END;/PRINT g_sum_totalSAVE test_14_simd0929.sql REPLACE

15. Запустить скрипт TEST\test_14_create_new_emp.sql для создания таблицы NEW_EMP. Постройте блок PL/SQL, который расчитывает новую зарплату для каждого работника введенного департамента и вставляет эту информацию(номер работника, его имя и новую зарплату) в таблицу NEW_EMP. Расчет зарплаты: если текущая зарплата больше, чем средняя зарплата по департаменту работника, то новая зарплата = текущая + комиссионные; если текущая зарплата меньше, чем средняя зарплата по департаменту работника, то новая зарплата = средняя зарплата по департаменту + комиссионные. Для введенного номера департамента написать проверку: если введен 0 или NULL или номера департамента не существует, написать обработчик ошибок и выдать сообщение во внешнюю переменную SQL*Plus. «Error!!! This department number don`t exist». Перед выполнением блока PL/SQL удалите записи из таблицы NEW_EMP.

Please enter the department number: 10

19

Page 20: Dare de Seama La Practic

PL/SQL procedure successfully completed.

G_MESSAGE------------------------------------------------------------------The calculation was complete

EMPNO NAME SALARY---------- ------------------------- ---------- 7782 CLARK 2916.67 7839 KING 5000 7934 MILLER 2916.67

Please enter the department number: 0

PL/SQL procedure successfully completed.

G_MESSAGE------------------------------------------------------------------Error!!! This department number don`t exist

Please enter the department number: 1

PL/SQL procedure successfully completed.

G_MESSAGE------------------------------------------------------------------Error!!! This department number don`t exist

DROP TABLE new_emp;CREATE TABLE new_emp (empno NUMBER(4), name VARCHAR2(20), salary NUMBER(11,2) );COMMIT;VARIABLE g_message VARCHAR2(100)VARIABLE g_deptno NUMBERACCEPT g_deptno NUMBER PROMPT 'Please enter the department number:'DECLARE v_empno emp_simd0929.empno%TYPE; v_name emp_simd0929.ename%TYPE; v_sal emp_simd0929.sal%TYPE; v_comm emp_simd0929.comm%TYPE;

v_newsal NUMBER(10); v_avgsal NUMBER(10); v_deptno NUMBER (10); v_count NUMBER(10);

CURSOR c1 ISDROP TABLE new_emp;CREATE TABLE new_emp (empno NUMBER(4), name VARCHAR2(20), salary NUMBER(11,2) );COMMIT;VARIABLE g_message VARCHAR2(100)

20

Page 21: Dare de Seama La Practic

VARIABLE g_deptno NUMBERACCEPT g_deptno NUMBER PROMPT 'Please enter the department number:'DECLARE v_empno emp_simd0929.empno%TYPE; v_name emp_simd0929.ename%TYPE; v_sal emp_simd0929.sal%TYPE; v_comm emp_simd0929.comm%TYPE;

v_newsal NUMBER(10); v_avgsal NUMBER(10); v_deptno NUMBER (10); v_count NUMBER(10);

CURSOR c1 IS SELECT empno,ename,sal,nvl(comm,0) FROM emp_simd0929 WHERE deptno=&g_deptno;BEGIN v_newsal:=0; v_avgsal:=0; v_deptno:=&g_deptno; SELECT COUNT(sal),AVG(sal) INTO v_count,v_avgsal FROM emp_simd0929 WHERE deptno=&g_deptno; IF v_deptno=0 or v_deptno=1 THEN :g_message:='Error!!!This department number dont exist'; ELSE OPEN c1; FOR i in 1 .. v_count LOOP FETCH c1 INTO v_empno,v_name,v_sal,v_comm; IF v_sal>v_avgsal THEN v_newsal:=v_sal+v_comm; ELSE v_newsal:=v_avgsal+v_comm; END IF; :g_message:='The calculation was complete'; INSERT INTO new_emp(empno,name,salary) VALUES (v_empno,v_name,v_newsal); END LOOP; CLOSE c1; END IF; COMMIT;END;/PRINT g_message;SELECT *FROM new_emp;

Pro C

Pro C este un precompilator creat în ORACLE. Sintaxa limbajului Pro C este totalmente identică cu cea a limbajului C cu unica diferenţă că, aici se pot folosi proceduri şi funcţii SQL.

Variabilele se declară într-un bloc special:

EXEC SQL DECLARE SECTION; <variables>EXEC SQL END DECLARE SECTION;

21

Page 22: Dare de Seama La Practic

Orice comandă SQL în Pro Cse scrie cu EXEC SQL <cod_sql>. Variabilele declarate în secţiunea specială SQL sunt accesate prin „:”

Sarcina propusă spre realizare: Să se efectueze un program Pro C care să permită conectarea la baza de date „SGCFORM” într-o funcţie f_connect ( ). Fişierele sunt citite cu funcţia f_get_files ( ). Să se declare un cursor care în dependenţă de NLC (numar loc de consum) cules de la tastieră selectează din tabelul RECIBOS (gestiunea facturilor) înregistrările pentru acest NLC. Să se selecteze cîmpurile: nis_rad, sec_nis, f_fact, sec_rec, imp_tot_rec. La sfîrşit afişaţi cantitatea totală a facturilor şi suma totală a lor.

Programul sursă:#include <stdio.h>#include <stdlib.h> #include <malloc.h>#include <string.h>#include <sqlca.h>#include <ctype.h>

//declararea structuriitypedef struct{ int v_nis_rad;

int v_sec_nis;char v_f_fact[12];int v_sec_rec;float v_imp_tot_rec;

} str_recibos;

//citirea fisierelorint f_get_files(char username[9],char passw[9],char DBstring[11],char fbatch[9]) {

FILE *ffile;char lc_aux[30];

ffile = fopen("FECHAB","r");

if ( ffile == NULL ){

printf("Can't open FECHAB!\n");return -1;

}

if ( fgets(fbatch,9,ffile) == NULL ){

printf(" Can't read FECHAB!\n");return -1;

} fbatch[8] = '\0'; fclose(ffile);

ffile = fopen("FUSUARIO","r");

if ( ffile == NULL ){

printf("Can't open FUSUARIO!\n");return -1;

}

if ( fgets(lc_aux,30,ffile) == NULL ){

printf("Can't read FUSUARIO!\n");return -1;

22

Page 23: Dare de Seama La Practic

} lc_aux[29] = '\0'; fclose(ffile);

strncpy(username,lc_aux,8); username[8] = '\0'; strncpy(passw,lc_aux + 8,8); passw[8] = '\0'; strncpy(DBstring,lc_aux + 16,8); DBstring[8] = '\0';

return 0;

}

//conectarea la baza de dateint f_Connect(const char *username, const char *psw, const char *db){

EXEC SQL BEGIN DECLARE SECTION;const char *UserName;const char *Password;const char *DBString;

EXEC SQL END DECLARE SECTION;

UserName = username;Password = psw;DBString = db;

EXEC SQL CONNECT :UserName IDENTIFIED BY :Password USING :DBString;

if (sqlca.sqlcode == 0) { printf("%s|%s - conected\n", username, db);

printf("\nConectarea s-a efectuat cu succes !!!\n"); return 0;

}else {

printf("\nEroare la conectarea cu baza de date.\n");printf("\nIncercati inca o data conectarea sau verificati daca numele si parola sunt scrise corect\

n");exit (0); return -1;

}if (sqlca.sqlcode == 100){ printf("\nNu s-au gasit inregistrari in baza de date.\n");

return -1;}//else return -1;

} //end connect

void f_cursor(){ char ch='y';

//declararea pointerului la structura EXEC SQL BEGIN DECLARE SECTION; str_recibos *pstruct;

int g_nis_rad; int g_total_fact=0; double g_sum_rec=0; int contor = 0;

23

Page 24: Dare de Seama La Practic

int i = 0; EXEC SQL END DECLARE SECTION;

while (ch == 'y') {

printf("\nIntroduceti valoarea NIS_RAD:"); scanf("%d",&g_nis_rad);

//numarul de inregistrarilor care au NIS_RAD dat EXEC SQL SELECT count(*) INTO :g_total_fact FROM recibos WHERE nis_rad = :g_nis_rad; if( sqlca.sqlcode == 0 && i < g_total_fact )

{ printf("Valoarea NIS_RAD a fost gasita in Baza de Date\n"); ch='n';

} else

{ printf("Nu exista asa valoare NIS_RAD in baza de date\n"); printf("Doriti sa intruduceti alt numar(y/n)\n"); ch = getch();

if(ch == 'n') { exit(0); }

} //else

} //while

if (sqlca.sqlcode == 100) { printf("Nu s-au gasit inregistrari in Baza de date\n"); }

//alocarea memorie pentru inregistrari

pstruct=malloc((g_total_fact+1) *sizeof(str_recibos));

//suma tuturor facturilor

EXEC SQL SELECT nvl(sum(imp_tot_rec),0) INTO :g_sum_rec FROM recibos WHERE nis_rad=:g_nis_rad; //declararea cursorului

EXEC SQL DECLARE c_recibos CURSOR FOR SELECT nis_rad,

sec_nis, to_char(f_fact,'dd-MON-yy'), sec_rec, imp_tot_rec

FROM recibos WHERE nis_rad = :g_nis_rad;

//deschide cursor EXEC SQL OPEN c_recibos; printf("NIS_RAD\t\tSEC_NIS\t\tF_FACT\t\tSEC_REC\t\tIMP_TOT_REC \n"); printf("-------\t\t-------\t\t------\t\t-------\t\t------------\n");

while (contor<g_total_fact) //sqlca.sqlcode == 0

24

Page 25: Dare de Seama La Practic

{ contor++;

++ pstruct; EXEC SQL FETCH c_recibos INTO :pstruct;

//cimpurile string se inchid la capete

pstruct->v_f_fact[11] = '\0';

//afisarea

printf("%d\t\t%d\t\t%s\t%d\t\t%5.2f\n",pstruct->v_nis_rad,pstruct->v_sec_nis,pstruct->v_f_fact,pstruct->v_sec_rec,pstruct->v_imp_tot_rec);

}//while

//inchide cursor

EXEC SQL CLOSE c_recibos;

printf("\n***************************************************"); printf("\n\nAveti selectate %d inregisrari\n", g_total_fact); printf("\nSuma totala a facturilor este %5.3lf unitati conventionale\n", g_sum_rec);

} //end f_cursor()

//programul principal

int main(int argc, char *argv[]){ char user[9]; char passwd[9]; char batch[9]; char db[11];

//apelul functiilor

f_get_files(user,passwd,db,batch);

f_Connect(user, passwd, db);

f_cursor();

return 0;}

Aplicaţia SGC

Aplicaţia SGC (Sistemul de gestiune comercială) este elemntul cheie în cadrul secţiei comerciale şi este destinată pentru automatizarea procesului de gestiune a energiei persoanelor fizice şi juridice. Aplicaţia permite controlul ciclului comercial, furnizarea calitativă a energiei electrice clienţilor,încheierea contractelor pentru energie cu clineţii ş.a. Open SGC acoperă toate necesităţile ce ţin de comercializarea energiei electrice.Sistemul de gestiune comercială SGC constă din 4 părţi funcţionale:

Dirijarea lucrului cu abonaţii Administrarea consumului de energie Administrarea bazei de date Întreţinerea bazei de date

25

Page 26: Dare de Seama La Practic

Dirijarea lucrului cu abonaţii reprezintă baza sistemului SGC şi este compus din 7 module funcţionale:

1. Deservirea clienţilor: Informaţia despre client (starea punctului de consum, facturile, tip_aparat_măsură.

sigilii etc) Înregistrarea solicitărilor despre livrarea energiei şi examinarea lor Încheierea contractelor şi gestionarea lor Înregistrarea reclamaţiilor Eliberarea copiilor facturilor în timp real, corectarea datelor Puncte de consum pe termen scurt

2. Date despre citiri –este un elemnt cheie în componenţa ciclului comercial „citirea-facturarea-încasarea”: Controlul rutelor pentru citiri Planificarea citirilor şi optimizarea traseelor Rezolvarea anomaliilor Generarea automată a ordinelor de lucru Prelucrarea datelor (cu ajutorul terminalelor TPL)

3. Facturare –utilizat pentru calcularea automată a facturii: Recalcularea consumului de energie Întreţinere consumuri neautorizate Transfer avansuri Facturare pentru consumatori speciali

4. Procesarea încasărilor: Încasări în birou comercial Încasări On-line Încasare centralizată

5. Ordine de lucru: Generarea automată a ordinelor de lucru Verificarea locului de consum Controlul şi generarea lucrărilor de acelaşi tip Controlul lucrarilor şi calitatea îndeplinirii lor

6. Interfaţa contabilă –raspunde de primirea şi transmiterea informaţie în/din sistem.7. Deservirea unităţilor duce cont de obiecte, locuri de consum, racorduri, aparate măsură,

aparate control, transformatoare etc.Administrarea consumului de energie are drept scop de a menţine un balans între energia consumată şi cea furnizată.Administrarea bazei de date –modul ce răspunde de informaţia statistică din baza de date (diagrame, scheme etc.)Întreţinerea bazei de date –permite utilizatorului să modifice în timp real oricare din parametrii ciclului comercial, regiunile geografice, tarifele etc.

Avantajele sistemului SGC

1. Bază de date unică2. Lucrul tuturor utilizatorilor în regim on-line3. Înformaţia nu se şterge din baza de date chiar dacă ea nu mai este necesară4. Spectru mare de setări şi parametrizări5. Tratarea tutror aspectelor privind livrarea şi comercializarea energiei electrice6. Formarea diferitor tipuri de rapoarte în orice moment la dorinţa utilizatorului7. Control deplin asupra timpului de îndeplinire a sarcinilor de către fiecare angajat

26

Page 27: Dare de Seama La Practic

Aplicaţia Power Builder

Power Builder este o aplicaţie cu elemente grafice de tip client-server ce lucrează cu bazele de date ORACLE. O aplicaţie client-server constă din cel puţin 2 părţi: „Client” –aplicaţia permite utilizatorului de a interacţiona cu sistemul, iar „Server” –permite manipularea datelor de pe serverul unde stă baza de date relaţională. În aplicaţiile de tip client-server deseori se utilizează grafică 3D.

Power Builder se bazează pe tehnologia RAD (Rapid Application Development), adică este o aplicaţie rapidă. Aplicaţia Power Builder este compusă din meniu şi ferestre cu care utilizatorul lucrează. În cadrul ferestrelor se folosesc toate elementele standarde Windows, de ex: butoane, obiecte, ferestre textuale etc. Deasemenea Power Builder este o aplicaţie care prelucrează şi controlează evenimente.

Crearea unei aplicaţii Power Builder presupune crearea de obiecte, setarea proprietăţilor lor şi scrierea scenariilor de acţiune ale evenimentelor. Obiectele ce se crează se salvează în biblioteca cu sufixul „pbl”. Una sau mai multe biblioteci de acest fel reprezintă o aplicaţie.

Aplicaţiile Power Builder conţin întotdeauna un obiect aplicaţie şi una sau mai multe ferestre în care se păstrează contoalele „Controls”. În PB se foloseşte programarea orientată obiect, adică fiecare obiect are metode şi proprietăţi. Stuctura unui obiect Power Builder arată astfel:

Pentru programarea evenimentelor şi funcţiilor în PB se foloseşte limbajul Power Script.

Concluzii:

Pe parcursul a 8 saptămîni de practică am reuşit să-mi aprofundez cunoştinţele în UNIX şi ORACLE/SQL, şi să învăţ ceva nou ca: aplicaţia SGC, PL/SQL, SQL*Plus, Pro C, Power Buider.

M-am convins că corporaţia UNION FENOSA este un distribuitor de energie electrică pe măsură. Astăzi aria sa de întindere cuprinde 70% din suprafaţa Republicii Moldova. Datorită sistemului performant (SGC) pe care îl are în dotare şi personalului calificat, corporaţia UNION FENOSA reuşeşte să facă faţă la toate problemele apărute în distribuţia şi comercializarea energiei electrice şi se menţine pe piaţa din Republica Moldova la unul din cele mai înalte nivele.

Properties

Events

Functions

27