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

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

DataSet.Locate не дружит с Filter, а надо - как быть [D7]


Страницы:   1 2 3

Silver... ©   (2006-07-15 21:55:00) 

Очень надо чтоб

DataSet.Locate искал только в записях отвечающих условию DataSet.Filter

например если DataSet содержит

ID  Name
---------
1   Name1
2   Name2
3   Name3
4   Name1
5   Name3

после фильтрации остается
ID  Name
---------
4   Name1
5   Name3

DataSet.Locate('Name', 'Name1', [loCaseInsensitive, loPartialKey])
находит ID = 1а надо ID = 4
что делать?


StriderMan   (2006-07-26 14:38:00) [21]


> 1. Обращаю Ваше внимание на то, где у Вас стоИт Open. Поставьте
> его перед приведённым кодом и проанализируйте эффект.

Open стоит ЗАДОЛГО до этого кода. И все работает прекрасно.

> 2.

честно говоря смысл комментария не уловил. что он значит?


Johnmen   (2006-07-26 14:34:00) [22]


> Silver... ©   (26.07.06 14:25) [24]


Ошибка возбуждается в процедуре Resync с параметром mrExact
begin
 CursorPosChanged;
  if GetRecord(FBuffers[FRecordCount], gmCurrent, True) <> grOK then
    DatabaseError(SRecordNotFound, Self);

Это значит, что не может быть найдена запись для обновления/идентификации на предмет получения лукапного значения. Ну естественно, ведь стоИт фильтр. Поэтому попробуй [16].


Виталий Панасенко   (2006-07-26 14:31:00) [23]


> Silver... ©   (26.07.06 14:25) [24]

Это ты под средой такое сообщение получаешь или при выполнении собственно программы ? Ты что-то накрутил в параметрах поиска. Потому у тебя и "не работает Locate по фильтру". Потому как Locate  не находит того, что ты ищешь. потому и ...


Johnmen   (2006-07-26 14:30:00) [24]

1. Обращаю Ваше внимание на то, где у Вас стоИт Open. Поставьте его перед приведённым кодом и проанализируйте эффект.
2. Так же неплохо бы внимательно прочитать комментарий, указанный в приведенной выдержке исходника.


StriderMan   (2006-07-26 14:26:00) [25]


> Мне не интересен код исходников. Он у меня как бы есть..
> .

ну так посморите на него внимательно [22], и скажите почему вдруг он не работает


> Приводите СВОЙ код, говорящий о том, что св-во Filter работает

как интересно в коде можно узнать, сработал он или нет??
ну раз уж вам так интересно, привожу

   
dmTable2.Table.Filter := 'Table1ID = ' + dmTable1.fldID.AsString;
dmTable2.Table.Filtered := true;


(имена объектов изменены)


Silver...   (2006-07-26 14:25:00) [26]


> Загадочный ты зверь... А сообщить конкретно какую ошибку
> - табу ?



...

> Silver... ©   (25.07.06 17:39) [12]


>      [loCaseInsensitive, loPartialKey]) then
> вот здесь ошибка вылитает - SpravDataSet: Record not found


Johnmen   (2006-07-26 14:18:00) [27]


> StriderMan ©   (26.07.06 14:14) [22]


Мне не интересен код исходников. Он у меня как бы есть...
Приводите СВОЙ код, говорящий о том, что св-во Filter работает.


StriderMan   (2006-07-26 14:14:00) [28]


> Не верю :)
> Приводите код.


procedure TIBTable.GenerateSQL;

...

 if Filtered and (Filter <> '') then  {do not localize}
 begin
   SQL.Text := SQL.Text + ' where ' + Filter; {do not localize}
   bWhereClausePresent := True;
 end;


Johnmen   (2006-07-26 13:26:00) [29]


> StriderMan ©   (26.07.06 12:18) [20]
>Попробуйте, а потом утверждайте.


Мне не надо пробовать. Достаточно в исходники заглянуть...

> но TIBTable, повторюсь, прекрасно с фильтрацией справляется!

Не верю :)
Приводите код.

> У меня на них проект живет!

Вот это чудо. Сочувствую. Искренне...:)


StriderMan   (2006-07-26 12:18:00) [30]


> Johnmen ©   (26.07.06 00:43) [18]

Попробуйте, а потом утверждайте.

у TIBQuery действительно не работает, но TIBTable, повторюсь, прекрасно с фильтрацией справляется! У меня на них проект живет!


Виталий Панасенко   (2006-07-26 09:06:00) [31]


> Silver... ©   (25.07.06 21:12) [15]
>
> > Виталий Панасенко   (25.07.06 18:09) [13]
>
> у меня на строчке if... ошибку выдает до "нашел" / "не нашел"
> и не доходит
> а по ходу наити должен - обязан только наити должен последний
> а не второй

Загадочный ты зверь... А сообщить конкретно какую ошибку - табу ?


Johnmen   (2006-07-26 00:43:00) [32]


> StriderMan ©   (26.07.06 00:06) [17]
> А вот и неправда! В TIBTable прекрасно работает фильтр!


Ох уж эти сказочники (с)


