Форум: "Прочее";
Текущий архив: 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