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

Delphi Sources



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

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

Цитата:
Сообщение от kerby666
Ну я как-бы разобрался с этим компонентом. Отображает DBGrid результат SQL-запроса из ClientDataSet. Но при новом запросе очищается. Как сделать чтоб результат копился в файле виртуальной таблицы (у меня virtual.cds).
А вот здесь тебе пригодится процедура BatchMove которую выше тебе написал Lost_Fish (та которая вторая).
Вызываешь её примерно так:
Код:
  BatchMove(Query1, ClientDataSet1);
Цитата:
Сообщение от kerby666
И очищался тогда, когда я этого хочу.
Код:
    ClientDataSet1.EmptyDataSet;
Цитата:
Сообщение от kerby666
finally
Provider.Free;
end;

Подозреваю, что вместо Free надо что-то другое написать.
И что же здесь должно быть по-твоему? Здесь Provider нужен был только для того чтобы перегнать данные из Query в ClientDataSet и после этого он больше не нужен поэтому уничтожается.
Ответить с цитированием
  #17  
Старый 13.09.2012, 14:22
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Lost_Fish
блин в предыдущем посте 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;

ToDS - это у меня ClientDataSet1 должно быть - здесь храню данные для последующего вывода в DBGrid.
FromDS - ??? Откуда забирать? Или создать еще одну виртуальную таблицу и туда записывать из первой(в которую попадают результаты sql)

Последний раз редактировалось kerby666, 13.09.2012 в 14:37.
Ответить с цитированием
  #18  
Старый 13.09.2012, 15:10
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от kerby666
ToDS - это у меня ClientDataSet1 должно быть - здесь храню данные для последующего вывода в DBGrid.
FromDS - ??? Откуда забирать? Или создать еще одну виртуальную таблицу и туда записывать из первой(в которую попадают результаты sql)

FromDS откуда забирать(в твоём случае Квэрик), ToDS куда класть ClientDataSet1 только убедись что в ClientDataSet1 есть все нужные тебе поля и он открыт

poli-smen тебе даже вызов написал
Код:
BatchMove(Query1, ClientDataSet1);
__________________
Код сырец

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

procedure BatchMove(FromDS,ToDS:TDataSet);
ругается на TDataSet - E2003 Undeclared identifier: 'TDataSet'
Ответить с цитированием
  #20  
Старый 14.09.2012, 11:23
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
procedure BatchMove(FromDS,ToDS:TDataSet);
ругается на TDataSet - E2003 Undeclared identifier: 'TDataSet'
Класс TDataSet находится в модуле DB.pas
Ответить с цитированием
  #21  
Старый 14.09.2012, 11:33
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Добавил в Uses модуль DB. Только новые ошибки. Извините, я окончательно запутался. Мне нужно перед началом цикла FromDS:=DataModule1.ADOQuery1.DataSet И ToDS:=DataModule1.ClientDataSource1.DataSet?????
Ответить с цитированием
  #22  
Старый 14.09.2012, 11:36
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
Добавил в Uses модуль DB. Только новые ошибки. Извините, я окончательно запутался. Мне нужно перед началом цикла FromDS:=DataModule1.ADOQuery1.DataSet И ToDS:=DataModule1.ClientDataSource1.DataSet?????
Нет. Вызываешь так:
Код:
BatchMove(DataModule1.ADOQuery1, DataModule1.ClientDataSource1);
Ответить с цитированием
  #23  
Старый 14.09.2012, 12:38
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Вроде получилось
Ответить с цитированием
  #24  
Старый 14.09.2012, 13:05
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

Мелочь осталась такая. Поле со счетчиком. Тип - автоинкремент. Пришлось поставить modify : true, не компилилось иначе. Вытаскиваю sql-запросом поле со счетчиком 4 например. Помещаю в dbgrid. Выполняю след. запрос. Поле со счетком 6 напимер. Все корректно. Но при выводе в dbgrid вторая строка идет с номером 5. Первая строка с номером 4 потому что. Счетчик работает типа. Как бы сделать, чтоб такого не было. Или чтоб счетчик не работал при выводе в грид.
P.S. после очистки ClientDataSource нумерация продолжается с последнего 8 например, хотя строка в гриде первая.

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

Цитата:
Сообщение от kerby666
Мелочь осталась такая. Поле со счетчиком. Тип - автоинкремент. Пришлось поставить modify : true, не компилилось иначе. Вытаскиваю sql-запросом поле со счетчиком 4 например. Помещаю в dbgrid. Выполняю след. запрос. Поле со счетком 6 напимер. Все корректно. Но при выводе в dbgrid вторая строка идет с номером 5. Первая строка с номером 4 потому что. Счетчик работает типа. Как бы сделать, чтоб такого не было. Или чтоб счетчик не работал при выводе в грид.
P.S. после очистки ClientDataSource нумерация продолжается с последнего 8 например, хотя строка в гриде первая.
Просто сделай автоинкрементное поле у ClientDataSet1.FieldDefs не автоинкрементным, а например ftInteger (вместо ftAutoInc).
И ещё вопрос: а задача не позволяет выбрать нужные записи одним sql-запросом?
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
kerby666 (14.09.2012)
  #26  
Старый 14.09.2012, 13:54
kerby666 kerby666 вне форума
Прохожий
 
Регистрация: 12.09.2012
Сообщения: 20
Репутация: 10
По умолчанию

каждый запрос должен возвращать одно поле. Каждое уникально. Так нужно.
Ответить с цитированием
  #27  
Старый 14.09.2012, 14:02
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от kerby666
каждый запрос должен возвращать одно поле. Каждое уникально. Так нужно.
Странное задание... Всё равно подозреваю, что можно сделать одним запросом
Ответить с цитированием
  #28  
Старый 14.09.2012, 14:16
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от kerby666
Мелочь осталась такая. Поле со счетчиком. Тип - автоинкремент. Пришлось поставить modify : true, не компилилось иначе. Вытаскиваю sql-запросом поле со счетчиком 4 например. Помещаю в dbgrid. Выполняю след. запрос. Поле со счетком 6 напимер. Все корректно. Но при выводе в dbgrid вторая строка идет с номером 5. Первая строка с номером 4 потому что. Счетчик работает типа. Как бы сделать, чтоб такого не было. Или чтоб счетчик не работал при выводе в грид.
P.S. после очистки ClientDataSource нумерация продолжается с последнего 8 например, хотя строка в гриде первая.

ты можешь не выводить это поле в грид допустим, но при этом получить его с Query и перенести в ClientDataSet

для этого 2 раза ткни на грид в дизайнере добавь нужное кол-во колонок, укажи им всем FieldName и Title.Caption

Цитата:
каждый запрос должен возвращать одно поле. Каждое уникально. Так нужно.

может не 1 поле а 1 запись с каким-то кол-вом полей? не?
__________________
Код сырец

Последний раз редактировалось Lost_Fish, 14.09.2012 в 14:18.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter