2013-03-01 38 views
-1

我的問題:SAP ABAP - 與對照表處理

我「循環」在一個表到一個名爲ls_eban局部結構..

,並與這些信息,我必須遵循以下步驟:

  1. ls_eban-MATNR 必須是在zmd_scmi_st01(1控制表(全局))
  2. ls_eban-WERKS 必須在zmd_scmi_st05( 2.控制表(全局))
  3. ls_eban-knttp 必須是在zmd_scmi_st06(3控制表(全局))

我需要一個選擇是清楚和高性能的。我其實有一個,但它根本就不是高性能的。

我的解決辦法:

SELECT st01~matnr st05~werks st06~knttp 
    FROM  zmd_scmi_st01 AS st01 
    INNER JOIN zmd_scmi_st05 AS st05 
    ON   st05~werks = ls_eban-werks 
    INNER JOIN zmd_scmi_st06 AS st06 
    ON   knttp = ls_eban-knttp 
INTO TABLE lt_control 
WHERE  st01~matnr = ls_eban-matnr AND st01~bedarf = 'X' 
    AND  st05~bedarf = 'X'. 

我也不得不說,該控制表不具有任何彼此關係(沒有主鍵和無二次鍵)。

+1

您能向我們展示一個完整的代碼示例以及所涉及的所有表的結構嗎?我只能猜測你的問題可能是什麼,並且你不想要一個純粹猜測的「答案」...... – vwegert 2013-03-01 14:01:14

+1

如果3個控制表彼此沒有關係,你不應該加入他們。爲每個規則分開選擇。同樣由於控制表的性質,它們通常是相對較小的表,因此您可以將每個表中的所有條目選擇到單獨的內部表中,然後在循環內部進行讀取。 – Esti 2013-03-02 02:08:49

回答

0

你不應該做的第一件事是在循環內部有select。而不是

loop at lt_eban into ls_eban. 
     Select .... 
endloop. 

你應該做一個選擇。

if lt_eban[] is not initial. 
    select ... 
    into table ... 
    from ... 
     for all entries in lt_eban 
    where ... 
endif. 

可能有更多的低效率,如果我們有更多的信息來進行校正(如在由vwegert註釋中。例如,在控制表真的沒有鑰匙?),但在一個循環的選擇是第一跳到我身上的東西。

+0

感謝您的回覆。 其實在循環選擇工程:) 但我會嘗試用自己的方式.. 下星期一因爲現在我回家了:再次 感謝d :)非常友好! – 2013-03-01 14:38:40