Конференция "Базы" » Фильтрация Loockup поля [D7, Access]
 
  • DenProx (03.03.10 11:21) [0]
    Доброго времени суток. У меня такой вопрос, я пытаюсь сделать фильтрацию по полю подстановки (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 то все работает... в чем может быть проблема?
  • Sergey13 © (03.03.10 11:37) [1]
    Регистр букв соблюдается как в БД?
  • DenProx (03.03.10 11:42) [2]
    Да, все соблюдал, и с учетом регистра и без ...
  • Sergey13 © (03.03.10 11:53) [3]
    И все равно в запросе я бы все привел к одному регистру.
    Кроме того лучше бы пользоваться параметрами LIKE :NameSection
    Выведи текст запроса перед выполнением в showmessage и убедись, что там все как надо.
  • Sergey13 © (03.03.10 11:53) [4]
    И Loockup тут совершенно ни при чем, кстати.
  • DenProx © (03.03.10 12:14) [5]
    вот попробывал так:

    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;



    результат тот же... или регистр по другому нужно делать?
  • Sergey13 © (03.03.10 12:16) [6]
    > [5] DenProx ©   (03.03.10 12:14)
    > или регистр по другому нужно делать?

    Вообще то по другому. Есть наверное в аксесе UPPER.
    И все таки параметры надежнее.
    Что показывает ShowMessage(ADOQuery3.SQL.Text);?
  • DenProx © (03.03.10 12:27) [7]
    запрос сделал такой:

    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 'Д%');

    результат не изменился...
  • 12 © (03.03.10 12:36) [8]
    а если написать конкретно, не едит1.текст, а
    SELECT *
    FROM tblDetail
    WHERE Section_ID IN (SELECT Key FROM tblSection WHERE SectionName LIKE 'Д%');

    что-то кажет?
  • DenProx © (03.03.10 12:42) [9]
    в том и фишка, что Нет...
  • Sergey13 © (03.03.10 12:57) [10]
    > [7] DenProx ©   (03.03.10 12:27)

    А поле таблицы SectionName кто будет к верхнему регистру приводить?
  • Вариант (03.03.10 12:59) [11]

    > DenProx ©   (03.03.10 12:27) [7]

    С акцессом я как-то не очень, но ....
    Если приводишь к одному регистру, то вопрос - а в базе у тебя поля тоже в  верхнем регистре? Если нет, то приводить к верхнему например регистру надо и значения полей в базе.

    Второе, как вариант (если все остальное нормально) - есть подозрение еще, что кодировка буквы Д в базе и буквы Д в Edit не совпадает(юникод и анси).
  • DenProx © (03.03.10 13:04) [12]
    Нашел в чем проблема... Просто этот компонент ADO имел связь с другим, по этому запрос не работал...
  • DenProx © (03.03.10 13:22) [13]
    Только теперь получается фильтр, работает по всей таблице, а не по записям которые относятся к кокому либо разделу... как это возможно совместить?
  • Sergey13 © (03.03.10 13:27) [14]
    > [13] DenProx ©   (03.03.10 13:22)

    У тебя вообще про фильтр нет ничего. Давай уж с терминологией разбирайся. Запрос не работает?
  • DenProx © (03.03.10 13:34) [15]
    Дак запрос на фильтрацию реализован... если у ADOQuery убрать связь (DataSourse) то запрос работает, но по всей таблице.... если Связь восстановить, то запрос не работает.
    Смысл в следующем: на форме два Грида, один содержит Разделы, другой подразделый относящиеся к какому либо разделу, т.к. подразделов много нужно сделать фильтрацию... что я и делал выше описанным способом...
    сложность в том что поля во втором гриде подстановочные... Lookup...
  • Sergey13 © (03.03.10 13:44) [16]
    > [15] DenProx ©   (03.03.10 13:34)

    О чем то своем рассказываешь? Связи какие то, датасорсы, лукапы. О чем ты? Кто это видел? Кроме тебя?
  • DenProx © (03.03.10 13:52) [17]
    просто подумал, так будет легче понять суть того что мне нужно, и что не получается....
  • Sergey13 © (03.03.10 14:00) [18]
    > [17] DenProx ©   (03.03.10 13:52)

    Так ты еще больше все запутал.
    Прежде, чем понимать что тебе нужно, нужно понять что у тебя есть. Конкретно и по пунктам.
  • DenProx © (03.03.10 14:25) [19]
    в БД есть таблицы: tblBlock, tblDetail, tblSection
    tblBlock - таблица содержащая названия блоков (изделия)
    tblDetail - таблица содержащая все детали, где имена деталец берутся из таблицы tblSection.
    в Delphi:
    Есть форма, на ней Два DBGrid'a, по 3-и ADOQuery и DataSourse.
    Первый Грид отображает данные из таблицы tblBlock, второй Грид отображает детали относящиеся к выбранному блоку (по связи один-ко-многим), в поле SectionName(подстановочное поле). Необходимо отфильтровать это поле.
  • Sergey13 © (03.03.10 14:36) [20]
    > [19] DenProx ©   (03.03.10 14:25)

    А что мешает показывать набор данных из tblSection в каком нибудь ДБЛукапКомбоБоксе и просто подставлять еще одну переменную в набор с деталями?
    Только от стандартного механизма мастер-деталь придется отказаться. На атерскрол обоих родителей вешаешь процедуру переоткрытия деталей с параметрами. И все.

    ЗЫ: Вместо ADOQuery лучше юзать АДОДатасет.
  • DenProx © (03.03.10 14:41) [21]
    Нужна наглядность, а если использовать КомбоБокс то это уже не Гуд...
  • Sergey13 © (03.03.10 14:56) [22]
    > [21] DenProx ©   (03.03.10 14:41)

    Ну третий грид прилепи с секциями.
 
Конференция "Базы" » Фильтрация Loockup поля [D7, Access]
Есть новые Нет новых   [134434   +28][b:0][p:0.001]