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 :

Violation de la clé dans une base de données Paradox 7


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    Novembre 2017
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2017
    Messages : 46
    Points : 26
    Points
    26
    Par défaut Violation de la clé dans une base de données Paradox 7
    Bonjour à tous !

    je suis en train d'étudier les bases de données avec Paradox. Tout se passe bien lors d'un enregistrement. Voici le code pour ajouter un enregistrement en SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //Ajouter une personne
    Query1.SQL.Clear; //Efface le constenu de la stringlist
    Query1.SQL.Add('INSERT into exemple (Nom, Prenom, Adresse, Telephone) values (:ParNom, :ParPrenom, :ParAdresse, :ParTelephone)'); //Insertion dans la table
    Query1.ParamByName('ParNom').AsString:=DBEdit1.Text; //Paramètres
    Query1.ParamByName('ParPrenom').AsString:=DBEdit2.Text;
    Query1.ParamByName('ParTelephone').AsString:=DBEdit3.Text;
    Query1.ParamByName('ParAdresse').AsString:=DBEdit4.Text;
    Query1.ExecSQL; //Execute les instruction SQL
    Le problème est que lorsque je clique sur le bouton "Précédent" ou "Suivant" Delphi me retourne une erreur de violation de clé. Le code pour le bouton "Précédent" est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table1.Prior; //Enregistremnt précédent
    . Ainsi tout juste après avoir saisi un nouvel enregistrement, si je clique sur l'un de ces boutons le message "Violation de la clé" s'affiche.

    Je commence tout juste l'étude des bases de données sous Delphi 7 et ne vois pas pourquoi cette erreur s'affiche. De même les doublons provoquent eux aussi une erreur. Est-ce quelqu'un aurait l'amabilité de me dire comment résoudre ce problème de violation de clé ?

    Merci d'avance,

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Je commence tout juste l'étude des bases de données sous Delphi 7, je suis en train d'étudier les bases de données avec Paradox.
    Mon avis, puisque vous en êtes au début, oubliez PARADOX et les composants BDE (obsolètes depuis le début des années 2000) passez directement à un SGBD relationnel plus évolué
    en gratuit vous avez par exemple SQLite (mono poste, aucune installation à faire), Firebird (multi-utilisateur, open source), PostGresSQL (je connais moins donc no-comment)
    Vous allez me rétorquer que vous n'avez pas les moyens de vous connecter à ce type de base avec votre D7, la solution est simple : rajoutez ZEOSDBO et vos programmes pourront accéder aux bases de données les plus courantes du marché (dont celle citées)

    Revenons à la question :
    Le code est parfaitement correct mais ensuite vous écrivez que vous vous déplacer dans un TTable du coup j'ai un problème de compréhension
    J'imagine que vous avez une sorte de Grille, remplie par un TTable avec une sorte de navigation associée (boutons ou TDBNavigator)

    Premier problème possible : avez vous rafraichi votre ensemble de données après avoir fait votre insertion ?
    Second : est-ce que toutes les colonnes de la table sont remplis, je pense en particulier aux colonnes composant les clés
    Pour répondre correctement il faudrait que nous ayons la structure de la table exemple.

    une image écran permettrait de mieux appréhendé ce que vous tentez de faire
    Conseil :
    Plutôt qu'un TTable pour vos affichages et navigation essayez avec un TQuery (Select * from exemple) et un TUpdateSQL (qui contiendra les SQL Insert,Update et Delete) associé (via la propriété UpdateObjects du TQuery).
    En bref passez du côté lumineux de la force du SQL vous avez déjà pas mal commencé !
    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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    Novembre 2017
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2017
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Bonjour SergioMaster et merci,

    Voici une image de ma table en Paradox Nom : TABLE.jpg
