ABAP:动态位置

时间:2018-10-02 10:47:49

标签: sap abap

我发现此示例如何创建动态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”。

如果我使用任意值,那么我想可能会破坏一些'''之类的特殊值。

是否需要做一些报价才能使动态WHERE牢不可破?如果是的话,该怎么做?

3 个答案:

答案 0 :(得分:1)

您可以先在表演中避免撇号,然后再按如下所示添加它们。

*&---------------------------------------------------------------------*
*& 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版本的转义功能详细信息为here。但这不包括引号转义。我们可以在类cl_abap_dyn_prg上使用静态的escape_quotes方法,如下所示。

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

使方法类似于上面执行的方法。

答案 1 :(得分:0)

我想知道为什么该示例是以这种方式编写的,也许是一段旧代码。

第一:如果您可以在系统中使用“新”字符串语法,则可以使用类似的

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

2nd:关于字符串WHERE子句的好处是,您可以只将变量用作字符串的一部分,我的意思是,如果您只写类似

WHERE = 'CITYFROM = source'.

ABAP会将其转换为正确的SQL,就像您正确编写SQL一样。

(我希望我能正确解释自己,不要犹豫,问您是否有任何疑问)

答案 2 :(得分:0)

应该使用方法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

(感谢Sandra Rossi向我指出正确的方向)