MySQL SQL Abfrage in JTable mit Berechnung

Merkaber

Mitglied
Hallo Java-Mitstreiter,

seid kurzem habe ich wieder angefangen mir Java im Selbststudium anzueignen. Vorkenntnisse hatte ich schon aus meiner Ausbildung, dennoch habe ich leider eine Menge vergessen.

Ich moechte gleich zur Sache kommen. Ich versuche momentan ein Programm zu entwickeln, was ich auf Serverbasis schon verwirklicht habe. Dieses Problem habe ich also schon mit PHP und HTML geloest und moechte es nun in ein ausfuehrbares Programm "umwandeln".

Es beeinhaltet eine SQL Abfrage mit Berechnung auf Knopfdruck. Eventuell erweiterbar mit uebergabe von einzelnen Parametern (aber das ist erstmal unwichtig).
Angezeigt soll eine Tabelle (JTable in JScrollPane) und der berechnete Wert sein.

Bisheriger Loesungsversuch:
Das ist die "Main Klasse" wobei ich weiss, dass ich das JFrame noch in eine andere Klasse packen sollte bzw. Datei, aber ich habe das erstmal so mit Window-maker gemacht, um zu testen ob das klappt.

Java:
public class StartFrame extends JFrame {

    private JPanel contentPane;
    private JTable table;
    String input = "1500";
    ResultSet qRs;
   
    public static void main(String[] args) {
        String output;
       
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    StartFrame frame = new StartFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public StartFrame() {
        DBConnection dbConn = new DBConnection();
        final DBQuerys dbQuery = new DBQuerys();
        qRs = dbQuery.Query1(dbConn.conMethode(), input);

        // Berechnung folgt
            int calc = 0;
            int calcNew = 0;
            int calcStart = 0;
           
                try {
                   
                    while(qRs.next()) {
                        calcNew = qRs.getInt("buyerID") + calcStart;
                        calc = calcNew;
                        calcStart = calc;
                    }
                } catch(Exception e) {
                    System.out.println(e);
                }
// Berechnung Ende
       
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1700, 900);
        setTitle("Accounting Programm");
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
       
        JLabel lblAccountingProgrammVon = new JLabel("Accounting Programm von Merkaber");
        lblAccountingProgrammVon.setBounds(5, 5, 424, 13);
        contentPane.add(lblAccountingProgrammVon);
       
        final JLabel lblCounting = new JLabel();
        lblCounting.setBounds(280, 64, 200, 20);
        contentPane.add(lblCounting);
        final String nWert = String.valueOf(calcStart);
       
        JLabel lblBitteWhlenSie = new JLabel("Bitte W\u00E4hlen Sie, was sie tun m\u00F6chten!");
        lblBitteWhlenSie.setFont(new Font("MS UI Gothic", Font.PLAIN, 20));
        lblBitteWhlenSie.setBounds(650, 28, 350, 30);
        contentPane.add(lblBitteWhlenSie);
       
        final JButton btnQuery = new JButton("Query");
        btnQuery.setBounds(170, 64, 91, 21);
        btnQuery.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                table.setModel(DbUtils.resultSetToTableModel(qRs));
                btnQuery.setEnabled(false);
                lblCounting.setText(nWert);
            }
        });
        contentPane.add(btnQuery);
       
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(50, 120, 1585, 500);
        contentPane.add(scrollPane);
       
        table = new JTable();
        table.setModel(new DefaultTableModel(
            new Object[][] {
            },
            new String[] {
            }
        ) {
            boolean[] columnEditables = new boolean[] {
               
            };
            public boolean isCellEditable(int row, int column) {
                return columnEditables[column];
            }
        });
        scrollPane.setViewportView(table);
    }
}

Nun folt der Query:

Java:
public class DBQuerys {
   
    public ResultSet Query1(Connection con, String limit) {
        String error;
        ResultSet rsLiefert = null;

        try {
            Statement stmt = con.createStatement();
            rsLiefert = stmt.executeQuery("SELECT productID, buyerID FROM products");
           
        } catch (Exception e) {
            error = "\nFehler\n" + e;
        }

        return rsLiefert;
    }

}

und die Connection:

