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 :

TIBDataset et GeneratorField


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut TIBDataset et GeneratorField
    Delphi 7 avec Firebird 2.1

    Généralement je gère les champs autoincrémenté (NOT NULL) avec un "trigger before" qui garnit la valeur de la requête SQL de création.

    Depuis peu j'explore le fonctionnement de toutes les potentialités du TIBdataSet lequel contient une propriété GeneratorField laissant entendre qu'on peut se passer de Trigger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	if ((new.bas_id is null) or (new.BAS_ID<1)) then
            new.bas_id=gen_id(gen_mail_base,1);
    Pourtant si j'inactive le trigger et bien qu'ayant spécifié un GeneratorField, lors de la validation je reçois une erreur "le champ ID doit avoir une valeur".

    Trigger qui comme on le voit ne fait rien si le champ n'est pas vide et > 0.

    Si je le réactive ça fonctionne.

    Intrigué par cette double nécessité (GeneratorField et Trigger) je tente de supprimer le GeneratorField (qui n'est possible qu'en éditant la fiche en mode texte d'ailleurs) et là l'erreur réapparait.

    Ce n'est donc pas la propriété GeneratorField qui garnit la valeur sinon le trigger serait inutile. Or on a vu qu'ils était indispensable. A quoi sert elle donc ?

    J'ajoute que les deux fonctions (Trigger et GeneratorField) ne font pas double emploi car contrairement à un cas sur le forum les enregistrements sont bien identifiés avec un pas de 1.

    A noter que GeneratorField agit "sur le serveur" les autres options ne fonctionnant pas. (C/S sur le même poste)

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Salut

    La notion de GeneratorField simule un auto-incrémenté mais c'est un mécanisme implémenté dans les composants (sans doute en affectant le champ avant le post de manière transparente pour eel développeur). Il me semble avoir vu ce genre de chose dans ZeosLib, il faut, si je me souviens bien, préciser le nom de la séquence à utiliser (il doit y avoir une propriété pour cela), vérifie. C'est peut-être pour ça que cela ne marche pas dans ton cas.

    Perso, je ne me sers pas de ces choses, je gère moi-même ce champ car comme on ne sait pas quand a lieu la mise à jour du champ, ça peut être gênant. Exemple: si tu gères une relation de maître à détail, il faut être sûr que les clé de la table détails sont alignées sur celle de la table maître.

    En bref, conserve ton trigger par sécurité et alimente la clé entière par code quand tu en as besoin en recherchant la nouvelle valeur à l'aide d'un SELECT.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT gen_id(gen_mail_base,1) FROM RDB$DATABASE.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 479
    Points : 267
    Points
    267
    Par défaut
    Après quelques tests j'en viens à la conclusion suivante :

    si on utilise un TIBDataSet pour gérer une table contenant un champ not_null (avec FireBird 2.1) il faut 2 conditions pour que l'exception "validation error for column..." ne se produise pas :

    1 mettre un trigger before insert qui garnit le champ
    2 remplir la propriété GeneratorField

    Si on omet l'une ou l'autre des ces étapes on obtient une erreur au POST.

    J'ai aussi essayé de garnir le champ dans événement beforepost du TIBDataSet mais cela n’élimine pas l'exception. Je suppose donc que le composant TIBDataSet fait quelque chose avec ce champ qui en retire la valeur qu'on y a mis dans le code avant d'exécuter la requête vers le serveur FB.

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Salut

    Ne peux-tu pas effacer cette foutue propriété GeneratorField et gérer l'incrémentation dans l'événement BeforePost ?
    Le trigger ne sert alors plus qu'à garantir la création de la clé en cas de défaut.
    N'y aurait-il pas une propriété Required = True dans ton champ ?

    Quelle est la classe de ton objet champ ?

    Une autre solution, moins clean, consiste à affecter le compteur dans l'événement OnNewRecord mais alors tu consommes une valeur de la séquence même en cas d'annulation de la saisie.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [IBX] BLOB et TIBDataSet
    Par BVK dans le forum Bases de données
    Réponses: 6
    Dernier message: 21/06/2005, 15h18
  2. souci avec TIBDATASET
    Par devil106 dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/03/2005, 21h49
  3. [FB1.5][Builder C++ 5][IBX 5.4]TIBDataSet et Filtre ?
    Par Sitting Bull dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 23/09/2004, 11h11
  4. Boucle avec un TIBDataSet
    Par SebCBien dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/09/2004, 17h33
  5. [BCB5][IBX5.4]TIBDataSet et fonction Locate() ??
    Par Sitting Bull dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 02/07/2004, 18h46

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