ABAP基礎一:ALV基礎之ALV的總體結構

好久沒摸ECC了,最近看到不少新人在捯飭ALV。。。中國就喜歡量產垃圾。。。培訓,上崗。。。沒有行業道德。。。運維

閒話很少說,開始正事:模塊化

ALV很常見,在SAP非WEB的項目,沒有不用的,它包含了報表和功能的特色,是最容易接受的交互界面。函數

ALV大致說明:通常一個報表或者一些小功能,會用到‘查詢界面’‘數據處理’‘數據展現’‘人機交互’等。這是循序進漸的,也是兩兩相交的。優化

ALV程序結構說明:通常的都是有邏輯的順序:‘數據定義’,‘定義屏幕’,‘數據查詢和處理’,‘數據顯示’,‘事件處理’等。編碼

根據上面的結構有的人喜歡定義4個INCLUDE(這是參考DIALOG程序的),有的就是一個Report 到底。常常也有些人會討論哪一種怎麼怎麼樣,其實,看開發的習慣,SAP的INCLUDEspa

和FORM是爲了複用和代碼結構化,分多個INCLUDE模塊化程序,易於查找。而REPORT到底的(通常經驗高的人會用),會在開頭部分處理好總體的結構,而後每部分的邏輯在FORM裏處理,這樣的好處是邏輯清晰,易於查找問題。(這段是廢話,能夠忽略,意見不一樣能夠評論^_^)設計

下面一個一個來:(邏輯,邏輯,邏輯,沒邏輯的人,請轉行)code

數據定義:越簡單的報表,越是須要用最複雜的東西來作。orm

1.熟悉使用TYPE定義結構,爲何要用TYPE定義結構?呵呵,這個問題不想討論:以下:對象

TYPES:BEGIN OF TY_DETAIL, OBJNR TYPE AUFK-OBJNR, "對象號
        MATNR   TYPE AFPO-MATNR, "產品編碼
        KTEXT   TYPE AUFK-KTEXT, "產品描述
        AUFNR   TYPE AUFK-AUFNR, "工單編號
        GAMNG   TYPE AFKO-GAMNG, "工單產量
        MATNX   TYPE RESB-MATNR, "BOM物料編碼
        MAKTX   TYPE MAKT-MAKTX, "bom物料描述
        VORNR   TYPE RESB-VORNR, "工序
        LTXA1   TYPE AFVC-LTXA1, "工序短文本
        KSTAR   TYPE COVP-KSTAR, "成本要素
        LTEXT   TYPE CSKU-LTEXT, "成本要素
        BDMNG   TYPE RESB-BDMNG, "BOM計劃數量
        ENMNG   TYPE RESB-ENMNG, "BOM實際數量
      END OF TY_DETAIL,

不要以爲這樣定義很麻煩又不能複用等等,去SE11建的結構,只有你本身會用,並且還會有相互影響的問題,直接用表(除非字段不多的表)都是浪費系統資源。

不少人都會說優化程序要怎麼樣怎麼樣,程序裏TYPE定義結構,最小化內表字段 會很大程度上減小系統和電腦自己的負荷。

2.參考結構定義內表

參照上面定義的結構,定義須要的內表。(根據須要用到的內表,先定義結構,而後參考結構定義內表)

DATA:GT_DETAIL TYPE TABLE OF TY_DETAIL, GT_DETAIX TYPE TABLE OF TY_DETAIL.

我喜歡用一個DATA加上冒號和逗號,把全部的數據定義所有放一塊兒,由於SAP的代碼美化是在同一個冒號引出的部分,每一個都用DATA定義,代碼美化徹底沒用。

有些人建議多使用局部變量,少用全局變量,這樣也是一種減負的方法,可是這樣程序裏就會多出不少臨時的變量,對於後期修改不利。而使用全局變量的,請注意不須要的時候清空變量,運行程序的一個百萬數量級的內表和一個空內表,讓你使用的時候感受都會不同的。

3.定義選擇屏幕:

這部分看我的習慣和客戶需求,有的會在屏幕上作設計,怎麼排版什麼的,我就不喜歡這樣,就直接幾個BOLCK,區分一下搜索方式,而後所有使用SELECT-OPTIONS

須要單值的就 NO INTERVALS NO-EXTENSION加上。由於程序最後解析SELECT的時候會把單值的RANGE轉變成一個‘等於’值的查詢,這和使用PARAMETERS是同樣的。

SELECTION-SCREEN:BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS:S_BUKRS FOR COVP-BUKRS DEFAULT '1000'. SELECT-OPTIONS:S_GJAHR FOR COVP-GJAHR OBLIGATORY NO INTERVALS NO-EXTENSION DEFAULT SY-DATUM+0(4). SELECT-OPTIONS:S_PERIO FOR COVP-PERIO DEFAULT SY-DATUM+4(2). SELECT-OPTIONS:S_MATNR FOR COVP-MATNR. SELECT-OPTIONS:S_AUFNR FOR AUFK-AUFNR. SELECTION-SCREEN END OF BLOCK BLK01.

4.數據查詢和數據處理:

針對特定的表或者表關聯作查詢。

AT SELECTION-SCREEN. IF  sy-ucomm =  'ONLI'. SELECT  *
  INTO CORRESPONDING FIELDS OF  TABLE GT_T001 FROM  T001  WHERE  BUKRS IN s_bukrs AND  KTOPL =   '1000'
  AND SPRAS = 1. LOOP AT  GT_T001  INTO Gs_T001. AUTHORITY-CHECK OBJECT 'ZFI_BUKRS' ID 'BUKRS' FIELD Gs_T001-BUKRS. IF SY-SUBRC <> 0 . MESSAGE '您沒有分配公司代碼' && Gs_T001-BUKRS && '權限,請檢查' TYPE  'E'. ENDIF . ENDLOOP. ENDIF. START-OF-SELECTION. PERFORM PRM_GET_MAIN. PERFORM PRM_PROCE_DATA. PERFORM PRM_SET_FIELD. PERFORM PRM_SHOW.

我這是一個REPORT到底的,對於後面修改或者運維來講,只須要看到這裏就能夠了,到這裏整個程序的結構已經出來了。針對每一個點的修改均可以直接找到了,這就是用REPORT到底的好處。權限檢查這個對於那種變態公司來講是必須的,對於通常公司來講就無關緊要了。

START-OF-SELECTION.裏分紅四個FORM,一個取數,一個處理數據,一個設置顯示樣式,一個調函數展現。

(SAP出了不少新的語法,我都不習慣,我以爲以前的這種就很好,每次出現問題,均可以DEBUG,很明確的找到問題)

留個範文吧^_^

*&---------------------------------------------------------------------* *& Report ZFIR025 *& *&---------------------------------------------------------------------* *& *&DESC :憑證實細表 * *&AUTHOR: LY *& *&DATE:20160721 *& *& *&CHANGE LIST *& C DEVK901712 2016.07.21 08:11:04 LIYUAN *& C DEVK901869 2016.08.22 15:37:14 LIYUAN 增長本幣金額 *&---------------------------------------------------------------------*