Java:
public class DBConnection {
    Connection con = null;
    public Connection conMethode() {
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/receipts", "userName", "Password");
        } catch (Exception e) {
            System.out.println(e);
        }
    return con;
    }
   
    public void closing() {
        try {
            con.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

}

Unten folgt noch der Code kurz, wie ich das in PHP geloest habe.

Ich habe nun 3 Probleme, auf die ich keine Antwort weiss. Ich habe mir in der Documentation schon einiges durchgelesen, aber ich werde einfach nicht schlau draus. Ich habe mich schon abgefunden, dass ich zu doof bin ein TableModel anzufertigen, deswegen habe ich das hier genommen: http://sourceforge.net/projects/finalangelsanddemons/

1. Problem:
Tabelle wird angezeigt, wenn ich die Berechnung rausnehme. Wenn ich die Berechnung hinzufuege, wird die Tabelle nicht mehr angezeigt.
Loesungsversuch war, dass eventuell das ResultSet geschlossen wird, wird es aber nicht. Kein Plan, nach was ich googeln soll.

2. Problem:
Beim ersten mal druecken das Button, wird die Tabelle ohne Berechnung angezeigt, beim zweiten mal geloescht und dann passiert nichts mehr, darum das disablen des Buttons. Warum passiert das?? Wo uebersehe ich eine Logik in Java?

3. Problem:
Ich habe den Datentyp "Decimal" in MySql verwendet. In Java gibt es den wohl nicht, habe ich etwas uebsehen? Kann ich einfach double anstelle nehmen und gut ist es? Also einfach Result Set.getDouble(...) ?

Ich hoffe ich habe nicht zu viel verlangt. Ich finde einfach keine Loesung zu den Problemen. Ich weiss auch einfach nicht, nach was ich suchen soll. Dazu fehlt mir die Erfahrung in Java.

Liebe Gruesse an alle,
fuer kleine Hinweise waere ich schon dankbar!!

PHP Code:

PHP:
$ausgabe = mysqli_query(
        $db2,
        '...'
    );
    $entity = mysqli_num_rows($ausgabe);

    $ergebnisAnfang_price = "";

    while ($row = mysqli_fetch_object($ausgabe)) {

        $ergebnisNeu_price = $row->price+$ergebnisAnfang_price;
        $ergebnis_price = $ergebnisNeu_price;
        $ergebnisAnfang_price = $ergebnis_price;

        $data[] = array(
            'purchaseID'       => $row->purchaseID,
            'day'               => $row->day,
            'price'               => $row->price,
        );

        $country = $row->country;
    }

PHP:
foreach ($data as $set)
    {
        $data_finish .= sprintf(
        '<tr>'
        . '<td>%1$s</td>'
        . '<td>%2$s</td>'
        . '</tr>',

        htmlspecialchars($set['purchaseID']),
        htmlspecialchars($set['day']),
        );
    }

Einfach nur ein kleines Beispiel wie ich das in PHP gemacht habe. Vielleicht kann mir ja jemand den Unterschied zu Java da erklaeren.
 
Sorry aber so wie es aussieht fehlt dir auch die Erfahrung in mySQL und PHP 🙂 Willst Du nicht erstmal eins richtig lernen bevor due wieder was neues anfängst?

Code:
       $ergebnisNeu_price=$row->price+$ergebnisAnfang_price;
       $ergebnis_price=$ergebnisNeu_price;
       $ergebnisAnfang_price=$ergebnis_price;

Wozu brauchst du die Variablen ergebnisNeu_price und ergebnis_price?

Gleiches Spiel in Java

Code:
calcNew = qRs.getInt("buyerID")+ calcStart;
                        calc = calcNew;
                        calcStart = calc;

und benutzen tust du nur calcstart....

Dir ist schon klar, dass du das was Du da "berechnest" auch mit einem einfachen sql query SUM('price') direkt von der Datenbank geliefert bekommen würdest?

Ansonsten fragst Du im PHP script einen price ab und im Java eine BuyerID. Ka warum das jetzt plötzlich anders heißt wo es doch das gleiche machen soll????
 
Danke fuer die Antwort.

Ich weiss, dass es die Funktion SUM in MySql gibt, dennoch war das nur ein kleiner Auszug auf dem PHP Script. Ich hatte nur die Idee, das mir jemand eventuell den Unterschied zwischen PHP-Logik und Java-Logik klarmachen koennte. Die Berechnung benoetigt naemlich zwei Werte, aus einem Datensatz, die dann multipliziert werden, dadurch funktioniert SUM nicht mehr.

Bei diesem Berechnungsvorgang habe ich mir irgendwas bei gedacht, aufjedenfall funktioniert das so im PHP-Script. Irgendwas war da mit der Schleife, dass ich es so schreiben musste das das Ergebnis nicht wieder ueberschrieben wird.

Die Namen sind unterschiedlich, weil das nur ein Auszug ist und nur die herangehensweise zeigen sollte.

Aber vielen Dank fuers Aufmerksam machen, ich gucke mir das nochmal an!
 
Hallo liebe Leute,
nach langem Suchen im Netz usw. ist mir irgendwann die Idee gekommen, dass man eine ResultSet nur einmal aufrufen kann bzw. benutzen kann.
Deswegen muss ich die Methode einfach einzelnd aufrufen und kann nicht einfach eine Variable mit dem ResultSet deklarieren.
Und genau deswegen verschwindet auch die Tabelle, wenn ich Berechne oder nochmals den Button drücke.

Ich hoffe das ist verständlich,
liebe Grüße
 

Zurück
Oben