while.next() Verständnisfrage

Gregorio

Mitglied
Hallo zusammen,

habe hier ein kleines Problem und weißt nicht wie ich da weiter vorgehen soll, vielleicht hat ja jemand einen Tipp für mich.

Hier ein Teil des Codes:
Java:
public Auftrag checkAuftrag(int trbenr) throws SQLException {

        PreparedStatement preparedStatement = conn.prepareStatement("select cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0," +
                "cepami,cepamk,cemepm,cemejl from veedvk join vekotr on cmfirm=trfirm and cmkdnr=trkdnr and cmarnr=trarnr join vekund on cmfirm=kufirm and cmkdnr=kukdnr join veedvp on cmfirm=cefirm and cmkdnr=cekdnr and cmarnr=cearnr where trbenr=?" +
                "group by cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0,cepami,cepamk,cemepm,cemejl");
        preparedStatement.setInt(1, trbenr);
        ResultSet results = preparedStatement.executeQuery();
            Auftrag fa = new Auftrag();
            while (results.next()) {
                fa.setAbNummer(results.getInt("trbenr"));
                fa.setArtNummer(results.getString("cmarnr").trim());
                fa.setArtBezeichnung(results.getString("trbeme").trim() + " " + " " + results.getString("trbem2").trim()
                        + "" + "" + results.getString("trbem3").trim());
                fa.setKundenDaten(results.getString("cmkdnr").trim() + " " + " - " + results.getString("kuname").trim()
                        + " " + " - " + results.getString("kunati").trim() + " " + " " + results.getString("kupolz").trim()
                        + " " + " " + results.getString("kuort0").trim());
                fa.setAnweisungen(results.getString("cmawei").trim());
                fa.setHinweise(results.getString("cmvhin").trim());
                fa.setPackMittel(results.getString("cepami").trim());
                testCepa = results.getString("cepami");
                System.out.println("Test 1:" + " " + testCepa);
            }
                System.out.println("Test 2:" + " " + testCepa);
            return fa;
    }

Es geht um eine Verständnisfrage:

Wieso liefert der erste System.out.println... Test1, Test2, Test3
und wieso liefert der zweite System.out.println... nur Test3?

Wie kriege ich das hin daß alle Zeilen in außerhalb dieser Methode verfügbar sind?

Vielen Dank
 
Du hast nur ein Objekt Auftrag, dessen Setter du immer wieder für jede Zeile im ResultSet aufrufst. Das macht irgendwie keinen Sinn. Wäre es nicht sinnvoller eine Liste von Auftrag zu erstellen und diese zurückzugeben?
 
das hat mit einer Liste leider nicht funktioniert.
gibt es nicht irgendwie eine andere Möglichkeit diese Zeilen außerhalb der Methode trotzdem zu übergeben?
All die anderen Variablen in der Tabelle sind einzeilig, und bei dieser Variable hackt es leider.
Ich war am überlegen noch einer Methode zu schreiben die nur diesen Wert aufruft aber ich weiß nicht genau wie ich das anpacken sollte.
 
Das funktioniert schon, sonst wäre Java generell kaputt und niemand könnte es benutzen. Zeig mal deinen Code.
Java:
List<Auftrag> auftraege = new ArrayList<>();
while (results.next()) {
    Auftrag fa = new Auftrag();
    fa.setAbNummer(results.getInt("trbenr"));
    ...
    auftraege.add(fa);
}
return auftraege;
 
Sorry, sorry sorry.

hat doch funktioniert, aber die Formatierung ist einfach bescheiden..
bei der ersten system.output innerhalb des loops werden mir die Zeilen untereinander angezeigt und bei den List Output dann die Werte nebeneinander, unformatiert.
Kann man überhaupt das Format beeinflußen?

