Calcul de la somme d'une colonne

Fermé
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023 - Modifié le 2 août 2018 à 12:44
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 30 nov. 2018 à 23:38
Bonjour à tous.Je désire calculer la somme des factures de la journée.Ce que j'ai écris n'est pas correcte.Comment je fais le type de retour ? La requête également ? J'ai besoin qu'on m'aide à le corriger s'il vous plaît.

@Override
 public double totalJour(Facture facture) {
  
   facture=null;
  try {
   //Préparation de la requête
   String sql="SELECT SUM (factures_montants) AS facturetotale FROM factures WHERE factures_date_limite like ?";
    //Création d'une zone de requête
   PreparedStatement pst=conn.prepareStatement(sql);
   
   //Exécution de la requête
   ResultSet rs=pst.executeQuery();
   //Traitement du résultat de la requête
   while (rs.next()) {
    int id = Integer.parseInt(rs.getString("idfactures"));
    String numerofact = rs.getString("factures_numero");
    String montant = rs.getString("factures_montants");
    Date datelim = rs.getDate("factures_date_limite");
    int idPays = rs.getInt("facturiers_idfacturiers");
    facture=new Facture(id, numerofact, montant,datelim,idPays);
    
   }
  } catch (NumberFormatException e) {
   e.printStackTrace();
  } catch (SQLException e) {
   System.out.println("Problème de requête");
   e.printStackTrace();
  }
  return ;
 }
public class Facture implements Serializable {
 private int idfactures;
 private String factures_numero;
 private String factures_montants;
 private Date factures_date_limite;
 private int facturiers_idfacturiers;
}

CREATE TABLE `factures` (
  `idfactures` int(11) NOT NULL,
  `factures_numero` varchar(45) NOT NULL,
  `factures_montants` varchar(45) DEFAULT NULL,
  `factures_date_limite` date DEFAULT NULL,
  `facturiers_idfacturiers` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

9 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
1 août 2018 à 23:44
Bonjour,

Le problème c'est que tu as masqué l'exception, elle s'affiche dans les logs donc il faudrait la lire, mais sans surprise tu auras une SQLException car tu as fait une requête avec un
?
sans faire de
set
donc ton paramètre n'a aucune valeur et ta requête est fausse, elle ne peut donc pas renvoyer de résultat.
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
2 août 2018 à 02:40
Bonjour KX merci pour la réponse.Voici ce que j'ai fais.J'ai besoin de votre aide.
@Override
public double totalJour(Facture facture) {

facture=null;
try {

String sql="SELECT SUM (factures_montants) AS facturetotale FROM factures WHERE factures_date_limite like ?";

PreparedStatement pst=conn.prepareStatement(sql);

pst.setString(1, "%" + facture + "%");

ResultSet rs=pst.executeQuery();

while (rs.next()) {
int id = Integer.parseInt(rs.getString("idfactures"));
String numerofact = rs.getString("factures_numero");
String montant = rs.getString("factures_montants");
Date datelim = rs.getDate("factures_date_limite");
int idPays = rs.getInt("facturiers_idfacturiers");
facture=new Facture(id, numerofact, montant,datelim,idPays);
}
}

}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
2 août 2018 à 12:53
Déjà ta requête
factures_date_limite like ?
est fausse.
factures_date_limite
est de type
date
, mais
like
ne s'utilise que sur des
varchar
, donc le like n'a rien à faire ici.
Dans ton code tu fais
pst.setString(1, "%" + facture + "%"); 
, or c'est une date que l'on attends, pas un String.
De plus
facture
n'est ni une date, ni un String, c'est ton objet Facture !
Il faudrait plutôt utiliser
facture.getFactures_date_limite()
qui lui renverra bien une date...

Autre problème sur ta requête, tu fais
SUM (factures_montants)
alors que
factures_montants
est
un varchar(45)
...
Si tu veux faire une somme il faut que ce soit sur des nombres, la somme de String n'existe pas.

Remarque : toutes ces erreurs indiquent que tu fais ton code Java avant d'avoir validé ta requête SQL à la main, ce qui est une perte de temps vu que tu codes pour rien une requête fausse !

PS : le nommage dans ton code Java est incorrect, il ne devrait pas y avoir de
_
dans les noms, ni pour les variables, ni pour les méthodes, qui devraient être en camelCase :
factures_date_limite
non,
facturesDateLimite
oui.
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
2 août 2018 à 15:52
Bonjour KX merci de votre aide.Voici ce que je viens de faire.Comment je fais pour retourner la somme?
@Override
public double totalJour(Facture facture) {
Date dateSelectionnee=facture.getFactureDateLimite();
facture=null;

try {

String sql="SELECT SUM (factureMontant) AS facturetotale FROM facture WHERE factureDateLimite='" + dateSelectionnee +"'";

PreparedStatement pst=conn.prepareStatement(sql);

//pst.setString(1, "%" + dateSelectionnee + "%");

ResultSet rs=pst.executeQuery();

while (rs.next()) {
int id = Integer.parseInt(rs.getString("idFacture"));
Long numerofact = rs.getLong("factureNumero");
double montant = rs.getDouble("factureMontant");
Date datelim = rs.getDate("factureDateLimite");

facture=new Facture(id, numerofact, montant, datelim);
}
} catch (NumberFormatException e) {

e.printStackTrace();
} catch (SQLException e) {

e.printStackTrace();
}
return 0;
}


public class Facture implements Serializable {
private int idFacture;
private Long factureNumero;
private double factureMontant;
private Date factureDateLimite;
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
3 août 2018 à 08:50
Pour faire ta somme il faut que tes montants soient des nombres, il va falloir changer ta structure de base de données car des varchar ne sont pas adaptés pour ce genre de données.

Remarque : factureDateLimite='" + dateSelectionnee +"' ne va pas fonctionner, car factureDateLimite est une date, pas un varchar et que de toute façon le toString de dateSelectionnee va te donner une valeur du genre "Fri Aug 03 08:50:31 CEST 2018" qui sera incompréhensible par la base de donnée.
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
3 août 2018 à 20:47
Bonjour KX.Voici la base de données.
CREATE TABLE `factures` (
`idfactures` INT NOT NULL AUTO_INCREMENT,
`factureNumero` BIGINT NOT NULL,
`factureMontant` DOUBLE NOT NULL,
` factureDateLimite` DATETIME NULL
}
Au fait les enregistrements sont déjà faits au préalable dans la base de données.Par exemple on aura ce format de date 2018-08-15 dans la table factures.J"afficherai la colonne factureDateLimite à l'utilisateur pour qu'il sélectionne la date qu'il souhaite.
Voici le code source.J'ai besoin de votre aide s'il vous plaît:
@Override
public double totalJour(Facture facture) {
Date dateSelectionnee=facture.getFactureDateLimite();
facture=null;

try {

String sql="SELECT SUM (factureMontant) AS facturetotale FROM facture WHERE factureDateLimite='" + dateSelectionnee +"'";

PreparedStatement pst=conn.prepareStatement(sql);

//pst.setString(1, "%" + dateSelectionnee + "%");

ResultSet rs=pst.executeQuery();

while (rs.next()) {
int id = Integer.parseInt(rs.getString("idFacture"));
Long numerofact = rs.getLong("factureNumero");
double montant = rs.getDouble("factureMontant");
Date datelim = rs.getDate("factureDateLimite");

facture=new Facture(id, numerofact, montant, datelim);
}
} catch (NumberFormatException e) {

e.printStackTrace();
} catch (SQLException e) {

e.printStackTrace();
}
return 0;
}


public class Facture implements Serializable {
private int idFacture;
private Long factureNumero;
private double factureMontant;
private Date factureDateLimite;
}
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
5 sept. 2018 à 08:12
Bonjour KX.Ma base de données comprend des enregistrements au format année-mois-jour heure-minute-seconde par exemple 2018-08-02 11:59:51.0.Je voudrais calculer la somme seulement entre des intervalles de mois.Lorsque l'utilisateur saisit par exemple 2017-02 et 2019-08 la somme entre ces deux intervalles devra être affichée.Ma requête ne passe pas.Veuillez me la regarder s'il vous plaît:
public double totalIntervalleMois(String mi, String mf) {
String sql = "SELECT SUM(montant) FROM operations WHERE date BETWEEN ? AND ?";
try (PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setString(1,mi);
pst.setString(2,mf);
try (ResultSet rs = pst.executeQuery()) {
if (!rs.next()) {
throw new IllegalStateException("Query returns no result: " + sql);
}
double sum = rs.getDouble(1);
if (rs.wasNull()) {
throw new IllegalStateException("Query returns NULL: " + sql);
}
return sum;
}
}
catch (Exception e) {
throw new IllegalStateException("totalJour fails: " + mi + " " + mf, e);
}
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 sept. 2018 à 18:04
Si la requête ne passe pas, j'imagine qu'il y a une exception, laquelle ?

Mais bon je pense que le problème c'est qu'il te faut des type DATETIME dans ta base de données, manipuler des pst.setTimestamp avec ton code Java, et donc convertir tes String au préalable...
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
6 sept. 2018 à 15:43
Bonjour KX.
Au fait si j'utilise Timestamp celà suppose que je veux entrer des données sous le format yyyy-mm-ss hh-mm-ss.J'ai déjà géré ça dans d'autres cas et ça a marché.
Ce que je veux faire ici:l'utilisateur entre les deux dates sous ce format yyyy-mm et on lui affiche la liste de toutes les opérations correspondantes entre les deux dates par exemple 2017-02 et 2018-09.
Bien sûr que le champ 'date' dans ma base de données est au format Timestamp: yyyy-mm-ss hh-mm-ss.Voici l'erreur KX et je la trouve normale puisque c'est les deux dates sont saisies dans ce format yyyy-mm:
GRAVE: "Servlet.service()" pour la servlet sn.mobilebanking.presentation.RechercherOperationDepotMontantEntrantIntervalleMoisControlleur a généré une exception
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
at java.sql.Timestamp.valueOf(Unknown Source)
at presentation.OperationIntervalleMoisControlleur.doPost(OperationIntervalleMoisControlleur.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)




////////////////////////////
C'est de ces deux lignes d'où survient l'erreur:
Timestamp date1=Timestamp.valueOf(request.getParameter("date_debut"));
Timestamp date2=Timestamp.valueOf(request.getParameter("date_fin"));
////////
<label>Saisissez les deux mois</label>
<input id=""
class="footer__email-input form-control form-control--muted"
name="date_debut" type="text" aria-describedby="footerEmail"
placeholder="Année-Mois1" >

<input id=""
class="footer__email-input form-control form-control--muted"
name="date_fin" type="text" aria-describedby="footerEmail"
placeholder="Année-Mois2" >






//////
public double totalIntervalleMois(Timestamp mois1, Timestamp mois2) {
String sql = "SELECT SUM(montant) FROM operations WHERE date BETWEEN ? AND ?";
try (PreparedStatement pst = conn.prepareStatement(sql)) {
pst.setTimestamp(1,mois1);
pst.setTimestamp(2,mois2);
try (ResultSet rs = pst.executeQuery()) {
if (!rs.next()) {
throw new IllegalStateException("Query returns no result: " + sql);
}
double sum = rs.getDouble(1);
if (rs.wasNull()) {
throw new IllegalStateException("Query returns NULL: " + sql);
}
return sum;
}
}
catch (Exception e) {
throw new IllegalStateException("totalJour fails: " + mois1 + " " + mois2, e);
}
}
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 sept. 2018 à 18:05
C'est ce que je disais, il faut convertir tes String au préalable.
Tu as le format
yyyy-mm-ss hh-mm-ss
il faut le convertir en
yyyy-mm-dd hh:mm:ss
pour le passer en Timestamp.
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
7 sept. 2018 à 02:27
Bonjour KX. Bien sûr c'est ce format yyyy-mm-dd hh:mm:ss que j'ai
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
7 sept. 2018 à 13:09
Affiches tes deux String request.getParameter("date_debut") et request.getParameter("date_fin") pour voir à quoi il ressemble et pourquoi le valueOf ne fonctionne pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
Modifié le 10 sept. 2018 à 23:23
Bonjour KX.L'affichage donne les données saisies:
Date de début:2017-07
Date de fin:2018-09

java.lang.IllegalStateException: totalJour fails: 2018-07 2018-09
 at sn.mobilebanking.dao.DaoOperationRetraitImpl.totalOperationRetraitParIntervalleMois(DaoOperationRetraitImpl.java:404)
 at sn.mobilebanking.service.ServiceOperationRetraitImpl.totalOperationRetraitParIntervalleMois(ServiceOperationRetraitImpl.java:68)
 at sn.mobilebanking.presentation.RechercherOperationRetraitMontantSortantIntervalleMoisControlleur.doPost(RechercherOperationRetraitMontantSortantIntervalleMoisControlleur.java:64)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
 at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
 at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Query returns NULL: SELECT SUM(montant_retrait) FROM operation_retrait WHERE operation_retraitdate like ? AND operation_retraitdate like ?
 at sn.mobilebanking.dao.DaoOperationRetraitImpl.totalOperationRetraitParIntervalleMois(DaoOperationRetraitImpl.java:398)

//Quelque soit la requête que j'utilise rien ne marche:
public double totalOperationRetraitParIntervalleMois(String moisDebut, String moisFin) {
  String sql = "SELECT SUM(montant_retrait) FROM operation_retrait WHERE operation_retraitdate like ? AND operation_retraitdate like ?";
     try (PreparedStatement pst = conn.prepareStatement(sql)) {
         pst.setString(1,moisDebut);
         pst.setString(2,moisFin);
   
         try (ResultSet rs = pst.executeQuery()) {
             if (!rs.next()) {
                 throw new IllegalStateException("Query returns no result: " + sql);
             }
             double sum = rs.getDouble(1);
             if (rs.wasNull()) {
                 throw new IllegalStateException("Query returns NULL: " + sql);
             }
             return sum;
         }
     }
     catch (Exception e) {
         throw new IllegalStateException("totalJour fails: "  + moisDebut + " " + moisFin, e);
     }
 }

//doPost
 double total=0;
  
  String date1=request.getParameter("date_debut");
  String date2=request.getParameter("date_fin");
  String action=request.getParameter("action");

 total=serv.totalOperationRetraitParIntervalleMois(date1, date2);


//Vue
  <label>Saisissez les deux mois</label>
                                     <input id=""
           class="footer__email-input form-control form-control--muted"
           name="date_debut" type="text" aria-describedby="footerEmail" 
           placeholder="Année-Mois1" >
     
           <input id=""
           class="footer__email-input form-control form-control--muted"
           name="date_fin" type="text" aria-describedby="footerEmail" 
           placeholder="Année-Mois2" >
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 sept. 2018 à 23:31
En SQL si tu fais un
like
il faut rajouter un wildcard, par exemple
like '2018-07-%'
mais si tu fais
like '2018-07'
ça ne trouvera jamais aucun résultat, or le
SUM
de rien c'est
NULL
, d'où ton erreur "Query returns NULL"

Mais l'erreur c'est encore et toujours ton format de dates, il faut davantage utiliser les types DATE, TIME, DATETIME ou TIMESTAMP du langage, car tout ne se règle pas avec des VARCHAR...
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
Modifié le 22 nov. 2018 à 08:35
Bonjour KX.J'ai besoin de votre aide s'il vous plaît.Je dois insérrer dans la database des employés avec leurs supérieurs hiérarchiques.Le problème c'est que c'est l'insertion du nom seulement qui passe, la colonne CODE_EMPLOYE_SUP reste à null.Je pense que c'est sûrement au niveau du contrôleur le problème.
@Entity
@Table(name="EMPLOYE")
public class Employe implements Serializable{
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 @Column(name="CODE_EMPLOYE")
 private Long codeEmploye;
 private String nomEmploye;
 @ManyToOne
 @JoinColumn(name="CODE_EMPLOYE_SUP")
 private Employe employeSup;
public Employe(String nomEmploye,  Employe employeSup) {
  super();
  this.nomEmploye = nomEmploye;
  this.employeSup = employeSup;
 }
public Employe(String nomEmploye) {
  super();
  this.nomEmploye = nomEmploye;
 }

}

//register.jsp
 <div class="form-group">
                  <label for="exampleInputPassword1">Nom complet</label>
                  <input type="text" class="form-control" name="nom"  id="exampleInputPassword1" placeholder="Nom de l'employe" required="required">
                </div>
                <div class="form-group">
       <label for="exampleInputPassword1">Superieur hierarchique</label>
       <select
           class="form-control" name="employeSup">
               <c:forEach var="emp" items="${listeEmployes}">
               <option value="${emp.codeEmploye}">${emp.codeEmploye }- ${emp.nomEmploye}</option>
               </c:forEach>
          </select>
      </div>

//Controleur
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String nom = request.getParameter("nom");
        String codeEmplSup=request.getParameter("employeSup");
        Employe employeSuperieur=new Employe(codeEmplSup);
        employeSuperieur.setCodeEmploye(Long.parseLong(codeEmplSup));
        
        Employe employe=new Employe();
        employe.setEmployeSup(employeSuperieur);
       
        DaoImpl d=new DaoImpl();
  
  //Appel au constructeur
      Employe e=new Employe(nom);

        d.addEmploye(e, employe.getCodeEmploye());
       
  RequestDispatcher rs = request.getRequestDispatcher("register.jsp");
  rs.forward(request, response);
 }

//Dao
public Employe addEmploye(Employe e, Long codeSup) {
  
  try {
      entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
      entityManager=entityManagerFactory.createEntityManager();
      entityTransaction=entityManager.getTransaction();
      entityTransaction.begin();  
  
 
      if (codeSup !=null) {
      Employe sup=entityManager.find(Employe.class, codeSup);
      e.setEmployeSup(sup); 
   }
   entityManager.persist(e);
   entityTransaction.commit(); 

  } catch (Exception e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
 return e;
       
       
 }
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 nov. 2018 à 08:43
Bonjour,

Tu devrais faire du debug pas à pas (ou relire ton code), tu verrais sûrement le problème...

"CODE_EMPLOYE_SUP reste à null", mais tu remplis la colonne quand ?

Tu as ce code :
    if (codeSup !=null) {
      Employe sup=entityManager.find(Employe.class, codeSup);
      e.setEmployeSup(sup); 
   }

Or que vaut
codeSup
?
C'est un paramètre de la méthode
addEmploye(Employe e, Long codeSup)
que tu appelles ici :
        Employe employe=new Employe();
        employe.setEmployeSup(employeSuperieur);
       
        DaoImpl d=new DaoImpl();
  
  //Appel au constructeur
      Employe e=new Employe(nom);

        d.addEmploye(e, employe.getCodeEmploye());

Quelle est la valeur de
employe.getCodeEmploye()
alors que tu n'as jamais fait de
setCodeEmploye
?
A priori je dirais que ça vaut
null
, donc tu ne rentres jamais dans le
if
et tu ne fais pas le
setEmployeSup
...
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
29 nov. 2018 à 00:08
Bonjour KX.Merci beaucoup pour la réponse.Je l'ai corrigé en faisant comme vous l'avez dit.Je suis en train de gérer l'authentification et le problème vient de la ligne getSingleResult.J'ai fais de recherches en vain mais pas de solution.J'ai besoin encore de votre aide s'il vous plaît.
public String authentification(Employe e) {
// Recuperation de Username et du password issus du bean
String username=e.getEmailEmploye();
String password=e.getNomEmploye();
String resultat="";


String userNameDB="";
String passwordDB="";
String roleDB="";

try {

entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
entityManager=entityManagerFactory.createEntityManager();

entityTransaction=entityManager.getTransaction();
entityTransaction.begin();//Ouverture de la transaction

String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1 AND e.password=:param2 AND e.roleEmploye=:param3";


TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

typedQuery.setParameter("param1",userNameDB);
typedQuery.setParameter("param2", passwordDB);
typedQuery.setParameter("param3",roleDB);

e=typedQuery.getSingleResult();


if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Admin")) {
return "Admin";
}

else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestion")) {
return "Gestion";

}
else
resultat="Paramètres de connexion incorrects !";

entityTransaction.commit();

entityManager.close();
entityManagerFactory.close();
} catch (NoResultException ex) {
System.out.println("Erreur de connexion");
ex.printStackTrace();
}
return resultat;


}



22:18:45,641 INFO [stdout] (default task-3) Erreur de connexion
22:18:45,648 ERROR [stderr] (default task-3) javax.persistence.NoResultException: No entity found for query
22:18:45,650 ERROR [stderr] (default task-3) at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:532)
22:18:45,651 ERROR [stderr] (default task-3) at sn.objis.livrablejpa.dao.DaoBanqueImpl.authentification(DaoBanqueImpl.java:894)
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
30 nov. 2018 à 15:28
Bonjour,