Affichages : 971
Taille : 58,0 Ko

    Vous me parler de Firebird par exemple. Peut-on le télécharger et est-ce compliqué ? Quant au fait de la violation de clé comme je l'ai dit, elle se produit après un enregistrement et au moment tout de suite après lorsque je clique sur le bouton "Précédent" ou "Suivant".

    Je vous remercie si vous pouvez me donner quelques précisions à ce sujet et vous souhaite une agréable journée.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par orca29 Voir le message
    Voici une image de ma table en Paradox
    Donc, la colonne Nom est votre clé primaire , c'est déjà une première erreur de conception de votre table puisque vous pourriez très bien avoir deux personnes avec le même nom de famille, voir même deux personnes avec les mêmes nom et prénom (des homonymes , j'en sais quelque chose puisque j'en ai au moins deux !).
    Les concepteurs de base de données vous indiquerons également qu'il est mieux d'avoir en clé primaire, un clé numérique auto-incrémentée

    Vous me parler de Firebird par exemple. Peut-on le télécharger et est-ce compliqué ?
    bien sûr qu'il est téléchargeable il y a des même des liens via le forum et un forum spécialement dédié.
    Compliqué ? à mon avis (mais je suis partial) guère plus que Paradox, le tout est surtout de maitriser le SQL et la création de tables (quelles colonnes, quelles restrictions etc..)
    vous aurez également besoin d'un version de ZEOSDBO (téléchargeable par exemple ici)
    et tant qu'à faire, allez jusqu'au bout et téléchargez une version de Delphi Tokyo Starter qui vous permettra pratiquement la même chose que D7 avec des plus !
    (voir les blogs de Gilles Vasseur https://www.developpez.net/forums/bl...r-se-procurer/)
    pour ZEOSDBO, j'ai commencé un tutoriel, je ne sais si je le terminerai un jour, mais il se trouve dans mon blog https://www.developpez.net/forums/bl...rgiomaster/r2/
    Quant au fait de la violation de clé comme je l'ai dit, elle se produit après un enregistrement et au moment tout de suite après lorsque je clique sur le bouton "Précédent" ou "Suivant".
    sans le code du programme (dfm+pas) ce n'est pas assez précis pour répondre à coup sûr cette erreur ne vient pas du code d'insertion puisque ces boutons "travaillent" sur un TTable, ce peut être un problème tout bête de clé en double ou de rafraichissement de la table. Il y a trop de pistes pour suivre la bonne
    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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    Novembre 2017
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2017
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Bonjour à tous !

    Merci SergioMaster pour vos explications. Cependant, j'ai abandonné Paradox pour me tourner vers Access. Comme je l'ai dit, je débute dans les bases de données et ai quelques difficultés avec.
    J'ai créé une table qui s'appelle "MaTable" et ai trois champs. Un champ NOM, un champ PRENOM et un champ VILLE. J'ai trois DBEdit et un DBGrid. J'emploie le contrôle ADOConnection, ADODataset, ADOQuery et ADOTable. Ce que je cherche à faire c'est une recherche en SQL sur le nom permettant ainsi d'afficher les deux autres champs et de les actualiser dans le DBGrid et les DBEdit.

    Est-ce que quelqu'un pourrait me donner un exemple de code ? Je tente de lancer une recherche à partir du nom à l'aide d'un InputBox mais je ne vois pas quel code employer afin que la recherche se fasse. Je remercie d'avance tous ceux qui pourront me donner de l'aide.

    Bonne journée à tous !

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par orca29 Voir le message
    Cependant, j'ai abandonné Paradox pour me tourner vers Access. Comme je l'ai dit, je débute dans les bases de données
    je ne suis pas objectif sur le sujet mais pour moi Access est guère mieux que Paradox
    contrôle ADOConnection, ADODataset, ADOQuery et ADOTable.
    et ADO, c'est loin d'être ma tasse de thé ! en essayant de vous faire rapidement un exemple j'ai été incapable de faire les choses comme je pourrais le faire avec Firedac ou ZEOSDBO !


    J'ai créé une table qui s'appelle "MaTable" et ai trois champs. Un champ NOM, un champ PRENOM et un champ VILLE.
    en gros quelque chose comme ça ?
    Nom : Capture.PNG
Affichages : 775
Taille : 12,8 Ko
    j'ai juste préféré utiliser un TEdit et un bouton pour lancer la recherche
    Voilà la requête que j'utiliserai :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT NOM,PRENOM,VILLE FROM TABLE WHERE NOM=:N
    ATTENTION, j'y ajoute de gros bémols car ce code peut ramener plusieurs enregistrements au lieu d'un seul
    obtenir qu'un seul enregistrement (le premier) passera par
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TOP 1 NOM,PRENOM,VILLE FROM TABLE WHERE NOM=:N ORDER BY NOM

    Une fois cette requête paramétrée établie (paramétrée car il y a le ":N" dans le texte) le reste est assez aisé

    Voici le code rapidement bâclé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Recherche en cliquant sur le bouton
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      With ADOQuery1 do
       begin
         Close;
         ADOQuery1.Parameters.ParamByName('N').asString:=Edit1.Text;
         Open;
       end;
    end;
    Mais, attention, dans ce scénario, il n'y a aucune liaison entre la grille (et donc la table) et la recherche

    En admettant que vous en vouliez un, tout d'abord la requête serait inutile et il faudrait plutôt utilisé
    s'il ne s'agit que d'une recherche sur le nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOTable1.Locate('NOM',Edit1.Text,[loPartialKey,loCaseInsensitive])
    pour une recherche nom+prénom (2 TEdit pour les critères)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ADOTable1.Locate('NOM;PRENOM',VarArrayOf([Edit1.Text,Edit2.Text])[loPartialKey,loCaseInsensitive])
    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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Sans emploi
    Inscrit en
    Novembre 2017
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2017
    Messages : 46
    Points : 26
    Points
    26
    Par défaut
    Merci SergioMaster

    En ce qui concerne ZEOSDBO vous avez dit avoir fait un tuto à ce sujet. Comment le consulter ? Expliquez-vous comment s'en servir et peut-on l'intégrer à Delphi 7 ?

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par orca29 Voir le message
    En ce qui concerne ZEOSDBO vous avez dit avoir fait un tuto à ce sujet. Comment le consulter ? Expliquez-vous comment s'en servir et peut-on l'intégrer à Delphi 7 ?
    Vous le trouverez dans mon blog , vous pouvez atteindre ce dernier en cliquant sur mon pseudo pour atteindre ma page personnelle mais en voici l'adresse
    https://www.developpez.net/forums/bl...dbo-brouillon/
    Pour répondre à la question intégration à Delphi 7 : oui, le chapitre sur l'installation est bouclé
    Pour la question comment s'en servir ? tous les chapitres ne sont pas bouclés, certains ayant même que le squelette J'ai commencé ce long travail il y a longtemps et entre temps les nouvelles versions de Delphi (et l'inclusion de Firedac) m'ont fait changer de composants.
    Mais, toute l'aide de Delphi 7 sur les composants BDE (TTable, TQuery,TUpdateSQL etc...) est applicable à ZEOSDBO .

    En ce qui concerne votre application, j'ai fait un tutoriel (n'impliquant pas de base de données mais avec à peu près les mêmes informations)
    mais avec la dernière version de Delphi (Tokyo Starter possible)
    https://serge-girard.developpez.com/...ndings/Part_3/

    AMHA, si vous voulez "apprendre" Delphi, sautez le pas utilisez directement la dernière version, D7 est super c'est vrai mais Delphi Tokyo , "c'est de la balle"
    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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/03/2013, 15h10
  2. key violation dans une base de donnée
    Par elecpic dans le forum Débuter
    Réponses: 1
    Dernier message: 15/11/2010, 08h30
  3. Image dans une base de données Paradox
    Par lohot dans le forum Bases de données
    Réponses: 1
    Dernier message: 22/12/2006, 00h56
  4. intégrer un fichier image dans une base de donnée?
    Par Lody dans le forum Requêtes
    Réponses: 9
    Dernier message: 16/03/2006, 19h08
  5. [Strategie][Java][XML] Import dans une base de données
    Par nad dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/09/2002, 11h12

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