![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DataSet.Locate не дружит с Filter, а надо - как быть [D7]
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]Наверно, но он же обычный партизан.