ABAP 動態 SQL

leniz發表於2008-12-02

   ABAP的sql語句是可以動態生成的,這個特性可以帶給我們很多的便利。 比如SAP對費用的儲存結構可能會採用 將會計月作為欄位的情況,及 period001,period002。。。等這樣方式來儲存值。 通常取這樣的值都是採用 Case when的方式或 If--else 等語句選擇不同的執行語句獲取不同列的值。 這樣的處理方式無形中增加了程式碼的行數,而實際上除了數值列不一樣之外,其他列都是一樣的,如果這時候採用 動態SQL ,就可以大大簡化程式碼。

格式:

SELECT (column_syntax) FROM (dbtab_syntax)

其中:
 
column_syntax
can be a character-type data object or an internal table with a character-type data type(可以是字串,也可以一個字元型別欄位的內表)
 dbtab_syntax can be a character-type data object or an internal table with a character-type data object(可以是字串,也可以一個字元型別欄位的內表)

使用前處理方式:

If Period = ‘001’.
      select obj wk001 from tableName
      into .......
      where con.
        .......
    Endselect.
ElseIf  Period  = '002'.
      select obj  wk002  from tableName
     into ......
      where con.
         .......
    Endselect.
ElseIf .....

Endif.

使用動態處理:
data_key = 'wk'.
concatenate data_key  period into  data_key separated by space.
concatenate ' obj ' data_key into column_syntax separated by space

select (column_syntax) From tableName
into ....
where con.
.........
Endselect.

應該說程式碼是有明顯簡化的。

有人會有效能方面的猶豫,我做過測試,不影響,甚至還快一些。

搜尋了一下網路,發現更多的資料:

ABAP動態查詢的實現:可以完全實現動態查詢,每個欄位都可以動態。

(1) 利用巨集

(2) 利用abap指標

(3 利用FIELD-SYMBOL

具體實現:

1.結構的動態查詢

DEFINE Select_DATA_TO_WA.

Select &1

FROM &2

INTO CORRESPONDING FIELDS OF &3

Where (&4).

EXIT.

ENDSelect.

END-OF-DEFINITION.

 

2.變數的動態查詢

DEFINE Select_DATA_TO_VARIANT.

Select &1

FROM &2

INTO &3

Where (&4).

EXIT.

ENDSelect.

END-OF-DEFINITION.

 

3.內表的動態查詢

DEFINE Select_DATA_TO_VARIANT.

Select &1

FROM &2

INTO CORRESPONDING FIELDS OF TABLE &3

Where (&4).

EXIT.

ENDSelect.

END-OF-DEFINITION.

 

具體程式實現:

 

DATA: L_FIELD(100) TYPE C,

 

 

L_TABLE(10) TYPE C,

L_COND(100) TYPE C.

DATA: I_COND TYPE TALBE OF L_COND.

FIELD-SYMBOLS TYPE ANY.

START-OF-Selection.

CONCATENATE CARRID CONNID CITYFROM

INTO L_S SEPARATE BY SPACE.

CONCATENATE CONNID = ‘’ 0123 ‘’’’ INTO L_COND.

APPEND COND TO I_COND.

L_TABLE = SPFLI.

IF IS ASSIGNED.

UNASSIGN .

ASSIGN SPFLI TO .

ELSE.

ASSIGN SPFLI TO .

ENDIF.

Select_DATA_TO_WA (L_S) (L_TABLE) I_COND.

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/554557/viewspace-504368/,如需轉載,請註明出處,否則將追究法律責任。

相關文章