程序中的错误 DBIF_RSQL_INVALID_RSQL CX_SY_OPEN_SQL_DB
Error DBIF_RSQL_INVALID_RSQL CX_SY_OPEN_SQL_DB in program
我收到以下错误:DBIF_RSQL_INVALID_RSQL CX_SY_OPEN_SQL_DB(Open SQL 命令太大。Open SQL 命令的条件 WHERE 包含太多条件)。错误指向以下行:
select * from Z3T_MAILS into table t_full_mail UP TO 250 ROWS where ID in r_mid and (p_dat_clause).
其他部分代码:
DATA: p_dat_clause type STRING,
t_full_mail type Z3TT_MAILS,
r_mid type range of Z3E_MAIL_ID.
<...>
if not NOT_READED is initial.
p_clause = 'ISREAD = '''''.
endif.
if DATETO is initial.
p_dateto = DATEFROM.
else.
p_dateto = DATETO.
endif.
if not DATEFROM is initial or not DATETO is initial.
concatenate 'SEND_DATE >= ''' DATEFROM ''' and SEND_DATE <= ''' p_dateto '''' into p_dat_clause.
endif.
<...>
if MAILS is supplied or BODY is supplied or p_dat_clause ne ''.
if not r_mid[] is initial.
select * from Z3T_MAILS into table t_full_mail UP TO 250 ROWS where ID in r_mid and (p_dat_clause).
endif.
endif.
我是 ABAP 的新手,非常感谢任何帮助!
当您使用的 range/select-option 条目太多而数据库无法处理时,就会发生该错误。对此的解决方案始终取决于用途,但无论如何您都必须限制范围内的条目数。
在您的情况下,您最多只需要数据库中的 250 行。因此,如果 R_MID 填充了包含单个 ID 的所有行,您可以检查其中的行数 (LINES( R_MID ) ),如果多于此,则将其限制为 250。在大多数系统中,这将消除错误。
我只是在猜测,但您的范围 r_mid
可能有数百行如下所示:
r_mid-sign = 'I'.
r_mid-option = 'EQ'.
r_mid-low = '123123123'.
r_mid-high = ''.
因此,您可以将这些 ID 存储在内部 table 中。您甚至可以使用正在循环的内部 table 来首先填充 r_mid
。
另一方面,您的日期变量实际上很适合声明为单个范围:
r_date-sign = 'I'.
r_date-option = 'BT'.
r_date-low = datefrom.
r_date-high = dateto.
另请注意 documentation 范围。
最后你可以这样写你的查询:
SELECT *
FROM z3t_mails
INTO TABLE t_full_mail
FOR ALL ENTRIES IN lt_mid
WHERE id EQ lt_mid-id
AND send_date IN r_date.
我收到以下错误:DBIF_RSQL_INVALID_RSQL CX_SY_OPEN_SQL_DB(Open SQL 命令太大。Open SQL 命令的条件 WHERE 包含太多条件)。错误指向以下行:
select * from Z3T_MAILS into table t_full_mail UP TO 250 ROWS where ID in r_mid and (p_dat_clause).
其他部分代码:
DATA: p_dat_clause type STRING,
t_full_mail type Z3TT_MAILS,
r_mid type range of Z3E_MAIL_ID.
<...>
if not NOT_READED is initial.
p_clause = 'ISREAD = '''''.
endif.
if DATETO is initial.
p_dateto = DATEFROM.
else.
p_dateto = DATETO.
endif.
if not DATEFROM is initial or not DATETO is initial.
concatenate 'SEND_DATE >= ''' DATEFROM ''' and SEND_DATE <= ''' p_dateto '''' into p_dat_clause.
endif.
<...>
if MAILS is supplied or BODY is supplied or p_dat_clause ne ''.
if not r_mid[] is initial.
select * from Z3T_MAILS into table t_full_mail UP TO 250 ROWS where ID in r_mid and (p_dat_clause).
endif.
endif.
我是 ABAP 的新手,非常感谢任何帮助!
当您使用的 range/select-option 条目太多而数据库无法处理时,就会发生该错误。对此的解决方案始终取决于用途,但无论如何您都必须限制范围内的条目数。
在您的情况下,您最多只需要数据库中的 250 行。因此,如果 R_MID 填充了包含单个 ID 的所有行,您可以检查其中的行数 (LINES( R_MID ) ),如果多于此,则将其限制为 250。在大多数系统中,这将消除错误。
我只是在猜测,但您的范围 r_mid
可能有数百行如下所示:
r_mid-sign = 'I'.
r_mid-option = 'EQ'.
r_mid-low = '123123123'.
r_mid-high = ''.
因此,您可以将这些 ID 存储在内部 table 中。您甚至可以使用正在循环的内部 table 来首先填充 r_mid
。
另一方面,您的日期变量实际上很适合声明为单个范围:
r_date-sign = 'I'.
r_date-option = 'BT'.
r_date-low = datefrom.
r_date-high = dateto.
另请注意 documentation 范围。
最后你可以这样写你的查询:
SELECT *
FROM z3t_mails
INTO TABLE t_full_mail
FOR ALL ENTRIES IN lt_mid
WHERE id EQ lt_mid-id
AND send_date IN r_date.