IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Un key violation agacant


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut Un key violation agacant
    Bonsoir à tous,

    J'ai un certain nombre de tables paradox creer dynamiquement et aprés le processus de creation j'ouvre l'une d'entre elle pour inserer le 1er enregistrement et hop ! aprés le post j'obtiens un KEY VIOLATION !!
    pourtant la table est bel et bien vide (!!!!?????) . L'ennui c'est que cela ne se produit dans toutes les machines ? Sur ma machine je n'ai pas ce prob, chez certains oui chez d'autres non ......

    CONFIG :
    BDE 5.01
    TABLE : PARADOX

    Merci de m'eclairer
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Peux tu nous fournir la structure de la table où cela plante ainsi que le code d'insertion que tu utilises.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonjour,

    Les controles sont en DBEdit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DBNavigator1.BtnClick(nbInsert);
    DBNavigator1.BtnClick(nbPost);
    DM1.MyDb.ApplyUpdates([DM1.Article]);
    La strucrure de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    CREATE TABLE article (
       Num_Ligne INTEGER,
       Code_article CHAR(25),
       Code_famille CHAR(8),
       Code_UM INTEGER,
       Nom_Article CHAR(80),
       Pu_achat_HT CURRENCY,
       Pu_Vente_HT CURRENCY,
       Marge NUMBER,
       Stock_Min NUMBER,
       Stock_Max NUMBER,
       code_taxe SMALLINT,
       Type_Calcul SMALLINT,
       STOCK_GERE BOOLEAN,
       Stock_Initial NUMBER,
       Code_Cond INTEGER,
       Reference CHAR(30),
       Stock_actuel NUMBER,
       BLOQUE BOOLEAN,
       QTE_COLIS NUMBER,
       POID_BRUT NUMBER,
       POID_NET NUMBER,
       Code_depot CHAR(8),
       PAMP CURRENCY,
       Raz_stock NUMBER,
       Ecart NUMBER,
       Theorique NUMBER,
       Valid_raz_stock BOOLEAN,
       En_Cde_Four NUMBER,
       En_Cde_Client NUMBER,
       Date_fabrication DATE,
       Date_peremption DATE,
       Nb_Jour_Alerte SMALLINT,
       Date_Alerte DATE,
       Compose BOOLEAN,
       Valider BOOLEAN,
       Element BOOLEAN,
       Taux_Taxe NUMBER,
       Enable_Tarif BOOLEAN,
       Code_Marque INTEGER,
       IsMin BOOLEAN,
       IsMax BOOLEAN,
       Code_Four CHAR(8));
    Merci
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  4. #4
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    un oubli....pardon

    dans l'evenement OnNewRecord de la table j'insere l'identifiant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       ArticleNum_Ligne.Value:=GetLastItem('select max(num_ligne) as numero from article');
    Dans GetLastItem je récupere le dernier numéro et il me le renvoi incrémenter de +1 que j'affecte au champ num_ligne (clé primaire) ca marche pour toutes les tables.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    moi je ne vois pas de définition de la clé dans le CREATE de ta table

    PRIMARY KEY (Num_Ligne) ?

    à moins qu'il soit créé indépendamment ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    pardon ....non je n'ai pas remarquer ca dans le code que j'ai posté la clé primaire existe bien . Dans le module de donnée et dans la colonne Key l'etoile apparait pour le champ num_ligne d'ailleur à la création en dynamique le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //index primaire********
    Table.IndexDefs.Add('','Num_Ligne',[ixPrimary]);
     
    //indexes secondaire
    Table.IndexDefs.Add('CodeArticle','Code_Article',[ixCaseInsensitive]);
    Table.IndexDefs.Add('CodeFamille','CODE_FAMILLE',[ixCaseInsensitive]);
    Table.IndexDefs.Add('NomArticle','NOM_ARTICLE',[ixCaseInsensitive]);
    Table.CreateTable;
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  7. #7
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Bonsoir

    Problème d'index corrompus ?

  8. #8
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonsoir,

    Es-ce que ca peut se corrompre lorsque la table est vide est vide et nouvellement creer ?
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  9. #9
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    A priori non, mais pourquoi tu n'utilises pas un champ auto-incrémenté. Il me semble que num_ligne était géré par ton programme ?
    Le key violation peut venir du fait que tu affectes une valeur à ce champ qui existe déja.

  10. #10
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonsoir et merci,

    Et non justement, l'affectation est incrementer de + 1 qui donne une valeur qui n'existe pas dans la table. Et j'assure qu'avec cette fonction GetLastItem qui me récupere le dernier numero de la table fonctionne bien avec plus de trente tables que gère mon application ... enfin la méthode que j'utilise. Pour le champ de l'auto increment j'ai eu des problèmes avec et d'ailleurs cette table comme d'autres tables etaient en champs auto.

    Mais .....! curieusement un utilisateur m'a rapporter qu'il avait regler ce problème en purgeant la table. Dans l'application une fonction de purge est disponible dans laquelle j'utilise ce code pour purger la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    je fais un d'abord un NomDeTable.EmptyTable;
    et ensuite j'appelle la procedure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     procedure  PackTable(Alias,TableName: String);
      var 
        Props: CURProps; 
        hDb: hDBIDb;
        TableDesc: CRTblDesc;
        Table:TTable;
      begin
     
    Table:=TTable.Create(nil);
    Table.DatabaseName:=Alias;
    Table.SessionName:=DM1.Session1.SessionName;
    Table.TableName:=TableName;
    Table.Exclusive:=true;
    Table.Open;
        // Make sure the table is open exclusively so we can get the db handle... 
         if  not Table.Active  then 
           raise  EDatabaseError.Create('Table must be opened to pack'); 
         if  not Table.Exclusive  then 
     
          raise  EDatabaseError.Create('Table must be opened exclusively to pack');
     
        // Get the table properties to determine table type...
        Check(DbiGetCursorProps(Table.Handle, Props)); 
     
        // If the table is a Paradox table, you must call DbiDoRestructure... 
         if  Props.szTableType = szPARADOX  then begin 
          // Blank out the structure... 
          FillChar(TableDesc, sizeof(TableDesc), 0); 
          // Get the database handle from the table's cursor handle...
     
         Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb))); 
          // Put the table name in the table descriptor... 
          StrPCopy(TableDesc.szTblName, Table.TableName); 
          // Put the table type in the table descriptor... 
          StrPCopy(TableDesc.szTblType, Props.szTableType); 
          // Set the Pack option in the table descriptor to TRUE... 
          TableDesc.bPack := True;
          // Close the table so the restructure can complete...
          Table.Close; 
          // Call DbiDoRestructure... 
     
         Check(DbiDoRestructure(hDb, 1, @TableDesc,  nil ,  nil ,  nil , False)); 
         end 
         else 
          // If the table is a dBASE table, simply call DbiPackTable... 
           if  (Props.szTableType = szDBASE)  then
            Check(DbiPackTable(Table.DBHandle, Table.Handle,  nil , szDBASE, True)) 
           else 
            // Pack only works on PAradox or dBASE; nothing else... 
             raise  EDatabaseError.Create('Table must be either of Paradox or dBASE ' +
     
             'type to pack');
     
       Table.Close;
       FreeAndNil(Table);
    end ;
    Et alors je me demande si il faut utiliser cette fonction juste aprés la création de la table.... cela semble bête .
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  11. #11
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Est ce que tu n'as pas créé puis supprimmer un enregistrement avant ton erreur ?

  12. #12
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    le probleme c'est qu'a mon niveau je n'ai pas ce problème cela se passe chez un autre utilisateur. J'ai creer et supprimer le 1er enregistrement et j'ai pas eu ce probleme.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  13. #13
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    Il y a quelques temps j'avais eu ce problème sur une table paradox et j'avais dû supprimer mes index et les récréer. Mais bon...

    Sinon j'utilise pdxutil et ausside l'info à cette adresse

    http://www.trim.com.au/documents/Fix...mary%20Key.pdf

  14. #14
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    pour la doc merci beaucoup
    Il y a quelques temps j'avais eu ce problème sur une table paradox et j'avais dû supprimer mes index et les récréer. Mais bon...
    Je crois que le Pack Table fait la même chose c'est pour cela que l'utilisateur avait regler son probleme mais c'est toute de même curieux parce que la table vide mais bon....

    Concernant le pdxutil je l'ai déjà merci mais l'inconvénient est que les tables sont cryptés par un passe et le pdxutil lui demandera ce passe.

    J'ai omis de préciser dans mon post que les tables etaient cryptées et c'est peut-être a cause de ca ????..... Et cela je le regrette parce que ce cryptage est inutile parce qu'a l'epoque oû j'ai développer l'applic je ne savais pas que les passe de PDX sont lus. Et comme j'exactement 61 tables alors je ne dis pas le nettoyage que je dois faire dans la source pour supprimer les apples aux mot de passes ca me donne la migraine rien que d'y penser

    Merci quand même à tous.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

Discussions similaires

  1. Erreur sql duplicate key violates unique constaint
    Par valvalval dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/06/2008, 00h15
  2. Intercepter le message du pilote paradox (key violation)
    Par helmis dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/03/2008, 16h02
  3. Un key violation déroutant
    Par freud dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/01/2008, 23h18
  4. Message : "Key violation"
    Par Interruption13h dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/02/2007, 03h06
  5. [Error] Key violation
    Par Furlaz dans le forum C++Builder
    Réponses: 5
    Dernier message: 14/06/2006, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo