Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти? / 24 сообщений из 24, страница 1 из 1
23.02.2010, 10:29
    #36484018
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Из класса типа %RegisteredObject (инстанс не сохраняется на диске) вызывается ZEN-страница.
Как можно получить в этой ZEN-странице ссылку (oref) на инстанс вызвавшего её класса или передать в страницу этот инстанс при вызове?
...
Рейтинг: 0 / 0
23.02.2010, 13:00
    #36484202
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshak , скорее всего никак... Ведь в ореф "зашита" "ссылка" на джоб, который и получил этот ореф. В другом джобе этот ореф просто некая безсмысленная строка...
...
Рейтинг: 0 / 0
23.02.2010, 13:39
    #36484266
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Вообще в нашей системе что-то есть похожее
Когда объект запихивается в сессию и таскается по ней
Но там тип объекта должен быть производным от
%Library.SerialObject (не %Library.Persistent), потом объект сериализауется в строку, эту строку можно куда-нибудь передать, а потом воссоздать объект через %New(сюда ту строку подать)

М.б. поможет, но я не уверен.
...
Рейтинг: 0 / 0
23.02.2010, 13:57
    #36484295
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
krvsa,

Получается, что я могу работать в cache с объектами в памяти только в рамках одного и того же процесса и нет возможности коммуникации между процессами?
...
Рейтинг: 0 / 0
23.02.2010, 14:03
    #36484301
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Блок А.Н.,

Через %New не подходит, т.к. мне нужно обратиться именно к тому инстансу объекта, который вызвал ZEN.
Практически мне нужно организовать диалог с инстансом объекта в памяти через ZEN, т.е. вызвать диалог, получить данные и вазвать функцию на вызывающем объекте.
...
Рейтинг: 0 / 0
23.02.2010, 15:12
    #36484392
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Именно тот объект не получится, так как в принципе объект существует в рамках процесса, но в принципе можно получить его копию - например через сериализацию, либо все-таки сохранить в базу и передать его ИД.
...
Рейтинг: 0 / 0
23.02.2010, 18:31
    #36484685
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshakПолучается, что я могу работать в cache с объектами в памяти только в рамках одного и того же процесса
Не с объектом... А с орефом некоего экземпляра.

vcoshakи нет возможности коммуникации между процессами?
Таки дать другому джобу ИД экземпляра - после чего создать ореф... Либо вернуть из джоба 2 данные для экземпляра, провести изменения в жобе 1 и выполнить запись.
...
Рейтинг: 0 / 0
23.02.2010, 18:32
    #36484687
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Блок А.Н.через сериализацию
А это что за зверь? Примерчики этого можно?
...
Рейтинг: 0 / 0
23.02.2010, 19:44
    #36484801
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Сейчас нарисуем:

Код: plaintext
1.
2.
3.
4.
5.
Class Test.ClsS Extends %SerialObject
{
Property P1 As %String;
Property P2 As %String;
}

Создаем объект, смотрим, что он живой:
Код: plaintext
1.
2.
3.
4.
5.
6.
TEST>s ob=##class(Test.ClsS).%New()
TEST>w
ob=<OBJECT REFERENCE>[ 1 @Test.ClsS]
TEST>s ob.P1= 100 ,ob.P2="ASDV"
TEST>w ob.P2
ASDV
Далее,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
//тот параметр который ноль или единичка - отвечает вроде за дочерние объекты
d ob.%GetSwizzleObject( 1 ,.target) //либо d ob.%SerializeObject(.test, 0 )
s ^test=test //пофиг, нам надо куда-нибудь сохранить эту переменную
k //мочим все - имитируем смену процесса. А можно просто в другом окне терминала:
s ob=##class(%Library.SerialObject).%Open(^test)
TEST>w ob.P2
ASDV
Так можно таскать между процессами довольно большие структурированные объекты.
Подсмотрено у тов. Ptn&Co
...
Рейтинг: 0 / 0
23.02.2010, 21:25
    #36484873
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Блок А.Н.Так можно таскать между процессами довольно большие структурированные объекты.
В чем будет преимущество в сравнении с передачей ИД, а потом создания орефа?
...
Рейтинг: 0 / 0
24.02.2010, 06:31
    #36485058
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Бывает, что объекты не нужно сохранять, т.к. они не нужны "в долгосрочной переспективе"
Можно быть точно уверенным, что этот объект со стороны никто не изменил и он передался именно в том виде, в котором был.
...
Рейтинг: 0 / 0
24.02.2010, 08:38
    #36485096
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Блок А.Н.Можно быть точно уверенным, что этот объект со стороны никто не изменил и он передался именно в том виде, в котором был.
В этом могут помоч блокировки... Конечно от "прямого" изменения они не защитят... Вобщем идею я понял, спасибо.
...
Рейтинг: 0 / 0
24.02.2010, 12:53
    #36485641
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
Блок А.Н.,

спасибо за идею и примерчик. К сожалению в моём случае это не поможет, т.к. мне нужно работать именно с моим исходным экземпляром класса.

krvsa,

А можно вернуться к идее получения орефа?
У меня ZEN-страница вызывается из класса через URL, можно, например, передать в URL $J.
Но как из $J создать ореф? Если использовать ##CLASS(%SYS.ProcessQuery).%OpenId($j), то получим ссылку на процесс, но как из процесса вытащить ореф экземпляра требуемого класса?
...
Рейтинг: 0 / 0
24.02.2010, 13:00
    #36485660
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshak , что-то подсказывает мне, что это рытьё подземного хода на чердак.

Может пора рассказать всю "проблему" т.с. в целом? Тогда и решение подсказать/найти будет легче?
...
Рейтинг: 0 / 0
24.02.2010, 20:05
    #36486682
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
krvsa vcoshak , что-то подсказывает мне, что это рытьё подземного хода на чердак.

Может пора рассказать всю "проблему" т.с. в целом? Тогда и решение подсказать/найти будет легче?
Что ж, постараюсь изложить всю проблему.
Стоит задача организовать систему контроля версий в Cache на основе MS Visual SourceSafe c документацией изменений по отдельным пользователям.
Используется класс на основе %Studio.SourceControl.Base и ActiveX для связи с VSS.
В VSS есть своя система управления пользователями, не связанная с OS. Необходимо в Cache Studio запросить логин/пароль пользователя для открытия VSS. Все пользователи работают с одной и той же базой Cache и VSS с разных рабочих мест.

При старте Studio создаётся инстанс указанного класса в отдельном процессе со своим PIDом, в классе есть Method Login, в котором программируется соединение с VSS, и Method UserAction (вызывается из Studio в ответ на действия пользователя - меню, открытие документа и т.д.), из которого можно вызвать CSP/ZEN-диалог через URL.
Согласно документации, для этого нужно установить значение переменных Target и Action=2:
Run a CSP page/Template. The Target is the full url to the CSP page/Template, as usual the page will be passed the current document name, any selected text, the project name, the namespace.

Проблема в том, как из CSP/ZEN-диалога (который запускается в другом процессе) запустить метод Login инстанса класса SourceControl с введенными в диалоге данными.

Кстати, попутно вопросик (я начинающий): как принято в URL передавать сразу несколько параметров - все вместе одной строкой в одно свойство ZEN-класса (которое используется как буфер) и последующим разбором, или как-то ещё?
...
Рейтинг: 0 / 0
24.02.2010, 21:47
    #36486817
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshakкак принято в URL передавать сразу несколько параметров - все вместе одной строкой в одно свойство ZEN-класса (которое используется как буфер) и последующим разбором, или как-то ещё?
Сколько параметров - столько и "принимающих" свойств у ЗЕН-страницы. Но можно конечно и одной строкой через некий разделитель, если уж так сильно захочется...

vcoshak , задачку ты себе выбрал не из лёгких... Заплатят хоть хорошо?
Мы пока контроль версий осуществляем путём сравнения "чего было" с "чего теперь стало". От этого и пляшется все...
А так через Студио... Хым... Нафик оно надо?
...
Рейтинг: 0 / 0
25.02.2010, 01:20
    #36487011
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
krvsavcoshakкак принято в URL передавать сразу несколько параметров - все вместе одной строкой в одно свойство ZEN-класса (которое используется как буфер) и последующим разбором, или как-то ещё?
Сколько параметров - столько и "принимающих" свойств у ЗЕН-страницы. Но можно конечно и одной строкой через некий разделитель, если уж так сильно захочется...

