# Datenbank Update



## Vaydis (10. Jun 2010)

Hallo ich habe einen kleinen Webshop, nix wildes und möchte jetzt einen Artikel darin updaten. In der Datenbank stehen die Artikel und in Spalte 8 der Tabelle Artikel ist ein Intergerfeld "Verfuegbar" das soll nun von 1 auf 0 geändert werden, den Fehler den ich dabei bekomme sieht so aus:

Caused by: org.apache.derby.client.am.SqlException: Mindestens ein Parameter der aktuellen Anweisung wurde nicht initialisiert.
        at org.apache.derby.client.am.PreparedStatement.checkThatAllParametersAreSet(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.flowExecute(Unknown Source)
        at org.apache.derby.client.am.PreparedStatement.executeUpdateX(Unknown Source)
        ... 23 more

Hier die Javacode:


```
private static boolean doRemoveArtikel(HttpServletRequest request) {

    HttpSession session = request.getSession();
    DataAccess dao = (DataAccess) session.getAttribute("DAO");

    int artikelNr;
    boolean removed = false;


    try {

      artikelNr = Integer.valueOf(request.getParameter("artikelNr"));
      if (artikelNr != 0) {
        removed = dao.removeArtikel("" + artikelNr);
      } else {
        removed = true;
      }

        

    } catch(NumberFormatException e) {

    }

    session.setAttribute("page", "aArtikelListe");

    return removed;
  }
```


```
public boolean removeArtikel(String artikelNr) {
    PreparedStatement pstmt;
    ResultSet result;
    
    boolean removed = false;
    
    try {
      
      pstmt = con.prepareStatement("SELECT * "
                                   + "FROM app.Artikel "
                                   + "WHERE Artikelnr = ?");
      
      pstmt.setInt(1, Integer.valueOf(artikelNr));
      
      result = pstmt.executeQuery();

      if (result.next()) {
        
        pstmt = con.prepareStatement("UPDATE app.Artikel  "
                                   + "SET Verfuegbar = ? "
                                   + "WHERE Artikelnr = ?");
        int verfuegbar = 0;

        pstmt.setInt(1, verfuegbar);
       
        pstmt.executeUpdate();
        
        con.commit();
```

Kann mir jemand weiter helfen?


----------



## srea (10. Jun 2010)

Du haste bei deinem UPDATE-Statement 2 "?" aber setzt nur ein davon mit [c]pstmt.setInt(1, verfuegbar);[/c]. Das fehlt für das zweite. Zum Beispiel [c]pstmt.setInt(2, Integer.valueOf(artikelNr));[/c]

Edit: Warum übergibst du die Artikelnummer eigentlich nicht als int? Du hast ja vor dem Methodenaufruf nen int vorliegen.


----------



## homer65 (10. Jun 2010)

Du mußt nicht nur Verfuegbar, sondern auch Artikelnr setzen.

```
pstmt.setInt(2,wasauchimmer);
```


----------



## Vaydis (10. Jun 2010)

srea hat gesagt.:


> Du haste bei deinem UPDATE-Statement 2 "?" aber setzt nur ein davon mit [c]pstmt.setInt(1, verfuegbar);[/c]. Das fehlt für das zweite. Zum Beispiel [c]pstmt.setInt(2, Integer.valueOf(artikelNr));[/c]
> 
> Edit: Warum übergibst du die Artikelnummer eigentlich nicht als int? Du hast ja vor dem Methodenaufruf nen int vorliegen.




Ja klappt, hätte ich auch selber drauf kommen können, danke!


----------



## Vaydis (10. Jun 2010)

Es hat sich noch ein weiteres Problem ergeben, jetzt bei dem Lesen von JFreechart daten, da meine SQL Kentnisse nicht so gut sind könntet Ihr mir vielleicht helfen, folgendes problem:

SqlException: Der Spaltenverweis 'K.KATEGORIENR' ist ung?ºltig oder Teil eines ung?ºltigen Ausdrucks.  Bei einer SELECT-Liste mit GROUP BY d?ºrfen die ausgew?§hlten Spalten und Ausdr?ºcke nur g?ºltige Gruppierungsausdr?ºcke und g?ºltige Aggregatausdr?ºcke enthalten.

[Java]try { 

      pstmt = con.prepareStatement("SELECT K.KategorieNr, OberKategorieName, Kategoriename, sum(Bp.ArtikelPreis * Bp.Anzahl) "
                                   + "FROM app.Bestellung B, app.Bestellposition Bp, app.Artikel A, app.Kategorie K, app.Oberkategorie Ok "
                                   + "WHERE B.BestellNr = Bp.BestellNr AND "
                                   + "      Bp.ArtikelNr = A.ArtikelNr AND "
                                   + "      A.KategorieNr = K.KategorieNr AND "
                                   + "      K.OberkategorieNR = Ok.OberkategorieNr AND "
                                   + "      ((year(Bestelldatum) = ? AND "
                                   + "      month(Bestelldatum) <= ? ) OR "
                                   + "      (year(Bestelldatum) = ? AND "
                                   + "      month(Bestelldatum) >= ? )) "
                                   + "Group by A.KategorieNr ");

        [/Java]


----------



## Michael... (10. Jun 2010)

```
Group by K.KategorieNr, OberKategorieName, Kategoriename
```
Anhand von A.KategorieNr kann nicht gruppiert werden, da es ja nicht selektiert wird.


----------



## Vaydis (10. Jun 2010)

Michael... hat gesagt.:


> ```
> Group by K.KategorieNr, OberKategorieName, Kategoriename
> ```
> Anhand von A.KategorieNr kann nicht gruppiert werden, da es ja nicht selektiert wird.



Super, danke!


----------



## Vaydis (10. Jun 2010)

Und die letzte Frage für heute, ich habe JFree nun eingebunden und das läuft auch, die erstellten Grafiken werden auf der Platte abgelegt und in netbeans über localhost angesprochen, wenn ich jetzt im Webshop die Statistik aufrufe bekomme ich immer die alte, wenn ich dann zeitgleich in Netbeans wechseln fragt er mich ob er das Bild reloaden soll, wenn ich das bestätige hab ich auch die aktuelle Statistik im Shop, kann man dieses zwischenladen und bestätigen umgehen, oder automatisieren?


----------

