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

Вниз

Глюк в ApplayUpdates ?   Найти похожие ветки 

 
Savek   (2006-10-18 17:39) [0]

С сервера приложений в 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-ти полях, что бы их нельзя было изменить? Вернее изменить можно, но невозможно применить изменения к реальной таблице.

Башка уже трещит: что может быть такого уникального у этих полей?


 
sniknik ©   (2006-10-18 17:42) [1]

> Глюк в ApplayUpdates
размечтался...

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


 
Savek   (2006-10-18 18:01) [2]

В таблице ключевое поле ID, эта таблица подчиненая (через ID_OUT)

Выше означенные поля не являются частью составного ключа, не ключевые, совпадения допускаются, никаких условий на значения,  могут быть пустыми.

Эти поля легко модифицируются SQL-запросом...


 
sniknik ©   (2006-10-18 18:17) [3]

> В таблице ключевое поле ID, эта таблица подчиненая (через ID_OUT)
покажи ID, в запросе пальцем, то по чему будет обратная связь (т.е. запрос на апдейт составляться)  
> CommandText:= "select Код,Наименование,Количество,[Цена закупочная], Ц_опт, Ц_розн, Упаковка1, Упаковка2,А_пост, ...   where Id_OUT="+ IntToStr(idp)";

как всегда, все самое интересное в трех точках? или ...

вот оно тебе и заменяет на "чем бог послал".

> Эти поля легко модифицируются SQL-запросом...
каким? тоже без участия ключа, по одной записи? какой тогда критерий отбора этой записи?  т.е. попробуй сделать тоже самое что пытаешься заставить выполнить midas. после говори о глюках.


 
Desdechado ©   (2006-10-18 18:17) [4]

Видимо, провайдер настроен по-другому. Он их считает входящими в ключ.


 
Savek   (2006-10-19 13:35) [5]

По поводу поста №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-19 14:00) [6]

> а методом копи/паст вместо русских получаются крякозяблики
при копировании следи чтобы у приложения источника текущим был русский шрифт.

> модификация группы записей
> Update Приход set [Торговая марка]=:mark where ID_OUT=:IDOUT
ну во первых группы... а ApplayUpdates составляет запрос для одной записи и так чтобы она была однозначно определена.

во вторых (предположить что у мидас есть интелект... ;), даже этого запроса из исходного не составишь, ID_OUT [0] в исходном запросе отсутствует, аналогично и для
> Update Приход set А_пост=:Apost where ID=:ID
ID в результирующем рекордсете от запроса [0] отсутствует
даже не смотря на уверения
> Могу добавить что запрос выбирает из таблицы все поля
если бы были все (значит и ключ в том числе...), то вопроса бы не было.


 
sniknik ©   (2006-10-19 14:04) [7]

> //Sorry за три точки, думаю теперь понятно что там
ага, понятно, это значит что там пусто... т.к. все что не написано здесь то отсутствует напрочь... ;). - идеология форума.
что бы автор не заявлял голословно.


 
Savek   (2006-10-19 14:43) [8]


CommandText:="select ID,Код,Наименование,[Цена закупочная],Количество,Ц_розн,"+
               "Группа,Подгруппа,Уровень2,Производитель,[Торговая марка],id_out,"+
               "[Цена закупочная]*Количество as Сумма,Ц_опт,Упаковка1,Упаковка2,"+
               "упаковка3,А_пост,Код_пост,Офис,Склад,Заказ,НДС,С_ост,Серт,"+
"Страна,Мин_ост,Мин_парт from приход where Id_OUT="+
               IntToStr(idp)+" order by ID";

Уже 1 плюс - победил крякозябликов!
В общем-то была такая мысль, что копать нужно в сторону ключа, но ведь в некоторых полях изменения вносятся в базу!


 
sniknik ©   (2006-10-19 16:19) [9]

> но ведь в некоторых полях изменения вносятся в базу!
это когда повезло, тогда вносятся.

в случае отсутствия ключа(/невозможности его определить) выбираются несколько "значимых" с точки зрения мидаса(разработчиков) полей и условие апдейта составляется по ним, типа  

Update Таблица
set
поле1 = новое значение,
поле2 = новое значение,
поле3 = новое значение,
...
where
поле1 = старое значение and
поле2 = старое значение and
поле3 = старое значение
...

при ненайденной таким апдейтом записи выдается ошибка ([0] - "Record not found or changed by another user"), при применимости условия к нескольким записям другая, но это неважно.
что будет при сравнении если старое значение null думаю понятно (с.м. любой хелп по используемой базе как сравниваются null-ы), + у мидаса есть особенность (если правильно помню), он все строковые поля с пустым значением преобразует в null (или наоборот) что в общем не способствует пониманию ситуации...


 
sniknik ©   (2006-10-19 16:20) [10]

+ если у тебя ключевое поле есть, но не определяется, попробуй сам ему тип указать (в свойствах поля смотри).


 
Savek   (2006-10-20 12:28) [11]

sniknik, спасибо,
настройка ProviderFlags решила проблему



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
15-1165555633
Александр Иванов
2006-12-08 08:27
2006.12.31
Аналог RAdmin


2-1165897576
Монг
2006-12-12 07:26
2006.12.31
Работа с датой.


15-1165604393
Гоблин
2006-12-08 21:59
2006.12.31
McAffee


4-1156242003
Speak
2006-08-22 14:20
2006.12.31
просмотр директори


2-1165939314
Болт
2006-12-12 19:01
2006.12.31
Из какой папки зпущенна программа