E не дружить з filter, а треба - як бути

DataSet.Locate не дружить з Filter, а треба - як бути

Дуже треба щоб

DataSet.Locate шукав тільки в записах відповідають умові DataSet.Filter

наприклад якщо DataSet містить

ID # XA0; Name
---------
1 # XA0; Name1
2 # XA0; Name2
3 # XA0; Name3
4 # XA0; Name1
5 # XA0; Name3

після фільтрації залишається
ID # XA0; Name
---------
4 # XA0; Name1
5 # XA0; Name3

DataSet.Locate ( "Name", "Name1", [loCaseInsensitive, loPartialKey])
знаходить ID = 1 а треба ID = 4
що робити?

Самому проходити по набору даних в пошуках потрібного запису.
До речі, швидкість в порівнянні з Локейт практично не зміниться.

Використовуй TTable + Filter тоді все буде так, як ти хочеш.
В цьому випадку зв'язка буде еквівалентна TQuery + умова фільтра в секції where. (Фільтрація на сервері)

TQuery + Filter = фільтрація завжди на клієнті

є:
# XA0; Таблиця "A" - наприклад Робочі (IDRab, Name, Ot, Do)
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; Ot / Do - час його "видимості" (коли доступний)
# XA0; Таблиця "B" - наприклад Замовлення (IDZak, IDRab, Ot, Do)
# XA0; Таблиця "C" - наприклад ЗакРаб (IDZakRab, IDZak, IDRab, N)

Ситуація така:
# XA0; - Відкривається замовлення з лімітом за часом виконання (Від - До) в LookupName вибираємо ім'я
# XA0; # XA0; і присвоюємо [N] - ось тут треба щоб в Lookup були тільки ті Робочі які підходять
# XA0; # XA0; Замовленням [Від - До]. Використовую фільтрацію і все працює на ура

# XA0; - WHERE - перше що пробував - не підходить з однієї причини періодично треба дивитися на
# XA0; # XA0; попередні записи, в цьому випадку в AfterScroll роблю фільтрацію (DataSetт.Close / Open
# XA0; # XA0; працює неприємно повільно з Filter працює швидше - але має цей баг)

-> Самому проходити по набору даних в пошуках потрібного запису.
До речі, швидкість в порівнянні з Локейт практично не зміниться.

