Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
картман ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
2-1247038910
petr
2009-07-08 11:41
2009.09.13
Запись в реестр


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


15-1248031803
Юрий
2009-07-19 23:30
2009.09.13
С днем рождения ! 18 июля 2009 суббота


15-1247559834
Dennis I. Komarov
2009-07-14 12:23
2009.09.13
ico Windows


15-1247776855
Юрий
2009-07-17 00:40
2009.09.13
С днем рождения ! 17 июля 2009 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский