Консультация № 145942
04.10.2008, 11:40
0.00 руб.
0 10 1
hi...

Не могу понять почему частенько вылетает ошибка при использовании DBLookupComboBox:

EOleExxeption with message 'Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнег чтения.'


Посмотрите на примере (исходник delphi 7): тут (13Кб):
1. Создайте новую запись с помощью dbgrid и сохраните
2. Щелкните на DBLookupComboBox и выбирите одно из значений
3. Получите ошибку...

Спасибо.

Обсуждение

давно
Мастер-Эксперт
425
4118
04.10.2008, 16:13
общий
Maksim Trofimov
Вы, наверное, когда создаёте новую запись в DBGrid забываете занести значение в поле SPECIALIZATION_ID, оттого и ошибка. Ведь Ваш DBLookupCombo выводит связанное поле именно с этим столбцом.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2008, 03:58
общий
Черт возьми ....
Ведь Ваш DBLookupCombo выводит связанное поле именно с этим столбцом

А я думал что, если этого значения не будет, DBLookupCombo, его запишет в соответствии с выбором пользователя...
давно
Мастер-Эксперт
425
4118
05.10.2008, 04:51
общий
Когда-то я тоже так думал. Но поэкспериментировав понял, что в фирме Борланд думали по другому.
Американцы, что с них взять, не соображают...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
05.10.2008, 06:09
общий
Я думаю, для столбца SPECIALIZATION_ID нужно ввести значение по умолчанию, например 0. А в справочнике для этого значения ввести что-то вроде "Значение не присвоено". Тогда в главной таблице Вы будете вводить данные вручную при создании новой записи только в нужный столбец, при этом 0 вставится автоматически. А уж после того как новая запись создана и зафиксирована, с помощью DBLookupCombo ввести новое значение.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2008, 06:23
общий
Американцы, что с них взять, не соображают...

Мандалаи...о чем разговор ))
Неизвестный
05.10.2008, 07:18
общий
Я думаю, для столбца SPECIALIZATION_ID нужно ввести значение по умолчанию, например 0. А в справочнике для этого значения ввести что-то вроде "Значение не присвоено". Тогда в главной таблице Вы будете вводить данные вручную при создании новой записи только в нужный столбец, при этом 0 вставится автоматически. А уж после того как новая запись создана и зафиксирована, с помощью DBLookupCombo ввести новое значение.

Я об этом уже думал и пробовал сделать ) Но из этого ничего не вышло: почему то значение по умолчанию присваивается, но после перезагрузки таблицы )
Ничего проще, кроме как установки значения программой
Код:
 FieldByName('SPECIALIZATION_ID').AsInteger:=0 
, а не БД, придумать не могу. Да и таблицу открывать/закрывать лишний раз мне бы не хотелось...
Неизвестный
05.10.2008, 15:56
общий
Беру свои слова обратно

Все же проще перезагрузить таблицу ))
Код:
 Requery(); 

Учиться и учиться однако...
давно
Мастер-Эксперт
425
4118
05.10.2008, 16:15
общий
Проще воспользоваться TADOQuery с запрсом к двум таблицам:
Код:
ADOQuery.SQL.Text:='SELECT spec.name, spez.name FROM spec INNER JOIN spez ON spec.specialization_id=spez.id';

тогда можно вообще обойтись одним DBGrid'ом. Ведь в DBGrid'е, посмотрите сами, две колонки лишние, т.к. не несут какой либо эстетической информации. А нужны Вам для любования всего две колонки, которые я написал в запросе.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
05.10.2008, 16:55
общий
это ответ
Здравствуйте, Maksim Trofimov!
В принципе все логично, так как у Вас используется связанная таблица.
Т.е. вы не можете изменить связь при её полном отсутствии.
Для устранения этого предлагаю добавить процедурку для ADOTable1 для обновления связей ADOTable1AfterPost(DataSet: TDataSet);
Т.е. при добавлении новой записи у Вас будет обновляться поле SPECIALIZATION_ID и приравниваться к нулю.
И Вы сразу сможете изменить эту связь на 1 или на 2.


Приложение:
procedure TForm1.ADOTable1AfterPost(DataSet: TDataSet);
begin
ADOTable1.Refresh;
end;
Неизвестный
05.10.2008, 17:18
общий
sir Henry
Проще воспользоваться TADOQuery с запрсом к двум таблицам

Это удобно очень для визуализации, но тогда нужно будет создавать еще одну форму(или еще что-то) для изменения значений полей специализации, так как DBLookupComboBox уже не подойдет. Потому что для его использования нужны поля spec.id и spec.specialization_id, которые мы убрали ))
Однако, их можно не убирать, а просто скрыть )
Форма ответа