Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Отображение записей в DBGrid  (Прочитано 15199 раз)
0 Пользователей и 1 Гость смотрят эту тему.
liones
Постоялец

ru
Offline Offline
Пол: Женский

« : 13-05-2009 08:27 » 

Есть 2 таблицы. Нужно при удалении записи в главной таблице удалить записи во второй таблице. При этом, если пользователь передумал, то отменить удаление записей. Написала вот такую процедуру:

Код:
procedure TDM.TIFBeforeDelete(DataSet: TDataSet);
begin
    if DM.TMed.Locate('KOD_IF',DM.TIFKOD_IF.Value,[]) then
    begin
        if Messagedlg('Найдены связанные записи!'+#13+'Все равно хотите удалить?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
            DM.TMed.Filtered:=True;
            DM.TMed.Filter:='KOD_IF='+chr(39)+DM.TIFKOD_IF.AsString+chr(39);
            kol:=DM.TMed.RecordCount;
            DM.TMed.First;

            for i:=1 to kol do
            begin
                DM.TMed.Edit;
                DM.TMed.Delete;
                DM.TMed.Post;
            end;

            DM.TMed.Filtered:=False;
        end else begin
            DM.TIF.RevertRecord;
        end;
    end;
end;

В принципе работает, но как-то коряво. Если пользователь передумал удалять, запись остается в таблице, но в DBGrid не отображается. Чего не хватает?
« Последнее редактирование: 13-05-2009 09:36 от RXL » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-05-2009 09:40 » 

liones, я переформатировал твой код и обернул тегами [code]...[/code] - также делай в следующий раз, а то читать эту кашу невозможно.

И что мы видим?...
Ни-че-го!
Чё за DM, чё за TMed, чё за KOD_IF?...
Как говорится, телепаты в отпуске.
Рассказывай подробнее!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
liones
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #2 : 13-05-2009 09:47 » 

ОК. DM - модуль данных (отдельная форма), где у меня просто собраны компоненты доступа к данным. TIF и TMED таблицы. Связаны по полю KOD_IF. Из таблицы TIF удаляю запись, но перед этим ищу записи с таким же значением KOD_IF в таблице TMED. Если пользователь уверен, что хочет удалить, то удаляем:
Код:
DM.TMed.Filtered:=True;
            DM.TMed.Filter:='KOD_IF='+chr(39)+DM.TIFKOD_IF.AsString+chr(39);
            kol:=DM.TMed.RecordCount;
            DM.TMed.First;

            for i:=1 to kol do
            begin
                DM.TMed.Edit;
                DM.TMed.Delete;
                DM.TMed.Post;
            end;
Если пользователь передумал, то удалять ничего и нигде не надо:
Код:
DM.TIF.RevertRecord;

Ну так вот, отмена удаления срабатывает. Т.Е. если я напрямую просматриваю таблицы, то все записи на месте. А вот в DBGrid отображаются не все записи.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-05-2009 09:56 » 

liones, приведи используемые типы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
liones
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #4 : 14-05-2009 03:23 » 

liones, приведи используемые типы.
В таблицах?
Записан
liones
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #5 : 14-05-2009 03:34 » 

Код:
if Messagedlg('Íàéäåíû ñâÿçàííûå çàïèñè!'+#13+'Âñå ðàâíî õîòèòå óäàëèòü?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
    DM.TMed.Filtered:=True;
    DM.TMed.Filter:='KOD_IF='+chr(39)+DM.TIFKOD_IF.AsString+chr(39);
    kol:=DM.TMed.RecordCount;
    DM.TMed.First;
    for i:=1 to kol do
      begin
      DM.TMed.Edit;
      DM.TMed.Delete;
      DM.TMed.Post;
      end;
    DM.TMed.Filtered:=False;
    end else begin
    Abort;
    end;
Вот так работает
Записан
zubr
Гость
« Ответ #6 : 14-05-2009 05:51 » 

liones, а что за БД? Дело в том, что подобные проблемы (удаления, редактирования записей связанных таблиц) во многих БД решаются на уровне самой БД (необходимые действия и зависимости прописываются в самих таблицах).
Записан
liones
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #7 : 14-05-2009 07:02 » 

БД Paradox. Да, действительно подобные проблемы можно решить на уровне БД. Но вот именно с парадоксом это не проходит. Может я что-то не так делаю. Пыталась я связать таблицы по внешним ключам, через некоторое время база ломается. Делала вроде все по литературе, но......
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 23-05-2009 11:30 » 

Цитата
Код:
            ...
            kol:=DM.TMed.RecordCount;
            DM.TMed.First;

            for i:=1 to kol do
            begin
                DM.TMed.Edit;
                DM.TMed.Delete;
                DM.TMed.Post;
            end;
           ...

должно быть так:

Код:
  DM.TMed.First;
  while not DM.TMed.Eof do
    DM.TMed.Delete

вызывать Edit перед Delete - бессмысленно. почему Post не даёт ошибку - для меня вообще загадка, должен давать. и удаление лучше делать не в обработчике BeforeDelete, а экшеном на отдельной кнопке.
Записан

Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 01-06-2009 02:44 » 

Мне кажется дело не в коде, а в постановке вопроса. Например, что означает  фраза - "пользователь передумал"?
Если это откат сделанных изменений (например как в редакторах "Ctrl + Z"), то возможно нужно пересмотреть организацию программы. Как вариант отслеживать все изменения, запоминать их.
По коду:
1. нет удаления записи первой таблицы TIF - по идее должно быть после удаления в цикле подчиненных записей.
2. для удаления подчиненных записей достаточно одного метода Delete
3. Для отмены изменения лучше всего не это событие использовать. Сейчас не помню, но есть какие-то события, которые на этапе обработки позволяют отменить действие.
Записан

Ёжики, это не только ценные шкурки...
Oldy
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 01-06-2009 07:22 » 

Цитата
...запись остается в таблице, но в DBGrid не отображается. Чего не хватает?
Если DBGrid.Refresh не помогает, то закрыть/открыть таблицу предварительно выключив фильтры.
« Последнее редактирование: 01-06-2009 07:27 от Oldy » Записан

С уважением, Oldy.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines