Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.24;
Скачать: CL | DM;

Вниз

ошибка при установке фильтра в ADO таблице   Найти похожие ветки 

 
Davinchi ©   (2003-11-04 13:14) [0]

Помогите разобраться вчем проблема, я хочу отфильтровать поле по определенным значениям и делаю это следуюшим образом:

AdoDataSet.Filter:="xxx";
AdoDataSet.Filtered:=True;

Раньше никогда не работал с АДОшными тэйбалами, поэтому даже приблизительно не знаю как отфильтровать нужное мне поле по нужному мне значению.

Заранее всем благодарен за любую информацию.


 
Zacho ©   (2003-11-04 13:35) [1]

Ты хоть сообщение об ошибке приведи, и реальный кусок кода, а то телепатов здесь маловато.
И вообще-то в хелпе есть пример.


 
Davinchi ©   (2003-11-04 13:40) [2]

Гдк в какой хелпе???? А смысел ошибки в переводе с англиской ругни: Неверная строка фильтра или ее формат...


 
Zacho ©   (2003-11-04 13:45) [3]

Приводи не смысл, а точное сообщение об ошибке в оригинале. И кусок кода, по крайней мере реальное значение фильтра.
В крм хелпе ? Естественно в Дельфийском. А вот тебе и выдержка оттуда, если уж самому лень нажать F1:

The following runtime example shows how to assign that filter expression to the Filter property and activate the filtering.

with ADODataSet1 do begin

Filtered := False;
Filter := "State = " + QuotedStr("CA") + " OR " +
"State = " + QuotedStr("CA");
Filtered := True;

end;


 
Davinchi ©   (2003-11-04 14:00) [4]

Реальное сообщение привести не могу, т.к. времено нахожусь не на своем рабочем месте и не имею возможности запустить проект. Реально в фильтре указываю только то заначение тех записей, у которых в первом из трех полей оно присудствуем, и мне необходимо видеть только эти записи...

Эту хелпу я видел но немогу до конца разобраться что написано в строке фильтра - в ее формате...
"State="- я так понимаю это поле, "or" там т.к. используется два значения для отбора, а что такое QuotedStr("CA") я так и не разобрался. У мня есть предположение что я вообще не в том напровлении, что надо использовать TQuery и делать SQL запрос...


 
Davinchi ©   (2003-11-04 15:34) [5]

Попробовал написать так:

with ADODataSet1 do
begin
Filtered := False;
Filter := "MyField = " + QuotedStr("MyFilter");
Filtered := True;
end;

Был сильно удивлен - если MyFilter - только числа, например "123", то все работает нормально, если MyFilter - буквы - "xxx", то возникает ошибка: "BOF or EOF имеет значение True либо текущая запись удалена. Для выполнения операции необходимма текущая запись.", а я никакиз операций с удалением не делаю вообще...


 
Stas ©   (2003-11-04 15:36) [6]

Используй WHERE


 
bon   (2003-11-04 15:38) [7]

попробуй написать так
ADODataSet1.Filtered := False;
ADODataSet1.Filter := "MyField = " + QuotedStr("MyFilter");
ADODataSet1.Filtered := True;


 
Davinchi ©   (2003-11-04 15:40) [8]

попробуй написать так
ADODataSet1.Filtered := False;
ADODataSet1.Filter := "MyField = " + QuotedStr("MyFilter");
ADODataSet1.Filtered := True;

Попробовал, не прокатило, та же лабуда если MyFilter состоит из букв...


 
bon   (2003-11-04 15:43) [9]

А поле MyField какого типа?


 
Davinchi ©   (2003-11-04 15:44) [10]

String[50]


 
paul_k ©   (2003-11-04 15:45) [11]

какой типа поля MyField?


 
bon   (2003-11-04 15:45) [12]

А переменная MyFilter?


 
Davinchi ©   (2003-11-04 15:52) [13]

MyFilter - это не переменная, а просто подстановочный текст.
Привожу конкретный код, который я использую-

...
ADODataSet1.Filter := "MyField = " + QuotedStr("123");//работает
...
//другой вариант
...
ADODataSet1.Filter := "MyField = " + QuotedStr("ABC");//ошибка!
...


 
paul_k ©   (2003-11-04 15:53) [14]

А текст ошибки?


 
bon   (2003-11-04 15:54) [15]

А если так

ADODataSet1.Filter := "MyField = " + "ABC"


 
Davinchi ©   (2003-11-04 15:57) [16]

Текст ошибки немного видоизменен т.к. у меня стоит руссификатор: "BOF or EOF имеет значение True либо текущая запись удалена. Для выполнения операции необходимма текущая запись."


 
Плохиш_   (2003-11-04 16:00) [17]

>Davinchi © (04.11.03 15:34) [5]

Ошибка означает, что ты пытаешься, что-то сделать с dataset (например прочитать какое-то поле), но он не содержит данных. Проверяй события On___Scroll.


 
Davinchi ©   (2003-11-04 16:01) [18]

если использовать:
ADODataSet1.Filter := "MyField = " + "ABC"
возникает другая ошибка: "Аргументы имеют не верный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом".


 
Davinchi ©   (2003-11-04 16:03) [19]

БД точно содержит данные!!!
А что мне может дать OnScroll??????????????


 
Плохиш_   (2003-11-04 16:08) [20]

>Davinchi © (04.11.03 16:03) [19]

Что ж, продолжаем телепатить :-(
Dataset находится в состоянии dsEdit, dsInsert ... , ты ему делаешь филтер, текущая запись в отфильтрованные данные не попала, результат см. [16]


 
Плохиш_   (2003-11-04 16:09) [21]

У тебя, что F7/F8 сломаны?


 
Davinchi ©   (2003-11-04 16:13) [22]

Я делаю фильтрацию сразу после открытия БД. А в каком состоянии должна быть БД и почему тогда Если фильтр состоит из чисел, то все работает нармально?????????7


 
Davinchi ©   (2003-11-04 16:14) [23]

ошибка происходит на строке

AdoDataSet.Filtered:=True;


 
Плохиш_   (2003-11-04 16:14) [24]

читаем ещё раз [20]


 
Davinchi ©   (2003-11-04 16:16) [25]

Блин Плохиш_, ты не унничай, ЧЕ ДЕЛАТЬ - ТА НАДА????


 
Anatoly Podgoretsky ©   (2003-11-04 16:18) [26]

Про книги говорили или еще нет?


 
DenK_vrtz ©   (2003-11-04 16:23) [27]

"Трудно искать черную кошку в темной комнате..." (с) МВИН


 
Davinchi ©   (2003-11-04 16:24) [28]

какие данные нужны?


 
Anatoly Podgoretsky ©   (2003-11-04 16:29) [29]

Например, что ты знаешь о фильтрах в частности и о базах вообще?


 
Davinchi ©   (2003-11-04 16:32) [30]

С обычными dbf работал и делал фильтры так как и сейчас, а с АДОшными таблицыми столкнулся впервые...


 
Anatoly Podgoretsky ©   (2003-11-04 16:36) [31]

Различия нет, различие зависит только от примененой базы.


 
Davinchi ©   (2003-11-04 16:42) [32]

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


 
Anatoly Podgoretsky ©   (2003-11-04 16:49) [33]

Проблема наверно в тебе


 
Davinchi ©   (2003-11-04 16:57) [34]

проблема в том, что если в БД нет записей соответствующих запросу фильтра, то происходит эта ошибка, как нормально обрабатывать эту ситуацию...

P.S.
Anatoly Podgoretsky, сохраняйте тематику форума и держитесь в рамках приличия этого сайта, не надо переходить на личности, прочитайте о чем пишется на главной страничке форумов... :-(


 
Anatoly Podgoretsky ©   (2003-11-04 17:01) [35]

В таком случае не надо задавать этот вопрос Davinchi © (04.11.03 16:42) [32] , поскольку это прямой ответ на него.
Пока до сих пор ты практиски ничего не сказал про свою таблицу структуру, не привел пример реальных данных в таблице, по которым ты вроде считешь, что данные у тебя есть, и при каждом изменении надо приводить измененый код, чтобы мы не гадали, что же ты там изменил.

Кроме того мне кажется, что у тебя не Д7, а если Д7 какие апдейты ты поставил.


 
Davinchi ©   (2003-11-04 17:08) [36]

Вот так бы сразу, я же спрашивал какая информация нужна...
Структура Бд:

TableTheme:="CREATE TABLE TestTheme"+
"([id]Counter,"+
"[Description]String (50),"+
"[Data]Memo,"+
"[RichData]Memo,"+
"PRIMARY KEY ([id]))";


реальный кусок кода:

if ADSet.RecordCount > 0 then
begin
ADSet.Filtered:=False;
ADSet.Filter:="Description = "+QuotedStr("b");
ADSet.Filtered:=True;
end;


Апдейтов не ставил, только руссификатор Д7...


 
paul_k ©   (2003-11-04 17:11) [37]

уфф... упарился этой ошибки добиватся, но таки вышло

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:="NAME="+QuotedStr("99");
ADOTable1.Filtered:=true;
end;
и
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOTable1.Edit;
ADOTable1.Filtered:=false;
ADOTable1.Filter:="NAME="+QuotedStr("*");
ADOTable1.Filtered:=true;
end;


пролетают на ура, пока следующее не написано

procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
begin
showmessage(Dataset.fieldByName("name").AsString)
end;


 
Davinchi ©   (2003-11-04 17:14) [38]

Если выполнять фильтрацию со значением, которое есть хотябы в одном рекорде все нормально, но если со значением которого нет ни в одном рекорде, как в приведенной строке:

ADSet.Filter:="Description = "+QuotedStr("b");

то возникает ошибка [16].

Ранее я был не прав т.к. пологал, что ошибка присходит только с числовым фильтром, пока не попробовал не существующее строковае занчение фильтра...


 
paul_k ©   (2003-11-04 17:16) [39]

Davinchi
Ошибка возникает при исполнении
procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
begin
showmessage(Dataset.fieldByName("name").AsString)
end;

а не при фильтрации


 
Davinchi ©   (2003-11-04 17:16) [40]

у меня данные отображаются в DbGrid


 
paul_k ©   (2003-11-04 17:17) [41]

Davinchi
а у меня дача в сочи...


 
Davinchi ©   (2003-11-04 17:18) [42]

как корректно обработать эту ошибку, так чтобы у меня был пустой DbGrid и нее кто не ругался..


 
paul_k ©   (2003-11-04 17:19) [43]

смотря что у тебя в BeforeScroll/AfterScroll написано


 
Davinchi ©   (2003-11-04 17:25) [44]

а ну вот, так бы срузу и сказал...
У меня в BeforeScroll стаяла запись данных в текущую запись, надо было только условие поставить, что производить запись если только RecordCount>0...

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! СПАСИБО ВСЕМ ТЕМ, КТО ПОМОГ МНЕ РАЗОБРАТЬСЯ !!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


 
Anatoly Podgoretsky ©   (2003-11-04 17:26) [45]

Ошибка в самом коде нет.
"b" а у тебя может быть такая запись, как то сомнительно.
Про апдейты я уже ранее писал. Ошибка характерная для Д5 без апдейтов, но что не слышал, что бы это наблюдалось в Д7.


 
Anatoly Podgoretsky ©   (2003-11-04 17:27) [46]

Опять же ничего не пишешь про подключение, может у тебя провайдер кривой.


 
Плохиш_   (2003-11-04 17:29) [47]

Разжевали, хорошо хоть проглотил


 
Anatoly Podgoretsky ©   (2003-11-04 17:31) [48]

Образцово показательный пример как задавать вопросы.


 
aus ©   (2003-11-04 22:19) [49]

procedure TForm1.ADOTable1BeforeScroll(DataSet: TDataSet);
begin
if Dataset.RecordCount > 0 then
showmessage(Dataset.fieldByName("name").AsString)
else
showmessage("нет данных");
end;



Страницы: 1 2 вся ветка

Текущий архив: 2003.11.24;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.018 c
3-78756
Aleksandr
2003-11-03 14:04
2003.11.24
Что за странности с TClientdataSet?


1-79016
lucky4me
2003-11-14 10:11
2003.11.24
как прокрутить ролик Flash в приложении Delphi


1-78925
Dred
2003-11-12 01:39
2003.11.24
Структура данных


3-78777
GIL
2003-11-05 15:36
2003.11.24
Фильтрация


1-78888
GH@ST
2003-11-13 10:50
2003.11.24
Кто нибудь программировал MS Agent?