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 :

UPDATE plusieurs tables


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Par défaut UPDATE plusieurs tables
    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
     
     if(comboBox_2.getSelectedItem().toString()!=null)
     
    					 statement = connection.prepareStatement("UPDATE Client  SET Nom_projet=?  WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    				  	 statement.setString(1, comboBox_2.getSelectedItem().toString());
    				     statement.setString(2,comboBox.getSelectedItem().toString());
    					 statement.setString(3,comboBox_1.getSelectedItem().toString());
     
    				  statement.executeUpdate( );
     
     
    				   if(textField.getText()!=null)
     
    						 statement = connection.prepareStatement("UPDATE Client SET prix_loge=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    					  	 statement.setString(1, textField.getText());
    					  	 statement.setString(2,comboBox.getSelectedItem().toString());
    						 statement.setString(3,comboBox_1.getSelectedItem().toString());
     
    					  statement.executeUpdate( );
     
     
     
    				   if(idbloc.getText() !=null)
    					   statement = connection.prepareStatement("UPDATE Liste SET Bloc=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    					   statement.setString(1, idbloc.getText());
    					   statement.setString(2,comboBox.getSelectedItem().toString());
    						 statement.setString(3,comboBox_1.getSelectedItem().toString());
    					   statement.executeUpdate( );
     
    				   if(comboBox_1.getSelectedItem().toString()!=null)
    					   statement = connection.prepareStatement("UPDATE Liste SET Type=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    					   statement.setString(1, comboBox_3.getSelectedItem().toString());
    					   statement.setString(2,comboBox.getSelectedItem().toString());
    						 statement.setString(3,comboBox_1.getSelectedItem().toString());
    					   statement.executeUpdate( );
     
    				  if(surf.getText()!=null)
    						   statement = connection.prepareStatement("UPDATE Liste SET Surface=?WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    						   statement.setString(1, surf.getText());
    						   statement.setString(2,comboBox.getSelectedItem().toString());
    							 statement.setString(3,comboBox_1.getSelectedItem().toString());
    						   statement.executeUpdate( ); 
     
    				 if(comboBox_4.getSelectedItem().toString()!=null)
    							   statement = connection.prepareStatement("UPDATE Liste SET Etage=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    							   statement.setString(1, comboBox_2.getSelectedItem().toString());
    							   statement.setString(2,comboBox.getSelectedItem().toString());
    								 statement.setString(3,comboBox_1.getSelectedItem().toString());
    							   statement.executeUpdate( );	 
    				 if(n.getText()!=null)
    								   statement = connection.prepareStatement("UPDATE Client SET N°_loge=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)");
    								   statement.setString(1, n.getText());
    								   statement.setString(2,comboBox.getSelectedItem().toString());
    									 statement.setString(3,comboBox_1.getSelectedItem().toString());
    								   statement.executeUpdate( );

    je veux faire un update de table Client Versement et Liste en une seule requête (la même colonne existe dans les 3 tables)

  2. #2
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 095
    Par défaut
    Bonjour,
    Sans rentrer dans les détails, votre interrogation soulève deux problématiques :
    1) Mauvaise maîtrise du langage SQL
    2) Mauvaise maîtrise des bases de données relationnelles

    Une requête SQL Update peut s'adresser à plusieurs champs d'un même enregistrement ou de plusieurs. En d'autres termes, si vous avez trois champs à mettre à jour dans un enregistrement, inutile de faire une requête pour chaque.
    Premier exemple de simplification sur les deux premières requêtes :

    Avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1ère requête "UPDATE Client  SET Nom_projet=?  WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)"
     
    2nd requête "UPDATE Client SET prix_loge=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?)
    Après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Une seule requête "UPDATE Client SET prix_loge=?, Nom_projet=? WHERE IDClient=(SELECT IDClient FROM Client WHERE Nom=? AND Prenom=?"
     
    Il faut bien sûr modifier les statement.setString qui suivent !
    Ensuite, j'ai un peu de mal à comprendre votre raisonnement. C'est comme si vous pensiez qu'il faille pointer l'indexe primaire d'un enregistrement pour le mettre à jour. Comme vous récupérez cet indexe dans la même table, et que pour le trouver vous utilisez deux champs Nom et Prenom dans cette même table, il est inutile de passer par l'indexe. Vous pouvez vous contenter de mettre directement nom=? AND prenom=? dans la clause de votre requête. Cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une seule requete "UPDATE Client SET prix_loge=?, Nom_projet=? WHERE Nom=? AND Prenom=?"
    Si vous appliquez ce principe à vos requêtes concernant Liste, on passe de quatre requête à une seule. Au final, rien que pour ces deux jeux de requêtes, on passe de six requêtes à deux.
    Je vous laisse le loisir de voir pour le reste.

    Maintenant, que fait-on pour passer de ce qui devrait se résumer à trois requêtes à une seule. Grâce à l'aspect relationnel des bases de données. C'est en effet cet aspect relationnel qui permet de créer des relations entre les tables. Peut importe quelque part où se trouvent ses tables. En langage SQL, pour utiliser cette capacité relationnelle, on utilise les requêtes Join. Dans votre cas, je ne peux que vous inviter à consulter notre ami Google avec pour seuls critères "sql update join".

    Qu'en pensez-vous ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  3. #3
    Membre confirmé
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Par défaut
    Merci pour ces détails,
    PS: pour la condition WHERE j'utilisais avant Nom et Prenom puis je l'ai changé par l'index primaire mais c'est vraiment inutil.

  4. #4
    Membre confirmé
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Par défaut
    Pour le UPdate de la même table depuis deux requêtes, je l'ai essayé avec une seule mais si je change pas tous les champs c'est à dire je laisse des textField vides, j'ai des valeurs null dans ma table. je l'ai changé par ça
    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
     
     statement = connection.prepareStatement("UPDATE Versement  SET Nom_projet=?,N°_loge=?,prix_loge=?,Verse_total=?,Nom=?,Prenom=?  WHERE Nom=? ");
    					  statement.setString(1, comboBox_2.getSelectedItem().toString());
    					  statement.setString(2, n.getText()); 
    					  statement.setString(3, textField.getText()); 
    					  statement.setString(4, t1);
    					  statement.setString(5, nom.getText());
    					  statement.setString(6, prenom.getText());
    					  statement.setString(7, comboBox.getSelectedItem().toString());
    							statement.executeUpdate();
    					  	statement.close();
    				  	 statement = connection.prepareStatement("UPDATE Liste  SET Nom_projet=? ,Type=?,Etage=?,Surface=?,N°_loge=?,Bloc=?,prix_loge=?,Verse_restant=?,Nom=?,Prenom=?  WHERE Nom=? ");
    					  statement.setString(1, comboBox_2.getSelectedItem().toString());
    					  statement.setString(2, comboBox_3.getSelectedItem().toString());
    					  statement.setString(3, comboBox_4.getSelectedItem().toString());
    					  statement.setString(4, surf.getText());
    					  statement.setString(5, n.getText());
    					  statement.setString(6, idbloc.getText());
    					  statement.setString(7, textField.getText()); 
    					  statement.setString(8, t1); 
    					  statement.setString(9, nom.getText());
    					  statement.setString(10, prenom.getText());
    					  statement.setString(11, comboBox.getSelectedItem().toString());
    							statement.executeUpdate();
    					  	statement.close();
    					  	 statement = connection.prepareStatement("UPDATE Client  SET Nom_projet=? ,N°_loge=?, prix_loge=? ,Verse_restant=?,Nom=?,Prenom=? WHERE Nom=? ");
    						  statement.setString(1, comboBox_2.getSelectedItem().toString());
    						  statement.setString(2, n.getText()); 
    						  statement.setString(3, textField.getText());
    						  statement.setString(4, t1);
    						  statement.setString(5, nom.getText());
    						  statement.setString(6, prenom.getText());
    						  statement.setString(7, comboBox.getSelectedItem().toString());
    								statement.executeUpdate();
    								JOptionPane.showMessageDialog(null, "Modifié avec succé");
    						  	statement.close();
    .avant cette requête Je remplie les textFields par une requête SELECT.

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 095
    Par défaut
    Bonsoir,
    Je vous avoues que je ne comprends plus très bien vos extraits de code.
    Dans votre premier post, vous faisiez deux requêtes pour modifier deux champs différents d'un même enregistrement.
    Maintenant, vous faites une requête qui modifie tous les enregistrements, alors qu'il n'y en a que quelques-uns à modifier ?! Qui plus est, avec ce que je me permets de qualifier d'aberration, ou d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "UPDATE Versement  SET Nom_projet=?,N°_loge=?,prix_loge=?,Verse_total=?,Nom=?,Prenom=?  WHERE Nom=? "
    Cette requête comporte une aberration, et ne peut pas fonctionner correctement.
    Le champs 'Nom' du bloc SET correspond à nom.getText(), et celui de la clause WHERE, à comboBox.getSelectedItem().toString() alors que dans cette requête, le champs Nom du bloc SET et le champs Nom de la clause WHERE sont tous deux le même et unique champ Nom de votre table Versements ???

    Si dans votre requête unique vous aviez des valeurs 'null' positionnés là où les champs de saisie n'ont pas été renseignés, c'est parfaitement normale, puisque vous ne testez rien dans votre code. En clair, si un TextField ne contient pas de texte, l'invocation de sa méthode getText() renverra null. Comme dans votre code vous faites un "setString(x, textField.getText())" sans conditions, c'est comme si vous écriviez "setString(x, null)", donc, c'est normal.
    Ce qu'il faut comprendre, c'est que dans le bloc SET ne doivent être présent que les champs à modifier. Ceux qui ne sont pas à modifier n'ont rien à y faire.
    Vous l'avez compris, dans ce cas, l'utilisation d'un PreparedStatement n'est pas approprié.
    Un simple Statement fera l'affaire.
    Lors de l'appuies sur le bouton "Exécuter", vous commencez par construire la chaîne SQL finale en fonction des champs de saisi renseignés.
    Il ne restera plus qu'à invoquer la méthode executeUpdate du Statement avec cette requête construite dynamiquement qui ne contiendra que les champs à modifier et ne mettra plus les autres à 'null'.

    Dernière chose, si je puis me permettre. Votre interrogation est plus à catégoriser dans ce qui concerne les bases de données et le langage SQL que dans la catégorie Java, vous ne croyez pas ?
    En déplaçant ce post dans le bon Forum, vous aurez plus de chance de capter l’intérêt d'un spécialiste qui saura probablement mieux vous guider que moi.
    Et qu'avez-vous trouver au sujet des requêtes "sql update join" ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  6. #6
    Membre confirmé
    Femme Profil pro
    Ingénieur en Télécommunication
    Inscrit en
    Octobre 2017
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur en Télécommunication
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2017
    Messages : 121
    Par défaut
    Bonsoir,
    Merci pour vos messages.
    Concernat la requête de Update, avant d'arriver à ce code j'ai fais plusieurs requêtes update (dans un même boutton)chacune modifie un champ avec des conditions IF
    exp: if(comboBox.getSelectedItem()!=null){ requête update}
    if(prix.getText()!=null){ requête update}
    lorsque je change un seul champ, les autres champs deviennnent nulls(dans ma BDD).

Discussions similaires

  1. [AC-2013] requête update plusieurs tables
    Par John Parker dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 27/10/2015, 12h53
  2. update plusieur table
    Par arckaniann dans le forum Langage
    Réponses: 1
    Dernier message: 08/01/2012, 02h28
  3. UPDATE plusieurs tables
    Par wclef dans le forum SQL
    Réponses: 13
    Dernier message: 05/03/2010, 11h01
  4. UPDATE plusieurs tables
    Par billoum dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/08/2006, 13h27
  5. update sur plusieurs tables
    Par Jean-Matt dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/01/2006, 14h30

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