UNIQID |
uniqidpermet de générer une suite d'entiers longs uniques pour chaque table d'Adonix.
uniqid ( classe )
Elément | Description | Restrictions |
Désignation d'une table. | La table doit être ouverte. |
# Je veux numéroter de manière unique l'enregistrement écrit
[F:FIC1]NUMERO =uniqid
Write [FIC1]
uniqidpermet d'avoir un numéro unique pour une table donnée ouverte au préalable; ces numéros sont attribués de manière séquentielle et peuvent donc servir de clé d'accès au fichier.
Ces numéros seront conservés par copie, par extraction et restauration, par revalidation de la table.
Attention! Cette séquence de numéros n'est pas forcément une suite consécutive de numéros. Exemple, il n'y a pas de récupération du numéro suite à un Rollback.
Le type du résultat est Integer.
Pour une table nouvellement créée, les numéros sont attribués à partir du numéro 1 et ensuite de façon séquentielle de 1 en 1. En cas de changement de structure, le numéro courant est conservé; en cas de remise à 0 d'une table, les numéros sont ré-attribués en repartant à 1. Il n'existe pas d'autres moyen pour décrémenter cette séquence de numéros.
Les nombres attribués séquentiellement ne peuvent pas être ré-attribués si une transaction est abandonnée par Rollback. Pour implémenter ce genre de fonction si l'on désire que tous les numéros soient attribués, il est donc préférable de faire appel à des compteurs (un compteur principal et un tableau contenant les numéros abandonnés à ré-attribuer en priorité, par exemple).
L'instruction uniqid s'exécute même si la table est verrouillée.
L'instruction uniqid ne met pas à jour la variable [S]fstat.
Ce numéro unique délivré par l'instruction uniqid est parfois utilisé dans un champ de clé sans homonyme. ( Exemple sur la table AREPORTM )
IL y a problème si la séquence n'existe plus. X3 renvoit un message d'erreur lié à la base de données. Il faut alors consulter le journal d'évènements de la base de la base pour en avoir le détail.
Les séquences servant à bâtir des clés uniques, si la fonction uniqid rend une valeur inférieure à la dernière enregistrée, X3 va afficher un message d’erreur de type « Clé déjà existante dans la table ». Dans ce cas là il faut remettre la séquence à jour.
Exemple pour la table GACCDENTRYD d’un dossier « DEMO »
Sous X3
Local file GACCENTRYD [DAE]
Local integer MAX
MAX = uniqid([DAE])
Read [DAE]DAE2 last
If MAX < =[F:DAE]ACCNUM
Errbox « La séquence de la table GACCENTRYD doit être rebâtie »
Errbox « Elle devrait être à » +num$([F :DAE]ACCNUM)+ « mais elle est à » +num$(MAX)
Endif
Sous Oracle
# Il faut avoir positionné les bonnes variables d’environnement etc. afin de pouvoir lancer les requêtes SQL suivantes.
Select last_number from user_sequences where sequence_name =’SEQ_GACCENTRYD’;
Sous SQL Serveur
select value from SS_SEQUENCE where usr='DEMO' and name='GACCENTRYD'
Sous X3
# En continuant le traitement commencé ci-dessus.
# Le plus simple est de s’assurer qu’on est bien seul sur le dossier
If nbruser > 1 : Errbox ‘Vous n’êtes pas seul sur ce dossier !’ : End : Endif
While uniqid([DAE]) <MAX : Wend
Sous Oracle
#après s’être assuré qu’on est bien seul sur le dossier
# le plus sûr est de recréer les séquences avant de les mettre à la bonne valeur
Drop sequence SEQ_GACCENTRYD ; (détruit le registre)
Create sequence SEQ_GACCENTRYD increment by 1 start with <MAX+1> ;
grant select on SEQ_GACCENTRYD to ADMIN_ADONIX
Sous SQL Serveur
# on se contente de mettre à jour les séquences sans les détruire au préalable
update SS_SEQUENCE set value=<MAX> where name='GACCENTRYD' and usr='DEMO'
ERCLAS( 7) | Lefichier n'est pas ouvert. |
READ - WRITE - READLOCK - ROLLBACK
Adonix X3(r) L4G |