[jButtonActionPerformed] update

0

Witam serdecznie,

mam problem z UPDATE modyfikującego dane wyświetlone z Bazy danych w tabeli "jTable1". Gdy użytkownik naciśnie na jakiś rekord w tabeli , zostaną one wczytane do "jTextField1" .... "jTextField7". Obsługa myszy przedstawia się:

   private void jTable1MousePressed(java.awt.event.MouseEvent evt) {                                     
        // TODO add your handling code here:

        int rec = jTable1.getSelectedRow();
         jTextField1.setText(jTable1.getValueAt(rec, 0).toString()); 
        jTextField2.setText(jTable1.getValueAt(rec, 1).toString());
        //jComboBox1  ??

        jTextField4.setText(jTable1.getValueAt(rec, 5).toString());
        jTextField5.setText(jTable1.getValueAt(rec, 6).toString());
        jTextField6.setText(jTable1.getValueAt(rec, 7).toString());
        jTextField7.setText(jTable1.getValueAt(rec, 8).toString());
    }

Jednak nie wiem jak wczytać tu "jComboBox1". Jaką funkcje pobrać ?

Jak już się wczytają pola, nie wiem również jak wykonać obsługę button "jButton6" modyfikujący rekordy . Zaczęłam tak :

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:


        int id = Integer.parseInt(jTextField1.getText());
        int employee_id = Integer.parseInt(jTextField2.getText());
        String department_name = String.valueOf(jComboBox1.getSelectedItem());
        java.sql.Timestamp v_begin = java.sql.Timestamp.valueOf(jTextField4.getText());
        java.sql.Timestamp v_end = java.sql.Timestamp.valueOf(jTextField5.getText());

       //połączenie z bazą danych, tak samo jak w standardowych 

        String sql = "UPDATE time_work SET  employee_id=?, department_name=?, v_begin=?, v_end=? WHERE id =?";

        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);

       java.sql.Timestamp t_start = new java.sql.Timestamp(new java.util.Date().getTime());
       java.sql.Timestamp t_stop = new java.sql.Timestamp(new java.util.Date().getTime());
            Statement statement = con.createStatement();
            PreparedStatement cs = con.prepareStatement(sql);

            cs.setInt(1, id);
            cs.setInt(2, employee_id);
            cs.setString(3, department_name);
            cs.setTimestamp(4, v_begin);
            cs.setTimestamp(5, v_end);
            cs.setTimestamp(6, t_start);
            cs.setTimestamp(7, t_stop);
            cs.executeUpdate();
            cs.close();
            con.close();


        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());

        }

    }   

Chciałabym prosić uprzejmie o wskazówkę jak zmodyfikować pobrane dane z tych pól "jTextField1", "jTextField2", "jComboBox1" .... "jTextField5", Wcześniej zostały wczytane z tabeli "jTable1". Powyższe rozwiązanie jest niestety błędne , nie działa :(

Tą modyfikację można na wiele sposobów rozwiązać, np przez wprowadzenie jakiegoś zmienionego rekordu do tabeli "jTable1". W tej tabeli wyświetlają się rekordy:

id   employes_id  first_name  last_name  department_name  v_begin       v_end        t_start    t_stop
1    1              imie1      nazwisko1  IT              2010-10-09  2010-11-09    2010-10-09  2010-11-09
2    3              imie2      nazwisko2  Serwis          2010-10-01  2011-11-09    2010-10-01  2011-11-09

Chciałabym uprzejmie prosić o wskazówkę, jak rozwiązać mój problem z przyciskiem UPDATE?

0
  1. zobacz metody w JComboBox takie jak: setSelectedItem albo setSelectedIndex.
    Z tabelki pobierzesz nazwę departamentu, potem pętlą wyszukasz takiej nazwy w comboBoxie i zaznaczysz ją jedną z tych metod.
    (Oczywiście nie jest to najładniejsze rozwiązanie, ale nie chcę utrudniać.)

  2. Po pomyślnym updacie, musisz ręcznie zaaktualizować dane w jTable. Tak jak na początku (po kliku) robiłaś jTable1.getValueAt(..) teraz musisz zrobić jTable1.setValueAt(..).

P.S. nie lepiej zrobić jakiś normalny model tabelki i zapiąć renderer?

0

super, juz wczytanie mi działa :)

    private void jTable1MousePressed(java.awt.event.MouseEvent evt) {                                     
        // TODO add your handling code here:

        int rec = jTable1.getSelectedRow();
        jTextField1.setText(jTable1.getValueAt(rec, 0).toString()); 
        jTextField2.setText(jTable1.getValueAt(rec, 1).toString());
        jComboBox1.setSelectedItem((jTable1.getValueAt(rec, 4).toString()));
        jTextField4.setText(jTable1.getValueAt(rec, 5).toString());
        jTextField5.setText(jTable1.getValueAt(rec, 6).toString());
        jTextField6.setText(jTable1.getValueAt(rec, 7).toString());
        jTextField7.setText(jTable1.getValueAt(rec, 8).toString());
    } 

jeszcze ten update . Teraz właśnie analizuje to co napisałeś :)

0

