В поисках глобала для строки

Я пытаюсь выяснить, что лучший способ преодолеть глобальное ниже - это то, что я написал.

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:

  1. Формат строки, это значение индекса без изменений
  2. В формате кэша значение было преобразовано в представление кэша для удобства просмотра, например, вместо отображения двоичного значения список отображается как "$lb(1,"test")". Этот формат подходит в качестве аргумента $ name.

ValueFormat:

  1. Формат строки, это значение без изменений
  2. В формате кэша значение было преобразовано в представление кэша для удобства просмотра, например, вместо отображения двоичного значения список отображается как "$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)"
Другие вопросы по тегам