* 需求:查詢採購訂單項目,選擇條件:訂單號,輸出結果,行項目,物料號,公司代碼,庫存地點。
三種方式實現,註釋 部分可以單獨運行,帶程序 效率 分析。
abap 代碼:
*&---------------------------------------------------------------------*
*& Report ZYHJ20200217
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
*REPORT zyhj20200217.
*TABLES:ekpo.
*DATA: BEGIN OF t_write OCCURS 0,
* ebeln LIKE ekpo-ebeln,
* ebelp LIKE ekpo-ebelp,
* matnr LIKE ekpo-matnr,
* bukrs LIKE ekpo-bukrs,
* lgort LIKE ekpo-lgort,
* END OF t_write.
*
*SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
*
* SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln.
*
*SELECTION-SCREEN END OF BLOCK blk1.
*
*SELECT ebeln ebelp matnr bukrs lgort INTO CORRESPONDING FIELDS OF TABLE t_write
* FROM ekpo WHERE ebeln IN s_ebeln .
*LOOP AT t_write.
* WRITE:/ t_write-ebeln,t_write-ebelp,t_write-matnr,t_write-bukrs,t_write-lgort.
*ENDLOOP.
REPORT zyhj20200217 NO STANDARD PAGE HEADING LINE-SIZE 120 LINE-COUNT 65(2).
* 需求:查詢採購訂單項目,選擇條件:訂單號,輸出結果,行項目,物料號,公司代碼,庫存地點。
TABLES:ekpo,makt.
DATA: BEGIN OF i_data OCCURS 0 , "with header line
ebelp LIKE ekpo-ebelp,
matnr LIKE ekpo-matnr,
bukrs LIKE ekpo-bukrs,
lgort LIKE ekpo-lgort,
maktx LIKE makt-maktx,
END OF i_data,
t1 type i, t2 type i, t3 type i, time_1 TYPE TIMESTAMP,time_2 TYPE TIMESTAMP,time_3 TYPE TIMESTAMP.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text001.
SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln. "項目號 aaa
SELECTION-SCREEN END OF BLOCK blk1.
* PARAMETERS Company AS CHECKBOX.
* 檢查屏幕
*AT SELECTION-SCREEN.
* 程序的初始化
*INITIALIZATION.
* 開始取數據 別名
*START-OF-SELECTION.
DATA:
wcl_container type ref to cl_gui_custom_container, "存放ALV的容器
wcl_alv type ref to cl_gui_alv_grid, "ALV的網絡
gt_fieldcat type lvc_t_fcat, "存放字段目錄的內表
gs_layout type lvc_s_layo. "佈局結構
DATA:lt_sflight type table of sflight,wa_sflight type sflight.
*** 第一種分兩次單表查詢取數,第一次取完數,存在內表中,憑此數據,在循環中內表數據(物料描述),再去修改。效率比下面的方法快10倍
*get run time field t1.
* SELECT A~EBELP A~MATNR A~BUKRS A~LGORT INTO
* CORRESPONDING FIELDS OF TABLE I_DATA " 高效一點的做法 SELECT INTO CORRESPONDING TABLE
* FROM EKPO AS A WHERE A~EBELN IN s_ebeln."S_EBELN.
*
*
* SELECT MAKTX INTO I_DATA-MAKTX FROM MAKT WHERE MATNR = I_DATA-MATNR ." AND SPRAS ='E'. "加了single ,select 後面的 ENDSELECT ,就可以去掉了。
* APPEND I_DATA. " 必須用APPEND 否則,描述內容保持不上
* CLEAR I_DATA.
* ENDSELECT.
*
*GET RUN TIME FIELD t2.
*T3 = T2 - T1. " TOTAL TIME
*WRITE t3.
**** 第一種分兩次單表查詢取數,第一次取數在結構中,然後在內表中執行循環,並插入,然後APPEND,完成裏層循環,開始二次外場循環
**低效一點的做法 SELECT INTO CORRESPONDING 結構 而不是 TABLE,效率會低一點。
GET TIME STAMP FIELD time_1.
SELECT A~EBELP A~MATNR A~BUKRS A~LGORT INTO
CORRESPONDING FIELDS OF I_DATA "低效一點的做法 SELECT INTO CORRESPONDING 結構I_DATA 而不是 TABLE,效率會低一點。
" 並且上述是 I_DATA,沒有TABLE I_DATA 這樣,所以 當前SELECT 必須要 配合 ENDSELECT。
FROM EKPO AS A WHERE A~EBELN IN s_ebeln."S_EBELN.
SELECT MAKTX INTO I_DATA-MAKTX FROM MAKT WHERE MATNR = I_DATA-MATNR ." AND SPRAS ='E'. "加了single ,select 後面的 ENDSELECT ,就可以去掉了。
APPEND I_DATA. " 必須用APPEND 否則,數據保持不上
CLEAR I_DATA.
ENDSELECT.
ENDSELECT.
*
GET TIME STAMP FIELD time_2.
time_3 = time_2 - time_1. " TOTAL TIME 秒內計數不起作用。
Write: / 'The short time stamp is:', time_1 . "TIME ZONE SY-ZONLO.
Write: / 'The short time stamp is:', time_2 . "TIME ZONE SY-ZONLO.
WRITE time_1.
WRITE time_2.
WRITE time_3.
WRITE /.
"""第二種兩個表關聯取出得數據到結構,然後循環寫到內表中,不是最好的辦法,已經無問題,除分頁,,
*get run time field t1.
* SELECT a~ebelp "採購憑證號
* a~matnr "物料
* a~bukrs "工廠
* a~lgort "庫位
* b~maktx "物料描述
* INTO
* (i_data-ebelp,i_data-matnr,i_data-bukrs,i_data-lgort,i_data-maktx) FROM ekpo AS a
* JOIN makt AS b ON a~matnr = b~matnr WHERE a~ebeln IN s_ebeln . " AND b~spras = 'E'.
* APPEND i_data.""這裏APPENDB是必須的,否則保存不到內表裏面。
* CLEAR i_data.
* ENDSELECT.
* GET RUN TIME FIELD t2.
*T3 = T2 - T1. " TOTAL TIME
*WRITE t3.
* 第二種方法兩個表關聯的第2種方法(效率最高的做法),用:CORRESPONDING FIELDS OF 帶 TABLE I_DATA
******說明: select into corespond 不帶 TABLE ,採購訂單號:3100000003 有結果,且物料描述有值,達到目的,除了分頁問題 和 物料描述換行問題外,沒有問題。
*get run time field t1.
* SELECT A~EBELP A~MATNR A~BUKRS A~LGORT b~maktx INTO
* CORRESPONDING FIELDS OF TABLE I_DATA "CORRESPONDING FIELDS OF TABLE 這個table 不能去掉,否則就不是高效的做法了。
* FROM EKPO AS A JOIN makt AS b ON a~matnr = b~matnr WHERE A~EBELN IN S_EBELN.
*GET RUN TIME FIELD t2.
*T3 = T2 - T1. " TOTAL TIME
*WRITE t3.
***** 第三種方法 單表取出數據放入內表 select into corespond TABLE ,再用LOOP 循環 開啓 查詢 ,查到數據,再借用循環修改數據,耗時貌似最長時間
***** 第一個表取值不直接放入TABLE,放入結構後用另外的SQL語句取物料描述,最後append到內表。
*get run time field t1.
* SELECT A~EBELP A~MATNR A~BUKRS A~LGORT INTO
* CORRESPONDING FIELDS OF TABLE I_DATA "CORRESPONDING FIELDS OF TABLE 這個table 必須去掉
* FROM EKPO AS A WHERE A~EBELN IN S_EBELN.
** *** 修改數據
* LOOP AT i_data.
* SELECT single maktx into i_data-maktx
* from makt where matnr = i_data-matnr .
* " modify i_data." 去掉也沒關係
* clear i_data. " 加了保險一些。
* endloop.
*GET RUN TIME FIELD t2.
*T3 = T2 - T1. " TOTAL TIME
*WRITE t3.
****** 第三種方法end
loop at i_data.
NEW-LINE.
write : at 1 '|' no-gap,i_data-ebelp left-justified,
at 21 '|' no-gap,i_data-MATNR left-justified,
at 30 '|' no-gap,i_data-BUKRS left-justified,
at 41 '|' no-gap,i_data-LGORT left-justified,
at 51 '|' no-gap,i_data-maktx left-justified,
at 90 '|' no-gap.
NEW-LINE.
uline at 1(90).
endloop.
* 定義表頭
TOP-OF-PAGE.
WRITE:50 '測試程序表頭'.
NEW-LINE.
NEW-LINE.
WRITE: AT 1 '|' NO-GAP,'項目號' LEFT-JUSTIFIED,
AT 21 '|' NO-GAP,'物料編碼' LEFT-JUSTIFIED,
AT 30 '|' NO-GAP,'工廠' LEFT-JUSTIFIED,
AT 41 '|' NO-GAP,'庫位' LEFT-JUSTIFIED,
AT 51 '|' NO-GAP,'物料描述' LEFT-JUSTIFIED ,
AT 90 '|' NO-GAP.
NEW-LINE.
ULINE AT 1(90).
INCLUDE zyhj20200217_status_9000o01.