![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обновление 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 обновлять и датасет... ничего не выходит.