Форум: "Базы";
Текущий архив: 2008.10.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c