# Einfaches Progrämchen



## chipmount (5. Nov 2004)

Hi Leute,
habe folgendes problemm:

habe 2 tabellen Bestellung(bestnr,...BESTSUM) und Bestellposition(bestnr,posnr,menge,preis)
möchte jetz folgendestun:
für die einzelnen Bestellungen die Bestelsumme (abhänig von dazugehörigen bestellpositionen ) berechnen und unter kolumne BESTSUM der Bestellung ablegen

bestnr,posnr preis sind nom type NUMBER rest ist VARCHAR2

oracle und jdbc funktionieren

  code dazu :



```
import java.sql.*;
public class Bestellung {
	public static void main (String [] args) throws SQLException
	{
		try {
			Class.forName ("oracle.jdbc.driver.OracleDriver");
			Connection c = DriverManager.getConnection(
			"jdbc:oracle:thin:@..:1521:..", "", "");
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(
				"SELECT menge,preis,posnr FROM Bestellposition");
			Statement a = c.createStatement();
			ResultSet ra = a.executeQuery(
				"SELECT bestnr, bestsum FROM Bestellung");
						
		while (rs.next())
				{
				   int[] bnr = new int [10000];
				   int i=0, j=0;					
				  double [] summe = new double[10000];
				   String erg;
				   bnr [i] =rs.getInt(1);
				   summe [i]= (rs.getInt("menge")* rs.getDouble("preis"));
				    
				    erg= "" + summe[i];
				    	for (j=0; j<i; j++)
				    		{
				    		    if (bnr[i]== bnr[j])
				    			{
				    				summe[i]+= summe[j];
				    				
				    			}
			String sl ="UPDATE Bestellung SET bestsum=?, bestnr=?";
			PreparedStatement p = c.prepareStatement(sl);				    		
			p.setString(1, "erg");
			p.setString(2, "bestnr");
			p.executeUpdate();				
				    			
				    		}			
				
				 System.out.println
			(rs.getString ("bestnr")+ "\t" + 
			rs.getString ("menge")+ "\t" +									 
			rs.getString ("preis")+"\t" +				
			rs.getString ("posnr"));}//end while
								
											 
			    c.close();}//end try
			  catch (Exception e) {
			  	e.printStackTrace(); }
			  }//end main
	}//end Bestellung
```

meine fehlermeldung:

java.sql.SQLException: Ungültiger Spaltenname
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
        at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java:5971)
        at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1527)
        at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1482)
        at Bestellung.main(Bestellung.java:41)

zeile 41 ist das hier: "System.out.println"

ich weiss nicht mehr weiter 

da ich ein anfänger binn würde ich mich über jeden tipp/verbesserungsvorschlag freuen

dancke


----------



## Guest (6. Nov 2004)

Versuch's mal damit

```
UPDATE Bestellung
SET BESTSUM = (
  SELECT SUM(p.preis*p.menge)
  FROM Bestellposition p
  WHERE p.bestnr = bestnr
)
```


----------



## chipmount (6. Nov 2004)

danke für den tipp aber kannst du mir bitte sagen wo ich die abfrage einbauen soll (in den try oder while körper)
danke


----------



## Guest (6. Nov 2004)

Nöö, nix Schleife. Lass SQL den Job tun 

```
public static void main (String [] args)
  {
    Connection c = null;
    PreparedStatement p = null;
    try
    {
      Class.forName ("oracle.jdbc.driver.OracleDriver");
      c = DriverManager.getConnection("jdbc:oracle:thin:@..:1521:..", "", "");
      p = c.prepareStatement(
        "UPDATE Bestellung "
       +"SET BESTSUM = ("
       +"  SELECT SUM(p.preis*p.menge)"
       +"  FROM Bestellposition p"
       +"  WHERE p.bestnr = bestnr"
       +")"
      );
      p.executeUpdate();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    finally
    {
      if(p!=null) { try { p.close(); } catch(Exception e){}}
      if(c!=null) { try { c.close(); } catch(Exception e){}}
    }
  }
```


----------



## abollm (7. Nov 2004)

Anonymous hat gesagt.:
			
		

> Nöö, nix Schleife. Lass SQL den Job tun
> 
> ```
> ...
> ```



Grundsätzlich ok, aber die richtige Ausführung des hier gesendeten Codes ist vom Tabellenaufbau abhängig. Du kannst dir in Abhängigkeit davon ohne weiteres mit dem geposteten Code falsche Einträge in deiner Tabelle "Bestellung" erzeugen lassen.

Grundsätzlich ist es aber immer besser über SQL oder PL/SQL zu gehen, als sich eigene Schleifen im Java-Programm zu bauen.


----------



## Guest (7. Nov 2004)

abollm hat gesagt.:
			
		

> Grundsätzlich ok, ...


In anderen Fällen auch. :roll:


			
				abollm hat gesagt.:
			
		

> Du kannst dir in Abhängigkeit davon ohne weiteres mit dem geposteten Code falsche Einträge in deiner Tabelle "Bestellung" erzeugen lassen.


Ich hab's doch anhand der Angaben in der Fragestellung gemacht. Wo liegt das Problem? 
Siehe: _"2 tabellen Bestellung(bestnr,...BESTSUM) und Bestellposition(bestnr,posnr,menge,preis)"_



			
				abollm hat gesagt.:
			
		

> Grundsätzlich ist es aber immer besser über SQL oder PL/SQL zu gehen, als sich eigene Schleifen im Java-Programm zu bauen.


Zumindest in einer Sache (fast) einer Meinung. 
Dieses 'Grundsätzlich' lässt auf Zweifel schliessen. Du musst an Deinem Ego arbeiten


----------



## abollm (7. Nov 2004)

Anonymous hat gesagt.:
			
		

> abollm hat gesagt.:
> 
> 
> 
> ...



Deinen leicht unsachlichen Ego-Quark (trotz Fröhlichkeitsanzeiger) einmal außer Acht gelassen, kann ich dir beruhigt mitteilen, dass ich problemlos falsche Einträge mit deinem Update-Code mit einer möglichen Tabellenstruktur (s.o.) erzeugt habe.

Als kleine Aufgabe für dich, der sich ja interessanterweise nur als "Gast" zu erkennen gibt, bleibt es jetzt herauszufinden, wie man deinen SQL-Code so verbessern kann, um das falsche Aktualisieren zu umgehen.


----------



## Guest (7. Nov 2004)

habe dise abfrage in sql eingegeben


```
UPDATE Bestellung 
SET BESTSUM = ( 
  SELECT SUM(p.preis*p.menge) 
  FROM Bestellposition p 
  WHERE p.bestnr = bestnr 
)
```

krige aber falsche werte raus


----------



## Guest (8. Nov 2004)

@abollm
OK, Du hast Recht, es hat einen Fehler. Kein Grund sich gleich künstlich aufzuregen.
Ist nicht meine Absicht jemanden zu beleidigen aber statt hier Rätsel und allgemeines 
Zeug zu schreiben, hättest Du den Fehler nennen können. So ist erst ein Tag vergangen, 
bis 'chipmount' eine funktionierende Lösung hat. (wenn er es inzwischen nicht anders gelöst hat)

Hier die korrekte Lösung:

UPDATE Bestellung 
SET BESTSUM = ( 
  SELECT SUM(p.preis*p.menge) 
  FROM Bestellposition p 
  WHERE p.bestnr = *Bestellung.*bestnr 
)


----------



## abollm (8. Nov 2004)

Anonymous hat gesagt.:
			
		

> @abollm
> OK, Du hast Recht, es hat einen Fehler. Kein Grund sich gleich künstlich aufzuregen.
> Ist nicht meine Absicht jemanden zu beleidigen aber statt hier Rätsel und allgemeines
> Zeug zu schreiben, hättest Du den Fehler nennen können. So ist erst ein Tag vergangen,
> ...



@gast:

Es ist auch nicht meine Art, Rätsel aufzugeben. Aber nun ist es ja zur hoffentlichen Zufriedenheit aller zu Ende gebracht. Außerdem frage ich mich: künstliche Aufregung... :?: 

Besten Gruß

Armin


----------



## Guest (8. Nov 2004)

Heißt es wir haben uns wieder lieb 

Künstlich Aufregen = Grundlos Aufregen, ohne es wirklich so zu meinen, oder so ähnlich...


----------



## abollm (8. Nov 2004)

Anonymous hat gesagt.:
			
		

> Heißt es wir haben uns wieder lieb



Aber klar doch.



> Künstlich Aufregen = Grundlos Aufregen, ohne es wirklich so zu meinen, oder so ähnlich...



Ich würde sagen: gar kein Aufregen.

Außerdem hatte ich doch gleich gemerkt, dass einer wie du das Thema richtig in den Griff bekommt, denn der Ansatz war super.  :toll:


----------



## chipmount (9. Nov 2004)

VIELEN DANK  :lol:  :lol:  :lol:  :lol:


----------

