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)
3Comments
Bonjour @Pierre LaFay
tu peux aussi utiliser $SEQUENCE
$SEQUENCE est spécifiquement destiné aux opérations d'incrémentation d'entiers impliquant plusieurs processus simultanés.
Dans ton cas, $INCREMENT te donnera une meilleure garantie de séquentialité, en évitant les sauts de numéros.
Exemple de classe utilisant un index IDKEY
Test
IRISAPP>w##class(data.centre).test()
^data.centreD("departement",83)=10^data.centreD("departement",83,1)=$lb("","The industry leader in just-in-time seven-sigma Internet content for social networks.")
^data.centreD("departement",83,2)=$lb("","On-line distributors of open distributed Internet connectivity for capital markets.")
^data.centreD("departement",83,3)=$lb("","Developers of cutting-edge HTML5 XML instruments for our long-term clients.")
^data.centreD("departement",83,4)=$lb("","Building shareholder value by delivering advanced financial application development media for industry and academia.")
^data.centreD("departement",83,5)=$lb("","Providers of breakthrough satellite-based advanced connectivity for industry and academia.")
^data.centreD("departement",83,6)=$lb("","Resellers of cloud-based seven-sigma database connectivity for the enterprise.")
^data.centreD("departement",83,7)=$lb("","Developers of dynamic object-oriented graphical services for social networks.")
^data.centreD("departement",83,8)=$lb("","Developers of high-performance nano-advanced productivity tools for the Fortune 50.")
^data.centreD("departement",83,9)=$lb("","Specializing in the development and manufacturing of breakthrough wireless forecasting marketing services for the enterprise.")
^data.centreD("departement",83,10)=$lb("","Enabling individuals and businesses to manage just-in-time big data Internet technologies for discriminating investors.")
1
IRISAPP>w##class(data.centre).test(3)
^data.centreD("departement",83)=13^data.centreD("departement",83,1)=$lb("","The industry leader in just-in-time seven-sigma Internet content for social networks.")
^data.centreD("departement",83,2)=$lb("","On-line distributors of open distributed Internet connectivity for capital markets.")
^data.centreD("departement",83,3)=$lb("","Developers of cutting-edge HTML5 XML instruments for our long-term clients.")
^data.centreD("departement",83,4)=$lb("","Building shareholder value by delivering advanced financial application development media for industry and academia.")
^data.centreD("departement",83,5)=$lb("","Providers of breakthrough satellite-based advanced connectivity for industry and academia.")
^data.centreD("departement",83,6)=$lb("","Resellers of cloud-based seven-sigma database connectivity for the enterprise.")
^data.centreD("departement",83,7)=$lb("","Developers of dynamic object-oriented graphical services for social networks.")
^data.centreD("departement",83,8)=$lb("","Developers of high-performance nano-advanced productivity tools for the Fortune 50.")
^data.centreD("departement",83,9)=$lb("","Specializing in the development and manufacturing of breakthrough wireless forecasting marketing services for the enterprise.")
^data.centreD("departement",83,10)=$lb("","Enabling individuals and businesses to manage just-in-time big data Internet technologies for discriminating investors.")
^data.centreD("departement",83,11)=$lb("","On-line distributors of scalable predictive analytic XML gaming for our long-term clients.")
^data.centreD("departement",83,12)=$lb("","On-line distributors of interactive quantum advanced media for the pharmaceutical industry.")
^data.centreD("departement",83,13)=$lb("","Building shareholder value by delivering innovative distributed cold-fusion powered gaming for the Financial community.")
1Class data.centre Extends%Persistent
{
/// Description
Index IdKeyIndex On (APP, DD, NNN) [ IdKey ];/// Nom de l'application utilisée par le centreProperty APP As%String;/// n° du département du centreProperty DD As%Integer;/// n° séquentiel dans le départementProperty NNN As%Integer;Property description As%String(MAXLEN = "");ClassMethod create(APP As%String, DD As%Integer, description As%String) As%Status
{
set a = ..%New()
set a.APP = APP
set a.DD = DD
set a.NNN = $INCREMENT(^data.centreD(APP,DD))
set a.description = description
set sc = a.%Save()
return sc
}
ClassMethod test(nb As%Integer = 10) As%Status
{
for i=1:1:nb {
set sc = ..create("departement",83,##class(%PopulateUtils).Mission())
}
zw^data.centreD
return sc
}
Storage Default
{
<Data name="centreDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>description</Value>
</Value>
</Data>
<DataLocation>^data.centreD</DataLocation>
<DefaultData>centreDefaultData</DefaultData>
<IdLocation>^data.centreD</IdLocation>
<IndexLocation>^data.centreI</IndexLocation>
<StreamLocation>^data.centreS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}
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)
}
}
}