Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизГлюк в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c