第四十七章 Caché 函數大全 $ORDER 函數
返回下一個局部變量或局部或全局變量的下標。
大綱
$ORDER(variable,direction,target)
$O(variable,direction,target)
參數
- variable 下標的局部,私有進程或全局變量。如果是數組,則需要下標。不能僅指定數組名稱。可以使用間接指定未下標的局部變量。不能將簡單的對象屬性引用指定爲變量。可以使用語法
obj.property
將多維屬性引用指定爲變量。 - direction 可選-下標順序,遍歷目標數組。下標變量的值可以是:1 =下標升序(默認)或–1 =下標降序。對於未下標的局部變量,1(默認值)是唯一允許的值。
- target 可選-返回變量的下一個或上一個節點的當前數據值。下一個還是上一個取決於方向的設置。必須指定方向值才能指定目標。對於未下標的局部變量,必須將方向設置爲1。如果未定義變量,則目標值保持不變。目標參數不能與諸如
^$ROUTINE
之類的結構化系統變量(SSVN)一起使用。
描述
$ORDER
主要用於從指定起點在指定下標級別循環遍歷下標變量。它按整理順序返回順序變量。它允許下標序列中有間隔。
$ORDER
返回的值取決於所使用的參數。
- 如果變量是下標變量,則
$ORDER(variable)
返回下一個定義的下標的編號。返回的下標與爲變量指定的下標處於同一級別。例如,$ORDER(^client(4,1,6))
返回下一個第三級下標。如果變量^client(4,1,7)
存在,則爲7
。 - 如果變量是未下標的局部變量,則
$ORDER(variable)
返回按字母順序排列的下一個定義的局部變量的名稱。例如,$ORDER
將按以下順序返回以下定義的局部變量:a,a0a,a1,a1a,aa,b,bb,c
。 -
$ORDER(variable,direction)
返回變量的下一個或上一個下標。可以將方向指定爲1(下一個,默認值)或–1(上一個)。 - 對於未下標的局部變量,$ORDER僅按方向1(下一個)順序返回變量。不能將方向指定爲-1(先前);嘗試這樣做會導致 <FUNCTION>錯誤。
-
$ORDER(variable,direction,target)
返回變量的下標,並將target設置爲其當前數據值。下標變量可以是下一個或上一個下標,具體取決於方向設置。對於未下標的局部變量,必須將direction設置爲1才能將當前數據值返回給目標。目標參數不能與諸如^$ROUTINE
之類的結構化系統變量(SSVN)一起使用。ZBREAK
命令無法將目標參數指定爲觀察點。
第一個下標返回
可以使用指定變量後的變量或第一個變量啓動$ORDER
循環:
- 從指定點開始
SET key=$ORDER(^mydata(99))
返回99 -下標100之後的下一個更高的下標(如果存在)。請注意,在參數(此處爲下標99)中指定的節點不必存在。要返回所有正下標,可以指定SET key=$ORDER(^mydata(-1))
。要返回所有負下標,可以指定SET key=$ORDER(^mydata(0),-1)
。 - 從頭開始:
SET key=$ORDER(^mydata(""))
返回排序規則序列中的第一個下標變量。如果水平可能包含負下標和正下標,則需要此技術。
下面的示例按升序返回負一級正標和負一級正標。
/// d ##class(PHA.TEST.Function).ORDER()
ClassMethod ORDER()
{
SET mydata(1)="a",mydata(-3)="C",mydata(5)="e",mydata(-5)="E"
// Get first subscript
SET key=$ORDER(mydata(""))
WHILE (key'="") {
WRITE key,!
// Get next subscript
SET key = $ORDER(mydata(key))
}
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER()
-5
-3
1
5
當$ORDER
到達給定級別的下標末尾時,它將返回一個空字符串(“”
)。如果在循環中使用$ORDER
,則代碼應始終包含對此值的測試。
可以使用$ORDER
返回定義的局部變量的有限子集。可以使用無參數WRITE
顯示所有定義的局部變量。
示例
此處顯示的示例返回局部變量。 $ORDER
還可以返回下標的全局變量和下標的進程專用全局變量。
以下示例在WHILE
循環中使用$ORDER
返回mydata(n)
全局變量中的所有第一級下標:
/// d ##class(PHA.TEST.Function).ORDER1()
ClassMethod ORDER1()
{
SET mydata(1)="a",mydata(3)="c",mydata(7)="g"
// Get first subscript
SET key=$ORDER(mydata(""))
WHILE (key'="") {
WRITE key,!
// Get next subscript
SET key = $ORDER(mydata(key))
}
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER1()
1
3
7
以下示例在WHILE
循環中使用$ORDER返回mydata(1,n)
全局變量中的所有第二級下標。請注意,將忽略第一級和第三級下標。本示例同時返回下標編號和相應的變量值:
/// d ##class(PHA.TEST.Function).ORDER2()
ClassMethod ORDER2()
{
SET mydata(1,1)="a",mydata(1,3)="c",mydata(1,3,1)="lcase",mydata(1)="A",mydata(1,7)="g"
SET key=$ORDER(mydata(1,""),1,target)
WHILE (key'="") {
WRITE key," = ",target,!
// Get next subscript
SET key = $ORDER(mydata(1,key),1,target)
}
}
DHC-APP> d ##class(PHA.TEST.Function).ORDER2()
1 = a
3 = c
7 = g
在以下示例中,多維屬性用作變量值。本示例將所有定義的名稱空間的名稱返回給目標參數:
/// d ##class(PHA.TEST.Function).ORDER3()
ClassMethod ORDER3()
{
SET obj = ##class(%ResultSet).%New("%SYS.Namespace:List")
DO obj.Execute()
SET target="blank", x=""
WHILE target'="" {
DO obj.Next()
SET rval=$ORDER(obj.Data(x),1,target)
IF rval="Nsp",target'="" {
WRITE "Namespace: ",target,!
} ELSE {
WRITE !,"Done!" RETURN
}
}
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER3()
Namespace: %SYS
Namespace: DHC-APP
Namespace: DHC-CHSSWEB
Namespace: DHC-CSM
Namespace: DHC-DATA
Namespace: DHC-DWR
Namespace: DHC-EKG
Namespace: DHC-HEIS
Namespace: DHC-HR
Namespace: DHC-LISDATA
Namespace: DHC-LISSRC
Namespace: DHC-MEDSRC
Namespace: DHC-MRQ
Namespace: DOCBOOK
Namespace: FDBMS
Namespace: PACS
Namespace: PIS
Namespace: RIS
Namespace: SAMPLES
Namespace: USER
Done!
下面的示例在WHILE
循環中使用$ORDER
返回未下標的局部變量。局部變量按整理順序返回。本示例同時返回本地變量名稱及其值。請注意,在遍歷未下標的局部變量時,必須使用@
間接運算符。本示例以排序規則序列中b
之後的下一個局部變量(在本例中爲bminus)開始。然後,它按排序順序遍歷所有在其後定義的局部變量。爲了避免列出變量foo
和target
,這些變量被定義爲進程專用全局變量,而不是局部變量:
/// d ##class(PHA.TEST.Function).ORDER4()
ClassMethod ORDER4()
{
SET a="great",b="good",bminus="pretty good",c="fair",d="poor",f="failure"
SET ^||foo="b"
SET ^||foo=$ORDER(@^||foo,1,^||target)
WHILE ^||foo '= "" {
WRITE ^||foo," = ",^||target,!
SET ^||foo=$ORDER(@^||foo,1,^||target)
}
}
注意
使用$ORDER
$ORDER
通常與循環處理一起使用,以遍歷不使用連續整數下標的數組中的節點。 $ORDER
僅返回下一個現有節點的下標。例如:
/// d ##class(PHA.TEST.Function).ORDER5()
ClassMethod ORDER5()
{
SET struct=""
FOR {
SET struct=$ORDER(^client(struct))
QUIT:struct=""
WRITE !,$d(^client(struct))
}
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER5()
10
11
11
10
上面的例程爲^client
全局數組中的所有頂級節點寫入值。
$ORDER
返回現有節點的下標,但並非所有節點都包含值。如果在循環中使用$ORDER
來提供需要數據的命令(例如WRITE
),則必須包括$DATA
檢查無值節點。例如,可以在前一個示例中使用後置條件測試來指定WRITE
命令,如下所示:
WRITE:($DATA(^client(struct))#10) !,^client(struct)
/// d ##class(PHA.TEST.Function).ORDER5()
ClassMethod ORDER5()
{
SET struct=""
FOR {
SET struct=$ORDER(^client(struct))
QUIT:struct=""
WRITE:($DATA(^client(struct))#10) !,^client(struct)
}
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER5()
Vermont
John Jones
該測試涵蓋了無值指針節點和無值終端節點的情況。如果代碼對於簡單的FOR
循環而言過於繁瑣,則可以將其一部分委託給塊結構的DO
。
全局變量引用
如果一個變量是全局變量,它可以包含一個擴展的全局引用,在不同的命名空間中指定一個全局。如果指定了一個不存在的命名空間,Caché會發出一個<namespace>
錯誤。如果指定了一個沒有權限的命名空間,InterSystems IRIS會發出一個<PROTECT>
錯誤,後跟全局名稱和數據庫路徑,如下所示:<protect> ^myglobal(1),c:\intersystems\iris\mgr\.
如果全局變量的下標映射到用戶沒有讀取權限的命名空間,則<PROTECT>
錯誤信息會顯示原始全局引用,因爲在沒有權限的命名空間中看不到下標。但是,<PROTECT>
錯誤數據庫路徑顯示的是受保護的數據庫,而不是原始數據庫。
如果變量是下標的全局變量,它可以是裸全局引用。裸全局引用是在沒有數組名稱的情況下指定的,並且指定最近執行的全局引用。例如:
/// d ##class(PHA.TEST.Function).ORDER6()
ClassMethod ORDER6()
{
s ^client(4,5)="4,5"
SET var1=^client(4,5)
SET var2=$ORDER(^(""))
WRITE "var1=",var1,!,"var2=",var2
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER6()
var1=4,5
var2=1
第一個SET
命令建立當前的全局參考,包括參考的下標級別。 $ORDER
函數使用裸全局引用返回該級別的第一個下標。例如,如果定義了下標全局,它將返回值1,表示^client(4,1)
。如果未定義^client(4,1)
,它將返回值2,指示是否定義了下標全局變量^client(4,2)
,依此類推。
$ORDER
的所有三個參數都可以採用裸全局引用,也可以指定全局引用。但是,如果direction指定了顯式全局引用,則後續的裸全局引用將不使用該方向全局引用。他們繼續使用先前建立的全局引用,如以下示例所示:
/// d ##class(PHA.TEST.Function).ORDER7()
ClassMethod ORDER7()
{
k client
SET ^client(4,3)="Jones"
SET ^client(4,5)="Smith"
SET ^dir(1)=-1
SET rtn=$ORDER(^client(4,5),-1)
WRITE $ZREFERENCE,!
/* naked global ref is ^client(4,5) */
SET rtn=$ORDER(^client(4,5),^dir(1))
WRITE $ZREFERENCE,!
/* NOTE: naked global ref is ^client(4,5) */
SET rtn=$ORDER(^client(4,5),^dir(1),^(1))
WRITE $ZREFERENCE,!
/* NOTE: naked global ref is ^client(4,1) */
WRITE ^client(4,1),!
SET rtn=$ORDER(^client(4,5),^dir(1),^targ(1))
WRITE $ZREFERENCE,!
/* naked global ref is ^targ(1) */
WRITE ^targ(1),!
SET ^rtn(1)=$ORDER(^client(4,5),^dir(1),^targ(2))
WRITE $ZREFERENCE,!
/* naked global ref is ^rtn(1) */
WRITE ^targ(2)
b
}
DHC-APP>d ##class(PHA.TEST.Function).ORDER7()
^client(4,3)
^client(4,3)
^client(4,1)
Jones
^targ(1)
Jones
^rtn(1)
Jones
b }
^
<BREAK>zORDER7+23^PHA.TEST.Function.1
DHC-APP 2d1>zw ^client
^client(4,1)="Jones"
^client(4,3)="Jones"
^client(4,5)="Smith"
DHC-APP 2d1>zw ^dir
^dir(1)=-1
DHC-APP 2d1>zw ^targ
^targ(1)="Jones"
^targ(2)="Jones"
DOUBLE下標
$DOUBLE
浮點數可用作下標標識符。但是,當用作下標標識符時,$DOUBLE
數字將轉換爲字符串。 $ORDER
返回此類型的下標時,將其作爲數字字符串而不是$DOUBLE
浮點數返回。
NEXT
$ORDER
與$NEXT
類似。這兩個函數均按整理順序將下一個同級的下標返回到指定節點。但是,$ORDER
和$NEXT
具有不同的開始和失敗代碼,如下所示:
描述 | $NEXT |
$ORDER |
---|---|---|
起始點 | -1 | Null string |
故障代碼 | -1 | Null string |
因爲$ORDER
在空字符串上開始和結束,所以它正確地返回具有負和正下標的節點。