Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

ADO и обновление одной записи   Найти похожие ветки 

 
Max Zyuzin ©   (2005-05-31 09:38) [0]

Приветствую всех, вот возникла необходимость делать обновление DataSet, а переоткрывать его не хочется, ибо большой запрос выбирает из большой таблицы. Хочется спросить, как правильно делать обновление для одной единственной записи в DataSet-е
Почитав help про методы Refresh Переоткрывает все целиком. Посмотрел метод Reync но в хелпе же указывается что в приложении должен использоваться Refresh вместо Resync... Ткните пожалуйста пальцем в какую сторону копать, и где можно почитать (вчера полистал перед сном пару книжек ничего не обнаружил обнадеживающего).


 
msguns ©   (2005-05-31 09:55) [1]

Читай про курсоры и блокировки (CursorType+LockType)


 
Anatoly Podgoretsky ©   (2005-05-31 10:01) [2]

но в хелпе же указывается что в приложении должен использоваться Refresh вместо Resync
Это где ты такое прочитал?


 
Nikolay M. ©   (2005-05-31 10:05) [3]

http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=413
?


 
Max Zyuzin ©   (2005-05-31 10:08) [4]

>Anatoly Podgoretsky ©   (31.05.05 10:01) [2]
TDataSet.Resync
Applications should use the Refresh method instead of calling Resync

>msguns ©   (31.05.05 09:55) [1]
Читал, читаю еще раз... пока не понимаю пока не вижу каким боком это относится непосредственно к обновлению данных. То есть ясно, что в курсор с блокировками опеределяют видимость изменений, но как их обновить не ясно.


 
msguns ©   (2005-05-31 10:18) [5]

Видимо, имеется в виду вот это :

Refetches the active record and the records that precede and follow it.

type TResyncMode = set of (rmExact, rmCenter);
procedure Resync(Mode: TResyncMode); virtual;

Description

Resync is used internally by other dataset methods to resynchronize the dataset with underlying physical data when making calls that may change the internal cursor position. Applications should use the Refresh method instead of calling Resync.
Mode indicates optional processing that Resync should handle. If Mode contains rmExact, Resync raises an exception if Resync is called when the cursor is not positioned on a valid record. If Mode contains rmCenter, Resync positions the active record in the center of all buffered records.

Regardless of Mode, Resync also activates the buffers for the active record, retrieves prior and subsequent records for display purposes, and triggers a dataset change event.


 
Bronco ©   (2005-05-31 10:25) [6]


> Max Zyuzin ©   (31.05.05 10:08) [4]


> но как их обновить не ясно.

Читай статью приведенную в [3]

ADODataSet1.Properties["Update Resync"].Value := adResyncAll;


 
Anatoly Podgoretsky ©   (2005-05-31 10:26) [7]

Max Zyuzin ©   (31.05.05 10:08) [4]
Точно есть, в таком случае читай выделеное

Resync is used internally by other dataset methods to resynchronize the dataset with underlying physical data when making calls that may change the internal cursor position. Applications should use the Refresh method instead of calling Resync.

После изменений данных, курсор уже на актуален, поэтому приложение должно использовать или Refresh или ReQuery (более предпочтително), а Refresh должен заменяться на Close/Open


 
ANB ©   (2005-05-31 10:28) [8]

Интересно, а как тогда DOA и ODAC по одной записи рефрешат ?


 
Sergey13 ©   (2005-05-31 10:40) [9]

2 [8] ANB ©   (31.05.05 10:28)
По RowId. DOA точно так.


 
Max Zyuzin ©   (2005-05-31 10:52) [10]

>Anatoly Podgoretsky ©   (31.05.05 10:26) [7]
Угу но вот этого делать не хочется...

>Nikolay M. ©   (31.05.05 10:05) [3] & Bronco ©   (31.05.05 10:25) [6]
Читаю, проникаюсь... Я так понимаю, что все это будет работать если Update ушел из этого же датасета. А у меня в датасете отображается View с SQL сервера, где натаскано данных с кучи таблиц, и Все изменения я выполняю через TADOCommand непосредственно засыланием запроса на сервер, что и где поменять. Т.е. сам Grid ReadOnly все измнения в отдельной формочке, и потом засылание запроса не сервер, после этого есть желание обновить только одну запись, вот.


 
Sergey13 ©   (2005-05-31 11:00) [11]

2 [10] Max Zyuzin ©   (31.05.05 10:52)
>Т.е. сам Grid ReadOnly все измнения в отдельной формочке, и потом засылание запроса не сервер, после этого есть желание обновить только одну запись, вот.

