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

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

Access/ADO/Delphi7, Проблема с LookUp-полями [D7, Access]


Delphi7 ©   (2008-04-09 22:45:00) 

Есть таблица Сотрудники(employees):
id_employee
fio
fk_right

Есть таблица Права(rights):
id_right
title

Поле fk_right является внешним ключом и связывает таблицу Сотрудники с таблице Права.

В Delphi7 два tadoquery
query1:
select * from employees
query2:
select * from rights

Делаю в 1 lookup-поле:
name: right
component: QEmployeesAllright - это иде сама вставляет
type: string - пбавал и integer, и variant, результата одинаков
field type: lookup
key fields: fk_right
dataset: query2
lookup keys: id_right
result fields: title

Ситуация следующая:
- если я СНАЧАЛА выбираю что-то в lookup-поле, а потом заполняю остальные, то всё проходит без ошибок
- если я пытаюсь заполнить другие поля ДО того, как выбрал значение в lookup-поле, то после перехода к другой записи вылетает ошибка:
class: EOleException
message: Ошибка неизвестного типа
При этом данные сохраняются. Если закрыть приложение сразу после ошибки, то происходят жуткие тормоза у всех приложений секунд на 15 на моей машине.

Если удалить lookup-поле, всё работает замечательно.
В datasource обоих dataset'ов стоит авторедактирование, хотя даже если его убрать, результат не меняется.
Вопрос: что это и главное как с этим можно бороться?


Delphi7   (2008-04-10 12:14:00) [1]

sniknik, спасибо, уже почти всё.
после открытия dataset'a прописал:
QEmployeesAll.Properties['Update Criteria'].Value := adCriteriaKey;
QEmployeesAll.Properties['Update Resync'  ].Value:= adResyncAll;

в итоге не под IDE ошибка пропала, но в IDE всё по прежнему.
если это возможно, хотелось бы починить полностью.


sniknik   (2008-04-10 11:31:00) [2]

> Некоторые значения могли быть изменены со времени её последнего чтения
вполне могли бы... т.к. у FOREIGN KEY может быть с UPDATE CASCADE ... т.е. при редактировании записи сам движок тебе значения связанных по внешнему ключу обновит. а на клиенте то значения остались прежние... а если ты не указал, что апдейт должен проходить по ключу (главному) то запрос на обновление(условие) собирается из всех значений записи. одно из которых в базе поменялось...

или, если там стоит дефаултное значение, на новую запись... тоже при создании записи (и пустом значении поля) дается дефаултное опять таки движком, про что клиентских набор данных не в курсе. естественно при заполненном lookup-поле вместо дефаултного попадает значение с клиентского и в дальнейшем они одинаковы.

короче для начала я бы убрал внешний ключ, проверил. и добавил бы обновление записей по ключу (для условия на обновление) - Properties['Update Criteria'].Value:= adCriteriaKey;
и рефреш данных при новой записи для всех значений, "подтянуть" дефаултные
Properties['Update Resync'  ].Value:= adResyncAll;
(по умолчанию только автоинкремент обновляется)


Delphi7   (2008-04-10 10:56:00) [3]

Не под IDE ошибка возникает, но другая:
"Не удаётся найти строку для обновления. Некоторые значения могли быть изменены со времени её последнего чтения"
Но и опять же странность:
- если lookup-поле не трогать, всё отлично;
- если СНАЧАЛА заполнить именно lookup-поле и попытаться перейти на другую запись вне зависимости от заполнения других полей - всё отлично;
- если СНАЧАЛА заполнить НЕ lookup-поле, а потом его и  попытаться перейти на другую запись - возникает указанная ошибка.


Johnmen   (2008-04-10 09:25:00) [4]

Не под IDE ошибка есть?


Наверх

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