# result ausgabe in Html Tabelle



## David_Ilm (23. Mrz 2005)

Habe ein Bean welches mir  Werte aus einer Datenbank liefert das bean sieht so aus


```
public static ArrayList ColumnValues(String selecteddb,String selectedtable,String columnname)throws java.sql.SQLException,java.lang.ClassNotFoundException
  {
   ArrayList columnvalues = new ArrayList();
   Verb check1 = new Verb();
   check1.setDbName(selecteddb);

   String sql = ("SELECT *FROM " + selectedtable);
        
        Connection    cn = Verb.getCon();
        java.sql.Statement oStatement = cn.createStatement();
        ResultSet oResultSet = oStatement.executeQuery(sql);

         while(oResultSet.next())
         { 
		 String result=oResultSet.getString(columnname);
         columnvalues.add(result);
         }
    return columnvalues;
  }
```

Also ich schicke von meiner Jsp aus den namen der Datenbank den Namen Tabelle und den Namen der Spalte.
Zurück bekomme ich den Inhalt der Spalte funktioniert auch alles.

Nun liegt mein Problem aber in der darstellung in der Jsp wenn ich eine Datenbanktabelle habe zum 
Beispiel:

Spalte1 | Spalte2 | Spalte3
    A      |      B     |   C
    D      |      E     |    G

Die Anzahl der Splaten kann natürlich auch varieieren nun ruf ich wie in diesem 3mal mein bean auf und hole mir die Werte
Nun möchte ich sie gerne in eine Table anzeigen nun ist es aber so das Tabellen nur zeileweiße Füllen kann und ich bekomm die Werte ja Spaltenweiße.


An der stelle scheitert es gerade bei mir kann mir jemand weiterhelfen wie ich mein Problem am besten löse.


----------



## bambi (23. Mrz 2005)

Wenn Du Dir die Daten in einer ArrayList zurueckgeben laesst, dann duerfte das doch gar kein Problem sein. Du fuehrst
zuerst alle Deine Abfragen an die DB aus - so lange bis Du alle Spalten hast.  Die ArrayLists solltest Du dann vielleicht
noch in einem Array (oder in einer 2ten ArrayList) speichern oder so... 
Dann kannst Du alle Deine Daten in 2 for-Schleifen durchlaufen - dann ist's aber vielleicht besser anstatt Deiner 
ArraysList lieber Arrays zu verwenden, wenn's funktioniert... Dann ist der Zugriff auf jeden Fall einfacher.
Ich wuerde mir an Deiner Stelle den Namen der Funktion noch einmal ansehen. Sog. "sprechende Methodennamen" sind
meistens viel einfacher in der Handhabung... :wink:


----------



## David_Ilm (23. Mrz 2005)

Erstmal danke bambi auf diesen Gedanken bin ich noch garnicht bekommen also würde mein array dann so Ungefähr aussehe

Array[0]=ArrayListSpalte1
Array[1]=ArrayListSpalte2
Array[2]=ArrayListSpalte3

wenn es möglich ist mehrere ArrayListen in einem Array zu Speichern wäre es ne möglichkeit nur weiß noch nicht so richtig wie ich dann wieder an die Werte komme.

Ausgabe von einem Array bzw. ArrayLIst ist klar
Bsp.:

```
out.println(Array[0]);
```
Aber wie mache ich es wenn darin noch eine arraylist steckt ????


----------



## bambi (23. Mrz 2005)

Also ich habe hier mal was zusammengeschrieben... Nur als Beispiel wie's gehen koennte verwenden. Ist nicht so toll...

```
ArrayList tmpArrayList = new ArrayList();

// die Laenge aller ArrayList muss gleich sein...
int len = 4;
int arrayLen = allValues.length;

System.out.println("printing the DB values...");
for (int i = 0; i < len; i++)
{
    System.out.print(i + ": ");
    for (int j = 0; j < arrayLen; j++)
    {
        tmpArrayList = allValues[j];
        if (tmpArrayList != null)
        {
            String value = (String) tmpArrayList.get(i);
            if (value != null)
                System.out.print(value + "\t");
            else
                System.out.print("\t");
            
        }
    }
    System.out.println();
}
```

Also ich habe ein Array allValues, das die ArrayLists enthaelt. Im ersten for geht man dann die Laenge der ArrayLists durch.
In dem Beispiel hier muessen alle die gleiche Laenge haben - wenn Du's anders brauchst, dann musst Du's noch etwas
umschreiben... Danach geh' ich dann das Array durch und gebe alle Daten aus...

Hier mal der ganze Code - falls Du's kurz testen magst...

```
public class Test
{

    ArrayList[] allValues = new ArrayList[10];
    
    /**
     * 
     */
    public Test()
    {
        init();
    }
    
    private void init()
    {
        ArrayList arrayList = new ArrayList();
        arrayList.add("eins");
        arrayList.add("zwei");
        arrayList.add("drei");
        arrayList.add(null);
        
        allValues[0] = arrayList;
        
        arrayList = new ArrayList();
        arrayList.add("vier");
        arrayList.add("fuenf");
        arrayList.add("sechs");
        arrayList.add("sieben");
        
        allValues[1] = arrayList;
    }
    
    public void printValues()
    {
     .......
    }
    
    public static void main(String[] args)
    {
        Test t = new Test();
        t.printValues();
    }

}
```

