ABAP 報表開發例項

iteye_20827發表於2010-06-11

在這裡我給初學者示範一個例項,講講abap開發報表的簡單過程。程式的正確與
否我們不與討論,我們只關心這個程式的編寫過程。
首先,在任何程式的開始階段,我們都要確定將會用到的表。我們所講的這個程式
是查詢採購訂單是否完成的。將會用到以下三個表:EKKO,EKPO,EKET。
程式的開頭為:
REPORT  TEST.
TABLES:  EKKO,EKET,EKPO.
現在我們已經定義了所要用到的表,接下來的工作就是定義內表和資料。內表是
用來儲存我們從上述三個表中查詢到的資料。相關定義如下:
DATA: BEGIN OF ITAB OCCURS 0,
          EBELN LIKE EKKO-EBELN,
          MENGE LIKE EKPO-MENGE,
          WEMNG LIKE EKET-WEMNG,
     END OF ITAB.
現在我們已經定義完了內表ITAB。接著我們該定義資料了。資料就像C語言裡的
常量。其相關定義如下:
DATA: MATNR  LIKE EKPO-MATNR,
     MENGE  LIKE EKPO-MENGE,
     WEMNG  LIKE EKET-WEMNG,
     EBELN  LIKE EKPO-EBELN.
到這裡我們已經把程式裡要用到的資料和內表都定義好了。接著我們要做的工作
就是選擇螢幕。所謂選擇螢幕是指程式執行時,你要從螢幕上輸入的內容。比如
說一個程式執行時,你輸入一個物料號,就可以得到該物料的當前的庫存數,那
你就要編寫一個螢幕以供查詢者輸入查詢的條件。其相關定義如下:
SELECT-OPTIONS:     EBELN1 FOR  EKKO-EBELN,
                    BEDAT FOR  EKKO-BEDAT,
                    EKGRP FOR  EKKO-EKGRP.
PARAMETERS: R1 RADIOBUTTON GROUP RADI,
            R2 RADIOBUTTON GROUP RADI,
            R3 RADIOBUTTON GROUP RADI.
現在我們已經完成了程式的前期準備,接著就開始真正的到表裡查詢我們需要的
相關資料了。其程式碼如下:
SELECT  K~EBELN
         INTO CORRESPONDING FIELDS OF TABLE ITAB
                FROM EKKO AS K
      WHERE   K~EBELN IN EBELN1
        AND   K~BEDAT IN BEDAT
        AND   K~EKGRP IN EKGRP.

LOOP AT ITAB.
   SELECT SUM( MENGE ) INTO ITAB-MENGE
         FROM EKPO
              WHERE EBELN EQ ITAB-EBELN.
         MODIFY ITAB.
ENDLOOP.

LOOP AT ITAB.
   SELECT SUM( WEMNG ) INTO ITAB-WEMNG
         FROM EKET
              WHERE EBELN EQ ITAB-EBELN.
         MODIFY ITAB.
ENDLOOP.
然後我們需要定義輸出介面。把我們查詢到的資料輸出時要有一個輸出的格式,
這樣大家看起來才會方便。程式碼如下:
TOP-OF-PAGE .
   WRITE: /'採購憑證號',22 '物料號碼',
           47 '採購訂單數量',77  '收到貨物數量',
           95 '完成標誌'.
      ULINE AT /1(130).
END-OF-PAGE .

       START-OF-SELECTION.
最後就是把我們查到的資料輸出了。其實我舉的這個程式到這一步時穿插了
一些查詢,所以比較長。程式碼如下:
  IF R1 = 'X'.
LOOP AT ITAB.
            SELECT S~MATNR S~MENGE P~WEMNG S~EBELN
              INTO (MATNR, MENGE, WEMNG, EBELN)
    FROM EKPO AS S INNER JOIN EKET AS P
                           ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
                   WHERE S~EBELN = ITAB-EBELN.
    IF ITAB-MENGE > ITAB-WEMNG.
            WRITE: /2 EBELN,23 MATNR,41 MENGE,
                    71 WEMNG,97 '否'.
          ULINE AT /1(130).
            CLEAR: EBELN,MATNR,MENGE,WEMNG.
    ENDIF.
            ENDSELECT.
ENDLOOP.

    ELSEIF R2 = 'X'.
LOOP AT ITAB.
             SELECT S~MATNR S~MENGE P~WEMNG S~EBELN
              INTO (MATNR, MENGE, WEMNG, EBELN)
      FROM EKPO AS S INNER JOIN EKET AS P
                           ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
                   WHERE S~EBELN = ITAB-EBELN.
    IF  ITAB-MENGE <= ITAB-WEMNG.
             WRITE: /2 EBELN,23 MATNR,41 MENGE,
                    71 WEMNG,97 '是'.
             ULINE AT /1(130).
            CLEAR: EBELN,MATNR,MENGE,WEMNG.
    ENDIF.
             ENDSELECT.
ENDLOOP.

    ELSE.
LOOP AT ITAB.

           SELECT S~MATNR S~MENGE P~WEMNG S~EBELN
              INTO (MATNR, MENGE, WEMNG, EBELN)
    FROM EKPO AS S INNER JOIN EKET AS P
                           ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
                   WHERE S~EBELN = ITAB-EBELN.
    IF ITAB-MENGE > ITAB-WEMNG.
            WRITE: /2 EBELN, 23 MATNR,41 MENGE,
                    71 WEMNG,97 '否'.
          ULINE AT /1(130).
            CLEAR: EBELN,MATNR,MENGE,WEMNG.
    ENDIF.
            ENDSELECT.
  ENDLOOP.
ENDIF.

LOOP AT ITAB.
IF R3 = 'X' AND ITAB-MENGE <= ITAB-WEMNG.
           SELECT S~MATNR S~MENGE P~WEMNG S~EBELN
              INTO (MATNR, MENGE, WEMNG, EBELN)
    FROM EKPO AS S INNER JOIN EKET AS P
                           ON S~EBELP = P~EBELP AND S~EBELN = P~EBELN
                   WHERE S~EBELN = ITAB-EBELN.
       WRITE: /2 EBELN,23 MATNR,41 MENGE,
                    71 WEMNG,97 '是'.
          ULINE AT /1(130).
            CLEAR: EBELN,MATNR,MENGE,WEMNG.
            ENDSELECT.
        ENDIF.
ENDLOOP.
這時程式就結束了。其實舉這個例子是想讓大家知道ABAP開發報表的一個常規
流程,並不是講什麼技巧之類的,希望能對初學者有點用。拋磚引玉!

相關文章