StriderMan   (2006-07-26 00:06:00) [33]


> Johnmen ©   (23.07.06 20:42) [11]
>  Ибо, как широко известно, в компонентах IBX свойство Filter
> нереализовано...

А вот и неправда! В TIBTable прекрасно работает фильтр!


Johnmen   (2006-07-25 21:45:00) [34]

Ещё соображение, вследствие которого предполагаю, что надо попробовать выставить LookupCache у лукапного поля в DetailDataSet.


Silver...   (2006-07-25 21:12:00) [35]


> Виталий Панасенко   (25.07.06 18:09) [13]

у меня на строчке if... ошибку выдает до "нашел" / "не нашел" и не доходит
а по ходу наити должен - обязан только наити должен последний а не второй


> и кстати, фильтр без Filtered = true (в [12] "Проба 1 (с
> фильтрацией):") работать не будет

=
Очепятка разумеется ... Filtered := True


sniknik   (2006-07-25 20:27:00) [36]

доказывать не буду, пояснить могу, вернее... не зря тебе говорилось о знаке равенства между датасетами, или скорее отсутствии такового. хочеш проверь, повтори тоже самое на клиентском (ClientDataSet) и попробуй получить тот же рузультат.

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

не согласен с решением от борланда, используй метод Find непосредственно у обьекта (мелкософтский способ), либо как предлагалось в [1].

и кстати, фильтр без Filtered = true (в [12] "Проба 1 (с фильтрацией):") работать не будет.


Виталий Панасенко   (2006-07-25 18:09:00) [37]

Вообще-то, Locate - функция логическая. Если найдет, то True
if ADODataSet1.Locate('A', 'bb', [loCaseInsensitive, loPartialKey])
then
 ShowMessage('Нашел')
else
 ShowMessage('НЕНашел');


Silver...   (2006-07-25 17:39:00) [38]

Значит так:
DataSet -> ADODataSet
но так как для фильтрации процедурку рялизовал ... написал
TDataSet(DataSet).Filter := ... //а тут уж любой наследник попадет

Далее...
 имеем MasterDataSet, DetailDataSet в нем поле Lookup1 от SpravDataSet

В MasterDataSet имеется поле Группа (например - упростил для примера)

Задача:
 В Lookup1 поле DetailDataSet-а надо иметь не полный список из SpravDataSet-а а тока ... соответствующие условию (которое меняется при каждом переходе на др. запись в MasterDataSet [MasterDataSet.AfterScroll])

Выход 1:
 WHERE - не подходит SpravDataSet.Close/Open при каждом MasterDataSet.AfterScroll = тормоза

Выход 2:
 в MasterDataSet.AfterScroll
 SpravDataSet.Filter := Условие фильтра
 -> все работает на ура тока наблудается вышеуказаный баг

PS. Начал дебагить и увидел что в DBGridEh когда набираем теxт в Lookup поле, виполняется:
if AColumn.UsedLookupDataSet.Locate(AColumn.Field.LookupResultField, FSearchText,
     [loCaseInsensitive, loPartialKey]) then

вот здесь ошибка вылитает - SpravDataSet: Record not found

Нацарапал Тест:
Table1...
ID   A
1  aaa
2  bbb
3  ccc
4  aaa
5  bbb


procedure TForm1.FormCreate(Sender: TObject);
begin
 ADODataSet1.Open;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
 if Edit1.Text <> '' then
   ADODataSet1.Filter := 'ID > ' + Edit1.Text; //тока цифры разумеется :)
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 ADODataSet1.Locate('A', Edit2.Text, [loCaseInsensitive, loPartialKey]);
 ShowMessage('ID = ' + VarToStr(ADODataSet1.FieldByName('ID').Value));
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 ADODataSet1.Filtered := CheckBox1.Checked;
end;


Проба 1 (без фильтрации):
Table1... имеет вид:
ID   A
--------
1  aaa
2  bbb
3  ccc
4  aaa
5  bbb

ADODataSet1.Filtered := False;
ADODataSet1.Locate('A', 'bb', [loCaseInsensitive, loPartialKey])
------
 ShowMessage ---> ID=2 ---- ПРАВЕЛЬНО


Проба 1 (с фильтрацией):
Table1... имеет вид:
ID   A
--------
4  aaa
5  bbb

ADODataSet1.Filtered := False;
ADODataSet1.Filter := 'ID > 3';
ADODataSet1.Locate('A', 'bb', [loCaseInsensitive, loPartialKey]);
------
 ShowMessage ---> ID=4 ---- НЕ ПРАВЕЛЬНО- должно быть ID=5


sniknik ©   (23.07.06 18:54) [9]  --- Дакажи --- используй мой пример -- поясни


Johnmen   (2006-07-23 20:42:00) [39]

Есть предположение, что товарищ юзает TIBDataSet. Если это так, то ничего удивительного - у него вообще не фильтруется! Ибо, как широко известно, в компонентах IBX свойство Filter нереализовано...


Anatoly Podgoretsky   (2006-07-23 19:19:00) [40]

Наверно, но он же обычный партизан.


Страницы:   1 2 3

Наверх

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