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 :

Contrôle de saisie de valeurs doublons de la clé primaire.


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de abdelghani_k
    Inscrit en
    Octobre 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Octobre 2002
    Messages : 184
    Points : 150
    Points
    150
    Par défaut Contrôle de saisie de valeurs doublons de la clé primaire.
    Bonjour à tout le monde,

    J'ai un fichier base de données au format paradox et qui possède une clé primaire (le fichier est Agent et sa clé est Matricule). J'utilise dans mon application delphi des composants DBEdit reliés via un datamodule (TTable, Tquery) à mon fichier paradox. Je veux contrôler la saisie de valeurs doublons sur la clé primaire à la sortie de DBEdit relié à la clé avant que le moteur de base de données m'affiche le message : 'violation de clé primaire'. J'ai essayé de le faire dans OnValidate de la clé et dans OnExit de DBedit (clé) et j'ai échoué.

    Aidez-moi à le faire SVP, et Merci d'avance.
    Réussir c'est faire le bon choix.

    Voici ma supper fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fonction ChercherSolution(User_id:login in www.developper.com):Vrai;

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Ce que je ferais dans ton cas:

    Dans l'évènement OnExit de ton TDBEdit, je ferais un LookUp sur la table (ou le query) pour vérifier la présence ou l'absence de ta clé primaire.

    Il faut utiliser un LookUp pour éviter de te déplacer dans ta table pendant la recherche.

    Regarde dans l'aide de Delphi la définition de la fonction Lookup, elle est assez bien documentée.

    @+Claudius.

  3. #3
    Membre actif

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 210
    Points
    210
    Par défaut
    Salut,
    Il exite de nombreuses solutions, par exemple:
    lors du post, si erreur on laisse tomber:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure datamodule.table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
     begin
    	Action := daAbort;
     end;
    Avant de rajouter, on vérifie dans la table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      with datamodule.table1 do begin
        Open;
        SetKey;
        FieldByName('Nom').AsString := sNom;
        if GotoKey then
          Exit;  // existe déjà
        Append...
    Plus à la hache, moins propre, à mon avis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      with datamodule.table1 do begin
        Open;
        Append;
        FieldByName('Nom').AsString := sNom;
        TRY
          Post;
        EXCEPT
          // éventuellement tester par onError si c'est la bonne erreur
          // en tout cas, on ne fait rien
          Close;
          Exit;
        END;
    A toi de voir...
    @+
    Fabrice

  4. #4
    Membre habitué Avatar de abdelghani_k
    Inscrit en
    Octobre 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Octobre 2002
    Messages : 184
    Points : 150
    Points
    150
    Par défaut
    Toujours le même Message avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with datamodule.table1 do begin 
        Open; 
        SetKey; 
        FieldByName('Nom').AsString := sNom; 
        if GotoKey then 
          Exit;  // existe déjà 
        Append...
    maintenant c'est au niveau de SetKey que le message s'afiche.

    je vous rappelle que j'utilise des dbedit mais apparement dans votre code
    sNom est un Edit ou String.
    Réussir c'est faire le bon choix.

    Voici ma supper fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fonction ChercherSolution(User_id:login in www.developper.com):Vrai;

  5. #5
    Membre habitué Avatar de abdelghani_k
    Inscrit en
    Octobre 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Octobre 2002
    Messages : 184
    Points : 150
    Points
    150
    Par défaut
    La recherche nous fait aboutir à notre objectif.
    (proverbe : Il ne faut jamais jeter le manche aprés la cognée).

    Voici la solution avec des dbcontrols (dbedit ou dbgrid)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    const
      eKeyViol = 9729;
     
    procedure TDataModule1.TbAgentsPostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      if (E is EDBEngineError) then
      if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
      begin
        MessageDlg('Ajout impossible : Valeur déjà saisi.', mtWarning, [mbOK], 0);
        Abort;
      end;
    end;
    Cette solution se trouve dans les démos de delphi et spécifiquement dans le projet dberrors.dpr (c:\Program Files\Borland\%Delphi%\Demos\Db\DbErrors).
    Réussir c'est faire le bon choix.

    Voici ma supper fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fonction ChercherSolution(User_id:login in www.developper.com):Vrai;

  6. #6
    Membre actif

    Profil pro
    Personnel
    Inscrit en
    Septembre 2003
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Personnel

    Informations forums :
    Inscription : Septembre 2003
    Messages : 142
    Points : 210
    Points
    210
    Par défaut
    Bravo, comme quoi, il y a toujours une solution...
    Pour ma part, je n'utilise jamais des DBEdit en saisie, uniquement en affichage, et non éditable.
    Avec la saisie avec des TEdit, je vérifie la saisie avant de l'envoyer vers la table, donc jamais de violation de clef...
    @+
    Fabrice

    PS: n'oublie pas le [résolu]...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/06/2011, 09h51
  2. contrôle de saisie menu déroulant
    Par shnouf dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/01/2006, 16h30
  3. contrôle de saisie
    Par oceane751 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  4. [debutant] contrôle de saisie et formulaire
    Par oceane751 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2005, 22h29
  5. Boite de saisie et valeur par défaut
    Par Tempotpo dans le forum Composants VCL
    Réponses: 12
    Dernier message: 25/07/2005, 14h18

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