Openedge SDO -> умный браузер данных - я хочу отфильтровать результаты запроса
У меня есть SDO, предоставляющая данные только для чтения в браузере. Запрос SDO объединяет несколько таблиц и имеет вычисляемые поля, а также поля естественных данных.
Теперь пользователям нужна функция поиска, поэтому браузер будет показывать только те строки, в которых искомое слово появляется в ЛЮБОМ из текстовых полей.
Например, они хотят видеть строки, где
customer.name matches "*bob*" OR
customer.address1 matches "*bob*" OR
product.description matches "*bob*" OR
calc_field_1 matches "*bob*" OR
calc_field_2 matches "*bob*" OR ...
В идеале ответ отфильтрует вывод SDO по мере его создания, но я также с радостью отфильтрую данные по пути в умный браузер или в умный браузер.
2 ответа
Бизнес-проблема, которую вы пытаетесь решить, чревата проблемами с производительностью, если вы реализуете ее так, как написано. Я бы предложил
- добавление еще одного символьного столбца в таблицу или базу данных,
- положить все слова из других столбцов в нем,
- применение словарного индекса к новому столбцу,
- выполнить поиск по этому столбцу, а затем вернуться к исходным таблицам.
Это будет намного быстрее и проще в использовании.
Я использовал очень простое решение в конце. Пользователи могут ввести строку, которую они ищут. Если строка находится в ячейке браузера, эта ячейка выделяется желтым цветом.
Перед этим пользователям приходилось прокручивать вверх и вниз, пытаясь разглядеть интересующие клетки в сотнях строк. У нас не было ни времени, ни бюджета для чего-то более изумительного.
Важный фрагмент кода в умном браузере выглядит следующим образом...
on row-display of br_table in frame f-main
do:
if rowObject.field1 matches "*BOB*" then
rowObject.field1:BGCOLOR in browse br_table = 14.
if rowObject.field2 matches "*BOB*" then
rowObject.field2:BGCOLOR in browse br_table = 14.
if rowObject.field3 matches "*BOB*" then
rowObject.field3:BGCOLOR in browse br_table = 14.
... etc ...
это не жестко, чтобы искать только Боба - но вы должны понять.