Šta je novo?

Java code help!

Učlanjen(a)
04.12.2005
Poruke
314
Poena
319
treba mi pomoc oko jednog projekta. Stvari stoje ovako.. imam oracle db sa odredjenim tabelama.( nista komplikovano) sad treba da uradim program u javi koji:

1. kada user unese class type ( ovo je atribute iz tabele) onda da program vrati listu sa svim poudjenim class(casovima) i total ravenue od tih casova

2. ako user unese ime i prezime ili ID, onda da se vrati koje je casove uzeo taj ucenik

3. (najtezi) ukoliko user hoce da da popust odredjenoj grupi ( npr starosti od 50-70) treba da ukuza " koliko % i koja starosna grupa) i program treba da vrati vec odradjen popust.

prva dva pitanja sam ovako zamislio da resim. prvo pitam usera sta unosi( npr, za id press 1, za full name 2..) onda otvorim konekciju i napravim query koji vraca tu vrednost iz tabele)

jel to ok? 3 pitanje, nemam pojma kako da resim.
 
SQL naredba za treci ide ovako:
Update <tabela> set <atribut>=<atribut>*procenat where <atribut sa godinama> between <vrednost prva> and <vrednost druga>.

http://psoug.org/reference/update.html

Ne znam sta te bas muci? SQL ili Java kod?

Ako ne znas kako da ga izvedes, manje vise uvek ovako:
Kod:
import java.sql.*;
class dbAccess {
  public static void main (String args []) throws Exception
  {
        Class.forName ("oracle.jdbc.OracleDriver");

        Connection conn = DriverManager.getConnection
             ("jdbc:oracle:oci8:@hostname_orcl", "scott", "tiger");
                     // or oci7 @TNSNames_Entry,    userid,  password
        try { 
        Statement stmt = conn.createStatement();
        try {
        ResultSet rset = stmt.executeQuery("select BANNER from SYS.V_$VERSION");
        try {
        while (rset.next())
              System.out.println (rset.getString(1));   // Print col 1
        } finally {
            try { rset.close(); } catch (Exception ignore) {}
        }
        } finally {
            try { stmt.close(); } catch (Exception ignore) {}
        }
        } finally {
            try { conn.close(); } catch (Exception ignore) {}
        }
  }
}
 
Poslednja izmena:
hvala ti, ovo je bas pomoglo.

problem oko Java kod-a je taj sto jos uvek nisam odlucio na koji nacin da program prepozna unos user-a tj. posto u ovom slucaju user ima opciju da unese class name ili ime i prezime ili ID. jedna varijanta koju imam u glavi je da ga pre nego sto bilo sta unese, upitam sta hoce da unese, ili da program prepozna naredbu recimo posto class je jedna rec, id je broj, a full name je 2 reci. pa mogu po tome da napravim razliku. danas cu raditi na tome. Sta vi mislite?

hvala jos jednom.
 
Ja bih iskoristio KISS (Keep it short and simple). Prvo, zato sto sam sistem predvidjanja moze biti relativno nepredvidiv, a drugo sto je takav sistem prilicno neprosiriv. Sta ukoliko ti zatreba pretraga po kombinaciji parametara (na primer po imenu i class-u) ili zelis da dodas po jos nekom parametru (godinama)? Sve ovo zavisi od toga kako pravis aplikaciju, za sta, sa kojim ciljem i kakva je upotreba. Svejedno, debelo bih razmislio.

Znaci radio box, text box i udri, ili jos bolje posebni textboxevi koji se medjusobno iskljucuju. Ukoliko zelis da bas bude user friendly, mozes napraviti nesto tipa "did you mean..." ako na primer unese broj a selektovan Class radio-box, ili ako se javlja rezultat pretrage u jos nekoj kategoriji osim one u kojoj je korisnik izabrao. To dovodi do toga da moras izvrsavati visesturke upite nad bazom za jedan pojam, a uglavnom ce biti nepotrebni. To moze da utice na performanse, pogotovo sa vecim brojem korisnika. I za te stvari postoje resenja, samo zavisi koliko zaista duboko zelis da ides za ovako jednostavan problem. Napravio sam filozofiju ni oko cega 🙂 .
 
Kako da resim ovo:

