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

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

Как индексировать по значениям Look-Up-полей? [D7, MSSQL]


Страницы:   1 2

Aleksandr ©   (2004-01-15 13:44:00) 

В таблице есть поле типа fkLookUp тз другой таблицы. При попытке создать IndexDef на это поле и задать таблице IndexName этого IndexDef"a ругается на неверный индекс поля. Как-то вообще можно делать сортировку по ResultField"ам LookUp"ов?


Vlad   (2004-01-16 11:54:00) [21]


> Aleksandr © (16.01.04 11:44) [17]


> Ну я ведь не сам придумал. В pdf-ном юзергайде почти дословно
> указано, что только однопоточный вариант

Это к версии Personalне имеет отношения.


> Есть разница - разобраться, почему так жестоко тормозит
> при закачке через провайдера датасета с лукапами или переписывать
> две большие и десяток мелких программ, затачивая их под
> IB.

лукап поля (если нет индекса в подчиненной таблице) выстраиваются довольно медленно, это вполне естественно. А даже если и есть индекс, то не все компоненты (на сколько я помню) пользуют индексы при навигации по DataSet.

ИМХО, все же лучше один раз проделать большую работу и жить спокойно, чем каждый раз мучаться из-за новых проблем...


Aleksandr   (2004-01-16 11:44:00) [22]

Ну я ведь не сам придумал. В pdf-ном юзергайде почти дословно указано, что только однопоточный вариант. Впрочем, суть не в этом, а в том, что таких трудозатрат позволить себе не могем. Есть разница - разобраться, почему так жестоко тормозит при закачке через провайдера датасета с лукапами или переписывать две большие и десяток мелких программ, затачивая их под IB.


Vlad   (2004-01-15 19:46:00) [23]

Ну насчет однопоточности ты не прав.
Читай внимательнее :-)
http://yaffil.ibase.ru/news.htm

05.02.2002

Yaffil Personal RC2. Скачать.

1) Полная поддержка всего API (на isc_add_user и т.п. возвращает ошибку в статусе - @feature is not supported@)
2) Поддержка сервисов
3) Многопоточность
4) Требует только WinSock1 (т.е. будет запускать на голой Win95)


Aleksandr   (2004-01-15 19:42:00) [24]

Мне он понравился. Но он не понравился начальнику, который решил, что понадобится слишком много времени, чтобы всю систему перевести на него (потому как программка, с коей я мучаюсь, избавляясь от древностей вроде БДЕ - лишь малая часть ее). Да и меня смутило указание в справке, что она однопоточная - а у меня 3-звенка.


Vlad   (2004-01-15 19:19:00) [25]


> Aleksandr © (15.01.04 19:16) [13]

Ага, я вспомнил, это ты вместо БД ClientDataSet"ы используешь :-)
Так что, тебе вариант с Yaffil Personal не понравился ?


Aleksandr   (2004-01-15 19:16:00) [26]

Да даже в принципе и Бог с ним, с Providerом - можно в файл пихнуть в файл кодовые поля. Гораздо больше меня смущает то, что получение данных с провайдерного датасета, имеющего LookUpные поля, дает безумные тормоза при обращении к нему. Таблица с 7000 записей, имеющая четыре Lookup"a, на клиенте открывается около двух минут. А это уже трагедия.


Aleksandr   (2004-01-15 15:34:00) [27]

Спасибо, конечно, но у меня есть уже код:


