Menu

Calcul de la somme d'une colonne

Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
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.
Afficher la suite 

Votre réponse

9 réponses

Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628
0
Merci
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.
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 > Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
Le mieux c'est serait de te relire toi même. Là ça relève de l'étourderie, l'erreur de copier-coller...

String date1=request.getParameter("factures_date_limite");
String date2=request.getParameter("factures_date_limite");

Tu appelles deux fois la même méthode avec le même paramètre, donc le résultat sera forcément le même.
Avec ce code, tu auras forcément date1 et date2 identiques...

Mais le vrai problème est dans ta vue :

<input id="chercherL"
           class="footer__email-input form-control form-control--muted"
           name="factures_date_limite" type="text" aria-describedby="footerEmail" 
           placeholder="date 1" >
<input id="chercherL"
           class="footer__email-input form-control form-control--muted"
           name="factures_date_limite" type="text" aria-describedby="footerEmail" 
           placeholder="date 2" > 

Tout est identique... il faut distinguer la date de début et la date de fin.
Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
Merci beaucoup KX j'ai suivi ces conseils et ça m'a aidé à résoudre ce problème.L'autre souci que j'ai c'est que je dois afficher un message d'erreur au cas où l'état de compte saisi n'existe pas.Dans le cas contraire je dois afficher la liste des comptes.Avec ce code lorsque l'état saisi n'existe pas il affiche bien le message d'erreur mais lorsque l'état saisi existe il affiche juste "état de compte" qui se trouve au niveau du traitement,il ne me charge pas les données attendues.J'ai besoin encore de votre aide s'il vous plaît
//Controleur
protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  String etaSaisi=request.getParameter("motCle");
  String action = request.getParameter("action");
  
  Client client=new Client();
  client.setClients_etat_compte(etaSaisi);
  
  ServiceClientImpl serv=new ServiceClientImpl();
    String etatValide=serv.verifierSituation(client);

    ClientModel model=new ClientModel();
  
    request.setAttribute("model", model);
   
    if (action != null) { 
     if (action.equals("Rechercher")) {
      if (etaSaisi.equals(etatValide)) {
       
       model.setMotCle(request.getParameter("motCle"));
        List<Client> clients=serv.researchCustomerByCountState(model.getMotCle());
       
       model.setClients(clients);
      request.getRequestDispatcher("client/rapportEtatCompte.jsp").forward(request, response);

      } else {
       request.setAttribute("erreurMessage", etatValide);
       request.getRequestDispatcher("client/errorCompte.jsp").forward(request, response);
       
      }
     
     }
    }
 }

////////////Traitement
public String verifierSituation(Client t) {
  String etatCompte=t.getClients_etat_compte();
  String etatDB="";
  
  try {
   String sql="SELECT clients_etat_compte FROM clients";
   Statement st=conn.createStatement();
   ResultSet rs=st.executeQuery(sql);
   while(rs.next()) {
    etatDB=rs.getString("clients_etat_compte");
    if (etatCompte.equals(etatDB)){
     return "état de compte";
    }     
   }
   
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return "Cet état de compte n'existe pas !!!!";
 }
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 > Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
"il ne me charge pas les données attendues"
Et quelles sont les données attendues ?
Si c'est juste une vérification le résultat que tu dois avoir c'est vrai ou faux.

Remarque : faire un SELECT qui récupère toutes les lignes de la table pour ensuite faire une boucle while qui va vérifier un à un si la valeur est égal à un paramètre, c'est monstrueusement inefficace !
Il faut que tu retravailles ta requêtes SQL avec un WHERE qui regardera directement la bonne ligne dans la base de données et remontera un seul résultat (s'il existe) ou aucun.
Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
Merci beaucoup KX j'ai finalement trouvé le moyen de le faire.Cette fois-ci le problème que j'ai c'est comment afficher un message d'erreur à l'utilisateur lorsqu'il clique sur le bouton "Rechercher" sans saisir une valeur dans le champ de recherche.Je ne sais pas comment procéder.J'ai besoin de votre aide s'il vous plaît.

//Vue
                                                                   <div class="form-group w-100 mr-2">
          <input id="chercherL"
           class="footer__email-input form-control form-control--muted"
           name="motCle" type="text" aria-describedby="footerEmail" 
           placeholder="Recherchez " value="${model.motCle }">
                                                        </div>



//Contrôleur
             String champSaisie=request.getParameter("motCle");
      String action = request.getParameter("action");
  
               request.setAttribute("champSaisie", champSaisie);
  if (action != null) { 
   if (action.equals("Rechercher")) {
    
      if (champSaisie !=null) {
     
        request.getRequestDispatcher("solde/rapportSolde.jsp").forward(request, response);

   } else {
    request.getRequestDispatcher("solde/error.jsp").forward(request, response);

   } 
   }
  }
Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
-
Bonjour KX.J'ai finalement corrigé ce problème avec les exemples précédents.Merci beaucoup pour votre aide.Toutefois j'ai quelques soucis toujours avec les calculs sur plusieurs colonnes dont je vous ferai part bientôt.
Commenter la réponse de KX
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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);
}
}
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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...
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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);
}
}
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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.
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
Bonjour KX. Bien sûr c'est ce format yyyy-mm-dd hh:mm:ss que j'ai
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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.
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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" >
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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...
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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;
       
       
 }
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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
...
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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)
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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.
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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;
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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;
}
Commenter la réponse de Streamooc
Messages postés
69
Date d'inscription
samedi 17 juin 2017
Dernière intervention
4 janvier 2019
0
Merci
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>
KX
Messages postés
15918
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
20 janvier 2019
3628 -
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.
Commenter la réponse de Streamooc