Итак, у меня есть AdoTable, связанный с базой данных (mdb) и DataSource с ее использованием. Этот DataSource используется DBGrid ...Фильтр AdoDB при объединенных столбцах
Я попытался отфильтровать AdoTable на основе пользовательского ввода. Есть 3 важных столбца: имя, фамилия и идентификатор. Я придумал что-то вроде этого, как временное решение:
AdoTable.filter:='surname like ' +
QuotedStr('%'+edit1.text+'%')+' or name like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
Это делает работу, но это не делает именно то, что я хотел бы это сделать ... (при поиске имени и Фамилии не будет найти что-либо, поскольку оно выглядит только в одном столбце). Так позже я изменил мой код в этом:
AdoTable.filter:='surname & " " & name like ' +
QuotedStr('%'+edit1.text+'%')+' or name & " " & surname like ' +
QuotedStr('%'+edit1.text+'%')+' or ID like ' +
QuotedStr('%'+edit1.text+'%');
AdoTable.filtered:=true;
Теперь это будет делать exacly, что я хочу, чтобы это сделать, но это вызывает исключение (EOleException: аргументы имеют неправильный тип, находятся вне допустимого диапазона, или находятся в конфликте друг с другом). Это довольно удивляет меня, поскольку я думал, что он должен вести себя как предложение where в команде sql (и он отлично работает как команда).
Я попытался заменить '&' на '+'. Я мог бы разделить текст ввода, но я не хочу этого делать (он будет работать плохо, если у вас будут такие имена, как Робин ван Перси, Ахмад ибн Ханбал и т. Д.)
В качестве альтернативы я мог бы переписать всю программу использовать запросы вместо таблиц, но я действительно не хочу этого делать (это также означало бы, что я получаю новый пользователь recordSet. EVERYTIME изменит edit1.text вместо простой фильтрации).
Любые идеи?
редактировать: так команда, которая работает выглядит следующим образом
select * from person where surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
фильтр выглядит следующим образом (и это вызывает исключение)
surname & " " & name like '%John Smith%' or name & " " & surname like '%John Smith%' or ID like '%John Smith%'
Обратите внимание, что может быть «кп Смит» вместо «John Smith», так что он найдет также «Kann Smithers» и т. Д.
Есть некоторые неизвестные части: Какой тип ID? Ваш код предполагает, что это строка, которая звучит неверно, в основном идентификатор - это номер. Вторая: Какая у вас база данных? Когда вы используете, например, SQL Express «%» правильный, когда вы используете Access, вы должны использовать '*' Можете ли вы показать полученную строку фильтра? –
Идентификатор действительно строка. Это может быть что-то вроде «123abc». И я нашел он-лайн, что Access использует «%» («*» не работает, я пытался). Результирующим фильтром будет «фамилия» и «имя», например «% John Smith%» или имя & «» и фамилия, например «% John Smith%» или ID, например «% John Smith%», если мы ищут имя и фамилию или фамилию и имя & quot; & name как '% 0123abcd%' 'или имя & "" и фамилию наподобие' '% 0123abcd%' 'или ID, например'% 0123abcd% '' ', если мы ищут ID –
Пожалуйста, ответьте на свой вопрос – kobik