powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %Collection.ListOfObj
16 сообщений из 16, страница 1 из 1
%Collection.ListOfObj
    #36301771
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается работать с данным классом:
Нужно сделать список объектов, пробовал:
Код: plaintext
1.
2.
3.
4.
5.
s TestList=##class(%Collection.ListOfObj).%New()
d TestList.InsertObjectId( 1 ) //-Не работает. <INVALID OREF>zInsertObject+ 2 ^%Collection.ListOfObj. 1 
d TestList.Insert("Привет!") // Работает.
d TestList.Count() // Не работает. <INVALID OREF>zCount+ 1 ^%Collection.ListOfObj. 1 
w TestList.GetAt( 1 ) //Не работает. <INVALID OREF>zGetAt+ 1 ^%Collection.ListOfObj. 1 

странный класс какой то, так и не получилось проверить ни один задекларированный метод, кроме Insert()... Что с ним не так??
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36302034
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю лучше пользоваться %Library.ListOfObjects
с ним вроде все нормально
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36302978
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

С него то всё и началось...
Не получалось сохранить список в свойство класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
s TestList=##class(%Library.ListOfObjects).%New()
//Заполняем список...
d TestList.InsertObjectId( 1 )
...
...
d TestList.InsertObjectId( 10 )

//Создаём новый экземпляр:
s myObj=##class(MyClasses.Class1).%New()
s myObj.Propertysd=TestList 
//Тут ошибка!! <METHOD DOES NOT EXIST>zGetAt+ 3 ^%Library.ListOfObjects. 1  *%Open,%Library.RegisteredObject

Свойство Propertysd - описано как:
Код: plaintext
1.
Property Propertysd As list Of Class2;
Соответсвенно работает класс %Collection.ListOfObj
Как засатвить его сохранять собранный список в БД??
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36303029
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не нужно самостоятельно, создавать лист
Код: plaintext
1.
2.
3.
4.
5.
s myObj=##class(MyClasses.Class1).%New()
d myObj.Propertysd.InsertObjectId( 1 )
...
...
d myObj.Propertysd.InsertObjectId( 10 )

по крайней мере у меня так работает
есть свойство списком
Код: plaintext
1.
Property Main As DOCS.Catalog.Main(XMLITEMNAME = "main", XMLPROJECTION = "ELEMENT") [ Collection = list ];

вывожу, ну да так же используется %ListOfObjects
Код: plaintext
1.
2.
w o.Main
 10 @%Library.ListOfObjects

я до вас и не догадывался, что используется этот класс

данный класс используется для генерации данных, соответственно я создаю объекты класса DOCS.Catalog.Main, сохраняю объект, и делаю d cat.Main.Insert(obj), этого объекта

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36303034
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А у вас объекты класса Class2 с соотвествуюшими ID существуют ?

Отчего не заполнять сразу
Код: plaintext
1.
2.
3.
//Создаём новый экземпляр:
s myObj=##class(MyClasses.Class1).%New()
d myObj.Propertysd.InsertObjectId( 10 )
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36303092
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вариация:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
s myObj=##class(MyClasses.Class1).%New()
	
s TestList=myObj.Propertysd
d TestList.InsertObjectId( 1 )
...
d TestList.InsertObjectId( 10 )
d myObj.%Save()
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36303115
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMorне нужно самостоятельно, создавать лист
Код: plaintext
1.
2.
3.
4.
5.
s myObj=##class(MyClasses.Class1).%New()
d myObj.Propertysd.InsertObjectId( 1 )
...
...
d myObj.Propertysd.InsertObjectId( 10 )

так то оно работет, но мне удобнее делать промежуточный список, передавать его в метод, и в методе открывать нужный экземпляр и сохранять ему этот список в БД.. конечно могу перебиться и таким путём, но всё же интересно почему не отрабатывает мой вариант? Делал тестовый пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
s TestList=##class(%Library.ListOfObjects).%New()
//Заполняем список...
d TestList.InsertObjectId( 1 )
...
...
d TestList.InsertObjectId( 10 )

//Далее начинал список уже %Collection.ListOfObj
s NewList=##class(%Collection.ListOfObj).%New()
s NewList=TestList
//и всё прекрасно сохраняется...
Ксатити такое описание свойства-списка:
Код: plaintext
1.
Property Main As DOCS.Catalog.Main(XMLITEMNAME = "main", XMLPROJECTION = "ELEMENT") [ Collection = list ];
у меня не проходит, подчёркивает и не компилится.. (2009 верся)
Так вот не поймк это баг или что то не так в принципе? Почему со списком %Collection.ListOfObj всё работает, а со свойством класса не хочет?
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36303122
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня работает на 5.0.21
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36306243
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DAiMor,

