2

とりわけ、フィールド、DATS タイプにRESB基づいてテーブルからデータを取得するプログラムがあります。bdter選択画面で、ユーザーは範囲を指定するか、標準範囲 (月初から今日) を使用します。

ただし、日付用に作成した選択オプションが入力されていない場合 (ユーザーが日付範囲を入力していない場合) に再利用しようとすると、この作業領域への変更が認識されないようです。私のselect文でそれを使用してください。

関連するコード セグメントが続きます。いくつかのテストの後、次のように結論付けました。

  • ユーザーによって変更されず、その後コードで設定されない場合s_bdter、レコードはフィルタリングされません

  • ユーザーによって変更された場合s_bdter、レコードは正しくフィルタリングされます

  • s_bdterユーザーによって変更され、その後コードで変更された場合、レコードは正しくフィルタリングされます

     SELECT-OPTIONS: s_bdter FOR ls_itab-bdter MODIF ID sbd.
    
     START-OF-SELECTION.
     " Set the interval.
     s_bdter-sign = 'I'.
     s_bdter-option = 'BT'.
     s_bdter-low = lc_bdter_start.
     s_bdter-high = sy-datum + 30.
    
     " This select doesn't filter on bdter unless the selection parameter was set by the user.
     SELECT r~aufnr p~psphi
         FROM resb AS r
         INNER JOIN afpo AS o ON o~aufnr = r~aufnr
         INNER JOIN prps AS p ON p~pspnr = o~projn
         INTO TABLE lt_resb_ss
         WHERE r~bdter IN s_bdter.
    

これは既知の文書化された動作ですか? 独自のRANGEテーブルを作成して解決しましたが、これは常に行うべきことですか? コードの重複を防ぐために、未設定の選択オプションを再利用する方法はありませんか?

4

1 に答える 1

5

のヘッダー行のみを入力しs_bdterます。また、それを追加する必要があります:

" Set the interval.
s_bdter-sign = 'I'.
s_bdter-option = 'BT'.
s_bdter-low = lc_bdter_start.
s_bdter-high = sy-datum + 30.
append s_bdter. "<- this was missing

これにより、満たされていない場合はチェックしません。このチェックは明示的に行う必要があります。

" describe table s_bdter.
if sy-tfill = 0.
  " Set the interval.
  s_bdter-sign = 'I'.
  s_bdter-option = 'BT'.
  s_bdter-low = lc_bdter_start.
  s_bdter-high = sy-datum + 30.
  append s_bdter. "<- this was missing
endif. " sy-tfill = 0.

コードの構文が正しく、sy-tfill が正しい値であることを願っています。実物は確認できません。しかし、原則は明確でなければなりません。

于 2013-12-27T14:33:54.223 に答える