2

我收到以下错误: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 的新手,不胜感激!

4

2 回答 2

2

当您使用具有太多条目以供数据库处理的范围/选择选项时,会发生该错误。对此的解决方案始终取决于使用情况,但无论如何您都必须限制范围内的条目数。

在您的情况下,无论如何您最多只需要数据库中的 250 行。因此,如果 R_MID 填充了包含单个 ID 的所有行,您可以检查其中的行数 (LINES( R_MID ) ) 并将其限制为 250(如果有更多行)。在大多数系统中,这将消除错误。

于 2015-02-27T16:20:40.497 回答
1

我只是在这里猜测,但您的范围r_mid可能有数百行如下所示:

r_mid-sign   = 'I'.
r_mid-option = 'EQ'.
r_mid-low    = '123123123'.
r_mid-high   = ''.

因此,您可以将这些 ID 存储在内部表中。您甚至可以首先使用您正在循环的内部表来填写r_mid

另一方面,您的日期变量实际上非常适合声明为单个范围:

 r_date-sign   = 'I'.
 r_date-option = 'BT'. 
 r_date-low    = datefrom.
 r_date-high   = dateto.

另请注意有关范围的文档。

最后,您可以按如下方式编写查询:

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.
于 2015-02-27T18:21:36.897 回答