Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Нужно добавить в DBGrid поле не содержащееся в Recordset   Найти похожие ветки 

 
Йурий   (2003-09-16 12:12) [0]

Такая проблема, мне нужно добавить поле в DBGrid не связанное с конкретным полем reordset, вычесляемое не подойдет...
Скажем, после открытия ADOQuery я вычисляю значения для этого поля один раз и они(значения) существуют до следующего открытия, а не как в вычисляемом поле вычесляются при каждой отрисовке данных...
На это поле нужно накладывать фильтры, сортировать на клиенте, с вычисляемыми это не проходит...
Спасибо!


 
Йурий   (2003-09-16 12:23) [1]

Точнее, добавить не в DBGrid, а в ADOQuery...


 
Alex_ring ©   (2003-09-16 12:25) [2]

Попробуй создать пустую Query
WITH WorkQuery do
begin
close;
sql.clear;
sql.add("select count(*),MAX(ID) AS M");
sql.add("from table1");
open;
end;
Table1.FieldByName(ID).AsInteger:=WorkQuery.fieldByName("M").AsInteger +1;

Вот пример где с помощью Query можно получить количество записей в таблице и присвоить значение новому полю


 
Йурий   (2003-09-16 12:35) [3]

Чото непонятно...
Число записей я всегда узнать могу по ADOQuery.RecordCount, а как поле-то создать чтоб оно было только на клиенте?!?!


 
Sandman25 ©   (2003-09-16 12:40) [4]

select *, cast ("" as char(20)) my_field
from table

AfterOpen пробежаться по DataSet и изменить значение my_field


 
Йурий   (2003-09-16 12:56) [5]

Попробывал, ругается DataSet not in edit or insert mode!
ADOQuery1.CanModify:=True; поставить не дает?


 
Sandman25 ©   (2003-09-16 13:05) [6]

Жаль. Сейчас я попробую воспроизвести Вашу ситуацию...
Правда, в TQuery.


 
Sandman25 ©   (2003-09-16 13:07) [7]

Кстати, а Вы Edit не забыли вызвать?


 
Йурий   (2003-09-16 13:07) [8]

И еще, при изметнении, он попытается отправить все это на сервер... Т.е. сохранить...


 
Nikolay M. ©   (2003-09-16 13:10) [9]

А что вообще за задача?
Может дело простым вспомогательным массивом в памяти обойдется?


 
Йурий   (2003-09-16 13:11) [10]

Вот код...
ADOQuery1.First;
for i:=1 to ADOQuery1.RecordCount do
begin
DataSource1.Edit;
ADOQuery1new_field.AsInteger:=i;
ADOQuery1.Next;
end;
Он пытается сохранить все это на сервак, а поле-то виртуальное...


 
Sandman25 ©   (2003-09-16 13:12) [11]

>И еще, при изметнении, он попытается отправить все это на сервер... Т.е. сохранить...

Естественно. Получается, что надо либо использовать вычисляемое поле, либо CashedUpdates := True (если такое есть у ADOQuery).

А возможно ли вычислить значение этого поля в SQL? В чем смысл поля?


 
Йурий   (2003-09-16 13:17) [12]

Nikolay M. © Не, другое(а что кроме вычисляемых) все перепробывал, ничо не подходит поскольку надо ставить фильтры, сортировать на клиенте по этому полю...


 
Sandman25 ©   (2003-09-16 13:17) [13]

[9] Nikolay M. © (16.09.03 13:10)

Массив в памяти ему не подойдет. Ему же фильтровать и сортировать по этому полю надо.


 
Sandman25 ©   (2003-09-16 13:19) [14]

Йурий

А возможно ли вычислить значение этого поля в SQL? В чем смысл поля?


 
Йурий   (2003-09-16 13:21) [15]

В том-то и проблема, если на SQL вычислять сильногрузит сервак, поскольку запросец нехилый... Похоже решения к сож. пока нет... Эх-хе-хе


 
Йурий   (2003-09-16 13:24) [16]

Во! А ктонить структуру _recordset знает? Может создавать _recordset на клиенте и присваивать ADOQuery?


 
ZrenBy ©   (2003-09-16 13:27) [17]

Все элементарно делается классическим методом -
использованием временных таблиц

if(object_id("tempdb..#temp_M") is not null)drop table #temp_M
create table #temp_M (
M_ID int,
. . .
Z_1 smallint,
Z_2 smallint
)

insert into #temp_M
select
M_ID,
. . .
Z_1 = cast(0 as smallint),
Z_2 = cast(0 as smallint)
from . . .
left outer join
. . .
where
. . .
order by
. . .

select * from #temp_M


 
Sandman25 ©   (2003-09-16 13:33) [18]

[17] ZrenBy © (16.09.03 13:27)

Точно! Можно создавать какие угодно поля и не беспокоиться об их сохранении на сервер...


 
Йурий   (2003-09-16 13:34) [19]

Он, по сути, так и работает, поскольку запрос сложный и все в результате берется из временной таблицы... Но он же все равно собирается во временную таблицу сохранить, а держать ее в памяти неохото...


 
Йурий   (2003-09-16 13:36) [20]

Узнать бы еще как этот recordset создавать? :)


 
Sandman25 ©   (2003-09-16 13:41) [21]

[19] Йурий (16.09.03 13:34)

Так если у Вас и так временная таблица, так в чем проблема. Пускай себе записывает обратно в нее? Кстати, с чего Вы взяли, что сервер нужно беречь? Обычно его используют по максимуму, чтобы не нагружать клиента и сеть. Не на каждом рабочем месте стоит PentiumIV :)


 
Hooch ©   (2003-09-16 13:43) [22]

если смущает явное создание временной таблицы, можно "завуалировать"

adoDataSet.Commandtext =
"DECLARE TABLE @Data(....) "+
"INSERT INTO @Data ... " +
"SELECT * FROM @Data..."
:-)


 
Йурий   (2003-09-16 13:47) [23]

Временная таблица конечно выход, но как-бы было здорово создавать дополнит. поля на клиенте... :)


 
Nikolay M. ©   (2003-09-16 13:58) [24]

Проблема только в том, чтобы фильтровать некоторое трудновычислямое поле не клиенте? Ну так а OnFilterRecord - не выход?


 
Йурий   (2003-09-16 14:04) [25]

сортировать еще надо, икать по нему...


 
Nikolay M. ©   (2003-09-16 14:11) [26]


> икать по нему

:))) LOL :)

По сабжу:
ClientDataSet, RxMemoryData/MemoryTable?


 
Йурий   (2003-09-16 14:47) [27]

А где взять RxMemoryData?


 
Nikolay M. ©   (2003-09-16 14:49) [28]

Вообще - библиотека RxLib, а конкретно для Д7 - в библиотеке JEDI, например.


 
Йурий   (2003-09-16 14:54) [29]

А где взять?



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

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
8-18485
pole
2003-06-09 11:23
2003.10.06
как в мультимедиа в Дельфи проиграть список MP3-файлов


1-18391
Александр из Минска
2003-09-22 16:10
2003.10.06
Как перехватить нажатие клавиши Delete?


1-18418
Chlavik
2003-09-25 14:48
2003.10.06
DrawFocuseRect. А Как нарисовать просто линию такого стиля?


1-18451
romeo
2003-09-24 18:25
2003.10.06
Мистика при чтении данных из потока


3-18226
Смирнов Алексей
2003-09-16 23:37
2003.10.06
Фильтрация данных по каждому полю.