Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-1147592921
MasteR2
2006-05-14 11:48
2006.12.31
Многоугольник и окружность


2-1165842609
DelphiLexx
2006-12-11 16:10
2006.12.31
Как через SetLength установить размерность дин. массива


15-1165392219
Kolan
2006-12-06 11:03
2006.12.31
CRT монитор дергается сверху зачем? :)


2-1166084082
Николай1
2006-12-14 11:14
2006.12.31
TApplicationEvents.onIdle не работает


3-1161246824
X_ksandr_X
2006-10-19 12:33
2006.12.31
помогите плиз с DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский