bonsoir,
comment faire pour utiliser la fonction SUM(). est ce qu'il faut ajouter un package ou quoi ?
bonsoir,
comment faire pour utiliser la fonction SUM(). est ce qu'il faut ajouter un package ou quoi ?
Salut,
Il n'y a pas besoin de "package" ou bibliothèque spéciaux pour utiliser une fonction SQL : il suffit qu'elle soit supportée par le SGBD (ce qui est le cas avec la plupart des SGBDR à priori) et de l'utiliser dans une requête, comme n'importe quel autre mot clef SQL (SELECT, WHERE, ou quoi), genre SELECT SUM(nom_colonne) FROM table ou SELECT id, SUM(valeur) AS total FROM table GROUP BY id, etc. Tout ce qui concerne l'usage de cette fonction en particulier concerne SQL, pas Java.
salut,
J'utilise DB Browser for sqlite (3.10). Lorsque j'ai utilisé la fonction sum dans une requête Insert, j'ai eu une erreur sur SUM (The method SUM(Object) is undefined for the type new ActionListener(){}).
PS: merci pour votre réponse
Montre le code que tu écris. Et la stacktrace complète de l'exception.
Voici une partie du code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date ,Prix_du_logement, Somme_versee , Nom_du_projet, Versement_total) VALUES('" + nom.getText() +"','" +prenom.getText() +"','" +date.getText() + "'," + "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + verse.getText()+ "," + " (SELECT Nom_du_projet FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "'),"+ SUM(Versement_total)+ ")"); JOptionPane.showMessageDialog(null, "Element ajouté");
Ce n'est pas un problème Java.
Ta requête SQL ne peut pas fonctionner comme cela.
1) on ne peut pas appeler une sous-requête (avec SELECT) quand on utilise VALUES ( ...
c'est beaucoup plus simple : on utilise SELECT à la place de VALUES quand on fait appel à des données venant d'une autre table
2) tu utilises SUM(Versement_total) qui est un agrégat sans préciser de quelle table il vient.
Bref, en SQL tout est faux.
De ce que je comprends de ta requête, tu veux insérer dans la table Versement
des informations issues de la table Client en ajoutant la date et SUM(Versement_total)
Dans un premier temps, on va mettre de côté SUM(Versement_total) car je ne sais pas pourquoi tu veux l'insérer ni de quelle table cela provient.
La requête correcte est :
Dans un second temps, on verra comment ajouter SUM(Versement_total)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 "INSERT INTO Versement ( Nom , Prenom, Date ,Prix_du_logement, Somme_versee , Nom_du_projet) SELECT Nom, Prenom,'" +date.getText() + "', Prix_du_logement, Nom_du_projet FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'"
bonsoir,
ma requête fonctionne le plus normalement du monde en utilisant SELECT dans INSERT , le probléme se pose dans SUM (nom_du_colomne de la table) .
je ne sais pas comment y résoudre .
En fait, ce n'est pas standard mais certain SGBD peuvent en effet le supporter.
En revanche, le problème dans ton code au sujet de sum, c'est que cela doit faire partie de la requête. SUM c'est une fonction SQL, pas Java. Il faut que tu l’intègres dans la string constituant la requête (pour éviter ce genre de truc, on évite de faire des concaténations, on utilise le placeholder ? et on injecte les valeurs dans le PreparedStatement).
Tu as écrit :
Regarde bien où se trouvent les guillemets.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "' AND Prenom='" +prenom.getText() + "'),"+ SUM(Versement_total)+ ")");
Il faudrait faire :
Là, SUM est dans la requête. En revanche, je ne pense pas que ça fonctionnera non plus, parce que SUM c'est un agrégat sur une sélection. Alors que dans ta requête il correspondrait à la sum de ce qu'on est en train d'insérer et qui n'existe pas encore. Je ne pratique pas assez le SQL pour connaître la bonne solution, mais à mon avis, ça ne sera pas possible en une requête, ou alors il faudrait ajouter le montant du versement actuel avec le total des versements existant, quelque chose comme verse.getText()+" + SELECT SUM(Versement_total) FROM ...., à supposer que la syntaxe soit supportée et en utilisant des alias pour éviter la confusion avec l'insertion en cours.
Code : Sélectionner tout - Visualiser dans une fenêtre à part "' AND Prenom='" +prenom.getText() + "'), SUM(Versement_total) )");
Je pense que les guillemets ont été mal placés .
Merci bien
SUM(Versement_total) indique que l'on fait un total de plusieurs enregistrements.
Si Versement_total vient d'un seul enregistrement de la table Client (à savoir la fiche client), alors il est parfaitement inutile de faire un SUM.
Non je veux faire la somme de plusieurs enregistrements
En ajoutant SUM(Somme_versee) j'ai cette erreur : No shuch column Somme_versee alors que la colonne existe dans ma table.
statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee,Prix_du_logement, Nom_du_projet, Versement_total) VALUES('" + nom.getText() +"','" +prenom.getText() +"','" +date.getText() + "'," + verse.getText() + ", " + "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + " (SELECT Nom_du_projet FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "')," + "(SUM(Somme_versee))"+ ")");
Jj'ai l'impression que c'est ça le but... une dénormalisation du prix total (d'ailleurs on dirait que (presque) tout est dénormalisé )... et du coup, ça serait logique de mettre à jour les enregistrements déjà existant, pour qu'ils contiennent tous le prix total et donc deux faire tout ça en deux requêtes : un insert pour le nouveau versement, un update pour mettre à jour la sum des versements dans le champ "total".
De ce que je comprends et après avoir regardé un peu la doc Sql lite, on doit pouvoir simplifier un peu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 String sql; sql = "INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee, Prix_du_logement, Nom_du_projet, Versement_total) " + "SELECT Nom, Prenom,'" +date.getText() + "'," + verse.getText() + ", Prix_du_logement, Nom_du_projet, " + "(SELECT SUM(Somme_versee) FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"') " + "FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'"; statement.executeUpdate(sql);
J'ai fait ça code hier et au niveau du versement_total ça m'a donné "Versement_total m sauf qu'il n'a pas additionner celle que je venais d’insérer dans " verse.getText()
Code : Sélectionner tout - Visualiser dans une fenêtre à part statement.executeUpdate("INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee,Prix_du_logement, Nom_du_projet, Versement_total, Versement_restant) VALUES('" + nom.getText() +"','" +prenom.getText() +"','" +date.getText() + "'," + verse.getText() + ", " + "(SELECT Prix_du_logement FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "')," + " (SELECT Nom_du_projet FROM Client WHERE Nom='" + nom.getText()+ "' AND Prenom='" +prenom.getText() + "'), ((SELECT SUM(Somme_versee) FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"')," + "(SELECT (Prix_du_logement- Versement_total) FROM Versement WHERE Prenom='" +prenom.getText()+ "' AND Nom='" +nom.getText() + "')"+" )");
C'est normal, tu ne nous a pas dit que c'était ce que tu voulais ...
Cela pourrait marcher avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 String sql; sql = "INSERT INTO Versement ( Nom , Prenom, Date , Somme_versee, Prix_du_logement, Nom_du_projet, Versement_total) " + "SELECT Nom, Prenom,'" +date.getText() + "'," + verse.getText() + ", Prix_du_logement, Nom_du_projet, " + "(SELECT SUM(Somme_versee) +" + verse.getText() + " FROM Versement WHERE Nom='"+ nom.getText() + "' AND Prenom='"+ prenom.getText() +"') " + "FROM Client WHERE Nom='"+ nom.getText() +"' AND Prenom='"+ prenom.getText() + "'"; statement.executeUpdate(sql);
ça marche mnt merci beaucoup
Oui mais ce n'est pas très fiable comme code.
Dès que tu auras un nom avec une apostrophe, un chiffre à virgule ou une date pas très bien formatée alors les problèmes vont recommencer.
Il faut que tu regardes du côté des PreparedStatement pour stabiliser un peu tout cela ...
Effictivement, j'ai essayé d'insérer des noms avec des des apostrophes et ça ne marche pas.
merci pour la remarque
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager