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

JDBC Java Discussion :

Créer une requête d'ajout dynamique avec des contraintes optionnelles


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    Par défaut Créer une requête d'ajout dynamique avec des contraintes optionnelles
    Bonjour à tous.

    Je suis débutant dans le monde java, je viens de VBA.

    Dans le post numéro 3 de cette discussion, http://www.developpez.net/forums/d42...tere-java-sql/
    on arrive à créer une requête avec des SELECT... WHERE et/ou AND, selon le cas.

    J'ai essayé de modifier un peu le code pour créer une requête de insertion de données dans ma base. J'ai une fenêtre avec plusieurs JTextFields, mais certains d'entre eux pourraient rester vides. Je me suis dit qu'avec une classe comme celle citée ci-dessus je pourrais simplifier mon code et éviter de mettre dans ma liste de colonnes à insérer celles qui sont vides.

    Exemple, si j'ai trois JTextFields (Prenon, NomPaternel, NomMaternel)
    Il se peut que dans certains cas le champ NomPaternel soit vide, donc je voudrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO maTable (Prenom, NomMaternel) VALUES (...)
    L'idée c'est de parcourir tous mes JTextFields parce qu'ils sont plus d'une quinzaine, avec quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //C'est ce que je fait pour construire une requête dynamique avec WHERE ou AND selon le cas...
     
    		for (Controleur c : controleurs){
    			strLike = "%"+ c.getTxtValeur()+"%";
    			gen.and(!"".equals(c.getTxtValeur()),	"upper ("+ c.getTxtNom()+") "+" like ?",	strLike);
    		}
    		PreparedStatement stmt = gen.createStatement(cn);
    Merci d'avance si vous pouvez me donner quelque idées...

  2. #2
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Salut !
    un truc de ce genre...
    rudimentaire bien sûr, à adapter, et même améliorer avec un preparedStatement par exemple

    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
     
            String[] valeurs = {"","",""};                               // pas de valeur nulle
            if (!jTextField1.getText().isEmpty()) valeurs[0] = jTextField1.getText();
            if (!jTextField2.getText().isEmpty()) valeurs[1] = jTextField2.getText();
            if (!jTextField3.getText().isEmpty()) valeurs[2] = jTextField3.getText();
            int nb = 0;        
            StringBuilder sql = new StringBuilder(" INSERT INTO MATABLE ( ");   
            if (!valeurs[0].isEmpty()) {       // il y a quelque chose dans jTextField1
                sql.append("NOM"); 
                nb++;
            }
            if (!valeurs[1].isEmpty()) {
                if (nb > 0) sql.append(",");   // si ce n'est pas le premier, le précéder d'une virgule
                sql.append("PRENOM"); 
                nb++;
            }
            if (!valeurs[2].isEmpty()) {
                if (nb > 0) sql.append(",");
                sql.append("LOCALITE"); 
                nb++;
            }
            nb = 0;
            sql.append(") VALUES ("); 
            if (!valeurs[0].isEmpty()) {  
                sql.append("'").append(valeurs[0]).append("'");         // les valeurs entre apostrophes
                nb++;
            }
            if (!valeurs[1].isEmpty()) {  
                if (nb > 0) sql.append(",");
                sql.append("'").append(valeurs[1]).append("'"); 
                nb++;
            }
            if (!valeurs[2].isEmpty()) {  
                if (nb > 0) sql.append(",");
                sql.append("'").append(valeurs[2]).append("'"); 
                nb++;
            }     
            sql.append(")");                                    // fermer la parenthèse
            String s = String.valueOf(sql);           // de stringBuilder à String         
            jLabel1.setText(s);                              // afficher le résultat

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    Par défaut
    Merci pour la réponse Fraco. Justement je voulais éviter 15 ou 20 if... un pour chaque JTextField ou JComboBox de mon formulaire.

    Avec cette methode je crée dynamiquement mes JTextFields et je les mets dans un array:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public void addTexto(String cNom, String txtPos){
    		CtrlSoloStr model = new CtrlSoloStr ();
    		final JTextField text = new JTextField (model, "", 15);	
    		text.setToolTipText("Sólo puede introducir letras y espacios");
    		text.setName(cNom);
    		this.add(text, txtPos);
                    //Array
    		controleurs.add(new TextoControl(text));
    	    }
    Puis, je prépare mon statement:
    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
     
    /*Pour l'exemple j'ajoute seulement 5 colonnes dans ma table, mais il y en a beaucoup plus, 
    il s'agit d'un formulaire pour ajouter tous les données d'une personne...*/
     
    PreparedStatement stmtInsert= cn.prepareStatement("INSERT INTO tblpersona+ " +
    						"(nombres,apaterno,amaterno, idciudad, idb) +" +
    						"VALUES (?,?,?,?,?)");
    				int x =1;
    /*Je suppose que dans le boucle for le premier JTextField sera toujours le premier 
    que j'ai mis dans mon array et ainsi de suite, sinon ça sera la catastrophe!*/
    				for (TextoControl c : controleurs){
    					stmtInsert.setString(x, c.getTxtValeur());
    					x++;
    				}
    /*Ensuite les valeurs récupérées des JComboBox... plus compliqué puisque 
    ce sont des valeurs numériques qui font des clés étrangères dans ma base de données...*/
    					stmtInsert.setLong(4, lngIdCiudad);
    					stmtInsert.setLong(5, lngIdB);
     
    					stmtInsert.executeUpdate();
    Avec cela j'évite d'avoir plein de if... mais je demande d'insérer certaines colonnes vides (s'il y en a) dans ma table. Je ne sais pas si cela affecte en quelque chose? Si un expert JDBC passe par ici

  4. #4
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    je demande d'insérer certaines colonnes vides (s'il y en a) dans ma table.
    ? un insert ne peut pas ajouter des colonnes dans une table !
    en revanche, si tu parles de valeur vide (ou nulle) on les ignore simplement dans le query (comme on le voit dans mon code ).

    un site précieux : http://sqlpro.developpez.com/

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Je parle de valeurs vides ou null dans les JTextFields.

    Je vois bien qu'on les ignore dans ton code. Mais moi, je dois vérifier 15 ou 20 JTextFields, alors imagine la longueur du code si je le fais avec des if. Voilà pourquoi je voulais tout mettre dans une boucle for... ou générer une requête dynamique INSERT INTO qu'ignore les colonnes dont les JTextFields que lui correspondent seraient vides ou nulles. Mon boucle for... fait l'affaire mais il n'ignore pas ces JTextFields vides et ma question était si cela affecte à quelque chose lorsque je demande par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stmtInsert.setString(x, c.getTxtValeur());
    et le getTxtValeur de x (la valeur d'un JTextField quelconque de ma fenêtre) est vide ou null?

    En cherchant je suis tombé sur Hibernate. Cela a l'air intéressant. A suivre...

  6. #6
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    Mais moi, je dois vérifier 15 ou 20 JTextFields, alors imagine la longueur du code si je le fais avec des if.
    Tout à fait ! mon exemple était rudimentaire, juste pour illustrer la fabrication de la requête. En fait il faut avoir un tableau de string pour les 15 ou 20 titres de colonne, et un tableau d'objets (par exemple) pour les valeurs. Après tu passes en revue les tableaux et si la valeur n'est pas vide ni nulle tu complètes le texte de la requête...
    Plus de if en cascade.

Discussions similaires

  1. [XL-2010] Créer une macro qui ajoute et remplit des lignes
    Par Gianni89 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/02/2013, 15h13
  2. Créer une connexion entre 2 PC avec des sockets
    Par CLeBeR dans le forum VB.NET
    Réponses: 5
    Dernier message: 16/11/2011, 22h24
  3. [XL-2007] Comment créer une dépendance entre deux listes avec des données issus d'un tableau?
    Par efesdark dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2011, 16h22
  4. Créer une chaine de taille variable avec des blancs
    Par jojodu31 dans le forum Général Java
    Réponses: 5
    Dernier message: 15/04/2008, 17h38
  5. Réponses: 1
    Dernier message: 18/02/2007, 11h07

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