C'est une erreur "normale".

getSingleResult() est une requête "optimiste" qui part du principe qu'elle devrait toujours renvoyer 1 (et 1 seul) résultat et qui va renvoyer NoResultException si elle remonte 0 résultat ou NonUniqueResultException si il y a plus d'1 résultat.

Voir la documentation :
https://javaee.github.io/javaee-spec/javadocs/javax/persistence/Query.html#getSingleResult--

Si tu utilises getSingleResult, il faudrait donc gérer ces différentes exceptions, même si dans ton cas je simplifierai la requête, les conditions sur le mot de passe et le rôle sont en trop puisque de toute façon tu les contrôles déjà après.
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
30 nov. 2018 à 17:27
Merci KX.L'erreur demeure la même en faisant comme vous l'avez dit.
Et si je commente la ligne de getSingleResult j'aurai NullPointerException.

String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1";

TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

typedQuery.setParameter("param1",userNameDB);
//typedQuery.setParameter("param2", passwordDB);
//typedQuery.setParameter("param3",roleDB);

e=typedQuery.getSingleResult();


if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Employe_Role")) {
return "Employe_Role";
}

else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestionnaire_Role")) {
return "Gestionnairer_Role";

}
else
resultat="Vos paramètres de connexion sont incorrects !";

entityTransaction.commit();