этот момент обошёл, но теперь возникла другая трабла: надо объединить 2 списка..
Итак есть 2 спика List1 As %Collection.ListOfObj и List2 As %Library.ListOfObjects
Нужно получить результирующий список ResultList, который содержит все элементы и первого и второго списков!
Пробовал старым добрым "_" - в итоге получаю:

Код: plaintext
1.
2.
USER>w ResultList
 4 @%Collection.ListOfObj5@%Library.ListOfObjects

При этом соответственно не работаеют никакие методы работы со списками.. Задокументированных методов объединения спсков - тоже не нашёл...
Делать цикл и вставлять по одному элементу (InsertObjectId(ID)) как то грубовато... по-моему/
Есть какие то мысли?
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36306288
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CacheLotДелать цикл и вставлять по одному элементу (InsertObjectId(ID)) как то грубовато...

Как вариант воспользоваться функциями

$LISTTOSTRING и $LISTFROMSTRING ... Т.е.:
- перевести списки в строки
- правильно их "склеить"
- перевести полученую строку в список
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36306343
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$lfs и $ltos тут никак не подойдут, потому как в этом случае мы имеем дело со списком объектов
а там хранение не в листбилде

а по делу, чтото я не нашел подходящего способа
только если у тебя нету списка ID, тогда можно построить листбилд и закормить ему списку
Код: plaintext
1.
2.
s ids=$lb($lb( 1 ,"User.Class"),$lb( 2 ,"User.Class"))
s obj=##class(%ListOfObjects).%New()
d obj.InsertList(ids)
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36306805
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для CacheLot

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
s myObj=##class(MyClasses.Class1).%OpenId( 1 )
	
s TestList=##class(%ListOfObjects).%New("MyClasses.Class2")
d TestList.InsertObjectId( 2 )
d TestList.InsertObjectId( 3 )

d TestList.InsertList(myObj.Propertysd.Serialize())

w TestList.Count(),!
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36308659
CacheLot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,
пасиб, буду тестить когда наберутся данные, пока прикрутил метод а там видно будет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//Метод, объединяющий  2  списка

Method ListAssociation(L1 As %Library.ListOfObjects, L2 As %Library.ListOfObjects) [ ZenMethod ]
{
	f k= 1 : 1 :L2.Count()
	{
		d L1.InsertObjectId(L2.GetObjectIdAt(k))
	}
	q L1
}

Есть ещё один вопрос: проверка на идентичность двух списков (т.е. оба содержат одинаковые элементы, при этом последовательность можно даже и не учитывать). Пробовал "=", не отрабатывает почему то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
USER>s L1=##class(%Library.ListOfObjects).%New()
USER>s L2=##class(%Library.ListOfObjects).%New()
USER>w L1
 1 @%Library.ListOfObjects
USER>w L2
 2 @%Library.ListOfObjects
USER>if L1=L2 {w "Равны!"} else {w "Не равны!"}
Не равны!
USER>
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36311165
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CacheLotЕсть ещё один вопрос: проверка на идентичность двух списков (т.е. оба содержат одинаковые элементы, при этом последовательность можно даже и не учитывать). Пробовал "=", не отрабатывает почему то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
USER>s L1=##class(%Library.ListOfObjects).%New()
USER>s L2=##class(%Library.ListOfObjects).%New()
USER>w L1
 1 @%Library.ListOfObjects
USER>w L2
 2 @%Library.ListOfObjects
USER>if L1=L2 {w "Равны!"} else {w "Не равны!"}
Не равны!
USER>

Это не C++ с возможностью переопределения операторов. Вы сравниваете ссылки на объекты списков, которые естественно различны.
Вам нужно что-то вроде такого (код не проверял и не старался оптимизировать, но общий принцип показан):
Код: 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.
ClassMethod ListSame(L1 As %Library.ListOfObjects, L2 As %Library.ListOfObjects) As %Boolean
{
  k array1
  s key = ""
  f {
    s oid = L1.GetObjectNext(.key)
    q:(key="")
    #;
    s array1(oid) = ""
  }
  #;
  k array2
  s key = ""
  f {
    s oid = L2.GetObjectNext(.key)
    q:(key="")
    #;
    s array2(oid) = ""
  }
  #;
  s oid = ""
  f {
    s oid = $o(array1(oid))
    q:(oid="")
    #;
    k array1(oid)
    k array2(oid)
  }
  #;
  s res = ($o(array1("")) = "") && ($o(array2("")) = "")
  #;
  k array1, array2
  #;
  q res
}
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36311170
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно можно сравнить результаты
L1.Serialize()
и
L2.Serialize()
только полагаю, очередность объектов должна быть одинаковая
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
%Collection.ListOfObj
    #36316820
marmar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
s TestList=##class(%Library.ListOfObjects).%New("Нужный класс")
тогда можно использовать InsertObjectId
и при GetAt будет вызываться метод %Open класса "Нужный класс"
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %Collection.ListOfObj
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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