:: Visual Foxpro, Foxpro for DOS
Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
Доброго дня.

1. В БД установлены "постоянные связи" и RI Restrict для таблиц, one-to-many
В форме, которая с таблицами работает, в Data Environment было установлено Relation , и , насколько я понял из статей, это "временная связь", и вот в ней OneToMany = .f.

Если есть связь в БД, то нужна ли связь в DE, и нужно ли исправлять onetomany = .t. , они вообще одно и тоже или две разных связи и мешают друг другу?

2. И еще вопрос, если в связанных таблицах с отношением один-ко-многим в родительской курсор стоит на записи, в дочерней курсор устанавливается именно на первую запись с этим ключом, или на любую попавшуюся из записей с таким ключом?

3. Если мы команду =seek(id,'table','table.id') даем, и записей с table.id = id несколько, то курсор встанет именно на первую (если можно так выразиться - первую "сверху") или опять-таки на какую-то?

Надо ли мне предварительно в дочерней таблице курсор вверх загонять?
Ratings: 0 negative/0 positive
Re: Relations
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
DmitryKn

1. В БД установлены "постоянные связи" и RI Restrict для таблиц, one-to-many
В форме, которая с таблицами работает, в Data Environment было установлено Relation , и , насколько я понял из статей, это "временная связь", и вот в ней OneToMany = .f.

Если есть связь в БД, то нужна ли связь в DE, и нужно ли исправлять onetomany = .t. , они вообще одно и тоже или две разных связи и мешают друг другу?

Нет.

"Постоянная связь" нужна для поддержания ссылочной целостности (логической целостности) БД.

"Временная связь" обычно используется для отображения в интерфейсе (тут меня поправят, не использую лет 30-ть ).

То есть, это две разные сущности никак не связанные друг с другом.

DmitryKn
2. И еще вопрос, если в связанных таблицах с отношением один-ко-многим в родительской курсор стоит на записи, в дочерней курсор устанавливается именно на первую запись с этим ключом, или на любую попавшуюся из записей с таким ключом?

На любую попавшуюся, хотя кажется, что всегда на "первую".

DmitryKn
3. Если мы команду =seek(id,'table','table.id') даем, и записей с table.id = id несколько, то курсор встанет именно на первую (если можно так выразиться - первую "сверху") или опять-таки на какую-то?

Надо ли мне предварительно в дочерней таблице курсор вверх загонять?

Встанет на ту которая в этот момент находится в памяти.

Первая сверху, не всегда одна и та же запись, например если удалить "первую сверху", то первой станет уже другая запись.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
PaulWist
Встанет на ту которая в этот момент находится в памяти.
Первая сверху, не всегда одна и та же запись, например если удалить "первую сверху", то первой станет уже другая запись.

Я имел ввиду, перед редактированием дочерней таблицы, туда вносятся данные из вью с помощью SCAN, вот нужно ли ее сортировать по ключу и загнать курсор вверх, предварительно? Или при перемещении курсора на строку в главной, в дочерней записи отбираются, а курсор встанет автоматически на "верхней" строке?



Исправлено 1 раз(а). Последнее : DmitryKn, 22.02.23 13:36
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
В дочерней таблице текущей записью всегда будет та, которую вы назвали "первой".
При этом "первая" - с учетом текущего тега, а не физического порядка.
Это касается и функции SEEK(), и SET RELATION.

Цитата:
Или при перемещении курсора на строку в главной, в дочерней записи отбираются, а курсор встанет автоматически на "верхней" строке?
Быстрее самому это проверить, чем ждать ответа.



Исправлено 1 раз(а). Последнее : akvvohinc, 22.02.23 13:52
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
нужно ли ее сортировать по ключу
Непонятно.
Дочерняя таблица уже имеет установленный нужный тег.

Впрочем, мне вообще не совсем понятно, что подразумевается под "сортировать по ключу".
Какая команда имеется в виду?
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
В дочерней таблице текущей записью всегда будет та, которую вы назвали "первой".
При этом "первая" - с учетом текущего тега, а не физического порядка.
Это касается и функции SEEK(), и SET RELATION.

т.е. при установке курсора на строку в главной table1 с примари ключом id это будет тождественно:
select table2 && дочерняя
set filter to table2.id = table1.id
go top
select table1

akvvohinc
Цитата:
Или при перемещении курсора на строку в главной, в дочерней записи отбираются, а курсор встанет автоматически на "верхней" строке?
Быстрее самому это проверить, чем ждать ответа.

если возможен гипотетический случай, что "встанет в верхней строке" - в большинстве случаев, но это не точно , то как я проверю?



Исправлено 1 раз(а). Последнее : DmitryKn, 22.02.23 14:00
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
Цитата:
нужно ли ее сортировать по ключу
Непонятно.
Дочерняя таблица уже имеет установленный нужный тег.

Впрочем, мне вообще не совсем понятно, что подразумевается под "сортировать по ключу".
Какая команда имеется в виду?

имел ввиду - отобрать записи с нужным значением ключа и загнать курсор вверх, как в моем посте выше.
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
DmitryKn
т.е. при установке курсора на строку в главной table1 с примари ключом id это будет тождественно...
Не проверял.

Но могу лишь повторить, что перемещаясь по родительской таблице и имея установленную связь или используя функцию SEEK(), в дочерней таблице текущей записью будет та, которая была бы выше, если бы вы просто листали дочернюю таблицу с тем же установленным тегом, с той же опцией ASCENDING/DESCENDING и тем же фильтром.

Цитата:
если возможен гипотетический случай, что "встанет в верхней строке" - в большинстве случаев, но это не точно , то как я проверю?
Никак.
Доказывать, что барабашка существует должен тот, кто это утверждает.
Вы доказать обратное не сможете в принципе - проведите хоть миллион опытов.
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
имел ввиду - отобрать записи с нужным значением ключа и загнать курсор вверх, как в моем посте выше.
Что-то я уже запутался - то SET RELATION со SET SKIP, то SEEK(), то SET FILTER.
Опишите саму задачу.

Если вам просто требуется "собрать в кучку" все записи дочерней таблицы, соответствующие какой-то записи родительской, и вы не хотите пользоваться командой SELECT SQL, то при установленном нужном теге в таблице child:
SET KEY TO parent.id IN child && текущая запись в child не изменится!
GO TOP IN child && встали на "первую"
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
Цитата:
имел ввиду - отобрать записи с нужным значением ключа и загнать курсор вверх, как в моем посте выше.
Что-то я уже запутался[/code]

Прошу извинить, если путанно излагаю.

Есть relations между таблицами один-ко-многим.
Хотел спросить у уважаемого сообщества действительно ли при установке курсора на запись в родительской с каким-то значением ключа, в дочерней курсор автоматически будет установлен в "верхней" записи диапазона с совпадающими значениями ключа. Или может встать на любой строке из этого диапазона произвольно.
Ratings: 0 negative/0 positive
Re: Relations
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Для чего это знание, какую задачу пытаетесь решить?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Есть relations между таблицами один-ко-многим.
Хотел спросить у уважаемого сообщества действительно ли при установке курсора на запись в родительской с каким-то значением ключа, в дочерней курсор автоматически будет установлен в "верхней" записи диапазона с совпадающими значениями ключа.
Я никогда в жизни не использовал DE, но, полагаю, что все способы по работе с парой "родитель-ребёнок" построены в Фоксе по одной "схеме" - при движении по родителю, в дочерней таблице текущей всегда становится "первая" запись соответствующего диапазона.
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
пытаюсь анализировать свой код сохранения данных, ищу ошибку.
На каком-то этапе теряю информацию (это ошибка не постоянная, бывает изредка, самостоятельно на своем рабочем месте вызвать ее не могу, но у пользователя видел своими глазами, помимо жалоб).
Ранее мы ситуацию уже с вами обсуждали, когда я ввел в код транзакции , и RI restrict по вашему совету.
Коротко напомню - данные готовятся во вью, потом переносятся в таблицу.
Вью заполнен - это мы видим в гриде формы.
В ходе сохранения выполняется tablupdate вью, потом scan, и insert или replace построчно в таблицу, потом соответственно, tablupdate таблиц, и то и другое в транзакции. Транзакции ошибок не дают.
Буферизация вью 3 , таблиц - 5.
После сохранения бывает случаи, когда этих записей в таблице нет, т.е. туда ничего не попало.
Это может произойти несколько раз подряд, потом эти же данные совершенно корректно сохраняются. Т.е. ошибка типа "пропустил какое-то поле" исключена.