ResultSet rset = stmt.executeQuery(
"SELECT title, sum(cost)as "Total Revenue/Title"" + // OVDE JE PROBLEM ZATO STO POSLE AS TREBAJU MI DOUBLE QUOTES KOJE JAVA PREPOZNAJE "NA SVOJ NACIN!" Kako da izbegnem ovo??
"FROM Class, Enrollment" +
"WHERE Class.TYPES = + userChoiceClass + and Class.id = Enrollment.class_id" +
"GROUP BY title;");
 
uh, nasao sam nesto i mislim da sam resio predhodni problem. Imam jos par nekih sitnih gresikica i da malo sredim ovaj urnebes 🙂

imam 4 greske koje su povezane. Problem je sa CASE-ovima .. ali ne mogu da pronadjem


Kod:
package marko_Package;

import java.util.*;
import java.sql.*;

class inputSql 
{
	public static void main(String[] args) 
	{
		String userChoiceF_name;
		String userChoiceL_name;
		String userChoiceClass;
        int userChoiceID = 0;
		int cases = 3;
		boolean done = true;

		System.out.println("To enter first and last name, press 1 .");
		System.out.println("To enter ID number, press 2 .");
        System.out.println("To enter the class name, press 3 .");
		
		Scanner scan = new Scanner(System.in);

		int userPress; // variable keeps user input ex 1,2,3 used for switch
	
		while(done);
		{
		       switch(userPress)
		           { 
		            	case 1:   System.out.println(" Please enter first name: ");
			            userChoiceF_name = scan.next();
				        System.out.println(" Please enter last name: ");
					    userChoiceL_name = scan.next();
					    Class.forName ("oracle.jdbc.OracleDriver");
		

                        Connection conn = DriverManager.getConnection
                       ("jdbc:oracle:thin:@fourier.cs.iit.edu.:1521:orcl", "mzivkovi", );
                    
                           
                         Statement stmt = conn.createStatement();
						    

                          {
                          ResultSet rset = stmt.executeQuery(
                        		  "select address, phone" +
                          				"from RecCenterMember, Family_Package" +
                          				"where RecCenterMember.f_name = ' "+ userChoiceF_name +" ' and RecCenterMember.l_name = '"+userChoiceL_name+ " 'and RecCenterMember.family_id = Family_Package.id"
                          					);
		
			
						      
                          {
                          while (rset.next())
                              System.out.println (rset.getString(1));   
                       
                          
                            try { rset.close(); } catch (Exception ignore) {}
                        
                        
                            try { stmt.close(); } catch (Exception ignore) {}
                        
		       
                            try { conn.close(); } catch (Exception ignore) {}
                          }
                          }
                          
                          int personalInfoKey;

                          	System.out.println(" If you want personal information about this requested user, press 0 or any other key for NO.");

		personalInfoKey = scan.nextInt();
		
			if (personalInfoKey <= 0)
			
			{
				Connection conn1 = DriverManager.getConnection
                ("jdbc:oracle:thin:@fourier.cs.iit.edu.:1521:orcl", "mzivkovi", );
                     // connection, user name and password
            
                Statement stmt1 = conn1.createStatement(); // maybe use later to insert new data into db

             
                ResultSet rset1 = stmt.executeQuery(
                		"select address, phone" +
                				"from RecCenterMember, Family_Package" +
                				"where RecCenterMember.f_name = ' "+ userChoiceF_name +" ' and RecCenterMember.l_name = '"+userChoiceL_name+ " 'and RecCenterMember.family_id = Family_Package.id"
                					);
                while (rset1.next())
           		 
                    System.out.println (rset1.getString(1));   
              
                 
                   try { rset1.close(); } catch (Exception ignore) {}
               
               
                   try { stmt.close(); } catch (Exception ignore) {}
               
      
                   try { conn.close(); } catch (Exception ignore) {}
			}
			
				else 
						System.out.println("Then this information is enough");
		           
		
				
				
			
		           }

	 break;

		case 2:   System.out.println (" Please enter ID number: ");
			           userChoiceID = scan.nextInt();
					   Class.forName ("oracle.jdbc.OracleDriver");

					   Connection conn = DriverManager.getConnection
							   ("jdbc:oracle:thin:@fourier.cs.iit.edu.:1521:orcl", "mzivkovi", );
                     // connection, user name and password
					   try { 
						   Statement stmt = conn.createStatement(); // maybe use later to insert new data into db

						   try {
        	ResultSet rset = stmt.executeQuery(
			"SELECT title, cost " +  
			"FROM RecCenterMember, Class, Enrollment" +
			"WHERE RecCenterMember.id = ' " +userChoiceClass+" ' + and RecCenterMember.id = Enrollment.member_id and Enrollment.class_id = Class.id");
        	try {
        		while (rset.next())
              System.out.println (rset.getString(1));   
        	} finally {
        		try { rset.close(); } catch (Exception ignore) {}
        }
						   } finally {
							   try { stmt.close(); } catch (Exception ignore) {}
						   }
					   } finally {
        	try { conn.close(); } catch (Exception ignore) {}
					   }
				      break;
					  int personalInfoUsingName;

		System.out.println(" If you want personal information about this requested user, press 0 or any other key for NO.");

		personalInfoUsingName = scan.nextInt();
		
			if (personalInfoUsingName <= 0)
			
			{
				Connection conn2 = DriverManager.getConnection
                ("jdbc:oracle:thin:@fourier.cs.iit.edu.:1521:orcl", "mzivkovi", );
                     // connection, user name and password
        
                Statement stmt2 = conn2.createStatement(); // maybe use later to insert new data into db

       
                ResultSet rset2 = stmt2.executeQuery(
			"select address, phone" +
			"from RecCenterMember, Family_Package" +
			"where RecCenterMember.f_name = ' "+ userChoiceF_name +" ' and RecCenterMember.l_name = '"+userChoiceL_name+ " 'and RecCenterMember.family_id = Family_Package.id"
				);
                while (rset2.next())
                    System.out.println (rset2.getString(1));   
                
                
                  try { rset2.close(); } catch (Exception ignore) {}
              
              
                  try { stmt2.close(); } catch (Exception ignore) {}
              

                  try { conn2.close(); } catch (Exception ignore) {}
                }
			
				else System.out.println("Then this information is enough");
	            
		   

		}

		    case 3:  
		    	
		    	System.out.println (" Please enter Class Name: ");
			    userChoiceClass = scan.next();
			    Class.forName ("oracle.jdbc.OracleDriver");

			    Connection conn = DriverManager.getConnection
			    		("jdbc:oracle:thin:@fourier.cs.iit.edu.:1521:orcl", "mzivkovi", );
			    // connection, user name and password
			    		try { 
			    				Statement stmt = conn.createStatement();

			    					try {
			    							ResultSet rset = stmt.executeQuery(
        				"SELECT title, cost " +  
        				"FROM RecCenterMember, Class, Enrollment" +
        				"WHERE RecCenterMember.id = ' " + userChoiceClass +" ' + and RecCenterMember.id = Enrollment.member_id and Enrollment.class_id = Class.id");
			
			    							try {
			    								while (rset.next())
			    									System.out.println (rset.getString(1));   
			    							} finally {
			    								try { rset.close(); } catch (Exception ignore) {}
			    							}
			    					} finally {
			    						try { stmt.close(); } catch (Exception ignore) {}
			    					}
			    		} finally {
			    			try { conn.close(); } catch (Exception ignore) {}
			    		
					   break;
					   
		    	default:  System.out.println(" Wrong input, Please try again.");
	
     done = false;
 
Poslednja izmena od urednika:
Budi malo precizniji kada definises problem, jer nisam skroz sigura u sta treba da gledam. I stavljaj kod u code tagove. Koje su ti greske?

Koliko mogu da vidim ti nigde ne inicijalizujes ovo userPress koji odmah nakon dekleracije stavljas u switch. To je sve sto mogu da vidim iz ovakvog koda, bez gresaka koje ti daje kompajer.

Btw. bolje koristi obrnutu logiku while(!done) a done stavi kao false, neko ce biti zbunjen ovako.

Inace, iako SQL radi sa ", preporuka je da stavljas ', bas zbog ovakvih situacija, kao sto si imao tj. enkapsulacija navodnika. Ako ti trebaju navodnici unutar vec otvorenih navodnika, koristi apostrof. Ako ti trebaju vise puta ugnjezdeni navodnici, nesto radis pogresno 😀 .

Trece, uopste i nemoj na ovaj nacin da pravis dinamicke upite. Nije pregledno, a nije ni bezbedno. Koristi ovako nesto:

Kod:
PreparedStatement stm = c.prepareStatement("UPDATE user_table SET name=? WHERE id=?");
stm.setString(1, "the name");
stm.setInt(2, 345);
stm.executeUpdate();

I pazi da ne ostavljas connection string na forumu, nisu svi dobronamerni 😀 .
 
Poslednja izmena:
Pa dobro, bar nije šifru ostavio. 🙂

hint: Pokušaj malo da organizuješ taj kod uz smislene celine.
 
hvala na sugestijama. Slazem se da je code bio konfuzan. Sredio sam ga koliko god sam mogao i sada imam samo jednu gresku koja kaze da mi treba jos jedna zagrada ali kada je dodam, nastaje haos. Post-ovacu code.

Slazem se da je prepared statement bolja varijanta ali i ovo ce odraditi ovaj zadatak pa cu u buducnosti znati. Imam jos dosta sitnica koje moram da ukljucim u ovaj projekat ali to otom-potom.

sad mi treba query koji kombinuje dve tabele (RecCenterMember i Enrollment)
u RecCentru se nalazi date of birth(DOB) a u Enrollment se nalazi cost. treba da odradim query koji ce kad user unese recimo 20 >19500606 da dodeli povisicu svima koji su rodjeni posle 1950 06 06 i da izbaci novu verziju cost-a.

Hvala jos jednom na pomoci, znam da su stvari mogle da se odrade na bolji nacin ali ja samo zelim da ovaj projekt skinem s' vrata i za sledeci cu imati vece znanje.
 

Prilozi

Sifra vise nije ista, cisto ako je neko zlonameran.. mada ne verujem da nekom to nesto znaci 🙂
 
Želiš da povećaš cenu svima koji zadovoljavaju neki kriterijum?

Jednim upitom (pod pretpostavkom da su ti tabele ostale iste):

Kod:
update ENROLLMENT set cost = cost * 1.2
 WHERE member_id IN
          (SELECT ID
             FROM RECCENTERMEMBER
            WHERE TO_DATE(DOB, 'mm\dd\yyyy') >
                     TO_DATE ('1950-06-06', 'yyyy-mm-dd'))

Cenu povećaca za 20%.

TO_DATE(DOB, 'mm\dd\yyyy') - DOB je string koliko sam ja video. Ako ga nisi već promenio u DATE (što ti preporučujem), pazi da smeštaš datum uvek istog formata.
Umesto 1950-06-06 ćeš upisati datum koji je korisnik uneo. Pazi na SQL injection.

Drugi način je da uradiš select svih članova, da u Javi odrediš za koje radiš određenu korekciju cena, to sve smestiš u jednu listu i onda na osnovu te liste radiš jedan po jedan update.

Naravno posle update-a, radiš commit.
 
Poslednja izmena:
U Javi po defaultu ne mora, Connection izvrsava auto-commit.
 
DOB nije string nego DATE. Ovaj query ima logike ali u mom slucaju treba mi nesto "malcice" drugacije. kod mene ce user uneti u procenat povecanja plate( to ide u npr. userPercentage) a za koju generaciju da vazi u odvojenu variabilu. Ako user ukuca 20 (int) pa onda 19500606( takodje int), treba da pokaze za koliko se promenio total revenue. Znaci stvar je mnogo komplikovanije jer treba da se izracuna koliko je taj procenat discount-a samnjio total revenue.

uz sve to, ja treba da smestim dve java variabile u taj query :zgran:
ako je za utehu, jos niko nije uspeo da odradi to od ucenika :guitar:
 
I nije uteha, jer ovo nije bas rocket science, ali prasta vam se ako ste skolarci 🙂 .

Query koji ti je dao zeleni_zub i dalje vazi tj. on povecava cenu. Meni nije bas jasno sta povecavas, cenu, platu ili discount, tako da sam tu malo u magli, no princip se ne razlikuje.

Ako zelis da dobijes razliku u prihodu pre i posle popusta, najlakse ti je da izracunas revenue pre povecanja, promenis sta vec menjas u svemu tome, ponovo izracunas revenue i nadjes razliku sa prethodnim. Jednim upitom neces moci da zavrsis posao.
 
Poslednja izmena:
Iskreno, nije mi jasno šta treba da uradiš. 🙂 Uneseš procenat za popust i uslov, on uradi update cena, i izračuna ti koliko se promenila mesečna zarada?

Promenljive u SQL upit možeš da ubaciš na dva načina. Da sam formiraš string, ili da koristiš PreparedStatement.

Razliku u zaradi vrlo lako računaš:
Prvo u Javi dobiješ množilac za popust (podeliš procenat sa 100) i tu dobiješ broj između 0 i 1.
discountRate = percent / 100.0

Kod:
select sum( round( cost * discountRate, 2) )   from enrollment where <uslov koji određuje na koga se odnosi popust>;
Ovaj upit će ti vratiti ukupno koliko će se smanjiti mesečna zarada.


Posle njega radiš update:

Kod:
update  enrollment set cost =  round( cost * (1.0 - discountRate), 2) where  <uslov koji određuje na koga se odnosi popust>;

Drugi način je ovako kao što je WebWolf napisao, izračunaš prihod, uradiš update, pa ponovo izračunaš prihod i oduzmeš te dve vrednosti.

Ovo su osnovne matematičke operacije, ja ne verujem da niko nije uspeo da uradi. U koju školu ideš?


@WebWolf: Ne programiram u Javi, nisam znao da radi autocommit po defaultu. 🙂
 
Poslednja izmena:
Funkcija UpdateCost primenjuje popust (izražen u procentima od 0 - 100) za sve članove mlađe od datuma koji se prosledi u parametrima. Vraća iznos popusta na mesečnom nivou (pod uslovom da ti je cost mesečna članarina):

Kod:
package oracletest;
import java.sql.*;

public class OracleDB
{
    protected Connection oraConnection = null;
    
    public OracleDB() 
    {
        String connectionString = "jdbc:oracle:thin:@192.168.100.110:1521:oraDev";

        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            oraConnection = DriverManager.getConnection(connectionString , "test", "noSoupForYou");
        }
        
        catch (Exception ex)
        {
            oraConnection = null;
        }

        
        return;
    }
    
    double UpdateCost(String date, double percent) //date must be in format yyyy-mm-dd
    {
        double revenueDelta = 0.0;
        double discountRate = percent / 100.0;
        
        String sqlGetCostDelta =  "select sum( round( cost * ?, 2) )  from enrollment where member_id IN (SELECT ID FROM RECCENTERMEMBER WHERE DOB > to_date(?, 'yyyy-mm-dd'))";
        String sqlUpdateCostData =  "update enrollment set cost = round( cost * (1.0 - ?), 2) where member_id IN (SELECT ID FROM RECCENTERMEMBER WHERE DOB > to_date(?, 'yyyy-mm-dd'))";
        PreparedStatement oraSta;
        ResultSet oraRS;
        
        try
        {
            //get sum
            oraSta = oraConnection.prepareStatement(sqlGetCostDelta);
            oraSta.setDouble(1, discountRate);
            oraSta.setString(2, date);
            oraRS = oraSta.executeQuery();
            
            if(oraRS.next() == true)
                revenueDelta = oraRS.getDouble(1);

           //update cost
            oraSta = oraConnection.prepareStatement(sqlUpdateCostData);
            oraSta.setDouble(1, discountRate);
            oraSta.setString(2, date);
            oraSta.executeUpdate();
           
            oraConnection.commit();   // :D
            
        }
        
        catch(SQLException ex)
        {
            
        }
        
        
        return revenueDelta;
    }
    
    public void Close()
    {
        try
        {
            if(oraConnection != null)
                oraConnection.close();
        }
        
        catch (SQLException ex)
        {
            
        }
        
        return;
    }
            
    
}
 
Poslednja izmena:
ok, zavrsio sam posao.. Ljudi stvarno hvala, mnogo sam naucio ovde. Imam pitanje oko SQLException-a. Recimo zadatak mi je da kad user ukuca ime i prezime, i ako toga nema u db, onda ti nudi insert. E sad kako da uhvatim taj exception i iskoristim za ovako nesto..

jos jednom, ZIVEO FORUM 🙂
 
Uradiš select user_id from users where first_name = 'ime' and last_name = 'prezime', ako ti vrati nula redova onda korisnik može da ukuca ime i prezime i uradiš insert novog user-a u tabeli. Exception-i se u ovom slučaju ne generišu.

Ako baš hoćeš da ih koristiš, morao bi da napraviš funkciju koja proveri da li postoji korisnik u bazi i onda generiše neki exception.
 
Pet bambija za pažljivo čitanje koda. Ali... no soup for you! One year! 😀
 
Nazad
Vrh Dno