Question
· Sept 8, 2023

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

Version du produit: Caché 2018.1
Discussion (7)3
Connectez-vous ou inscrivez-vous pour continuer

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 = $$$OK
    Set qHandle("node") = $Query(@qHandle("node"), 1, data)

    If qHandle("node") = "" Set Row = "", AtEnd = $$$YES Quit $$$OK
    ; alimente les champs key x sur base des subscripts de la global
    For 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 vide
        For j = i+1:1:6 Set $List(Row, j) = ""
    }

    Set $List(Row, 7) = data, AtEnd = $$$NO
    Quit sc
}

ClassMethod QueryAFOClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = QueryAFOExecute ]
{
	Kill qHandle Quit $$$OK
}

/// juste pour quelques data de tests
ClassMethod set()
{
    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 @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>