![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBISortTable: ;сортировка по нескольким полям. [D3, DbaseIII]
Nest © (2002-03-12 11:10:00)Нужно отсортировать таблицу по двум полям.
Есть:
T1
TYPE LEN DEC NULL_VALUE PK
--------------------------
int 0 0 NOT NULL PK
char 10 0 NOT NULL
char 4 0 NOT NULL PK
int 0 0 NULL
int 0 0
int 0 0 NOT NULL
Надо отсортировать так, чтоб сначала шли записи с PK, потом остальные с NOT NULL потом все остальные, т.е.
TYPE LEN DEC NULL_VALUE PK
--------------------------
char 4 0 NOT NULL PK
int 0 0 NOT NULL PK
char 10 0 NOT NULL
int 0 0 NOT NULL
int 0 0 NULL
int 0 0
Помогите пожалуйста.
Anatoly Podgoretsky (2002-03-12 22:15:00) [1]Nest © (12.03.02 14:19)
Кстати вероятно ты просто неправильно дал исходные данные, но DbaseIII не поддерживает не первичных ключей, ни ограничений типа NOT NULL
deleon (2002-03-12 14:35:00) [2]Советую чаще читать bde.hlp - очень полезная штука :-)))
Nest (2002-03-12 14:19:00) [3]2deleon
Спасибо. Это и было нужно.
Снят вопрос.
deleon (2002-03-12 14:08:00) [4]Ну это уж слишком...
(пора брать деньги за вопросы по Bde API - буду вторым Билли :))))
(с)deleon
procedure TForm1.Button1Click(Sender: TObject);
const
SortFieldCount = 2;
var
Db: TDatabase;
SaveActive: Boolean;
CurProp: CurProps;
SortFlds: array[0..SortFieldCount-1]of Word;
CaseIns: array[0..SortFieldCount-1]of Bool;
SortOrd: array[0..SortFieldCount-1]of SORTOrder;
RecSort: Integer;
begin
try
SaveActive := Tbl.Active;
Tbl.DisableControls;
Tbl.Active := True;
SortFlds[0] := 1; {номера полей в физ. структуре (1..n)}
SortFlds[1] := 2; {номера полей в физ. структуре (1..n)}
CaseIns[0] := True; {Case insensitive for sort column (True/False)}
CaseIns[1] := True; {Case insensitive for sort column (True/False)}
SortOrd[0] := sortASCEND; { Sort Order (sortASCEND/sortDESCEND)}
SortOrd[1] := sortASCEND; { Sort Order (True/sortDESCEND)}
Check(DbiGetCursorProps(Tbl.Handle, CurProp));
Db := Tbl.Database;
Tbl.Active := False;
Check(DbiSortTable(Db.Handle,
CurProp.szName, CurProp.szTableType,
nil, nil, nil, nil,
SortFieldCount,{ кол-во полей в массиве }
@SortFlds, { массив сортируемых полей }
@CaseIns, { массив CaseIns }
@SortOrd, { массив ордеров }
nil, False, nil, RecSort));
finally
Tbl.Active := SaveActive;
Tbl.EnableControls;
end;
end;
Nest (2002-03-12 12:31:00) [5]2deleon
2Johnmen
Да конечно я прежде чем вопрос задать, порылся в факе и в хелпе.
Там всё есть но только для сортировки по одному полю.
А как отсортировать по двум полям?
Turalyon (2002-03-12 12:13:00) [6]>Nest ©
Извини, невнимательно прочитал заголовок
Johnmen (2002-03-12 12:13:00) [7]С DbiSortTable не работал, не скажу, но похожие вопросы уже были - поройся в конфе...
deleon (2002-03-12 12:10:00) [8]Почитай здесь - я уже писал пример:
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1015401064&n=1
Nest (2002-03-12 12:01:00) [9]2Johnmen ©
Да мне это и надо, токо отсортировать не по одному полю, а по двум.
Не знаю как жэто сделать одной функцией DbiSortTable.
Подскажи.
Johnmen (2002-03-12 11:59:00) [10]Сортировать-то можно по возраст., либо по убыв.значения поля/полей...
Другого не дано...
А если хочется чего-то нестандартного - тогда извращаться...
Nest (2002-03-12 11:57:00) [11]Turalyon ©
Да мне нужно физическую таблицу отсортировать, а не вернуть отсортированный НД !!!!!!!!!
Надо штоб тадлица на диске отсортировалась...
Turalyon (2002-03-12 11:52:00) [12]А в чем проблемма?
Составляешь SQL запрос, перечисялешь список полей, в том порядке какой тебе нужен, и далее сортируешь....
Что то типа
Select MyTable.MyPK1, MyTable.MyPK2, ..... from MyTable
Order By MyTable.MyPK1
Или выбираешь все * а потом уже в самом DBGrid-е расперделяешь как у тебя будут поля идти....
Nest (2002-03-12 11:45:00) [13]Срочно нужно...
Nest (2002-03-12 11:26:00) [14]2deleon (12.03.02 11:24)
Что значит упорядочить поля?
Канэчна записи отсортировать.
deleon (2002-03-12 11:24:00) [15]Чего-то я не понял, поля нужно упорядочить или записи ?