# Daten aus DB in variable Zahl an Variablen speichern



## Taramsis (2. Jul 2009)

Hi,

ich versuch mich gerade dran Daten zum bearbeiten aus einer DB zu lesen. Ich habe eine DB "Modules" und dieser enthählt je nach dem wieviele Module man erstellt hat, die selbige Anzahl an Tabellen.
Nun möchte ich die Daten aus dieser variablen Zahl an Tabellen in einem Resultset speichern, um entsprechende Werte zu berechnen (z.B. zeitliche Länge durch Start- und Endzeiten). Ich muß erwänen, dass die Tabellen unterschiedlich heißen, aber die Namen der Values sin immer gleich.
*Mein Frage lautet wie kann ich die Daten in einer variablen Zahl an Variblen Speichern, um diese für entsprechende Berechnungen zu benutzen?*

Mein Ansatz:


```
public void getDuration() {
        Date date;
        try {
            Class.forName(driver);
            con = (Connection) DriverManager.getConnection(url + db  , user, pass);
            stmt = (Statement) con.createStatement();

            res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                 "TaskStart, " +
                                                 "TaskEnd, " + 
                                                 "Piority, " + 
                                                 "TimeFrame " +
                                                 "FROM " + managerAlg.getStringData() + " " );

            res.next();
            
            managerAlg.setCommonDim(res.getString("TaskCommonDim"));
            managerAlg.setTaskStart(res.getString("TaskStart"));
            managerAlg.setTaskEnd(res.getString("TaskEnd"));
            managerAlg.setPiority(res.getString("Piority"));
            managerAlg.setTimeFrame(res.getString("TimeFrame"));
            
            date = (Date) managerAlg.getFormat().parse(managerAlg.getTaskStart());
            date.setTime(date.getTime());
            System.out.println(date);            
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
```

funzt natürlich nicht! 
" managerAlg.getStringData() " gibt die Namen der Module wieder und dies durch ein Komma getrennt! 
In einer Manager-Klasse habe ich die get und set Methoden definiert!


----------



## musiKk (2. Jul 2009)

In einem Array?


----------



## Gelöschtes Mitglied 5909 (2. Jul 2009)

verwende eine liste und füge da objekte deines Datencontainers hinzu


----------



## Taramsis (6. Jul 2009)

Wiekann ich den z.B für einen Modul alle längen(Endzeit-Startzeit) berechnen?


