powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обратный порядок элементов в Relationship
14 сообщений из 14, страница 1 из 1
Обратный порядок элементов в Relationship
    #35496009
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два класса с отношением один-много.
Создаем объект "родитель", связываем его с "детьми" в определенном порядке. После сохранения, закрытия и поднятия объекта "родитель" порядок следования элементов "дети" меняется на обратный.
Кто сталкивался с такой проблемой? Что делать, если порядок следования важен - т.е. 1-й элемент должен быть всегда первым, а последний - последним. Всякие извращения с переварачиванием массива не предлагать!
Если надо, могу кинуть пример...
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35496042
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так при создании экземпляров id формируется с нарастанием. Как ваши "дети" могут сортирануться по "следованию" в обратном порядке?
Как вы "поднимаете" "родителя"?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35496119
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы стало понятней вот тестовые классы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Class TEST.Parent Extends %Persistent
{

Relationship childrens As TEST.Children [ Cardinality = children, Inverse = parent ];

}

Class TEST.Children Extends %Persistent 
{

Relationship parent As TEST.Parent [ Cardinality = parent, Inverse = childrens ];

Property name As %String;

}

Далее выполняем такой примерчик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
s parent=##class(TEST.Parent).%New()
s child1=##class(TEST.Children).%New()
s child1.name= 1 
d parent.childrens.Insert(child1)
s child2=##class(TEST.Children).%New()
s child2.name= 2 
d parent.childrens.Insert(child2)
s child3=##class(TEST.Children).%New()
s child3.name= 3 
d parent.childrens.Insert(child3)
d parent.%Save()
q
k
s parent=##class(TEST.Parent).%OpenId( 1 )
w parent.childrens.GetAt( 1 ).name
Пример выдёт результат "3", хотя должен быть "1"... То бишь все дети в родители перевернулись, т.к. сохранение идет в обратном порядке.
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35496253
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не использую такой тип связи Родитель-Дети... Отдаю предпочтение "чистому" Один-ко-многим...
При этом применяю немного другую конструкцию при создании

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
s parent=##class(TEST.Parent).%New()
d parent.%Save()

s child1=##class(TEST.Children).%New()
s child1.name= 1 
s child1.parent=parent
d child1.%Save()
...

Т.о. и связь есть... И пресловутое следование не нарушено... Как вариант может вам после каждого

Код: plaintext
d parent.childrens.Insert(child2)

Делать

Код: plaintext
d parent.%Save()
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35496299
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот даже пример из ОбжектКвикСтарта...

авторСоздайте в памяти двух пациентов и доктора:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
USER>set p1=##class(Patient).%New()
USER>set p1.Name="Иван"
USER>set p2=##class(Patient).%New()
USER>set p2.Name="Петр"
USER>set d=##class(User.Doctor).%New()
USER>set d.Name="Профессор Иванов"
Свяжите пациентов и доктора двумя возможными способами:
USER>set p1.Physician=d
USER>do d.Patients.Insert(p2)

Теперь Вы можете получать информацию о связанных объектах с обеих сторон отношения:

Код: plaintext
1.
2.
3.
4.
5.
USER>w d.Patients.GetAt( 1 ).Name
Иван
USER>w d.Patients.GetAt( 2 ).Name
Петр
USER>w p1.Physician.Name
Профессор Иванов

----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35497577
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Какой тип отношений использовать (parent-child, one-many) нет абсолютно ни какой разницы.
2. До зарытия объектов и поднятия с базы заново все работает нормально, у элементов правильный порядок.
3. Объекты предварительно сохранять в базу не надо. Надо сначала всё заполнить, а потом, в нужный момент, если это требуется, сохранить. Манипуляции с последующим удалением ненужных объектов не приветствуются.
4. При последующих сохранениях порядок элементов не меняется. Проблема возникает после первого сохранения объекта.
Если после первого примера выполнить этот пример, то получится интересная ситуация:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
>s parent=##class(TEST.Parent).%OpenId( 1 )
>s child4=##class(TEST.Children).%New()
>s child4.name= 4 
>d parent.childrens.Insert(child4)
>d parent.%Save()
>q
>k
>s parent=##class(TEST.Parent).%OpenId( 1 )
>w parent.childrens.GetAt( 1 ).name
 3 
>w parent.childrens.GetAt( 2 ).name
 2 
>w parent.childrens.GetAt( 3 ).name
 1 
>w parent.childrens.GetAt( 4 ).name
 4 

ИМХО - это неправильное поведение.

Почему это происходит именно при первом сохранении и как с этим бороться - ума не приложу. Как вариант - написать своё подобие отношения с простыми свойствами типа list или array... Пока только такие мысли.
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35497929
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых хочеться сказать что при работе с детишками через "Абстрактный базовый" набор GetAt Next Prev и т.д. - индекс равен непонятно чему

Во вторых Команда Insert - можно трактовать именно как вставку - то есть при вставке все текущие элементы сдвигаются вниз.

Проверить это можно во первых - выведя

w parent.childrens.GetAt(1).name

ПЕРЕД сохранением парента - есть мнение что там _уже_ будет три

Во вторых просмотрев ID-ники детишек, если не переопределяли свой ID то там должно быть поле childsub.

Если 3-й ребенок сохраняеться первым - то вполне можеть быть что при последующем GetAt(1) вы получите именно его.
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35497963
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Socratdv3. Объекты предварительно сохранять в базу не надо. Надо сначала всё заполнить, а потом, в нужный момент, если это требуется, сохранить.
А вот это уже какое-тоноу-хау... Т.е. вы набираете, набираете эелементы "как буд-то бы в БД"... А потом можете и не записывать?
Тогда зачем весь сыр-бор?
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498484
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PtnНу во первых хочеться сказать что при работе с детишками через "Абстрактный базовый" набор GetAt Next Prev и т.д. - индекс равен непонятно чему
Малость не понял этой реплики... С чего бы это индекс был равен непонятно чему? Все предельно ясно - индексы в списке от 1 до кол-ва элементов.

PtnВо вторых Команда Insert - можно трактовать именно как вставку - то есть при вставке все текущие элементы сдвигаются вниз.

Проверить это можно во первых - выведя

w parent.childrens.GetAt(1).name

Метод Insert добавлят элемент в конец списка без какого либо сдвига - эквивалентен ..childrens.SetAt(child,..childrens.Count()+1). Сам по себе метод Insert отрабатывает нормально, элементы ВСЕГДА добавляются в конец.

w parent.childrens.GetAt(1).name выдаст результат "1"

PtnПЕРЕД сохранением парента - есть мнение что там _уже_ будет три
Перед сохранением родителя, как и после, всё работает нормально - порядок не меняется. Проблема возникает при ПЕРВОМ сохранении родителя (когда у него нет id), после его закрытия и поднятия с базы (когда отрабатывает метод Load у RelationshipObject). Проблема в том, что при ПЕРВОМ сохранении дети сохраняются в обратном порядке, в последующем все нормально.

PtnЕсли 3-й ребенок сохраняеться первым - то вполне можеть быть что при последующем GetAt(1) вы получите именно его.
Вот именно так и происходит. НО только при первом сохранении. Как это разрулить - ума не приложу...
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498526
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa Socratdv3. Объекты предварительно сохранять в базу не надо. Надо сначала всё заполнить, а потом, в нужный момент, если это требуется, сохранить.
А вот это уже какое-тоноу-хау... Т.е. вы набираете, набираете эелементы "как буд-то бы в БД"... А потом можете и не записывать?
Тогда зачем весь сыр-бор?
А вы считаете, что надо сначала записывать объект в базу а потом заполнять данными? Вот это уж точно какое-то ноу-хау...
Сыр-бор в том, что сохранять надо, когда захочет пользователь. Если пользователь скажет, что сохранять не надо, то объекты просто закрываются, не внося изменения в базу.
Как пример можно привести отношение документ-строки документа. Создается документ, добавляются строки, вносятся данные и когда пользователь жмет сохранить, то сохраняем родитель (документ). Если пользователь жмет отмену, то закрываем документ без сохранения. Помоему, это более чем нормальная ситуация...
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498686
Socratdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.к. список детей в родителе заполняется при поднятии с базы выборкой сохраненных элементов, то в первой позиции всегда будет тот элемент, который сохранен раньше остальных. Позиция в списке ни где не учитывается и сделать так, чтобы порядок элементов был постоянным не представляется возможным.
Вопрос можно снимать с обсуждения...
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498714
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SocratdvА вы считаете, что надо сначала записывать объект в базу а потом заполнять данными?
Я-то считаю что "если пользователь не хочет записвать данные" вообще не делать какие-то манипуляции с данными...
А у вас получается то, что у вас получается... Измените ваш подход к делу и будет вам счастие...
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498843
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SocratdvВот именно так и происходит. НО только при первом сохранении. Как это разрулить - ума не приложу...

Элементарно - сохранять каждого ребенка сразу - или использовать SQL
...
Рейтинг: 0 / 0
Обратный порядок элементов в Relationship
    #35498864
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Малость не понял этой реплики... С чего бы это индекс был равен непонятно чему? Все предельно ясно - индексы в списке от 1 до кол-ва элементов.

Он имеет ясное значение при использовании списков или массивов - там индекс имеет непосредственное физическое значение...

В случае парент-чилд - индексом вообще то выступает ID чилда - который к этим циферками 1 2 3 4 не имеет ну никакого
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Обратный порядок элементов в Relationship
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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