Так ты никогда не сделаешь без АПИ и тому подобного. Или свой датасет писАть. ИМХО.


 
Anatoly Podgoretsky ©   (2005-05-31 11:17) [12]

Max Zyuzin ©   (31.05.05 10:52) [10]
Т.е. сам Grid ReadOnly все измнения в отдельной формочке, и потом засылание запроса не сервер, после этого есть желание обновить только одну запись, вот.

Именно это и делает ReSync - эту и еще плюс/минус несколько по близости


 
msguns ©   (2005-05-31 11:18) [13]

>Max Zyuzin ©   (31.05.05 10:52) [10]
>А у меня в датасете отображается View с SQL сервера, где натаскано данных с кучи таблиц, и Все изменения я выполняю через TADOCommand непосредственно засыланием запроса на сервер, что и где поменять. Т.е. сам Grid ReadOnly все измнения в отдельной формочке, и потом засылание запроса не сервер, после этого есть желание обновить только одну запись, вот.

Тогда после Update (который, как я подразумеваю, выполняется из другого объекта (ADOCommand ?) над "ручками" править рекордсет) и после этого делать рефреш (не ресинхронизацию, что, очевидно, и имелось в виду в тексте хэлпа)

И все ж таки мне непонятно, почему не устраивает переоткрытие с перепозиционированием - сам работаю по такой технологии, за что бываю бит ногами (вся ж.. в шрамах) периодически мастаками ;))


 
Max Zyuzin ©   (2005-05-31 11:36) [14]

