在全局中搜索 A 字符串
Searching a Global for A string
我正在尝试找出遍历全局的最佳方法,下面是我所写的内容。
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, which you use here, and $ORDER. So, there are big difference between both of this functions. $Query used to full scan for global, while $Order only for one level. If you still want to scan by $Query, you may look at $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 portal. And get some online courses by InterSystems here 中发现一些有趣的东西。
%Global class 中有一个 Find 查询。查询returns包含FindWhat的节点,每行一个节点,有四列,分别是Name、Value、Name Format和Value Format。
使用 ##Class(%Library.Utility).Replace
将 FindWhat 替换为 ReplaceWith。
名称格式:
- 字符串格式,这是下标不变的值
- 缓存格式,值已转换为缓存表示形式以便于查看,例如,列表显示为“$lb(1,"test")”而不是二进制值。这种格式适合作为 $name.
的参数
值格式:
- 字符串格式,这是不变的值
- 缓存格式,值已转换为缓存表示形式以便于查看,例如,列表显示为“$lb(1,"test")”而不是二进制值。
在输出时,Name Format 和 Value Format 可能会采用第三个值,即 3,这意味着 "Not editable"。由于此数据的长度问题,无法显示所有数据,因此显示了一部分。
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)"
我正在尝试找出遍历全局的最佳方法,下面是我所写的内容。
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, which you use here, and $ORDER. So, there are big difference between both of this functions. $Query used to full scan for global, while $Order only for one level. If you still want to scan by $Query, you may look at $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 portal. And get some online courses by InterSystems here 中发现一些有趣的东西。
%Global class 中有一个 Find 查询。查询returns包含FindWhat的节点,每行一个节点,有四列,分别是Name、Value、Name Format和Value Format。
使用 ##Class(%Library.Utility).Replace
将 FindWhat 替换为 ReplaceWith。
名称格式:
- 字符串格式,这是下标不变的值
- 缓存格式,值已转换为缓存表示形式以便于查看,例如,列表显示为“$lb(1,"test")”而不是二进制值。这种格式适合作为 $name. 的参数
值格式:
- 字符串格式,这是不变的值
- 缓存格式,值已转换为缓存表示形式以便于查看,例如,列表显示为“$lb(1,"test")”而不是二进制值。
在输出时,Name Format 和 Value Format 可能会采用第三个值,即 3,这意味着 "Not editable"。由于此数据的长度问题,无法显示所有数据,因此显示了一部分。
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)"