procedure TRiFieldsList.FillIndex;
var
C : TClientDataSet;
s : string;
d : string;
i : integer;
IndName : string;
Si : TRiSortedFieldsList;
begin
C:=TRiViewInfo(FOwner).DataSet;
C.IndexFieldNames:="";
C.IndexDefs.Clear;
if (FSortInfo.Count=0) then
Exit;
s:="";
d:="";
Si:=FSortInfo;
for i:=0 to Si.Count-1 do begin
if s="" then
s:=Si.Items[i].FieldName
else
s:=s+";"+SI.Items[i].FieldName;
if SI.Items[i].SortOrder=fsDesc then begin
if d="" then
d:=SI.Items[i].FieldName
else
d:=d+";"+SI.Items[i].FieldName
end
end;
if d="" then
C.IndexFieldNames:=s
else try
IndName:=s;
if Pos(";",s)<>0 then
IndName:=ReplaceString(";","_",IndName);
if d="" then
IndName:=IndName+"1"
else
IndName:=IndName+"2";
C.IndexDefs.Add(IndName,s,[]);
C.IndexDefs.Items[C.IndexDefs.Count-1].DescFields:=d;
C.IndexName:=IndName
except
on E:Exception do
RiMessage(0,h_Error,E.Message)
end
end;


В общем, проблема не в коде, а в том, чтобы заставить сортироваться LookUp"ы. И, что очень плохо, Ваш совет не прокатывает, потому что таблица может периодически работать без провайдеров, из файлов, поэтому все лукапы должны быть на ClientDataSet.


Плохиш_   (2004-01-15 15:04:00) [28]

>Aleksandr © (15.01.04 14:59) [10]

На пользуйся, и чего я такой добрый сегодня

procedure TfrmOwnerList.grdInfoTitleClick(Column: TColumn);
var
lIndex: Integer;
sIndex: String;
begin
if Assigned( Column ) then
begin
sIndex := Column.FieldName + "index";
if SortDesc then sIndex := sIndex + "_desc";
if cdsInfo.IndexName = sIndex then SortDesc := not SortDesc
else SortDesc := false;
sIndex := Column.FieldName + "index";
if SortDesc then sIndex := sIndex + "_desc";
lIndex := cdsInfo.IndexDefs.IndexOf( sIndex );
if lIndex < 0 then
with cdsInfo.IndexDefs.AddIndexDef do
begin
Name := sIndex;
Fields := Column.FieldName;
Options := [ixCaseInsensitive];
if SortDesc then Options := Options + [ixDescending];
end;
cdsInfo.IndexName := sIndex;
end;
end;


Aleksandr   (2004-01-15 14:59:00) [29]

Хм... не так все просто. При попытке дать IndexFieldNames он чего-то перестраивается, но явно не по сортировке. При попытке создать IndexDef и дать IndexName ругается, что поле не найдено.


Aleksandr   (2004-01-15 14:24:00) [30]

Епрст... Неужели? Счас попробуем...


Плохиш_   (2004-01-15 14:16:00) [31]

>Aleksandr © (15.01.04 14:07) [7]

LookUp-поля должны быть созданы в датасете, на который ссылается TDataSetProvider.


Aleksandr   (2004-01-15 14:07:00) [32]

2 Vlad :
Ахха... я несколько ранее создавал топик с ее описанием :))

2 Плохиш_:
Я и использую TClientDataSet. Именно в нем все и происходит с невозможностью сортировать.


Vlad   (2004-01-15 14:02:00) [33]


> Плохиш_ (15.01.04 13:57) [5]

Имелось ввиду LookUp заменить на джоин в SQL запросе.
Сортировать можно по полю из полученного НД, при этом в Query ничто не мешает оставить то же LookUp поле (уж если оно необходимо)


Плохиш_   (2004-01-15 13:57:00) [34]

>Sandman25 © (15.01.04 13:47) [2]

По LookUp-полю?

>Aleksandr © (15.01.04 13:49) [3]

или TClientDataSet, или [1]


Vlad   (2004-01-15 13:57:00) [35]


> Query нельзя по условию

Религия ? :-)


Aleksandr   (2004-01-15 13:49:00) [36]

Query нельзя по условию. К файловому датасету он не умеет обращаться.


Sandman25   (2004-01-15 13:47:00) [37]

Можно Query использовать, там сортировка возможна.


Johnmen   (2004-01-15 13:46:00) [38]

НИКАК.


Страницы:   1 2

Наверх

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