在全局中搜索 A 字符串



我试图找出遍历全局的最佳方法。

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,我很想知道并非常感谢。谢谢你们的帮助。

首先,您应该查看官方文档,它可以在托盘中的立方体菜单中找到。然后你应该看看你在这里使用的$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
  }
}

此外,你可能会在新的开发人员社区门户中找到一些有趣的内容。并在此处获取InterSystems的一些在线课程。

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

名称格式:

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

值格式:

  1. 字符串格式,这是未更改的值
  2. 缓存格式,该值
  3. 已转换为缓存表示形式以便于查看,例如,列表显示为"$lb(1,"test")",而不是显示二进制值。

在输出时,名称格式和值格式可能采用第三个值,即 3,这意味着"不可编辑"。由于此数据的长度问题,无法显示所有数据,因此显示一部分。

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

相关内容

  • 没有找到相关文章

最新更新