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 が 1 つの 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 に答える