Автор | Сообщение |
|
| постоянный участник
|
Пост N: 104
Зарегистрирован: 27.07.08
|
|
Отправлено: 27.11.10 16:01. Заголовок: Каскадное удаление связанных записей
Итак, у меня есть форма с целыми четырьмя TSBROWSE, причём каждое - на уровень ниже в иерархической структуре данных: 1) Проект 2) Тип работ 3) Подтип работ 4) Вид работ. В TSBROWSE есть метод SetDeleteAction(lOnOff,lConfirm,{|nRecNo,oBrw,lRecall|PrevProd},{||PostProd}) Нужно, чтобы при удалении из таблиц верхнего уровня каскадно удалялись связанные записи из таблицы нижнего уровня. Перед удалением - диалог с вопросом Нужно ли удалять Да/Нет. Возможность восстановления Recall не нужна. Как получше это организовать. PrevProd захватывает первичный ключ для связи с данной таблицей, а PostProd - удаление всех строчек, которые попадают под этот первичный ключ. FUNCTION PrevProd(nRecno,oBrw,lRecall) cProNum:=Projekt->ProNum //PUBLIC RETURN .T. //Запретов на удаление пока нет FUNCTION PostProd(oBrw) SetScope(0,cProNum) SetScope(1,cProNum) DELETE //Обновление TSBROWSE RETURN Или как по-вашему лучше всего организовать каскадное удаление?
|
|
|
Ответов - 7
[только новые]
|
|
|
| постоянный участник
|
Пост N: 179
Зарегистрирован: 13.10.05
|
|
Отправлено: 27.11.10 20:19. Заголовок: PostProd - удаление..
цитата: | PostProd - удаление всех строчек |
|
А разве при такой команде все записи будут удалены? Я удаляю в цикле Do While !eof() // Удаление из БД slave if slave->N_Talon != Master->(N_Talon) ; exit; endif Delete Skip enddo А потом в родительской базе Select Master Delete
|
|
|
|
| постоянный участник
|
Пост N: 105
Зарегистрирован: 27.07.08
|
|
Отправлено: 28.11.10 11:10. Заголовок: Это не проблема. Про..
Это не проблема. Проблема - связанное обновление подчинённого TSBROWSE. После удаления оно переходит на следующую строчку главной таблицы. Нужно, чтобы соответственно обновлялся подчинённый TSBROWSE.
|
|
|
|
| |
Пост N: 16
Зарегистрирован: 14.04.10
|
|
Отправлено: 28.11.10 14:19. Заголовок: Для обновления пове..
Для обновления повесить на событие ON Change метод oBrw:SetFilter
|
|
|
|
| постоянный участник
|
Пост N: 106
Зарегистрирован: 27.07.08
|
|
Отправлено: 28.11.10 21:55. Заголовок: И это я знаю, только..
И это я знаю, только у меня не SetFilter, а SCOPE с последующим обновлением, поскольку у меня CDX индексы, а SetFilter ИМХО рассчитан на NTX
|
|
|
|
| постоянный участник
|
Пост N: 1005
Зарегистрирован: 09.10.06
|
|
Отправлено: 29.11.10 12:42. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: Все знаю и почему то не получается? В поледней версии TSBrowse метода SetDeleteAction - я не нашел. И, к слову, SetFilter заблокирован #ifdef _TSBFILTER7_, а некоторые static функции, используемые только SetFilter почему то нет. Есть метод SetDeleteMode, в справочнике в разделе написано "This Method only activates this feature. Deletion is done by method DeleteRow()". Т.е. никаких внешних DELETE, GOTO и пр. Все действия только через методы объекта - удаление, позиционирование, обновление и т.д. P.S. В методе DeleteRow Carlos что-то намутил, и оптимизировать не помешало бы.
|
|
|
|
| |
Пост N: 17
Зарегистрирован: 14.04.10
|
|
Отправлено: 29.11.10 13:14. Заголовок: Мне кажется нет разн..
Мне кажется нет разницы. SetFilter, наверное не навредил бы. Тогда попробуй Brw1:bChange:={||Ordscope(?),Brw2:Refresh(.t.),Brw3:Refresh(.t.),Brw3:Refresh(.t.)}
|
|
|
|
| moderator
|
Пост N: 126
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.11.10 15:18. Заголовок: Петр пишет: к слову..
Петр пишет: цитата: | к слову, SetFilter заблокирован #ifdef _TSBFILTER7_, а некоторые static функции, используемые только SetFilter почему то нет. |
| Спасибо, поправил для следующей сборки
|
|
|
|