![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рабочие наборы данных. [D6, XP]
DROWSY © (2010-08-12 18:06:00)Есть набор данных. Для рассчётов нужна рабочая копия этого набора.
(динамический массив записей)
Какой алгоритм быстрого заполнения такого рабочего массива данными набора?
12 (2010-08-13 10:12:00) [1]
> Ты действительно думаешь, что это будет быстрее?
вроде MCantu так советовал
но без Open. Open я не подумавши ляпнул, вернее точно не помнил что там понаписано было - но если автора устроило бы - разобрался бы и сам потом, что не нужно
Jeer (2010-08-13 09:51:00) [2]
> Есть набор данных. Для рассчётов нужна рабочая копия этого
> набора.
В TDataset доступен внутренний кэш через:
property Buffers[Index: Integer]: PChar;
property BufferCount: Integer;
Ega23 (2010-08-13 09:44:00) [3]
> q.Open;
Ты действительно думаешь, что это будет быстрее?
12 (2010-08-13 08:30:00) [4]не то?
qMain: TADOQuery;
q: TADOQuery;
q.Clone(qMain);
q.Open;
Ega23 (2010-08-13 05:39:00) [5]
> Как ОДНУ запись набора скопировать в var Storage : TStorage;
Тебе уже ответили - никак. в НД реально лежит не совсем массив рекордов, там всё гораздо сложнее.
Кстати, исходники у тебя есть, я бы на твоём месте посмотрел... :)
Amoeba_ (2010-08-13 00:22:00) [6]
> Как ОДНУ запись набора скопировать в var Storage : TStorage;
>
> Без присваивания
>
Считай, что никак.
DROWSY (2010-08-12 23:49:00) [7]Как ОДНУ запись набора скопировать в var Storage : TStorage;
Без присваивания
Storage.PR_ID := FieldByname('PR_ID').asInteger;
.....
Storage.LOADING := FieldByname('PR_ID').asInteger;
Amoeba_ (2010-08-12 23:19:00) [8]
> А как "массив записей набора" скопировать?
Ну не существует такого массива. Как мыслите копирование того, чего нет?
Сергей М. (2010-08-12 23:16:00) [9]
> DROWSY (12.08.10 23:13) [16]
> Это ведь копирование массива записей?!
Угу.
Цитирую тебя:
> (динамический массив записей)
А вот это
> массив записей набора
абсурд.
DROWSY (2010-08-12 23:13:00) [10]
> Сергей М. © (12.08.10 22:35) [15]
Это ведь копирование массива записей?!
А как "массив записей набора" скопировать?
Сергей М. (2010-08-12 22:35:00) [11]
> можно ли без цикла по полям набора?
В данном конкретномслучае можно.
type
TStorages = array of TStorage;
var
SrcStorages, DstStorages: TStorages;
..
SetLength(DstStorages, Length(SrcStorages));
Move(SrcStorage[0], DstStorage[0], Length(SrcStorage)*SizeOf(TStorage));
Amoeba_ (2010-08-12 22:30:00) [12]
> можно ли без цикла по полям
Не просто можно, а только так. Какой, нафиг, здесь может быть цикл, если Storage не есть массив?
DROWSY (2010-08-12 22:25:00) [13]CREATE TABLE STORAGE (
PR_ID INTEGER NOT NULL,
B_S_B SMALLINT,
TYPE_S SMALLINT,
INVESTMENT FLOAT,
EXPANCES FLOAT,
TIME_S SMALLINT,
FILLING FLOAT,
LOADING SMALLINT
);
Набор состоит из всех полей таблицы STORAGE
//-------------
type
TStorage = record
PR_ID : integer;
B_S_B : integer;
TYPE_S : SMALLINT;
INVESTMENT: Double;
EXPANCES : Double;
TIME_S : SMALLINT;
FILLING : Double;
LOADING : SMALLINT;
end;
var Storage : TStorage;
Как проще скопировать запись набора в var Storage (можно ли без цикла по полям набора?)?
Сергей М. (2010-08-12 22:19:00) [14]
> Какой алгоритм быстрого заполнения такого рабочего массива
> данными набора?
Какие записи - такой и алгоритм.
KilkennyCat (2010-08-12 19:27:00) [15]откуда я знаю? я даже не знаю, что такое запись массива. элемент массива знаю, а вот запись - нет. я даже не уверен, что правильно понимаю, что есть запись набора.
но поскольку в т.з. говорилось о какой-то копии, то как правило, сие идентично, а раз идентично, значит присваивавываться должно просто с блеском.
в противном случае уточняйте вопрос. учитывая, что делается ставка на скорость - универсального решения нет, только специализированное.
например:
есть массив А. Нужно сделать копию для расчетов В. Расчет такой - если следующий элемент массива больше предыдущего, то к предыдущему присваивается единица.
В таком случае нет необходимости делать предварительную копию, заполнение массива B производится в процессе расчета.
Второй вариант:
то же самое, но потом каждый элемент высчитывается на основе всех других.
И здесь то же, заполнение можно производить при предварительном расчете, а потом окончательный расчет.
третий вариант:
каждый элемент рассчитывается на основе всех, и в момент расчета может изменится любой (что-то заумно, но вообщем так). Тут придется копировать, потом считать.
Четвертый вариант: нужен быстрый слепок, потому что расчет долгий, и за время вычисления исходный массив может изменится.
Тут два варианта: быстро копируем, а потом считаем, либо в процессе заполняем сразу два (ресурсоемко, зато быстро).
И это только навскидку. Что там у Вас - только Вам известно.
DROWSY (2010-08-12 19:10:00) [16]Какую фигню присвоить другой фигне для того чтобы скопировать запись
набора в запись массива?
KilkennyCat (2010-08-12 19:01:00) [17]это оператор присваивания. присваивавывает всякую фигню другой фигне. иногда. при определенных условиях. если условия неопределенные, то их принудительно определяют.
DROWSY (2010-08-12 18:48:00) [18]
> KilkennyCat © (12.08.10 18:36) [4]
> конечно. :=
? := ?
KilkennyCat (2010-08-12 18:47:00) [19]
> Ega23 © (12.08.10 18:45) [6]
ты запрещаешь? :)
Ega23 (2010-08-12 18:45:00) [20]
> А можно как-либо целиком запись набора скопировать в запись
> массива?
Нет.