2016-03-18 182 views
0

我想弄清楚下面遍历全局的最佳方法是我写的。在全局搜索一个字符串

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方面做得很好,我很乐意知道并非常感激。感谢您的帮助。

回答

2

首先您应该查看官方文档,它可以在托盘中的立方体菜单中使用。然后你应该看看你在这里使用的$QUERY和$ ORDER。所以,这两个功能都有很大的区别。 $ Query用于全面扫描全局,而$ Order仅用于一个级别。如果你仍然想用$ Query进行扫描,你可以看看$QSubscript函数,这可能会帮助你获得特定下标的值。
有$秩序,它可能看起来很

set index="" 
for { 
    set index=$order(@[email protected](index)) 
    quit:index="" 

    write !,index 

    // and for next level 
    set index2="" 
    for { 
    set index2=$order(@[email protected](index, index2)) 
    quit:index2 

    write !?5,index2 
    } 
} 

此外,你可能会发现一些有趣的事情在新Developer Community门户。并通过InterSystems here获得一些在线课程。

+0

非常感谢你们!从来不知道编程可能非常有趣。我迫不及待想要变得更加先进。 –

2

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

NameFormat:

  1. 字符串格式,这是下标保持不变
  2. 缓存格式的值,该值已经被转换成便于查看高速缓存表示,例如,而不是示出的二进制值列表显示为'$ lb(1,“test”)'。这种格式适合作为$ name的参数。

ValueFormat:

  1. 字符串格式,这是不变的
  2. 缓存格式的值,该值已经被转换成便于查看高速缓存表示,例如,而不是示出的二进制值的列表显示为'$ lb(1,“test”)'。

在输出上,名称格式和值格式可以假设第三个值,即3,表示“不可编辑”。由于这些数据的长度问题,并不是所有数据都可以显示,因此会显示一部分数据。

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