Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1385 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Access et les Autonumbers.... => Comment les générer à la main

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Access et les Autonumbers.... => Comment les générer à la main

n°413357
Yoyo@
Posté le 02-06-2003 à 17:21:33  profilanswer
 

Salut!
 
j'avais posté ici meme il y a queslques temps, à propos d'Access XP et les Autonumbers!
 
Voilà, depuis ce temps là, mon problème, à savoir Access générant des Autonumber n'importe comment (genre, il va générer 400000 alors que le dernier généré vaut 600000) n'arrête pas de se produire, ce qui fait que mon appli n'arrete pas de planter !
 
Savez vous si il existe un remède, ou un patch à ceci?
 
Si ce n'est pas le cas, alors, comme on me l'avait indiqué, je souhaiterais générer ces nombres uniques moi meme... Pour celà, je créerais une nouvelle table, avec un champ et un enregistrement unique, contenant le "next number to generate" ! Ce champ m'indiquera quel nombre je devrais utiliser pour ajouter des enregistrements à ma table principale.
 
Ainsi, si mon nombre vaut X, et que je sais que je dois insérer dans ma table 50 enregistrements, je mettrais alors ce nombre à jour avec X + 50 -> X !
Ensuite, j'ajouterai mes enregistrements à cette table, ce entregistrements devront avoir des ID allant de X à X + 49... D'autre part, ils seront le résultat d'une requete... Le probleme  pour moi est doncle suivant :
Comment faire pour ajouter à cette requete une premiere colonne contenant les nombres de X à X + 49?
 
Comme tout sera fait en VBA, on peu considérer que je possèderai ce X en tant que variable, je ne serais pas obligé d'aller le chercher enn live dans la table contenant X en live (donc, ma requete, déja compliquée, ne sera aps alourdie !)
 
Voilà, j'espère avoir été assez clair :)
 
Merci,
 
Yoyo*


Message édité par Yoyo@ le 02-06-2003 à 19:29:57
mood
Publicité
Posté le 02-06-2003 à 17:21:33  profilanswer
 

n°413485
MagicBuzz
Posté le 02-06-2003 à 19:56:44  profilanswer
 

autant faire :
 
insert into latable (id, truc, machin) values (select max(id) + 1 from latable, 'truc', 'machin')

n°413500
drasche
Posté le 02-06-2003 à 20:08:30  profilanswer
 

ta base de données est accédée par une ou plusieurs personnes?  parce que ça change tout.  Si on est sûr qu'il n'y a jamais qu'une seule personne, on peut se permettre quelques trucs pas beaux mais autant faire propre et portable tout de suite.
 
Je suis pour la table externe qui stocke les ID.  Le truc c'est de locker la table ou le row à ton usage exclusif, de l'incrémenter, puis de relâcher.  Si le lock échoue, c'est qu'un autre utilisateur a déjà locké et il suffit de retenter jusqu'à réussite de l'opération (ou n essais, au choix).
 
Tu pourras donc pas te passer d'un échanger DB supplémentaire puisque tu stockes les IDs ailleurs [:spamafote]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°413505
MagicBuzz
Posté le 02-06-2003 à 20:11:53  profilanswer
 

Sinon, il suffit de changer le type de ID, et utiliser un timestamp comme ID.
 
En espérant que deux personnes ne vont pas écrire une ligne à la même milli-seconde :)

n°413812
Yoyo@
Posté le 03-06-2003 à 00:59:28  profilanswer
 

Concernant le lock, la BDD est multi utilisateur ! Par contre, dans mon code, je ne vias accéder qu'assez peu souvent au "Max ID", et surtout, je vais updater ce dernier qu'une fois que je saurai combien de row je veux ajouter, donc, le temps d'un accès lecture/ecriture, je ne pense pas qu'il y ait quelque conflit que ce soit, donc pas de probleme de coté la !
 
Par contre, en ce qui concerne la solution de MagicBuzz :  
 
insert into latable (id, truc, machin) values (select max(id) + 1 from latable, 'truc', 'machin')
 
Le probleme est que je voudrais faire une requete Insert insérant plusieurs rows d'un coup, donc je voudrais savoir comment générer une liste de nombre séquentielle en première colonne...
 
Juste une autre question : si je voulais locker la table des IDs, comment faudrait t il faire? Il faudrait que je rajoute un field supplémentaire, par exemple un booléen "IsLocked"? Le probleme, c dans le cas ou deux personnes accèdent au lock au meme moment, alors il vont trouver un False en meme temps et vont accéder à la donnée ensemble, non?
 
Bon, ma question principale concerne tout de meme la génération de la suite de nombre 1,2,3,4,5,6, etc... en premeire colonne de la requete !

n°413826
MagicBuzz
Posté le 03-06-2003 à 02:21:36  profilanswer
 

Insert as select ?
 
Ben t'es baisé, tu pourras pas. Access supporte pas les triggers, donc soit tu utilise un autonumber et tu trappes quand tu plantes, soit tu oublies les auto-incrément. Mais tu ne pourras pas générer une suite de constantes dans une même requête.

n°414054
Yoyo@
Posté le 03-06-2003 à 10:42:07  profilanswer
 

MagicBuzz a écrit :

Insert as select ?
 
Ben t'es baisé, tu pourras pas. Access supporte pas les triggers, donc soit tu utilise un autonumber et tu trappes quand tu plantes, soit tu oublies les auto-incrément. Mais tu ne pourras pas générer une suite de constantes dans une même requête.


 
Ca veut dire que si j'ai un requete SELECT qui me retourne :
 
xxxx  yyyy
rrrr  ffff
rrrr  gggg
 
Il me sera impossible d'en avoir une qui me retourne :
 
1  xxxx  yyyy
2  rrrr  ffff
3  rrrr  gggg
 
Si c'est le cas, je suis dans...la merde :(  
 
Je ne vois donc pas de solution à mon probleme qui ne greffe pas les perfs!
 

n°414073
MagicBuzz
Posté le 03-06-2003 à 10:52:34  profilanswer
 

Oui. Seul Oracle à ma connaissance permet de s'en sortir, car tu peut utiliser le rowid. (et encore, le rowid ne sera un nombre incrémenté que dans le cas d'une requête avec une jointure ou d'une requête pourtant sur une autre - select from select -, sinon il retourne l'id interne utilisé par oracle pour retrouver la ligne dans la table)
 
Mais Access ne fournis pas d'équivalent, pas plus que SQL Server à ma connaissance, quant à MySQL, je sais pas, mais j'en doute aussi. (c'est très rarement utilisé, puisque normalement on est censé avoir une génération de l'ID qui marche :D)

n°414124
Yoyo@
Posté le 03-06-2003 à 11:30:35  profilanswer
 

MagicBuzz a écrit :

Oui. Seul Oracle à ma connaissance permet de s'en sortir, car tu peut utiliser le rowid. (et encore, le rowid ne sera un nombre incrémenté que dans le cas d'une requête avec une jointure ou d'une requête pourtant sur une autre - select from select -, sinon il retourne l'id interne utilisé par oracle pour retrouver la ligne dans la table)
 
Mais Access ne fournis pas d'équivalent, pas plus que SQL Server à ma connaissance, quant à MySQL, je sais pas, mais j'en doute aussi. (c'est très rarement utilisé, puisque normalement on est censé avoir une génération de l'ID qui marche :D)


 
D'accord !
 
Donc, je pense que le mieux pour moi est de générer une petite table intermédiaire, enregistrement par enregistrement, et apres, de faire un append de masse sur la grosse table, au lieu de faire un append row par row sur la grosse table, ce qui aurait vraiment été inefficace !
 
Merci pour vos réponses,
 
Yoyo*


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Access et les Autonumbers.... => Comment les générer à la main

 

Sujets relatifs
[vb]bdd access : assistant feuilles de données et messages d'erreursrequete somme dans access
probleme de liste dans un sous formulaire access...Besoin d'aide [Générer un permutoèdre]
Pb de requete sous ACCESS (utilisation de max)probleme requete et formulaire access...
[Access/Mysql] Accès à ma base mysql dans accessmacro / vba / ms access 2000 : retourner le numéro de semaine ?
Garder la main durant un calcul lourdgenerer une chaine de caractere a partir d'un compteur [i]
Plus de sujets relatifs à : Access et les Autonumbers.... => Comment les générer à la main


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR