第五十五章 Caché 函数大全 $QUERY 函数

第五十五章 Caché 函数大全 $QUERY 函数

对本地或全局数组执行物理扫描。

大纲

$QUERY(reference,direction,target)
$Q(reference,direction,target)

参数

  • reference 引用,其值为公共局部变量或全局变量的名称(或可选的下标)。不能将简单的对象属性指定为引用。可以使用语法obj.property将多维属性指定为引用。
  • direction 可选-遍历数组的方向。前进= 1,后退= -1。默认值为forward。
  • target 可选-返回参考的当前数据值。

描述

$QUERY对公共本地或全局数组执行物理扫描;它将返回已定义节点的完整引用,名称和下标,然后依次返回到指定数组节点。如果不存在这样的节点,则$QUERY返回空字符串。

参数

reference

此参数必须计算为公共变量或全局变量。 $QUERY无法扫描私有变量。

此参数可以是多维对象属性。它不能是非多维对象属性。尝试在非多维对象属性上使用$QUERY会导致<OBJECT DISPATCH>错误。

返回的全局引用可以与引用参数中指定的级别处于同一级别,更低级别或更高级别。如果指定引用而不指定下标,则$QUERY返回数组中第一个定义的节点。

direction

如果未指定方向,则默认方向为正向。如果要指定方向,则参数值1将向前遍历数组,值-1将向后遍历数组。

target

如果要指定目标,则必须指定方向。如果参考参数中标识的变量未定义,则目标值保持不变。

ZBREAK命令无法将目标参数指定为观察点。

示例

本示例介绍了一个通用例程,用于输出用户指定数组中所有节点的数据值。它可以容纳任意数量级别的数组。该代码执行与示例中$ORDER函数下的代码相同的操作。但是,它不需要6条线,而只需要6条线,并且可以处理的级别数不受限制。

/// d ##class(PHA.TEST.Function).QUERY()
ClassMethod QUERY()
{
    READ !,"Array name: ",ary QUIT:ary=""
    SET queryary=$QUERY(@ary@(""))
    WRITE !,@queryary
    FOR   {
    SET queryary=$QUERY(@queryary) 
        QUIT:queryary=""  
        WRITE !,@queryary
    }
    WRITE !,"Finished."
    QUIT
}
DHC-APP>d ##class(PHA.TEST.Function).QUERY()
 
Array name: ^yx
ADMDATE()2015-03-01()2015-03-03()34!SessionGRP!1^23!gbFlag!0^6!DocSpc!^6!CarPrvTp!^-1()4!0!0^5!1!0^6!0!0()()1^3^4()
ORDDATE$SelectPara!2015-08-23#2015-08-23$ColPara!Null#Null#Null$RowPara!ResDep#AdmType#ALL!AdmType#AdmType#ALL$StatPara!13#数量!14#总费用!15#记帐费用!16#折扣费             用!17#自付费用!26#医嘱数量!31#进货价!67#条码数!68#手术数量!69#药品售价!81#日期进                          货价~~!1~~~~~~~~
Date@1^2015/12/6^2015/12/6^Pat@1^Fee@1^Bill@1^1@^^Stat@1^^0^^^^0^^^^Cfg!!7!23^0^fNod@^^^^1@1
6923450657638#685
132||1#311#4638#1

第一个SET命令使用$QUERY和下标间接寻址来初始化对包含数据的第一个现有节点的全局引用。。 (就像$ORDER一样,$QUERY接受一个空字符串来指定数组中的第一个下标。)第一个WRITE命令输出找到的第一个节点的值。如果省略,则第一个节点将被跳过。

FOR循环中,$QUERY用于检索下一个节点并更新全局引用,然后其内容由WRITE命令输出。后置条件QUIT在找到空字符串(“”)时终止循环,表示$QUERY已到达数组的末尾。

除非希望区分指针节点($DATA = 11)和终端节点($DATA = 1),否则不需要$DATA测试。

注意

使用$QUERY遍历数组

重复使用,$QUERY可以以从左到右,从上到下的方式遍历整个数组,返回定义的节点的整个序列。 $QUERY可以从指定用于参考的下标确定的点开始。它沿水平轴和垂直轴进行。例如:

SET exam=$QUERY(^client(4,1,2))

DHC-APP 2d1>SET exam=$QUERY(^client(4,1,2))
 
DHC-APP 2d1>w exam
^client(4,3)
DHC-APP 2d1>zw ^client
^client(4,1)="Jones"
^client(4,3)="Jones"
^client(4,5)="Smith"
 
DHC-APP 2d1>SET exam=$QUERY(^client(4,3))
 
DHC-APP 2d1>w exam
^client(4,5)

根据此示例,假设使用三级数组,$QUERY可能返回以下任何值:

Value $QUERY函数返回,如果...
^client(4,1,3) 如果^client(4,1,3)存在并且包含数据。
^client(4,2) 如果^client(4,1,3)不存在或不包含数据,并且如果^client(4,2)不存在并且包含数据。
^client(5) 如果^client(4,1,3)^client(4,2)不存在或不包含数据,并且^client(5)确实存在且包含数据。
null string ("") 如果先前的全局引用都不存在或不包含数据; $QUERY已到达数组末尾。

方向值为-1时,$QUERY可以从右到左,从下到上的方式以相反的顺序遍历整个数组。

QUERY与ORDER相比

$QUERY$ORDER函数的不同之处在于$QUERY返回完整的全局引用,而$ORDER仅返回下一个节点的下标。 $ORDER仅沿水平轴前进,跨一级节点。

$QUERY$ORDER的不同之处还在于,它仅选择那些包含数据的现有节点。 $ORDER选择现有节点,而不管它们是否包含数据。 $ORDER对存在进行隐式测试($DATA'= 0),$QUERY对存在和数据执行隐式测试($DATA'= 0$DATA'= 10)。但是请注意,$QUERY不会区分包含数据的指针节点($DATA = 11)和终端节点($DATA = 1)。为了区别起见,必须在代码中包含适当的$DATA测试。

$ORDER一样,$QUERY通常与循环处理一起使用,以遍历不使用连续整数下标的数组中的节点。 $QUERY只是返回带有值的下一个节点的全局引用。 $QUERY提供了非常紧凑的代码来访问全局数组

$NAME$ORDER函数一样,$QUERY可以与裸全局引用一起使用,该裸引用没有指定数组名称,并且指定了最近执行的全局引用。例如:

/// d ##class(PHA.TEST.Function).QUERY1()
ClassMethod QUERY1()
{
   s ^client(1)=1
   SET a=   ^client(1)
   SET x=2
   SET z=$QUERY(^(x))
   w z
}
DHC-APP>d ##class(PHA.TEST.Function).QUERY1()
^client(4,1)
DHC-APP>zw ^client
^client(1)=1
^client(4,1)="Jones"
^client(4,3)="Jones"
^client(4,5)="Smith"
 

第一个SET命令建立当前的全局参考,包括参考的级别。第二个SET命令设置用于下标的变量。 $QUERY函数使用裸全局引用返回^client(2)之后的下一个节点的完整全局引用。例如,返回的值可能是^client(2,1)^client(3)

$QUERY和扩展的全局变量引用

可以使用%SYSTEM.Process类的RefInKind()方法来控制$QUERY是否以每个进程为基础以扩展全局引用形式返回全局引用。可以通过设置Config.Miscellaneous类的RefInKind属性来建立系统范围的默认行为。

先左后右,在上下。

/// d ##class(PHA.TEST.Function).QUERY2()
ClassMethod QUERY2()
{
    s pha="^^DHCPHARW"
    //s pha="^DHCPHARi(""PAPMI"")"
    //s pha="^DHCPHAC"
    for{
        s pha=$QUERY(@pha) 
        w pha,!
        q:pha=""

    }
}
DHC-APP>d ##class(PHA.TEST.Function).QUERY2()
^DHCPHARW(2)
^DHCPHARW(14)
^DHCPHARW(18)
^DHCPHARW(19)
^DHCPHARW(20)
^DHCPHARW(21)
^DHCPHARW(22)
...
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343