Форум: "Базы";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Внизредактируемый датасет в ADO Найти похожие ветки
← →
Hooch (2003-08-07 11:01) [0]День добрый госопода !
Проблема такова: есть TadoDataSet, в нем запрос "SELECT 10 AS ID", в результате выполнения получается НЕредактируемый набор данных, не зависимо от типа курсора и блокировки, что б сделать набор редактируемым я ходил 2 путями, либо делал в ставку во временную таблицу потом выборку из ней, либо создавал другой DataSet и переносил в него данные, а нет ли в ADO другой более быстрой и простой возможности сделать набор редактируемым ?
← →
Mike1 Kouzmine1 (2003-08-07 11:07) [1]А что ты хочешь редактировать?
← →
Hooch (2003-08-07 11:11) [2]ну положим в приведённом выше запросе я в гриде хочу вместо 10 написать 20
← →
Fiend (2003-08-07 11:13) [3]И что по твоему должно сохраниться в БД, и самое главное КУДА?
← →
Mike1 Kouzmine1 (2003-08-07 11:13) [4]Я тебе скажу как, если ты мне объяснишь - зачем это?
← →
Hooch (2003-08-07 11:15) [5]т.е. если в SELECT учавствуют какие-то вычисляемые поля, то на клиенте не получается их редактировать, а хочется :-) это достаточно или дать конкретный пример ?
← →
Hooch (2003-08-07 11:16) [6]
← →
Mike1 Kouzmine1 (2003-08-07 11:16) [7]Дать конкретный пример
← →
ZrenBy (2003-08-07 11:19) [8]>>делал в ставку во временную таблицу потом выборку из ней
Классический метод. Чем тебе не нравится ?
или смотри в сторону ADO.NET
еще тут
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=1794
← →
sniknik (2003-08-07 11:28) [9]да бросьте вы, чего проще создать оторвенный датасет (clone), и редактируй чего хочеш.
Mike1 Kouzmine1 (07.08.03 11:16)
> Дать конкретный пример
могу даже конкретную программу(тест) дать... правда по своим данным/условиям.
там передача в COM-сервер данных идет, данные берутся из базы но перед передачей юзеру позволительно поменять чего хочет. удобнее всего как мне показалось именно так сделать (редакция в гриде).
← →
Hooch (2003-08-07 11:31) [10]>> ZrenBy ©
Метод не нравится потому что во первых я не имею доступа к хранимым процедурам а написать в CommandText "insert into #.. exec ..." пертит текущей идеологии разработки что в любая команда толжна содержать только "exec Procname ..." это тоже не от меня зависит.
Конкретный пример :-) возвращается набор данных в документ
<RectID,Плановое количество,Фактическое количество>
я документе редактируется поле <Фактическое количество>, при сохранении вызывается процедура, в которую передается RecID и фактическое количество, которая в свою очеред и обновляет в БД что нужно и где нужно, так вот запос загрузки данных написан так что поле <Фактическое количество> получается не редактируемым
← →
Hooch (2003-08-07 11:37) [11]>> sniknik ©
а можно пример как оторваный датасет сделать ?
← →
Hooch (2003-08-07 12:25) [12]просто Clone не помогает
← →
sniknik (2003-08-07 12:47) [13]Hooch © (07.08.03 11:37)
>> sniknik ©
> а можно пример как оторваный датасет сделать ?
я делал в ClientDataSet (причины не помню, в ADODataSet тоже можно), пример смотри в хелпе по TClientDataSet.CreateDataSet.
← →
Hooch (2003-08-07 12:57) [14]>> sniknik ©
если через ClientDataSet делать, то и без CreateDatSet можно обойтись, а если TadoDatSet"у делать CreateDatSet, то данные нужно будет копировать из одного в другой а сие медленно.
← →
sniknik (2003-08-07 13:12) [15]Hooch © (07.08.03 12:57)
> если через ClientDataSet делать, то и без CreateDatSet можно обойтись ...
ну не обязательно повторять как у меня (я же для примера, и сказал что ADODataSet то же самое позволяет)
Hooch © (07.08.03 12:25)
> просто Clone не помогает
в результирующем датасете предварительно определи поля, так к примеру если в 1-м ID автоинкремент (нередактируемый) то во втором (из него clone вызывать) ID просто интеджер ставиш, позволяет редактировать.
← →
Hooch (2003-08-07 13:49) [16]
ADODataSet1.CommandText := "SELECT 10 AS ID";
ADODataSet1.LockType := ltBatchOptimistic;
ADODataSet1.Open;
ADODataSet2.FieldDefs.Add("ID",ftInteger);
ADODataSet2.CreateDataSet;
( ADODataSet1,ltBatchOptimistic)
ADODataSet1.CommandText := "SELECT 10 AS ID";
ADODataSet1.LockType := ltBatchOptimistic;
ADODataSet1.Open;
ADODataSet2.FieldDefs.Add("ID",ftInteger);
ADODataSet2.CreateDataSet;
ADODataSet2.Clone(ADODataSet1,ltBatchOptimistic);
Так не работает или я не верно понял ?
← →
sniknik (2003-08-07 14:31) [17]да так не работает. но просто потому что ты чегото не учел
потому как, вот так работает
ADODataSet1.Close;
ADODataSet1.CommandText := "SELECT 10 AS ID";
ADODataSet1.LockType := ltBatchOptimistic;
ADODataSet1.Open;
// ADODataSet2.FieldDefs.Add("ID",ftInteger);
// ADODataSet2.CreateDataSet;
// убираем и задаем в десигн тайме, просто dbl-кликнув по компоненту и задав там new field - ID - integer - data
ADODataSet2.Clone(ADODataSet1);
← →
Hooch (2003-08-07 14:37) [18]:-) что б добится этого результат достаточно в ADODataSet1 всем филдам сказать ReadOnly := false, редактироватся то поле редактируется, но при ADODataSet1.Post значение восстанавливается
← →
sniknik (2003-08-07 14:49) [19]Hooch © (07.08.03 14:37)
сам тогда думай,
только в случае с автоинкрементом (выше) никаких востановлений при ADODataSet1.Post нет (специально не делаю но Post при переходе с записи на запись происходит, а исправленное значение остается)
могу повторить
> просто потому что ты чегото не учел
← →
Hooch (2003-08-07 15:05) [20]да уж, тяжела и неказиста жизнь простого прораммиста :-)
Всем спасибо за советы !
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c