-
Доброго времени суток. У меня такой вопрос, я пытаюсь сделать фильтрацию по полю подстановки (loockup), пишу такой код: Код:
ADOQuery3.Active:=False;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('SELECT *');
ADOQuery3.SQL.Add('FROM tblDetail');
if Edit1.Text<>EmptyStr then
ADOQuery3.SQL.Add('WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE '''+Edit1.Text+'%'+''')');
ADOQuery3.Active:=True; где tblDetail таблица с ссылками, т.е. содеожит коды полей tblSection - таблица с соответствующими именами проблема в следующем, при вводе в Едит текста, таблица становится пустой, и фильтрация соответственно не осуществляется... но если данный запрос проверить в Access'e то все работает... в чем может быть проблема?
-
Регистр букв соблюдается как в БД?
-
Да, все соблюдал, и с учетом регистра и без ...
-
И все равно в запросе я бы все привел к одному регистру. Кроме того лучше бы пользоваться параметрами LIKE :NameSection Выведи текст запроса перед выполнением в showmessage и убедись, что там все как надо.
-
И Loockup тут совершенно ни при чем, кстати.
-
вот попробывал так:
ADOQuery3.Active:=False;
ADOQuery3.SQL.Clear;
ADOQuery3.SQL.Add('SELECT *');
ADOQuery3.SQL.Add('FROM tblDetail');
if Edit1.Text<>EmptyStr then
ADOQuery3.SQL.Add('WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE '''+'#39'+Edit1.Text+'#39'+'%'+''')');
ShowMessage(ADOQuery3.SQL.Text);
ADOQuery3.Active:=True;
результат тот же... или регистр по другому нужно делать?
-
> [5] DenProx © (03.03.10 12:14) > или регистр по другому нужно делать?
Вообще то по другому. Есть наверное в аксесе UPPER. И все таки параметры надежнее. Что показывает ShowMessage(ADOQuery3.SQL.Text);?
-
запрос сделал такой:
ADOQuery3.SQL.Add('WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE '''+UpperCase(Edit1.Text)+'%'+''')');
в сообщении выводит: SELECT * FROM tblDetail WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE 'Д%'); результат не изменился...
-
а если написать конкретно, не едит1.текст, а SELECT * FROM tblDetail WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE 'Д%');
что-то кажет?
-
в том и фишка, что Нет...
-
> [7] DenProx © (03.03.10 12:27)
А поле таблицы SectionName кто будет к верхнему регистру приводить?
-
> DenProx © (03.03.10 12:27) [7]
С акцессом я как-то не очень, но .... Если приводишь к одному регистру, то вопрос - а в базе у тебя поля тоже в верхнем регистре? Если нет, то приводить к верхнему например регистру надо и значения полей в базе.
Второе, как вариант (если все остальное нормально) - есть подозрение еще, что кодировка буквы Д в базе и буквы Д в Edit не совпадает(юникод и анси).
-
Нашел в чем проблема... Просто этот компонент ADO имел связь с другим, по этому запрос не работал...
-
Только теперь получается фильтр, работает по всей таблице, а не по записям которые относятся к кокому либо разделу... как это возможно совместить?
-
> [13] DenProx © (03.03.10 13:22)
У тебя вообще про фильтр нет ничего. Давай уж с терминологией разбирайся. Запрос не работает?
-
Дак запрос на фильтрацию реализован... если у ADOQuery убрать связь (DataSourse) то запрос работает, но по всей таблице.... если Связь восстановить, то запрос не работает. Смысл в следующем: на форме два Грида, один содержит Разделы, другой подразделый относящиеся к какому либо разделу, т.к. подразделов много нужно сделать фильтрацию... что я и делал выше описанным способом... сложность в том что поля во втором гриде подстановочные... Lookup...
-
> [15] DenProx © (03.03.10 13:34)
О чем то своем рассказываешь? Связи какие то, датасорсы, лукапы. О чем ты? Кто это видел? Кроме тебя?
-
просто подумал, так будет легче понять суть того что мне нужно, и что не получается....
-
> [17] DenProx © (03.03.10 13:52)
Так ты еще больше все запутал. Прежде, чем понимать что тебе нужно, нужно понять что у тебя есть. Конкретно и по пунктам.
-
в БД есть таблицы: tblBlock, tblDetail, tblSection tblBlock - таблица содержащая названия блоков (изделия) tblDetail - таблица содержащая все детали, где имена деталец берутся из таблицы tblSection. в Delphi: Есть форма, на ней Два DBGrid'a, по 3-и ADOQuery и DataSourse. Первый Грид отображает данные из таблицы tblBlock, второй Грид отображает детали относящиеся к выбранному блоку (по связи один-ко-многим), в поле SectionName(подстановочное поле). Необходимо отфильтровать это поле.
|