Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

Как добавить данные из БД в полученный ранее набор данных?   Найти похожие ветки 

 
картман ©   (2009-07-15 15:51) [0]

Всем доброго времени суток!
 В форме приложения отображаются иерархические данные. Грузить сразу все дерево - долго, поэтому вначале грузится только первый уровень. При выборе узла соответствующие данные подгружаются из БД, при этом тот набор данных, что был загружен - остается, к нему лишь прибавляются требуемые в данный момент.
 Как это сделать?


 
Ega23 ©   (2009-07-15 15:53) [1]

DataSet.Insert;
try
 DataSet.FieldByName(...)  .As.... := ....;
   ......
 DataSet.FieldByName(...)  .As.... := ....;
finally
 DataSet.Post;
end;


 
картман ©   (2009-07-15 15:58) [2]


> Ega23 ©   (15.07.09 15:53) [1]


DataSet может работать будучи отключенным от БД? Если да - сколько времени будут вставляться 10 тыс записей?


 
PEAKTOP ©   (2009-07-15 16:05) [3]


> При выборе узла соответствующие данные подгружаются из БД,
>  при этом тот набор данных, что был загружен - остается,
>  к нему лишь прибавляются требуемые в данный момент.
>  Как это сделать?


IBTreeView скачай (например, на ibase.ru лежит пример для Firebird) и посмотри, как оно реализовано. Точно также можно прикрутить на любой движок БД. По крайней мере, лет восемь назад я аналог этого компонента для BDE настрогал за 5 минут.


 
Ega23 ©   (2009-07-15 16:08) [4]


procedure TForm2.Button3Click(Sender: TObject);
var
 ads : TADODataSet;
 i : Integer;
 cnt : Cardinal;
begin
 cnt := GetTickCount;
 try

   ads := TADODataSet.Create(nil);
   try
     ads.FieldDefs.Add("ID", ftInteger);
     ads.FieldDefs.Add("Name", ftString, 10);
     ads.CreateDataSet;
     ads.DisableControls;
     try

       for i := 0 to 10000 do
       begin
         ads.Insert;
         try
           ads.FieldByName("ID").AsInteger := i;
           ads.FieldByName("Name").AsString := "i=" + IntToStr(i);
         finally
           ads.Post;
         end;
       end;

     finally
       ads.EnableControls;
     end;

   finally
     ads.Free;
   end;

 finally
   cnt := GetTickCount - cnt;
   ShowMessage(IntToStr(cnt));
 end;
end;


 
Ega23 ©   (2009-07-15 16:09) [5]

Собственно, вместо TADODataSet можно любой другой потомок использовать. TClientDataSet, например.


 
картман ©   (2009-07-15 16:11) [6]


> PEAKTOP ©   (15.07.09 16:05) [3]

нужно для ADO. Интерфейс всего приложения построен на DevExpress - мож там уже есть чего готовое?


 
картман ©   (2009-07-15 16:12) [7]


> Ega23 ©   (15.07.09 16:08) [4]


>  cnt := GetTickCount;

у меня одно ядро и сто тыщ мильенов процессов:)


 
clickmaker ©   (2009-07-15 16:18) [8]

OnExpanding
select * from SomeTable where ParentID = <ID родителя, который прописан в Node.Data, например>
собственно, для источника данных для дерева можно использовать любой In-memory dataset, тот же RxMemoryData. Его можно заполнять последовательно


 
Ega23 ©   (2009-07-15 16:18) [9]


> у меня одно ядро и сто тыщ мильенов процессов:)


Это твои личные трудности, не так-ли?


 
Petr V. Abramov ©   (2009-07-15 16:29) [10]


> DataSet может работать будучи отключенным от БД?

да, см св-во CachedUpdates и все, что с ним связано

> Если да - сколько времени будут вставляться 10 тыс записей?

если сделать DisableControls и не будут вызываться события типа AfterInsert, то быстро, по крайней мере на глаз это время "не увидишь"


 
pasha_golub ©   (2009-07-15 16:37) [11]


> да, см св-во CachedUpdates и все, что с ним связано

