|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Bonjour,
Je vous propose un petit exercice : Comment procederiez vous pour avoir une table offrant 3 identifiants par enregistrement ?
Code :
Des idées ? Si possible, j'aimerais que la solution que vous proposiez puisse s'adapter facilement à d'autres champs, genre une dizaine |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 455 ![]() |
Code :
|
||
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Bonjour,
Cette solution ne me satisfait qu'à moitié car peu réutilisable. Peut être serait t'il possible de la transformer en fonction qui accepteraient comme argument : Le nom du champ, Celui de la table Le type d'incrémenation Genre DIncrement("N1","MaTable",0) renverrai un numéro autoincrémenté valide DIncrement("N2","MaTable",1) renverrai un numéro aléatoire valide Reste à voir comment utiliser cette fonction facilement dans un formulaire, et aussi lister les avantages et ses inconvénients pour les données En tout cas, merci de ta participation |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 455 ![]() |
Avec dans le formulaire pour les champs la valeur par defaut =Dincrement("tbTest";0) pour l'increment simple et =Dincrement("tbTest";1) pour le nombre aleatoire
Les champs testés pour le nombre aleatoire sont les champs dont le nom se terminent par un nombre à partir du 2ème caractère N12 est valide, B13 aussi, as12 ou n15d ne le sont pas Code :
|
||
|
|
00
|
|
|
#5 | ||
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 4 198 ![]() |
Bonjour,
voila ma proposition. Code :
|
||
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Helas, ta solution ne tiens pas compte du nom du champ à passer en paramètre. De ce fait, la solution de LedZeppII me parait meilleure, toutefois, reste une question, comment allez vous l'utiliser ?
|
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 455 ![]() |
Je pensais que le nombre aleatoire devait être unique dans toute la table, c'est pourquoi je testais aussi les autres champs Nn
La version de LedZeppII est effectivement meilleur Pour l'utilisation dans un formulaire, Valeur par defaut = DIncrement(....) |
|
|
00
|
|
|
#8 | |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Citation:
|
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : août 2006 Messages : 1 455 ![]() |
Passer par quoi ?
Du code ? |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Inscription : mai 2005 Messages : 3 419 ![]() |
champ1 numéro auto incrément
champ2 double valeur par défaut rnd() indexé sans doublon champ3 double valeur par défaut rnd() indexé sans doublon reste à gérer les improbables conflits
__________________
Elle est pas belle la vie ? |
|
|
00
|
|
|
#11 | |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Citation:
Ah ben là c'est clairement déjà mieux puisque d'une part il est possible d'ajouter les données directement dans la table et d'autre part l'index permet de garantir l'intégrité des données. Seul bémol effectivement il faut gérer les conflits très improbable. Ce n'est pas vraiment à cette solution que je pensais mais celle ci n'est pas mal du tout |
|
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : mai 2005 Messages : 3 419 ![]() |
Après test et 510 0000 enregistrements ajoutés en plusieurs passes pas de conflit.
Comme disent les statisticiens « un évènement improbable ne se produit jamais »
__________________
Elle est pas belle la vie ? |
|
|
00
|
|
|
#13 |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Peut être existe t'il une solution qui permettrait d'être sûr qu'aucun doublon ne sera généré
|
|
|
00
|
|
|
#14 | ||
|
Expert Confirmé
![]() Inscription : mai 2005 Messages : 3 419 ![]() |
en testant ceci pour champ1=1 à 3000000
champ2=rnd(-champ1) champ3=rnd(-champ2) on trouve 3556 doublons sur champ2 ceci provient de la piètre qualité du générateur de nombres aléatoires de microsoft en examinant les résultats on s'aperçoit que les doublons sont de la forme x, (x*2^y)-1 genre valeur valeur doublon 8....... 2097151 17..... 1114111 18...... 1179647 19.... 1245183 ..... 11718 2999807 le plus grand nombre ayant un doublon qui lui est supérieur est donc 11718 sur l'intervalle choisi conclusion si je définis champ2=rnd(-champ1-11718) champ3=rnd(rnd(-champ1-11718)) je dispose de deux clefs pseudo aléatoires et d'un compteur auqel cas mettre ces clefs dans la base serait inutile Code :
nb à ne pas utiliser en sécurité ni en cryptographie sans bien bien réfléchir
__________________
Elle est pas belle la vie ? |
||
|
|
00
|
|
|
#15 |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
C'est pas mal, mais je pense qu'on devrait pouvoir arriver à quelque chose garantissant encore plus le non doublonnage
|
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 774 ![]() |
une table avec
un champ N1, un champ N2, un champ N3, un champ Libelle tous Indexé sans doublons Libelle: (taille du champ:texte) N1: taille du champ:NuméroAuto N2: taille du champ:réel simple / valeur defaut:Aléat() N3: taille du champ:réel simple / valeur defaut:-Aléat() / valide si:<>0 N1 sera toujours >=1 N2 n'atteindra jamais la valeur 1 et >=0 N3 sera toujours négatif et <>0 c pas dis le type du nombre aléatoire... |
|
|
00
|
|
|
#17 |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Oui mais rien n'empêche d'avoir deux fois le même N2 avec cette solution
|
|
|
00
|
|
|
#18 |
|
Expert Confirmé Sénior
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 774 ![]() |
et un truc comme ca:
Code :
DoCmd.RunSQL "INSERT INTO TABLE2(N2,N3) VALUES(" + Str(DMax("N1", "TABLE2") + 0.5 + (Rnd() / 2)) & "," & Str(DMax("N1", "TABLE2") + 0.49999999 - (Rnd() / 2)) + ")" |
|
|
00
|
|
|
#19 | |
![]() ![]() ![]() Christophe Warin Inscription : octobre 2004 Messages : 8 632 ![]() |
Citation:
Oui mais il n'y a rien d'automatique dans cette solution. Que se passe t'il si l'utilisateur veut saisir les données dans un formulaire ou dans la table directement ? |
|
|
|
00
|
|
|
#20 | |
![]() ![]() ![]() |
Citation:
Je ne fais pas !
__________________
Mes tutoriels et vidéos : Tableaux croisés dynamiques, Access les Bases, et les autres ! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com