我发现此示例如何创建动态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牢不可破?如果是的话,该怎么做?
答案 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 ).
(感谢Sandra Rossi向我指出正确的方向)