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

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

Глюк в 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
размечтался...

> что может быть такого уникального у этих полей?
могут быть частью составного ключа..., либо заменять ключ за его отсутствием...


Наверх

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