Дык в этом то и вопрос - если есть 3 параметра, то посылать URL три раза, или можно в одной строке URL перечислить все праметры со значениями через какой-то штатный разделитель?
Оно конечо ничего не стоит разобрать одну строку, но я не знаю, есть ли ограничения на набор символов в URL? Если нельзя использовать спецсимволы (например ascii 0-37), то как выбрать разделитель, чтобы он не попадался в данных?
...
Рейтинг: 0 / 0
25.02.2010, 08:59
    #36487174
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshakесли есть 3 параметра, то посылать URL три раза, или можно в одной строке URL перечислить все праметры со значениями
Конечно можно! Так это и делается...

Код: plaintext
top.location='mypage.cls?prm1=<str1>&prm2=<str2>&...&prmN=<strN>'

Правила формирования УРЛ ...

На стороне ЗЕН делаеш принимающие свойства...

Код: plaintext
1.
2.
/// id элемента
Property idItem As %ZEN.Datatype.id(ZENURL = "prm1");

Только типы нужные подбирай и ZENURL правильно указывай...

vcoshakчерез какой-то штатный разделитель?
Что значит "штатный"? В УРЛ в стандарте это "&"...

vcoshakОно конечо ничего не стоит разобрать одну строку, но я не знаю, есть ли ограничения на набор символов в URL?
Пока еще не встречал в литературе описание оных ограничений...

vcoshakЕсли нельзя использовать спецсимволы (например ascii 0-37), то как выбрать разделитель, чтобы он не попадался в данных?
Всегда есть листбилд и метод ..EscapeURL()

Код: plaintext
1.
2.
s str=##class(%CSP.Page).EscapeURL($lb( 1 , 2 , 3 , 4 ))
s str="mypage.cls?data="_str
&js<top.location='#(str)#'>

Но я этим вариантом не пользуюсь. Хватает и выше описаного варианта...
...
Рейтинг: 0 / 0
25.02.2010, 09:00
    #36487175
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshakесли есть 3 параметра, то посылать URL три раза
Вот это как раз вообще не желательно, для простой передачи параметров...
...
Рейтинг: 0 / 0
25.02.2010, 11:33
    #36487502
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
По SourceSafe когда-то темы были на Cache_ru
Примеры оттуда
...
Рейтинг: 0 / 0
25.02.2010, 19:54
    #36488853
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
doublefint,

Спасибо за ссылку. Это только базовая реализация интеграции со studio, т.е. только экспорт и импорт файлов. Для работы нужно всё равно держать открытым SourceSafe, что неудобно. Те задачи, которые я хочу решить, там не затрагиваются.
...
Рейтинг: 0 / 0
25.02.2010, 20:14
    #36488881
vcoshak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
krvsavcoshakесли есть 3 параметра, то посылать URL три раза, или можно в одной строке URL перечислить все праметры со значениями
Конечно можно! Так это и делается...

Код: plaintext
top.location='mypage.cls?prm1=<str1>&prm2=<str2>&...&prmN=<strN>'

Правила формирования УРЛ ...

На стороне ЗЕН делаеш принимающие свойства...

Код: plaintext
1.
2.
/// id элемента
Property idItem As %ZEN.Datatype.id(ZENURL = "prm1");

Только типы нужные подбирай и ZENURL правильно указывай...


Спасибо, отлично получилось - входит и выходит.

Вот только, если можно, ещё вопросик - как после ZEN %OnSubmit скрыть (или убить) модальное окно браузера. И вообще, можно ли из ZEN-класса управлять окном web-браузера?
...
Рейтинг: 0 / 0
25.02.2010, 20:17
    #36488889
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshak,
Из Zen класса, видимо, можно отправлять ему скрипты (или вызывать методы клиента), а вот уже они...
window.close()
...
Рейтинг: 0 / 0
25.02.2010, 21:25
    #36488977
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти?
vcoshakкак после ZEN %OnSubmit скрыть (или убить) модальное окно браузера.
Вот тут примерчик бы не помешал для иллюстрации...

vcoshakИ вообще, можно ли из ZEN-класса управлять окном web-браузера?
Это же "обычный" ВЭБ... Т.ч. все можно в пределах JS-скрипта, не более...
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Как получить доступ к зкземпляру класса типа %RegisteredObject в памяти? / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]