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

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Points : 39
    Points
    39
    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 é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

    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 régulier
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Points : 115
    Points
    115
    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 : 48
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    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
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Points : 39
    Points
    39
    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 : 48
    Localisation : Algérie

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    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.

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Points : 39
    Points
    39
    Par défaut
    @ aityahia
    Bonjour, ce n'est pas qu'elle ne m'aide pas, mais comme je vous l'ai dit
    Citation Envoyé par Yearning
    elle parait fastoche mais je n'ai pas su l'utiliser, ni où la mettre et quoi remplacer
    faut savoir que je ne suis pas une experte en Delphi :-S donc je me contente d'une première solution en attendant que j'en trouve une meilleure. Je ne demande qu'à apprendre...
    et cette solution n'est pas aussi complexe que ça, il n'y a qu'à suivre le raisonnement, avec les commentaires pour expliquer

    voilà les messages que j'ai eu pour la solution dont on parlait, si tu peux me dire quoi faire ça m'aiderait d'avantage
    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
    [Erreur] Chercheur_U.pas(139): ';' attendu(e) mais '.' trouvé(e)
    [Erreur] Chercheur_U.pas(140): ';' attendu(e) mais ')' trouvé(e)
    [Erreur] Chercheur_U.pas(142): Identificateur non déclaré : 'E'
    [Erreur] Chercheur_U.pas(142): Opérateur non applicable à ce type d'opérande
    [Erreur] Chercheur_U.pas(143): Opérateur non applicable à ce type d'opérande
    [Erreur] Chercheur_U.pas(150): ';' attendu(e) mais '.' trouvé(e)
    [Erreur] Chercheur_U.pas(155): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(162): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(167): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(172): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(186): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(192): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(208): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(224): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(241): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(246): Identificateur redéclaré : 'TF02_Chercheur'
    [Erreur] Chercheur_U.pas(251): ';' attendu(e) mais '.' trouvé(e)
    [Erreur] Chercheur_U.pas(253): Déclaration attendu(e) mais fin de fichier trouvé(e)
    [Erreur] Chercheur_U.pas(73): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button1Click'
    [Erreur] Chercheur_U.pas(74): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button5Click'
    [Erreur] Chercheur_U.pas(75): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button2Click'
    [Erreur] Chercheur_U.pas(76): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button3Click'
    [Erreur] Chercheur_U.pas(77): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Label25Click'
    [Erreur] Chercheur_U.pas(78): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button9Click'
    [Erreur] Chercheur_U.pas(79): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button6Click'
    [Erreur] Chercheur_U.pas(80): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button7Click'
    [Erreur] Chercheur_U.pas(81): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button8Click'
    [Erreur] Chercheur_U.pas(82): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button11Click'
    [Erreur] Chercheur_U.pas(83): Déclaration forward ou external non satisfaite : 'TF02_Chercheur.Button10Click'
    [Erreur fatale] Minap.dpr(35): Ne peut compiler l'unité utilisée 'Unites\Chercheur\Nouveau_Chercheur\Chercheur_U.pas'

  8. #8
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 202
    Points : 108
    Points
    108
    Par défaut
    la logique ce présente comme ceci:
    Avant de poster :
    Recherche l'information par locate
    s'il trouve alors message d'erreur ou tu passe a l'enreg suivant
    sinon enregistre

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 51
    Points : 39
    Points
    39
    Par défaut
    ça je l'avais déjà compris, vue que c le but
    ce que je n'ai pas compris c le datamodule qui était dans le nom de la procedure, et le reste

    @aityahya
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TDataMod.Chercheur_TablePostError(DataSet: TDataSet;
      E: EDatabaseError; var Action: TDataAction);
    Où est ce que je mets cette procedure?
    en la copiant telle qu'elle est ça ne marche pas, il n'y a qu'à voir les messages d'erreurs qu'on m'affiche, alors c'est quoi ce DataMod? ou Datamodule peut être, et à quoi ça sert?
    merci

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Le TDataModule se trouve dans le menu fichier-> nouveau.
    Certains l'utilisent pour poser leurs composants.

    TablePostError, c'est l'evenement onPostError du composant Table. (onglet evenements dans l'inspecteur d'objets)


    @+

+ 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