Форум: "Базы";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];
ВнизНужно добавить в 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c