Java:
public Auftrag checkAuftrag(int trbenr) throws SQLException {

        PreparedStatement preparedStatement = conn.prepareStatement("select cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0," +
                "cepami,cepamk,cemepm,cemejl from veedvk join vekotr on cmfirm=trfirm and cmkdnr=trkdnr and cmarnr=trarnr join vekund on cmfirm=kufirm and cmkdnr=kukdnr join veedvp on cmfirm=cefirm and cmkdnr=cekdnr and cmarnr=cearnr where trbenr=?" +
                "group by cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0,cepami,cepamk,cemepm,cemejl");
        preparedStatement.setInt(1, trbenr);
        ResultSet results = preparedStatement.executeQuery();
            Auftrag fa = new Auftrag();
            ArrayList<String> cepaList = new ArrayList<>();
            while (results.next()) {
                fa.setAbNummer(results.getInt("trbenr"));
                fa.setArtNummer(results.getString("cmarnr").trim());
                fa.setArtBezeichnung(results.getString("trbeme").trim() + " " + " " + results.getString("trbem2").trim()
                        + "" + "" + results.getString("trbem3").trim());
                fa.setKundenDaten(results.getString("cmkdnr").trim() + " " + " - " + results.getString("kuname").trim()
                        + " " + " - " + results.getString("kunati").trim() + " " + " " + results.getString("kupolz").trim()
                        + " " + " " + results.getString("kuort0").trim());
                fa.setAnweisungen(results.getString("cmawei").trim());
                fa.setHinweise(results.getString("cmvhin").trim());
                fa.setPackMittel(results.getString("cepami").trim());
                cepaList.add(cepa);
                testCepa = results.getString("cepami");
                System.out.println("Test 1:" + " " + testCepa);
            }
                System.out.println("Test 2:" + " " + cepaList);
            return fa;
    }
 
Klar, ich könnte mit

Java:
System.out.println("Test 2: " + cepaList.get(0));
System.out.println("Test 2: " + cepaList.get(1));
System.out.println("Test 2: " + cepaList.get(2));

an die Werte drankommen, aber da die Anzahl der Werte dynamisch werden wird hätte ich später ein Problem bei der Darstellung
 
Das ist ja wieder falsch. Du überschreibst immer das gleiche Objekt. s.: #5
Danach kümmern wir um den Rest. Alles was mit JDBC und Datenbanken zu tun hat sind native Ressourcen und müssen geschlossen werden.
Alle Elemente einer Liste mit dynamischer Länge auszugeben ist auch gar kein Problem:
Java:
List<Auftrag> auftraege = new ArrayList<Auftrag>();
     
...  
auftraege.add(auftrag);
...

for(Auftrag auftrag : auftraege) {
    System.out.println( "Dies war in der Liste: " + auftrag.getAbNummer());
}
 
Hier die komplette Klasse, sozusagen die DAO

Java:
public class Datenbank {

    public static final String CONNECTION_STRING = "jdbc:postgresql://XX.XX.XX.XX";

    private Connection conn;
    private static final Datenbank instance = new Datenbank();

    public static Datenbank getInstance() {
        return instance;
    }

    public boolean open() throws ClassNotFoundException {
        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(CONNECTION_STRING);
            return true;
        } catch (SQLException e) {
            System.out.println("Couldn't connect to database: " + e.getMessage());
            return false;
        }
    }

    public void close() {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            System.out.println("Couldn't close connection: " + e.getMessage());
        }
    }

    public Auftrag checkAuftrag(String trbenr) throws SQLException {
        PreparedStatement preparedStatement = conn.prepareStatement("select cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0," +
                "cepami,cepamk,cemepm,cemejl from veedvk join vekotr on cmfirm=trfirm and cmkdnr=trkdnr and cmarnr=trarnr join vekund on cmfirm=kufirm and cmkdnr=kukdnr join veedvp on cmfirm=cefirm and cmkdnr=cekdnr and cmarnr=cearnr where trbenr=?" +
                "group by cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0,cepami,cepamk,cemepm,cemejl");
        preparedStatement.setInt(1, Integer.parseInt(trbenr));
        ResultSet results = preparedStatement.executeQuery();
        Auftrag fa = new Auftrag();
        ArrayList<String> cepaList = new ArrayList<>();
        while (results.next()) {
            String AbNummer = String.valueOf(results.getString("trbenr"));
            String ArtNummer = results.getString("cmarnr").trim();
            String ArtBezeichnung = results.getString("trbeme").trim() + " " + " " + results.getString("trbem2").trim()
                    + "" + "" + results.getString("trbem3").trim();
            String KundenDaten = results.getString("cmkdnr").trim() + " " + " - " + results.getString("kuname").trim()
                    + " " + " - " + results.getString("kunati").trim() + " " + " " + results.getString("kupolz").trim()
                    + " " + " " + results.getString("kuort0").trim();
            String Anweisungen = results.getString("cmawei").trim();
            String Hinweise = results.getString("cmvhin").trim();
            String PackMittel = results.getString("cepami");
            cepaList.add(AbNummer);
            cepaList.add(ArtNummer);
            cepaList.add(ArtBezeichnung);
            cepaList.add(KundenDaten);
            cepaList.add(Hinweise);
            cepaList.add(Anweisungen);
            cepaList.add(PackMittel);
        }
        fa.setAbNummer(cepaList);
        fa.setArtNummer(String.valueOf(cepaList.get(1)));
        fa.setArtBezeichnung(String.valueOf(cepaList.get(2)));
        fa.setKundenDaten(String.valueOf(cepaList.get(3)));
        fa.setHinweise(String.valueOf(cepaList.get(4)));
        fa.setAnweisungen(String.valueOf(cepaList.get(5)));
        fa.setPackMittel(cepaList);
        return fa;
    }
   }

Es funktioniert soweit, alle Werte werden in die ArrayList cepaList übertragen und von da aus kann ich mir mit .get() die verschiedenen Werte rauspicksen.

Problem ist aber bei der Variable "cepami", die besteht aus 3 Zeilen und ich kann sie anzeigen mit:

Code:
System.out.println("Cepami: " + String.valueOf(cepaList.get(6)));
System.out.println("Cepami: " + String.valueOf(cepaList.get(13)));
System.out.println("Cepami: " + String.valueOf(cepaList.get(20)));

Wie kann ich das umschreiben daß er alle Werte der cepami als Setter weitergibt?

Ich habe es momentan mit
Code:
fa.setPackMittel(cepaList);
gelassen, dabei gibt es das ganze Array raus.
 
Java:
List<Auftrag> auftraege = new ArrayList<>();
while (results.next()) {
    Auftrag fa = new Auftrag();
    fa.setAbNummer(results.getInt("trbenr"));
    ...
    auftraege.add(fa);
}
 
Alles klar, Danke.
habe es geändert und nun erscheint bei Test 1 nur die erste Zeile der variable,
bei Test 2 nichts.
Habe ich irgendwas vergessen?

Java:
public class Datenbank {

    public static final String CONNECTION_STRING = "jdbc:postgresql://XX.XX.XX.XX";

    private Connection conn;
    private static final Datenbank instance = new Datenbank();

    public static Datenbank getInstance() {
        return instance;
    }

    public boolean open() throws ClassNotFoundException {
        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(CONNECTION_STRING);
            return true;
        } catch (SQLException e) {
            System.out.println("Couldn't connect to database: " + e.getMessage());
            return false;
        }
    }

    public void close() {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            System.out.println("Couldn't close connection: " + e.getMessage());
        }
    }

    public Auftrag checkAuftrag(String trbenr) throws SQLException {
        PreparedStatement preparedStatement = conn.prepareStatement("select cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0," +
                "cepami,cepamk,cemepm,cemejl from veedvk join vekotr on cmfirm=trfirm and cmkdnr=trkdnr and cmarnr=trarnr join vekund on cmfirm=kufirm and cmkdnr=kukdnr join veedvp on cmfirm=cefirm and cmkdnr=cekdnr and cmarnr=cearnr where trbenr=?" +
                "group by cmarnr,cmkdnr,cmawei,cmvhin,trbenr,trbeme,trbem2,trbem3,kuname,kunati,kupolz,kuort0,cepami,cepamk,cemepm,cemejl");
        preparedStatement.setInt(1, Integer.parseInt(trbenr));
        ResultSet results = preparedStatement.executeQuery();
        List<Auftrag> auftraege = new ArrayList<Auftrag>();
        while (results.next()) {
            Auftrag fa = new Auftrag();
            fa.setAbNummer(String.valueOf(results.getInt("trbenr")));
            fa.setArtNummer(results.getString("cmarnr").trim());
            fa.setArtBezeichnung(results.getString("trbeme").trim() + " " + " " + results.getString("trbem2").trim()
                    + "" + "" + results.getString("trbem3").trim());
            fa.setKundenDaten(results.getString("cmkdnr").trim() + " " + " - " + results.getString("kuname").trim()
                    + " " + " - " + results.getString("kunati").trim() + " " + " " + results.getString("kupolz").trim()
                    + " " + " " + results.getString("kuort0").trim());
            fa.setAnweisungen(results.getString("cmawei").trim());
            fa.setHinweise(results.getString("cmvhin").trim());
            fa.setPackMittel(results.getString("cepami"));
            auftraege.add(fa);
            System.out.println("Test 1: " + results.getString("cepami"));
            return fa;
        }
        System.out.println("Test 2: " + results.getString("cepami"));
        return null;
    }
   }
 
Ich frage mich woher den Code hast? Wie bist du überhaupt so weit gekommen? Mach besser erst mal einen Kurs oder so und beginne Grundlagen zu lernen.
 
Den Code den habe selber erstellt aus Tutorials aus dem Internet und das lief so weit gut bis die Anforderung kam eine Variable zu nehmen die mehr als eine Zeile in der Tabelle beinhaltet.
Danke Dir schon mal für deine Hilfe.. irgendwie wird es schon..
 
return fa; verlässt die Methode sofort.Die Schleife wird also nur genau 1 mal durchlaufen.
Die Deklaration public Auftrag checkAuftrag(String trbenr) throws SQLException deiner Methode ist falsch wenn du mehrere Aufträge zurückgeben willst. Es muss natürlich eine Liste von Auftrag zurückgegeben werden.
Dabei wird natürlich return null; zu return auftraege;
Dann kannst du die zurückgegebene Liste ausgeben oder prüfen:
Java:
Datenbank.getInstance().open();
List<Auftrag> auftraege = Datenbank.getInstance().checkAuftrag("xyz");
for (Auftrag auftrag : auftraege) {
    System.out.println( "Dies war in der Liste: " + auftrag.getPackMittel());
}
Datenbank.getInstance().close();
Das es funktioniert ändert aber nichts daran, das der Code schlecht ist.
 
Ich werde das überprüfen und schauen was ich da machen kann, es kann doch nicht so schwer sein aus einem blöden Array die 3 Rows der Variablen zu ziehen und anzuziegen.

Bei dem von dir geposteten Code kann ich
Java:
return auftraege;
nicht eingeben da ich immer eine Fehlermeldung erhalte, der akzeptiert nur return null;
Code:
List<Auftrag> auftraege = new ArrayList<>();
while (results.next()) {
    Auftrag fa = new Auftrag();

Erst wenn ich folgendes eingebe geht es
Code:
List<Auftrag> auftraege = new ArrayList<>();
Auftrag fa = new Auftrag();
while (results.next()) {
aber dann gibt mir die Konsole bei der Ausgabe nur den ersten row der Variable.
 

Zurück
Oben