Вот пытаюсь осознанно перебрать весь этот гребаный код, что бы понять, где все же "что-то не то".
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
akvvohinc
Цитата:
Есть relations между таблицами один-ко-многим.
Хотел спросить у уважаемого сообщества действительно ли при установке курсора на запись в родительской с каким-то значением ключа, в дочерней курсор автоматически будет установлен в "верхней" записи диапазона с совпадающими значениями ключа.
Я никогда в жизни не использовал DE, но, полагаю, что все способы по работе с парой "родитель-ребёнок" построены в Фоксе по одной "схеме" - при движении по родителю, в дочерней таблице текущей всегда становится "первая" запись соответствующего диапазона.

я так тоже полагал, но четкого определения нигде не прочитал, хотел убедиться наверняка.
Ratings: 0 negative/0 positive
Re: Relations
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
DmitryKn
В ходе сохранения выполняется tablupdate вью, потом scan, и insert или replace построчно в таблицу, потом соответственно, tablupdate таблиц, и то и другое в транзакции. Транзакции ошибок не дают.
Буферизация вью 3 , таблиц - 5.
После сохранения бывает случаи, когда этих записей в таблице нет, т.е. туда ничего не попало.

Анализируется, что возвращает ф-ия TableUpdate()?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Relations
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
четкого определения нигде не прочитал, хотел убедиться наверняка.
В Help по команде SET SKIP написано, на мой взгляд, достаточно чётко:
Цитата:
Using SET RELATION, you can establish relations between tables open in different work areas. When the record pointer is moved in the parent table, the record pointer in the child table moves to the first corresponding record. The relational expression in SET RELATION determines where the record pointer moves in the child table. A one-to-one relation is created — for each record in the parent table, the record pointer moves to the first matching record in the child table. If a matching record can't be found in the child table, the record pointer in the child table moves to the end of the table.

Frequently, a child table contains multiple records that correspond to one record in the parent table. SET SKIP lets you establish a one-to-many relationship between one record in the parent table and multiple records in the child table. When you skip through the parent table, the record pointer remains on the same parent record until the record pointer moves through all related records in the child table.



Исправлено 1 раз(а). Последнее : akvvohinc, 22.02.23 17:24
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
PaulWist
DmitryKn
В ходе сохранения выполняется tablupdate вью, потом scan, и insert или replace построчно в таблицу, потом соответственно, tablupdate таблиц, и то и другое в транзакции. Транзакции ошибок не дают.
Буферизация вью 3 , таблиц - 5.
После сохранения бывает случаи, когда этих записей в таблице нет, т.е. туда ничего не попало.

Анализируется, что возвращает ф-ия TableUpdate()?

ну да
BEGIN TRANSACTION
m.lisError = .f.
FOR m.a = 1 TO ALEN(aTables)
m.lisError = !TABLEUPDATE(.t.,.t.,aTables[a])
IF m.lisError
LOOP
ENDIF
ENDFOR
IF m.lisError
ROLLBACK
LOCAL laError(1)
=Aerror(laError)
MessageBox("Сохранение таблиц не удалось . Ошибка: " + transform(laError[1,1])+ " " + laError[1,2] + " триггер " + STR(laError[1,5]))
this.restore
ELSE
END TRANSACTION
ENDIF



Исправлено 1 раз(а). Последнее : DmitryKn, 22.02.23 18:01
Ratings: 0 negative/0 positive
Re: Relations
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Вместо loop надо exist, в приведенном коде при возникновении ошибки, не выходтся из цикла, презод идет на следующую таблицу.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Relations
DmitryKn
Автор

Сообщений: 300
Дата регистрации: 06.04.2022
PaulWist
Вместо loop надо exist, в приведенном коде при возникновении ошибки, не выходтся из цикла, презод идет на следующую таблицу.

Спасибо, поправлю.

В таком случае, даже если ошибка была, она могла затереться следующей таблицей (



Исправлено 1 раз(а). Последнее : DmitryKn, 22.02.23 19:32
Ratings: 0 negative/0 positive
Re: Relations
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
DmitryKn
PaulWist
Вместо loop надо exist, в приведенном коде при возникновении ошибки, не выходтся из цикла, презод идет на следующую таблицу.

Спасибо, поправлю.

В таком случае, даже если ошибка была, она могла затереться следующей таблицей (

Конечно, и ошибку можно было отловить, если она произошла на "последней таблице."


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 31 (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика