powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cascade удаление удаляет не все записи?!
11 сообщений из 11, страница 1 из 1
Cascade удаление удаляет не все записи?!
    #33835206
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентльмены!
Заметила этот свой недочет в проекте лишь сегодня и была озадачена. Объясняю в общих чертах.
Table1: nIdCod, cFio, cAdres. Primary индекс на nIdCod.
Table2: nId, nIdCod, dDate, cComment. Primary индекс на nId, Regular на nIdCod.
В DB Disigner установлен Relationship "один ко многим" от Table1 к Table2 по индексам на nIdCod. Когда делаю триггер, получается, что Table1 является Parent, а Table2 - Child, на Delete выставлено Cascade. Как я рассчитывала, при удалении записи в Table1 из Table2 должны удаляться все записи с таким же nIdCod. А сегодня заглянула в таблицу и очень удивилась. В Table2 всегда после удаления остается 1 запись из тех, которые, по идее, должны каскадно удалитсья при удалении родительской записи.
Извините, что так путанно объясняю пробему. Но кто догадался, что я хотела сказать, посоветуйте.
Благодарю.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835277
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пиведите, код при удалении, желательно так как он у Вас реализован, а не пример кода.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835308
ЛисонькаЛеди и джентльмены!
Заметила этот свой недочет в проекте лишь сегодня и была озадачена. Объясняю в общих чертах.
Table1: nIdCod, cFio, cAdres. Primary индекс на nIdCod.
Table2: nId, nIdCod, dDate, cComment. Primary индекс на nId, Regular на nIdCod.
В DB Disigner установлен Relationship "один ко многим" от Table1 к Table2 по индексам на nIdCod. Когда делаю триггер, получается, что Table1 является Parent, а Table2 - Child, на Delete выставлено Cascade. Как я рассчитывала, при удалении записи в Table1 из Table2 должны удаляться все записи с таким же nIdCod. А сегодня заглянула в таблицу и очень удивилась. В Table2 всегда после удаления остается 1 запись из тех, которые, по идее, должны каскадно удалитсья при удалении родительской записи.
Извините, что так путанно объясняю пробему. Но кто догадался, что я хотела сказать, посоветуйте.
Благодарю.
Сделай процедуру по поиску "провисших ссылок" (т.е. таблица2-parent, а таблица1-Child) и удаляй из таблицы2 те записи, для которых нет "пары" в таблице1. поставь эту процедуру в раздел "Администрирование" и запускай периодически....
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835333
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия FoxPro?

Приведи код процедуры каскадного удаления. Это в хранимых процедурах, начинается с

procedure RIDELETE

В некоторых версиях VFP там была ошибка, а кроме того, этот код может не сработать при определенных условиях.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835554
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWistПиведите, код при удалении, желательно так как он у Вас реализован, а не пример кода.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
** Это в Loade**
= CURSORSETPROP('Buffering',  5 , 'Table1')

** Это на KeyPress кнопки  **
   SELECT Table1
   REPLACE Table1.cFio WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))    && Может и лишнее, но делаю для того, чтобы, если; 
                                                                                                         пользователям вновь придется внести этого же человека, ;
                                                                                                         на нарушилась уникальность другого индека этой же таблицы
   REPLACE Table1.cAdres WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))
   ........
   DELETE 
   GO TOP IN Table1
   =TABLEUPDATE(.t.)
авторСделай процедуру по поиску "провисших ссылок" (т.е. таблица2-parent, а таблица1-Child) и удаляй из таблицы2 те записи, для которых нет "пары" в таблице1. поставь эту процедуру в раздел "Администрирование" и запускай периодически....
Можно и код написать на удаление по nIdCod, но почему триггер так работает?
авторКакая версия FoxPro?
Приведи код процедуры каскадного удаления. Это в хранимых процедурах, начинается с
procedure RIDELETE
В некоторых версиях VFP там была ошибка, а кроме того, этот код может не сработать при определенных условиях.
Вроде бы выслала то, что Вы попросили.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835633
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не то.

Это текста собственно триггера, но внутри себя он вызывает другую процедуру вот этой командой

llRetVal=ridelete()

Так вот, RIDELETE - это процедура созданная там же. Она как раз и обеспечивает сам факт удаления.

А триггер __RI_DELETE_table1 - это по сути, просто цикл, который перебирает все записи, которые он планирует удалить и вызывает для удаления функцию RIDELETE(). Вот код этой самой функции и хотелось бы посмотреть.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835726
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЭто не то.
Это текста собственно триггера, но внутри себя он вызывает другую процедуру вот этой командой
llRetVal=ridelete()
Так вот, RIDELETE - это процедура созданная там же. Она как раз и обеспечивает сам факт удаления.
А триггер __RI_DELETE_table1 - это по сути, просто цикл, который перебирает все записи, которые он планирует удалить и вызывает для удаления функцию RIDELETE(). Вот код этой самой функции и хотелось бы посмотреть.
Уважаемый Гуру!
Я приношу свои извинения, но значить я попросту не знаю, где находится процедура RIDELETE. Поскольку по поиску в Stored Procedure этого слова я не нахожу, значит, процедура прописана где-то еще. Вопрос: а где тогда ее можно посмотреть, скопировать и выложить на форум?
Благодарю.
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835764
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RIDELETE вообще-то одна из самых первых после фразы

**__RI_HEADER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_HEADER**

Однако если ее не нашли, то как же вообще триггер работает? Ведь в присланном фрагменте явно прописан ее вызов

llRetVal=ridelete()

Попробуй сделать тестовую базу с 2 таблицам и создай для них триггер на удаление по типу Cascade.

Кроме того, команду TableUpdate() "в никуда" давать просто нельзя. Как же отлавливать возможные ошибки? Как минимум, нужно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
IF TableUpdate(.T.) = .F.
	LOCAL laError( 1 )
	=AERROR(laError)
	IF laError[ 1 , 1 ] =  1539  && ошибка триггера
		* Смотрим глобальный массив gaErrors
		* Этот массив создается и напоняется внутри тела триггера 
		* и содержит причину возникновения ошибки
	ENDIF
ENDIF
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33835816
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнение, поскольку идет каскадное обновление FK, не мешало бы обернуть модификацию в транзакцию.


ВладимирМ

Кстати, на View такой фокус не прошел бы.

Код: plaintext
1.
2.
3.
4.
REPLACE Table1.cAdres WITH ALLTRIM(STR(Table1.nIdCod, 6 , 0 ))
   ........
   DELETE
   GO TOP IN Table1
   =TABLEUPDATE(.t.)
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33837349
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделала БД из двух таблиц. Выставила триггер. Та же история. Сегодня утром проделала эту процедуру на другом компьютере. Там все нормально (фоксовый дитрибутив на машинах один и тот же). Тогда я снесла Фокс у себя и инсталльнула заново. В проекте заново расставила триггеры. И все заработало. Появился код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure RIDELETE
local llRetVal
llRetVal=.t.
 IF (ISRLOCKED() and !deleted()) OR !RLOCK()
    llRetVal=.F.
  ELSE
    IF !deleted()
      DELETE
      IF CURSORGETPROP('BUFFERING') >  1 
      	=TABLEUPDATE()
      ENDIF
    ENDIF not already deleted
  ENDIF
  UNLOCK RECORD (RECNO())
  llRetVal=pnerror= 0 
RETURN llRetVal
Благодарю всех-всех-всех!

Елизавета Скрунскайте
...
Рейтинг: 0 / 0
Cascade удаление удаляет не все записи?!
    #33837780
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМКроме того, команду TableUpdate() "в никуда" давать просто нельзя.
Каюсь, Учитель!.. Вы же мне еще месяца два назад попеняли на эту "безадресность". Я везде в проекте переправила, а про кнопку для удаления не подумала (((
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Cascade удаление удаляет не все записи?!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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