Sunteți pe pagina 1din 10

Laborator 8

Tema:

crearea unor formulare utiliznd mediul de programare Netbeans pentru:


conectarea la o baz de date Oracle;
crearea i utilizarea secvenelor ca elemente componente ale unei baze de
date Oracle;
adugarea de nregistrri n tabelele u nei baze de date Oracle.

1. Modificai structura tabelului clienti existent n schema gestiune a bazei de date Oracle astfel
nct s nlocuii coloana adresa cu alte coloane care s conin date elementare cum ar fi:
judet, localitate, strada, numar, bloc, scara, apartament, cod postal.
n plus, adugai o coloan care s memoreze felul clientului i care s aib valoarea PJ n cazul
unui client persoan juridic i respectiv PF, n cazul unui client persoan fizic.
Noile cmpuri vor avea urmtoarele caracteristici:
Numele cmpului

Tipul i dimensiunea

Semnificaia

cod_jud

NUMBER(2,0)

codul judeului

cod_loc

NUMBER(3,0)

codul localitii

strada

VARCHAR2(30)

numele strzii

numar

VARCHAR2(6)

numrul n cadrul strzii

bloc

VARCHAR2(6)

indicativul blocului

scara

VARCHAR2(6)

numr scar

apart

NUMBER(3,0)

numr apartament

cod_post

NUMBER(6,0)

codul potal

tip_cli

VARCHAR2(2)

felul clientului

De asemenea, modificai dimensiunea cmpului tel la VARCHAR2(50), pentru a permite


memorarea mai multor numere de telefon.
2. Creai dou tabele noi numite judete i localitati cu structura de mai jos:
judete

localitati

cod

NUMBER (2,0)

cod_jud

NUMBER (2,0)

denum

VARCHAR2(30)

cod_loc
denum

NUMBER (3,0)
VARCHAR2(40)

Adugai constrngeri de tipul foreign key pentru a crea legturi ntre tabelele judete i localitati, pe
de o parte i ntre tabelul clienti i tabelele judete i localitati, pe de alt parte.
3. Adugai nregistrri n tabelele judete i localitati. Completai informaiile referitoare la adres
n tabelul clienti.
1

4. Proiectai un formular care s permit adugarea unor noi nregistrri n tabelul clienti. Acesta va
avea titlul Actualizare clienti i se va activa la opiunea Tabele -> Actualizare > Clienti aleas din meniul aplicaiei Gestiune stocuri.
Coninutul formularului este cel din imaginea urmtoare:
grup de
butoane radio

controale
Combo Box

control Text
Area

Analiznd structura formularului observai c nu exist un control Windows care s permit


editarea codului noului client. Coloana cod din structura tabelului clienti are rol de cheie primar n
acest tabel i, prin urmare, trebuie s aib o valoare diferit de null, iar aceasta s fie unic n tabel.
E evident faptul c aceast valoare va trebui generat prin intermediul codului aplicaiei. Exist
dou posibiliti de obinere a codului unui client nou i anume:
i. cutarea n tabelul clienti a celei mai mari valori a codului de client i obinerea
codului nou prin incrementare cu 1 (totul n proiectul Netbeans);
ii. crearea unei secvene ca element nou al bazei de date Oracle, sub schema gestiune (n
serverul Oracle) i obinerea noului cod de client prin generarea valorii urmtoare din
secven (n proiectul Netbeans, n fraza INSERT).
Pentru aplicaia de fa se alege varianta ii). n baza de date Oracle, sub schema gestiune, se va crea
secvena numit seqCli avnd grij ca valoarea de pornire s fie fixat la cel mai mare cod de client
existent n tabelul clienti n acest moment, la care se adug 1.

Pentru crearea secvenei urmai calea


Home -> Object Browser -> Create -> Sequence .
Imaginile care urmeaz sunt elocvente pentru cele enunate mai sus.
Observai c cea mai mare valoare a codului de client este 5 (n exemplul de fa).

Prin urmare, valoarea de pornire a secvenei va fi 6, iar pasul 1.

.
Valoarea expresiei seqCli.nextval reprezint urmtoarea valoare a secvenei seqCli. Aceast
expresie se va folosi n comanda SQL INSERT, rulat din aplicaia Java, ca valoare a coloanei cod
din structura tabelului clienti.
Noul formular va fi gzduit de ctre fereastra de dialog actClientiDialog, iar tipul i numele
controalelor Windows adugate sunt cele din fereastra Inspector:
Formularul conine dou controale de tipul
JComboBox numite cliJudet i respectiv,
cliLocalitate. Popularea acestor controale pentru
n
metoda
afiarea
iniial
se
face
actClientiActionPerformed asociat barei de meniu
Tabele -> Actualizare -> Clienti .
Prima caset combinat se creeaz prin adugarea
tuturor numelor de judee coninute n tabelul judete,
n ordine alfabetic. Pentru aceasta e necesar un
obiect din clasa Statement numit comanda i unul
din clasa ResultSet numit rsJudete.
Important :
Caseta combinat cliJudet nu se mai modific dup
acest moment. A doua caset combinat,
rsLocalitati, se construiete la nceput, odat cu
caseta rsJudete i se va reface ori de cte ori se va
selecta un jude din caseta rsJudete astfel nct lista
localitilor s conin doar numele localitilor
aparintoare judeului selectat din prima list.
Deoarece n noua nregistrare care va fi adugat
tabelului clienti se vor memora codul judeului i
codul localitii i nu denumirile acestora, aceste
dou valori se pstreaz n variabilele judetSel i
respectiv, localSel.
De asemenea, pentru adugarea unei nregistrri noi
n tabelul clienti e necesar un obiect din clasa
ResultSet numit aici rsClienti i unul de tip
Statement numit comanda4.
4

Variabile amintite aici sunt declarate ca membri date ai clasei aplicaiei:


private
private
private
private
private
private

Statement comanda,comanda2,comanda3,comanda4;
ResultSet rezultat;
ResultSet rsJudete,rsLocalitati;
ResultSet rsClienti;
int judetSel;
int localSel;

Secvena de cod urmtoare red o posibil definiie a metodei actClientiActionPerformed amintit


mai sus.
private void actClientiActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
actClientiDialog.setLocation(300, 100);
actClientiDialog.pack();
actClientiDialog.setVisible(true);
// pregatire controale combo
try
{
// creare combo judete
cliJudet.removeAllItems();
comanda = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rsJudete = comanda.executeQuery("select * from judete order by nume");
while(rsJudete.next())
{
cliJudet.addItem(rsJudete.getString("nume"));
}
// memorare cod primul judet din rsJudete
rsJudete.first();
judetSel=rsJudete.getInt("cod");
// creare combo localitati apartinatoare primului judet
cliLocalitate.removeAllItems();
String frazaSQL;
frazaSQL="select * from localitati where cod_jud="+judetSel+" order by nume";
comanda2 = cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rsLocalitati = comanda2.executeQuery(frazaSQL);
while(rsLocalitati.next())
{
cliLocalitate.addItem(rsLocalitati.getString("nume"));
}
// memorare cod prima localitate din rsLocalitati
rsLocalitati.first();
localSel=rsLocalitati.getInt("cod_loc");
// pregatire ResultSet Clienti pentru actualizare
comanda4=cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rsClienti=comanda4.executeQuery("select * from clienti");

}
catch(SQLException ex)
{
System.out.println("eroare SQL");
System.exit(1);
}

n continuare sunt necesare cteva precizri suplimentare pentru o bun proiectare a formularului i
anume:

i. din mulimea cmpurilor de text (controale din clasele JTextField i JTextArea), doar
completarea numelui clientului este obligatorie (controlul cliNume);
ii. valorile editate n controalele cliApart (apartamentul) i cliCodPostal (codul potal)
trebuie s fie valori numerice ntregi, n cazul n care aceste controale conin text; n
caz contrar, cmpurile corespunztoare (apart i respectiv, cod_post) din tabelul clieni
vor primi valoarea null. Verificarea validitii acestor valori se face cu metoda
Integer.parseInt( ) care analizeaz textul afiat de control i, n situaia n care acesta
nu corespunde , va genera o excepie de tipul NumberFormatException. La captarea
unei astfel de excepii (blocuri try-catch) o variabil boolean numit flag i va
schimba valoarea n false.
iii. aceeai variabila flag i va schimba valoarea la false atunci cnd numele clientului
este necompletat.
Verificarea acestor condiii se face la acionarea butonului Adaugare prin apelul metodei
clientValid. Definiia acestei funcii poate fi urmtoarea:
private boolean clientValid(String numeCli, String apartCli, String codPostCli)
{
// conditiile de validare sint:
//
numeCli nevid
//
apartCli vid sau numar
//
codPostCli vid sau numar
boolean flag=true; // date valide
if(numeCli.trim().equals(""))
flag=false;
if(!(apartCli.trim().equals("")))
// apartCli nevid
try
{
Integer.parseInt(apartCli);
}
catch(NumberFormatException ex)
{
flag=false;
}
if(!(codPostCli.trim().equals("")))
// codPostCli nevid
try
{
Integer.parseInt(codPostCli);
}
catch(NumberFormatException ex)
{
flag=false;
}
}

return flag;

Codul care descrie evenimentul actionPerformed (adic click) al butonului Adaugare (controlul
adaugcli) poate fi:
private void adaugcliActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
// declarare variabile locale care preiau valorile din controalele
// formularului
String
String
String
String
String
String

felCli;
numeCli;
stradaCli;
numarCli;
blocCli;
scaraCli;

String
String
String
String

apartCli;
codPostCli;
telCli;
emailCli;

if(pj.isSelected())
felCli="PJ";
else
felCli="PF";
numeCli=cliNume.getText();
stradaCli=cliStrada.getText();
numarCli=cliNumar.getText();
blocCli=cliBloc.getText();
scaraCli=cliScara.getText();
apartCli=cliApart.getText();
codPostCli=cliCodPost.getText();
telCli=cliTel.getText();
emailCli=cliEmail.getText();
// verificarea validitatii datelor i adaugarea sau respingerea clientului
if(clientValid(numeCli, apartCli, codPostCli))
{
// se adauga clientul
String frazaSQL;
frazaSQL="INSERT INTO clienti VALUES(";
frazaSQL+="seqCli.nextval"+",";
frazaSQL+=apostrofeaza(numeCli.trim())+",";
frazaSQL+=apostrofeaza(telCli.trim())+",";
frazaSQL+=apostrofeaza(emailCli.trim())+",";
frazaSQL+=judetSel+",";
frazaSQL+=localSel+",";
frazaSQL+=apostrofeaza(stradaCli.trim())+",";
frazaSQL+=apostrofeaza(numarCli.trim())+",";
frazaSQL+=apostrofeaza(blocCli.trim())+",";
frazaSQL+=apostrofeaza(scaraCli.trim())+",";
frazaSQL+=((apartCli.trim().equals(""))?"null":apartCli.trim())+",";
frazaSQL+=((codPostCli.trim().equals(""))?"null":codPostCli.trim())+",";
frazaSQL+=apostrofeaza(felCli)+")";
//System.out.println("frazaSQL:"+frazaSQL);
try {
comanda4.executeUpdate(frazaSQL);
InitializareControale();
} catch (SQLException ex) {
System.out.println("eroare SQL la adaugare inregistrare");
System.exit(1);
}

}
else
{
// clientul se respinge
messageBoxDialog.setVisible(true);
mesaj.setText("Nume client necompletat/"+
"Apartament eronat/"+
"Cod postal eronat !!!");
messageBoxDialog.setVisible(true);
messageBoxDialog.pack();
}

Observai c definiia acestei funcii conine apelul funciei de validare (funcia clientValid). n
cazul n care aceasta din urm returneaza true, se va aduga n tabelul clienti o noua nregistrare
care va prelua n coloanele sale valori editate sau alese din formular. O singur excepie exist i
aceasta const n completarea coloanei cod nu cu o valoare pregtit n formular, ci cu valoarea
urmtoare a secvenei seqCli, adic valoarea seqCli.nextval.
7

Dup adugarea nregistrrii se reseteaz controalele formularului prin apelul unei noi funcii
numite InitializareControale a crei definiie poate fi urmtoarea:
private void InitializareControale()
{
pj.setSelected(true);
cliNume.setText("");
cliJudet.setSelectedIndex(0);
cliStrada.setText("");
cliNumar.setText("");
cliBloc.setText("");
cliScara.setText("");
cliApart.setText("");
cliCodPost.setText("");
cliTel.setText("");
cliEmail.setText("");
}

Definiia metodei apostrofeaza apelat la adugarea unui client nou este urmtoarea:
private String apostrofeaza(String text)
{
}

return "\'"+text+"\'";

Am vzut care trebuie s fie comportamentul formularului n situaia n care datele sunt corecte din
punct de vedere al criteriilor de validare.
Ce se ntmpl ns dac datele sunt eronate ?
Rspunsul este urmtorul: este afiat un mesaj de eroare explicit n fereastra de dialog
messageBoxDialog,

iar apoi, la acionarea butonului OK, se revine n formular cu pstrarea valorilor n vederea
corectrii lor.
5. Exist situaii n care, dup completarea datelor n formular, se dorete abandonarea operaiei de
adugare. Acest rol este ndeplinit de metoda actionPerform a butonului Renuntare (controlul
renunctcli) care, prin apelul metodei InitializareControale ( ) reseteaz controalele formularului,
fr a prelua valorile precedente ale acestora.
Definiia metodei renuntcliactionPerform este urmtoarea:
private void renuntcliActionPerformed(java.awt.event.ActionEvent evt) {
InitializareControale();
}

6. ncheierea lucrului cu acest formular se face prin acionarea butonului Iesire (adic controlul
iesirecli), iar codul asociat este:
private void iesirecliActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
// TODO add your handling code here:
actClientiDialog.setVisible(false);
comanda.close();
comanda2.close();
comanda3.close();
comanda4.close();

} catch (SQLException ex) {


Logger.getLogger(gestiune.class.getName()).log(Level.SEVERE, null, ex);
}

7. Cretei funcionalitatea formularului prin adugarea unui buton de cutare a unui client i a unui
buton de actualizare.

10

S-ar putea să vă placă și