Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
14-18608
RDA
2003-09-17 18:20
2003.10.06
Update для Delphi 5


14-18555
wl
2003-09-17 15:59
2003.10.06
Как запустить WinXP после установки Win2k


11-18286
Kladov
2003-01-23 15:15
2003.10.06
Конкурс на самую короткую реализацию Double2Str


6-18518
St!ff
2003-08-04 03:59
2003.10.06
Учет трафика


1-18312
Abikos
2003-09-23 20:09
2003.10.06
функция обратная StrToHex





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