Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

Bill ©   (2002-03-06 10:51:00) 

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


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

Для себя когда-то сделал процедуру физической сортировки заданной таблицы по заданному полю через 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;


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

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

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

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

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


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

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

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

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


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

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


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

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


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

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


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

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


deleon   (2002-03-06 16:16:00) [8]

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

Все на самом деле очень просто:
(с)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;


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

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


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

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


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

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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо