Comment faire une requête SQL sur une global à plusieurs niveaux et afficher chacun des niveau dans le même tableau
Bonjour,
J'ai une globale dont la structure est à plusieurs niveaux et j'essaie à travers une class et une requête SQL d'afficher un tableau qui comprend toutes les valeurs et les niveaux.
^AFO("Site","Ville")="66722,3743"
^AFO("Site","Ville","111BB","OBT")=",MMM,XXX,"
^AFO("Site","Ville","111OW","OBT")=",XXX,MMM,"
^AFO("Site","Ville","AANVRBIBS","zzz") = "1^^1"
^AFO("Site","Ville","AANVRBIBS","zzz","*","dut") = "*afhalen waar gevonden"
^AFO("Site","Ville","AANVRBIBS","zzz","*","eng") = "*Pickup where found"
^AFO("Site","Ville","AANVRBIBS","zzz","*","fre") = "*Lieu où trouvé"
et voici le tableau que j'aimerai avoir
|
1 |
Ville |
|
|
|
|
66722,3743 |
|
2 |
Ville |
111OBT |
|
|
|
5000000 |
|
3 |
Ville |
111OW |
|
|
||
|
4 |
Ville |
AANVRBIB |
zzz |
|
|
1^^1 |
|
5 |
Ville |
AANVRBIB |
zzz |
* |
dut |
*afhalen waar gevonden |
|
6 |
Ville |
AANVRBIB |
zzz |
* |
eng |
*Pickup where found |
|
7 |
Ville |
AANVRBIB |
zzz |
* |
fre |
*Lieu où trouvé |
Quelqu'un a t il une solution ?
Merci d'avance
Comments
Bonjour @Franck Hanotin ,
Le plus simple est de passer par une custom class query, je vais vous mettre un exemple avec vos données
dans un prochain commentaire .
Voilà @Franck Hanotin ,
Vous pouvez créer une custom class query comme ceci :
Class dc.Frank
{
Query QueryAFO() As%Query(ROWSPEC = "key1:%String,key2:%String,key3:%String,key4:%String,key5:%String,key6:%String,datavalue:%String") [ SqlProc ]
{
}
ClassMethod QueryAFOExecute(ByRef qHandle As%Binary) As%Status
{
Set qHandle("node") = $Name(^AFO)
Quit$$$OK
}
ClassMethod QueryAFOFetch(
ByRef qHandle As%Binary,
ByRef Row As%List,
ByRef AtEnd As%Boolean) As%Status [ PlaceAfter = QueryAFOExecute ]
{
Set sc = $$$OKSet qHandle("node") = $Query(@qHandle("node"), 1, data)
If qHandle("node") = ""Set Row = "", AtEnd = $$$YESQuit$$$OK; alimente les champs key x sur base des subscripts de la globalFor i=1:1:$QLength(qHandle("node")) Set$List(Row, i) = $QSubscript(qHandle("node"), i)
If i < 6 { ; si nous n'avons pas 6 subscripts, on alimente le reste avec une chaine videForj = i+1:1:6Set$List(Row, j) = ""
}
Set$List(Row, 7) = data, AtEnd = $$$NOQuit sc
}
ClassMethod QueryAFOClose(ByRef qHandle As%Binary) As%Status [ PlaceAfter = QueryAFOExecute ]
{
Kill qHandle Quit$$$OK
}
/// juste pour quelques data de testsClassMethodset()
{
s^AFO("Site","Ville")="66722,3743"s^AFO("Site","Ville","111BB","OBT")=",MMM,XXX,"s^AFO("Site","Ville","111OW","OBT")=",XXX,MMM,"s^AFO("Site","Ville","AANVRBIBS","zzz") = "1^^1"s^AFO("Site","Ville","AANVRBIBS","zzz","*","dut") = "*afhalen waar gevonden"s^AFO("Site","Ville","AANVRBIBS","zzz","*","eng") = "*Pickup where found"s^AFO("Site","Ville","AANVRBIBS","zzz","*","fre") = "*Lieu où trouvé"
}
}
Vous pourrez ensuite facilement l'exploiter avec la requête suivante :
select *
from dc.Frank_QueryAFO()
En mode terminal, vous pouvez aussi simplement utiliser cette ligne pour afficher les résultats :
Do##class(dc.Frank).QueryAFOFunc().%Display()De mon coté, j'ai effectué le test sur IRIS 2023.2, il ne devrait pas y avoir d'incompatibilité, mais si toutefois vous constatez un problème n'hésitez pas à répondre avec le message d'erreur.
Bonjour Lorenzo Scalese
Merci pour cette réponse qui fonctionne parfaitement.
Franck
Ravi que cette proposition ait pu vous aider @Franck Hanotin
Bonjour Franck,
une autre façon consiste à définir un mapping utilisant le SQLStorage (comme nous avions commence à l'explorer ensemble).
Même si Lorenzo t'a déjà donné la solution avec $Query, à toute fin utile pour d'autres cas, je t'invite à consulter les articles de @Brendan Bannon
as tu déjà essayé Global-dump-to-SQL
c'est présenté ici Show Global by SQL SELECT
Bonjour @Franck Hanotin
en utilisant un paramètre, tu peux utiliser le même code sur plusieurs globales :
Class dc.axiell
{
Query data(globalName As %String) As %Query(ROWSPEC = "key1:%String,key2:%String,key3:%String,key4:%String,key5:%String,key6:%String,datavalue:%String") [ SqlProc ]
{
}
ClassMethod dataExecute(ByRef qHandle As %Binary, globalName As %String) As %Status
{
Set qHandle("node") = globalName
Quit $$$OK
}
ClassMethod dataFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Boolean) As %Status [ PlaceAfter = dataExecute ]
{
Set sc = $$$OK
Set qHandle("node") = $Query(@qHandle("node"), 1, data)
If qHandle("node") = "" Set Row = "", AtEnd = $$$YES Quit $$$OK
; feeds the key x fields based on the subscripts of the global
For i=1:1:$QLength(qHandle("node")) Set $List(Row, i) = $QSubscript(qHandle("node"), i)
If i < 6 { ; if we do not have 6 subscripts, we feed the rest with an empty string
For j = i+1:1:6 Set $List(Row, j) = ""
}
Set $List(Row, 7) = data, AtEnd = $$$NO
Quit sc
}
ClassMethod dataClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = dataExecute ]
{
Kill qHandle Quit $$$OK
}
/// just for some test data
ClassMethod set() As %Status
{
set sc = $$$OK
kill ^AFO
s ^AFO("Site","Ville")="66722,3743"
s ^AFO("Site","Ville","111BB","OBT")=",MMM,XXX,"
s ^AFO("Site","Ville","111OW","OBT")=",XXX,MMM,"
s ^AFO("Site","Ville","AANVRBIBS","zzz") = "1^^1"
s ^AFO("Site","Ville","AANVRBIBS","zzz","*","dut") = "*afhalen waar gevonden"
s ^AFO("Site","Ville","AANVRBIBS","zzz","*","eng") = "*Pickup where found"
s ^AFO("Site","Ville","AANVRBIBS","zzz","*","fre") = "*Lieu où trouvé"
kill ^AAA
s ^AAA(1,2)="66722,3743"
s ^AAA(1,2,"3","4") =",MMM,XXX,"
s ^AAA(1,2,"4","5") =",XXX,MMM,"
s ^AAA(1,2,3,4) = "1^^1"
s ^AAA(1,2,3,4,"*","dut") = "*afhalen waar gevonden"
s ^AAA(1,2,3,4,"*","eng") = "*Pickup where found"
s ^AAA(1,2,3,4,"*","fre") = "*Lieu où trouvé"
kill ^BBB
s ^BBB("en") ="Hello"
s ^BBB("en","sub") ="World"
s ^BBB(1,2,3) ="BBB"
s ^BBB(1,2,3,4) = "BBB^^BBB"
kill ^CCC
s ^CCC("fr") ="Bonjour"
s ^CCC("fr","sub") ="la Communauté"
s ^CCC(1,2,3,"QUATRE","CINQ","SIX") ="6"
s ^CCC(1,2,3,4,"5","6") ="6"
s ^CCC("UN","DEUX","TROIS") ="3"
return sc
}
}
IRISAPP>:sql
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]IRISAPP>>select * from dc.axiell_data('^AFO')
34. select * from dc.axiell_data('^AFO')
key1 key2 key3 key4 key5 key6 datavalue
Site Ville 66722,3743
Site Ville 111BB OBT ,MMM,XXX,
Site Ville 111OW OBT ,XXX,MMM,
Site Ville AANVRBIBS zzz 1^^1
Site Ville AANVRBIBS zzz * dut *afhalen waar gevonden
Site Ville AANVRBIBS zzz * eng *Pickup where found
Site Ville AANVRBIBS zzz * fre *Lieu où trouvé
7 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0003s/4/139/0ms
execute time(s)/globals/cmds/disk: 0.0023s/11/3,294/0ms
query class: %sqlcq.IRISAPP.cls59
---------------------------------------------------------------------------
[SQL]IRISAPP>>select * from dc.axiell_data('^AAA')
35. select * from dc.axiell_data('^AAA')
key1 key2 key3 key4 key5 key6 datavalue
1 2 66722,3743
1 2 3 4 1^^1
1 2 3 4 * dut *afhalen waar gevonden
1 2 3 4 * eng *Pickup where found
1 2 3 4 * fre *Lieu où trouvé
1 2 4 5 ,XXX,MMM,
6 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0002s/4/139/0ms
execute time(s)/globals/cmds/disk: 0.0014s/10/3,099/0ms
query class: %sqlcq.IRISAPP.cls59
---------------------------------------------------------------------------
[SQL]IRISAPP>>select * from dc.axiell_data('^BBB')
36. select * from dc.axiell_data('^BBB')
key1 key2 key3 key4 key5 key6 datavalue
1 2 3 BBB
1 2 3 4 BBB^^BBB
en Hello
en sub World
4 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0003s/4/139/0ms
execute time(s)/globals/cmds/disk: 0.0045s/8/2,702/0ms
query class: %sqlcq.IRISAPP.cls59
---------------------------------------------------------------------------
[SQL]IRISAPP>>select * from dc.axiell_data('^CCC')
37. select * from dc.axiell_data('^CCC')
key1 key2 key3 key4 key5 key6 datavalue
1 2 3 4 5 6 6
1 2 3 QUATRE CINQ SIX 6
UN DEUX TROIS 3
fr Bonjour
fr sub la Communauté
5 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0002s/4/139/0ms
execute time(s)/globals/cmds/disk: 0.0018s/9/2,899/0ms
query class: %sqlcq.IRISAPP.cls59
---------------------------------------------------------------------------
[SQL]IRISAPP>>q
IRISAPP>