Доступ к переменным экземпляра в Cache Objectscript

У меня есть процедура, в которой я динамически создаю постоянные объекты, используя отражение. Одно из свойств объекта, которое также является постоянным объектом, дает сбой, когда я пытаюсь создать его экземпляр с помощью отражения ($Property). Это не удается, потому что свойство было удалено из базы данных. Что имеет смысл, но я не могу получить идентификатор этого свойства (23). когда я ZWrite объект, я вижу идентификатор свойства в распечатке.

+----------------- swizzled references ---------------
|      i%PropID = 23
|      r%PropID = ""

Я не смог понять, как получить доступ к значению i%ProdID. Если кто-то может помочь, я был бы очень признателен.

Я использую рекурсию для получения свойств объекта и последующих свойств каждого свойства (если они сохраняются) и т. д., но в случаях, когда свойство на самом деле не сохраняется (каким-то образом удалено), я все равно хотел бы получить идентификатор . Я думал об использовании sql, но я хочу держаться подальше от этого, если это вообще возможно.


person wipallen    schedule 12.08.2018    source источник


Ответы (3)


i%<PropertyName>, а также r%<PropertyName> просто специальный синтаксис, чтобы получить доступ к необработанным данным этого свойства. Если вы хотите получить значение этого свойства, вы должны использовать исходное имя свойства, PropID в вашем случае.
Чтобы получить список свойств для определенного класса, вы можете использовать классы %Dictionary.ClassDefinition и %Dictionary.PropertyDefinition любым способом, который вы можете найти интересно читать полное определение класса программно и делать что хочешь.

person DAiMor    schedule 12.08.2018
comment
Спасибо за ответ DAiMor. Да, но проблема заключалась в том, что необработанные данные для свойства были недоступны, так как оно было удалено из базы данных. - person wipallen; 16.08.2018
comment
Итак, я думаю, что GetStored должен работать, но только в том случае, если данные все еще сохраняются, а не сохраняются новые пустые значения. - person DAiMor; 16.08.2018

Вы можете использовать недокументированные вызовы для получения значений i%, но даже существование свойств i% недокументировано, как и функции для доступа к их значениям.

Лучший задокументированный способ получить идентификатор дочернего объекта, который был удален из базы данных, - это вызов GetStored:

write ##class(parent.Class).ProdIDGetStored(ParentID) 

должен вернуть дочерний идентификатор из базы данных (23 в вашем случае)

person SSH    schedule 13.08.2018
comment
Спасибо за ваши комментарии SSH, я действительно не мог заставить это работать :( - person wipallen; 16.08.2018

Решение состояло в том, чтобы переопределить геттер для этого объекта свойства и объясняется здесь:

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_propmethods

S getter = propertyName_"GetObjectId"
try {
    S id = $METHOD(object, getter)
} catch (ex) {}
return $G(id)
person wipallen    schedule 16.08.2018