5

トピックで述べたように、内部テーブルの条件付きサブセットを別の内部テーブル内に配置したいと考えています。

まず、昔ながらの方法のように見えるものを見てみましょう。

DATA: lt_hugeresult TYPE tty_mytype,
      lt_reducedresult TYPE tty_mytype.  

SELECT "whatever" FROM "wherever" 
        INTO CORRESPONDING FIELDS OF TABLE lt_hugeresult 
          WHERE "any_wherecondition".
IF sy-subrc = 0.
  lt_reducedresult[] = lt_hugeresult[].
  DELETE lt_reducedresult WHERE col1 EQ 'a value'
                            AND col2 NE 'another value'
                            AND col3 EQ 'third value'.
 .
 .
 .


ENDIF.

私たちは皆、これを知っているかもしれません。

今、私はabap 7.40、明らかにSP8で導入されたテーブルを削減するものについて読んでいました。

表内包表記 - 機能的に表を作成する

テーブル駆動:

VALUE tabletype( FOR 行 IN タブ WHERE ( … )

( … 行… … 行… … ) )

ソース テーブルで選択された行ごとに、結果テーブルで行を作成します。静的行数から動的行数への値コンストラクターの一般化。

私はそれを試していましたが、結果は実際には合っていないようです。おそらく私のやり方が間違っているか、条件駆動型のアプローチが必要なのかもしれません。

では、上記のステートメントを表理解テクニックで書きたいとしたら、どのようになりますか?

今まで私はこれを持っていましたが、私が必要としているものではなく、それを提供していませんでした。

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                   WHERE ( col1 = 'a value' )
                                         ( col2 = 'another value' )
                                         ( col3 = space )
                                 ).

ヒントがある人はいますか?

EDIT:まだ動作していないようです。これが私がやっているようです:

実行可能な行:

ここに画像の説明を入力

デバッガーの結果:

ここに画像の説明を入力

間違った削減:

ここに画像の説明を入力

そして今何???

4

3 に答える 3

3

FILTER演算子を追加して使用EXCEPT WHEREして、where 句に一致する行を除外できます。

lt_reducedresult = FILTER # ( lt_hugeresult EXCEPT WHERE col1 = 'a value' 
                                                     AND col2 <> 'another value' 
                                                     AND col3 = 'a third value' ).

lt_hugeresultはソートされたテーブルである必要があり、col1/ col2/はキー コンポーネントである必要があることに注意してくださいcol3(追加を使用してセカンダリ キーを指定できますUSING KEY)。

FILTERのドキュメントには、次のことが明示的に記載されています。

テーブルのフィルタリングは、テーブルの内包表記またはテーブルの削減を使用して実行することもできます。また、FOR を使用したテーブルの反復の反復式もあります。演算子 FILTER は、この特殊なケースに対して短縮された形式を提供し、より効率的に実行できます。

テーブル フィルターは、行ごとに結果を構築します。結果にソース テーブルのほぼすべての行が含まれる場合、この方法は、ソース テーブルをコピーしてターゲット テーブルから余分な行を削除するよりも遅くなる可能性があります。

したがってDELETE、テーブルのサイズによっては、実際に使用するアプローチが適切な場合があります。

于 2016-02-15T10:55:52.910 に答える
1

上記の例の昔ながらの構文をテーブル内包表記法と比較したところ、まったく同じ結果が得られました。
実際には、構築された table の行指定がないため、サンプルは機能しませんreduced。私のために働いたこれを試してみてください。

DATA(reduced) =  VALUE tty_mytype( FOR checkline IN lt_hugeresult
                                WHERE ( col1 = 'a value' AND 
                                        col2 = 'another value' AND
                                        col3 = space )
                                   ( checkline )
                                 ).

上記のサンプルでは、​​ソース テーブルに完全に似ている、最も基本的なタイプの結果行指定があります。新しいテーブルの行がテーブルの反復で評価される、より洗練された例は、ここで見つけることができます。

于 2016-02-12T11:57:14.113 に答える