Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %Collection.ListOfObj / 16 сообщений из 16, страница 1 из 1
10.11.2009, 16:59
    #36301771
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
Не получается работать с данным классом:
Нужно сделать список объектов, пробовал:
Код: 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
10.11.2009, 18:07
    #36302034
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
думаю лучше пользоваться %Library.ListOfObjects
с ним вроде все нормально
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
11.11.2009, 09:45
    #36302978
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
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
11.11.2009, 10:03
    #36303029
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
не нужно самостоятельно, создавать лист
Код: 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
11.11.2009, 10:06
    #36303034
Ptn
Ptn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
А у вас объекты класса Class2 с соотвествуюшими ID существуют ?

Отчего не заполнять сразу
Код: plaintext
1.
2.
3.
//Создаём новый экземпляр:
s myObj=##class(MyClasses.Class1).%New()
d myObj.Propertysd.InsertObjectId( 10 )
...
Рейтинг: 0 / 0
11.11.2009, 10:25
    #36303092
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
Ещё вариация:
Код: 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
11.11.2009, 10:32
    #36303115
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
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
11.11.2009, 10:34
    #36303122
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
у меня работает на 5.0.21
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
12.11.2009, 11:53
    #36306243
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
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
12.11.2009, 12:05
    #36306288
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
CacheLotДелать цикл и вставлять по одному элементу (InsertObjectId(ID)) как то грубовато...

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

$LISTTOSTRING и $LISTFROMSTRING ... Т.е.:
- перевести списки в строки
- правильно их "склеить"
- перевести полученую строку в список
...
Рейтинг: 0 / 0
12.11.2009, 12:20
    #36306343
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
$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
12.11.2009, 14:16
    #36306805
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
Для 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
13.11.2009, 11:25
    #36308659
CacheLot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
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
15.11.2009, 12:26
    #36311165
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
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
15.11.2009, 12:31
    #36311170
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
возможно можно сравнить результаты
L1.Serialize()
и
L2.Serialize()
только полагаю, очередность объектов должна быть одинаковая
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
18.11.2009, 11:47
    #36316820
marmar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
%Collection.ListOfObj
s TestList=##class(%Library.ListOfObjects).%New("Нужный класс")
тогда можно использовать InsertObjectId
и при GetAt будет вызываться метод %Open класса "Нужный класс"
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / %Collection.ListOfObj / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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