第四十七章 Caché 函數大全 $ORDER 函數 第四十七章 Caché 函數大全 $ORDER 函數 大綱 描述 示例 注意

第四十七章 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)開始。然後,它按排序順序遍歷所有在其後定義的局部變量。爲了避免列出變量footarget,這些變量被定義爲進程專用全局變量,而不是局部變量:

/// 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"

ORDER和DOUBLE下標

$DOUBLE浮點數可用作下標標識符。但是,當用作下標標識符時,$DOUBLE數字將轉換爲字符串。 $ORDER返回此類型的下標時,將其作爲數字字符串而不是$DOUBLE浮點數返回。

ORDER 和NEXT

$ORDER$NEXT類似。這兩個函數均按整理順序將下一個同級的下標返回到指定節點。但是,$ORDER$NEXT具有不同的開始和失敗代碼,如下所示:

描述 $NEXT $ORDER
起始點 -1 Null string
故障代碼 -1 Null string

因爲$ORDER在空字符串上開始和結束,所以它正確地返回具有負和正下標的節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章