SAP 內表 結構 綜合練習 abap,一個需求,三種方式實現,註釋 部分可以單獨運行,帶程序 效率 分析。

* 需求:查詢採購訂單項目,選擇條件:訂單號,輸出結果,行項目,物料號,公司代碼,庫存地點。

三種方式實現,註釋 部分可以單獨運行,帶程序 效率 分析。

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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章