entityManager.close();
entityManagerFactory.close();
} catch (Exception ex) {
System.out.println("Erreur de connexion");
ex.printStackTrace();
}
return resultat;
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
30 nov. 2018 à 18:01
Tu n'as toujours pas pris en compte les exceptions...

try {
    e = typedQuery.getSingleResult(); 
} catch (NoResultException ex) {
    return "NoResultEmploye: " + userNameDB;
} catch (NonUniqueResultException ex) {
    return "NonUniqueResultEmploye: " + userNameDB;
}
0
Streamooc Messages postés 79 Date d'inscription samedi 17 juin 2017 Statut Membre Dernière intervention 8 février 2023
30 nov. 2018 à 19:52
Bonjour merci KX.L'erreur ne s'affiche plus mais le problème c'est que sur ma vue index.jsp ceci s'affiche sur mon navigateur: NoResultEmploye:
En réalité ce qu'il fait c'est qu'il n'exécute pas les conditions après la ligne de e=typedQuery.getSingleResult();donc il ne va pas au niveau de la base de données pour effectuer la vérification.D'après votre correction,voici le code je suis sûr qu'il y a quelque part oû j'ai mal procédé.

public String authentification(Employe e) {
String username=e.getEmailEmploye();
String password=e.getNomEmploye();
String resultat="";


String userNameDB="";
String passwordDB="";
String roleDB="";
e=null;
try {

entityManagerFactory=Persistence.createEntityManagerFactory("livrablejpa");
entityManager=entityManagerFactory.createEntityManager();


entityTransaction=entityManager.getTransaction();
entityTransaction.begin();

//String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1 AND e.password=:param2 AND e.roleEmploye=:param3";

String jpql="SELECT e FROM Employe e WHERE e.emailEmploye=:param1";

TypedQuery<Employe> typedQuery=entityManager.createQuery(jpql,Employe.class);

typedQuery.setParameter("param1",userNameDB);
//typedQuery.setParameter("param2", passwordDB);
//typedQuery.setParameter("param3",roleDB);

try {

e=typedQuery.getSingleResult();
if(username.equals(username)&& password.equals(passwordDB)&& roleDB.equals("Employe_Role")) {
return "Employe_Role";
}

else if (username.equals(userNameDB)&& password.equals(passwordDB)&& roleDB.equals("Gestionnaire_Role")) {
return "Gestionnairer_Role";

}
else
resultat="Vos paramètres de connexion sont incorrects !";



entityTransaction.commit();


entityManager.close();
entityManagerFactory.close();

} catch (NoResultException ex) {
return "NoResultEmploye: " + userNameDB;
}
catch (NonUniqueResultException ex) {
return "NonUniqueResultEmploye: " + userNameDB;
}



}finally {

}

return resultat;


}

//Dans le contrôleur c'est le block else seul qui est exécuté
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String login=request.getParameter("username");
String motDePasse=request.getParameter("password");

DaoImpl d=new DaoImpl();

//Gestion des roles
Employe loginBean=new Employe();
loginBean.setEmailEmploye(login);
loginBean.setPassword(motDePasse);



String userValidate=d.authentification(loginBean);
if (userValidate.equals("Employe_Role")) {
System.out.println("Espace Employe");

HttpSession session=request.getSession();
session.setAttribute("Employe", login);
request.setAttribute("login", login);

request.getRequestDispatcher("menuEmploye.jsp").forward(request, response);

} else if (userValidate.equals("Gestionnaire_Role")){
System.out.println("Espace Gestionnaire");

HttpSession session=request.getSession();
session.setAttribute("Gestionnaire", login);
request.setAttribute("login",login);
request.getRequestDispatcher("menuGestionnaie.jsp").forward(request, response);

} else {
System.out.println("Error message = " + userValidate);
request.setAttribute("errMessage", userValidate);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}

}


<form action="/login" method="post">

<span style="color: red"><%=(request.getAttribute("errMessage")==null)? "": request.getAttribute("errMessage")%></span>
<div class="form-group has-feedback">
<input type="text" class="form-control" placeholder="Entrer votre e-mail" name="username">
<span class="glyphicon glyphicon-envelope form-control-feedback"></span>
</div>
<div class="form-group has-feedback">
<input type="password" class="form-control" placeholder="Mot de passe" name="password">
<span class="glyphicon glyphicon-lock form-control-feedback"></span>
</div>
<div class="row">
<!-- /.col -->
<div class="col-xs-4">
<button type="submit" class="btn btn-primary btn-block btn-flat">Valider</button>
</div>
<div class="col-xs-4">
<button type="reset" class="btn btn-default">Annuler</button>
</div>
<!-- /.col -->
</div>
</form>
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
30 nov. 2018 à 23:38
Le code renvoie
"NoResultEmploye: " + userNameDB
; donc s'il affiche uniquement
NoResultEmploye: 
c'est que userNameDB est vide... C'est pour ça que ta requête ne renvoie aucun résultat, il faut que tu recherches un utilisateur avec une adresse mail qui existe.
0