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

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

ADO и обновление одной записи [D7, MSSQL]


Страницы:   1 2

Max Zyuzin ©   (2005-05-31 09:38:00) 

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


Max Zyuzin   (2005-05-31 17:21:00) [1]

>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'.


Max Zyuzin   (2005-05-31 15:03:00) [2]

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


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

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

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


Max Zyuzin   (2005-05-31 14:52:00) [4]

>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 на клиента что ли? :(


Bronco   (2005-05-31 14:26:00) [5]


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


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

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


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

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


msguns   (2005-05-31 12:23:00) [7]

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

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

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

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

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

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


sniknik   (2005-05-31 12:17:00) [8]

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


sniknik   (2005-05-31 12:15:00) [9]

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


Bronco   (2005-05-31 12:11:00) [10]

и еще:

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

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


sniknik   (2005-05-31 12:08:00) [11]

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


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

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


Bronco   (2005-05-31 11:48:00) [13]


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


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

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


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

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

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

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


msguns   (2005-05-31 11:18:00) [15]

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

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

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


Anatoly Podgoretsky   (2005-05-31 11:17:00) [16]

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

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


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

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

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


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

>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 10:40:00) [19]

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


ANB   (2005-05-31 10:28:00) [20]

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


Страницы:   1 2

Наверх

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