Оптимальный способ поиска объекта по уникальному значению одного из его свойств

У меня есть объект со свойством, которое имеет уникальные значения. Это может быть неуважительной причиной, но это свойство не является моим идентификатором, поскольку это список, а отображаемое значение состоит из непечатаемых символов.

Я хотел бы проверить наличие объекта с определенным значением этого свойства. Варианты, о которых я думал до сих пор, делают его идентификатором, а затем используют встроенный метод %ExistsID, используя запрос SQL и вручную ища глобальный индекс для соответствующего индекса.

Проблема с первым решением заключается в том, что я предпочитаю иметь удобочитаемый идентификатор. Если я веду себя глупо, пожалуйста, так и скажите.

Проблема со вторым подходом заключается в том, что мне кажется, что, хотя SQL хорош для таких вещей, в данном конкретном случае мне кажется, что я запускаю этот громоздкий механизм с большим количеством накладных расходов, чтобы получить результат, который Мне должно стать легче. Опять же, я мог бы просто быть глупым об этом.

Проблема последнего заключается в том, что значение, представляющее собой LB, состоящее в основном из чисел, хранится как $c(x,y,z). Я не знаю, как искать это (т.е. как перейти от моего списка к этому). Кроме того, это кажется немного грязным и что я слишком низкоуровневый.

Я чувствую, что должен быть более простой способ объектно-ориентированного извлечения объектов на основе уникального (индексированного) значения, и я почти уверен, что он есть, но я не могу найти его в документах. Было бы неплохо создать автоматически сгенерированный %PropertyExists(UniqueValue).

Может быть, мне следует написать свой собственный метод генератора? Любой совет приветствуется.


person neManiac    schedule 04.04.2016    source источник


Ответы (2)


Если вы посмотрите документацию , вы обнаружите, что каждый уникальный индекс в классе имеет некоторый сгенерированный метод, такой как Open и Exists и Delete. И с помощью любого из этих методов вы можете открыть любой объект по известным уникальным значениям.
Итак, если у вас есть такой индекс

Index SomeInd On (Prop1, Prop2) [ Unique];

вы можете открыть объект, поэтому

set obj=##class(your.class).SomeIndOpen(prop1val, prop2val)

или проверьте, существует ли уже такой объект, и получите и ID для этого объекта.

if ##class(your.class).SomeIndExists(prop1val, prop2val, .id) {
    //
}

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

person DAiMor    schedule 04.04.2016
comment
Спасибо большое. Это именно то, что я искал. Хороший ОО-способ сделать это с помощью автоматически сгенерированного метода. - person neManiac; 05.04.2016

Вы можете использовать более простой SQL-запрос, используя функцию COUNT(), а затем вернуться, если счетчик равен 1. Для этого взгляните на этот поток: Выбрать количество(*) из результатов запроса

person clementgamache    schedule 04.04.2016
comment
Спасибо за ваш ответ. Сначала я действительно реализовал это, но предпочитаю решение, предложенное @DAiMor. - person neManiac; 05.04.2016