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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.039 c
1-71585
greenrul
2003-09-05 15:19
2003.09.22
Как узнать, нажата ли в данный момент...


1-71713
GEN
2003-09-10 17:47
2003.09.22
Компонент в вмде стрелочного прибора


14-71828
VictorT
2003-09-02 00:46
2003.09.22
Полуночники


14-71845
DiamondShark
2003-09-01 14:35
2003.09.22
Поздравляю всех.


6-71802
Jonni_M
2003-07-24 18:04
2003.09.22
IdPOP3 или NMPOP3 что лучше использовать