Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: CL | DM;

Вниз

Access/ADO/Delphi7, Проблема с LookUp-полями   Найти похожие ветки 

 
Delphi7 ©   (2008-04-09 22:45) [0]

Есть таблица Сотрудники(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"ов стоит авторедактирование, хотя даже если его убрать, результат не меняется.
Вопрос: что это и главное как с этим можно бороться?


 
Johnmen ©   (2008-04-10 09:25) [1]

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


 
Delphi7 ©   (2008-04-10 10:56) [2]

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


 
sniknik ©   (2008-04-10 11:31) [3]

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

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

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


 
Delphi7 ©   (2008-04-10 12:14) [4]

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
2-1220244012
@!!ex
2008-09-01 08:40
2008.10.12
Вывести битмап оп 4 точкам.


15-1219565619
Kostafey
2008-08-24 12:13
2008.10.12
С днем рождения ! 24 августа


2-1220507763
Dagir
2008-09-04 09:56
2008.10.12
Передача данных


2-1220519929
Dagir
2008-09-04 13:18
2008.10.12
Сравнение данных


2-1220801949
Начинающий1
2008-09-07 19:39
2008.10.12
Логарифм