Easy to do that.
Here's how.
First of all let's find out where we do the iteration. If we open UtilExpGlobalView.csp we see that it's essentially a wrapper over %CSP.UI.System.GlobalViewPane.
In %CSP.UI.System.GlobalViewPane there's a LoadGlobal method which has this promising line:
Set tRS = ##class(%ResultSet).%New("%Global:Get")Next we follow the trail to %Library.Global class implementing Get query, which has GetFetch method, which actually iterates over the global here:
Set idx=$Order($$$ISCQUERYTEMP(Index,idx),1,Row)So now we wrap it up back.
We need a new query (GetFetch is copied as is with one change - inverse iteration order, bolded):
Test.Global class
Class Test.Global Extends %Global
{
ClassMethod GetFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ Internal, PlaceAfter = GetExecute ]
{
Set $zt="ERROR"
Set idx=$p(qHandle,"^",2)
Set Index=$p(qHandle,"^")
Set idx=$Order($$$ISCQUERYTEMP(Index,idx),-1,Row)
If idx="" {
Set Namespace=qHandle("Namespace")
Set SearchMask=qHandle("SearchMask")
Set LastNode=qHandle("LastNode")
Set NameFormat=qHandle("NameFormat")
Set ValueFormat=qHandle("ValueFormat")
Set OldNsp=$zu(5),%UI="CHUI",Count=100
If Namespace'=OldNsp ZN Namespace
Set data=$$page^%Wgdisp(SearchMask,LastNode,.Count,0,"","",1,NameFormat,ValueFormat)
If $zu(5)'=OldNsp ZN OldNsp
If 'Count Set AtEnd=1,Row="" Quit $$$OK
;
Kill $$$ISCQUERYTEMP(Index)
For i=1:1:Count {
Set rec=$p(data,$$$del1,i),subs=$p(rec,$$$del2),val=$p(rec,$$$del2,2)
Set nf=$p(rec,$$$del2,3),vf=$p(rec,$$$del2,4)
#;SML618+
#;Setup ^CacheTemp with a subroutine in case it overflows the $LB() list.
d BuildCacheTemp
#;SML618-
}
Set qHandle("LastNode")=..Unquote(subs,1)
Set qHandle=Index_"^"
Quit ..GetFetch(.qHandle,.Row,.AtEnd)
} Else {
#;SML618+
#;If there is extension of data then set them to Row array for %ResultSet to get them.
if $d($$$ISCQUERYTEMP(Index,idx,1)) {
Set Row(1)=$$$ISCQUERYTEMP(Index,idx,1)
if $d($$$ISCQUERYTEMP(Index,idx,2)) {
Set Row(2)=$$$ISCQUERYTEMP(Index,idx,2)
}
}
#;SML618-
Set qHandle=Index_"^"_idx
}
Quit $$$OK
ERROR Set $zt=""
If $g(OldNsp)'="",$zu(5)'=$g(OldNsp) ZN OldNsp
Quit $$$ERROR($$$CacheError,$ze)
#;SML618+
#;Set the data extension to two or three pieces if it could not fit in one piece.
BuildCacheTemp s $zt="BuildErr1"
i subs["(" {
s sub1="("_$p(subs,"(",2,999)
} else {
s sub1=""
}
s Perm=$s(qHandle("GetPermissions")=0:"",1:$$GetGlobalPermission^%SYS.SECURITY(Namespace,$p(subs,"(",1),sub1,1))
Set $$$ISCQUERYTEMP(Index,i)=$lb(subs,val,nf,vf,Perm)
Q
BuildErr1 s $zt="BuildErr2"
Set $$$ISCQUERYTEMP(Index,i)=$lb(subs,$e(val,1,$l(val)\2),nf,vf,$g(Perm))
Set $$$ISCQUERYTEMP(Index,i,1)=$lb("",$e(val,$l(val)\2+1,$l(val)),"","","")
Q
BuildErr2 s $zt=""
Set $$$ISCQUERYTEMP(Index,i)=$lb(subs,$e(val,1,$l(val)\3),nf,vf,$g(Perm))
Set $$$ISCQUERYTEMP(Index,i,1)=$lb("",$e(val,$l(val)\3+1,$l(val)\3*2),"","","")
Set $$$ISCQUERYTEMP(Index,i,2)=$lb("",$e(val,$l(val)\3*2+1,$l(val)),"","","")
Q
#;SML618-
}
}Now we wrap it into a pane
Test.GlobalViewPane
And finally create a csp page
UtilExpGlobalViewR.csp
<Pane name="Title" type="%CSP.Util.SMTitlePane">
<Text>View Global Data</Text>
</Pane>
<Pane name="Detail" type="Test.GlobalViewPane">
</Pane>
</AutoPage>
And done, add R to URL and see the global in reverse in SMP:

- Log in to post comments