Tak, tylko mi ten UPDATE jeszcze nie działa :( Stoje na tym:

  private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:

        int id = Integer.parseInt(jTextField1.getText());
        int employee_id = Integer.parseInt(jTextField2.getText());
        String department_name = String.valueOf(jComboBox1.getSelectedItem());
        java.sql.Timestamp v_begin = java.sql.Timestamp.valueOf(jTextField4.getText());
        java.sql.Timestamp v_end = java.sql.Timestamp.valueOf(jTextField5.getText());

       // połączenie z bazą danych

        String sql = "UPDATE time_work SET employee_id=?, department_name=?, v_begin=?, v_end=? WHERE id =?";

        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);

       java.sql.Timestamp t_start = new java.sql.Timestamp(new java.util.Date().getTime());
       java.sql.Timestamp t_stop = new java.sql.Timestamp(new java.util.Date().getTime());
            Statement statement = con.createStatement();
            PreparedStatement cs = con.prepareStatement(sql);

            cs.setInt(0, id);
            cs.setInt(1, employee_id);
            cs.setString(2, department_name);
            cs.setTimestamp(3, v_begin);
            cs.setTimestamp(4, v_end);
            cs.setTimestamp(5, t_start);
            cs.setTimestamp(6, t_stop);
            cs.executeUpdate();
            cs.close();
            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());

        }
    }   

i niestety pojawia się lista wyjątków:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: " 05"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:449)
        at java.lang.Integer.parseInt(Integer.java:499)
        at java.sql.Timestamp.valueOf(Timestamp.java:238)
        at ola.bulicka.mgr_cp01.jButton6ActionPerformed(k_cp01.java:638)
        at ola.bulicka.mgr_cp01.access$800(k_cp01.java:42)
        at ola.bulicka.mgr_cp01$9.actionPerformed(k_cp01.java:217)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6267)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6032)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Pojawiają się one jak wprowadzę dane do pól

jTextField1
jTextField2
jComboBox1
jTextField4
jTextField5

po czym nacisnę przycisk "jButton6" . Hmmmmmm.... ?? wskazówkę można poprosić ?

0

Gdzie Ty widzisz listę wyjątków? Pojawia się jeden wyjątek: java.lang.NumberFormatException: For input string: " 05". Potrzebujesz tłumaczenia z angielskiego na polski?

0
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {  
(...)
Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);
(...)
} 

nawiazywanie nowego polacznia do bazy przy kazdym kliknieciu myszy to taka lekka masakra, sprobuj kliknac szybko ~20 razy w przycisk :)

0

Nie mam już tego problemu z wyjątkiem :)
Pojawia mi się jednak komunikat "Niepoprawny index kolumny". Rozumiem, że na istniejący indeks chce nałożyć ten sam, ale w UPDATE właśnie o to chodzi, że chce się zmodyfikować jakiś rekord, który istnieje w B.D.

Moje zapytanie jest źle skonstruowane?


        String sql = "UPDATE time_work SET employee_id=?, department_name=?, v_begin=?, v_end=? WHERE id =?";
0

Kolumny to nie to samo co wiersze. Twój błąd zapewne wynika z tego: cs.setInt(0, id);
Kolumny dla odmiany są numerowane od 1 (a nie od 0), więc ten zerowy jest niepoprawny. Musisz też pozostałe zmienić jak pierwszy zmienisz.

0

tak, dziękuje bardzo :) :) :)
Tak miałam źle. Poprawiłam na update.setInt(7, id); update.setInt(1, employee_id);.... update.setTimestamp(6, t_stop);

        Zamieszczam kod: 
private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:


        int id = Integer.parseInt(jTextField1.getText());
        int employee_id = Integer.parseInt(jTextField2.getText());
        String department_name = String.valueOf(jComboBox1.getSelectedItem());
        java.sql.Timestamp v_begin = java.sql.Timestamp.valueOf(jTextField4.getText());
        java.sql.Timestamp v_end = java.sql.Timestamp.valueOf(jTextField5.getText());

        String driver = "oracle.jdbc.driver.OracleDriver";
        String serverName = "localhost";
        String portNumber = "1521";
        String sid = "XE";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String pass = "kk";
        String user = "kk";

        PreparedStatement update = null;

        try {
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url, user, pass);

            java.sql.Timestamp t_start = new java.sql.Timestamp(new java.util.Date().getTime());
            java.sql.Timestamp t_stop = new java.sql.Timestamp(new java.util.Date().getTime());
          //  Statement statement = con.createStatement();
            String updateString = "update time_work SET employee_id= ?, department_name= ?, v_begin= ?, v_end= ?, t_start= ?, t_stop= ? WHERE id = ?";
            update = con.prepareStatement(updateString);

            update.setInt(7, id);
            update.setInt(1, employee_id);
            update.setString(2, department_name);
            update.setTimestamp(3, v_begin);
            update.setTimestamp(4, v_end);
            update.setTimestamp(5, t_start);
            update.setTimestamp(6, t_stop);
            
            update.executeUpdate();
            update.close();

            con.close();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());

        }

    }   

Jeszcze muszę tylko zrobić aby połączenie z b.d. nie wywoływało się za każdym razem jak go użytkownik kliknie na button.

1 użytkowników online, w tym zalogowanych: 0, gości: 1