От лукавого сие. Пользовать memory dataset нужно, например TKBMMemTable (http://www.components4programmers.com/products/kbmmemtable/)


 
картман ©   (2009-07-15 16:38) [12]


> Ega23 ©   (15.07.09 16:08) [4]


>      ads.FieldDefs.Add("ID", ftInteger);
>      ads.FieldDefs.Add("Name", ftString, 10);
>      ads.CreateDataSet;


спасибо, не знал, что так можно...


> Ega23 ©   (15.07.09 16:18) [9]

да я GetTickCount имел в виду - учитываются все такты процессора, а не только выделенные данному thread.


> clickmaker ©   (15.07.09 16:18) [8]


> любой In-memory dataset, тот же RxMemoryData.

великий тормоз этот наборчик...


 
Ega23 ©   (2009-07-15 16:59) [13]


> великий тормоз этот наборчик...


Судя по > спасибо, не знал, что так можно...  - ты просто не умеешь с ним работать.


 
Ega23 ©   (2009-07-15 17:00) [14]


> От лукавого сие. Пользовать memory dataset нужно, например
> TKBMMemTable


Паш, можно и свой написать, не так уж и сложно это. Даже статья на этом сайте была.


 
картман ©   (2009-07-15 17:06) [15]


> Ega23 ©   (15.07.09 16:59) [13]


> Судя по > спасибо, не знал, что так можно...  - ты просто
> не умеешь с ним работать.


Блин... а я Москву пересеку по диаметру быстрее(на авто), чем это сделает Шумахер - это я крут или он рулить не может?

PS. Да, карту ему нефик давать, а то мало ли...


 
Ega23 ©   (2009-07-15 17:22) [16]


> Блин... а я Москву пересеку по диаметру быстрее(на авто),
>  чем это сделает Шумахер - это я крут или он рулить не может?


Так может и наборчик совсем не тормознутый, а?
В 90% случаев Disable-EnableControls дают охрененный результат. Вне зависимости от природы TDataSet.


 
картман ©   (2009-07-15 17:40) [17]


> Ega23 ©   (15.07.09 17:22) [16]


> В 90% случаев Disable-EnableControls дают охрененный результат.
>  Вне зависимости от природы TDataSet.

вообще-то поторопился я с выводами - просто как-то видел код, использовавший RxMemoryData, работавший медленно, но не стал разбираться что к чему...


 
Jeer ©   (2009-07-15 17:41) [18]

Иногда совсем не обязательно добавлять данные в уже отобранные именно в рекорд-сет.
Ведь задача стоит в добавление в визуальные компоненты ( DBTree ), не так ли ?


 
картман ©   (2009-07-15 18:06) [19]


> Jeer ©   (15.07.09 17:41) [18]

да


 
Jeer ©   (2009-07-15 18:11) [20]

Ну так и выдергивай по SELECT с условием добавочные данные в любой удобный тебе временный Record-Set,  а вот оттуда и добавляй в DBTree.


 
Ega23 ©   (2009-07-15 18:16) [21]


> Ну так и выдергивай по SELECT с условием добавочные данные
> в любой удобный тебе временный Record-Set,  а вот оттуда
> и добавляй в DBTree.


Данный подход не совсем верный. У тебя уже могут произойти изменения предыдущего уровня. По-идее, перечитывать надо всё, ,что в данный момент открыто + то, что "раскрывают".


 
картман ©   (2009-07-15 18:19) [22]


> Jeer ©   (15.07.09 18:11) [20]


> Ega23 ©   (15.07.09 18:16) [21]

спасибо, я все понял. Просто не знал  DataSet.CreateDataSet и были предубеждения насчет memdataset"ов


 
Jeer ©   (2009-07-15 18:42) [23]


> Ega23 ©   (15.07.09 18:16) [21]
>
>
> > Ну так и выдергивай по SELECT с условием добавочные данные
> > в любой удобный тебе временный Record-Set,  а вот оттуда
> > и добавляй в DBTree.
>
>
> Данный подход не совсем верный. У тебя уже могут произойти
> изменения предыдущего уровня. По-идее, перечитывать надо
> всё, ,что в данный момент открыто + то, что "раскрывают".
>


"Идеи у всех разные, а тем более их реализация" (С)

Зависит от задачи.
Для Back-Office продуктов - да, может быстро начаться десинхронизация, а для Front-Ofiice самое то.

А если идет постепенный добор данных до почти полного множества, то суммарное время на такое перечитывание с лихвой превысит одноразовое полное считывание. Да и то, если это бекофис-продукт, данные быстро устареют.

С другой стороны, если это справочники, то даже для бэкофиса частота их модификации не так уж велика.


 
oldman ©   (2009-07-16 12:52) [24]


> Грузить сразу все дерево - долго, поэтому вначале грузится
> только первый уровень. При выборе узла соответствующие данные
> подгружаются из БД, при этом тот набор данных, что был загружен
> - остается, к нему лишь прибавляются требуемые в данный
> момент.


Шило на мыло?
Все данные грузятся 10 сек, при открытии узла - 2 сек.
Открываем 5 узлов, получаем 10 сек.
На фига?



Страницы: 1 вся ветка

Текущий архив: 2009.09.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
15-1247170961
Roman111
2009-07-10 00:22
2009.09.13
LTP порт принтера


1-1214989005
dreamse
2008-07-02 12:56
2009.09.13
Вопрос по работе потока (Thead)


1-1214285651
dreamse
2008-06-24 09:34
2009.09.13
Передача данных между приложениями


15-1247661732
Claimman
2009-07-15 16:42
2009.09.13
AutoSchema - что это?


2-1247490487
TStas
2009-07-13 17:08
2009.09.13
Какое сообщение послать чужому окну, чтобы оно развернулось?