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

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

Добавление записи через многотабличный запрос (ADOQuery)


Denis ©   (2004-06-02 10:14:00) 

Здравствуйте. Столкнулся с проблемой добавления записей в одну из связанных таблиц запроса. Некоторое время назад, я решал подобную задачу, используя свойства Unique Table и Update Resinc.
Сейчас попытка применить эту методику вызывает ошибку "Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру". Что может вызывать такую ошибку?
Использую серверный курсор, keyset.
Запрос:
--
SELECT *  FROM PRIHODS inner join
nomrazmer on ((prihods.kodrazmer=nomrazmer.kodrazmer)
and (prihods.kodmat=nomrazmer.kodmat))
where PRIHODS.KODMAT = :"kodmat"
and prihods.kardsost=1
order by dbo.NumericFromString(namerazmer)
--
Запись нужно добавить в таблицу PRIHODs.
Собственно это объединение нужно для сортировки по типоразмеру изделий - функция dbo.NumericFromString() очищает значения namerazmer от мусора 'ф', 'L', 'D'и прочего.


Denis   (2004-06-04 16:47:00) [1]

Т.е. ltBatchOptimistic, насколько я знаю, включает пакетный режим обработки записей. А для записи изменений вызываем Table.UpdateBatch(arAll).

Спасибо, буду пробовать.


sniknik   (2004-06-04 16:11:00) [2]

> Руками не ставил.Это LockType? Тогда стоит ltOptimistic.
поставь ltBatchOptimistic, и для записи изменений используй UpdateBatch(-1).


Denis   (2004-06-04 11:21:00) [3]

2sniknik ©
>adLockBatchOptimistic. стоит?
Руками не ставил.Это LockType? Тогда стоит ltOptimistic.

2YurikGL ©
ExecSql

Согласен.Хочу просто понять в чем именно дело.


YurikGL   (2004-06-04 09:15:00) [4]

YurikGL ©   (04.06.04 09:14) [10]

После этого говоришь Refresh


YurikGL   (2004-06-04 09:14:00) [5]

Denis ©   (02.06.04 10:14)

ИМХО лучший вариант это - Ozone ©   (02.06.04 10:49) [1] Суешь в ADODataSet и говоришь execute (или exec точно не помню)


sniknik   (2004-06-04 08:50:00) [6]

> Менял уже. Молчит, проглатывает, но желаемого результата нет.
т.е. ошибки на присвоении нет? значит так правильно (я про клиентский курсор), а вот результат... может надо поменять желания? ;о))

> Т.е. при удалении записи в PRIHODS удаляется связанная запись в справочнике.
а не должна? может срабатывает в обход твоих настроек, а может на удалиние тригер есть или внешний ключь с действием на онделите (хз. что в твоем базе может использоватся, и что это за база вообше).
а может неправильно применяеш
смотрим хелп
Update Resync Property—Dynamic (ADO)
Specifies whether the UpdateBatch method is followed by an implicit Resync method operation, and if so, the scope of that operation.


UpdateBatch - он работает при использовании параметра adLockBatchOptimistic. стоит?


Denis   (2004-06-04 08:36:00) [7]

>но признак ключа у него есть? или просто автоинкремент и все?
В смысле, указано ли явно, что это ключ на сервере - да.

>только заметил. т.е. даже свойства добавить не дает? поменяй курсор на клиентский по моему только с ним работает

Менял уже. Молчит, проглатывает, но желаемого результата нет. Т.е. при удалении записи в PRIHODS удаляется связанная запись в справочнике.

Может я вообще не с той стороны взялся за решение?


sniknik   (2004-06-03 15:16:00) [8]

> А теперь ошибка возникает в помеченной строке.
только заметил. т.е. даже свойства добавить не дает? поменяй курсор на клиентский по моему только с ним работает.


sniknik   (2004-06-03 15:10:00) [9]

tbPrihod.Properties['Update Criteria'].Value:= adCriteriaKey;
для обновлений используется ключевое поле.

> По поводу ключа - это автоинкрементное поле.
но признак ключа у него есть? или просто автоинкремент и все?
при использовании автоинкремента кроме того рекомендуется использование параметра adResyncAutoIncrement (иначе все вновь добавленные будут иметь значение 0 и именно с этип значением пойдут на обновление).


Denis   (2004-06-03 11:16:00) [10]

/sniknik ©   (02.06.04 15:45) [4]/
Ну будет тебе ворчать на отсутствие информации. :)

Ранее я поступал так:
Устанавливал клиентский курсор, далее :
tbPrihod.Properties['Update Criteria'].Value:= adCriteriaKey;
tbPrihod.Properties['Update Resync'].Value:= adResyncUpdates+adResyncInserts ;    ***********
tbPrihod.Properties['Unique Table'].Value:='PRIHODS';

Теперь я работаю с другой версией той же задачи. Ни запрос, ни настройки АДО не менял. Структура таблицы не менялась. Только для фильтрации вместо поисковых строк для группы, наименования и марки материала использую дерево. Но при изменении состояния дерева в запрос передаются те же параметры, что и ранее. А теперь ошибка возникает в помеченной строке.
По поводу ключа - это автоинкрементное поле.

Блин, ну не может же это на пустом месте возникнуть?

Кстати, если работать с НД только из PRIHODS, не объединяя ни с чем, не используя указанные выше свойства, то редактирование записей возможно только при клиентском курсоре.

Мыслится мне это не совсем в программе дело.


sniknik   (2004-06-02 15:45:00) [11]

в порядке предположения
> "Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
нет уникального поля "ключа" по которому можно было бы организовать поиск, заначение поля которое выполняет эту роль изменилось и иесественно не существует в исходной таблице а порядковый номер в случае с твоей субд "неадекватен", для поиска непригоден.

p.s. в виду того что я не знаю как ты решал подобную задачу некоторое время назад, а также отличия нынешнего применения методики от прошлого, и собственно даже действий при которых эта ошибка проявляется и кода который при этом отрабатывает... думаю ценность предположения = 0.
и оно ничем не лутше другого предположения которое в простом отличии слов "Update Resync", но как можно утверждать? ты же скажеш что все делаеш правильно и только тут описался.


Denis   (2004-06-02 15:13:00) [12]

"Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру". Что может вызывать такую ошибку?


Denis   (2004-06-02 11:22:00) [13]

Ну и куда это повесить? Если ты подразумеваешь добавление записи через отдельную форму - это к сожалению не подходит, хоть и избавило бы от мучений. Завести что ли текстовое поле, куда перед Post записывать значение из справочника и сортировать по нему?


Ozone   (2004-06-02 10:49:00) [14]

Ну и делай запрос вида:

INSERT INTO Prihods VALUES (<*>)
SELECT <*> FROM <твой запрос>

Поля в VALUES и SELECT должны совпадать.


Наверх

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