Ich kann mir aber nicht so vorstellen, dass das Ganze performant ist. Da musst Du vielleicht noch was mit den Methoden machen...


----------



## David_Ilmm (29. Mrz 2005)

Habe es mal ausprobiert und bei mir eingebaut hier ist mal der Code:


```
if(action.equals("ShowTable"))
 {
    MetaDaten metabean = new MetaDaten();
    ArrayList metadaten=(metabean.TableName(selecteddb,selectedtable));
    int len= metadaten.size();    
   ArrayList[] allValues= new ArrayList[len]; 

    for(int h=0;h<len;h++)
      {
       String columnname = (metadaten.get(h)).toString(); 
       allValues[h]=(bean.ColumnValues(selecteddb,selectedtable,columnname));
      } 
    
    
    ArrayList tmpArrayList = new ArrayList(); 
        
    int arrayLen = allValues.length; 

    for (int i = 0; i < len; i++) 
     { 
      out.println(i + ": "); 
      for (int j = 0; j < arrayLen; j++) 
      { 
        tmpArrayList = allValues[j]; 
        if (tmpArrayList != null) 
        { 
            String value = (String) tmpArrayList.get(i); 
            if (value != null) 
                out.print(value + "\t"); 
            else 
                out.print("\t"); 
         } 
      } 
     }
```

Nur leider ist das resultat daraus eine Exeption

IndexOutOfBoundsException: Index: 2, Size: 2


----------



## David_Ilmm (29. Mrz 2005)

Muß mich mal etwas berichtigen bei manchen Tabellen geht es bei anderen wiederrum nicht


----------



## bambi (29. Mrz 2005)

An welcher Stelle und in welchem Fall bekommst Du denn die Exception?


----------



## David_Ilmm (29. Mrz 2005)

Also es kommt anscheinend nur wenn ich auf die mysql Tabellen zugreifen will,
bei allen anderen geht es bis jetzt hab aber auch alle rechte an der Datenbank da ich mich als root anmelden kann.

Hier mal die Komplette Fehlermeldung

org.apache.jasper.JasperException: Index: 2, Size: 2
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause 

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
	java.util.ArrayList.RangeCheck(Unknown Source)
	java.util.ArrayList.get(Unknown Source)
	org.apache.jsp.mainframe_jsp._jspService(org.apache.jsp.mainframe_jsp:149)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


----------



## David_Ilmm (30. Mrz 2005)

Hab  jetzt mal noch etwas rumprobiert bin zu Folgendem Ergebniss gekommen
Der fehler taucht genau dann auf wenn die wenn weniger Werte als Spalten sind

Also die Variable Len kleiner ist als die Anzahl der Spalten.


----------



## bambi (31. Mrz 2005)

Okay, hab' den Fehler zumindest reproduzieren koennen. Es passiert irgendwo in der doppelten for-Schleife. Du 
verwendest das len irgendwo, wo's gar nichts zu suchen hat. Dann bekommst Du immer den Fehler, wenn in den
Spalten (hier in den ArrayLists) weniger Eintraege sind, als Du ArrayLists hast...  Also wenn soz. die Laenge Deiner
ArrayLists kuerzer ist, als die Laenge Deines Arrays.

Ausserdem: die Ausgabe ist eh nicht korrekt. Wenn Du mehr Elemente in Deinem Array hast, als Listen, dann wird zu
wenig ausgegeben...

Aehmmm bloed zu erklaeren... :?


----------



## bambi (31. Mrz 2005)

Hmmm... hab' da mal wieder was gebastelt... (ja, mir iss immer noch langweilig)


```
ArrayList[] allValues;
    int[] allSizes;
    
    private void getValues()
    {
        ArrayList tmpArrayList = new ArrayList();

		// die Laenge aller ArrayList muss gleich sein...
		 int len = getMaxLen();
		 int arrayLen = allValues.length;
		
		 System.out.println("printing the DB values...");
		 for (int i = 0; i < len; i++)
		 {
		     System.out.print(i + ": ");
		     for (int j = 0; j < arrayLen; j++)
		     {
		         tmpArrayList = allValues[j];
		         if (tmpArrayList != null && i < allSizes[j])
		         {
		             String value = (String) tmpArrayList.get(i);
		             if (value != null)
		                 System.out.print(value + "\t");
		             else
		                 System.out.print("\t");
		            
		         }
		     }
		     System.out.println();
		 }
     }
    
    private int getMaxLen() {
        int maximum = 0;
        int len = allValues.length;
        
        for (int i = 0, tmp = 0; i < len; i++) {
            tmp = this.allValues[i].size();
            allSizes[i] = tmp;
            
            if (tmp > maximum)
                maximum = tmp;
        }
        return maximum;
    }
```

Also das gibt mir dann mit

```
private void init()
    {
        allValues= new ArrayList[2];
        allSizes= new int[2];
        
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        allValues[0] = list;
        
        list = new ArrayList();
        list.add("x");
        list.add("y");
        list.add("z");
        
        allValues[1] = list;
    }
```
Das hier aus:

```
printing the DB values...
0: a	x	
1: b	y	
2: c	z	
3: d
```

Schau' einfach mal rein... Ist sicher noch verbesserungswuerdig... ???:L


----------

