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 :

Rechercher l'existance de la valeur avant de sauvgarder pr Eviter la Violation de clé


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Par défaut Rechercher l'existance de la valeur avant de sauvgarder pr Eviter la Violation de clé
    Bonjour à tous,
    après avoir fait des recherches sur le forum et lu attentivement quelques sujets dont:
    try except qu'on m'explique
    http://developpez.net/forums/showthr...iolation+cl%E9
    remplacer les messages d'erreurs
    http://developpez.net/forums/showthr...iolation+cl%E9
    [Résolu] Contrôle de saisie de valeurs doublons de la clé primaire.
    http://developpez.net/forums/showthr...iolation+cl%E9
    Je ne trouve toujours pas de solution à mon problème que voici :

    J'ai une table "Chercheur" de type Paradox7, et je saisis les valeurs dans des DBEdit.
    Ce que je souhaite faire, est, en cliquant sur un bouton "Enregistrer", le programme va tester la valeur du champ Code Chercheur avant d'enregistrer, si la valeur saisie existe déjà, alors je renvoie un message d'erreur (afin de ne pas agresser l'utilisateur avec le message de violation de clé), sinon, j'enregistre.
    Voici le code que j'ai fait :
    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
    procedure TF02_Chercheur.Button4Click(Sender: TObject);
    Var x1:integer;
    begin
     
      x1:=Chercheur_Table.FieldValues[('Code_Ch')];
     
      Chercheur_Table.First;
     
      While(Not Chercheur_Table.Eof) and (Chercheur_Table.FieldValues[('Code_Ch')] <> x1)
            do  //showmessage1
                 Chercheur_Table.Next;
                 //showmessage2
     
      If (Chercheur_Table.Eof= false)
         then
          ShowMessage('Ce code existe déjà, Choisissez un autre SVP!')
         else
            Chercheur_Table.Post; //Enregistrer
            //showmessage3
    end;
    Le problème est qu'il m'affiche le message d'erreur 'Choisissez un autre SVP' sachant que j'ai saisi un nouveau code qui n'existe pas déjà, j'ai sûrement du me gourer quelque part, j'ai rajouté les //showmessage1, 2 et 3 pour voir ce que fait le programme en réalité afin de mieux repérer l'erreur, j'ai changé la dernière condition,... mais il me dit tjs que la clé existe. Il doit probablement comparer avec lui même!! que faire?

  2. #2
    Expert confirmé
    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 : 62
    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
    Par défaut
    Salut

    Citation Envoyé par Yearning
    Le problème est qu'il m'affiche le message d'erreur 'Choisissez un autre SVP' sachant que j'ai saisi un nouveau code qui n'existe pas déjà
    Ce comportement est normal. Au début de ta procédure lorsque tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Chercheur_Table.First;
    Tu te déplaces donc dans ta table, qui effectue implicitement un Post (puisque qu'elle est mode édition/insertion).

    Ce post étant effectué, il est naturel que tu retrouves la valeur que tu viens de poster.

    Utilise 2 DataSets différents: 1 pour effectuer tes saisies et 1 pour effectuer ta vérification (qu'il ne faudra oublier de rafraichir après chaque post).

    [edit] Pour ta vérif, privilégie l'utilisation de Locate ou FindKey au lieu de passer en revue 1 à 1 les enregistrements de ta table. [/edit]

    @+ Claudius

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Par défaut
    votre méthode n'est pas optimisé il existe une autre méthode plus éficasse la voici :
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if Table1.FindKey([edit1.text]) then
    Begin
    ShowMessage('cet article existe déja);
    end
    Else
    Begin
    IF MessageDLG('cette article n'existe pas voulez vous le crée maintenant',MtConfirmation,[mbYes,MbNo],0) =Mr yes then
    Begin
    Table1.edit;
    end;
    end;

  4. #4
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    @ Yearning je met un TQuery dans ma fiche que je nome CodeExist et dans la proprété SQL je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Count(Code_Ch) AS Nombre FROM MaTable
     WHERE (Code_Ch = :NewCode)
    et dans l'Evenement Chercheur_Table BeforePost

    tu met ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if Chercheur_Table.State = DsInsert Then // je m'assure que c'est un nouvel enregistrement
    Begin
     CodeExist .Close;  
     CodeExist .ParamByName('NewCode').Value :=    Chercheur_Table.FiledByName('Code_Ch').Value;
    CodeExist .Open;
    if CodeExist.FiledByName('Nombre').Value <> 0 Then 
     begin
      ShowMessage('Votre Message');
      Abort;  // j'Abandonne l'opération d'enregistrement
     end;
    end;

    je te rajoute en second solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Const  eKeyViol = 9729;
    ...
    ..
    procedure TDataMod.Chercheur_TablePostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    begin
      if (E is EDBEngineError) then
        if (E as EDBEngineError).Errors[0].Errorcode = eKeyViol then
        begin
          MessageDlg('Votre Message', mtWarning, [mbOK], 0);
          Abort;
        end;
     end;

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Par défaut
    Ce n'est peut être pas la meilleure solution mais j'ai fait plusieurs tests et ça m'a donnée les résultats que je voulais, alors je vais vous copie un bout du code, ça peut tjs servir ^^ :
    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
    Const  val=-1; //je pouvais n'importe quelle valeur que l'utilisateur n'aurait pas saisi (négative sûrement)
    Var x1:integer;
    begin
     
     if Chercheur_Table.FieldByName('Code_Ch').IsNull
        then Showmessage('Veuillez remplir le champ ''Code Chercheur'' SVP')
     else
      BEGIN
     
      if Chercheur_Table.FieldValues[('Code_Ch')]=val
        then Showmessage('-1 est une valeur incorrecte, saisissez une autre SVP!') //j'aurai évité de faire ça si je savais comment supprimer un champ d'un enregistrement, vue qu'il y a un test avant le begin
     
        else
        BegiN
          x1:=Chercheur_Table.FieldValues[('Code_Ch')];
          Chercheur_Table.Edit;
          Chercheur_Table.FieldValues[('Code_Ch')]:=val; //le but est de remplacer le code que l'utilisateur a saisi par -1 par exemple, afin qu'il ne me dise pas "code déjà saisi" vue qu'à un moment il va comparer avec lui même
     
          if Chercheur_Table.FindKey([x1])
             then
                begin
                ShowMessage('Ce code existe déjà, Choisissez un autre SVP!');
                Chercheur_Table.FindKey([val]); //afin de m'afficher l'enregistrement que j'vais modifier
                //là j'aurai aimé faire : Chercheur_Table --> supprimer le champ Code_Ch et laisser les autres bien sûr (Nom, Prénom, Date Naiss...) alors si qqn connait comment faire... !
                end
             else
                begin
                Chercheur_Table.FindKey([val]);
                Chercheur_Table.Edit;
                Chercheur_Table.FieldValues[('Code_Ch')]:=x1; // le code saisi au tout début était sauvegardé dans la variable x1
                Chercheur_Table.Post; //Et c'est enregistré ^^
                end;
        EnD;
      END;
    end;
    @ ProgD : Effectivement! Merci...
    @ aityahia : la deuxième solution je l'avais déjà vu ici http://developpez.net/forums/showthr...iolation+cl%E9
    elle parait fastoche mais je n'ai pas su l'utiliser, ni où la mettre et quoi remplacer

  6. #6
    Membre Expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Par défaut
    votre methode est un peut tiré par les cheveux, si les deux solutions que je vous propose ne vous aide pas ,je ne vois pas d'autres solutions moin complexe

    le procédure Abort abandonne le post de l'enregistrement et tu peut faire un Clear sur ton champ code sans effacé les autres champs.

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

Discussions similaires

  1. [XL-2010] Peut-on éviter une erreur d'éxécution si la valeur recherchée n'existe pas?
    Par gilou41 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/02/2015, 17h51
  2. [vb.net][combobox] récupérer la valeur avant changement
    Par graphicsxp dans le forum Windows Forms
    Réponses: 36
    Dernier message: 19/10/2005, 10h59
  3. [VB.NET] Evaluer une valeur avant de l'assigner
    Par viva-emptiness dans le forum ASP.NET
    Réponses: 5
    Dernier message: 11/06/2005, 20h12
  4. Test d'existence d'une valeur dans une table
    Par dleu dans le forum Bases de données
    Réponses: 9
    Dernier message: 29/12/2004, 10h38
  5. [Registre] existence de clé/valeur registre
    Par Heliopraetor dans le forum Windows
    Réponses: 2
    Dernier message: 13/07/2004, 11h05

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