美文网首页
第五十五章 Caché 函数大全 $QUERY 函数

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

作者: Cache技术分享 | 来源:发表于2020-10-15 08:53 被阅读0次

第五十五章 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)
...

相关文章

网友评论

      本文标题:第五十五章 Caché 函数大全 $QUERY 函数

      本文链接:https://www.haomeiwen.com/subject/huknpktx.html