2016-03-22 14 views
2

コンサルタントが、このコード例を私に送ってください。ABAPプログラムのネストされたsql-query

SELECT m1~vbeln_im m1~vbelp_im m1~mblnr smbln  
    INTO CORRESPONDING FIELDS OF TABLE lt_mseg 
    FROM mseg AS m1 
    INNER JOIN mseg AS m2 ON m1~mblnr = m2~smbln 
         AND m1~mjahr = m2~sjahr 
         AND m1~zeile = m2~smblp 
    FOR ALL ENTRIES IN lt_vbfa 
    WHERE 
     AND m2~bwart = '102' 
     AND 0 = (select SUM((CASE 
     when SHKZG = 'S' THEN 1 
     when SHKZG = 'H' THEN -1 
     else 0 
     END) *MENGE) MENGE 
     into lt_mseg-summ 
     from mseg 
     where 
     VBELN_IM = m1~vbeln_im 
     and VBELP_IM = m1~vbelp_im 
     ). 

問題 - 私はそれが現在の構文でどのように動作するのか見当たりませんでした。私は内部の選択を分離し、それをメインの条件として使うことを考えます...しかし、この入れ子構造を書く正しい方法はありますか? P.P.私はそれを得る - ネストされたステートメントが0の場合、メインクエリが実行され、ネストされたステートメント内の問題がABAPでも可能ですか?そして、このチェックはメインのSQLクエリーから外部で使用できるという論理が決まります。しかし、私はABAPにとってかなり初心者なので、他の可能な説明の余地を残しています。

+1

あなたの意図+あなたが直面していること+あなたが何をするまで何をしたのかを明確に説明します。 –

+0

私はそれを得る - ネストされたステートメントが0の場合、メインクエリが実行され、ネストされたステートメント内の問題がABAPでも可能ですか?そして、このチェックはメインのSQLクエリーから外部で使用できるという論理が決まります。しかし、私はABAPにとってかなり初心者なので、他の可能な説明の余地を残しています。 – AlexanderK

+1

あなたの質問を編集してください(あなたのPOSTにこの情報を追加してください)。 –

答えて

2

あなたが与えたロジックはネイティブ/オープンSQLの一部であり、意識する必要があるいくつかの欠点があります。

  1. 表示する文は、EXEC SQLとENDEXECの間に配置する必要があります。
  2. ロジックはプラットフォームによって異なります。
  3. 何の構文チェックこれを実行するには、データベース・バッファリング・プロセスをバイパス
  4. EXECとENDEXECの間でその私に

遅く、私はデータをキャプチャするためのより良い方法を検討するだろうので、行ってはありませんオープン/ネイティブSQL以外の方が優れたパフォーマンスを発揮します。

このタイプのロジックで前進したい場合は、以下の2つのリンクを参考にしてください。 caseステートメントでネストされたselectを使用するselectの例があります。 Test Program Example Logic