Форум » GUI » Каскадное удаление связанных записей » Ответить

Каскадное удаление связанных записей

Dr. Oldwarez: Итак, у меня есть форма с целыми четырьмя 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

Vlad04: PostProd - удаление всех строчек А разве при такой команде все записи будут удалены? Я удаляю в цикле Do While !eof() // Удаление из БД slave if slave->N_Talon != Master->(N_Talon) ; exit; endif Delete Skip enddo А потом в родительской базе Select Master Delete

Dr. Oldwarez: Это не проблема. Проблема - связанное обновление подчинённого TSBROWSE. После удаления оно переходит на следующую строчку главной таблицы. Нужно, чтобы соответственно обновлялся подчинённый TSBROWSE.

davir: Для обновления повесить на событие ON Change метод oBrw:SetFilter


Dr. Oldwarez: И это я знаю, только у меня не SetFilter, а SCOPE с последующим обновлением, поскольку у меня CDX индексы, а SetFilter ИМХО рассчитан на NTX

Петр: 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 что-то намутил, и оптимизировать не помешало бы.

davir: Мне кажется нет разницы. SetFilter, наверное не навредил бы. Тогда попробуй Brw1:bChange:={||Ordscope(?),Brw2:Refresh(.t.),Brw3:Refresh(.t.),Brw3:Refresh(.t.)}

gfilatov2002: Петр пишет: к слову, SetFilter заблокирован #ifdef _TSBFILTER7_, а некоторые static функции, используемые только SetFilter почему то нет. Спасибо, поправил для следующей сборки



полная версия страницы