|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
DBGrid и SQL запросы
При выполнении sql запросов DBGrid отражает результат так сказать в режиме он-лайн. Меня интересует следующее. Берем пустой dbgrid, выполняем sql запрос (при условии что это самое условие уникально, т.е. я из общего массива данных вытащу 1 поле). В dbgrid появилось поле с результатом. И вот в чем суть!!! Я хочу выполнить еще один SQL-запрос. Так, чтобы результат оказался в следующей строке (поле) dbgrid. И так далее. Чтобы dbgrid содержал в себе поля-результаты всех запросов, а не только последнего. Спасибо!
|
#2
|
||||
|
||||
Цитата:
|
#3
|
||||
|
||||
я для таких целей использую связку
квэри --> виртуальная таблица --> грид из квэрика данные переношу в VT процедурой и если надо добавляю их если нет чищу перед этим VT |
#4
|
|||
|
|||
Цитата:
|
#5
|
||||
|
||||
Цитата:
А в стандартных компонентах Delphi есть такой TClientDataSet, он предназначен немного для другого, но можно использовать и как виртуальную таблицу. Для этого я его обычно и использую |
#6
|
||||
|
||||
Вот так можно перекачать данные из обычного Query в виртуальную ClientDataSet:
Код:
uses ..., MidasLib, Provider; ... procedure TForm1.Button1Click(Sender: TObject); var Provider: TDataSetProvider; begin Provider := TDataSetProvider.Create(nil); try Provider.DataSet := Query1; ClientDataSet1.Data := Provider.Data; finally Provider.Free; end; end; |
#7
|
||||
|
||||
Цитата:
блин в предыдущем посте P.S. не сохранил я для этого использую DevArt IBDAC http://www.devart.com/ibdac/download.html у него в комплекте идёт TVirtualTable и TCRBatchMove (он переносит данные в VT) Код:
procedure BatchMove(FromDS,ToDS:TDataSet;const Mode:TCRBatchMode=bmAppendUpdate); var BachMove:TCRBatchMove; begin try BachMove:=TCRBatchMove.Create(nil); BachMove.FieldMappingMode:=mmFieldName; BachMove.Mode:=Mode; BachMove.Source:=FromDS; BachMove.Destination:=ToDS; BachMove.Execute; ToDS.Open; finally FreeAndNil(BachMove); end; end; но можно и без сторонних компонентов попробовать что-то типа этого Код:
procedure BatchMove(FromDS,ToDS:TDataSet); var x:Integer; begin if Assigned(FromDS) and Assigned(ToDS) and FromDS.Active and ToDS.Active then //если есть оба НД и они открыты begin FromDS.First; //в начало источника While not FromDS.Eof do //цикл до конца источника begin ToDS.Append;//добавить в конец приёмника for x:=0 to FromDS.FieldCount-1 do //цикл по всем колонкам источника if ToDs.FieldByName(FromDS.Fields[x].FieldName)<>nil then //если есть колонка из источника в приёмнике ToDS[FromDS.Fields[x].FieldName]:=FromDS.Fields[x].Value;//то переносим данные ToDS.Post; FromDS.Next; //следующий end; end; end; поля в приёмнике нужно создать до этого с такими же названиями как у источника (при желании можешь доработать до автоматического создания полей) должно работать для любого наследника TDataSet, если нет TVirtualTable можно просто таблицу подсунуть P.S. второй код писал без проверки, может содержать ошибки P.S.S. пока писал меня обогнали)) точно есть ClientDataSet я про него забыл)) |
#8
|
|||
|
|||
Цитата:
|
#9
|
||||
|
||||
Цитата:
DBGrid.DataSource:=DataSource; связка же |
#10
|
||||
|
||||
Цитата:
|
#11
|
|||
|
|||
Цитата:
Последний раз редактировалось kerby666, 13.09.2012 в 11:05. |
#12
|
|||
|
|||
Missing data provider or data packet
Последний раз редактировалось kerby666, 13.09.2012 в 11:03. |
#13
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Создать пустую таблицу в ClientDataSet можно или через инспектор объектов Delphi - добавляешь нужные поля в свойство FieldDefs, а потом нажимаешь на компоненте ClientDataSet правую кнопку и выбираешь "Create DataSet", или же можно программно: Код:
begin ClientDataSet1.FieldDefs.Add('Имя поля1', ftInteger); ClientDataSet1.FieldDefs.Add('Имя поля2', ftString, 100); ClientDataSet1.CreateDataSet; // или можно продублировать структуру как у Query или Table вот так: ClientDataSet1.FieldDefs.Assign(Query1.FieldDefs); ClientDataSet1.CreateDataSet; end; |
#14
|
|||
|
|||
Ну я как-бы разобрался с этим компонентом. Отображает DBGrid результат SQL-запроса из ClientDataSet. Но при новом запросе очищается. Как сделать чтоб результат копился в файле виртуальной таблицы (у меня virtual.cds). И очищался тогда, когда я этого хочу. И спасибо за помощь всем!!!
|
#15
|
|||
|
|||
finally
Provider.Free; end; Подозреваю, что вместо Free надо что-то другое написать. |