5

既存のプログラムの CASE ステートメントを変更しているときに、NetWeaver ポータル設定を設定するためにいくつかのロジックが繰り返される 2 番目のブロックを追加する必要がありました。これは、ローカル変数に値を設定し、その変数を Changing パラメータに割り当てることによって行われます。コードをコピーしてプリティ プリントを実行し、コンパイラが不明な変数について文句を言うことを期待しました。しかし驚いたことに、このコードは実際には問題なくコンパイルされます。

CASE i_actionid.
    WHEN 'DOMIGO'.
        DATA:   ls_portal_actions  TYPE powl_follow_up_sty.
        CLEAR ls_portal_actions.
        ls_portal_actions-bo_system = 'SAP_ECC_Common'.
        " [...]
        c_portal_actions = ls_portal_actions.
    WHEN 'EBELN'.
        ls_portal_actions-bo_system = 'SAP_ECC_Common'.
        " [...]
        C_PORTAL_ACTIONS = ls_portal_actions.
ENDCASE.

他のすべてのプログラミング言語で見たようDATA:に、最初のWHENステートメントの宣言はカプセル化して、その switch ブロック内でのみ使用できるようにする必要があります。SAP はこのカプセル化を無視して、その値を CASE ステートメント全体で使用できるようにしますか? これはどこかに文書化されていますか?

このコードは正常にコンパイルされ、2 番目のスイッチでローカル変数をダブルクリックすると、最初のデータ宣言に移動することに注意してください。ただし、テスト環境がダウンしているため、このコードが正しく実行されることをテストできませんでした。

4

3 に答える 3

9

要するに、これを行うことはできません。abap プログラムには、変数を宣言する (ローカルからグローバルへの) 次のスコープがあります。

  • フォーム ルーチン: FORM と ENDFORM の間のすべての変数
  • メソッド: METHOD と ENDMETHOD の間のすべての変数
  • クラス - CLASS と ENDCLASS の間のすべての変数 (ただし CLASS DEFINITION セクションのみ)
  • 汎用モジュール: FUNCTION と ENDFUNCTION の間のすべての変数
  • プログラム/グローバル - 上記のいずれにもないものはすべて、PBO および PAI モジュールの変数を含む現在のプログラムでグローバルです

for ループまたは if でローカルに変数を定義できる機能は非常に便利ですが、残念ながら ABAP では不可能です。これに関する公開ドキュメントに最も近いのは、help.sap.comのサブルーチンのローカル データです。

コンパイル プロセスに関しては、使用しない変数が ABAP によって最適化されるとは想定しないでください。コード インスペクタを使用して自分でそれらを見つけて削除してください。ABAP はそのように動作するため、モジュール化ユニットの開始時にすべての変数を個人的に定義し、他のコードとインラインではなく、プリティ プリンターを変更してインライン定義を現在のスコープの先頭に移動するところまで行っています。

于 2013-10-30T15:59:30.350 に答える