Sunteți pe pagina 1din 10

Laborator 9

Tema:

crearea i utilizarea secvenelor ca elemente componente ale unei baze de date Oracle
crearea unor formulare utiliznd mediul de programare Netbeans pentru:
conectarea la o baz de date Oracle;
lucrul cu controale Windows din clasa JTable.

1. n mediul de dezvoltare Netbeans deschidei proiectul Gestiune stocuri. Adugai barei de


meniu a ferestrei principale un meniu nou numit Conectare i avnd textul Conectare la baza
de date.

2. Creai un formular prin intermediul cruia s se realizeze conectarea la baza de date Oracle.
Acesta se va numi conectDialog i aspectul su ar putea fi cel din imaginea urmtoare:

.
Fixai titlul Conectare la baza de date pentru fereastra de dialog conectDialog.
Activarea formularului are loc la producerea evenimentului MenuSelected al meniului
Conectare, iar definiia metodei ConectareMenuSelected este urmtoarea:

private void ConectareMenuSelected(javax.swing.event.MenuEvent evt) {


// TODO add your handling code here:
conectDialog.setVisible(true);
conectDialog.pack();
conectDialog.setLocation(500, 300);
utilizator.setText("");
parola.setText("");
conMesaj.setText("");
conIncerc.setEnabled(true);

Adugarea metodei se face urmnd calea din figura urmtoare:

Tipul i numele controalelor Windows coninute de formular pot fi observate n fereastra


Inspector.
Din cele trei etichete prezente n
formular,
jLabel31,
jLabel32
i
conMesaj, doar ultimei i s-a atribuit un
nume sugestiv. Eticheta conMesaj este
singura creia proprietile i se schimb
dinamic, pe parcursul rulrii aplicaiei.
Aceste schimbri constau n modificarea
textului afiat, a culorii acestuia sau
n
ascunderea/reafiarea
controlului
diferite etape ale procesului de conectare
la baza de date. Utilizarea facil a
etichetei n secvenele de cod reprezint
motivul pentru care numele atribuit iniial
de ctre mediul Netbeans a fost schimbat
cu unul uor de reinut.
Presupunnd c datele contului ce se va
folosi pentru logarea la baza de date au fost editate n controalele rezervate acestui scop n
formular (utilizator i parola), ncercarea de conectare se va face la acionarea butonului
conIncerc, cel care are nscris pe el textul Conectare. Metoda conIncercActionPerformed
descrie reacia formularului la evenimentul click produs asupra acestui buton.
private void conIncercActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
String conUtilizator;
String conParola;
boolean flag;

conUtilizator=utilizator.getText().trim();
conParola=String.copyValueOf(parola.getPassword()).trim();
// Metoda getPassword() returneaza char[].
// Metoda String.copyValueOf() converteste char[]
// la String
flag=true;
if(conUtilizator.equals(""))
flag=false;
if(conParola.equals(""))
flag=false;

// utilizator necompletat
// parola necompletata

if(flag)
{
try {
OracleDataSource ods=new OracleDataSource();
String URL;
URL="jdbc:oracle:thin:";
URL+=conUtilizator+"/"+conParola;
URL+="@127.0.0.1:1521/XE";
//System.out.println("Fraza URL:
"+URL);
ods.setURL(URL);
cnx=ods.getConnection();
conMesaj.setForeground(Color.GREEN);
conMesaj.setText("Conectare OK");
conIncerc.setEnabled(false);
conRenunt.setEnabled(false);
}catch(SQLException sqlException){
conMesaj.setForeground(Color.RED);
conMesaj.setText("Conectare esuata. Verificati contul !!!");
conIncerc.setEnabled(false);
}
}
else
{
conMesaj.setForeground(Color.RED);
conMesaj.setText("Date incomplete !!!");
conIncerc.setEnabled(false);
}

Privii cu atenie secvena de cod de mai sus. Observi faptul c textele reprezentnd numele
utilizatorului i parola sunt pregtite pentru validare prin eliminarea spaiilor care preced i/sau
urmeaz textului propriu-zis. Sarcina este realizat de ctre metoda trim( ) a clasei String.
Preluarea textului editat n zona controlului parola aparinnd clasei JPasswordField se face cu
metoda getPassword( ). Aceasta returneaz un tablou de caractere (char [ ]) care apoi se
convertete la tipul String cu ajutorul metodei String.copyValueOf( ). Exist i o metod
getText( ) a clasei JPasswordField care returneaz textul n format String, dar aceasta este
considerat nvechit.
Datele privind user-ul i parola sunt considerate valide ntr-o prim etap dac acestea sunt
diferite de irul vid. n caz contrar, formularul afieaz avertismentul Date incomplete ca text
al etichetei conMesaj, dezactiveaza butonul Conectare i ateapt reeditarea datelor sau
renunarea la ncercarea de conectare. Validitatea propriu-zis a contului este confirmat prin
suprapunerea acestuia peste un cont de utilizator existent n baza de date. Dac aceast condiie
este ndeplinit, atunci se va afia un mesaj de confirmare ( "Conectare OK"), iar n caz contrar
mesajul va conine avertismentul "Conectare esuata. Verificati contul !!! " .
n toate cazurile n care butonul Conectare a fost dezactivat, reactivarea lui se va produce
atunci cnd se revine la editarea numelui utilizatorului sau a parolei, adic atunci cnd unul

dintre controalele utilizator sau parol primete focus-ul. Dovada acestor afirmaii o constituie
definiiile metodelor utilizatorFocusGained i parolaFocusGained redate n continuare.
private void utilizatorFocusGained(java.awt.event.FocusEvent evt) {
// TODO add your handling code here:
conMesaj.setText("");
conIncerc.setEnabled(true);
}
private void parolaFocusGained(java.awt.event.FocusEvent evt) {
// TODO add your handling code here:
conMesaj.setText("");
parola.setText("xxxxxxxxxxxx");
parola.doLayout();
parola.selectAll();
conIncerc.setEnabled(true);

Nu uitai s tergei sau s marcai ca un comentariu codul de conectare la baza de date existent
n definiia metodei constructor gestiune( ) a clasei aplicaiei:

.
3. mbuntii aspectul interfeei aplicaiei astfel nct la deschiderea ferestrei principale s fie activ
doar meniul care permite conectarea la baza de date Oracle. Toate celelalte meniuri vor fi vizibile,
dar inactive (a se vedea figura urmtoare).

Pentru a obine acest efect introducei urmtorul cod n metoda care descrie evenimentul
windowOpened asociat ferestrei principale a aplicaiei (click dreapta JFrame -> Events -> Window
windowOpened):
private void formWindowOpened(java.awt.event.WindowEvent evt) {
// TODO add your handling code here:
Tabele.setEnabled(false);
Interogari.setEnabled(false);
Rapoarte.setEnabled(false);
EmitereFacturi.setEnabled(false);
}

4. n situaia n care conectarea la baza de date s-a realizat se dorete dezactivarea meniului de
conectare i activarea celorlate meniuri ale barei de meniu. n cazul eecului va rmne activ, n
continuare, doar opiunea de conectare (pentru a permite o rencercare de conectare).
Modificrile care trebuie aduse aplicaiei se localizeaz n metoda conIncercActionPerformed( )
(metoda care descrie evenimentul produs la acionarea butonului cu textul Conectare din fereastra
conectDialog). Figura urmtoare pune n eviden completrile necesare n cod (liniile ncadrate).

5. Proiectai un formular care s v permit afiarea selectiv a facturilor emise clienilor. Aspectul
acestuia este cel din figura de mai jos.
Atribuii numele selFactDialog acestei ferestre.

Controalele Windows care populeaz suprafaa formularului sunt cele din fereastra Inspector
urmtoare:

Prin intermediul lor se afieaz date din tabelele fc_antet i fc_detaliu.


Articolele casetei combinate fcNrData se formeaz din numrul i data facturii preluate din tabelul
fc_antet. Tot din acest tabel sunt preluate i afiate codul clientului, cheltuielile accesorii i valoarea
total a facturii (cmpurile de text fcCodClient, fcCheltAcc i respectiv, fcValTot).

Detaliile facturii selectate prin intermediul casetei combinate sunt extrase din tabelul fc_detaliu i
sunt afiate n formular de ctre controlul fcDetalii aparinnd clasei JTable.
De reinut ideea c la adugarea unui astfel de control mediul Netbeans l include ntr-un control din
clasa JScrollPane.
De asemenea trebuie precizat faptul c, controlul Jtable se asociaz cu un model de tabel. Modelul
de tabel este obiectul care conine descrierea i coninutul tabelului, acesta din urm servind doar
afirii modelului.
Un model de tabel este un obiect care poate aparine uneia din clasele DefaultTableModel sau
AbstractTableModel.
n continuare optm pentru prima variant. n acest caz, alegerea caracteristicilor modelului se face
prin intermediul proprietii model a obiectului fcDetalii:

n cele ce urmeaz se descrie secvena de construire a casetei combinate. Aceasta se ruleaz la


alegerea opiunii Tabele -> Afisare -> Facturi(selectie) i este coninut n metoda
selFacturiActionPerformed prezentat n continuare:
private void selFacturiActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
selFactDialog.setVisible(true);
selFactDialog.pack();
selFactDialog.setLocation(300, 400);
try {
comanda
=
cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rezultat=comanda.executeQuery("select
*
from
fc_antet
order
by
data,
nr_fact");
//System.out.println("dupa rezultat");
// creare combo
fmt=new SimpleDateFormat("dd-MMM-yyyy");
int nrFact;
Date dataFact;
String articolCombo;
fcNrData.removeAllItems();
//fcNrData.addItem("Alegeti factura");
while(rezultat.next())
{
nrFact=rezultat.getInt("nr_fact");
dataFact=rezultat.getDate("data");
articolCombo=nrFact+"/"+fmt.format(dataFact);
fcNrData.addItem(articolCombo);
}
//fcNrData.setSelectedIndex(0);
} catch (SQLException ex) {
System.out.println("Eroare SQL");
System.exit(1);
}
}

Evenimentul produs la alegerea unui articol al casetei combinate este descris de ctre metoda
fcNrDataActionPerformed:
private void fcNrDataActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int indexCombo=fcNrData.getSelectedIndex();
try {

if(indexCombo>=0)
{
// sterg toate randurile din modelul tabelului, adica vechiul
// continut
DefaultTableModel dm=(DefaultTableModel)fcDetalii.getModel();
int nrLinii=dm.getRowCount();
for(int i=nrLinii-1;i>=0;i--)
{
dm.removeRow(i);
}
// pregatire continut nou al tabelului
rezultat.absolute(indexCombo + 1);
fcCodClient.setText(rezultat.getInt("cod_cli")+"");
fcCheltAcc.setText(rezultat.getFloat("ch_accesorii")+"");
fcValTot.setText(rezultat.getFloat("val_cu_tva")+"");

// pregatire tabel
int nrFact;
Date dataFact;
nrFact=rezultat.getInt("nr_fact");
dataFact=rezultat.getDate("data");
String frazaSQL="select * from fc_detaliu where nr_fact="+
nrFact +" "+"and data="+'\''+fmt.format(dataFact)+'\''+
" order by cod_marfa";
//System.out.println(frazaSQL);
comanda2=cnx.createStatement();
rezultat2=comanda2.executeQuery(frazaSQL);
Object[] dateRand=new Object[7];
while(rezultat2.next())
{
dateRand[0]=rezultat2.getString("cod_marfa");
dateRand[1]=rezultat2.getFloat("cant");
dateRand[2]=rezultat2.getFloat("pret_unitar");
dateRand[3]=rezultat2.getFloat("val_fara_tva");
dateRand[4]=rezultat2.getFloat("tva");
dateRand[5]=rezultat2.getFloat("val_cu_tva");
dateRand[6]=rezultat2.getString("um");
}

ex);

dm.addRow(dateRand);

}
}
catch (SQLException ex) {
Logger.getLogger(gestiune.class.getName()).log(Level.SEVERE,
}

attn: de descris aici lucrul cu modelul de tabel.

null,

10