В поисках глобала для строки
Я пытаюсь выяснить, что лучший способ преодолеть глобальное ниже - это то, что я написал.
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 ответа
Во-первых, вы должны взглянуть на официальную документацию, она доступна в меню кубом в трее. И тогда вы должны посмотреть на $ 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 есть запрос Find. Запрос возвращает узлы, содержащие FindWhat, по одному узлу на строку, с четырьмя столбцами, а именно: Имя, Значение, Формат имени и Формат значения. использование ##Class(%Library.Utility).Replace
заменить FindWhat на ReplaceWith.
NameFormat:
- Формат строки, это значение индекса без изменений
- В формате кэша значение было преобразовано в представление кэша для удобства просмотра, например, вместо отображения двоичного значения список отображается как "$lb(1,"test")". Этот формат подходит в качестве аргумента $ name.
ValueFormat:
- Формат строки, это значение без изменений
- В формате кэша значение было преобразовано в представление кэша для удобства просмотра, например, вместо отображения двоичного значения список отображается как "$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)"