![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк в ApplayUpdates ? [D7, Access]
Savek © (2006-10-18 17:39:00)С сервера приложений в ClientDataSet загружаю данные:
with cdsClient do begin
CommandText:= 'select Код,Наименование,Количество,[Цена закупочная], Ц_опт, Ц_розн, Упаковка1, Упаковка2,А_пост, ... where Id_OUT='+ IntToStr(idp)';
open;
Далее пользователь вносит изменения (добвление/удаление записей запрещено) и пременяет их к базе (ApplayUpdates)
Все прекрасно работает, если не трогать несколько полей,
в частности
[Цена закупочная], Ц_опт, Ц_розн все имеют тип Currency,
А_пост - тип text(20) и др. (всего 6шт из 28)
Стоит изменить какое-то из этих полей возникает ошибка при попытке внести изменения в базу
В событиии OnReconcileError отлавливаю сообщение об ошибке
"Record not found or changed by another user"
Это просто напасть какая-то, что должно-быть в этих 6-ти полях, что бы их нельзя было изменить? Вернее изменить можно, но невозможно применить изменения к реальной таблице.
Башка уже трещит: что может быть такого уникального у этих полей?
Savek (2006-10-20 12:28:00) [1]sniknik, спасибо,
настройка ProviderFlags решила проблему
sniknik (2006-10-19 16:20:00) [2]+ если у тебя ключевое поле есть, но не определяется, попробуй сам ему тип указать (в свойствах поля смотри).
sniknik (2006-10-19 16:19:00) [3]> но ведь в некоторых полях изменения вносятся в базу!
это когда повезло, тогда вносятся.
в случае отсутствия ключа(/невозможности его определить) выбираются несколько "значимых" с точки зрения мидаса(разработчиков) полей и условие апдейта составляется по ним, типа
Update Таблица
set
поле1 = новое значение,
поле2 = новое значение,
поле3 = новое значение,
...
where
поле1 = старое значение and
поле2 = старое значение and
поле3 = старое значение
...
при ненайденной таким апдейтом записи выдается ошибка ([0] - "Record not found or changed by another user"), при применимости условия к нескольким записям другая, но это неважно.
что будет при сравнении если старое значение null думаю понятно (с.м. любой хелп по используемой базе как сравниваются null-ы), + у мидаса есть особенность (если правильно помню), он все строковые поля с пустым значением преобразует в null (или наоборот) что в общем не способствует пониманию ситуации...
Savek (2006-10-19 14:43:00) [4]
CommandText:='select ID,Код,Наименование,[Цена закупочная],Количество,Ц_розн,'+
'Группа,Подгруппа,Уровень2,Производитель,[Торговая марка],id_out,'+
'[Цена закупочная]*Количество as Сумма,Ц_опт,Упаковка1,Упаковка2,'+
'упаковка3,А_пост,Код_пост,Офис,Склад,Заказ,НДС,С_ост,Серт,'+
'Страна,Мин_ост,Мин_парт from приход where Id_OUT='+
IntToStr(idp)+' order by ID';
Уже 1 плюс - победил крякозябликов!
В общем-то была такая мысль, что копать нужно в сторону ключа, но ведь в некоторых полях изменения вносятся в базу!
sniknik (2006-10-19 14:04:00) [5]> //Sorry за три точки, думаю теперь понятно что там
ага, понятно, это значит что там пусто... т.к. все что не написано здесь то отсутствует напрочь... ;). - идеология форума.
что бы автор не заявлял голословно.
sniknik (2006-10-19 14:00:00) [6]> а методом копи/паст вместо русских получаются крякозяблики
при копировании следи чтобы у приложения источника текущим был русский шрифт.
> модификация группы записей
> Update Приход set [Торговая марка]=:mark where ID_OUT=:IDOUT
ну во первых группы... а ApplayUpdates составляет запрос для одной записи и так чтобы она была однозначноопределена.
во вторых (предположить что у мидас есть интелект... ;), даже этого запроса из исходного не составишь, ID_OUT [0] в исходном запросе отсутствует, аналогично и для
> Update Приход set А_пост=:Apost where ID=:ID
ID в результирующем рекордсете от запроса [0] отсутствует
даже не смотря на уверения
> Могу добавить что запрос выбирает из таблицы все поля
если бы были все (значит и ключ в том числе...), то вопроса бы не было.
Savek (2006-10-19 13:35:00) [7]По поводу поста №3
1. Неохота было писать длинный запрос, а методом копи/паст вместо русских получаются крякозяблики. Могу добавить что запрос выбирает из таблицы все поля + еще одно: Количество*[Цена закупочная] as Сумма
2. Модификация идет двумя путями
модификация одной записи
Update Приход set А_пост=:Apost where ID=:ID
модификация группы записей
Update Приход set [Торговая марка]=:mark where ID_OUT=:IDOUT
хм.. правда эти запросы выполняются непосредственно на сервере приложений, вызовом соотв. метода...
Так вот выше приведенные конструкции работают прекрасно, если попробовать так:
with ClientDataSet do begin
close;
CommandText:='select ... from Приход where ID_OUT='+IntToStr(idp);
//Sorry за три точки, думаю теперь понятно что там
Open;
Edit;
FieldByName('Наименование').AsSrting:='some name';
Post;
ApplayUpdates(-1); //изменения успешно внесены
Edit;
FieldByName('А_пост').AsSrting:='some art';
Post;
ApplayUpdates(-1); //error! record not found ....
end;
Докопался вот до чего: ошибка появляется только в то случае, если старое значение А_пост было null ! в противном случае изменения успешно вносятся !То же самое со всеми полями типа text
Но для полей типа currency ошибка возникает независимо от значения
sniknik (2006-10-18 18:17:00) [8]> В таблице ключевое поле ID, эта таблица подчиненая (через ID_OUT)
покажи ID, в запросе пальцем, то по чему будет обратная связь (т.е. запрос на апдейт составляться)
> CommandText:= 'select Код,Наименование,Количество,[Цена закупочная], Ц_опт, Ц_розн, Упаковка1, Упаковка2,А_пост, ... where Id_OUT='+ IntToStr(idp)';
как всегда, все самое интересное в трех точках? или ...
вот оно тебе и заменяет на "чем бог послал".
> Эти поля легко модифицируются SQL-запросом...
каким? тоже без участия ключа, по одной записи? какой тогда критерий отбора этой записи? т.е. попробуй сделать тоже самое что пытаешься заставить выполнить midas. после говори о глюках.
Desdechado (2006-10-18 18:17:00) [9]Видимо, провайдер настроен по-другому. Он их считает входящими в ключ.
Savek (2006-10-18 18:01:00) [10]В таблице ключевое поле ID, эта таблица подчиненая (через ID_OUT)
Выше означенные поля не являются частью составного ключа, не ключевые, совпадения допускаются, никаких условий на значения, могут быть пустыми.
Эти поля легко модифицируются SQL-запросом...
sniknik (2006-10-18 17:42:00) [11]> Глюк в ApplayUpdates
размечтался...
> что может быть такого уникального у этих полей?
могут быть частью составного ключа..., либо заменять ключ за его отсутствием...