REPORT ZFIR025. TABLES:BKPF,BSEG,SKAT. TYPES:BEGIN OF TY_SHOW, MONAT TYPE BKPF-MONAT, BUDAT TYPE BKPF-BUDAT, BELNR TYPE BKPF-BELNR, BUKRS TYPE BKPF-BUKRS, BKTXT TYPE BKPF-BKTXT, GJAHR TYPE BKPF-GJAHR, BLART TYPE BKPF-BLART, WAERS TYPE BKPF-WAERS, USNAM TYPE BKPF-USNAM, AWKEY TYPE BKPF-AWKEY, HKONT TYPE BSEG-HKONT, KUNNR TYPE BSEG-KUNNR, LIFNR TYPE BSEG-LIFNR, KOSTL TYPE BSEG-KOSTL, FKBER TYPE BSEG-FKBER, WRBTR TYPE BSEG-WRBTR, WRBTRS TYPE BSEG-WRBTR, WRBTRH TYPE BSEG-WRBTR, SHKZG TYPE BSEG-SHKZG, MATNR TYPE BSEG-MATNR, MAKTX TYPE MAKT-MAKTX,       "added by stw 20170822
        XNEGP  TYPE BSEG-XNEGP, RSTGR TYPE BSEG-RSTGR, "緣由代碼
        TXT40  TYPE T053S-TXT40, "緣由代碼文本
        LTEXT  TYPE CSKT-LTEXT, "成本中心文本
        DMBTR  TYPE BSEG-DMBTR, DMBTRS TYPE BSEG-DMBTR, DMBTRH TYPE BSEG-DMBTR, TXT50 TYPE SKAT-TXT50, GSBER TYPE BSEG-GSBER, AUFNR type bseg-AUFNR, "add by yin
      END OF TY_SHOW, BEGIN OF TY_T053S, RSTGR TYPE BSEG-RSTGR, "緣由代碼
        BUKRS TYPE BSEG-BUKRS, "緣由代碼
        TXT40 TYPE T053S-TXT40, "緣由代碼文本
      END OF TY_T053S, BEGIN OF TY_CSKT, KOSTL TYPE BSEG-KOSTL, "緣由代碼
        LTEXT TYPE CSKT-LTEXT, "緣由代碼文本
      END OF TY_CSKT. DATA:GT_SHOW TYPE TABLE OF TY_SHOW, GW_SHOW LIKE LINE OF GT_SHOW, GT_T053 TYPE TABLE OF TY_T053S, GW_T053 LIKE LINE OF GT_T053, GT_CSKT TYPE TABLE OF TY_CSKT, GW_CSKT LIKE LINE OF GT_CSKT. DATA:GT_FIELDCAT TYPE LVC_T_FCAT. DATA GS_FIELDCAT LIKE LINE OF GT_FIELDCAT. DATA LS_LAYOUT TYPE LVC_S_LAYO. DATA:GT_T001 TYPE STANDARD TABLE OF T001, GS_T001 TYPE T001. DEFINE APPEND_FIELDCAT . CLEAR GS_FIELDCAT. GS_FIELDCAT-FIELDNAME = &1. GS_FIELDCAT-SCRTEXT_L = &2. GS_FIELDCAT-OUTPUTLEN = &3. GS_FIELDCAT-NO_ZERO = &4. APPEND GS_FIELDCAT TO GT_FIELDCAT. END-OF-DEFINITION. SELECTION-SCREEN:BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS:S_BUKRS FOR BKPF-BUKRS DEFAULT '1000'. SELECT-OPTIONS:S_GJAHR FOR BKPF-GJAHR DEFAULT SY-DATUM+0(4). SELECT-OPTIONS:S_MONAT FOR BKPF-MONAT DEFAULT SY-DATUM+4(2). SELECT-OPTIONS:S_BELNR FOR BKPF-BELNR. SELECT-OPTIONS:S_HKONT FOR BSEG-HKONT. SELECT-OPTIONS:S_KUNNR FOR BSEG-KUNNR. SELECT-OPTIONS:S_LIFNR FOR BSEG-LIFNR. SELECT-OPTIONS:S_KOSTL FOR BSEG-KOSTL MATCHCODE OBJECT ZSKAT. SELECT-OPTIONS:S_BLART FOR BKPF-BLART. SELECT-OPTIONS:S_BUDAT FOR BKPF-BUDAT. SELECT-OPTIONS:S_GSBER FOR BSEG-GSBER. SELECTION-SCREEN END OF BLOCK BLK01. AT SELECTION-SCREEN. IF  sy-ucomm =  'ONLI'. SELECT  *
  INTO CORRESPONDING FIELDS OF  TABLE GT_T001 FROM  T001  WHERE  BUKRS IN s_bukrs AND  KTOPL =   '1000'
  AND SPRAS = 1. LOOP AT  GT_T001  INTO Gs_T001. AUTHORITY-CHECK OBJECT 'ZFI_BUKRS' ID 'BUKRS' FIELD Gs_T001-BUKRS. IF SY-SUBRC <> 0 . MESSAGE '您沒有分配公司代碼' && Gs_T001-BUKRS && '權限,請檢查' TYPE  'E'. ENDIF . ENDLOOP. ENDIF. START-OF-SELECTION. PERFORM PRM_GET_DATA. PERFORM PRM_PROCE_DATA. PERFORM PRM_SET_FIELD. PERFORM PRM_SHOW. *&---------------------------------------------------------------------* *& Form PRM_GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------*
FORM PRM_GET_DATA . SELECT BKPF~MONAT" TYPE BKPF-MONAT,
          BKPF~BUDAT" TYPE BKPF-BUDAT,
          BKPF~BELNR" TYPE BKPF-BELNR,
          BKPF~BUKRS" TYPE BKPF-BUKRS,
          BKPF~BKTXT" TYPE BKPF-BKTXT,
          BKPF~GJAHR" TYPE BKPF-GJAHR,
          BKPF~BLART" TYPE BKPF-BLART,
          BKPF~WAERS" TYPE BKPF-WAERS,
          BKPF~USNAM" TYPE BKPF-USNAM,
          BKPF~AWKEY" TYPE BKPF-USNAM,
          BSEG~HKONT" TYPE BSEG-HKONT,
          BSEG~KOSTL" TYPE BSEG-HKONT,
          BSEG~KUNNR" TYPE BSEG-HKONT,
          BSEG~LIFNR" TYPE BSEG-HKONT,
          BSEG~FKBER" TYPE BSEG-HKONT,
          BSEG~WRBTR" TYPE BSEG-WRBTR,
          BSEG~MATNR" TYPE BSEG-WRBTR,
          BSEG~SHKZG" TYPE BSEG-WRBTR,
          BSEG~XNEGP" TYPE BSEG-WRBTR,
          BSEG~RSTGR" TYPE BSEG-RSTGR,
 BSEG~DMBTR SKAT~TXT50" TYPE SKAT-TXT50,
 BSEG~GSBER bseg~AUFNR "add by yin
    INTO CORRESPONDING FIELDS OF TABLE GT_SHOW FROM BKPF INNER JOIN BSEG ON BKPF~BUKRS = BSEG~BUKRS AND BKPF~BELNR = BSEG~BELNR AND BKPF~GJAHR = BSEG~GJAHR INNER JOIN SKAT ON BSEG~HKONT = SKAT~SAKNR AND SKAT~SPRAS = '1'
    AND SKAT~KTOPL = '1000'
    WHERE BKPF~BUKRS IN S_BUKRS AND   BKPF~GJAHR IN S_GJAHR AND   BKPF~MONAT IN S_MONAT AND   BKPF~BELNR IN S_BELNR AND   BSEG~HKONT IN S_HKONT AND   BSEG~KUNNR IN S_KUNNR AND   BSEG~LIFNR IN S_LIFNR AND   BSEG~KOSTL IN S_KOSTL AND   BSEG~GSBER IN S_GSBER AND   BKPF~BLART IN S_BLART AND   BKPF~BUDAT IN S_BUDAT. IF GT_SHOW[] IS INITIAL. MESSAGE '無結果!' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ELSE. SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_T053 FROM T053S WHERE SPRAS = '1'. SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_CSKT FROM CSKT WHERE SPRAS = '1' AND KOKRS = '1000'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form PRM_PROCE_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------*
FORM PRM_PROCE_DATA . DATA:GS_SHOW LIKE LINE OF GT_SHOW. * SORT GT_SHOW BY BUKRS GJAHR BELNR KUNNR DESCENDING LIFNR DESCENDING." HKONT DESCENDING.

  LOOP AT GT_SHOW INTO GW_SHOW. * IF GW_SHOW-XNEGP = 'X'. * GW_SHOW-DMBTR = GW_SHOW-DMBTR * -1. * ENDIF.
    IF GW_SHOW-HKONT = '0002202002' AND GW_SHOW-LIFNR IS INITIAL."應付暫估 帶出供應商
      SELECT SINGLE LIFNR INTO GW_SHOW-LIFNR FROM BSEG WHERE BUKRS = GW_SHOW-BUKRS AND BELNR = GW_SHOW-BELNR AND GJAHR = GW_SHOW-GJAHR AND LIFNR <> ''. ENDIF. IF GW_SHOW-HKONT = '0001406001' AND GW_SHOW-KUNNR IS INITIAL."應付暫估 帶出供應商
      SELECT SINGLE KUNNR INTO GW_SHOW-KUNNR FROM BSEG WHERE BUKRS = GW_SHOW-BUKRS AND BELNR = GW_SHOW-BELNR AND GJAHR = GW_SHOW-GJAHR AND KUNNR <> ''. ENDIF. IF GW_SHOW-SHKZG = 'S'. IF GW_SHOW-XNEGP = 'X'. GW_SHOW-DMBTRH = GW_SHOW-DMBTR. GW_SHOW-WRBTRH = GW_SHOW-WRBTR. ELSE. GW_SHOW-DMBTRS = GW_SHOW-DMBTR. GW_SHOW-WRBTRS = GW_SHOW-WRBTR. ENDIF. * GW_SHOW-DMBTRS = GW_SHOW-DMBTR.
    ELSEIF GW_SHOW-SHKZG = 'H'. IF GW_SHOW-XNEGP = 'X'. GW_SHOW-DMBTRS = GW_SHOW-DMBTR * -1. GW_SHOW-WRBTRS = GW_SHOW-WRBTR * -1. ELSE. GW_SHOW-DMBTRH = GW_SHOW-DMBTR * -1. GW_SHOW-WRBTRH = GW_SHOW-WRBTR * -1. ENDIF. GW_SHOW-DMBTR = GW_SHOW-DMBTR * -1. GW_SHOW-WRBTR = GW_SHOW-WRBTR * -1. * GW_SHOW-DMBTRH = GW_SHOW-DMBTR.
    ENDIF. READ TABLE GT_T053 INTO GW_T053 WITH KEY BUKRS = GW_SHOW-BUKRS RSTGR = GW_SHOW-RSTGR. IF SY-SUBRC = 0. GW_SHOW-TXT40 = GW_T053-TXT40. ENDIF. READ TABLE GT_CSKT INTO GW_CSKT WITH KEY KOSTL = GW_SHOW-KOSTL. IF SY-SUBRC = 0. GW_SHOW-LTEXT = GW_CSKT-LTEXT. ENDIF. MODIFY GT_SHOW FROM GW_SHOW. CLEAR:GW_SHOW. ENDLOOP. """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """"""added by stw 20170822
  LOOP AT GT_SHOW INTO GW_SHOW. IF GW_SHOW-MATNR IS NOT INITIAL. SELECT SINGLE MAKTX INTO GW_SHOW-MAKTX FROM MAKT WHERE MATNR = GW_SHOW-MATNR AND SPRAS = '1'. MODIFY GT_SHOW FROM GW_SHOW. CLEAR:GW_SHOW. ENDIF. ENDLOOP. """"""added by stw 20170822 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ENDFORM. *&---------------------------------------------------------------------* *& Form PRM_SET_FIELD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------*
FORM PRM_SET_FIELD . REFRESH GT_FIELDCAT. LS_LAYOUT-CWIDTH_OPT    = 'X'. "優化列寬選項是否設置
  LS_LAYOUT-ZEBRA                = 'X'. * ls_layout-box_fname = 'SEL'.
  APPEND_FIELDCAT:'BUKRS'             '公司代碼'              4   'X', 'GJAHR'             '會計年度'              4   'X', 'MONAT'             '會計期間'              2   'X', 'BUDAT'             '過帳日期'              10   '', 'BELNR'             '憑證編號'              10  'X', 'AWKEY'             '憑證參考'              20  'X', 'BKTXT'             '摘要'                  25    '', 'HKONT'             '科目代碼'              10    'X', 'TXT50'             '科目名稱'              50    '', 'KUNNR'             '客戶編號'              10    '', 'LIFNR'             '供應商編號'            10    '', 'FKBER'             '功能範圍'              4    '', 'GSBER'             '業務範圍'              4    '', 'AUFNR'             '內部訂單'              18    '', 'WAERS'             '幣別'                  3    '', 'KOSTL'             '成本中心'              10    'X', 'LTEXT'             '成本中心描述'          40    '', 'MATNR'             '物料編碼'              18    'X', 'MAKTX'             '物料描述'              40    '', 'RSTGR'             '緣由代碼'              4     '', 'TXT40'             '緣由代碼描述'          40     '', 'WRBTR'             '原幣金額'              16    '', 'WRBTRS'            '原幣借方金額'          16    '', 'WRBTRH'            '原幣貸方金額'          16    '', 'DMBTR'             '本幣金額'              16    '', 'DMBTRS'            '本幣借方金額'          16    '', 'DMBTRH'            '本幣貸方金額'          16    '', 'USNAM'             '過帳人'                12    ''. ENDFORM. *&---------------------------------------------------------------------* *& Form PRM_SHOW *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------*
FORM PRM_SHOW . DATA:LV_TITLE TYPE LVC_TITLE. DESCRIBE TABLE GT_SHOW LINES LV_TITLE. CONDENSE LV_TITLE NO-GAPS. CONCATENATE '結果共' LV_TITLE '條目!' INTO LV_TITLE. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING I_CALLBACK_PROGRAM = SY-REPID I_CALLBACK_PF_STATUS_SET = 'PRM_SET_STATUS' I_CALLBACK_USER_COMMAND = 'PRM_USER_COMMAND' IS_LAYOUT_LVC = LS_LAYOUT IT_FIELDCAT_LVC = GT_FIELDCAT[] I_GRID_TITLE = LV_TITLE I_DEFAULT = 'X' I_SAVE = 'A'
    TABLES T_OUTTAB = GT_SHOW EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. ENDIF. ENDFORM. FORM PRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'ZSTAT'. ENDFORM. FORM PRM_USER_COMMAND USING P_UCOMM    LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD. CHECK P_UCOMM = '&IC1'. READ TABLE GT_SHOW INTO GW_SHOW INDEX P_SELFIELD-TABINDEX. IF SY-SUBRC = 0. SET PARAMETER ID 'BLN' FIELD GW_SHOW-BELNR. SET PARAMETER ID 'BUK' FIELD GW_SHOW-BUKRS. SET PARAMETER ID 'GJR' FIELD GW_SHOW-GJAHR. CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN. ENDIF. ENDFORM.
相關文章
相關標籤/搜索