|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Développeur informatique Inscription : mai 2006 Messages : 30 ![]() |
Bonjour
Dans une table Interbase j'ai besoin d'une clé primaire auto-incrémentée pour y faire référence par des clés étrangères ... J'ai lu trés attentivement http://kloo.developpez.com/interbase/IB6compteur/ et j'ai trouvé une méthode bien plus simple, beaucoup trop simple sans doute: Je crée la table avec IBExpert et un champ ID integer, primary key, avec générateur et trigger BI. Jusque là ça fonctionne trés bien avec l'éditeur de données intégré à IBExpert. Ensuite avec Delphi, je crée une form avec IBDataBase, IBTransaction, IBTable un DataSource et un DBGrid. Mais à l'insertion d'une nouvelle ligne j'obtiens l'erreur 'le champ ID doit avoir une valeur'. Et là, l'astuce, c'est de modifier le champ ID et décocher 'not null'. Oui bien sur, ça fait une clé primaire qui pourrait être nulle, mais le trigger BI vérifie ce cas. Et ça marche !! En tant que novice avec Interbase je me dis que cette méthode à surement un revers. En attendant un avis éclairé. Cordialement |
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Inscription : octobre 2004 Messages : 141 ![]() |
Bonjour
Ton message est en rapport avec la propiété Required de TField de ton dataset pour être plus clair tu vas dans l'éditeur de champ de ton dataset (Ta table il me semble) et tu cliques sur ton champ cle primaire, l'inspecteur d'objet apparait et tu accédes à la propriété Required. tu peux la mettre à False puisque ta cle primaire va être généré par Firebird. Si tu as besoin de la valeur de la clé tout d e suite tu peux utiliser la propriètè generator field de ton dataset. Ton idée n'est pas bonne meme si elle a résolu temporairement ton probléme car comment veux tu identifier ton enregistrement ? Mirmillon |
|
|
00
|
|
|
#3 | |
|
Futur Membre du Club
![]() Développeur informatique Inscription : mai 2006 Messages : 30 ![]() |
Citation:
En effet je n'ai déclaré aucun champ, au sens TField, associé au TIBQuery. Il doit donc les créer par défaut avec les propriétés par défaut, probablement avec Required déduit des info remontées de la base et donc à TRUE pour le champ ID. Je vais creuser dans ce sens, merci. |
|
|
|
00
|
|
|
#4 |
|
Membre actif
![]() Inscription : octobre 2004 Messages : 141 ![]() |
Il faut mieux mettre la propriètè Reaquired à False sinon tu dois passer par la propirètè generated field de ton dataset. tu suis ?
Mirmillon |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Cette méthode (de laisser le trigger générer la clé primaire) est bien entendu tout a fait valable. Sinon a quoi servirait ce trigger ?
Le seul inconvéniant que cette méthode c'est que l'application cliente n'a pas en retrour de cette insertion la valeur que le trigger a utiliser comme clé. Donc si c'est pour faire de l'insertion pure oui. Si par contre vous avez besoin de connaitre la clé de l'enregistrement que vous insérer pour par exemple l'utilisée dans un référencement de clé étrangère, vous ne pouvez utiliser cette méthode de trigger. Il faut exécuter le générateur manuellement, mémoriser la clé que vous utilisez pour l'insertion de votre enregistrement et du coup vous pouvez l'utiliser dans la suite de vos traitements. |
|
|
00
|
|
|
#6 |
|
Futur Membre du Club
![]() Développeur informatique Inscription : mai 2006 Messages : 30 ![]() |
Les deux fonctionnent parfaitement. Impec
La première possibilité me semble plus "propre": elle laisse le soin à la base de gérer ce compteur et c'est son boulot. La façon GenratorField demande au développeur de la couche présentation d'en savoir trop, me semble t-il. Cordialement |
|
|
00
|
|
|
#7 | |
|
Futur Membre du Club
![]() Développeur informatique Inscription : mai 2006 Messages : 30 ![]() |
Citation:
Merci |
|
|
|
00
|
|
|
#8 |
|
Membre actif
![]() Inscription : octobre 2004 Messages : 141 ![]() |
N'oublie pas de mettre le tag résolu
Mirmillon |
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
De toute facon le fait d'avoir le trigger, n'empèche pas d'utliser l'autre méthode. Car le trigger, ne génère un nouvel ID que si le champs est null.
|
|
|
00
|
|
|
#10 | |
|
Membre du Club
![]() Inscription : mars 2005 Messages : 105 ![]() |
Citation:
merci Thierry |
|
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
je pense qu'en multi utilisateur vous avez toutes les chances d'obtenir des valeurs de clef dupliquées...
Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/clefs/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#12 | |
|
Membre du Club
![]() Inscription : mars 2005 Messages : 105 ![]() |
Citation:
Mais je n'arrive pas à trouver une solution satisfaisante pour la création de factures dans la BD. J'ai géré mes factures dans deux tables, une pour les entêtes et une autre pour les lignes, le numéro de facture est géré par un générateur et un trigger après l'insertion de la facture. Le problème est que le générateur est géré en dehors des transactions, ce qui fait qu'en cas de plantage lors de la création, un trou dans la liste des numéros de facture est automatiquement généré. Je me demande si je ferais pas mieux d'insérer mes factures dans une procédure stocké pour limiter ces risques. Thierry |
|
|
|
00
|
|
|
#13 | |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 215 ![]() |
Citation:
http://www.ibobjects.com/docs/ti_AuditableSeries.ZIP |
|
|
00
|
|
|
#14 | |
|
Futur Membre du Club
![]() Développeur informatique Inscription : mai 2006 Messages : 30 ![]() |
Citation:
Depuis j'utilise avec succès les générateurs, via une procédure stockée puisque je n'utilise les DataSet que pour déboguer. Merci. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com