Probleme d'insertion dans la base de donnée [Résolu]

cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 7 nov. 2011 à 18:54 - Dernière réponse : cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention
- 8 nov. 2011 à 18:55
Bonjour à tous

J'ai besoin d'aide je cale sur un probleme.
En fait, j'ai une table facture dans laquelle j'insere des données. quand la table est vide et que je commence à inserrer des données il n'y a pas de problème. Mais il arrive à un moment de l'execution une erreur que je ne n'arrive pas à comprendre.
Dont voici:

org.postgresql.util.PSQLException: ERREUR: la valeur d'une clé dupliquée rompt la contrainte unique « facture_pkey »
  Détail : La clé « (id_fact)=(18) » existe déjà.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:353)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:299)
at mti.SelectionBD.insertionFacture(SelectionBD.java:448)
at mti.Vente.(Vente.java:91)
at mti.RechercheClient$3.actionPerformed(RechercheClient.java:181)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.Dialog$1.run(Unknown Source)
at java.awt.Dialog$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at java.awt.Dialog.setVisible(Unknown Source)
at mti.RechercheClient.(RechercheClient.java:55)
at mti.MenuPrincipal$19.actionPerformed(MenuPrincipal.java:430)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)


Quand je regarde le code qui lève cette exception je ne comprend pas où ça ne marche pas .
Voici le code de l'insertion:

public void insertionFacture(String dateFacture, int numClient){

try{
String requete ="INSERT INTO facture(id_fact,datfact,id_client)VALUES('"+(afficherNumeroFactureCourante()+1)+"','"+dateFacture+"','"+numClient+"')";
Statement state = Maconnexion.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
resInsFacture = state.executeUpdate(requete);
state.close();
}catch(SQLException er){
er.printStackTrace();
JOptionPane.showMessageDialog(null, er.getMessage(), getTitle(), JOptionPane.ERROR_MESSAGE);
}
}


j'explique comment marche cette partie du code. Mais bien avant je rappelle que j'utilise postgresql comme moteur de base de données.

Avant d’insérer une nouvelle facture dans la table, j'ai écris un code qui va récupérer le numéro de la dernière facture insérée.
A ce numéro j'ajoute 1 pour en faire le numéro de la nouvelle facture.
c'est à dire si bien avant la base contenait 10 factures insérées, je récupère ce 10 et je fais 10+1 = 11 et c'est le 11 qui devient le numéro de la nouvelle facture.

Mais après un certain nombre de fois d’exécution du programme au lieu que ce code qui me permet de recuperer le numéro de la dernière facture ne marche plus bien car il ne renvoie plus le numéro de la dernière facture;
voici le code de recupération du numéro de la dernière facture;

public int afficherNumeroFactureCourante(){
int numFac = 0;
try{
Statement stat = Maconnexion.getInstance().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet resultat = stat.executeQuery("SELECT * FROM facture");
resultat.last();
numFac = resultat.getRow();

stat.close();
resultat.close();
}catch(SQLException er){
er.printStackTrace();
}
return numFac;
}


Voici la structure de la table facture de ma base de données;

CREATE TABLE facture
(
  id_fact integer NOT NULL,
  datfact date NOT NULL,
  netapayer integer NOT NULL DEFAULT 0,
  id_client integer,
  restapayer integer DEFAULT 0,
  remise integer DEFAULT 0,
  montantpayer integer DEFAULT 0,
  montant_total integer DEFAULT 0,
  CONSTRAINT facture_pkey PRIMARY KEY (id_fact),
  CONSTRAINT facture_id_client_fkey FOREIGN KEY (id_client)
      REFERENCES client (id_client) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=TRUE
);
ALTER TABLE facture OWNER TO postgres;
COMMENT ON TABLE facture IS 'Table contenant la liste des factures';


Merci pour votre aide
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 8 nov. 2011 à 06:37
3
Merci
sinon si ton id est numérique n as tu pas avec postgress une fonction du style max(champ) pour obtenir ton id le plus grand? dans une requete qui resemblerait à "select max( id_fact ) from client;" ???
avec ca tu serai sur d avoir le plus grand ;o) ... quand à stocker es id dispo si ton prog est le seul qui puisse inserrer des données dans cette table ;o) tu as tout plein de moyen en java ;o) de le faire ;o) ...

GodConan ;o)

Merci cs_GodConan 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_GodConan
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 7 nov. 2011 à 19:41
0
Merci
salut ;o)

Et bien !! pour moi le message semble clair!! tu essais de rentrer un enregistrement qui existe déjà ... cela ne semble pas etre une erreur de prog .. mais juste de la pertinence de tes données en entré... c est le connector qui te géte car tu as déjà une clé primaire
il semble donc que afficherNumeroFactureCourante() ne te renvoi pas le bon numéro,
es tu vraiment obligé de faire ta requete select pour obtenir le derniere enregistrement de facture? --> tu pourrais stoquer l id au niveau du programe

es tu sur que le dernier id_fact corespond au nombre d enregistrement?
-->plutot que de faire un getrow pour obtenir un nombre de ligne, tu pourrai lire le id_fact du dernier enregistrement, si tu es sur que la derniere clé est la plus grande avec un incrément tu est sur de ne pas faire de doublon...

;o) pour l instant je ne vois que ca ;o) ...


GL



GodConan ;o)
Commenter la réponse de cs_GodConan
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 7 nov. 2011 à 20:07
0
Merci
Salut GodConan

Au départ je lisait le dernier "id_fact" mais la même exception revenait à chaque fois donc je me suis dis- il faut que j'essaie avec "getRow()" et encore ça m'a donné la même erreur.

Mais comment stocker l'id au niveau du programme?
Puisque quand j'observe selon moi et pour ce que je sais pour le moment (car je débute en java)c'est la façon la plus simple de pouvoir avoir le nombre exacte du des enregistrements.
Aussi je serai très heureux savoir comment procéder autrement afin d’éviter ce genre de problème maintenant et à l'avenir.

Merci
Commenter la réponse de cs_redbar
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 8 nov. 2011 à 07:18
0
Merci
pour affiner ton probleme : fait aussi des system.out de tes requetes (tu les enlevera apres) cela te permet de verifier que c est bien un prob de doublon et tu comprendra peut etre aussi pourquoi ... c est toujour interressant de tracer un prg ;o) tu as aussi le mode debug ;o) sous eclipse ou netbean ;o) il est asser bien géré ;o) et cela te permet de voir l etat de tout ton prg à chaque commande ...

GodConan ;o)
Commenter la réponse de cs_GodConan
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 8 nov. 2011 à 13:07
0
Merci
bonjour
Je viens d'essayer la requête suivante "SELECT max(id_fact) as nbMax FROM facture" et ça marche. mais le même problème se pose sur une autre table. En me servant de cette solution je vais résoudre le problème.
Merci et a plus
Commenter la réponse de cs_redbar
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 8 nov. 2011 à 13:19
0
Merci
je pense que le soucis ;o) c est que les table ne sont pas trié ;o) sur ta requete select du coup le dernier enreg n est pas forcement la plus grde clé primaire ;o)

GodConan ;o)
Commenter la réponse de cs_GodConan
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 8 nov. 2011 à 14:43
0
Merci
Mais dans ce cas comment procéder pour trier mes tables. Cela m'aidera beaucoup à l'avenir
Commenter la réponse de cs_redbar
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 8 nov. 2011 à 15:14
0
Merci
je ne suis pas un pro du SQL ;o) mais ca doit etre faisable en SQL ;o) (et ca fait plusieurs années que je n ai pratiqué, désolé) chaque SGBDR a ses particularité ;o)

GodConan ;o)
Commenter la réponse de cs_GodConan
cs_redbar 114 Messages postés mardi 26 janvier 2010Date d'inscription 26 mai 2014 Dernière intervention - 8 nov. 2011 à 16:26
0
Merci
Je pense à une procédure stockées. Pense tu que cela pourrait faire mon affaire aussi?
Sinon je viens de résoudre le problème des autres tables qui avait le même problème.
Commenter la réponse de cs_redbar
cs_GodConan 2116 Messages postés samedi 8 novembre 2003Date d'inscriptionContributeurStatut 6 octobre 2012 Dernière intervention - 8 nov. 2011 à 18:55
0
Merci
Salut

Non, je ne pense pas ;o) ...
java + SQL ;o) c est bien asser ;o) à maintenir ;o)

GodConan ;o)
Commenter la réponse de cs_GodConan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.