IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Binder une table sql en MAJ, avec un Tableview


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 36
    Par défaut Binder une table sql en MAJ, avec un Tableview
    Bonjour,

    Je me pose une questione existencielle : comment Binder les MAJ d'une Table SQL.
    - Est-ce qu'on peut Binder une synchro à 100% Table/Tableview?
    - Ou est-ce qu'on doit gérer les MAJ (Insert/Update/Delete) et gérer un refresh à base de select?

    Concernant mon code actuel, j'ai un FXML déclaré dans le JAVA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        private TableView<Compte> table;
        @FXML
        private TableColumn<Compte, String> COL_ID;
        @FXML
        private TableColumn<Compte,String> COL_Nom;
        @FXML
        private TableColumn<Compte,String> COL_Banque;
    etc... (les puristes pourront noter que je merdoie à gérer mon ID en affichage de type INT).

    J'ai un CallBack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            table.setEditable(true);
            Callback<TableColumn<Compte,String>, TableCell<Compte,String>> CellFactory = new Callback<TableColumn<Compte,String>, TableCell<Compte,String>>() { 
                @Override
                public TableCell call(TableColumn p) { 
                    return new EditingCell(); 
                } 
            };
    Pour chaque colonne, je lie les colonnes du Tableview à une classe de données perso :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            //-------------------------------( Bind des colonnes
            COL_ID.setCellValueFactory(new PropertyValueFactory<Compte, String>("ID"));
            COL_ID.setCellFactory(CellFactory);
            COL_ID.setOnEditCommit(
                    new EventHandler<CellEditEvent<Compte, String>>() {
            @Override
            public void handle(CellEditEvent<Compte, String> t) {
                ((Compte) t.getTableView().getItems().get(
                    t.getTablePosition().getRow())
                    ).setID(t.getNewValue());
                }
            });
    Le select fonctionne (j'ai externalisé la connexion BDD). :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
            Connection c;
            try {
                c = DBConnect.connect();
                //SQL sélection des comptes
                String SQL = "SELECT * from T_Comptes";
                //ResultSet
                ResultSet rs = c.createStatement().executeQuery(SQL);
                while (rs.next()) {
                    Compte Enregistrement = new Compte(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7));
                    //Enregistrement.ID =SimpleIntegerProperty(rs.getInt(1));
                    Enregistrement.ID.set(rs.getString(1));
                    Enregistrement.NOM.set(rs.getString(2));
                    Enregistrement.BANQUE.set(rs.getString(3));
                    Enregistrement.AGENCE.set(rs.getString(4));
                    Enregistrement.COMPTE.set(rs.getString(5));
                    Enregistrement.CLE.set(rs.getString(6));
                    Enregistrement.COMMENT.set(rs.getString(7));
                    data.add(Enregistrement);      
                    System.out.println(rs.getString(5));                
                    System.out.println(Enregistrement);
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("Erreur de construction données SQL");
            }
            System.out.println(data);
            table.setItems(data);
    J'arrive à ajouter des lignes en visuelk (mais pas dans la BDD :p) via des textfields :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        @FXML
        public void BTN_Enregistrer_Action(ActionEvent event) {
            data.add(new Compte(
                //Integer.parseInt(ADD_ID.getText()),    
                ADD_ID.getText(),
                ADD_NOM.getText(),    
                ADD_BANQUE.getText(),
                ADD_AGENCE.getText(),
                ADD_COMPTE.getText(),
                ADD_CLE.getText(),
                ADD_COMMENT.getText()
    La classe de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public static class Compte {
            //private final SimpleIntegerProperty ID;
            private final SimpleStringProperty ID;
            private final SimpleStringProperty NOM;
            private final SimpleStringProperty BANQUE;
            private final SimpleStringProperty AGENCE;
            private final SimpleStringProperty COMPTE;
            private final SimpleStringProperty CLE;
            private final SimpleStringProperty COMMENT;
     
            private Compte(String id, String nom, String banque, String agence, String compte, String cle, String comment) {
                //this.ID = new SimpleIntegerProperty(id);
                this.ID = new SimpleStringProperty(id);
                this.NOM = new SimpleStringProperty(nom);
                this.BANQUE = new SimpleStringProperty(banque);
                this.AGENCE = new SimpleStringProperty(agence);
                this.COMPTE = new SimpleStringProperty(compte);
                this.CLE = new SimpleStringProperty(cle);
                this.COMMENT = new SimpleStringProperty(comment);
        }
    Les fonctions de la classe (je met que le premier champ, tout est pareil pour toutes les données).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        public String getID()                  { return ID.get(); }
        public void setID(String id)           { ID.set(id); }
    Et enfin les fonctions qui vont bien pour éditer en direct le tableview :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
       public static class EditingCell extends TableCell<Compte, String> {
     
            private TextField Text_Into_Tableview = new TextField();
     
            public EditingCell() {
            }
     
            @Override
            public void startEdit() {
                Text_Into_Tableview.setId("Text_Into_Tableview");
                Text_Into_Tableview.setStyle("-fx-background-color: black;");
                if (!isEmpty()) {
                    super.startEdit();
                    createTextField();
                    setText(null);
                    setGraphic(Text_Into_Tableview);
                    Text_Into_Tableview.selectAll();
                }
            }
     
            @Override
            public void cancelEdit() {
                super.cancelEdit();
     
                setText((String) getItem());
                setGraphic(null);
            }
     
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
     
                if (empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    if (isEditing()) {
                        if (Text_Into_Tableview != null) {
                            Text_Into_Tableview.setText(getString());
                        }
                        setText(null);
                        setGraphic(Text_Into_Tableview);
                    } else {
                        setText(getString());
                        setGraphic(null);
                    }
                }
            }
     
            private void createTextField() {
                Text_Into_Tableview = new TextField(getString());
                Text_Into_Tableview.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
                Text_Into_Tableview.focusedProperty().addListener(new ChangeListener<Boolean>(){
                    @Override
                    public void changed(ObservableValue<? extends Boolean> arg0, 
                        Boolean arg1, Boolean arg2) {
                            if (!arg2) {
                                commitEdit(Text_Into_Tableview.getText());
                            }
                    }
                });
            }
     
            private String getString() {
                return getItem() == null ? "" : getItem().toString();
            }
        }
     
    }
    Pour trouver tout ça j'ai surfé comme un âne, d'où le résultat de bourricot ou je suis un peu bloqué.

    Si personne ne me donne de tuyau, je crois que je ferai marche arrière sur le côté éditable du tableview, pour tout gérer manuellement sur un tableview d'affichage, et des textfields sous forme de miniform, avec gestion de lecture/Modif/ajout/suppression et des séquences d'ordres sql.

    Des idées?
    Par avance merci à tous!!!

    Et que le FX soit avec votre Java...

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Aucune idee, il faudra peut-etre aller voir du cote de DataFX, notamment du cote de ses data sources ; également du cote de "Dynamic TableView Data From Database".
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    bonjour,
    quelle est la structure de ta table?
    pour faire une insertion il faut que tu fasses un Insert et/ou un executeSql, ce que je ne vois pas.
    Eric

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 36
    Par défaut
    Eric,

    Effectivement, il n'y en a pas. J'avais rêvé un temps qu'il y ait un Objet de type tableview (bindé sur une liste) capable de mettre à jour directement la BDD, à partir de la liste observable. Avec un sorte d'instruction batch à la fin.
    Comme quoi IDE et BDD ont encore du chemin à faire pour se lier. Ca existe avec Visual Studio et SQL Server (Bouhhhh )

    Du coup j'ai géré mes insert/update/delete à la mano...

    J'arrive à un nouvelle question, mais je vais ouvrir un autre thread!

    En tout cas merci de t'être penché sur ma question.

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Septembre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2012
    Messages : 36
    Par défaut
    Bouye,

    Je croyais avoir répondu, désolé!

    J'ai fureté du côté de DATAFX, mais c'est encore un cran au dessus de mon niveau pour être bien intégrable dans mon dev.
    Peut-être que lorsque je serais plus familiarisé avec Java(fx) j'irais re jeter un coup d'oeil.
    Merci en tout cas.

Discussions similaires

  1. Peut-on créer une table SQL avec Pentaho ?
    Par ToniConti dans le forum Pentaho
    Réponses: 1
    Dernier message: 29/11/2010, 18h40
  2. cryptage de colonne d'une table SQL avec jasypt
    Par djolof dans le forum Sécurité
    Réponses: 0
    Dernier message: 19/06/2009, 15h13
  3. Erreur lors d'un update d'une table sql serveur en liaison ODBC avec SAS
    Par wizou44 dans le forum Administration et Installation
    Réponses: 5
    Dernier message: 25/05/2009, 09h44
  4. Insertion de variable avec guillemets dans une table SQL
    Par jnico21200 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/03/2009, 14h36
  5. Réponses: 11
    Dernier message: 30/05/2007, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo