LIKE фильтрация поля LCHR в сервисе OData

Я разрабатываю приложение UI5, использующее службы OData с SAP Gateway, где я реализовал функцию поиска, которая создает условие SQL where. Одна часть условия выглядит следующим образом: ... OR DESCRIPTION LIKE '%searchString%'... . В моей таблице базы данных у меня есть поле DESCRIPTION типа LCHR длины 32000. Единственная проблема заключается в том, что поле DESCRIPTION не может быть в предложении WHERE.

Каким будет правильный подход к поиску длинных строк в таблице базы данных через службы OData? Нужно ли жестко кодировать функцию поиска или есть более чистый способ?


person miskohut    schedule 05.01.2018    source источник
comment
Вы пытались передать эту строку во внешний интерфейс и выполнить высокопроизводительный поиск во внешнем интерфейсе вместо передачи запросов odata туда и обратно? Это означает добавление еще одного поля в вашу сущность, содержащее строку поиска, и выполнение фильтрации ui5? Мы сделали это, и это очень хорошо сработало.   -  person dotchuZ    schedule 24.04.2018
comment
where I have implemented a search functionality which is producing a SQL where condition как вы это реализовали? дайте текущий код   -  person Suncatcher    schedule 30.07.2020


Ответы (1)


Ответ: Функция таблицы CDS. Основная идея состоит в том, чтобы передать поиск в HANA, что реализовано с помощью АМДП. Я провел локальное тестирование, чтобы ответить на этот вопрос конкретным кодом.

Я создал таблицу zza_test

@EndUserText.label : 'TEST'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #LIMITED
define table zza_test {
    key mandt : mandt not null;
    key bukrs : bukrs not null;
    cnt       : abap.int4;
    des       : abap.lchr(2000);
}

Определена табличная функция CDS zza_test_tf с параметром search_str.

@EndUserText.label: 'TEST TF'
define table function zza_test_tf
with parameters
    @Environment.systemField: #CLIENT
       clnt   :abap.clnt,
       search_str : char255
returns
{
    mandt : mandt;
    bukrs : bukrs;
    cnt   : abap.int4;
    des   : abap.lchr(2000);

}
implemented by method zcl_zza_test_tf=>search_des;

Создал класс zcl_zza_test_tf с интерфейсом if_amdp_marker_hdb и реализовал метод search_des

class zcl_zza_test_tf definition
public
final
create public .

public section.
  interfaces if_amdp_marker_hdb.
  class-methods search_des

      for table function zza_test_tf.
 endclass.

class zcl_zza_test_tf implementation.
   
   method search_des by database function for hdb
      language sqlscript
      options read-only
      using zza_test.
   
      return select mandt,bukrs, cnt, des
                from zza_test where des like concat( concat( '%', 
                   :search_str), '%');

   endmethod.

endclass.

Теперь у нас есть табличная функция CDS с параметрами. Запустите представление CDS и введите параметр поиска, чтобы получить результат. Вы даже можете определить свой HANA SQL в своей реализации AMDP с помощью нечеткий поиск.

Чтобы выполнить это требование, вы реализуете выбор Open SQL в этом представлении CDS на уровне шлюза.

data:
    lt_test type standard table of ZZA_TEST_TF.

select * from ZZA_TEST_TF( search_str = 'DUM' ) into table @lt_test.

Все должно работать. Надеюсь, поможет. Благодарю вас!

person Haojie    schedule 08.01.2018