<center> 第十八章 Caché 函數大全 $GET 函數
返回指定變量的數據值。
大綱
$GET(variable,default)
$G(variable,default)
Parameters
- variable 下標或未下標的局部變量,全局變量或進程專用全局變量。該變量可能是未定義的。可以使用
obj.property
語法將變量指定爲多維對象屬性。 - default 可選-如果變量未定義,則返回的值。如果是變量,則必須定義。
描述
$GET
返回指定變量的數據值。未定義變量的處理取決於是否指定默認參數。
-
$GET(variable)
返回指定變量的值,如果變量未定義,則返回空字符串。變量參數值可以是任何變量的名稱,包括帶下標的數組元素(局部變量或全局變量)。 -
$GET(variable,default)
提供一個默認值,如果變量未定義,則返回該值。如果定義了變量,則$GET
返回其值。
DHC-APP>w $g(a,"asc")
asc
參數
variable
要返回其數據值的變量。
- 變量可以是局部變量,全局變量或進程專用全局(PPG)變量。它可以下標或不下標。
該變量不需要是定義的變量。$GET
返回未定義變量的空字符串;它不定義該變量。可以定義變量並將其設置爲空字符串(“”
)。如果是全局變量,則它可以包含擴展的全局引用。如果是帶下標的全局變量,則可以使用裸全局引用指定它。即使在引用未定義的下標全局變量時,變量也會重置裸指示符,從而影響將來的裸全局引用,如下所述。
- 變量可以是多維對象屬性,不能是非多維對象屬性。嘗試在非多維對象屬性上使用
$GET
會導致<Object Dispatch>
錯誤。
$GET
無法返回代理對象屬性的屬性值。相反,Caché會發出一條消息,指出指定的屬性不存在。此屬性訪問限制對於類%ZEN.proxyObject
是唯一的,該類在InterSystems類參考中定義。
default
未定義變量時要返回的數據值。它可以是任何表達式,包括局部變量或全局變量,帶下標或不帶下標。如果是全局變量,則它可以包含擴展的全局引用。如果是帶下標的全局變量,則可以使用裸全局引用指定它。如果存在,DEFAULT將重置裸指示器,從而影響將來的裸全局引用,如下所述。
如果DEFAULT是一個未定義的變量,則默認情況下,$GET
會發出<UNDEFINED>
錯誤,即使定義了變量也是如此。通過設置%SYSTEM.Process.Unfined()
方法,可以更改Caché行爲,使其在引用未定義變量時不會生成<UNDEFINED>
錯誤。如果unfined()
方法設置爲不生成<UNDEFINED>
錯誤,則當默認值爲unfined時,$GET
將返回變量。
示例
在下面的示例中,定義了變量test
,而未定義變量xtest
。(使用ZWRITE
命令是因爲它顯式返回NULL
字符串值。)
/// d ##class(PHA.TEST.Function).Get()
ClassMethod Get()
{
KILL xtest
SET test="banana"
SET tdef=$GET(test),tundef=$GET(xtest)
ZWRITE tdef ; $ GET測試的返回值
ZWRITE tundef ; $ GET爲xtest返回空字符串
WRITE !,$GET(xtest,"none")
; $ GET返回未定義變量的默認值“ none”
}
DHC-APP>d ##class(PHA.TEST.Function).Get()
tdef="banana"
tundef=""
none
在以下示例中,將多維屬性用作變量值。本示例返回所有定義的名稱空間的名稱:
/// d ##class(PHA.TEST.Function).Get1()
ClassMethod Get1()
{
SET obj = ##class(%ResultSet).%New("%SYS.Namespace:List")
DO obj.Execute()
WRITE !,$GET(obj.Data,"none") // returns "none"
SET x=1
WHILE x'="" {
DO obj.Next()
SET x=$GET(obj.Data("Nsp"))
IF x'="" {
WRITE !,"Namespace: ",x }
}
WRITE !,"Done!"
}
DHC-APP>d ##class(PHA.TEST.Function).Get1()
none
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!
類似的程序使用$DATA
函數返回相同的信息。
注意
DATA相比
$GET
爲未定義變量($DATA = 0
)和爲無數據的向下指針的數組節點($DATA = 10
)提供了$DATA
測試的替代方法。如果變量是未定義的或沒有數據的指針數組節點,則$GET
返回空字符串(“”
),而不會出現未定義的錯誤。例如,可以重新編碼以下行:
IF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
或
IF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
請注意,$DATA
測試比$GET
測試更具體,因爲它們使能夠區分未定義元素和僅是向下指針的元素。例如,這些行:
IF $DATA(^client(i))=0 { QUIT }
ELSEIF $DATA(^client(i))=10 {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
無法重新編碼爲:
IF $GET(^client(i))="" { QUIT }
ELSEIF $GET(^client(i))="" {
WRITE !!,"Name: No Data"
GOTO Level1+3
}
這兩行根據數組元素是未定義的還是沒有數據的向下指針執行不同的操作。如果在這裏使用$GET
,則只會執行第一個動作(QUIT
)。可以將$DATA
用於第一個測試,將$GET
用於第二個測試,但不能反向使用($GET
用於第一個測試,$DATA
用於第二個測試)。
默認值爲SELECT
$GET(variable,default)
允許在未定義指定變量時返回默認值。可以使用$SELECT
函數執行相同的操作。
但是,與$SELECT
不同,$GET
中的第二個參數始終被求值。
如果變量和默認值都使用下標的全局引用並因此都修改了裸指標,則$GET
始終會評估其兩個參數這一事實很重要。因爲參數是按從左到右的順序求值的,所以無論$GET
是否返回默認值,裸指標都設置爲默認的全局引用。
處理未定義的變量
如果指定的變量未定義,$GET
定義處理行爲。如果未定義指定的變量,則$GET
的基本形式將返回一個空字符串(“”
)。
$DATA
測試是否定義了指定的變量。如果變量未定義,則返回0。
可以使用%SYSTEM.Process
類的Undefined()
方法爲每個進程定義所有未定義變量的處理行爲。可以通過設置Config.Miscellaneous
類的Undefined
屬性來建立系統範圍的默認行爲。設置未定義對指定變量的$GET
或$DATA
處理沒有影響。