>Anatoly Podgoretsky ©   (31.05.05 11:17) [12]
Да я так и понял (И этого пытаюсь добиться), только у меня что то нифига не обновляет :( наверное что то я напутал с CursorType, пытаюсь усиленно разобраться.

>msguns ©   (31.05.05 11:18) [13]
Да, Сергей, ты все правильно понял, только вот закрывать открывать не хочу ибо вроде написал вверху что таблица основная из которой выбирается довольно объемная, и медленно все происходит.

Обысню ситуацию подробно, есть запрос который что то выбирает и отображает (открывается довольно долго :( ) далее есть желание реализовать что то вроде Dual List Box-а то есть можно что бы было перекидывать из Grid-а одного в другой записи отобранные. Я пока придумал использовать локальную фильтрацию, открываю в обоих гридах все записи, в одном фильтрую локально только те у которых признак (помеченности) стоит в другом наоборот, в случае переноса - апдейт на сервер, обновление записи в Датасетах, и рефильтрация. вот. Проще было бы реализовать переоткрытием, но мне это совсем не хочется, ибо совсем тормоза будут.


 
Bronco ©   (2005-05-31 11:48) [15]


> Max Zyuzin ©   (31.05.05 11:36) [14]


> запрос который что то выбирает и отображает (открывается
> довольно долго

а нельзя ли оптимизировать запрос?
Если нельзя, то советую использовать локальный ДатаСет (напр. TClientDataSet) в этих целях. Затем, когда юзер перекидает все что ему надо, сбосить все изменения на сервер


 
Max Zyuzin ©   (2005-05-31 12:06) [16]

>Bronco ©   (31.05.05 11:48) [15]
Запрос конечно я попытаюсь оптимизировать.
Локальный датасет это, возможно, и выход для данной конкретной проблеммы но хочется разобраться вообще... как это функционирует корректно.


 
sniknik ©   (2005-05-31 12:08) [17]

> советую использовать локальный ДатаСет (напр. TClientDataSet) в этих целях.
а смысл? то же самое практически достигается ADODataSet + LockType = ltBatchOptimistic.
есть конечно дополнительные плюсы в клиентском, но их явно недостаточно чтобы еше и midas в программу "привлекать".


 
Bronco ©   (2005-05-31 12:11) [18]

и еще:

> в случае переноса - апдейт на сервер, обновление записи
> в Датасетах

нельзя ли в случае переноса делать апдейт на клиенте, а затем Post ? Естественно, предварительно выставив параметр "Update Resync"


 
sniknik ©   (2005-05-31 12:15) [19]

> как это функционирует корректно.
что именно? рефреш одной записи? тогде тебе немного неправильно ссылку дали (сходи по ней ;))
см Resync Command
в продолжении
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=420
(а еще лучше весь цикл почитай, там много полезного)


 
sniknik ©   (2005-05-31 12:17) [20]

если неправильно понял извиняйте, читал "по диагонали".


 
msguns ©   (2005-05-31 12:23) [21]

>Max Zyuzin ©   (31.05.05 11:36) [14]

Перетаскивание между гридами ?.. Что-то похожее видел в S-Market - есть такое пакет в Украине. Там фактуру накладных можно набирать из заказов (заявок) либо другой накладной (для возвратов). Там можно тожк перетаскивать, однако среди все контор, юзающих этот пакет (кстати, довольно неплохой) не знаю ни одного оператора (менеджера), который набирает фактуру таким образом - пользуются попап-меню либо кнопками типа "Выбрать". Ибо неудобно и "теряются при перетягивании" (со слов операторов).
Но тебе виднее, да и к сабжу это не относится в общем-то.

По поводу тормозов неясно, что именно тормозит - если кол-во возвращаемых записей велико, то ИМХО, надо либо разобраться с этими записями (возможно, все они не нужны на клиенте) за счет доп.условий, либо использовать серверный курсор,- при навигации будет слегка подтормаживать, но именно слегка.
Если же записей возращается немного (до 1000), то, очевидно, надо пошаманить с серверной частью (доп.индексы, оптимизация ХП-вьюх и т.д.)
В любом случае, имхо, тормоза при выборке на порядка 100000 записей в таблице (не НД !) совсем небольшие.

Если же таблицы "тяжелые" (много полей и они "длинные"), то CDS, имхо, поможет.

>Локальный датасет это, возможно, и выход для данной конкретной проблеммы но хочется разобраться вообще... как это функционирует корректно.

Повнимательнее разберись с курсором и Properties - имхо, собака зарылась там..


 
Zz_   (2005-05-31 13:59) [22]

ADODS.UpdateCursorPos;
ADODS.Recordset.Resync(adAffectCurrent,adResyncAllValues);
ADODS.Resync([rmExact]);


 
Bronco ©   (2005-05-31 14:26) [23]


> Zz_   (31.05.05 13:59) [22]
> ADODS.UpdateCursorPos;
> ADODS.Recordset.Resync(adAffectCurrent,adResyncAllValues);
> ADODS.Resync([rmExact]);


Все гениальное просто :-)
Только в uses добавить ADOInt

(кстати, msguns-у на заметку - всего три строчки и твой грид скакать никуда не будет)


 
Max Zyuzin ©   (2005-05-31 14:52) [24]

>sniknik ©   (31.05.05 12:15) [19]
В общем ты понял правильно хоть и по диагонали... опыт не пропьешь, читаю статью, изучаю, точнее все 3-и.

>msguns ©   (31.05.05 12:23) [21]
Не не так понял непосредственно Drar&Drop-а не будет, выбрал запись нажал кнопку все перекинулось, ничего никуда тащить не надо.

>Zz_   (31.05.05 13:59) [22]
Гм... вот это дискуссия, а все делается 3-я строками... попробовал, получилось! НО! получается только если в запросе участвует непосредственно таблица! А у меня там View и меня посылают с сообщением о том что "недостаточно информации о ключевом поле" :( Че перетаскивать весь View на клиента что ли? :(


 
Zz_   (2005-05-31 14:59) [25]

ADODS.Properties["Unique Table"].Value :=

и работаем с вью


 
Max Zyuzin ©   (2005-05-31 15:03) [26]

>Zz_   (31.05.05 14:59) [25]
Я ессно так и попробовал сразу и получил, что Unique Table is nonexistient or not completely specified.


 
Max Zyuzin ©   (2005-05-31 17:21) [27]

>Zz_   (31.05.05 13:59) [22]
Кстати все это работает только в случае, если запрос имеет вид Select * from MyTable в случае если в запросе есть несколько таблиц, обновление просиходит только у записей основной таблицы, все что связано не обновлятся. Про View вопрос так и не понял пока как разрешить ругается разными матами "Key value for this row was changed or deleted at the data store"... Короче рою пока в направлении "Update Resync".



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

Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.044 c
3-1117618656
Koala
2005-06-01 13:37
2005.07.11
Помогите создать запрос (Firebird 1.5)


4-1116310493
Zhenja
2005-05-17 10:14
2005.07.11
Меняем частоту обновления экрана


6-1112615487
NikeOLD
2005-04-04 15:51
2005.07.11
Можно ли получить список модемов не используя реестр (как?)


5-1089872243
ViJen
2004-07-15 10:17
2005.07.11
DbGrid, DateTimePicker и прокрутка


14-1118212934
вразлет
2005-06-08 10:42
2005.07.11
Ukraine under attack





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский