powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Каскадное удаление данных
25 сообщений из 34, страница 1 из 2
Каскадное удаление данных
    #37016997
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 3 таблицы на foxpro. Как организовать каскадное удаление записей?

делаю
delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017004
НадеждаМ,
а триггеры-то сгенерированы?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017006
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.,

Вот на триггеры у меня ругалося
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017009
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
щас не ругается, но и не удаляется
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017012
НадеждаМщас не ругается, но и не удаляетсяНу так и разбирайтесь с ними. Пока не будет триггеров ни о каких каскадных действиях не можт быть и речи.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017016
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.,

Вот один из триггеров, я не очень понимаю что здесь написано

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
** "Referential integrity delete trigger for" marka
PROCEDURE __RI_DELETE_marka
LOCAL llRetVal
llRetVal = .t.
PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
PRIVATE pcParentExpr,pcChildExpr
STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
STORE 0 TO pnParentRec,pnChildRec
IF _triggerlevel=1
  BEGIN TRANSACTION
  PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
  pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
  pcOldTalk=SET("TALK")
  SET TALK OFF
  pcOldDele=SET("DELETED")
  pcOldExact=SET("EXACT")
  pcOldCompat=SET("COMPATIBLE")
  SET COMPATIBLE OFF
  SET DELETED ON
  SET EXACT OFF
  pcRIcursors=""
  pcRIwkareas=""
  pcRIolderror=ON("error")
  pnerror=0
  ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
  IF TYPE('gaErrors(1)')<>"U"
    release gaErrors
  ENDIF
  PUBLIC gaErrors(1,12)
  pcOldDBC=DBC()
  SET DATA TO ("MAGAZIN")
ENDIF first trigger
LOCAL lcParentID && parent's value to be sought in child
LOCAL lcChildWkArea && child work area handle returned by riopen
LOCAL lcParentWkArea
LOCAL llDelHeaderarea
LOCAL lcStartArea
lcStartArea=select()
llRetVal=.t.
lcParentWkArea=select()
SELECT (lcParentWkArea)
pcParentDBF=dbf()
pnParentRec=recno()
STORE KOD_MARK TO lcParentID,pcParentID
pcParentExpr="KOD_MARK"
lcChildWkArea=riopen("zajavka","kod_mark")
IF lcChildWkArea<=0
  IF _triggerlevel=1
    DO riend WITH .F.
  ENDIF at the end of the highest trigger level
  RETURN .F.
ENDIF not able to open the child work area
pcChildDBF=dbf(lcChildWkArea)
llRetVal=!SEEK(lcParentID,lcChildWkArea)
SELECT (lcChildWkArea)
pnChildRec=recno()
pcChildID=KOD_MARK
pcChildExpr="KOD_MARK"
IF !llRetVal
  pnError = rierror(-1,"Delete restrict rule violated.","","")
ENDIF
=rireuse("zajavka",lcChildWkArea)
IF NOT llRetVal
  IF _triggerlevel=1
    DO riend WITH llRetVal
  ENDIF at the end of the highest trigger level
  SELECT (lcStartArea)
  RETURN llRetVal
ENDIF
IF _triggerlevel=1
  do riend with llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
** "End of Referential integrity Delete trigger for" marka
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017018
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
procedure __RI_UPDATE_marka
** "Referential integrity update trigger for" marka
LOCAL llRetVal
llRetVal = .t.
PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
PRIVATE pcParentExpr,pcChildExpr
STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
STORE 0 TO pnParentRec,pnChildRec
IF _triggerlevel=1
BEGIN TRANSACTION
PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
pcOldTalk=SET("TALK")
SET TALK OFF
pcOldDele=SET("DELETED")
pcOldExact=SET("EXACT")
pcOldCompat=SET("COMPATIBLE")
SET COMPATIBLE OFF
SET DELETED ON
SET EXACT OFF
pcRIcursors=""
pcRIwkareas=""
pcRIolderror=ON("error")
pnerror=0
ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
IF TYPE('gaErrors(1)')<>"U"
release gaErrors
ENDIF
PUBLIC gaErrors(1,12)
pcOldDBC=DBC()
SET DATA TO ("MAGAZIN")
ENDIF first trigger
LOCAL lcParentID && parent's value to be sought in child
LOCAL lcOldParentID && previous parent id value
LOCAL lcChildWkArea && child work area handle returned by riopen
LOCAL lcChildID && child's value to be sought in parent
LOCAL lcOldChildID && old child id value
LOCAL lcParentWkArea && parentwork area handle returned by riopen
LOCAL lcStartArea
lcStartArea=select()
llRetVal=.t.
lcParentWkArea=select()
SELECT (lcParentWkArea)
pcParentDBF=dbf()
pnParentRec=recno()
lcOldParentID=OLDVAL("KOD_MARK")
pcParentID=lcOldParentID
pcParentExpr="KOD_MARK"
lcParentID=KOD_MARK
IF lcParentID<>lcOldParentID
lcChildWkArea=riopen("zajavka")
IF lcChildWkArea<=0
IF _triggerlevel=1
DO riend WITH .F.
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN .F.
ENDIF not able to open the child work area
pcChildDBF=dbf(lcChildWkArea)
SELECT (lcChildWkArea)
SCAN FOR KOD_MARK=lcOldParentID
pnChildRec=recno()
pcChildID=KOD_MARK
pcChildExpr="KOD_MARK"
IF NOT llRetVal
EXIT
ENDIF && not llretval
llRetVal=riupdate("KOD_MARK",lcParentID,"MARKA")
ENDSCAN get all of the zajavka records
=rireuse("zajavka",lcChildWkArea)
IF NOT llRetVal
IF _triggerlevel=1
DO riend WITH llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
ENDIF
ENDIF this parent id changed
IF _triggerlevel=1
do riend with llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
** "End of Referential integrity Update trigger for" marka
********************************************************************************

********************************************************************************
procedure __RI_UPDATE_zajavka
** "Referential integrity update trigger for" zajavka
LOCAL llRetVal
llRetVal = .t.
PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
PRIVATE pcParentExpr,pcChildExpr
STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
STORE 0 TO pnParentRec,pnChildRec
IF _triggerlevel=1
BEGIN TRANSACTION
PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
pcOldTalk=SET("TALK")
SET TALK OFF
pcOldDele=SET("DELETED")
pcOldExact=SET("EXACT")
pcOldCompat=SET("COMPATIBLE")
SET COMPATIBLE OFF
SET DELETED ON
SET EXACT OFF
pcRIcursors=""
pcRIwkareas=""
pcRIolderror=ON("error")
pnerror=0
ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
IF TYPE('gaErrors(1)')<>"U"
release gaErrors
ENDIF
PUBLIC gaErrors(1,12)
pcOldDBC=DBC()
SET DATA TO ("MAGAZIN")
ENDIF first trigger
LOCAL lcParentID && parent's value to be sought in child
LOCAL lcOldParentID && previous parent id value
LOCAL lcChildWkArea && child work area handle returned by riopen
LOCAL lcChildID && child's value to be sought in parent
LOCAL lcOldChildID && old child id value
LOCAL lcParentWkArea && parentwork area handle returned by riopen
LOCAL lcStartArea
lcStartArea=select()
llRetVal=.t.
lcChildWkArea=select()
IF _triggerlevel=1 or type("pccascadeparent")#"C" or (NOT pccascadeparent=="MARKA")
SELECT (lcChildWkArea)
lcChildID=KOD_MARK
lcOldChildID=oldval("KOD_MARK")
pcChildDBF=dbf(lcChildWkArea)
pnChildRec=recno(lcChildWkArea)
pcChildID=lcOldChildID
pcChildExpr="KOD_MARK"
if isnull(lcChildID) or isnull(lcOldChildID) or lcChildID <> lcOldChildID
lcParentWkArea=riopen("marka","kod_mark")
IF lcParentWkArea<=0
IF _triggerlevel=1
DO riend WITH .F.
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN .F.
ENDIF not able to open the child work area
pcParentDBF=dbf(lcParentWkArea)
llRetVal=SEEK(lcChildID,lcParentWkArea)
pnParentRec=recno(lcParentWkArea)
if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ;
isflocked(lcParentWkArea))
if rlock(lcParentWkArea)
unlock record pnParentRec in (lcParentWkArea)
else
=rireuse("tparen",lcParentWkArea)
pnError = rierror(-1,"Insert restrict rule violated.","","")
IF _triggerlevel=1
DO riend WITH llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
endif
endif
=rireuse("marka",lcParentWkArea)
IF NOT llRetVal
pnError = rierror(-1,"Insert restrict rule violated.","","")
IF _triggerlevel=1
DO riend WITH llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
ENDIF no parent
ENDIF this value was changed
ENDIF not part of a cascade from "marka"
IF _triggerlevel=1 or type("pccascadeparent")#"C" or (NOT pccascadeparent=="ZAPCHASTI")
SELECT (lcChildWkArea)
lcChildID=KOD_ZAPCH
lcOldChildID=oldval("KOD_ZAPCH")
pcChildDBF=dbf(lcChildWkArea)
pnChildRec=recno(lcChildWkArea)
pcChildID=lcOldChildID
pcChildExpr="KOD_ZAPCH"
if isnull(lcChildID) or isnull(lcOldChildID) or lcChildID <> lcOldChildID
lcParentWkArea=riopen("zapchasti","kod_zapch")
IF lcParentWkArea<=0
IF _triggerlevel=1
DO riend WITH .F.
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN .F.
ENDIF not able to open the child work area
pcParentDBF=dbf(lcParentWkArea)
llRetVal=SEEK(lcChildID,lcParentWkArea)
pnParentRec=recno(lcParentWkArea)
if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ;
isflocked(lcParentWkArea))
if rlock(lcParentWkArea)
unlock record pnParentRec in (lcParentWkArea)
else
=rireuse("tparen",lcParentWkArea)
pnError = rierror(-1,"Insert restrict rule violated.","","")
IF _triggerlevel=1
DO riend WITH llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
endif
endif
=rireuse("zapchasti",lcParentWkArea)
IF NOT llRetVal
pnError = rierror(-1,"Insert restrict rule violated.","","")
IF _triggerlevel=1
DO riend WITH llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
ENDIF no parent
ENDIF this value was changed
ENDIF not part of a cascade from "zapchasti"
lcParentWkArea=lcChildWkArea
IF _triggerlevel=1
do riend with llRetVal
ENDIF at the end of the highest trigger level
SELECT (lcStartArea)
RETURN llRetVal
** "End of Referential integrity Update trigger for" zajavka
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017024
НадеждаМ,
Вы мне предлагаете эти нечитаемые портянки ковырять? Вы сами не можете по ним пройтись отладчиком?

Перегенерите триггеры и работайте.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017028
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017089
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошлась отладчиком, но так ничего и не выявила
как я поняла, ошибки должны записываться в массив gaerrors, но у меня там .f. везде.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017141
НадеждаМПрошлась отладчиком, но так ничего и не выявила
как я поняла, ошибки должны записываться в массив gaerrors, но у меня там .f. везде.А отладчик нужен только ошибки ловить? Вы там команды delete видели? Если нет, то чего Вы от таких триггеров ждете?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017143
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите мне мою глупость, нашла свою ошибку. Просто pack не сделала после того как в дочерней таблице zajavka запись пометилась на удаление.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017418
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМ Просто pack не сделала после того как в дочерней таблице zajavka запись пометилась на удаление.

жесть.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017663
reware
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМЕсть 3 таблицы на foxpro. Как организовать каскадное удаление записей?

делаю
delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT table1
deleted_kod_mark=kod_mark
DELETE FOR kod_mark=deleted_kod_mark
PACK
SELECT table2
DELETE FOR <чего-то равно чему-то>
PACK
SELECT table3 
DELETE FOR <чего-то равно чему-то>
PACK
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017684
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rewareНадеждаМЕсть 3 таблицы на foxpro. Как организовать каскадное удаление записей?

делаю
delete from mark where kod_mark=4, удаляется только из таблицы marka, а связанная запись из таблицы zajavka не удаляется.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT table1
deleted_kod_mark=kod_mark
DELETE FOR kod_mark=deleted_kod_mark
PACK
SELECT table2
DELETE FOR <чего-то равно чему-то>
PACK
SELECT table3 
DELETE FOR <чего-то равно чему-то>
PACK



ты что, дурик, детям показываешь?
зачем ты PACK написал, злодей?

брысь на фоксклаб - курить.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017832
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
reware,

Спасибо, но я уже сделала. Pack только вот забыла.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017862
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМreware,

Спасибо, но я уже сделала. Pack только вот забыла.

теперь расскажите:

- зачем Вы пакуете записи в таблице?
- Вы в курсе того, что делает эта команда?
- Вы задаетесь вопросами разработки приложений,
с которыми одновременно работает много пользователей?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017873
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delete помечает на удаление записи, а pack эти записи удаляет. В данном случае никакое не приложение, а просто лаба в универе.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017896
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМDelete помечает на удаление записи, а pack эти записи удаляет. В данном случае никакое не приложение, а просто лаба в универе.

аааа

ну так подготовьтесь заранее к ответу на вопрос препода:
а что будет если Ваши таблички будут юзать 2 пользователя?

пак - это "страшная" команда с точки зрения грамотного
разработчика.

для справки: при команде пак, вначале лочится таблица,
из нее записи переливаются в новый файл, а старый удаляется.

в сети, когда с таблицами одновр.работают неск.пользователей такого делать нельзя.
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017944
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимо,

как же тогда удалить записи, не используя pack?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37017990
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМпрошелмимо,

как же тогда удалить записи, не используя pack?

Вам не достаточно того, что записи помечены на удаление?

поиском:
-set deleted
-бинарный индекс(дополнительно для погружения в тему оптимизации)
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37018100
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимо,

Помечены то помечены, но в таблице то оно видны
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37018147
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМпрошелмимо,

Помечены то помечены, но в таблице то оно видны

кем и кому видны?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37018172
НадеждаМпрошелмимо,

Помечены то помечены, но в таблице то оно видныНу так сделайте невидимыми. Или Вы не умеете?
...
Рейтинг: 0 / 0
Каскадное удаление данных
    #37018176
НадеждаМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимо,

через browse если открыть таблицу
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Каскадное удаление данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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