ага все вже зроблено в DBGridEh - міняти його. (


> Ага все вже зроблено в DBGridEh - міняти його. (

Ну ну. Вся надія на дядю, який за тебе все зробить?
Або вже "все" зробив в ЕхЛібГрід. Тоді користуйся, чого питаєш?


> Вся надія на дядю

А навіщо на дядю - так я використовую сторонні компоненти (не вірю що хто-небудь тут помагає струму Стандартний VCL), інакше б писав на ASM-е (на жаль не знаю, але з такого приводу вючіл б)

# XA0; Взагалі DataSet.Filter - інструмент зручний, принаймні для мене, але має кучю "недорозуменій" - DataSet.Locate бачить і все інше.

# XA0; А питання у мене був: Як відфільтрувати DataSet на клієнті (робиться частенько не бігати на сервер кожен раз за даними) і без DataSet.Close / Open - знову-таки гальма маємо --- але щоб відфільтровані дані не були видні (по принаймні DataSet.Locate) тому що DBGridEh - який я Сеічас пользую так шукає в списку то що я набираю

PS. Чи не прошу зробіть / дайте а підкажіть

Я так і не зрозумів, а DataSet це хто?

> Не вірю що хто-небудь тут помагає струму Стандартний VCL
це ти дарма, багато хто використовує, я наприклад. і виключно стандартний. (Знаю контори в яких нестандартні (/ некупленние, що часто одне і теж) просто заборонені. У нас така контора. Була. Счас на це не дуже увагу звертають, але не через те щоб нам легше було, а просто бардаку додалося з ростом контори )

> Інакше б писав на ASM-е
а це ще навіщо / причому? в сенсі знати звичайно не зашкодить але який зв'язок з VCL?

> PS. Чи не прошу зробіть / дайте а підкажіть
легко. рада не став знак рівності між усіма спадкоємцями DataSet. люби конкретику (не тільки з # XA0; DataSet). тоді ізбежіш "кучю" недорозуменій "".

Цікаво, що за фільтр накладено, що вийшов такий результат, що щось тут не чисто.

теж зацікавило, перевірив з двома різного роду датасета, вихід за фільтр в локейт не потрапляє, всупереч затвердженим сдесь.
боюся тут тільки розмова про DataSet.Filter, а насправді використовується onFilterRecord. (Хоч як то пояснити утвердждаемое).

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

Є припущення, що товариш юзает TIBDataSet. Якщо це так, то нічого дивного - у нього взагалі не фільтрується! Бо, як широко відомо, в компонентах IBX властивість Filter нереалізованими.

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

Далі.
# XA0; маємо MasterDataSet, DetailDataSet в ньому поле Lookup1 від SpravDataSet

У MasterDataSet є поле Група (наприклад - спростив для прикладу)

завдання:
# XA0; В Lookup1 поле DetailDataSet-а треба мати не повний список з SpravDataSet-а а струму. відповідні умові (яке змінюється при кожному переході на ін. запис в MasterDataSet [MasterDataSet.AfterScroll])

Вихід 1:
# XA0; WHERE - не підходить SpravDataSet.Close / Open при кожному MasterDataSet.AfterScroll = гальма

Вихід 2:
# XA0; в MasterDataSet.AfterScroll
# XA0; SpravDataSet.Filter: = Умова фільтра
# XA0; -> все працює на ура струму наблудается вищевказаних баг

PS. Почав дебагіть і побачив що в DBGridEh коли набираємо теxт в Lookup поле, Віполняем:
if AColumn.UsedLookupDataSet.Locate (AColumn.Field.LookupResultField, FSearchText,
# XA0; # XA0; # XA0; [loCaseInsensitive, loPartialKey]) then
ось тут помилка вилітает - SpravDataSet: Record not found

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

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

ADODataSet1.Filtered: = False;
ADODataSet1.Locate ( "A", "bb", [loCaseInsensitive, loPartialKey])
------
# XA0; ShowMessage ---> ID = 2 ---- правельно

Проба 1 (з фільтрацією):
Table1. має вигляд:
ID # XA0; A
--------
4 # XA0; aaa
5 # XA0; bbb

ADODataSet1.Filtered: = False;
ADODataSet1.Filter: = "ID> 3";
ADODataSet1.Locate ( "A", "bb", [loCaseInsensitive, loPartialKey]);
------
# XA0; ShowMessage ---> ID = 4 ---- НЕ правельно - має бути ID = 5

Взагалі-то, Locate - функція логічна. Якщо знайде, то True
if ADODataSet1.Locate ( "A", "bb", [loCaseInsensitive, loPartialKey])
then
# XA0; ShowMessage ( "Знайшов")
else
# XA0; ShowMessage ( "не знайшов");

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

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

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

і до речі, фільтр без Filtered = true (в [12] "Проба 1 (з фільтрацією):") працювати не буде.


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

у мене на сходинці if. помилку видає до "знайшов" / "не знайшов" і не доходить
а по ходу наити повинен - ​​зобов'язаний тільки наити повинен останній а не другий


> І до речі, фільтр без Filtered = true (в [12] "Проба 1 (з
> Фільтрацією): ") працювати не буде

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

Ще міркування, внаслідок якого припускаю, що треба спробувати виставити LookupCache у лукапного поля в DetailDataSet.

Ох вже ці казкарі (с)

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

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

> Але TIBTable, повторюся, прекрасно з фільтрацією справляється!

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

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

Ось це чудо. Співчуваю. Щиро. )

# XA0; if Filtered and (Filter <> "") Then # XA0;
# XA0; begin
# XA0; # XA0; SQL.Text: = SQL.Text + "where" + Filter;
# XA0; # XA0; bWhereClausePresent: = True;
# XA0; end;

Мені не цікавий код початкових кодів. Він у мене як би є.
Приводьте СВІЙ код, який свідчить про те, що св-во Filter працює.


> Загадковий ти звір. А повідомити конкретно яку помилку
> - табу?


> Мені не цікавий код початкових кодів. Він у мене як би є ..
>.

ну так посморіте на нього уважно [22], і скажіть чому раптом він не працює


> Приводьте СВІЙ код, який свідчить про те, що св-во Filter працює

як цікаво в коді можна дізнатися, спрацював він чи ні.
ну якщо вже вам так цікаво, привожу

# XA0; # XA0;
dmTable2.Table.Filter: = "Table1ID =" + dmTable1.fldID.AsString;
dmTable2.Table.Filtered: = true;

(Імена об'єктів змінені)

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

Це означає, що не може бути знайдена запис для поновлення / ідентифікації на предмет отримання лукапного значення. Ну природно, адже варто фільтр. Тому спробуй [16].

procedure TIBDataSet.SetFiltered (Value: Boolean);
begin
# XA0; if (Filtered <> Value) then
# XA0; begin
# XA0; # XA0; inherited SetFiltered (value);
# XA0; # XA0; if Active then
# XA0; # XA0; begin
# XA0; # XA0; # XA0; Close;
# XA0; # XA0; # XA0; Open;
# XA0; # XA0; end;
# XA0; end
# XA0; else
# XA0; # XA0; inherited SetFiltered (value);
end;

А коли так, то ця нібито фільтрація є проста зміна тексту запиту з повторним виконанням.


> Не локалізовано, тобто не мають локальної реалізації для
> Набору даних

що означає локальна реалізація? IBTable і є набір даних. Це не абстрактний клас.


> То ця нібито фільтрація є проста зміна тексту запиту
> З повторним виконанням.

а що потрібно від нормальної фільтрації? як вона повинна працювати?

До речі, треба дивитися SetFilterText, який перевизначений для TIBTable а тягнеться від предпредка - TDataSet.

На клієнті напевно. Без звернення до сервера.

> Що означає локальна реалізація?

Це означає для даних, які вже на клієнті, локально.

> IBTable і є набір даних.

> # XA0; Це не абстрактний клас.

Про абстрактний клас я нічого не говорив.

> А що потрібно від нормальної фільтрації?

Щоб вона працювала.

> Як вона повинна працювати?


> Правильно.

як правильно? є стандарт фільтрації наборів даних?

[16] - вже пробував - Не працює

Так я думаю Lookup тут зовсім ні до чого, з тіста видно що Locate шукає у всьому DataSet-е - а не повинен. Мені б якимось чином (локально НЕ WHERE) обмежити його пошук струму на НЕ отфільтрірование записи.
# XA0; Як?

PS. я б сказав що це баг у функції: З чого б раптом шукати в даних поза увагою (на крайняк параметр б сунули типу [loFullDataSet])

[39]

> З тіста видно що Locate шукає у всьому DataSet-е - а не
> Повинен.

[15]

> У мене на сходинці if. помилку видає до "знайшов" / "не знайшов" і не доходить

Як Вас розуміти, сер?