Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенос данных из запроса в таблицу!! [D7, Access]


PhillipJFry ©   (2006-07-09 11:23:00) 

Подскажите, как сделать групповой перенос. Я работаю через ADO с базой данных  Access.  Компонент ADOQuery1 подключен к базе и выполняет запрос типа

SELECT FROM
WHERE
UNION
SELECT FROM
WHERE

В результате чего, ADOQuery1 выбирает из двух таблиц нужные данные.
Также у меня есть компонент TMemTableEh из пакета EHLib. Этот компонент держит все данные в памяти и работает как ни с чем несвязанный массив данных.

Вот такой вопрос, как добавить результат запроса ADOQuery1 в таблицу TMemTableEh не используя цикл??


PhillipJFry   (2006-07-09 17:52:00) [1]

Спасибо, теперь буду мучить :)


sniknik   (2006-07-09 17:47:00) [2]

> а как использовать ADODataSet1?
а как ты используеш ADOQuery1? это тоже самое (говорил же, ADOQuery, это слегка изуродованный ADODataSet), в нем должны быть данные для копирования. т.е. подключаеш (аналогично ADOQuery) к конекту, вставляеш запрос, выполняеш. и вот когда тум уже есть данные  копируеш в другой "в памяти".


PhillipJFry   (2006-07-09 15:28:00) [3]

а как использовать ADODataSet1?
ругается на Коннект или строку конекта, а к чему его подключать?


sniknik   (2006-07-09 12:52:00) [4]

компонент однозначно ADODataSet, не в принципе можно и другой (тот же клиентский) но зачем? раз уже используем ADO и но позволяет...

> и добавить данные в ту же таблицу memTable
а вот добавление без цикла вообще нигде не сделать, если первоначальный результат можно копией рекордсета через стрим сделать, то вот добавление не получится, структура будет мешать. если в какижто компанентах и есть функционал на добавление то внутри все одно цикл.
но не пойму чего страшного такого в простом цикле? (двойной, один проход по записям, внутри по полям) элементарно делается.

вот копия не совсем элементарно... поэтому пример

uses ADOInt, ComObj;

function CopyRecordSet(RecordSet: _RecordSet): _RecordSet;
var adoStream: OleVariant;
begin
 adoStream:= CreateOleObject('ADODB.Stream');
 Variant(RecordSet).Save(adoStream, adPersistADTG);
 Result:= CreateOleObject('ADODB.RecordSet') as _RecordSet;
 Result.CursorLocation:= adUseClient;
 Result.Open(adoStream, EmptyParam, adOpenStatic, adLockBatchOptimistic, Integer(adOptionUnspecified));
 adoStream:= UnAssigned;
end;

использовать
ADODataSet2.Recordset:= CopyRecordSet(ADODataSet1.Recordset);

PhillipJFry   (09.07.06 12:21) [5]
это у тебя уже ошибка в логике, которую ты даже не пытаешся исправить а закрываеш програмированием. но не боись оно еще вылезет, не здесь так в другом месте.
подзапросом не пробовал к примеру делать? так чтобы "анализ" был непосредственно в нем, а запрос выдавал все. (хотя подозреваю счас выяснится что и структура базы несколько "нестандарная"... ;)


PhillipJFry   (2006-07-09 12:21:00) [5]

запрос

SELECT FROM
WHERE
UNION
SELECT FROM
WHERE

содержит параметры. Значения которых заранее не известны.Они зависят от самого результата запроса. Вот я и хочу, выполнить запрос, затем перекинуть его в некую таблищц memTable, затем в ней проанализировать данные и на основе их опять  выполнить запрос и т.д. А затем эту совокупность данных что получатся в результате запросов в таблице memTable , уже использовать в другох целях.


PhillipJFry   (2006-07-09 12:14:00) [6]

мне нужно следующее:

1. выполнить запрос
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE

и скинуть его результат в некую таблицу memTable

2.опять выполнить запрос
SELECT FROM
WHERE
UNION
SELECT FROM
WHERE

и добавить данные в ту же таблицу memTable

...

таблица memTable это таблица в памяти , которая не связана не с одной таблицей на жёстком диске.

Подскажите, как реализовать такой механизм? и какой компонент использовать для формирования memTable (таблицы в памяти)?


sniknik   (2006-07-09 12:06:00) [7]

ClientDataSet хранит данные в памяти, ADODataSet хранит данные в памяти (ADOQuery вариация ADODataSet немного "покоцаная"), при выполнении запроса даже делать ничего не нужно данные в память закачиваются, а не с диска показываются (при клиентском курсоре, как по умолчанию стоит)...
ну и что? нет, это не смысл, это отмазка.
т.е. ты береш один компонент у которого данные уже в памяти и спрашиваеш, "как перекачать в другой", потому, что там данные в памяти... бред.


PhillipJFry   (2006-07-09 11:56:00) [8]

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


sniknik   (2006-07-09 11:36:00) [9]

не получится... если конечно в твоем TMemTableEh уже не встроена эта реализация, как например в стандартном ClientDataSet (подключить через провайдер данных и просто Open).

вообще непонятное желание, зачем чтото кудато переносить? тем более в нестандартный компонент, при том что у самого ADO рекордсеты это такиеже "таблици в памяти"... и вобщемто и копию в нем в другой ADODataSet не сложно сделать, но смысл?


Наверх

Титульная страница Поиск, карта сайта Написать письмо