Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/05/2006, 16h57   #1
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Par défaut AutoIncrément facile, trop facile

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
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2006, 18h25   #2
Membre actif
 
Inscription : octobre 2004
Messages : 141
Détails du profil
Informations personnelles :
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2004
Messages : 141
Points : 152
Points : 152
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
Mirmillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 00h14   #3
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
Envoyé par Mirmillion
Ton message est en rapport avec la propiété Required de TField
Merci de l'info, ça tient surement à ça.
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.
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2006, 09h54   #4
Membre actif
 
Inscription : octobre 2004
Messages : 141
Détails du profil
Informations personnelles :
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2004
Messages : 141
Points : 152
Points : 152
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
Mirmillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 10h03   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 10h49   #6
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
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
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 10h57   #7
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
Envoyé par Barbibulle
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é.
C'est exactement ce que je cherche. Dans une page on crée des fournisseurs, et connaitre l'ID ici n'a pas d'intérêt. Dans une autre page on référence un fournisseur sans pouvoir en créer.

Merci
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 12h06   #8
Membre actif
 
Inscription : octobre 2004
Messages : 141
Détails du profil
Informations personnelles :
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations forums :
Inscription : octobre 2004
Messages : 141
Points : 152
Points : 152
N'oublie pas de mettre le tag résolu
Mirmillon
Mirmillon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2006, 13h48   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 12h59   #10
Membre du Club
 
Inscription : mars 2005
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 105
Points : 52
Points : 52
Citation:
Envoyé par Barbibulle
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.
Cela m'interesse, et comment utilises t'on manuellement un générateur ?
merci
Thierry
free07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2006, 17h38   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2006, 07h03   #12
Membre du Club
 
Inscription : mars 2005
Messages : 105
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 105
Points : 52
Points : 52
Citation:
Envoyé par SQLpro
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 +
Merci pour cet article.
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
free07 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2006, 10h16   #13
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
Citation:
Envoyé par free07
Merci pour cet article.
Mais je n'arrive pas à trouver une solution satisfaisante pour la création de factures dans la BD.
Thierry
voir le document :
http://www.ibobjects.com/docs/ti_AuditableSeries.ZIP
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 18h20   #14
Futur Membre du Club
 
Homme
Développeur informatique
Inscription : mai 2006
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : mai 2006
Messages : 30
Points : 18
Points : 18
Citation:
Envoyé par Mirmillon
Ton idée n'est pas bonne meme si elle a résolu temporairement ton probléme car comment veux tu identifier ton enregistrement ?
Bien sur, c'est là que ça coince.

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.
uluru est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h12.


 
 
 
 
Partenaires

Hébergement Web