Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обновление Master-Detail таблицы (Firebird) [D7, XP]


d@nger ©   (2009-11-05 09:30:00) 

Имеется Master-Detail таблицы, которые отображаются в DBGrid-ах на одной форме. При перемещении по главной таблице в детальной отображаются соответствующие записи по определенному полю. Если в детальной таблице изменить программно значение связывающего поля, то эта строка не исчезает сразу, а приходится перевыбирать запись в главной таблице, только после этого в детальной таблице запись исчезает. Не могу сделать чтобы изменения отображались сразу.
Использую FIBdataset, AutoCommit=True, CashedUpdates=True.
Пробовал и ВИПкшв обновлять и датасет... ничего не выходит....


d@nger   (2009-11-10 10:59:00) [1]

все... проблема решена.... я просто не прописал генератор в самом датасете, в свойстве AutoUpdateOptions ... теперь все ок... Sergey13 большое тебе спасибо...


d@nger   (2009-11-10 10:55:00) [2]


> Можно попробовать подсунуть готовое значение.

Да... это сработало!!!!! новая строка стала появляться сразу в dxDBTreeView

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


Sergey13   (2009-11-10 10:37:00) [3]

> [15] d@nger   (10.11.09 10:28)
> подставляется... primary_key генерируется генератором

Можно попробовать подсунуть готовое значение.


d@nger   (2009-11-10 10:28:00) [4]


> Что "да конечно"?

я имел ввиду, что да, dxDBTreeView смотрит на spiski2_dset


> А при вставке заполняешь все поля?

нет не все...

> Ничего ключевого на сервере не подставляется?

подставляется... primary_key генерируется генератором


Sergey13   (2009-11-10 09:22:00) [5]

> [13] d@nger   (09.11.09 17:19)

Что "да конечно"? В вопросе два взаимоисключающих варианта.

Я с dx-компонентами мало работал и давно, но помнится там как-то все сложно понаворочено. Наверное надо обновлять именно его, потому что датасет уже содержит данные.
А при вставке заполняешь все поля? Ничего ключевого на сервере не подставляется?


d@nger   (2009-11-09 17:19:00) [6]

t
> И при этом твой ВИЕкууМшуц смотрит на fmain.spiski2_dset?
>  Или на другой датасет?

да конечно...


Sergey13   (2009-11-09 15:08:00) [7]

> [10] d@nger   (09.11.09 14:59)

И при этом твой ВИЕкууМшуц смотрит на fmain.spiski2_dset? Или на другой датасет?


d@nger   (2009-11-09 15:03:00) [8]


> ВИЕкууМшуц
сорри ... DBTreeView


d@nger   (2009-11-09 14:59:00) [9]


> Конкретно.

Я добавляю запись в таблицу... а ВИЕкууМшуц использую лишь для отображения записей в древовидной структуре, вот процедура добавления записи:

procedure TFspiski.new_konvert_mnClick(Sender: TObject);
var konv_num:string;num:Integer;
begin
  konv_num:=fmain.getMax('Documents','konvert_num');
  if InputQuery('Создание конверта','Введите номер',konv_num) then
    try
      num:=strtoint(konv_num);
    except
       messageDlg('Номер должен содержать только цифровое значение!',mtError,[mbOk], 0);
       abort;
    end;

  with fmain.spiski2_dset do
  try
     insert;
     fieldbyname('konvert_parent').AsInteger:=-1;
     fieldbyname('name_id').AsString:='Конверт № '+konv_num;
     fieldbyname('konvert_num').AsInteger:=num;
     FieldByName('spisok_id').AsInteger:=fmain.spiski_dset.FieldValues['num'];
     Fieldbyname('pk').AsString:=fmain.getMin('documents','pk');
     Fieldbyname('org_id').AsString:=fmain.getMin('documents','org_id');
     Fieldbyname('reg_num').Asstring:=fmain.getMin('documents','reg_num');
     Fieldbyname('image_index').AsInteger:=1;
     fieldbyname('konvert').AsInteger:=1;
     post;
     applyupdates;
//      fmain.spiski2_dset.CloseOpen(false);
   except
     cancelupdates;
     messageDlg('Ошибка при создании конверта!',mtError,[mbOk], 0);
   end;
end;


Sergey13   (2009-11-09 14:54:00) [10]

> [8] d@nger   (09.11.09 14:49)
> В нем при добавлении строки в таблицу

Прямо в dxDBTreeView? Наверное все таки в датасете, на который он смотрит? Или вообще отдельным запросом? Конкретно.


d@nger   (2009-11-09 14:49:00) [11]

Я отказался от DBGrid. Для отображения детальной таблицы стал использовать dxDBTreeView (DevExpress). В нем при добавлении строки в таблицу , после post и applyupdates, добаленная строка сразу не отображается, а если в главной таблице переместиться на соседнюю запись и обратно, то добавленная строка начинает отображаться. Я пробовал следующие варианты обновления:

master_dataset.refresh;
detail_dataset.Refresh;
DBTreeView1.RefreshItems;
DBTreeView1.DataSource.dataset.Refresh;

ничего из этого не помогло... помогло лишь переоткрытие датасета:
detail_dataset.CloseOpen(false);

причем, при удалении строки изменения отображаются моментально, даже без использования
master_dataset.refresh;
detail_dataset.Refresh;


Переоткрытие датасета при каждом добавлении записи не самое лучшее решение, с точки зрения оптимизации кода.
Не ужели нет другого решения кроме переоткрытия датасета? Может быть это глюк dxDBTreeView?


Сергей М.   (2009-11-05 13:32:00) [12]

Тогда попробуй вызвать DetailDataSet.Refresh


d@nger   (2009-11-05 13:27:00) [13]


> А ApplyUpdates вызываешь после внесения изменений ?

Да


Сергей М.   (2009-11-05 12:15:00) [14]


> CashedUpdates=True


А ApplyUpdates вызываешь после внесения изменений ?


Sergey13   (2009-11-05 11:13:00) [15]

> [3] d@nger   (05.11.09 11:11)

А так если?

FibDataset1.Close;
FibDataset1.Open;


d@nger   (2009-11-05 11:11:00) [16]


> Может не так пробовал?

вот так пробовал:
DBGrid1.Refresh;
FibDataset1.Refresh;


Sergey13   (2009-11-05 09:36:00) [17]

> [1] d@nger   (05.11.09 09:32)
> Пробовал и DBGrid обновлять и датасет... ничего не выходит.

Может не так пробовал?


d@nger   (2009-11-05 09:32:00) [18]


> Пробовал и ВИПкшв обновлять и датасет... ничего не выходит.
> ...

читать так: Пробовал и DBGrid обновлять и датасет... ничего не выходит.


Наверх

Титульная страница Поиск, карта сайта Написать письмо