Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Вниз

Как программно отсортировать базу данных 


Bill   (2002-03-06 10:51) [0]

Помогите пожайлуста советом, как отсортировать базу данных программным образом, например по ДАТЕ.



deleon   (2002-03-06 10:56) [1]

Для этого есть BDE API function
DbiSortTable



Val   (2002-03-06 11:01) [2]

TTable:создать индекс по нужному полю и указать его в соотв. свойствах
TQuery: select * from mytable order by myfield



Bill   (2002-03-06 11:23) [3]

А в каком модуле она находится?



Jim   (2002-03-06 11:37) [4]

BDE



Bill   (2002-03-06 12:13) [5]

Запутался с этой функцией окончательно.
Помогите наисать эту функцию для сортировки базы данных Table1 по полю Date.



Val   (2002-03-06 12:34) [6]

зачем ее писать?



Bill   (2002-03-06 12:52) [7]

Как зачем писать? Мне просто это необходимо.
Я с этими параметрами запутался.
Я написал её. Но она кречит, что номер переполнен.
Вот я и хочу проверить.



Bill   (2002-03-06 12:53) [8]

Как зачем писать? Мне просто это необходимо.
Я с этими параметрами запутался.
Я написал её. Но она кречит, что номер переполнен.
Вот я и хочу проверить.

Я нехочу просто использовать индексы.



Val   (2002-03-06 12:57) [9]

>Bill (06.03.02 12:53)
Я нехочу просто использовать индексы.
А что значит непросто?
Как вы думаете, с помощью чего происходит сортировка?



Bill   (2002-03-06 13:03) [10]

В Database Desktop есть такая фича, как отсортировать базу данных по какомуто полю. Т.е. эти данные записиваються в базу данных. Уже отсортированные. Я примерно хочу такую уштуку.



deleon   (2002-03-06 13:03) [11]

Если у тебя в таблице есть автоинкрементное поле и оно в ключе, то отсортировать таблицу этой функцией не удастся, только с выводом в другую таблицу!



Bill   (2002-03-06 13:06) [12]

Да нет! Полей автоинкрементных нету.



roottim   (2002-03-06 13:35) [13]

Val © (06.03.02 11:01)
TTable:создать индекс по нужному полю и указать его в соотв. свойствах
TQuery: select * from mytable order by myfield


если под словами БД понимается таблица БД.. то чем тебе не нравится совет VAl



Bill   (2002-03-06 15:13) [14]

Мне все нравится. Но!
Мне это надо сделать на физическом уровне. Т.э. чтобы на диске была уже отсортированна база по полю.



roottim   (2002-03-06 15:20) [15]

Я конешно не берусь оценивать глубину ваших познаний в области БД...
может и действительно НАДО!!!!...
но если нет! то никто и никогда не сортирует "базу" на диске!... это маразм!



deleon   (2002-03-06 15:25) [16]

Все на самом деле очень просто:
(с)deleon

procedure TForm1.Button1Click(Sender: TObject);
var
Db: TDatabase;
SaveActive: Boolean;
CurProp: CurProps;
SortFlds: array[0..0]of Word;
CaseIns: Bool;
RecSort: Integer;
begin
try
SaveActive := Tbl.Active;
Tbl.DisableControls;
Tbl.Active := True;
SortFlds[0] := 1;
CaseIns := True;
Check(DbiGetCursorProps(Tbl.Handle, CurProp));
Db := Tbl.Database;
Tbl.Active := False;
Check(DbiSortTable(Db.Handle,
CurProp.szName, CurProp.szTableType,
nil, nil, nil, nil,
1,{ кол-во полей в массиве }
@SortFlds, { массив сортируемых полей }
@CaseIns, { ascending/descending sort }
nil, nil, False, nil, RecSort));
finally
Tbl.Active := SaveActive;
Tbl.EnableControls;
end;
end;



deleon   (2002-03-06 15:28) [17]

Если-бы это был маразм Borland не писал-бы для этого функций!



Val   (2002-03-06 15:41) [18]

>deleon (06.03.02 15:28)
Может вы объясните смысл сортировки таблицы с помощью физического перемещения записей в ней? А то - "..главный же приказал.." :)



deleon   (2002-03-06 15:45) [19]

Например: раз в месяц производить такую сортировку с большими базами данных для обеспечения наиболее эффективного доступа к данным, т.к. реорганизация индексов будет происходить быстрее и индексная сортировка в т.ч. т.е. советую почитать серьезную литературу по базам данных, а не Delphi за 21 день :)))



Val   (2002-03-06 16:02) [20]

стоп, уважаемый, спасибо за совет, конечно, но речь идет не о упаковке, о достоинствах которой врядли кто спорит, а о сортировке-разница есть?



deleon   (2002-03-06 16:09) [21]

Нет, я имел ввиду именно сортировку, т.к. построить индекс намного быстрее если эти поля уже упорядочены хотя-бы частично



Delirium   (2002-03-06 16:11) [22]

Хм, использование порядка расположения записей на физическом уровне в качестве ускорения доступа к данным, это нарушение логики SQL. Однако раз речь идёт о Paradox, то я думаю такое возможно, но сомневаюсь что сие сколько-нибудь быстрее индексированой сортировки.



MAxiMum   (2002-03-06 16:11) [23]

Меня мучает тот же вопрос. Мне необходимо отсортировать таблицу (DBGrid) по любому из полей. Фишка заключается в том, что полно полей LookUp.



deleon   (2002-03-06 16:11) [24]

Не собираюсь доказывать прописные истины, но физическая сортировка внекоторых случаях дает прекрасную оптимизацию доступа к данным!



deleon   (2002-03-06 16:16) [25]

Естественно, что построить индекс намного быстрее чем физически отсортировать записи в таблице, но речь ведь шла о редком упорядочивании. Да и упорядочивание записей имеет смысл только в таблицах не имеющим ключа, т.е. локальным.



Val   (2002-03-06 16:24) [26]

Таблицы, не имеющие ключа(речь ведь о primary?), врядли могут соответствовать современным представлениям о БД и работе с ними. А также почему такие таблицы называются вами локальными?



deleon   (2002-03-06 16:28) [27]

Вот именно по тому, что в таблицах основанных на технологии клиент-сервер отсутствие ключа - отход от правила идентификации записи.



deleon   (2002-03-06 16:29) [28]

Закрывайте тему, я просто попытался помочь автору, а не влезать в бесполезную полемику.



Anatoly Podgoretsky   (2002-03-06 20:57) [29]

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



sniknik   (2002-03-07 08:56) [30]

Не по теме.
Не буду пытатся помочь автору но тема упорядочивания записей меня задела. Т.к. сам этим занимался и могу это логически обосновать. Для тех кто не понимает зачем это нужно.
Задача. Нужно слить файлы логи с разных машин (касс) в один для того чтобы получить общую статистику. Записи строго упорядочены по дате - времени. Программа (старая но с ней еще работают) работающая с этими файлами только так их и воспринимает (если внести записи с поздним временем в начало то все что идет после будет проигнорировано до момента когда время не будет опять больше). Чтобы подсунуть ей общий файл логов он должен быть строго (физически) упорядочен - касса - дата - время. Индексов нет вообще если создаеш то ругается на неверный.
На SQL задача похоже решения не имеет только на BDE или чемто дающим прямой доступ к записи. У меня реализовано через BDE.

roottim (06.03.02 15:20)
Я конешно не берусь оценивать глубину ваших познаний в области БД...
может и действительно НАДО!!!!...
но если нет! то никто и никогда не сортирует "базу" на диске!... это маразм!

roottim зайдите в любой супермаркет и посмотрите в каком режиме работают кассовые апараты (если это POS) скорей всего в Dos-е. Это действительно маразм. Но они именно так и работают. И сортируют базы на диске. А системщики в них точно маразматики потому что им приходится работать с устаревшими форматами и подстраиваться под устаревшие программы. И еще если человек задает вопрос то ему это действительно надо, не критикуй а отвечай если уж взялся.



roottim   (2002-03-07 09:12) [31]

sniknik © упрек в свою сторону принимаю!...

но все же я сделал поправку НАДО!!!!!...
это НАДО очень плохо озвучено у автора!... может ему совсем
и ненадо физически... почему то он конечно молчит!... может уже правда уже все для себя решил

зрим в корень!
>Помогите пожайлуста советом, как отсортировать базу данных >программным образом, например по ДАТЕ
коректности в этом вопросе мало...

не спорю! что старые системы ( типа кассовых аппаратов ) выдвигают такие требования... и спорить не собираюсь!...
и это действительно маразматично!... но что делать... кому сейчас легко :)



Tolyan   (2002-03-07 10:14) [32]

Для себя когда-то сделал процедуру физической сортировки заданной таблицы по заданному полю через SQL может поможет. Так же нельзя было использовать индексы.( Создается временный файл.)
procedure SortTable( TB : TTable; fname : string);
const fn = "temp.dbf";
VAR flag : boolean;
st0 : string;
begin
flag:=TB.Active;
if flag then TB.Close;
st0:=fn;
CopyFile(PChar(TB.TableName),PChar(st0),true);
DM1.Qu1.SQL.Clear;
DM1.Qu1.SQL.Add("SELECT * FROM "+st0+" ORDER By "+ fname);
DM1.Qu1.Open;
TB.Exclusive:=True;
TB.EmptyTable;
TB.BatchMove(DM1.Qu1,batAppend);
TB.Active:=flag;
DM1.Qu1.SQL.Clear;
DM1.Qu1.Close;
DeleteFile(st0);
end;




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.78 MB
Время: 0.03 c
1-184             Юрий Федоров          2002-03-19 18:03  2002.04.01  
Общее адресное пространство для двух процессов


3-18              andreik               2002-03-06 11:28  2002.04.01  
что писать в UpdateSQL?


3-25              xcb                   2002-03-05 18:30  2002.04.01  
HyTech


14-280            cypher                2002-02-16 16:24  2002.04.01  
Platform SDK


1-244             Ирина                 2002-03-19 10:25  2002.04.01  
Открываем файл RichEdit-том