hallo zusammen,
folgende Methode soll ermitteln, wie breit das längste Element in einer Spalte ist (zum formatieren der Ausgabe):
wie kommentiert enthält es aber den genannten BUG und ich habe keinen blassen warum das so ist.
Folge ist, dass die Ausgabe nicht funktioniert, wenn hinter der DATE-Spalte noch etwas kommt.
In diesem Fall hängt sich das Programm jedenfalls auf (CPU-Last 100%).
hier noch die methode zum ausgeben:
wenn also jemand eine Idee hat, warum es bei DATES nicht funktioniert..?
evtl. liegt es an der .. naja .. seltsam formatierten Ausgabe einer Date-Spalte:
7499.....ALLEN......SALESMAN......7698.....1981-02-20 00:00:00.0
Die ermittelten Spaltenbreiten sind in diesem Fall: 4,6,9,4,8
wobei 8 offensichtlich nicht stimmt, der Rest aber schon.
Vielen Dank für jede Bemühung.
Norman.
folgende Methode soll ermitteln, wie breit das längste Element in einer Spalte ist (zum formatieren der Ausgabe):
Code:
/**
* ermittelt die ausgewählten spalten und deren breite
* bei spalten die DATE beinhalten ist breite immer 8 ==> BUG //TODO: DATE-Spalten sind 8 Zeichen breit ?!!?
*/
/*** ADDED START ***/
/* im Beispiel sind beim Aufruf von get_spaltenbreite(auswahl,tabelle):
* auswahl: NVL(EMPNO,0),NVL(ENAME,0),NVL(JOB,0),NVL(MGR,0),NVL(HIREDATE,to_date('01 01 0001','mm dd YYYY'))
* tabelle: EMP
*/
/*** ADDED END ***/
void get_spaltenbreite(String auswahl, String tabelle) {
int z=0;
String spalte[] = new String[10];
for (int a=0;a<auswahl.length()-5;a++) { // schneidet in auswahl alles vor NVL( ab
if (auswahl.substring(a,a+4).equals("NVL(")) { // evtl. besser: startsWith() verwenden..
auswahl=auswahl.substring(a+4,auswahl.length());
a=0; // er muss ja wieder vom anfang von auswahl nach NVL( suchen
z++;
spalte[z] = auswahl.substring(0,auswahl.indexOf(",")); // setzt die spalten-namen in spalte[]
}
}
for (int i=1;i<=z;i++) {
try {
Connection con = DriverManager.getConnection(MainClass.url,MainClass.username,MainClass.passwort);
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT MAX(LENGTH(" + spalte[i] + ")) FROM " + tabelle);
while (rset.next()){
spaltenbreiten[i] = Integer.parseInt(rset.getString(1)); // spaltenbreiten[] ist eine Klassenvariable
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Folge ist, dass die Ausgabe nicht funktioniert, wenn hinter der DATE-Spalte noch etwas kommt.
In diesem Fall hängt sich das Programm jedenfalls auf (CPU-Last 100%).
hier noch die methode zum ausgeben:
Code:
// Hier wird im JTextField ergFeld die Rückgabe der SQL-Abfrage an den bisherigen Text in ergFeld angehangen
void abfrage(String auswahl, String tabelle, int spalten){
get_spaltenbreite(auswahl,tabelle);
for (int i=1;i<=spalten;i++) { /**/
System.out.println(spaltenbreiten[i]);
}
try {
Connection con = DriverManager.getConnection(MainClass.url,MainClass.username,MainClass.passwort);
Statement stmt = con.createStatement();
ResultSet rset = stmt.executeQuery("SELECT " + auswahl + " FROM " + tabelle);
while (rset.next()) {
for (int i=1;i<=spalten;i++) {
String hilfs = rset.getString(i);
if (i!=spalten) /* letzte spalte nicht mit . auffüllen */
while (hilfs.length() !=spaltenbreiten[i]+5) /* String solange auffüllen, bis gewünschte Spaltenbreite erreicht */
hilfs = hilfs.concat(".");
Grafik.ergFeld.setText(Grafik.ergFeld.getText().concat(hilfs));
}
Grafik.ergFeld.setText(Grafik.ergFeld.getText().concat("\n"));
}
Grafik.ergFeld.setText(Grafik.ergFeld.getText().concat("\n\n"));
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
evtl. liegt es an der .. naja .. seltsam formatierten Ausgabe einer Date-Spalte:
7499.....ALLEN......SALESMAN......7698.....1981-02-20 00:00:00.0
Die ermittelten Spaltenbreiten sind in diesem Fall: 4,6,9,4,8
wobei 8 offensichtlich nicht stimmt, der Rest aber schon.
Vielen Dank für jede Bemühung.
Norman.