powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Способ хранения для класса
25 сообщений из 45, страница 1 из 2
Способ хранения для класса
    #36773611
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите плз... Очень важно!

Необходимо прописать хранение экземпляров класса типа SerialObject в дочерних узлах, а не в виде списка в узле глобала, где хранится объект, полем которого является экземпляр данного класса.
Это, как я понял, можно задать через способе хранения класса. В документации (Class Definition Reference) нашел, что есть ключевое слово Structure внутри элемента StorageData, которое может принимать значение node, subnode, <пустая строка>:
- (empty string)—data is stored as a multiple values within a node.
- node—data is stored as a single value within a node.
- subnode—data is stored within repeating subnodes.
По умолчанию - listnode.

Только про то, как и где прописывать - ниче не написано...
Может кто разбирался с этим Storage, подскажите, плз...

Заранее огромное спасибо!
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36773648
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каше есть, редактор хранения, в этом редакторе полагаю можно сделать то что ты хочешь
добратся до него можно, в инспекторе выбрав, Storage, в свойствах Storage по умолчанию, выбери Data Nodes, по кнопке с троеточием откроется мастер хранения
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36773801
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

Да, с помощью этого мастера хранения можно добавить к определению способа хранения внутри тега Data тег Structure:
<Structure>subnode</Structure>

Однако при компиляции класса возникает ошибка...
Пишет "Неправильная структура схемы хранения"
Да и в мастере уже видно, что что-то не так. Если до изменения было:
Имя узла Глобальная ссылка
AddressState (ID)=$LB(Street,Number)
То после изменения:
Имя узла Глобальная ссылка
AddressState (ID)=
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36773983
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще можно в студии сделать "показывать структуру хранения"
Правда когда руками правишь - там не все очевидно.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774052
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.,

Пробовал в студии. Куда только не вставлял... Та же ошибка.
Поэтому и написал сюда, может кто это использовал или знает, где можно узнать (кроме Class Definition Reference).
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774085
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter, может поможет
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774275
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приложите, пожалуйста, попробую глянуть.
А то так не очень понятно.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774292
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_ShooterНеобходимо прописать хранение экземпляров класса типа SerialObject в дочерних узлах, а не в виде списка в узле глобала
Что-то типа такого?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
/// 
Class tmp.tmp Extends %Persistent [ StorageStrategy = NewStorage1 ]
{

Property prm1 As %String;

Property prm2 As %String;

<Storage name="NewStorage1">
<Data name="Node1">
<Attribute>prm2</Attribute>
<Value name="1">
<Value>prm1</Value>
</Value>
</Data>
<Data name="Node2">
<Attribute>prm2</Attribute>
<Structure>node</Structure>
<Subscript>"prm2"</Subscript>
</Data>
<Data name="tmpDefaultData">
<Subscript>"1"</Subscript>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
<DataLocation>^tmp.tmpD</DataLocation>
<DefaultData>tmpDefaultData</DefaultData>
<ExtentSize> 100000 </ExtentSize>
<IdLocation>ID</IdLocation>
<IndexLocation>^tmp.tmpI</IndexLocation>
<SequenceNumber> 3 </SequenceNumber>
<StreamLocation>^tmp.tmpS</StreamLocation>
<Type>%CacheStorage</Type>
</Storage>
}
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774311
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_ShooterНеобходимо прописать хранение экземпляров класса типа SerialObject в дочерних узлах
Хранение типа стораж можно указать только для хранимых классов типа персистент. Т.к. в описании явно нужно указывать именя глобалов.
Так же при описании предлагается выбирать только свойства данного класса. Выбрать какие-то "дальние" свойства которые есть у свойства типа "другой класс" построитель не даёт.

Т.ч. если у тебя есть класс А сериалобжект со свойствами а1 и а2, класс Б со свойством б1 типа класс А - ты не сможешь расписать б1.ф1 и б1.а2 по узлам глобала в котором хранится класс Б.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774315
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaб1.ф1 и б1.а2
Читать как "б1.а1 и б1.а2"...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36774601
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот еще
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36775034
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaX_ShooterНеобходимо прописать хранение экземпляров класса типа SerialObject в дочерних узлах, а не в виде списка в узле глобала
Что-то типа такого?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
/// 
Class tmp.tmp Extends %Persistent [ StorageStrategy = NewStorage1 ]
{

Property prm1 As %String;

Property prm2 As %String;

<Storage name="NewStorage1">
<Data name="Node1">
<Attribute>prm2</Attribute>
<Value name="1">
<Value>prm1</Value>
</Value>
</Data>
<Data name="Node2">
<Attribute>prm2</Attribute>
<Structure>node</Structure>
<Subscript>"prm2"</Subscript>
</Data>
<Data name="tmpDefaultData">
<Subscript>"1"</Subscript>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
</Data>
<DataLocation>^tmp.tmpD</DataLocation>
<DefaultData>tmpDefaultData</DefaultData>
<ExtentSize> 100000 </ExtentSize>
<IdLocation>ID</IdLocation>
<IndexLocation>^tmp.tmpI</IndexLocation>
<SequenceNumber> 3 </SequenceNumber>
<StreamLocation>^tmp.tmpS</StreamLocation>
<Type>%CacheStorage</Type>
</Storage>
}


Да, кажется это то, что нужно. Огромное спасибо!
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36775044
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefintX_Shooter, может поможет

Это тоже, чувствую, сильно пригодится. Премного благодарен.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36775052
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsaX_ShooterНеобходимо прописать хранение экземпляров класса типа SerialObject в дочерних узлах
Хранение типа стораж можно указать только для хранимых классов типа персистент. Т.к. в описании явно нужно указывать именя глобалов.
Так же при описании предлагается выбирать только свойства данного класса. Выбрать какие-то "дальние" свойства которые есть у свойства типа "другой класс" построитель не даёт.

Т.ч. если у тебя есть класс А сериалобжект со свойствами а1 и а2, класс Б со свойством б1 типа класс А - ты не сможешь расписать б1.ф1 и б1.а2 по узлам глобала в котором хранится класс Б.

Да, пока разбирался с этим уже столкнулся. Жаль, конечно. Вообще бы красота получилась...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36775302
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter , я бы вообще не очень-то уповал на этот сторадж... Думается мне он был разработан в рамках "акции" - "мы можем описать как класс любое ваше хранение, переходите быстрей с МСМ на Каше".

Нам так это вообще никак не помогло. Из-за дюже извращенного способа хранения данных...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778247
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Для класса типа сериалобжект, судя по всему, нельзя прописать структуру хранения, подобную той, которая описана в вашем примере?
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778305
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter , хранение прописывается только у хранимых классов. Там ведь сразу глобал нужно указывать.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778335
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Т.е. получается, как ни крути, а такие объекты могут храниться в глобале, соответствующего к/л персистентному классу, только в виде списка?
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778409
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter , я не совсем понял вопрос...

Хранение можно указать только хранимому классу. Т.е. персистент... Причем в описании хранения будут присутствовать только свойства описваемого класса. Их "сложный" тип вообще не учитывается при описании.

Для удобства помощи со стораджом лучше приводить пример класса и потом на глобалах показать какхочется "завернуть" хранение.
Т.о. можно получить некий вариант.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778440
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Пример.
Класс 1:

Class Temp.Person Extends %Persistent [ StorageStrategy = NewStorage1 ]
{
Property Name As %String;

Property Phone As %String;

Property Adr As Address;
}

Класс 2:

Class Temp.Address Extends %SerialObject [ StorageStrategy = NewStorage1 ]
{
Property City As %String;

Property Street As %String;
}

