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 :

Gestion des exceptions


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut Gestion des exceptions
    Bonjours
    j'ai un petit problème à gérer des exceptions dans mon petit programme.
    je doit saisir des données dans une table.
    les exception que je veut gérer sont les erreurs de saisie (champs vide "non saisie") et les erreur de la base de donnée (classe EDBEngineError).

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    slt,
    Citation Envoyé par k_boy Voir le message
    les exceptions que je veux gérer sont les erreurs de saisie (champs vide "non saisie")
    à gérer soit dans l'évenement onValidate du champ, soit dans le BeforePost de la table

    Citation Envoyé par k_boy Voir le message
    les erreurs de la base de données (classe EDBEngineError).
    un petit exemple (sans prétention)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
     table1.post
    except
      on e:Exception do     // toutes exceptions
        begin
          MessageDlg ('Erreur'+#10#13+E.message,mterror,[mb0k],0);
          Table1.Abort; // ou Cancel cela dépend de ce que tu veux faire
        end;
    end;
    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
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut violation de clé
    slt
    j'ai le méme pobléme que "k_boy ".
    moi je veut faire une saisi ,et si il y'a violation de clé je met un message
    (vous devez changer de numéro "par exaple")
    un ami ma envoyé un bloc d'intruction avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    'try........'
       ..
       ..
       ..
    except
    mais je l'ai perdu
    merci si vous pouvez m'aidé
    merci bcp

  4. #4
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par k_boy Voir le message
    Bonjours
    j'ai un petit problème à gérer des exceptions dans mon petit programme.
    je doit saisir des données dans une table.
    les exception que je veut gérer sont les erreurs de saisie (champs vide "non saisie") et les erreur de la base de donnée (classe EDBEngineError).
    Les champs persistants (TField) des tables on plusieurs propriétés qui permetent de le controler finement.
    La première est "Required" de type "Boolean"
    Indique si une saisie est obligatoire ou non dans un champ.
    La deuxième "DefaultExpression" est explicite :
    Spécifie une expression SQL affectée au champ quand l'utilisateur ne fournit pas de valeur.
    La troisième est "CustomConstraint" qui permet d'imposer une contrainte aux données insérées.
    Affectez CustomConstraint pour limiter les valeurs pouvant être saisies par l'utilisateur dans un champ. CustomConstraint doit être une expression de recherche SQL correcte comme :
    x >0 and x <100
    N'importe quel nom qui n'est pas un mot réservé SQL peut être utilisé pour désigner la valeur du champ, il suffit qu'il soit utilisé de manière homogène dans toute l'expression de contrainte.
    La quatrième est liée a la précédente puisque "ConstraintErrorMessage"
    Contient un message d'erreur personnalisé qui est affiché quand l'utilisateur tente de définir une valeur ne respectant pas les contraintes de données du champ.
    Pour les erreurs de base de données, le mieux est d'utiliser l'evenement "OnPostError" de chaque table pour donner une réponse adéquate aux erreurs de celle-ci, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TablePostError(DataSet:TDataSet; E:EDatabaseError; var Action: TDataAction);
    begin
     if (E is EDBEngineError) then
     begin
      case (E as EDBEngineError).Errors[0].ErrorCode of
       9729 : //code d'erreur : Violation de Clé //
       .../...
      end;
      Abort;
     end;
    end;
    Les codes d'erreurs BDE, tu peux les retrouver ICI.
    Si vous êtes libre, choisissez le Logiciel Libre.

  5. #5
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut affecté la veleur 3 a toute le champ 'num' de ma table 'table1'
    salut
    vous avez l'air de bien vous y connaitre on Base de donné
    moi j'ai un problém tout simple et je pence que vous pouré m'aidé
    je veux affecté la veleur 3 a toute le champ 'num' de ma table 'table1'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    var k:integer;
    begin
    for k:=0 to 1000 do
    table1.Append;
    table1[k].num:=3;
    table1.post;
    table1.Next;
    end;
    j'ai le code d'erreur suivant

    type incompatibles:'string' et 'integer'
    alor que le champ num est un champs alphanumérique

    et esque vous pouvé m'aixpliqué a quoi cela sére
    .append;
    .post;
    .open;
    .colse;
    j'avou que je vois pas bcp la différance et l'aide delphi n'ai pas trés explicite
    merci bcp
    merci bcp

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    ... et avec table1[k].num:='3'; ... c'est à dire table1[k].num:=intToStr(3); ça ne marche pas ???

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    table1[k].num ??? c'est quoi cette syntaxe, je connais pas et ca marche pas.
    C'est mieux comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Table1.FIRST;
    while not Table1.EOF do
    begin
     Table1.EDIT;
     Table1.FindField('NUM').AsString := '3';
     Table1.POST;
     Table1.NEXT;
    end;
    Si vous êtes libre, choisissez le Logiciel Libre.

  8. #8
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut
    merci
    Table1.FIRST;
    while not Table1.EOF do
    begin
    Table1.EDIT;
    Table1.FindField('NUM').AsString := '3';
    Table1.POST;
    Table1.NEXT;
    end;
    cela marche trés bien;
    mais comment faire pour ciblé un enregistrement ??
    si je veux par example changé que le num de l'enregistrement 4 ??

    merci bcp
    merci bcp

  9. #9
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut
    Mr TryExceptEnd j'ai un autre poblém pour fair l"appel d'une fonction qui utilise une table
    voici ma fonction :
    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
    function detectligne(xs,ys : integer;table1:Ttable) : Extended;
    var      a, b, miEp, lg : Extended; dx,dy,yc : integer; okx,oky : boolean;
      begin
             Result:=-1;
             miEp:=f1.tligne['Ep']/2;
            dx:=f1.tligne['Xe'] -f1.tligne['X0'] ;
               dy:=f1.tligne['Ye'] -f1.tligne['Y0'];
    
              okx:=False; oky:=False;
              if ((dy<0) and (ys<=f1.tligne['Y0']) and (ys>=f1.tligne['Ye']))or ((dy>0) and (ys<=f1.tligne['Ye']) and (ys>=f1.tligne['Y0'])) then oky:=True;
             if ((dx>0) and (xs<=f1.tligne['Xe']) and (xs>=f1.tligne['X0']))or ((dx<0) and (xs<=f1.tligne['X0']) and (xs>=f1.tligne['Xe'])) then okx:=True;
    
    
              if (dx=0) and (dy=0) then begin if (xs - miEp <=f1.tligne['X0']) and (f1.tligne['X0']<= xs + miEp)and (ys - miEp <=f1.tligne['Y0']) and (f1.tligne['Y0'] <= ys + miEp)then Result:=-maxInt; EXIT;end;
    
               if (dx=0) then
                   begin if (xs - miEp <=f1.tligne['X0']) and (f1.tligne['X0'] <= xs + miEp)and oky then Result:=(ys - f1.tligne['Y0'])/dy;EXIT;end
                     else
                        if (dy=0) then
                         begin if (ys - miEp <=f1.tligne['Y0']) and (f1.tligne['Y0'] <= ys + miEp)and okx then Result:=(xs - f1.tligne['X0'])/dx;EXIT;end
                          else
                              begin
                                a:=dy/dx;
                                b:=f1.tligne['Y0'] - a*f1.tligne['X0'];
                                 yc:=round(a*xs + b);
                                lg:=sqrt(dx*dx + dy*dy);
                                miEp:=abs(miEp*lg/dx);
                               if (yc + miEp >= ys) and (yc - miEp <= ys) and okx and oky then  Result:=(xs - f1.tligne['X0'])/dx;
                    end;
             end;
    et pour l'appel j'ai fait :
    detcligen :=detectligne(x,y,table1);
    j'aubtien le code de erreur suivant :
    une classe d'exception EvariantError avec le message 'conversion de type variant incorrecte'processus stoppé
    je crois que c'est un probléme de syntaxe aussi
    car la fonction n'a rien a ce repproché
    si vous pouvé me dire comment fair l'appel cela seré cool
    merci bcp
    merci bcp

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    mais comment faire pour ciblé un enregistrement ??
    si je veux par example changé que le num de l'enregistrement 4 ??
    Attention, avec une base de données, la notion de numéro d'enregistrement n'existe pas. Les lignes peuvent être dans n'importe quel ordre dans la table.

    Au mieux, on peut essayer d'accéder à la ligne n° N du composant TTable à un instant donné avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Table1.RecNo := 4; // On veut accéder à la ligne n°4.
    Table1.Edit;
    Table1.FieldByName('NUM').AsInteger := 3;
    Table1.Post
    Cependant, la propriété RecNo n'est pas toujours supportées. Ca fonctionne avec BDE/Paradox, mais si tu utilise BDE+SQLLink, je ne sais pas ce que ça donnera en fonction du SGBD.
    Et il me semble que ça ne fonctionne pas avec ADO.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par stfanny31 Voir le message
    merci


    cela marche trés bien;
    mais comment faire pour ciblé un enregistrement ??
    si je veux par example changé que le num de l'enregistrement 4 ??

    merci bcp
    par SQL c'est si facile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE NOMTABLE1 SET NUM=3 WHERE NUM=4
    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

  12. #12
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut le SQL !!
    Merci SergioMaster
    le SQL !!j'en é entandu parlé vous pouvé m'expliqué comment cela marche ??
    je sais que c'est avec que on fait des requette
    mais quelle est le composant qui permet de faire ca !!!
    cela m'aidé surement
    merci bcp

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    le composant : TQuery bien sûr
    le SQL : Langage , le mieux c'est de faire un tour dans les Tutoriaux sur ce sujet ICI , pour le update voir là par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TQuery1.SQL.Clear;
    TQuery1.SQL.Add('UPDATE NOMTABLE1 SET NUM=3 WHERE NUM=4')
    Tquery1.execSQL;
    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

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2008
    Messages : 64
    Points : 72
    Points
    72
    Par défaut violation de clé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if table1.FindKey([Edit1.Text])then
      begin
      Messagedlg('le Numero que vous avez saisis existe deja',mtInformation,[mbOK],0);
      exit;
      end
     else
      begin
    ....
    ....
    ca marche tre bien

  15. #15
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Findkey fait un déplacement dans l'enregistrement en cours de la table concerné à ce que je sache, c'est pas la méthode idéale pour détecter les doublons

  16. #16
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut .FindKey (ca marche)
    salut bingo06260
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if table1.FindKey([Edit1.Text])then
      begin
      Messagedlg('le Numero que vous avez saisis existe deja',mtInformation,[mbOK],0);
      exit;
      end
     else
      begin
    ....
    ....
    merci cela marche très bien je confirme

    et Sir:helmis si vous pouvez nous expliquer pourquoi vous êtes contre cela ce serait bien
    merci bcp

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    si vous pouvez nous expliquer pourquoi vous êtes contre cela serait bien
    par définition , s'il y a des doublons , seul le 'premier' enregistrement correspondant à la clé sera récupéré par le findkey
    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

  18. #18
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut
    salut SergioMaster
    merci pour votre réponse mais après dires je n'ai pas bien compris
    personnellement ,j'ai essayé ce code dans tous les cas possibles,
    il marche très bien
    est ce que vous pouvez nous donner un exemple contradictoire
    merci beaucoup
    merci bcp

  19. #19
    Membre habitué

    Inscrit en
    Août 2005
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 253
    Points : 197
    Points
    197
    Par défaut
    Bonjour

    En mode edition "FINDKEY" retrouvera ton enregistrement en cours, dans ce cas tu ne pourra pas poster après edition.

  20. #20
    Membre habitué Avatar de stfanny31
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 254
    Points : 163
    Points
    163
    Par défaut
    Salut helmis
    esque vous pouvé nous donné une autre fonction !!!
    pour ne pas avoir un problém avec la clé

    merci bcp
    merci bcp

Discussions similaires

  1. [ADOConnect] gestion des exception en tout temps
    Par portu dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/04/2005, 19h01
  2. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  3. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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