cs_redbar
Messages postés113Date d'inscriptionmardi 26 janvier 2010StatutMembreDernière intervention26 mai 2014
-
7 nov. 2011 à 18:54
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 2012
-
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
A voir également:
La valeur d'une clé dupliquée rompt la contrainte unique
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 8 nov. 2011 à 06:37
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) ...
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 7 nov. 2011 à 19:41
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...
cs_redbar
Messages postés113Date d'inscriptionmardi 26 janvier 2010StatutMembreDernière intervention26 mai 2014 7 nov. 2011 à 20:07
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.
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 8 nov. 2011 à 07:18
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_redbar
Messages postés113Date d'inscriptionmardi 26 janvier 2010StatutMembreDernière intervention26 mai 2014 8 nov. 2011 à 13:07
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
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 8 nov. 2011 à 13:19
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)
cs_GodConan
Messages postés2113Date d'inscriptionsamedi 8 novembre 2003StatutContributeurDernière intervention 6 octobre 201212 8 nov. 2011 à 15:14
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)
cs_redbar
Messages postés113Date d'inscriptionmardi 26 janvier 2010StatutMembreDernière intervention26 mai 2014 8 nov. 2011 à 16:26
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.