[ dekifpi @ 17.11.2012. 00:06 ] @
Ljudi pokusavam vec nekoliko sati da resim problem i nikako da shvatim gde gresim.
Imam dve table, tabelu Sifrarnik i tabelu Rashodi, ono sto pokusavam jeste to da korisniku zabranim da obrise iz sifrarnika NAZIV koji je upotrebljen u nekom redu u tabeli Rashodi.

Ja zelim da se obrise samo naziv koji je korisnik odabrao u tabeli Sifrarnik, a program mi obrise bukvalo sve redove u Sifraniku koji nisu upotrebljeni u tabeli Rashodi. Znaci i pored toga sto je u TextField-u naznacen tacan naziv iz sifrarnika koji treba da se proveri i obrise u koliko ne postoji u tabeli rashodima, program obrise bukvalno sve redove koji nisu upotrebljeni.
Na pocetku mi je delovalo kao 5 minuta posla, a na kraju je ispalo da nisam uspeo da uradim.

Evo i koda:

Code:

public void ObrisiSifrarnik(JTable t,  JTextField t1 )
  {
    try{
      int r = JOptionPane.showConfirmDialog(rootPane, "Da li želite da obrište odabrani red?", "UPIT!", JOptionPane.YES_NO_OPTION);
      if(r != JOptionPane.NO_OPTION)
       {
           
     if(t1!=null&&!t1.getText().equals("")){  
          
    conn = connect.ConnectDB();
    Statement st=conn.createStatement();

    String naziv=t1.getText();

    String query= "DELETE FROM SIFRARNIK WHERE NAZIV='"+naziv+"' NOT IN (SELECT RASHOD FROM RASHODI WHERE RASHOD='"+naziv+"')";  

    st.executeUpdate(query);   
    st.close();
    conn.close();
     }
     else
     {
      JOptionPane.showMessageDialog(rootPane, "Morate popuniti sva polja!", "UPOZORENJE", 2);   
     }
    }}
    catch(Exception e)
{
     e.printStackTrace();
}
    }
[ duskooo @ 17.11.2012. 00:48 ] @
Deluje da ti fali jedno AND.
[ dekifpi @ 17.11.2012. 01:05 ] @
Gde mislis da fali?

[Ovu poruku je menjao dekifpi dana 17.11.2012. u 16:48 GMT+1]
[ dule_ns @ 19.11.2012. 08:22 ] @
1) Ovo veze nema sa Javom već sa SQL-om.

2) Uvek kad radiš sa SQL-om prvo u nekom alatu proveri svoje upite/komande pa tek onda kodiraj (znači nađi neki SQL alat za rad sa tvojom bazom)

3) AND ti fali ili ne fali (iz opisa nisam baš shvatio, daj opise tabela) u:
Code:
DELETE FROM SIFRARNIK WHERE NAZIV='"+naziv+"' AND NAZIV NOT IN (SELECT RASHOD FROM RASHODI WHERE RASHOD='"+naziv+"')

4) Nemoj injectovati parametre u SQL upit/naredbu nego koristi parametre (koristi PreparedStatemet)
Code:
DELETE FROM SIFRARNIK WHERE NAZIV=? AND NAZIV NOT IN (SELECT RASHOD FROM RASHODI WHERE RASHOD=?)

5) U kodu u nekom trenutku imaš naredbu
Code:
conn = connect.ConnectDB();

Ne znam čemu ti tačno služi ta naredba ali deluje da tako otvaraš konekciju prema bazi. Ako je tako, gde se ta konekcija zatvara. Običaj je da deo programa koji otvori konekciju na kraju je i zatvori.
[ dekifpi @ 19.11.2012. 15:21 ] @
Znam da nema bas neke veze sa Javom ali posto radim u Javi onda sam i zbog toga postavio pitanje ovde, jer nisam bio siguran u cemu je zapravo problem.

Konekciju zatvaram sa conn.close();

Ovo je upit koji je zavrsio posao:

Code:

"DELETE FROM SIFRARNIK WHERE NAZIV='"+naziv+"' AND NAZIV NOT IN (SELECT RASHOD FROM RASHODI WHERE RASHOD='"+naziv+"')"


I primenio sam prepareStatement!


[Ovu poruku je menjao dekifpi dana 19.11.2012. u 16:44 GMT+1]
[ dule_ns @ 20.11.2012. 10:08 ] @
Izvini za zatvaranje konekcije, nisam video taj red, ali u svakom slučaju ne bi smeo tu da se nalazi.

Zašto?

Zato što može da dođe do situacije da iskoči exception pre tog reda i da programski tok uđe u exception blok i onda ti se zatvaranje konekcije ne izvrši. Zbog toga je bolje da imaš finally blok u kome ćeš zatvoriti sve resurse (i statement tj prepared statemet i konekciju) a koji se izvršava u svakom slučaju, bilo exceptiona ili ne.
[ dekifpi @ 20.11.2012. 20:03 ] @
Hvala puno na savetima :)