在Global中搜索字符串

时间:2016-03-18 20:31:59

标签: intersystems-cache mumps

我试图找出遍历全球的最佳方式是我所写的。

s X="^ZNAME"
r !,"Please insert a name or a portion of a name: ",str
d {
      s X=$Q(@X) Q:X=""
      i X[str!(@X[str) 
      {
          w !,X
      }
  } While X'=""
q

如果名称或部分名称与全局名称或部分匹配,则会收到以下结果^ZName(subscript)。你们建议什么是提取下标的最佳方法?我在考虑$E$P,但我认为它不够具体。此外,如果有任何额外的书籍或网站可以很好地指导M,我很想知道并非常感激。感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

首先,您应该查看官方文档,它可以通过托盘中的多维数据集在菜单中找到。然后你应该看看你在这里使用的$QUERY和$ ORDER。因此,这两个功能之间存在很大差异。 $ Query用于全局扫描全局,而$ Order仅用于一个级别。如果您仍想通过$ Query进行扫描,可以查看$QSubscript函数,它可以帮助您获取特定下标的值。
使用$ order,它可能看起来如此

set index=""
for { 
  set index=$order(@X@(index))
  quit:index=""

  write !,index

  // and for next level
  set index2=""
  for {
    set index2=$order(@X@(index, index2))
    quit:index2

    write !?5,index2
  }
}

此外,您可能会在新的Developer Community门户中找到有趣的内容。并获得InterSystems的一些在线课程here

答案 1 :(得分:2)

%Global类中有Find个查询。查询返回包含FindWhat的节点,每行一个节点,有四列,即名称,值,名称格式和值格式。 使用##Class(%Library.Utility).Replace将ReplaceWhat替换为ReplaceWith。

NameFormat:

  1. 字符串格式,这是下标未改变的值
  2. 缓存格式,该值已转换为缓存表示以便于查看,例如,不显示二进制值,列表显示为'$ lb(1,“test”)'。此格式适合作为$ name。
  3. 的参数

    ValueFormat:

    1. 字符串格式,这是未更改的值
    2. 缓存格式,该值已转换为缓存表示以便于查看,例如,而不是显示二进制值,列表显示为'$ lb(1,“test”)'。
    3. 在输出时,名称格式和值格式可以采用第三个值,即3,表示“不可编辑”。由于该数据长度的问题,不能显示所有数据,因此显示一部分。

答案 2 :(得分:0)

SEARCH(where,what)
        ; Search string in a Global or Array
        I $G(where)="" Q
        I $G(what)="" Q
        F  S where=$Q(@where) Q:where=""  D
        .       I ((where[what)!(@where[what)) D
        ..              W where,"=",@where,!
        ..              W $E(where,$F(where,"("),$L(where)-1),!
        Q

要提取下标(键或键,因为多个可以存在),我会使用$ E和$ F,因为当"("或")"是下标的一部分。

W $E(where,$F(where,"("),$L(where)-1)

在GTM上测试过。

正常输入:

GTM>ZWR ^ZNAME
^ZNAME("first,last")="Second Street"
^ZNAME("name,surname")="First Street"

GTM>D SEARCH^ZZTEST("^ZNAME","last")
^ZNAME("first,last")=Second Street
"first,last"

GTM>D SEARCH^ZZTEST("^ZNAME","Street")
^ZNAME("first,last")=Second Street
"first,last"
^ZNAME("name,surname")=First Street
"name,surname"

GTM>D SEARCH^ZZTEST("^ZNAME(""first,last"")","Street")
^ZNAME("name,surname")=First Street
"name,surname"

GTM>D SEARCH^ZZTEST("^ZNAME",",sur")
^ZNAME("name,surname")=First Street
"name,surname"

作为奖励,您还可以使用它来搜索本地数组:

GTM>ZWR ARRAY
ARRAY(1)="Apple"
ARRAY(1,1)="Apple pie"
ARRAY(2)="Orange"

GTM>D SEARCH^ZZTEST("ARRAY","Apple")
ARRAY(1)=Apple
1
ARRAY(1,1)=Apple pie
1,1

GTM>D SEARCH^ZZTEST("ARRAY","pie")
ARRAY(1,1)=Apple pie
1,1

无效输入没问题:

GTM>K ARRAY

GTM>D SEARCH^ZZTEST("ARRAY","Apple")

GTM>D SEARCH^ZZTEST("ARRAY","")

GTM>D SEARCH^ZZTEST("ARRAY",)

GTM>D SEARCH^ZZTEST("ARRAY")

GTM>D SEARCH^ZZTEST()

GTM>D SEARCH^ZZTEST("^ZDOESNOTEXIST")

处理"("和")"在下标中:

GTM>ZWR ARRAY
ARRAY("()")=1
ARRAY("1(")=1
ARRAY("1()")="Orange"
ARRAY("1)")="Apple"

GTM>D SEARCH^ZZTEST("ARRAY","()")
ARRAY("()")=1
"()"
ARRAY("1()")=Orange
"1()"

GTM>D SEARCH^ZZTEST("ARRAY","Apple")
ARRAY("1)")=Apple
"1)"