Можно ли сделать в глобале вот так:
^Temp.PersonD(1,"Name")="John Smith"
^Temp.PersonD(1,"Phone")="235-05-45"
//до сих пор все понятно
//но адрес хочу хранить так:
^Temp.PersonD(1,"Adr","City")="NewYork"
^Temp.PersonD(1,"Adr,"Street")="Park Avenue"

/*
Т.е. не просто ^Temp.PersonD(1,"Adr")=$lb("NewYork","Park Avenue"),
а прям поддеревом
*/


В способе хранения сериалобжектов есть тег State, который отвечает за содержимое и соответствует одному тегу Data. Т.е. поля класса Address нельзя разносить в разные теги Data и описывать для каждого Subscript и Structure.

**Создавать новый способ хранения через мастер и модифицировать его через инспектор не получается, так как у классов сериалобжект способ хранения имеет тип %Library.CacheSerialState, а не Storage вовсе...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778442
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хранение по умолчанию для Address:

<Storage name="Default">
<Data name="AddressState">
<Value name="1">
<Value>State</Value>
</Value>
<Value name="2">
<Value>City</Value>
</Value>
<Value name="3">
<Value>Street</Value>
</Value>
<Value name="4">
<Value>Zip</Value>
</Value>
</Data>
<State>AddressState</State>
<StreamLocation>^Temp.AddressS</StreamLocation>
<Type>%Library.CacheSerialState</Type>
</Storage>
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778615
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
//но адрес хочу хранить так:
^Temp.PersonD( 1 ,"Adr","City")="NewYork"
^Temp.PersonD( 1 ,"Adr,"Street")="Park Avenue"

/*
Т.е. не просто ^Temp.PersonD(1,"Adr")=$lb("NewYork","Park Avenue"), 
а прям поддеревом
*/

Значит я правильно понял...
И сразу писал - нет в диалоге стораджа вариантов со свойствами типа "другой класс". Выбирать и манипульровать можно только свойствами описываемого класса.

Сам сторадж изначально (личное мнение) делался не для "ломания классов"... А наоборот. Делания классов из произвольного хранения данных в неких глобалах. На переходный период с МСМ на Каше.

Смысла переделывать хранение стандартного класса нет никакого. Это всегда объясняли специалисты ИС.

В твоём случае я бы сделал класс "Адрес" хранимым, а его экземпляры ссылались бы на Персон...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778654
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X_Shooter,

Если Вам это действительно очень надо, то это возможно. Правда, как справедливо заметил krvsa , непонятно зачем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
<Storage name="Default">
<Data name="personName">
<Attribute>Name</Attribute>
<Structure>node</Structure>
<Subscript>"Name"</Subscript>
</Data>
<Data name="personPhone">
<Attribute>Phone</Attribute>
<Structure>node</Structure>
<Subscript>"Phone"</Subscript>
</Data>
<Data name="personAdrCity">
<Attribute>Adr.City</Attribute>
<Structure>node</Structure>
<Subscript>"Adr","City"</Subscript>
</Data>
<Data name="personAdrStreet">
<Attribute>Adr.Street</Attribute>
<Structure>node</Structure>
<Subscript>"Adr","Street"</Subscript>
</Data>
<DataLocation>^Temp.PersonD</DataLocation>
<DefaultData>personDefaultData</DefaultData>
<ExtentSize> 100000 </ExtentSize>
<IdLocation>^Temp.PersonD</IdLocation>
<IndexLocation>^Temp.PersonI</IndexLocation>
<StreamLocation>^Temp.PersonS</StreamLocation>
<Type>%Library.CacheStorage</Type>
</Storage>

PS: такой вариант задания схемы возможен только в "ручном" режиме. Стандартная схема хранения встраиваемого класса в любом случае останется.
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36778672
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitтакой вариант задания схемы возможен только в "ручном" режиме
Спасибо, буду знать! Пока только с "интерфейсом" имел дело...
...
Рейтинг: 0 / 0
Способ хранения для класса
    #36779052
X_Shooter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

Спасибо, теперь все вышло. А я то пытался сделать это в описании самого класса Address...
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Способ хранения для класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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