```
public void getDuration() {
        Date date;
        Date date2;
        try {
            Class.forName(driver);
            con = (Connection) DriverManager.getConnection(url + db  , user, pass);
            stmt = (Statement) con.createStatement();

            res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                 "TaskStart, " +
                                                 "TaskEnd, " + 
                                                 "Piority, " + 
                                                 "TimeFrame " +
                                                 "FROM m1 " );

            res.next();
            
            managerAlg.setCommonDim(res.getString("TaskCommonDim"));
            managerAlg.setTaskStart(res.getString("TaskStart"));
            managerAlg.setTaskEnd(res.getString("TaskEnd"));
            managerAlg.setPiority(res.getString("Piority"));
            managerAlg.setTimeFrame(res.getString("TimeFrame"));
            
            date = (Date) managerAlg.getFormat().parse(managerAlg.getTaskStart());
            date2 = (Date) managerAlg.getFormat().parse(managerAlg.getTaskEnd());
            x = date.getTime()/60000;
            y = date2.getTime()/60000;
            z = y - x;
            date.setTime(date.getTime());
            
            
            con.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println(z + " min");
    }
```
Ich habe doch durch die SELECT Anweisung alle Daten aus der DB geholt? Bin wirklich nicht besonders fit in Sachen DB;(


----------



## SlaterB (7. Jul 2009)

fange ganz einfach an, am besten ohne DB sondern mit einer Textdatei oder mit einer String-Liste / Array direkt im Programm, das ist meist ähnlich,

lies die Datei ein und gib sie Zeile für Zeile aus, 
danach zu jeder Zeile Berechnungen, z.B. die Zeilenlänge

Grundfunktionen wie Arrays und Schleifen kennenleren


----------



## Taramsis (7. Jul 2009)

Ich würde gern so etwas haben:

```
public Object[][] getDuration() {
        Object[][] list = null;    
        int listSize = 0;
        Date date;
        Date date2;
        try {
            Class.forName(driver);
            con = (Connection) DriverManager.getConnection(url + db  , user, pass);
            stmt = (Statement) con.createStatement();

            res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                 "TaskStart, " +
                                                 "TaskEnd, " + 
                                                 "Piority, " + 
                                                 "TimeFrame " +
                                                 "FROM m1 " );

           
            
            managerAlg.setCommonDim(res.getString("TaskCommonDim"));
            managerAlg.setTaskStart(res.getString("TaskStart"));
            managerAlg.setTaskEnd(res.getString("TaskEnd"));
            managerAlg.setPiority(res.getString("Piority"));
            managerAlg.setTimeFrame(res.getString("TimeFrame"));
            
//            date = (Date) managerAlg.getFormat().parse(managerAlg.getTaskStart());
//            date2 = (Date) managerAlg.getFormat().parse(managerAlg.getTaskEnd());
//            x = date.getTime()/60000;
//            y = date2.getTime()/60000;
//            z = y - x;
//            date.setTime(date.getTime());
            
            while (res.next()) {
                listSize++;
            }
            res.first();
            
            if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim");
                    list[i][1] =  res.getTime("TaskEnd")/60000 - res.getTime("TaskStart")/60000; // Zeile ist Bullshitt, aber wie könnte ich so etwas direkt berechnen
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");
                    

                    res.next();
                }
            }
            
            con.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println(z + " min");
        return list;
    }
```


----------



## Taramsis (7. Jul 2009)

Habs fast geschafft bekomme in der for-Schleife immer das gleiche Objekt!

```
public Object[][] calDuration() {
        Object[][] list = null;  
        Object[] z = null;
        int listSize = 0;
        Date date;
        Date date2;
        try {
            Class.forName(driver);
            con = (Connection) DriverManager.getConnection(url + db  , user, pass);
            stmt = (Statement) con.createStatement();

            res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                 "TaskStart, " +
                                                 "TaskEnd, " + 
                                                 "Piority, " + 
                                                 "TimeFrame " +
                                                 "FROM m1 " );

           
            
//            managerAlg.setCommonDim(res.getString("TaskCommonDim"));
//            managerAlg.setTaskStart(res.getString("TaskStart"));
//            managerAlg.setTaskEnd(res.getString("TaskEnd"));
//            managerAlg.setPiority(res.getString("Piority"));
//            managerAlg.setTimeFrame(res.getString("TimeFrame"));
            
            

            
            
            
            while (res.next()) {
                listSize++;
            }
            res.first();
            
            date = (Date) res.getTime("TaskStart");
            date2 = (Date) res.getTime("TaskEnd");
            
            z = new Object [20];
            for (int i = 0; i < z.length; i++ ) {
                z[i] = date2.getTime()/60000 - date.getTime()/60000;
                
            }
            
            if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim");
                    list[i][1] = z;
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");
                    

                    res.next();
                }
            }
            
            con.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println(list);
        return list;
    }
```

hat jemand ne Idee?


----------



## SlaterB (7. Jul 2009)

welche for-Schleife, welches Objekt (dates und z oder list), wie stellst du fest, dass es das gleiche ist, 
und wie soll es sich unterscheiden?


----------



## Taramsis (7. Jul 2009)

Ich will, dass er mir hier die berechneten längen aller Eintragungen der DB wiedergibt - er berechnet dies, aber immer nur fürs erste!

```
for (int i = 0; i < z.length; i++ ) {
                z[i] = date2.getTime()/60000 - date.getTime()/60000;
                
            }
```

habe mir sonst folgendes überlegt, damit immer der nächste Eintrag geholt wird

```
for (int i = 0; i < z.length; i++ ) {
                date = (Date) res.getTime("TaskStart");
                date2 = (Date) res.getTime("TaskEnd");
                z[i] = date2.getTime()/60000 - date.getTime()/60000;
                res.next();
            }
```
bekomme aber eine "java.sql.SQLException: After end of result set" in der liste drunter und zwar hier:

```
if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim"); //<- hier
                    list[i][1] = z;
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");
                    

                    res.next();
                }
            }
```


----------



## SlaterB (7. Jul 2009)

das klingt ja ganz anders als zuvor,

je nach DB/ Einstellungen kann man ein ResultSet nicht mit  
while (res.next()) {   listSize++; }
durchlaufen und dann wieder auf first() setzen,

durchlaufe das Set nur einmal, speichere die Ergebnisse in einer Liste, welche dynamisch wachsen kann


----------



## Taramsis (8. Jul 2009)

```
z = new Object [listSize];
            for (int i = 0; i < listSize; i++ ) {
                date = (Date) res.getTime("TaskStart");
                date2 = (Date) res.getTime("TaskEnd");
                z[i] = date2.getTime()/60000 - date.getTime()/60000;
                res.next();
            }
            
            if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim");
                    list[i][1] = z;
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");
                    

                    res.next();
                }
            }
```
Beziehst du dich auf die erste Schleife? Ich muß doch solange mein Set durchlaufen, bis ich alle Werte berechnet habe! Oder beziest du dich auf einen anderen part?


----------



## SlaterB (8. Jul 2009)

es ist so wie ich es gesagt habe:
while (res.next()) { listSize++; }
läuft bei dir anscheinend einmal erfolgreich durch, 
danach versuchst du es aber ein zweites Mal (ich werde jetzt nicht genau die Schleife benennen, in der auch res.next(); drin steht)
und das ist verboten sofern nicht erlaubt,

man könnte nun darüber nachdenken, dies zu erlauben, dazu kann ich nix sagen,
allgemein reicht es aber fast immer, ein ResultSet nur einmal zu durchlaufen, du musst vorher nicht die Anzahl der Ergebnisse zählen


----------



## Taramsis (8. Jul 2009)

in der while schleife rechne ich ja nur die listsize aus die ich später verwende!
Mein Problem ist zur Zeit:
- wie übergebe ich "z" an "list"

auktualisierter Code:


```
public Object[][] calDuration() {
        Object[][] list = null;  
        Vector v = null ;
        Object[] z = null;
        int listSize = 0;
        Date date;
        Date date2;
        try {
            Class.forName(driver);
            con = (Connection) DriverManager.getConnection(url + db  , user, pass);
            stmt = (Statement) con.createStatement();

            res = (ResultSet) stmt.executeQuery( "SELECT TaskCommonDim, " +
                                                 "TaskStart, " +
                                                 "TaskEnd, " +
                                                 "Piority, " + 
                                                 "TimeFrame " +
                                                 "FROM m1 " +
                                                 "ORDER BY TaskStart ");
            while (res.next()) {
                listSize++;
            }
            res.first();

            z = new Object[listSize];
            for (int i = 0; i < listSize; i++ ) {
                date = res.getTime("TaskStart");
                date2 = res.getTime("TaskEnd");
                z[i] = (date2.getTime() - date.getTime())/6000;
                res.next();
            }
            System.out.println(z);
            date = res.getTime("TaskStart");
            
            res.first();
            
            if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim");
                    list[i][1] = z;
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");

                    res.next();
                }
            }
            con.close();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        System.out.println(list);
        return list;
    }
```
In meiner JTable wir immer nur das erste Objekt aus "z" angezeigt!


----------



## SlaterB (8. Jul 2009)

gib bitte
Arrays.toString(z);
in der Konsole aus, welche Ausgabe?

was deine JTable dran draus macht, ist eine andere Frage


----------



## Taramsis (8. Jul 2009)

er gibt mir ein Array mit allen längen wieder!
Ich habe es auch in der zweiten Schleife eingesetzt und dort erscheint das Array mit den Längen in jeder Zeile:

```
list[i][1] = Arrays.toString(z);
```


----------



## SlaterB (8. Jul 2009)

denkbar wäre nun, dass du an list_[1] nur das i-te Element von z haben möchtest, statt ganz z, ob als String oder als Array,

mehr kann ich aber derzeit nicht im Voraus erahnen_


----------



## Taramsis (8. Jul 2009)

Sorry, hätte ich erwähnen sollen!
Genau das möchte ich haben! Die Frage ist nur wie spreche ich in

```
z = new Object[listSize];
            for (int i = 0; i < listSize; i++ ) {
                date = res.getTime("TaskStart");
                date2 = res.getTime("TaskEnd");
                z[i] = (date2.getTime() - date.getTime())/60000;
                res.next();
            }
            System.out.println(z);
            date = res.getTime("TaskStart");
            
            res.first();
            
            if (listSize > 0) {
                list = new Object[listSize][4];
                for (int i = 0; i < listSize; i++) {
                    list[i][0] = res.getString("TaskCommonDim");
                    list[i][1] = Arrays.toString(z);
                    list[i][2] = res.getString("Piority");
                    list[i][3] = res.getString("TimeFrame");

                    res.next();
                }
            }
```

der zweiten Schleife das i-te Element von z an?


----------



## SlaterB (8. Jul 2009)

list_[1] = z;

bzw. verzichte ganz auf z und führe die Berechnung

 date = res.getTime("TaskStart");
                date2 = res.getTime("TaskEnd");
                z = (date2.getTime() - date.getTime())/60000;

dann direkt in der list-Schleife durch:


 date = res.getTime("TaskStart");
                date2 = res.getTime("TaskEnd");
               list[1] = (date2.getTime() - date.getTime())/60000;_


----------



## Taramsis (8. Jul 2009)

Manchmal habe ich einen Brett vor dem Kopf! ich dachte "list_[1] = z;" hätte ich ausprobiert !
Danke!_


----------

