Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.09.2012, 17:42
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию DBGrid и SQL запросы

При выполнении sql запросов DBGrid отражает результат так сказать в режиме он-лайн. Меня интересует следующее. Берем пустой dbgrid, выполняем sql запрос (при условии что это самое условие уникально, т.е. я из общего массива данных вытащу 1 поле). В dbgrid появилось поле с результатом. И вот в чем суть!!! Я хочу выполнить еще один SQL-запрос. Так, чтобы результат оказался в следующей строке (поле) dbgrid. И так далее. Чтобы dbgrid содержал в себе поля-результаты всех запросов, а не только последнего. Спасибо!
Ответить с цитированием
  #2  
Старый 12.09.2012, 17:47
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
При выполнении sql запросов DBGrid отражает результат так сказать в режиме он-лайн. Меня интересует следующее. Берем пустой dbgrid, выполняем sql запрос (при условии что это самое условие уникально, т.е. я из общего массива данных вытащу 1 поле). В dbgrid появилось поле с результатом. И вот в чем суть!!! Я хочу выполнить еще один SQL-запрос. Так, чтобы результат оказался в следующей строке (поле) dbgrid. И так далее. Чтобы dbgrid содержал в себе поля-результаты всех запросов, а не только последнего. Спасибо!
DBGrid только отображает результат запроса, он ничего не хранит. Результат запроса хранится в Query. Тебе просто нужно выполнить правильный запрос (например с использованием UNION). Если же нужно накапливать результаты нескольких запросов, то можешь использовать для этого например TStringGrid.
Ответить с цитированием
  #3  
Старый 13.09.2012, 06:26
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

я для таких целей использую связку
квэри --> виртуальная таблица --> грид
из квэрика данные переношу в VT процедурой и если надо добавляю их если нет чищу перед этим VT
Ответить с цитированием
  #4  
Старый 13.09.2012, 10:05
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Lost_Fish
я для таких целей использую связку
квэри --> виртуальная таблица --> грид
из квэрика данные переношу в VT процедурой и если надо добавляю их если нет чищу перед этим VT
А можно мне глянуть кусок кода, чтоб понять, как это реализуется. Думаю, это именно то, что нужно. Спасибо!
Ответить с цитированием
  #5  
Старый 13.09.2012, 10:15
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
А можно мне глянуть кусок кода, чтоб понять, как это реализуется. Думаю, это именно то, что нужно. Спасибо!
Виртуальная таблица - это отдельный компонент, его нужно ставить отдельно. Например он есть в известной библиотеке RxLib.
А в стандартных компонентах Delphi есть такой TClientDataSet, он предназначен немного для другого, но можно использовать и как виртуальную таблицу. Для этого я его обычно и использую
Ответить с цитированием
  #6  
Старый 13.09.2012, 10:32
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Вот так можно перекачать данные из обычного 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  
Старый 13.09.2012, 10:35
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от kerby666
А можно мне глянуть кусок кода, чтоб понять, как это реализуется. Думаю, это именно то, что нужно. Спасибо!

блин в предыдущем посте 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  
Старый 13.09.2012, 10:37
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Вот так можно перекачать данные из обычного 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;
А как из ClientDataSet1.Data перелить в DBGrid?
Ответить с цитированием
  #9  
Старый 13.09.2012, 10:40
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от kerby666
А как из ClientDataSet1.Data перелить в DBGrid?
DataSourse.DataSet:=ClientDataSet;
DBGrid.DataSource:=DataSource;
связка же
Ответить с цитированием
  #10  
Старый 13.09.2012, 10:41
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
А как из ClientDataSet1.Data перелить в DBGrid?
В DBGrid нельзя перелить потому что он данные не хранит, он только отображает "чужие" данные. Просто переключи тот DataSource который использует DBGrid с Query на ClientDataSet.
Ответить с цитированием
  #11  
Старый 13.09.2012, 10:48
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
В DBGrid нельзя перелить потому что он данные не хранит, он только отображает "чужие" данные. Просто переключи тот DataSource который использует DBGrid с Query на ClientDataSet.
С этим более-менее понятно. Но вот с настройками компонента не могу разобраться (ClientDataSet). Active в True не ставиться. Источником данных могу выбрать DataSource1 или DataSource2 и все.

Последний раз редактировалось kerby666, 13.09.2012 в 11:05.
Ответить с цитированием
  #12  
Старый 13.09.2012, 11:00
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Missing data provider or data packet

Последний раз редактировалось kerby666, 13.09.2012 в 11:03.
Ответить с цитированием
  #13  
Старый 13.09.2012, 12:22
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
С этим более-менее понятно. Но вот с настройками компонента не могу разобраться (ClientDataSet). Active в True не ставиться.
Не ставится потому, что таблица не созданна. Её нужно сначала создать или закачать в ClientDataSet данные из Query или Table так, как я показывал выше.
Цитата:
Сообщение от kerby666
Источником данных могу выбрать DataSource1 или DataSource2 и все.
Это устанавливать не нужно, это свойство предназначено для других целей.
Цитата:
Сообщение от kerby666
Missing data provider or data packet
Говорит что не подключен провайдер (это для других целей) или не загружены данные, нужно либо создать пустую таблицу, либо загрузить в ClientDataSet данные из Query или Table как я показал в примере выше.

Создать пустую таблицу в 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  
Старый 13.09.2012, 12:25
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Ну я как-бы разобрался с этим компонентом. Отображает DBGrid результат SQL-запроса из ClientDataSet. Но при новом запросе очищается. Как сделать чтоб результат копился в файле виртуальной таблицы (у меня virtual.cds). И очищался тогда, когда я этого хочу. И спасибо за помощь всем!!!
Ответить с цитированием
  #15  
Старый 13.09.2012, 12:29
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

finally
Provider.Free;
end;

Подозреваю, что вместо Free надо что-то другое написать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter