Форум: "Базы";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
ВнизDelphi 7, Insert записи в подчиненную таблицу Аccess, через ADO Найти похожие ветки
← →
bernard (2003-08-28 16:10) [0]Господа – есть проблема. Из Delphi 7 через ADO подключаюсь к Ассеss 2000. В Ассеss создал две таблицы: balans (id, row_name) и balans_amount (id, balans_id, begin_value). Таблицы создал руками в Access. Таблица balans является справочной и не изменятся. Первичные ключи в таблицах определены – id (счетчики, пробовал и просто числовые поля с подстановкой нужных значений). Главной является Balans (в ней поле row_name содержит название строки отчета, само же значение строки должно помещаться в balans_amount.begin_value). В balans_amount поле balans_id должно содержать ссылку на balans.id (зафиксировано в схеме данных Access). Скрипт выглядит так :
SELECT balans.id, balans.row_name, balans_amount.id, balans_amount.balans_id, balans_amount.begin_value
FROM balans LEFT JOIN balans_amount ON balans.id = balans_amount.balans_id;
Суть вопроса. Если в Access создать этот запрос и начать редактировать поле balans_amount.begin_value то проблем не возникает. Для записей которых не существует в balans_amount Access нормально подставляет значение в balans_amount.balans_id с указанием на balans.id и инсертит запись в balans_amount.
Если тот же трюк сделать из Delphi7 через TADODataset то возникает ошибка: Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения. Понятно что ошибка возникает на уровне ADO. На сколько я понял запись изменяет сам Access прописывая значение в balans_amount.balans_id, т.к. других полей с дефолтными значеними я не использую. Помогите, как быть?
← →
SiJack (2003-08-28 16:18) [1]http://www.delphimaster.ru/cgi-bin/links.pl?get=40
← →
SiJack (2003-08-28 16:20) [2]извиняюсь
http://delphi.vitpc.com/helloworld/ado02.htm
← →
bernard (2003-08-28 17:14) [3]Прочел. Вот что пробовал:
DST.Properties["Update Resync"].Value := adResyncInserts (или adResyncAll);
DST.Properties["Unique Table"].Value:="balans_amount";
DST.Properties["Resync Command"].Value:=
"SELECT balans.id, balans.row_name, balans_amount.id as balans_amount_id, balans_amount.balans_id, balans_amount.begin_value "+
"FROM balans LEFT JOIN balans_amount ON balans.id = balans_amount.balans_id where balans_amount.balans_id = ?"
Результат тот же. Ошибка - значения изменены с момента последнего чтения.
← →
ItMan (2003-08-28 18:35) [4]Читай еще раз.кодовое слов: adCriteriaKey
Суть проблемы:
При изменении выполняется запрос: Update ля ля ля where Name=1.
Но если кто-то изменил значение, то запрос приведет 0 результатов. Поэтому лучше всего производить поиск по ключевому полю.
ОNOpen:
DST.Properties["Update Criteria"].Value = adCriteriaKey.
← →
bernard (2003-08-29 10:23) [5]DST.Properties["Update Criteria"].Value := adCriteriaKey тоже не лечит. Та же ошибка.
С другой стороны если в гриде создать новую запись и указать руками значения только для balans_amount.id, balans_amount.balans_id, balans_amount.begin_value, где balans_amount.balans_id = id существующей записи в balans, то инсерт проходит без проблем.
Господа, объясните, что происходит. Может кто-нибудь смоделировать подобное у себя? При необходимости могу выслать неработающий пример :(
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c