ABAP: динамическое где - PullRequest
       6

ABAP: динамическое где

0 голосов
/ 02 октября 2018

Я нашел этот пример, как создать динамический WHERE:

REPORT ZII_RKP_TEST1.

DATA: cond(72) TYPE c,
itab LIKE TABLE OF cond.
PARAMETERS: source(10) TYPE c, dest(10) TYPE c.
DATA wa TYPE spfli-cityfrom.
CONCATENATE 'CITYFROM = ''' source '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' dest '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' 'BAYERN' '''' INTO cond.
APPEND cond TO itab.
LOOP AT itab INTO cond.
WRITE cond.
ENDLOOP.
SKIP.
SELECT cityfrom
INTO wa
FROM spfli
WHERE (itab).
WRITE / wa.
ENDSELECT.

Источник: https://wiki.scn.sap.com/wiki/display/ABAP/Dynamic%2Bwhere%2Bclause

В приведенном выше примере используются статические значения, такие как "BAYERN".

Если я использую произвольные значения, то думаю, что может сломаться для некоторых специальных значений, таких как '''.

Нужно ли заключать в кавычки, чтобы динамический ГДЕ был неразрывным?И если да, то как это сделать?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Интересно, почему этот пример написан таким образом, может быть, это старый кусок кода.

1-й: если у вас есть доступ в вашей системе к «новому» синтаксису строки, вы можете просто использовать что-то вроде

WHERE = |CITYFROM = '| && source && |'|.

2-й: хорошая вещь в предложениях строки WHERE заключается в том, что вы можете просто использовать переменные как часть строки, я имею в виду, если вы просто напишите что-то вроде

WHERE = 'CITYFROM = source'.

ABAPпревратит это в правильный SQL, как если бы вы правильно писали свой SQL.

(Я хотел бы, чтобы я мог правильно объяснить себя, не стесняйтесь спрашивать, если у вас есть какие-либо сомнения)

0 голосов
/ 08 октября 2018

Метод cl_abap_dyn_prg=>quote( name ) должен использоваться.

Пример:

DATA(cond) = `country = 'DE' AND name = ` &&
             cl_abap_dyn_prg=>quote( name ).

Источник: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/index.htm?file=abensql_inj_dyn_tokens_scrty.htm

(Спасибо Сандре Росси за указание на меня вправильное направление)

0 голосов
/ 02 октября 2018

Вы можете избежать апострофа перед выполнением добавления, прежде чем добавлять их, как показано ниже.

*&---------------------------------------------------------------------*
*& Report ZMKY_ESCAPE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmky_escape.

DATA: cond(72) TYPE c,
      itab     LIKE TABLE OF cond.
PARAMETERS: source(10) TYPE c, dest(10) TYPE c.
DATA wa TYPE spfli-cityfrom.

PERFORM escape CHANGING source.
PERFORM escape CHANGING dest.

CONCATENATE 'CITYFROM = ''' source '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' dest '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'OR CITYFROM = ''' 'BAYERN' '''' INTO cond.
APPEND cond TO itab.
LOOP AT itab INTO cond.
  WRITE cond.
ENDLOOP.
SKIP.
SELECT cityfrom
INTO wa
FROM spfli
WHERE (itab).
  WRITE / wa.
ENDSELECT.

FORM escape CHANGING value TYPE c.
  REPLACE ALL OCCURRENCES OF '''' IN value WITH ''''''.
ENDFORM.

Последние версии ABAP, включающие подробности функции выхода, здесь .Но это не входит в кавычки.Мы можем использовать статический метод escape_quotes для класса cl_abap_dyn_prg, как показано ниже.

CALL METHOD cl_abap_dyn_prg=>escape_quotes
  EXPORTING
    val    = source
  receiving
    out    = output. 

Метод, позволяющий сделать что-то похожее на приведенное выше.

...