Форум: "Базы";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];
Внизошибка при установке фильтра в 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.01 c