Article
· Déc 17, 2023 1m de lecture

Implémenter une séquence indépendamment d'une clé

Si Iris propose bien de créer des clés suivant une séquence, comment faire pour obtenir un n° séquentiel dans un autre contexte ?

Dans mon cas, je créé automatiquement des centres de soins, et je souhaite leur fixer une numéro du type :

APP-DD-999

  • APP = Nom de l'application utilisée par le centre
  • DD = n° du département du centre
  • 999 : n° séquentiel dans le département

Il est bien sur possible que des centres soient créés de manière concurrente, il faut donc gérer cette concurrence éventuelle.

Ma première approche était d'utiliser une classe persistente et de créer un nouvel objet pour récupérer son id, mais cela implique la création d'autant de classes que de départements.

La solution que j'ai trouvée passe par l'utilisation d'une globale et de la fonction $INCREMENT. La fonction $INCREMENT gère la concurrence c'est donc parfait pour mon usage.

Voici donc ma methode d'obtention d'une séquence :

ClassMethod GetSequence(name As %String, item As %String) As %Integer
{
	Return $INCREMENT(^Sequence(name,item))
}

Les appels successifs à cette méthode fournissent bien le résultat attendu :

BNA2024 6d3>w ##class(Ellipse.Utils.PlSandbox).GetSequence("departement",83)
1
BNA2024 6d3>w ##class(Ellipse.Utils.PlSandbox).GetSequence("departement",83)
2
BNA2024 6d3>w ##class(Ellipse.Utils.PlSandbox).GetSequence("departement",83)
3
Discussion (4)2
Connectez-vous ou inscrivez-vous pour continuer
 
Exemple de classe utilisant un index IDKEY
 
Test

Merci @Sylvain Guilbaud pour ces précisions,

j'avoue ne pas avoir saisi la subtilité entre $SEQUENCE et $INCREMENT quand la valeur d'incrément est 1.

Pour la classe, j'avais plus ou moins pensé à faire cela, mais je trouve plus pratique d'avoir une clé unique indépendante de l'ID dans une seule propriété.

J'ai finalement fait une petite classe pour gérer ce besoin dans différentes fonctionnalités (numérotation automatique des centre, génération de login, ...), la voici :

Class Bna.Utils.Sequence Extends %RegisteredObject
{

Property Name As %String;

Method %OnNew(name) As %Status
{
        Set ..Name = name
        Return $$$OK
}

ClassMethod ShowAll()
{
        zw ^Sequence
}

ClassMethod ResetAll()
{
        Kill ^Sequence
}

Method Get(seqKey As %String = "") As %Integer
{
        if seqKey="" {
            Return $INCREMENT(^Sequence(..Name))
        } else {
            Return $INCREMENT(^Sequence(..Name, seqKey))
        }
}

Method Reset(seqKey As %String = "")
{
        if seqKey="" {
            Kill ^Sequence(..Name)
        } else {
            Kill ^Sequence(..Name, seqKey)
        }
}

Method Show(seqKey As %String = "")
{
        if seqKey="" {
            zw ^Sequence(..Name)
        } else {
            zw ^Sequence(..Name, seqKey)
        }
}

}