猿创征文|我的SAP ABAPer之路

深耕CSDN多年,很少看到SAP ABAP开发的文章,但其实,SAP ERP的项目很多,ABAPer的需求量很大的,而且薪资很高。所以,我这里就破天荒的开个头,也算是SAP行业开发语言ABAPCSDN的处女行了。。

   首先,做过JAVA的朋友都可以体会到,如果会了Java Script,再去学SAP ABAP,那简直简单快乐的不行。。因为SAP的开发语言-ABAP,简单。。。太过于简单了,几乎相当于FOXBASE FOXPRO,因为都是围绕着关系数据库展开的。近些年SAP展开自己的HANA 数据库,才开始慢慢转由ABAP+JAVA,但同时也支持源开发语言ABAP.

  无独有偶,台湾鼎新 TIPTOP ERP,采用的是4GL 开发语言,就是ABAP的一个分支。

  作为一个前端业务顾问,我也深知,学会SAP ABAP Coding的重要性,起码实际案例项目环境中,DEBUG时不求人。于是我就疯狂的开始了我的ABAP代码之路。

SAP ABAP开发之-smartforms

很多项目要打印,比如公司的出库单要打印,签字,打印5联纸等。销售合同有时也需要打印,盖章发送PDF等,这个时候就需要SAP ABAP画一个smartforms,即表格,以销售发货单的打印为例,源代码Coding如下:

* 创建者:

* 申请者:

*----------------------------------------------------------------------*

* 概要 :1)发货单单打印

*----------------------------------------------------------------------*

* 变更记录

* DESCRIPTION:

*  1.初始开发

*  2012/INS-DAY  BY (YAHUA)  DEVK900449

* DESCRIPTION:

*  1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

*  2.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

*

*----------------------------------------------------------------------*

REPORT  ZSDP_FHD NO STANDARD PAGE HEADING

       LINE-SIZE 255

       LINE-COUNT 65

       MESSAGE-ID ZSD_DEV.

TABLES:LIKP,LIPS,KNA1,MARA,ZSDT_GSDY,ZSDT_FHINF.

*----------------------------------------------------------------------*

*       INCLUDE                                                        *

*----------------------------------------------------------------------*

INCLUDE:ZZZI_GI_COMMON.

*----------------------------------------------------------------------*

*       TYPE-POOLS                                                     *

*----------------------------------------------------------------------*

TYPE-POOLS:SLIS.

*----------------------------------------------------------------------*

*       TABLES                                                 *

*----------------------------------------------------------------------*

*----------------------------------------------------------------------*

*       INTERNAL AND WORKAREA

*----------------------------------------------------------------------*

TYPES: BEGIN OF STYPE_FIELDS,                               "N599966

       FIELDNAME           TYPE  AIND_STR3-FIELDNAME,       "N599966

     END OF   STYPE_FIELDS.

TYPES:BEGIN OF ty_s_itemsc,

      VBELN TYPE LIKP-VBELN,

      POSNR TYPE LIPS-POSNR,

      MATNR TYPE MARA-MATNR,

      arktx TYPE lips-arktx,

      lgort TYPE lips-lgort,

      LFIMG TYPE LIPS-LFIMG,"交货数量

      MSEHL TYPE t006a-MSEHL,"单位

      kunnr TYPE kunnr,

      kunag TYPE kunnr,

      vkorg TYPE vkorg,

      ernam TYPE ernam,

      mvgr4 TYPE mvgr4,

      bezei TYPE bezei,

      name1 TYPE name1,

      name2 TYPE name1,

      name3 TYPE name1,

      butxt TYPE butxt,

      wadat TYPE likp-wadat,

      END OF  ty_s_itemsc.

DATA: G_T_FIELDS TYPE STANDARD TABLE OF STYPE_FIELDS.

DATA: save_ok       TYPE sy-ucomm.

data:it_t_item type table of ty_s_itemsc,

     wa_s_item type ty_s_itemsc.

DATA:WA_ALV  TYPE  ZSDP_FHD=>GTY_S_OUT,

     TB_LIKP TYPE  ZSDP_FHD=>GTY_T_LIKP,

     WA_LIKP TYPE  ZSDP_FHD=>GTY_S_LIKP,

     tb_fhd1 TYPE  TABLE OF zsdt_fhinf,

     wa_fhd1 TYPE  zsdt_fhinf,

     LT_LIKP TYPE  ZSDP_FHD=>GTY_T_LIKP,

     LS_LIKP TYPE  ZSDP_FHD=>GTY_S_LIKP,

     TB_OUT  TYPE  ZSDP_FHD=>GTY_T_OUT,

     WA_OUT  TYPE  ZSDP_FHD=>GTY_S_OUT.

DATA:FORM_NAME  TYPE TDSFNAME VALUE 'ZSD_FHD2'.

DATA: COND(72)    TYPE C,

      STATUS TYPE N,

      IT_COND     LIKE TABLE OF COND.

*----------------------------------------------------------------------*

*       ALV参数定义

*----------------------------------------------------------------------*

DATA: IT_FIELDCAT TYPE LVC_T_FCAT,

      IT_EXCLUDING

                  TYPE SLIS_T_EXTAB,

      IT_EVENTS   TYPE SLIS_T_EVENT,

      WA_FIELDCAT TYPE LVC_S_FCAT,

      WA_LAYOUT   TYPE LVC_S_LAYO,

      G_REPID     TYPE SY-REPID.

DATA: G_RS38L_FNAM TYPE RS38L_FNAM.

DATA: IT_FCODE TYPE TABLE OF SY-UCOMM."GUI用变量

DATA:COS_LINE TYPE I VALUE 6.

"CONTROLS: TC_ITEM TYPE TABLEVIEW USING SCREEN 9000.

*&---------------------------------------------------------------------*

*&      INITIALIZATION.

*&---------------------------------------------------------------------*

INITIALIZATION.

  G_REPID = SY-REPID.

SELECTION-SCREEN BEGIN OF BLOCK blk_01 WITH FRAME TITLE text-f01.

PARAMETERS:p_new RADIOBUTTON GROUP rb01 USER-COMMAND disp DEFAULT 'X'.

PARAMETERS:p_old RADIOBUTTON GROUP rb01 .

SELECTION-SCREEN END OF BLOCK blk_01.

 SELECTION-SCREEN BEGIN OF BLOCK BLK_CRITERIA WITH FRAME TITLE TEXT-F02

 .

  SELECT-OPTIONS:  S_VKORG    FOR LIKP-VKORG NO INTERVALS NO-EXTENSION

MODIF ID new,

  "销售组织

                   S_VTWEG    FOR LIPS-VTWEG NO INTERVALS NO-EXTENSION

MODIF ID new,

                   "分销渠道

                   S_WERKS    FOR LIPS-WERKS NO INTERVALS NO-EXTENSION

MODIF ID new,

                   "工厂

                   S_VSTEL    FOR LIKP-VSTEL NO INTERVALS NO-EXTENSION

MODIF ID new,

                   "装运点

                   S_KUNNR    FOR LIKP-KUNNR NO INTERVALS NO-EXTENSION

MODIF ID new.

  "送达方

  SELECT-OPTIONS: S_ERNAM    FOR LIKP-ERNAM  MODIF ID new,"创建人

                  S_ERDAT    FOR LIKP-ERDAT  MODIF ID new,"创建时间

                  S_LGORT    FOR LIPS-LGORT  MODIF ID new,"库存地

                  S_VBELN    FOR LIKP-VBELN MATCHCODE OBJECT zsdh_fhqd

 MODIF ID new.

  "交货单号."发货单.

  PARAMETERS:  P_CB1 TYPE C AS CHECKBOX  .

  SELECT-OPTIONS: S_ZNUM     FOR ZSDT_FHINF-ZNUM  OBLIGATORY NO

                             INTERVALS

                             NO-EXTENSION  MODIF ID OLD.

  SELECTION-SCREEN END OF BLOCK BLK_CRITERIA.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_ZNUM-LOW.

  PERFORM frm_getznum_f4 CHANGING S_ZNUM-LOW.

AT SELECTION-SCREEN OUTPUT.

*      * 处理录入编辑状态

 LOOP AT SCREEN.

    IF p_new  = 'X'.           "新货物运单

      IF screen-group1 = 'NEW'.

        screen-input = 1.

      ENDIF.

      IF screen-group1 = 'OLD' .

        screen-input = 0.

      ENDIF.

      CLEAR S_ZNUM  .

    ELSE.    "重复打印货物运单

      IF screen-group1 = 'OLD'.

        screen-input = 1.

      ENDIF.

      IF screen-group1 = 'NEW' OR screen-group1 = 'ALL'.

        screen-input = 0.

      ENDIF.

    ENDIF.

    MODIFY SCREEN.

  ENDLOOP.

*&---------------------------------------------------------------------*

*&      AT SELECTION-SCREEN

*&---------------------------------------------------------------------*

AT SELECTION-SCREEN.

*在此进行权限对象的检查

START-OF-SELECTION.

  "PERFORM FRM_CONSTR_COND.

IF p_new = 'X'.

   PERFORM FRM_GET_DATA.

    IF TB_LIKP IS NOT INITIAL.

      PERFORM FRM_INIT_LAYOUT.

      PERFORM FRM_INIT_FIELDCAT.

      PERFORM FRM_EVENT_BUILD.

      PERFORM FRM_ALV_OUTPUT.

    ELSE.

      MESSAGE I001(ZSD_DEV).

    ENDIF.

  ELSE.

  PERFORM frm_get_fhinf.

ENDIF.

*&---------------------------------------------------------------------*

*&      FORM  FRM_GET_DATA

*&---------------------------------------------------------------------*

*       获取需要输出的数据

*----------------------------------------------------------------------*

FORM FRM_GET_DATA .

  DATA:LT_KNA1 TYPE  ZSDP_FHD=>GTY_T_KNA1,

       LS_KNA1 TYPE  ZSDP_FHD=>GTY_S_KNA1,

       LT_KNA2 TYPE  ZSDP_FHD=>GTY_T_KNA1,

       LS_KNA2 TYPE  ZSDP_FHD=>GTY_S_KNA1,

       LT_VBUK TYPE  ZSDP_FHD=>GTY_T_VBUK,

       LS_VBUK TYPE  ZSDP_FHD=>GTY_S_VBUK,

       LT_VBAK TYPE  ZSDP_FHD=>GTY_T_VBAL,

       LS_VBAK TYPE  ZSDP_FHD=>GTY_S_VBAL,

       LT_T001 TYPE  ZSDP_TY2007=>GTY_TB_T001,

       LS_T001 TYPE  ZSDP_TY2007=>GTY_ST_T001,

       LT_LZYK TYPE  STANDARD TABLE OF  ZSDT_JHXX,

       LS_LZYK TYPE  ZSDT_JHXX,

       LT_TVKOT TYPE  ZSDP_FHD=>GTY_T_TVKOT,

       LS_TVKOT TYPE  ZSDP_FHD=>GTY_S_TVKOT ,

       LT_MVKE   TYPE  ZSDP_FHD=>GTY_T_MVKE,

       LS_MVKE   TYPE  ZSDP_FHD=>GTY_S_MVKE,

       LT_TVM4T  TYPE  ZSDP_FHD=>GTY_T_TVM4T,

       LS_TVM4T  TYPE  ZSDP_FHD=>GTY_S_TVM4T.

  DATA:LV_MUM   TYPE I,

       LV_LINES TYPE I.

  SELECT VKORG  VTEXT FROM TVKOT

    INTO TABLE LT_TVKOT

    WHERE SPRAS =  '1'.

  SORT LT_TVKOT BY VKORG.

  SELECT BUKRS DYDMS

    INTO TABLE LT_T001

    FROM ZSDT_GSDY .

  SORT LT_T001 BY BUKRS.

  SELECT

     LIKP~VBELN

     LIKP~VKORG

     LIPS~POSNR

     LIPS~VTWEG

     LIKP~ERNAM

     LIKP~ERDAT

     LIKP~VSTEL

     LIPS~WERKS

     LIKP~KUNNR

     LIKP~KUNAG

     LIKP~WADAT

     LIPS~MATNR

     LIPS~ARKTX

     LIPS~LFIMG

     LIPS~VRKME

     LIPS~WERKS

     LIPS~LGORT

     LIPS~VGBEL

     LIPS~VGPOS

    INTO CORRESPONDING FIELDS OF TABLE TB_LIKP

    FROM LIKP INNER JOIN LIPS ON LIKP~VBELN EQ LIPS~VBELN

    WHERE LIKP~VBELN  IN  S_VBELN AND

          LIKP~ERNAM  IN  S_ERNAM AND

          LIPS~LGORT  IN  S_LGORT AND

          LIKP~VKORG  IN  S_VKORG AND

          LIPS~WERKS  IN  S_WERKS AND

          LIKP~VSTEL  IN  S_VSTEL AND

          LIKP~KUNNR  IN  S_KUNNR .

  SELECT MATNR MVGR4 FROM MVKE

         INTO TABLE LT_MVKE

         FOR ALL ENTRIES IN TB_LIKP

         WHERE MATNR = TB_LIKP-MATNR.

  SORT LT_MVKE BY MATNR.

  SELECT MVGR4 BEZEI FROM TVM4T

         INTO TABLE LT_TVM4T.

  SORT LT_TVM4T BY MVGR4.

  SELECT VBELN BUKRS_VF FROM VBAK

        INTO TABLE LT_VBAK

        FOR ALL ENTRIES IN TB_LIKP

        WHERE VBELN =  TB_LIKP-VGBEL.

  SORT LT_VBAK  BY VBELN.

  SELECT

          KUNNR

          NAME1

          INTO CORRESPONDING FIELDS OF TABLE LT_KNA1

          FROM KNA1

          FOR  ALL ENTRIES IN  TB_LIKP

          WHERE  KUNNR = TB_LIKP-KUNNR.

  SORT LT_KNA1 BY KUNNR.

  SELECT

           KUNNR

           NAME1

           INTO CORRESPONDING FIELDS OF TABLE LT_KNA2

           FROM KNA1

           FOR  ALL ENTRIES IN  TB_LIKP

           WHERE  KUNNR = TB_LIKP-KUNAG.

  SORT LT_KNA1 BY KUNNR.

  LOOP AT TB_LIKP INTO WA_LIKP.

    READ TABLE LT_KNA1 INTO LS_KNA1 WITH KEY KUNNR = WA_LIKP-KUNNR

    BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-NAME2 = LS_KNA1-NAME1.

    ENDIF.

    READ TABLE LT_KNA2 INTO LS_KNA2 WITH KEY KUNNR = WA_LIKP-KUNAG

    BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-NAME1 = LS_KNA2-NAME1.

    ENDIF.

    READ TABLE LT_MVKE INTO LS_MVKE WITH  KEY MATNR = WA_LIKP-MATNR

    BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-MVGR4 = LS_MVKE-MVGR4.

      READ TABLE LT_TVM4T INTO LS_TVM4T WITH KEY MVGR4 = WA_LIKP-MVGR4

      BINARY SEARCH.

      IF SY-SUBRC EQ 0.

        WA_LIKP-BEZEI = LS_TVM4T-BEZEI.

      ENDIF.

    ENDIF.

    MODIFY TB_LIKP  FROM WA_LIKP TRANSPORTING NAME1 NAME2 MVGR4 BEZEI.

    CLEAR:WA_LIKP.

  ENDLOOP.

  FREE:LT_KNA1.

  FREE:LT_LZYK.

  SELECT VBELN CMGST

    FROM VBUK

    INTO TABLE LT_VBUK

    FOR ALL ENTRIES IN TB_LIKP

    WHERE VBELN = TB_LIKP-VBELN.

  SORT LT_VBUK BY VBELN.

  SELECT VBELN POSNR LZYKNUM

    FROM  ZSDT_JHXX

    INTO CORRESPONDING FIELDS OF TABLE LT_LZYK

    FOR ALL ENTRIES IN TB_LIKP

    WHERE  VBELN  = TB_LIKP-VBELN.

  SORT LT_LZYK BY  VBELN POSNR.

  LOOP AT TB_LIKP INTO WA_LIKP.

    READ TABLE LT_VBAK INTO LS_VBAK WITH KEY VBELN = WA_LIKP-VGBEL

    .

    IF SY-SUBRC EQ 0.

      READ TABLE LT_T001 INTO LS_T001 WITH  KEY BUKRS =

      LS_VBAK-BUKRS_VF .

      IF SY-SUBRC EQ 0.

        WA_LIKP-BUTXT = LS_T001-DYDMS .

      ENDIF.

    ENDIF.

    READ TABLE LT_VBUK INTO LS_VBUK WITH KEY VBELN = WA_LIKP-VBELN

    BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-CMGST = LS_VBUK-CMGST.

    ENDIF.

    READ TABLE LT_TVKOT INTO LS_TVKOT WITH KEY VKORG = WA_LIKP-VKORG

    BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-VTEXT = LS_TVKOT-VTEXT.

    ENDIF.

    READ TABLE LT_LZYK INTO LS_LZYK WITH KEY VBELN  = WA_LIKP-VBELN

    POSNR = WA_LIKP-POSNR BINARY SEARCH.

    IF SY-SUBRC EQ 0.

      WA_LIKP-LZYKNUM = LS_LZYK-LZYKNUM.

    ENDIF.

    MODIFY TB_LIKP  FROM WA_LIKP TRANSPORTING CMGST VTEXT BUTXT LZYKNUM.

    CLEAR:WA_LIKP.

  ENDLOOP.

  SORT tb_likp by vbeln posnr.

  FREE:LT_VBUK.

ENDFORM.                    "FRM_GET_DATA

*&---------------------------------------------------------------------*

*&      FORM  FRM_INIT_LAYOUT

*&---------------------------------------------------------------------*

*       设置ALV输出格式

*----------------------------------------------------------------------*

FORM FRM_INIT_LAYOUT .

  WA_LAYOUT-ZEBRA = 'X'.

  WA_LAYOUT-CWIDTH_OPT = 'X'.

  WA_LAYOUT-DETAILINIT = 'X'.

  WA_LAYOUT-BOX_FNAME  = 'CHBOX'.

ENDFORM.                    "FRM_INIT_LAYOUT

*&---------------------------------------------------------------------*

*&      FORM  FRM_INIT_FIELDCAT

*&---------------------------------------------------------------------*

*       TEXT

*----------------------------------------------------------------------*

FORM FRM_INIT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "1 交货单号

  WA_FIELDCAT-FIELDNAME = 'VBELN'.

  WA_FIELDCAT-REF_TABLE = 'LIKP'.

  WA_FIELDCAT-REF_FIELD = 'VBELN'.

  WA_FIELDCAT-HOTSPOT = 'X'.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "1 交货单号

  WA_FIELDCAT-FIELDNAME = 'POSNR'.

  "WA_FIELDCAT-REF_TABLE = 'LIKP'.

  "WA_FIELDCAT-REF_FIELD = 'POSNR'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-006.

  WA_FIELDCAT-SCRTEXT_M = TEXT-006.

  WA_FIELDCAT-SCRTEXT_S = TEXT-006.

  WA_FIELDCAT-HOTSPOT = 'X'.

  WA_FIELDCAT-NO_ZERO = 'X'.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "5 售达方

  WA_FIELDCAT-FIELDNAME = 'NAME2'.

  WA_FIELDCAT-REF_TABLE = 'KNA1'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-001.

  WA_FIELDCAT-SCRTEXT_M = TEXT-001.

  WA_FIELDCAT-SCRTEXT_S = TEXT-001.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "6 送达方

  WA_FIELDCAT-FIELDNAME = 'NAME1'.

  WA_FIELDCAT-REF_TABLE = 'KNA1'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-002.

  WA_FIELDCAT-SCRTEXT_M = TEXT-002.

  WA_FIELDCAT-SCRTEXT_S = TEXT-002.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "6 送达方

  WA_FIELDCAT-FIELDNAME = 'VKORG'.

  "WA_FIELDCAT-REF_TABLE = 'TVKOT'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-003.

  WA_FIELDCAT-SCRTEXT_M = TEXT-003.

  WA_FIELDCAT-SCRTEXT_S = TEXT-003.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "6 送达方

  WA_FIELDCAT-FIELDNAME = 'VTEXT'.

  " WA_FIELDCAT-REF_TABLE = 'TVKOT'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-004.

  WA_FIELDCAT-SCRTEXT_M = TEXT-004.

  WA_FIELDCAT-SCRTEXT_S = TEXT-004.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

  CLEAR WA_FIELDCAT.                                        "6 送达方

  WA_FIELDCAT-FIELDNAME = 'VSTEL'.

  WA_FIELDCAT-REF_TABLE = 'LIKP'.

  WA_FIELDCAT-SCRTEXT_L = TEXT-005.

  WA_FIELDCAT-SCRTEXT_M = TEXT-005.

  WA_FIELDCAT-SCRTEXT_S = TEXT-005.

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

*   CLEAR WA_FIELDCAT.                                        "6 送达方

*  WA_FIELDCAT-FIELDNAME = 'VTEXT'.

*  "WA_FIELDCAT-REF_TABLE = .

*  WA_FIELDCAT-SCRTEXT_L = TEXT-006.

*  WA_FIELDCAT-SCRTEXT_M = TEXT-006.

*  WA_FIELDCAT-SCRTEXT_S = TEXT-006.

*  APPEND WA_FIELDCAT TO IT_FIELDCAT.

*  CLEAR WA_FIELDCAT.                                        "6 送达方

*  WA_FIELDCAT-FIELDNAME = 'LZYKNUM'.

*  WA_FIELDCAT-REF_TABLE = 'ZSDT_JHXX'.

*  WA_FIELDCAT-REF_FIELD = 'LZYKNUM'.

*  WA_FIELDCAT-EDIT  = 'X'.

*  WA_FIELDCAT-SCRTEXT_L = TEXT-006.

*  WA_FIELDCAT-SCRTEXT_M = TEXT-006.

*  WA_FIELDCAT-SCRTEXT_S = TEXT-006.

  "APPEND WA_FIELDCAT TO IT_FIELDCAT.

ENDFORM.                    "FRM_INIT_FIELDCAT

*&---------------------------------------------------------------------*

*&      FORM  FRM_EVENT_BUILD

*&---------------------------------------------------------------------*

FORM FRM_EVENT_BUILD.

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'

    EXPORTING

      I_LIST_TYPE = 4

    IMPORTING

      ET_EVENTS   = IT_EVENTS.

  DELETE IT_EVENTS WHERE FORM IS INITIAL.

ENDFORM.                    "FRM_EVENT_BUILD

*&---------------------------------------------------------------------*

*&      FORM  FRM_ALV_OUTPUT

*&---------------------------------------------------------------------*

*       ALV输出报表结果

*----------------------------------------------------------------------*

FORM FRM_ALV_OUTPUT.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

    EXPORTING

      I_CALLBACK_PROGRAM       = G_REPID

      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'

      I_CALLBACK_USER_COMMAND  = 'ALV_USER_COMMAND'

      IS_LAYOUT_LVC            = WA_LAYOUT

      IT_FIELDCAT_LVC          = IT_FIELDCAT

      IT_EXCLUDING             = IT_EXCLUDING

      I_DEFAULT                = 'X'

      I_SAVE                   = 'A'

      IT_EVENTS                = IT_EVENTS

    TABLES

      T_OUTTAB                 = TB_LIKP

    EXCEPTIONS

      PROGRAM_ERROR            = 1

      OTHERS                   = 2.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM.                    "FRM_ALV_OUTPUT

*----------------------------------------------------------------------*

*       FORM USER_COMMAND                                              *

*----------------------------------------------------------------------*

FORM ALV_USER_COMMAND  USING R_UCOMM LIKE SY-UCOMM

                         RS_SELFIELD TYPE SLIS_SELFIELD.

  "画面迁移跳转。

  CASE R_UCOMM.

    WHEN '&BACK' OR '&CANC'.

      PERFORM frm_exit_data.

    WHEN 'UPDAT'.

      PERFORM frm_update_data.

    WHEN '&IC1'.

      CASE RS_SELFIELD-FIELDNAME.

        WHEN 'VBELN'."【销售订单号】按下,画面迁移

          SET PARAMETER ID 'VL' FIELD RS_SELFIELD-VALUE.

          CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.

      ENDCASE.

*    WHEN '&SAVE'.

*      PERFORM FRM_SAVE.

  ENDCASE.

ENDFORM.                    "ALV_USER_COMMAND

*----------------------------------------------------------------------*

*       FORM PF_STATUS_SET                                             *

*----------------------------------------------------------------------*

FORM PF_STATUS_SET USING I_RT_EXTAB TYPE SLIS_T_EXTAB.

  SET PF-STATUS 'ZFHD' EXCLUDING IT_FCODE.

ENDFORM.                    "PF_STATUS_SET

*&---------------------------------------------------------------------*

*&      Form  FRM_EXIT_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM FRM_EXIT_DATA .

  LEAVE TO SCREEN 0.

ENDFORM.                    " FRM_EXIT_DATA

*&---------------------------------------------------------------------*

*&      Form  FRM_UPDATE_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM FRM_UPDATE_DATA .

  DATA:LT_T006A TYPE  ZSDP_FHD=>GTY_T_T006A,

       LS_T006A TYPE  ZSDP_FHD=>GTY_S_T006A.

  DATA:lt_fhd1 TYPE  TABLE OF zsdt_fhinf,

       ls_fhd1 TYPE  zsdt_fhinf.

  DATA:L_TABIX TYPE SY-TABIX,

       name1   TYPE name1,

       name2   TYPE name2,

       t_create TYPE String,

       erdat   TYPE erdat.

  FREE:LT_LIKP.

  CLEAR:WA_ALV,

        WA_FHD1.

  LT_LIKP =  TB_LIKP.

  LOOP AT  LT_LIKP INTO LS_LIKP WHERE CHBOX <> 'X'.

    L_TABIX = SY-TABIX.

    DELETE  LT_LIKP FROM L_TABIX TO L_TABIX.

  ENDLOOP.

  SELECT MSEHI MSEHL

        INTO TABLE LT_T006A

        FROM T006A

        FOR ALL ENTRIES IN LT_LIKP

        WHERE MSEHI = LT_LIKP-VRKME AND

              SPRAS = '1'.

  FREE:it_t_item.

  IF LT_LIKP IS NOT INITIAL.

    SELECT znum  vbeln posnr

      into TABLE lt_fhd1

      FROM zsdt_fhinf

      for all ENTRIES IN lt_likp

      WHERE vbeln = lt_likp-vbeln and posnr = lt_likp-posnr

      AND lovem <> 'X'.

    IF lt_fhd1 IS NOT INITIAL.

      MESSAGE e083(ZSD_DEV).

    ELSE.

      status = '1'.

      LOOP AT LT_LIKP INTO ls_likp.

        IF ls_likp-CMGST EQ 'B'.

          MESSAGE '交货单信用冻结,请释放交货单再打印!' TYPE 'E'.

        ENDIF.

        wa_s_item-vbeln = ls_likp-vbeln.

        wa_s_item-posnr = ls_likp-posnr.

        wa_s_item-matnr = ls_likp-matnr.

        wa_s_item-arktx = ls_likp-arktx.

        wa_s_item-LFIMG = ls_likp-LFIMG.

        wa_s_item-lgort = ls_likp-lgort.

        wa_s_item-mvgr4 = ls_likp-mvgr4.

        wa_s_item-bezei = ls_likp-bezei.

        wa_s_item-vkorg = LS_likp-vkorg.

        wa_s_item-kunnr = LS_likp-kunnr.

        wa_s_item-kunag = LS_likp-kunag.

        wa_s_item-LGORT =  LS_likp-LGORT.

        wa_s_item-name1 = LS_likp-name1.

        wa_s_item-name2 = LS_likp-name2.

        wa_s_item-name3 = LS_likp-vtext.

        wa_s_item-wadat =  LS_likp-wadat.

        wa_s_item-butxt =  LS_likp-butxt.

        IF sy-tabix eq 1.

          wa_alv-name1 = ls_likp-name1.

          wa_alv-name2 = ls_likp-name2.

          wa_alv-erdat = ls_likp-WADAT.

        ELSE.

          IF wa_alv-name1 NE ls_likp-name1 or wa_alv-name2 NE

              ls_likp-name2 or wa_alv-erdat ne ls_likp-WADAT.

            MESSAGE e077(ZSD_DEV).

          ENDIF.

        ENDIF.

    READ TABLE LT_T006A  INTO LS_T006A WITH  KEY MSEHI =  LS_LIKP-VRKME

                                              BINARY SEARCH.

        IF SY-SUBRC EQ 0.

          wa_s_ITEM-MSEHL =  LS_T006A-MSEHL.

        ENDIF.

        "wa_s_item-vbeln = ls_likp-vbeln.

        APPEND wa_s_item to it_t_item.

        wa_alv-name1 = ls_likp-name1.

        wa_alv-name2 = ls_likp-name2.

        wa_alv-name3 = ls_likp-vtext.

        wa_alv-erdat = ls_likp-WADAT.

        WA_ALV-BUTXT = LS_likp-BUTXT.

        SELECT

            ADRP~NAME_TEXT INTO T_CREATE

             FROM ADRP  INNER JOIN USR21 ON ADRP~PERSNUMBER =

            USR21~PERSNUMBER

            WHERE USR21~BNAME =  sy-uname.

        ENDSELECT.

        WA_ALV-namex =  T_CREATE.

      ENDLOOP.

      CALL SCREEN 9000.

    ENDIF.

  ENDIF.

ENDFORM.                    "FRM_UPDATE_DATA

*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_ITEM' ITSELF

CONTROLS: TC_ITEM TYPE TABLEVIEW USING SCREEN 9000.

*&SPWIZARD: LINES OF TABLECONTROL 'TC_ITEM'

DATA:     G_TC_ITEM_LINES  LIKE SY-LOOPC.

DATA:     OK_CODE LIKE SY-UCOMM.

*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!

*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR

MODULE TC_ITEM_CHANGE_TC_ATTR OUTPUT.

  DESCRIBE TABLE IT_T_ITEM LINES TC_ITEM-lines.

ENDMODULE.                    "TC_ITEM_CHANGE_TC_ATTR OUTPUT

*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!

*&SPWIZARD: GET LINES OF TABLECONTROL

MODULE TC_ITEM_GET_LINES OUTPUT.

  G_TC_ITEM_LINES = SY-LOOPC.

ENDMODULE.                    "TC_ITEM_GET_LINES OUTPUT

*&SPWIZARD: INPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!

*&SPWIZARD: PROCESS USER COMMAND

MODULE TC_ITEM_USER_COMMAND INPUT.

  OK_CODE = SY-UCOMM.

  PERFORM USER_OK_TC USING    'TC_ITEM'

                              'IT_T_ITEM'

                              ' '

                     CHANGING OK_CODE.

  SY-UCOMM = OK_CODE.

ENDMODULE.                    "TC_ITEM_USER_COMMAND INPUT

*----------------------------------------------------------------------*

*   INCLUDE TABLECONTROL_FORMS                                         *

*----------------------------------------------------------------------*

*&---------------------------------------------------------------------*

*&      Form  USER_OK_TC                                               *

*&---------------------------------------------------------------------*

FORM USER_OK_TC USING    P_TC_NAME TYPE DYNFNAM

                         P_TABLE_NAME

                         P_MARK_NAME

                CHANGING P_OK      LIKE SY-UCOMM.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*

  DATA: L_OK              TYPE SY-UCOMM,

        L_OFFSET          TYPE I.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

*&SPWIZARD: Table control specific operations                          *

*&SPWIZARD: evaluate TC name and operations                            *

  SEARCH P_OK FOR P_TC_NAME.

  IF SY-SUBRC <> 0.

    EXIT.

  ENDIF.

  L_OFFSET = STRLEN( P_TC_NAME ) + 1.

  L_OK = P_OK+L_OFFSET.

*&SPWIZARD: execute general and TC specific operations                 *

  CASE L_OK.

    WHEN 'INSR'.                      "insert row

      PERFORM FCODE_INSERT_ROW USING    P_TC_NAME

                                        P_TABLE_NAME.

      CLEAR P_OK.

    WHEN 'DELE'.                      "delete row

      PERFORM FCODE_DELETE_ROW USING    P_TC_NAME

                                        P_TABLE_NAME

                                        P_MARK_NAME.

      CLEAR P_OK.

    WHEN 'P--' OR                     "top of list

         'P-'  OR                     "previous page

         'P+'  OR                     "next page

         'P++'.                       "bottom of list

      PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME

                                            L_OK.

      CLEAR P_OK.

*     WHEN 'L--'.                       "total left

*       PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.

*

*     WHEN 'L-'.                        "column left

*       PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.

*

*     WHEN 'R+'.                        "column right

*       PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.

*

*     WHEN 'R++'.                       "total right

*       PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.

*

    WHEN 'MARK'.                      "mark all filled lines

      PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME

                                        P_TABLE_NAME

                                        P_MARK_NAME   .

      CLEAR P_OK.

    WHEN 'DMRK'.                      "demark all filled lines

      PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME

                                          P_TABLE_NAME

                                          P_MARK_NAME .

      CLEAR P_OK.

*     WHEN 'SASCEND'   OR

*          'SDESCEND'.                  "sort column

*       PERFORM FCODE_SORT_TC USING P_TC_NAME

*                                   l_ok.

  ENDCASE.

ENDFORM.                              " USER_OK_TC

*&---------------------------------------------------------------------*

*&      Form  FCODE_INSERT_ROW                                         *

*&---------------------------------------------------------------------*

FORM fcode_insert_row

              USING    P_TC_NAME           TYPE DYNFNAM

                       P_TABLE_NAME             .

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*

  DATA L_LINES_NAME       LIKE FELD-NAME.

  DATA L_SELLINE          LIKE SY-STEPL.

  DATA L_LASTLINE         TYPE I.

  DATA L_LINE             TYPE I.

  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>                 TYPE CXTAB_CONTROL.

  FIELD-SYMBOLS <TABLE>              TYPE STANDARD TABLE.

  FIELD-SYMBOLS <LINES>              TYPE I.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAME) TO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *

  CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body

  ASSIGN (L_TABLE_NAME) TO <TABLE>.                "not headerline

*&SPWIZARD: get looplines of TableControl                              *

  CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.

  ASSIGN (L_LINES_NAME) TO <LINES>.

*&SPWIZARD: get current line                                           *

  GET CURSOR LINE L_SELLINE.

  IF SY-SUBRC <> 0.                   " append line to table

    L_SELLINE = <TC>-LINES + 1.

*&SPWIZARD: set top line                                               *

    IF L_SELLINE > <LINES>.

      <TC>-TOP_LINE = L_SELLINE - <LINES> + 1 .

    ELSE.

      <TC>-TOP_LINE = 1.

    ENDIF.

  ELSE.                               " insert line into table

    L_SELLINE = <TC>-TOP_LINE + L_SELLINE - 1.

    L_LASTLINE = <TC>-TOP_LINE + <LINES> - 1.

  ENDIF.

*&SPWIZARD: set new cursor line                                        *

  L_LINE = L_SELLINE - <TC>-TOP_LINE + 1.

*&SPWIZARD: insert initial line                                        *

  INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.

  <TC>-LINES = <TC>-LINES + 1.

*&SPWIZARD: set cursor                                                 *

  SET CURSOR LINE L_LINE.

ENDFORM.                              " FCODE_INSERT_ROW

*&---------------------------------------------------------------------*

*&      Form  FCODE_DELETE_ROW                                         *

*&---------------------------------------------------------------------*

FORM fcode_delete_row

              USING    P_TC_NAME           TYPE DYNFNAM

                       P_TABLE_NAME

                       P_MARK_NAME   .

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*

  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE cxtab_control.

  FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.

  FIELD-SYMBOLS <WA>.

  FIELD-SYMBOLS <MARK_FIELD>.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAME) TO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *

  CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body

  ASSIGN (L_TABLE_NAME) TO <TABLE>.                "not headerline

*&SPWIZARD: delete marked lines                                        *

  DESCRIBE TABLE <TABLE> LINES <TC>-LINES.

  LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *

    ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

    IF <MARK_FIELD> = 'X'.

      DELETE <TABLE> INDEX SYST-TABIX.

      IF SY-SUBRC = 0.

        <TC>-LINES = <TC>-LINES - 1.

      ENDIF.

    ENDIF.

  ENDLOOP.

ENDFORM.                              " FCODE_DELETE_ROW

*&---------------------------------------------------------------------*

*&      Form  COMPUTE_SCROLLING_IN_TC

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_TC_NAME  name of tablecontrol

*      -->P_OK       ok code

*----------------------------------------------------------------------*

FORM COMPUTE_SCROLLING_IN_TC USING    P_TC_NAME

                                      P_OK.

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*

  DATA L_TC_NEW_TOP_LINE     TYPE I.

  DATA L_TC_NAME             LIKE FELD-NAME.

  DATA L_TC_LINES_NAME       LIKE FELD-NAME.

  DATA L_TC_FIELD_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE cxtab_control.

  FIELD-SYMBOLS <LINES>      TYPE I.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAME) TO <TC>.

*&SPWIZARD: get looplines of TableControl                              *

  CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.

  ASSIGN (L_TC_LINES_NAME) TO <LINES>.

*&SPWIZARD: is no line filled?                                         *

  IF <TC>-LINES = 0.

*&SPWIZARD: yes, ...                                                   *

    L_TC_NEW_TOP_LINE = 1.

  ELSE.

*&SPWIZARD: no, ...                                                    *

    CALL FUNCTION 'SCROLLING_IN_TABLE'

      EXPORTING

        ENTRY_ACT             = <TC>-TOP_LINE

        ENTRY_FROM            = 1

        ENTRY_TO              = <TC>-LINES

        LAST_PAGE_FULL        = 'X'

        LOOPS                 = <LINES>

        OK_CODE               = P_OK

        OVERLAPPING           = 'X'

      IMPORTING

        ENTRY_NEW             = L_TC_NEW_TOP_LINE

      EXCEPTIONS

*       NO_ENTRY_OR_PAGE_ACT  = 01

*       NO_ENTRY_TO           = 02

*       NO_OK_CODE_OR_PAGE_GO = 03

        OTHERS                = 0.

  ENDIF.

*&SPWIZARD: get actual tc and column                                   *

  GET CURSOR FIELD L_TC_FIELD_NAME

             AREA  L_TC_NAME.

  IF SYST-SUBRC = 0.

    IF L_TC_NAME = P_TC_NAME.

*&SPWIZARD: et actual column                                           *

      SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.

    ENDIF.

  ENDIF.

*&SPWIZARD: set the new top line                                       *

  <TC>-TOP_LINE = L_TC_NEW_TOP_LINE.

ENDFORM.                              " COMPUTE_SCROLLING_IN_TC

*&---------------------------------------------------------------------*

*&      Form  FCODE_TC_MARK_LINES

*&---------------------------------------------------------------------*

*       marks all TableControl lines

*----------------------------------------------------------------------*

*      -->P_TC_NAME  name of tablecontrol

*----------------------------------------------------------------------*

FORM FCODE_TC_MARK_LINES USING P_TC_NAME

                               P_TABLE_NAME

                               P_MARK_NAME.

*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*

  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE cxtab_control.

  FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.

  FIELD-SYMBOLS <WA>.

  FIELD-SYMBOLS <MARK_FIELD>.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAME) TO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *

  CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body

  ASSIGN (L_TABLE_NAME) TO <TABLE>.                "not headerline

*&SPWIZARD: mark all filled lines                                      *

  LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *

    ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

    <MARK_FIELD> = 'X'.

  ENDLOOP.

ENDFORM.                                          "fcode_tc_mark_lines

*&---------------------------------------------------------------------*

*&      Form  FCODE_TC_DEMARK_LINES

*&---------------------------------------------------------------------*

*       demarks all TableControl lines

*----------------------------------------------------------------------*

*      -->P_TC_NAME  name of tablecontrol

*----------------------------------------------------------------------*

FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME

                                 P_TABLE_NAME

                                 P_MARK_NAME .

*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*

  DATA L_TABLE_NAME       LIKE FELD-NAME.

  FIELD-SYMBOLS <TC>         TYPE cxtab_control.

  FIELD-SYMBOLS <TABLE>      TYPE STANDARD TABLE.

  FIELD-SYMBOLS <WA>.

  FIELD-SYMBOLS <MARK_FIELD>.

*&SPWIZARD: END OF LOCAL DATA------------------------------------------*

  ASSIGN (P_TC_NAME) TO <TC>.

*&SPWIZARD: get the table, which belongs to the tc                     *

  CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body

  ASSIGN (L_TABLE_NAME) TO <TABLE>.                "not headerline

*&SPWIZARD: demark all filled lines                                    *

  LOOP AT <TABLE> ASSIGNING <WA>.

*&SPWIZARD: access to the component 'FLAG' of the table header         *

    ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.

    <MARK_FIELD> = SPACE.

  ENDLOOP.

ENDFORM.                                          "fcode_tc_mark_lines

*&---------------------------------------------------------------------*

*&      Module  MOD_SET_STATUS  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE MOD_SET_STATUS OUTPUT.

  IF WA_FHD1-ZNUM IS INITIAL.

    APPEND 'PRINT' TO it_fcode.

  ELSE.

    IF it_t_item is not INITIAL.   "如无明细,则不能打印不能保存。

      CLEAR:it_fcode.

      APPEND 'SAVE' TO it_fcode.

      "APPEND 'PRINT' TO it_fcode.

    ENDIF.

  ENDIF.

  SET PF-STATUS 'STATUS_9000' EXCLUDING it_fcode.

  SET TITLEBAR  'TIT_9000'.

*

*  IF STATUS EQ '1'."CREATE

*    SET PF-STATUS 'STATUS_9000'.

*  ELSEIF STATUS EQ '2'."MODIFY

*    SET PF-STATUS 'STATUS_9000M'.

  "ENDIF.

ENDMODULE.                    "MOD_SET_STATUS OUTPUT

*&---------------------------------------------------------------------*

*&      Form  FRM_GET_NUM

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM FRM_GET_NUM .

  DATA:lw_nriv TYPE nriv,

        lw_inri TYPE inri,

*  DATA:l_datum         TYPE sy-datum,

        l_ignore_buffer TYPE c.

  "数据初始化

  lw_inri-object    = 'ZV_FHD1'.

  lw_inri-nrrangenr = '01'.

  lw_inri-quantity  = 1.

  l_ignore_buffer   = 'X'.

  "加锁

  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'

    EXPORTING

      object           = lw_inri-object

    EXCEPTIONS

      foreign_lock     = 1

      object_not_found = 2

      system_failure   = 3

      OTHERS           = 4.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

  "获取货物运单号流水码

  SELECT SINGLE *

    INTO lw_nriv

    FROM nriv

    WHERE object    = lw_inri-object

      AND nrrangenr = lw_inri-nrrangenr.

  IF sy-subrc NE 0.

    "MESSAGE e009.

  ENDIF.

  "获取序列号

  CALL FUNCTION 'NUMBER_GET_NEXT'

    EXPORTING

      nr_range_nr             = lw_inri-nrrangenr

      object                  = lw_inri-object

      quantity                = lw_inri-quantity

*     subobject               =

*     toyear                  =

      ignore_buffer           = l_ignore_buffer

    IMPORTING

      number                  = WA_FHD1-ZNUM

    EXCEPTIONS

      interval_not_found      = 1

      number_range_not_intern = 2

      object_not_found        = 3

      quantity_is_0           = 4

      quantity_is_not_1       = 5

      interval_overflow       = 6

      buffer_overflow         = 7

      OTHERS                  = 8.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

  LOOP AT it_t_item INTO wa_s_item.

    wa_fhd1-vbeln  =  wa_s_item-vbeln .

    wa_fhd1-posnr  =  wa_s_item-posnr .

    wa_fhd1-matnr  =  wa_s_item-matnr .

    wa_fhd1-arktx  =  wa_s_item-arktx .

    wa_fhd1-kunnr  =  wa_s_item-kunnr .

    wa_fhd1-kunag  =  wa_s_item-kunag .

    wa_fhd1-vkorg  =  wa_s_item-vkorg .

    wa_fhd1-ernam  =  sy-uname.

    wa_fhd1-cpudt  =  sy-datum.

    wa_fhd1-name1  =  wa_s_item-name1 .

    wa_fhd1-name2  =  wa_s_item-name2 .

    wa_fhd1-name3  =  wa_s_item-name3 .

    wa_fhd1-lfimg  =  wa_s_item-lfimg .

    wa_fhd1-MSEHL  =  wa_s_item-MSEHL .

    wa_fhd1-lgort  =  wa_s_item-lgort .

    wa_fhd1-butxt  =  wa_s_item-butxt .

    wa_fhd1-wadat  =  wa_s_item-wadat .

    APPEND wa_fhd1 to tb_fhd1.

  ENDLOOP.

  CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'

    EXPORTING

      object           = lw_inri-object

    EXCEPTIONS

      object_not_found = 1

      OTHERS           = 2.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

  MODIFY ZSDT_FHINF FROM TABLE tb_fhd1.

  IF sy-subrc eq 0.

    MESSAGE '保存成功' type 'I'.

  ELSE.

    MESSAGE '保存不成功' type 'I'.

  ENDIF.

ENDFORM.                    " FRM_GET_NUM

*&---------------------------------------------------------------------*

*&      Form  FRM_SAVE_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM FRM_SAVE_DATA .

  IF wa_fhd1-ZNUM IS INITIAL and it_t_item is NOT INITIAL.

    PERFORM FRM_GET_NUM.

   ELSE.

     MESSAGE E085(ZSD_DEV) .

  ENDIF.

ENDFORM.                    " FRM_SAVE_DATA

*&---------------------------------------------------------------------*

*&      Module  USER_COMMAND_9000  INPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE USER_COMMAND_9000 INPUT.

  save_ok = ok_code.

  CLEAR:ok_code.

  CASE save_ok.

    WHEN 'SAVE'.

      PERFORM FRM_SAVE_DATA.

    WHEN 'PRINT'.

      IF wa_fhd1-ZNUM IS NOT  INITIAL AND it_t_item IS NOT INITIAL.

        PERFORM FRM_PRINT_DATA.

      ENDIF.

    WHEN 'EXIT'.

      FREE IT_T_ITEM.

      LEAVE PROGRAM.

    WHEN 'BACK' OR 'CANC'.

      FREE IT_T_ITEM.

      LEAVE TO SCREEN 0.

      LEAVE PROGRAM.

    WHEN OTHERS.

  ENDCASE.

ENDMODULE.                 " USER_COMMAND_9000  INPUT

*&---------------------------------------------------------------------*

*&      Form  FRM_PRINT_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM FRM_PRINT_DATA .

  DATA :LTB_ALV TYPE  ZSDP_FHD=>GTY_T_OUT,

        LST_ALV TYPE  ZSDP_FHD=>GTY_S_OUT,

        LT_ALV  TYPE  ZSDP_FHD=>GTY_T_OUT,

        LS_ALV  TYPE  ZSDP_FHD=>GTY_S_OUT,

*        LT_LIKP TYPE  ZSDP_FHD=>GTY_T_LIKP,

*        LS_LIKP TYPE  ZSDP_FHD=>GTY_S_LIKP,

*        LS_LIPS TYPE  ZSDP_FHD=>GTY_S_LIKP,

        LT_T006A TYPE  ZSDP_FHD=>GTY_T_T006A,

        LS_T006A TYPE  ZSDP_FHD=>GTY_S_T006A,

        LS_ITEM TYPE ZSDT_SOP,

        LT_ITEM TYPE STANDARD TABLE OF ZSDT_SOP,

        LST_ITEM  TYPE  ZSDT_SOP,

        LTB_ITEM  TYPE  ZSDTT_SOP.

  DATA: LV_TABIX TYPE SY-TABIX,

        L_TABIX TYPE SY-TABIX,

        L_INDEX  TYPE SY-TABIX,

        LV_MUM   TYPE I,

        LV_LINES TYPE I,

        LV_LINE  TYPE I,

        LV_COUNT TYPE I,

        LV_MOD7  TYPE I,

        NUM_LINE TYPE I,

        NOW_COUNT TYPE I,

        LV_QUENCE TYPE I VALUE 0,

        COUNT    TYPE LFIMG,

        COUNT_BY    TYPE LFIMG,

        name4 TYPE txt255,

        flag  TYPE i,

        LV_S   TYPE I.

  DATA:T_CREATE TYPE STRING.

  LOOP AT it_t_item INTO wa_s_item.

    LS_ITEM-VBELN =  wa_s_item-VBELN.

    LS_ITEM-POSNR =  wa_s_item-POSNR.

    LS_ITEM-MATNR =  wa_s_item-MATNR.

    LS_ITEM-ARKTX =  wa_s_item-ARKTX.

    LS_ITEM-LGORT =  wa_s_item-LGORT.

    LS_ITEM-LFIMG =  wa_s_item-LFIMG.

    LS_ITEM-MSEHL =  wa_s_item-MSEHL.

    LS_ITEM-MVGR4 =  wa_s_item-MVGR4.

    LS_ITEM-BEZEI =  wa_s_item-BEZEI.

    APPEND LS_ITEM TO LT_ITEM.

    AT END OF vbeln .

      flag = flag + 1.

      IF  flag eq 1.

       name4 =  wa_s_item-VBELN.

     ELSE.

      CONCATENATE name4  wa_s_item-VBELN into name4

                 SEPARATED BY '/'.

      ENDIF.

      ENDAT.

  ENDLOOP.

   move wa_alv to ls_alv.

   ls_alv-item = lt_item.

   ls_alv-vbeln = wa_fhd1-znum.

   ls_alv-GMZBH = wa_fhd1-txt255.

   "ls_alv-name = wa_fhd1-namer.

   ls_alv-name4 = name4.

   APPEND ls_alv to lt_alv.

   FREE:lt_item .

  IF P_CB1 EQ 'X' .

    COS_LINE = 10.

    LOOP AT LT_ALV INTO LS_ALV.

      SORT LS_ALV-ITEM BY MVGR4.

      move LS_ALV-ITEM TO LT_ITEM.

      LOOP AT LS_ALV-ITEM INTO LS_ITEM.

        COUNT = COUNT +  LS_ITEM-LFIMG.

        MOVE LS_ITEM TO LST_ITEM.

        COUNT_BY = COUNT_BY + LST_ITEM-LFIMG.

        AT END OF MVGR4.

          CLEAR LST_ITEM-MATNR.

          LST_ITEM-ARKTX = LST_ITEM-BEZEI.

          LST_ITEM-LFIMG = COUNT_BY.

          CLEAR:count_by.

          APPEND LST_ITEM TO LT_ITEM.

          CLEAR:LST_ITEM.

        ENDAT.

      ENDLOOP.

      SORT LT_ITEM BY MVGR4.

      DESCRIBE TABLE  LT_ITEM LINES LV_MUM.

      LV_LINES = LV_MUM MOD COS_LINE.

      IF LV_LINES NE 0.

        LV_LINES = COS_LINE - LV_LINES.

        DO LV_LINES  TIMES.

          APPEND INITIAL LINE TO   LT_ITEM.

          CLEAR LV_LINES.

          CLEAR LV_MUM.

        ENDDO.

      ENDIF.

      LS_ALV-ITEM = LT_ITEM.

      LS_ALV-LFIMG = COUNT.

      FREE:LT_ITEM.

      MODIFY LT_ALV FROM LS_ALV.

      CLEAR:LS_ALV,COUNT.

    ENDLOOP.

    FORM_NAME = 'ZSD_FHD2'.

  ELSE.

    COS_LINE = 6.

    FORM_NAME = 'ZSD_FHD2'.

    LOOP AT LT_ALV INTO LS_ALV.

      MOVE LS_ALV-ITEM TO LT_ITEM.

      DESCRIBE TABLE  LS_ALV-ITEM LINES LV_MUM.

      LV_LINES = LV_MUM MOD COS_LINE.

      IF LV_LINES NE 0.

        LV_LINES = COS_LINE - LV_LINES.

        DO LV_LINES  TIMES.

          APPEND INITIAL LINE TO   LT_ITEM.

          CLEAR LV_LINES.

          CLEAR LV_MUM.

        ENDDO.

      ENDIF.

      LS_ALV-ITEM = LT_ITEM.

      FREE:LT_ITEM.

      MODIFY LT_ALV FROM LS_ALV.

      CLEAR:LS_ALV.

    ENDLOOP.

  ENDIF.

  SORT LT_ALV BY VBELN .

  LOOP AT LT_ALV INTO LS_ALV.

    LV_S =  0.

    MOVE  LS_ALV TO LST_ALV.

    IF LST_ALV-CMGST EQ 'B'.

      MESSAGE '交货单信用冻结,请释放交货单再打印!' TYPE 'E'.

    ENDIF.

    DESCRIBE TABLE LST_ALV-ITEM LINES LV_LINE.

    NUM_LINE = LV_LINE / COS_LINE .

    WA_OUT-COUNT = NUM_LINE ."总页数

    LOOP AT LST_ALV-ITEM INTO LST_ITEM.

      LV_COUNT = LV_COUNT + 1.

      LV_MOD7 = LV_COUNT MOD COS_LINE.

      LV_QUENCE = LV_QUENCE + 1.

      COUNT = COUNT + LST_ITEM-LFIMG.

      IF  LST_ITEM-ARKTX  IS  INITIAL.

        LV_S =  LV_S +  1.

        IF LV_S  EQ  1.

          LST_ITEM-ARKTX  = '以下空白//'.

        ENDIF.

      ENDIF.

      SHIFT LST_ITEM-MATNR LEFT DELETING LEADING '0'.

      LST_ITEM-ZEILI  = LV_QUENCE.

      APPEND  LST_ITEM TO LTB_ITEM.

      CLEAR  LST_ITEM .

      IF LV_MOD7 EQ 0.

        NOW_COUNT = NOW_COUNT + 1.

        WA_OUT-PAGE = NOW_COUNT.

        WA_OUT-VBELN = LST_ALV-VBELN.

        WA_OUT-WADAT =  LST_ALV-WADAT.

        WA_OUT-NAME  =  LST_ALV-NAME.

        WA_OUT-NAME1 =  LST_ALV-NAME1.

        WA_OUT-NAME2 =  LST_ALV-NAME2.

        WA_OUT-CMGST =  LST_ALV-CMGST.

        WA_OUT-VTEXT =  LST_ALV-VTEXT.

        WA_OUT-BUTXT =  LST_ALV-BUTXT.

        WA_OUT-ERDAT =  LST_ALV-ERDAT.

        WA_OUT-NAME3 =  LST_ALV-NAME3.

        WA_OUT-GMZBH =  LST_ALV-GMZBH.

        WA_OUT-NAMEX  = LST_ALV-NAMEX.

        WA_OUT-NAME4  = LST_ALV-NAME4.

        WA_OUT-ITEM = LTB_ITEM.

        AT END OF VBELN.

          WA_OUT-LFIMG = count.

          WA_OUT-LFIMG1 = lst_alv-LFIMG.

        ENDAT.

        APPEND WA_OUT TO TB_OUT.

        CLEAR LTB_ITEM.

        CLEAR LV_MOD7.

        CLEAR :LV_QUENCE,

               LV_COUNT.

        FREE:LTB_ITEM.

      ENDIF.

    ENDLOOP.

    CLEAR :LV_LINE,

           LS_ALV,

           NUM_LINE,

           NOW_COUNT.

  ENDLOOP.

  SORT TB_OUT BY VBELN POSNR.

  PERFORM FRM_PRINTNAME.

  PERFORM FRM_PRINTEXEC.

ENDFORM.                    " FRM_PRINT_DATA

FORM FRM_PRINTNAME.

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

    EXPORTING

      FORMNAME           = FORM_NAME

    IMPORTING

      FM_NAME            = G_RS38L_FNAM

    EXCEPTIONS

      NO_FORM            = 1

      NO_FUNCTION_MODULE = 2

      OTHERS             = 3.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM.                    "PRINTNAME

FORM FRM_PRINTEXEC.

  CALL FUNCTION G_RS38L_FNAM

    EXPORTING

      GT_OUTPUT        = TB_OUT

    EXCEPTIONS

      FORMATTING_ERROR = 1

      INTERNAL_ERROR   = 2

      SEND_ERROR       = 3

      USER_CANCELED    = 4

      OTHERS           = 5.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

  FREE:TB_OUT.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_GETZNUM_F4

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      <--P_S_ZNUM_LOW  text

*----------------------------------------------------------------------*

FORM FRM_GETZNUM_F4  CHANGING FC_S_ZNUM.

  DATA: BEGIN OF lt_fhinf OCCURS 0,

          ZNUM    TYPE zsdt_fhinf-ZNUM,

          kunnr   TYPE zsdt_fhinf-kunnr,

          name1   TYPE zsdt_fhinf-name1,

          cpudt   TYPE zsdt_fhinf-cpudt,

        END OF lt_fhinf ,

        lt_fields LIKE help_value OCCURS 1 WITH HEADER LINE,

        lp_fhinf LIKE help_info-fldvalue.

  IF FC_S_ZNUM IS NOT INITIAL.

    SELECT znum   kunnr name1 cpudt

      INTO TABLE lt_fhinf

      FROM zsdt_fhinf

      WHERE znum = FC_S_ZNUM AND lovem <> 'X'.

  ELSE.

    SELECT znum   kunnr name1 cpudt

      INTO TABLE lt_fhinf

      FROM zsdt_fhinf.

  ENDIF.

  IF sy-subrc <> 0 .

    MESSAGE s001 DISPLAY LIKE 'E'.

  ENDIF  .

  DELETE ADJACENT DUPLICATES FROM lt_fhinf COMPARING ALL FIELDS.

  "条件里,选择发货单时,倒序排序

  SORT lt_fhinf BY znum DESCENDING.

  CLEAR lt_fields.

  lt_fields-tabname = 'ZSDT_FHINF'.

  lt_fields-fieldname = 'ZNUM'.

  lt_fields-selectflag = 'X'.

  APPEND lt_fields.

  lt_fields-tabname = 'ZSDT_FHINF'.

  lt_fields-fieldname = 'KUNNR'.

  lt_fields-selectflag = ' '.

  APPEND lt_fields.

  lt_fields-tabname = 'ZSDT_FHINF'.

  lt_fields-fieldname = 'NAME1'.

  lt_fields-selectflag = ' '.

  APPEND lt_fields.

  lt_fields-tabname = 'ZSDT_FHINF'.

  lt_fields-fieldname = 'CPUDT'.

  lt_fields-selectflag = ' '.

  APPEND lt_fields.

  CALL FUNCTION 'HELP_VALUES_GET_NO_DD_NAME'

    EXPORTING

      selectfield                  = 'LT_FHINF-ZNUM'

      no_pers_help_select          = 'X'

      write_selectfield_in_colours = 'X'

      reduced_status_only          = 'X'

    IMPORTING

      select_value                 = lp_fhinf

    TABLES

      fields                       = lt_fields

      full_table                   = lt_fhinf

    EXCEPTIONS

      full_table_empty             = 1

      no_tablestructure_given      = 2

      no_tablefields_in_dictionary = 3

      more_then_one_selectfield    = 4

      no_selectfield               = 5

      OTHERS                       = 6.

  IF sy-subrc EQ 0.

    MOVE lp_fhinf TO FC_S_ZNUM.

  ENDIF.

  FREE:lt_fhinf,lt_fields,lp_fhinf.

ENDFORM.                    " FRM_GETZNUM_F4

FORM FRM_GET_FHINF .

  TYPES:BEGIN OF TY_S1_ITEMSC,

      ZNUM  TYPE ZSDT_FHINF-ZNUM,

      VBELN TYPE LIKP-VBELN,

      POSNR TYPE LIPS-POSNR,

      MATNR TYPE MARA-MATNR,

      arktx TYPE lips-arktx,

      lgort TYPE lips-lgort,

      LFIMG TYPE LIPS-LFIMG,"交货数量

      MSEHL TYPE t006a-MSEHL,"单位

      kunnr TYPE kunnr,

      kunag TYPE kunnr,

      vkorg TYPE vkorg,

      ernam TYPE ernam,

      mvgr4 TYPE mvgr4,

      bezei TYPE bezei,

      name1 TYPE name1,

      name2 TYPE name1,

      name3 TYPE name1,

      butxt TYPE butxt,

      wadat TYPE likp-wadat,

      txt255 TYPE txt255,

      LOVEM TYPE ZSDT_FHINF-LOVEM,"删除标识

      END OF  TY_S1_ITEMSC.

DATA: LT_FHEMSC TYPE TABLE OF   TY_S1_ITEMSC,

      LS_FHEMSC1 TYPE TY_S1_ITEMSC,

      LS_FHEMSC TYPE TY_S1_ITEMSC.

    FREE:IT_T_item.

    CLEAR:wa_fhd1.

 SELECT ZNUM vbeln posnr matnr arktx lfimg lovem MSEHL butxt lgort

           vkorg kunnr kunag name1 name2 name3 txt255 wadat ernam

           mvgr4 bezei

           FROM zsdt_fhinf

           INTO CORRESPONDING FIELDS OF TABLE LT_FHEMSC

           WHERE znum in s_znum   and lovem <> 'X'.

   IF LT_FHEMSC IS NOT INITIAL.

     LOOP AT LT_FHEMSC INTO LS_FHEMSC.

        wa_s_item-vbeln = LS_FHEMSC-vbeln.

        wa_s_item-posnr = LS_FHEMSC-posnr.

        wa_s_item-matnr = LS_FHEMSC-matnr.

        wa_s_item-arktx = LS_FHEMSC-arktx.

        wa_s_item-LFIMG = LS_FHEMSC-LFIMG.

        wa_s_item-lgort = LS_FHEMSC-lgort.

        wa_s_item-mvgr4 = LS_FHEMSC-mvgr4.

        wa_s_item-bezei = LS_FHEMSC-bezei.

        wa_s_item-vkorg = LS_FHEMSC-vkorg.

        wa_s_item-kunnr = LS_FHEMSC-kunnr.

        wa_s_item-kunag = LS_FHEMSC-kunag.

        wa_s_item-LGORT = LS_FHEMSC-LGORT.

        wa_s_item-name1 = LS_FHEMSC-name1.

        wa_s_item-name2 = LS_FHEMSC-name2.

        wa_s_item-name3 = LS_FHEMSC-txt255.

        wa_s_item-wadat = LS_FHEMSC-wadat.

        wa_s_item-butxt = LS_FHEMSC-butxt.

        wa_s_item-MSEHL = LS_FHEMSC-MSEHL.

        MOVE LS_FHEMSC to LS_FHEMSC1.

        APPEND wa_s_item to it_t_item.

       AT END OF ZNUM.

          wa_alv-name1 = LS_FHEMSC1-name1.

          wa_alv-name2 = LS_FHEMSC1-name2.

          wa_alv-erdat = LS_FHEMSC1-WADAT.

          wa_alv-name3 = LS_FHEMSC1-name3.

          wa_alv-erdat = LS_FHEMSC1-WADAT.

          WA_ALV-BUTXT = LS_FHEMSC1-BUTXT.

          wa_fhd1-znum = LS_FHEMSC1-znum.

          wa_fhd1-txt255 = LS_FHEMSC1-txt255.

         ENDAT.

     ENDLOOP.

     CALL SCREEN 9000.

     ELSE.

     MESSAGE E084(ZSD_DEV).

   ENDIF.

ENDFORM.

SAP ABAP开发之-Report

一个SAP ERP实施项目,如果没有报表的开发,那几乎就是没有灵魂的,也在于SAP逐步开始把自己的产品线,尤其是报表的强项,转移到BW BI BO等产品线,所以原生态的SAP ERP,本身报表功能并不强大。于是我的实施过程,对报表的开发也就按序展开。以销售明细表为例,源代码Coding如下:

*&---------------------------------------------------------------------

*

*&      Form  GLOBALS_PUSH

*&---------------------------------------------------------------------

*

*       text

*----------------------------------------------------------------------

*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------

*

form globals_push.

  data: l_status_set       type  slis_formname,

        l_user_command     type  slis_formname,

        l_top_of_page      type  slis_formname,

        l_top_of_list      type  slis_formname,

        l_end_of_list      type  slis_formname,

        l_end_of_page      type  slis_formname,

        l_subtotal_text    type  slis_formname,

        l_html_top_of_page type  slis_formname,

        l_data_changed     type  slis_formname,

        l_caller_exit      type  slis_formname,

        l_html_end_of_list type  slis_formname,

        l_context_menu     type  slis_formname.

*

  insert gt_grid index 1.

  clear  gt_grid.

  clear:

    g_parent_grid,

    g_parent_html,

    g_parent_end.

  gt_grid-repid = sy-repid.

  perform events_get using l_status_set

                           l_user_command

                           l_top_of_page

                           l_end_of_page

                           l_subtotal_text

                           l_html_top_of_page

                           l_html_end_of_list

                           l_data_changed

                           l_caller_exit

                           l_top_of_list

                           l_end_of_list

                           l_context_menu.

  gt_grid-r_salv_fullscreen_adapter = ir_salv_fullscreen_adapter.

  gt_grid-i_callback_program          = i_callback_program.

  gt_grid-i_callback_pf_status_set    = l_status_set.

  gt_grid-i_callback_user_command     = l_user_command.

  gt_grid-i_callback_top_of_page      = l_top_of_page.

  gt_grid-i_callback_end_of_page      = l_end_of_page.

  gt_grid-i_callback_top_of_list      = l_top_of_list.

  gt_grid-i_callback_end_of_list      = l_end_of_list.

  gt_grid-i_callback_subtotal_text    = l_subtotal_text.

  gt_grid-i_callback_caller_exit      = l_caller_exit.

  gt_grid-i_callback_data_changed     = l_data_changed.

  gt_grid-i_callback_context_menu     = l_context_menu.

  if not l_html_top_of_page is initial.

    gt_grid-i_callback_html_top_of_page = l_html_top_of_page.

  else.

    if gt_grid-r_salv_fullscreen_adapter is bound.

      if l_top_of_list is initial or

        i_grid_settings-top_p_only = 'X'.

        gt_grid-flg_no_html = 'X'.

      endif.

    else.

      if l_top_of_page is initial or

        i_grid_settings-top_p_only = 'X'.

        gt_grid-flg_no_html = 'X'.

      endif.

    endif.

  endif.

  gt_grid-s_variant = is_variant.

*>>> new API

  if gt_grid-r_salv_fullscreen_adapter is not bound.

*<<< new API

    if is_variant-report is initial and not i_save is initial.

      gt_grid-s_variant-report = i_callback_program.

    endif.

    if is_variant-report is initial and i_save is initial.

      gt_grid-s_variant_save-report = i_callback_program.

    endif.

*>>> new API

  endif.

*<<< new API

  if not l_html_end_of_list is initial.

    gt_grid-i_callback_html_end_of_list = l_html_end_of_list.

  else.

    if l_end_of_list is initial or

      i_grid_settings-eol_p_only = 'X'.

      gt_grid-flg_no_html_end = 'X'.

    endif.

  endif.

  gt_grid-s_sel_hide = is_sel_hide.

  gt_grid-t_alv_graphics = it_alv_graphics.

  data: ls_alv_graphics type dtc_s_tc.

  ls_alv_graphics-prop_id  = 'FULLSCREEN_MODE'.

  ls_alv_graphics-prop_val = abap_true.

  append ls_alv_graphics to gt_grid-t_alv_graphics.

endform.                               " GLOBALS_PUSH

*&---------------------------------------------------------------------

*

*&      Form  events_get

*&---------------------------------------------------------------------

*

form events_get using r_status_set       type slis_formname

                      r_user_command     type slis_formname

                      r_top_of_page      type slis_formname

                      r_end_of_page      type slis_formname

                      r_subtotal_text    type slis_formname

                      r_html_top_of_page type slis_formname

                      r_html_end_of_list type slis_formname

                      r_data_changed     type slis_formname

                      r_caller_exit      type slis_formname

                      r_top_of_list      type slis_formname

                      r_end_of_list      type slis_formname

                      r_context_menu     type slis_formname.

  data: ls_events type slis_alv_event.

  r_status_set       = i_callback_pf_status_set.

  r_user_command     = i_callback_user_command.

  r_top_of_page      = i_callback_top_of_page.

  r_html_top_of_page = i_callback_html_top_of_page.

  r_html_end_of_list = i_callback_html_end_of_list.

  loop at it_events into ls_events where not form is initial.

    case ls_events-name.

      when slis_ev_top_of_page.

        r_top_of_page  = ls_events-form.

      when slis_ev_data_changed.

        r_data_changed = ls_events-form.

      when slis_ev_end_of_page.

        r_end_of_page  = ls_events-form.

      when slis_ev_user_command.

        r_user_command = ls_events-form.

      when slis_ev_pf_status_set.

        r_status_set   = ls_events-form.

      when slis_ev_subtotal_text.

        r_subtotal_text = ls_events-form.

      when slis_ev_top_of_list.

        r_top_of_list = ls_events-form.

      when slis_ev_end_of_list.

        r_end_of_list = ls_events-form.

      when slis_ev_caller_exit_at_start.

        r_caller_exit = ls_events-form.

      when slis_ev_context_menu.

        r_context_menu = ls_events-form.

    endcase.

  endloop.

endform.                               " events_get

*&---------------------------------------------------------------------

*

*&      Form  REPREP_CHECK

*&---------------------------------------------------------------------

*

form reprep_check.

  data: l_subrc type sy-subrc.

  if is_layout-reprep = 'X'.

    perform reprep_exit_check in program saplkkbl

                              using l_subrc.

    if l_subrc = 0 .

      perform reprep_trsti_check in program saplkkbl

                                 using gt_grid-t_fccls

                                       i_callback_program

                                       is_reprep_id

                                       l_subrc.

      perform reprep_stack_check in program saplkkbl

                                 using i_callback_program

                                       is_reprep_id

                                       gt_grid-flg_called.

    endif.

  endif.

endform.                               " REPREP_CHECK

*---------------------------------------------------------------------*

*       FORM REPREP_CHECK_lvc                                         *

*---------------------------------------------------------------------*

*       ........                                                      *

*---------------------------------------------------------------------*

form reprep_check_lvc.

  data: l_subrc type sy-subrc.

  data: ls_reprep_id type slis_reprep_id.

  perform reprep_exit_check in program saplkkbl

                            using l_subrc.

  if l_subrc = 0 .

    call function 'LVC_TRANSFER_TO_KKBLO'

      exporting

        is_reprep_lvc      = is_reprep_id_lvc

      importing

        es_reprep_id_kkblo = ls_reprep_id.

    perform reprep_trsti_check in program saplkkbl

                               using gt_grid-t_fccls

                                     i_callback_program

                                     ls_reprep_id

                                     l_subrc.

    perform reprep_stack_check in program saplkkbl

                               using i_callback_program

                                     ls_reprep_id

                                     gt_grid-flg_called.

  endif.

endform.                               " REPREP_CHECK

*&---------------------------------------------------------------------

*

*&      Form  TRANSFER_SLIS_TO_LVC

*&---------------------------------------------------------------------

*

form transfer_slis_to_lvc.

  data: ls_fieldcat type kkblo_fieldcat.

  data: l_tabname type kkblo_tabname.                       "#EC NEEDED

  call function 'REUSE_ALV_TRANSFER_DATA'

    exporting

      is_print          = is_print

      it_fieldcat       = it_fieldcat

      is_layout         = is_layout

      it_sort           = it_sort

      it_filter         = it_filter

      it_excluding      = it_excluding

      it_special_groups = it_special_groups

      it_event_exit     = it_event_exit

      it_except_qinfo   = it_except_qinfo

    importing

      et_event_exit     = gt_grid-t_event_exit

      et_fieldcat       = gt_grid-t_fieldcat

      es_layout         = gt_grid-s_layout

      et_sort           = gt_grid-t_sort

      et_filter         = gt_grid-t_filter

      et_excluding      = gt_grid-t_excluding

      et_special_groups = gt_grid-t_special_groups

      et_except_qinfo   = gt_grid-t_qinfo.

  loop at gt_grid-t_fieldcat into ls_fieldcat

                             where not tabname is initial.

    l_tabname = ls_fieldcat-tabname.

    exit.

  endloop.

  if sy-subrc ne 0.

    l_tabname = '1'.

  endif.

  call function 'LVC_TRANSFER_FROM_KKBLO'

    exporting

      i_structure_name        = i_structure_name

      it_fieldcat_kkblo       = gt_grid-t_fieldcat

      it_sort_kkblo           = gt_grid-t_sort

      it_filter_kkblo         = gt_grid-t_filter

      it_special_groups_kkblo = gt_grid-t_special_groups

      is_layout_kkblo         = gt_grid-s_layout

      it_add_fieldcat         = it_add_fieldcat

      it_excluding_kkblo      = gt_grid-t_excluding[]

      it_except_qinfo_kkblo   = gt_grid-t_qinfo[]

    importing

      et_fieldcat_lvc         = gt_grid-t_lvc_fieldcat

      et_sort_lvc             = gt_grid-t_lvc_sort

      et_filter_lvc           = gt_grid-t_lvc_filter

      et_special_groups_lvc   = gt_grid-t_lvc_spec

      es_layout_lvc           = gt_grid-s_lvc_layout

      es_print_info_lvc       = gt_grid-s_lvc_print

      et_excluding_lvc        = gt_grid-t_excluding_lvc[]

      et_except_qinfo_lvc     = gt_grid-t_lvc_qinfo[]

    tables

      it_data                 = t_outtab.

  gt_grid-s_lvc_layout-no_toolbar = 'X'.

  gt_grid-s_lvc_layout-grid_title = i_grid_title.

  gt_grid-s_lvc_layout-no_rowmove = 'X'.

  gt_grid-t_add_fieldcat = it_add_fieldcat.

  gt_grid-t_lvc_hyperlink = it_hyperlink.

*>>> new API

  if gt_grid-r_salv_fullscreen_adapter is bound.

    call method gt_grid-r_salv_fullscreen_adapter->if_salv_adapter~complete_metadata

      changing

        t_fieldcatalog = gt_grid-t_lvc_fieldcat

        s_layout       = gt_grid-s_lvc_layout.

  endif.

*<<< new API

endform.                               " TRANSFER_SLIS_TO_LVC

*---------------------------------------------------------------------*

*       FORM TRANSFER_lvc_TO_LVC                                      *

*---------------------------------------------------------------------*

*       ........                                                      *

*---------------------------------------------------------------------*

form transfer_lvc_to_lvc.

  call function 'REUSE_ALV_TRANSFER_DATA'

    exporting

      it_excluding  = it_excluding

      it_event_exit = it_event_exit

    importing

      et_event_exit = gt_grid-t_event_exit

      et_excluding  = gt_grid-t_excluding.

  gt_grid-t_lvc_fieldcat = it_fieldcat_lvc.

  gt_grid-t_lvc_sort     = it_sort_lvc.

  gt_grid-t_lvc_filter   = it_filter_lvc.

  gt_grid-t_lvc_spec     = it_special_groups_lvc.

  gt_grid-s_lvc_layout   = is_layout_lvc.

  gt_grid-s_lvc_print    = is_print_lvc.

  gt_grid-t_lvc_hyperlink = it_hyperlink.

  gt_grid-t_lvc_qinfo    = it_except_qinfo_lvc.

  if not is_layout_lvc-box_fname is initial.

    gt_grid-s_lvc_layout-sel_mode = 'A'.

  endif.

  gt_grid-s_lvc_layout-no_toolbar = 'X'.

  gt_grid-s_lvc_layout-grid_title = i_grid_title.

*>>> INSERT BRAUNMI B20K8A0OM8 DRAG AND DROP ROWS

  gt_grid-s_lvc_layout-no_rowmove = 'X'.

*<<< INSERT BRAUNMI B20K8A0OM8 DRAG AND DROP ROWS

  gt_grid-s_layout-box_fieldname = gt_grid-s_lvc_layout-box_fname.

endform.                               " TRANSFER_SLIS_TO_LVC

*&---------------------------------------------------------------------

*

*&      Form  GLOBALS_POP

*&---------------------------------------------------------------------

*

*       text

*----------------------------------------------------------------------

*

form globals_pop.

* this read is absolutly necessary to fill the table header

  read table gt_grid index 1.

*

  delete gt_grid index 1.

endform.                               " GLOBALS_POP

*&---------------------------------------------------------------------

*

*&      Form  PBO

*&---------------------------------------------------------------------

*

form pbo.

  data: ls_variant type disvariant.

  data: ls_reprep_id type lvc_s_rprp.

  data: l_i type i value 1,

        l_fcat_complete type sap_bool.

  data: l_number_rows type i value 1.

*>>> INSERT BRAUNMI RepRep

  data: ls_event type slis_alv_event.

*<<< INSERT BRAUNMI RepRep

  data: l_html_height_top type i,

        l_html_height_end type i.

  data: l_height type i.

  constants: con_hex02      type x value '02'.    " Druckmodus

  if gt_grid-s_variant_save-report is initial.

    ls_variant = gt_grid-s_variant.

  else.

    ls_variant = gt_grid-s_variant_save.

  endif.

* >>> for object model:

  if not gt_grid-r_salv_fullscreen_adapter is initial.

*fieldcatalog is complete

    l_fcat_complete = abap_true.

  endif.

* <<<<<

  if cl_gui_alv_grid=>offline( ) is initial.

    if not gt_grid-s_layout-box_fieldname is initial.

      set handler gc_event_receiver->handle_before_user_command for

                                               gt_grid-grid.

      set handler gc_event_receiver->handle_after_refresh for

                                               gt_grid-grid.

    endif.

* create TOP-Document

    if gt_grid-flg_no_html is initial and gt_grid-top is initial.

      create object gt_grid-top

        exporting

          style = 'ALV_GRID'.

    endif.

* create BOTTOM-Document

    if gt_grid-flg_no_html_end is initial and gt_grid-bottom is initial

.

      create object gt_grid-bottom

        exporting

          style = 'ALV_GRID'.

    endif.

*

    if gt_grid-flg_no_html is initial.

      add 1 to l_i.

    endif.

    if gt_grid-flg_no_html_end is initial.

      add 1 to l_i.

    endif.

    l_number_rows = l_i.

    if gt_grid-container is initial.

      create object gt_grid-container

        exporting

          container_name = mycontainer

          lifetime       = cntl_lifetime_dynpro.

    endif.

*

    if gt_grid-grid is initial.

      if l_number_rows = 1.

        "Factory method instead of constructor

        if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.

        gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(

          exporting

            i_appl_events   = 'X'

            i_parent        = gt_grid-container

            i_fcat_complete = l_fcat_complete ).

        else.

        create object gt_grid-grid  "Factory

          exporting

            i_appl_events   = 'X'

            i_parent        = gt_grid-container

            i_fcat_complete = l_fcat_complete.

        endif.

      else.

        create object gt_grid-splitter

          exporting

            parent  = gt_grid-container

            rows    = l_number_rows

            columns = 1.

        if gt_grid-flg_no_html is initial.

          call method gt_grid-splitter->get_container

            exporting

              row       = 1

              column    = 1

            receiving

              container = g_parent_html.

          call method gt_grid-splitter->get_container

            exporting

              row       = 2

              column    = 1

            receiving

              container = g_parent_grid.

        else.

          call method gt_grid-splitter->get_container

            exporting

              row       = 1

              column    = 1

            receiving

              container = g_parent_grid.

        endif.

        if gt_grid-flg_no_html_end is initial.

          if gt_grid-flg_no_html is initial.

            call method gt_grid-splitter->get_container

              exporting

                row       = 3

                column    = 1

              receiving

                container = g_parent_end.

          else.

            call method gt_grid-splitter->get_container

              exporting

                row       = 2

                column    = 1

              receiving

                container = g_parent_end.

          endif.

        endif.

        if i_grid_settings-coll_top_p eq 'X'.

          l_html_height_top = 0.

        elseif i_html_height_top is initial.

          l_html_height_top = 20.

        else.

          l_html_height_top = i_html_height_top.

        endif.

        if i_grid_settings-coll_end_l eq 'X'.

          l_html_height_end = 0.

        elseif i_html_height_end is initial.

          l_html_height_end = 20.

        else.

          l_html_height_end = i_html_height_end.

        endif.

        case l_i.

          when 2.

            if gt_grid-flg_no_html is initial.

              call method gt_grid-splitter->set_row_height

                exporting

                  id     = 1

                  height = l_html_height_top.

            else.

              call method gt_grid-splitter->set_row_height

                exporting

                  id     = 2

                  height = l_html_height_end.

            endif.

          when 3.

            call method gt_grid-splitter->set_row_height

              exporting

                id     = 1

                height = l_html_height_top.

            call method gt_grid-splitter->set_row_height

              exporting

                id     = 3

                height = l_html_height_end.

        endcase.

        "Factory method instead of constructor

        if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.

        gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(

          exporting

            i_appl_events   = 'X'

            i_parent        = g_parent_grid

            i_fcat_complete = l_fcat_complete ).

        else.

        create object gt_grid-grid  "Factory

          exporting

            i_appl_events   = 'X'

            i_parent        = g_parent_grid

            i_fcat_complete = l_fcat_complete.  " ).

        endif.

      endif.

      if gt_grid-lvc is initial.

*        if cl_salv_test=>on eq 'X'.

*          cl_salv_test=>export_data_grid(

*            grid            = me

*            point_in_time_x = CL_SALV_TEST=>X_REUSE_ALV_GRID_DISPLAY

*            point_in_time_y = CL_SALV_TEST=>Y_DATA ).

*        endif.

        perform transfer_slis_to_lvc.

      else.

        perform transfer_lvc_to_lvc.

      endif.

*      if cl_salv_veri_run=>on = 'X'.

*        perform salv_at_99_2_stack.

*      endif.

      if gt_grid-s_lvc_layout-edit = 'X'.

        call method gt_grid-grid->register_edit_event

          exporting

            i_event_id = cl_gui_alv_grid=>mc_evt_enter.

      endif.

*ENTER on Popupmodus

      if i_screen_end_column > 0.

        call method gt_grid-grid->register_edit_event

          exporting

            i_event_id = cl_gui_alv_grid=>mc_evt_enter.

      endif.

* put to function module lvc_transfer_from_kkblo, because

* in use of Reuse_alv_grid_layout_info_get/set the sel_mode

* has not the right value when box_fieldname not initial

* css: 416654 2000 / kds

*      if not gt_grid-s_layout-box_fieldname is initial.

*        if gt_grid-s_lvc_layout-sel_mode <> 'C'.

*          gt_grid-s_lvc_layout-sel_mode = 'A'.

*        endif.

*      endif.

      perform event_receiver.

      gt_grid-s_lvc_print-no_colwopt = i_grid_settings-no_colwopt.

      data: ls_data                    type slis_data_caller_exit.

      if not gt_grid-i_callback_caller_exit is initial.

        perform (gt_grid-i_callback_caller_exit)

                               in program (gt_grid-i_callback_program)

                               using ls_data.

        call method gt_grid-grid->set_header_transport

          exporting

            i_header_transport = ls_data-callback_header_transport.

      endif.

      if gt_grid-lvc is initial.

        if is_reprep_id is initial.

          ls_reprep_id-s_rprp_id-tool = 'RT'.

          ls_reprep_id-s_rprp_id-onam = i_callback_program.

        else.

          ls_reprep_id = is_reprep_id.

        endif.

*>>> INSERT BRAUNMI RepRep

        read table it_events into ls_event

                   with key name = slis_ev_reprep_sel_modify.

        if sy-subrc eq 0.

          ls_reprep_id-cb_repid   = ls_reprep_id-s_rprp_id-onam.

          ls_reprep_id-cb_frm_mod = ls_event-form.

        endif.

*<<< INSERT BRAUNMI RepRep

      else.

        ls_reprep_id = is_reprep_id_lvc.

      endif.

      call method gt_grid-grid->activate_reprep_interface

        exporting

          is_reprep = ls_reprep_id

        exceptions

          no_sender = 1.

*>>> new API

      perform salv_set_selmode changing gt_grid-s_lvc_layout.

*<<< new API

*>>>Mendocino Extraction

* TOP-OF-LIST and END-OF-LIST must processed at first because of

* set screen 0. leave screen. in method set_table_for_first_display

      data: l_mode(1).

      import l_mode to l_mode from memory id 'ALV_EXTRACT_MODE'.

      if l_mode eq 'M'.

        perform raise_top_of_list.

        perform raise_end_of_list.

      endif.

*<<<Mendocino Extraction

      call method gt_grid-grid->set_table_for_first_display

        exporting

          i_consistency_check  = i_interface_check

          i_bypassing_buffer   = i_bypassing_buffer

          i_buffer_active      = i_buffer_active

          i_structure_name     = i_structure_name

          is_variant           = ls_variant

          i_save               = i_save

          i_default            = i_default

          is_layout            = gt_grid-s_lvc_layout

          is_print             = gt_grid-s_lvc_print

          it_special_groups    = gt_grid-t_lvc_spec

          it_hyperlink         = gt_grid-t_lvc_hyperlink

          it_toolbar_excluding = gt_grid-t_excluding_lvc

          it_except_qinfo      = gt_grid-t_lvc_qinfo

          ir_salv_adapter      = gt_grid-r_salv_fullscreen_adapter

          it_alv_graphics      = gt_grid-t_alv_graphics

        changing

          it_fieldcatalog      = gt_grid-t_lvc_fieldcat

          it_sort              = gt_grid-t_lvc_sort

          it_filter            = gt_grid-t_lvc_filter

          it_outtab            = t_outtab[].

    endif.

*>>> new API : wird 40 Zeilen weiter unten erledigt

*    perform salv_set_selections.

*<<< new API

    data: lr_content type ref to cl_salv_form_element.

*    if not sy-subty o con_hex02.

    if cl_gui_alv_grid=>offline( ) is initial. "Batch, Druck

      if not gt_grid-top is initial.

        call method gt_grid-top->initialize_document.

      endif.

      if not gt_grid-bottom is initial.

        call method gt_grid-bottom->initialize_document.

      endif.

*... TOP OF PAGE

*>>> Y3YK043656

      data: ls_layout type lvc_s_layo.

      gt_grid-grid->get_frontend_layout( importing es_layout = ls_layout ).

      if ls_layout-frontend ne cl_alv_bds=>mc_crystal_frontend.

        perform raise_top_of_list.

      endif.

*<<< Y3YK043656

*... END OF PAGE

      if not gt_grid-r_salv_fullscreen_adapter is bound.

        call method gt_grid-grid->list_processing_events

          exporting

            i_event_name = 'END_OF_PAGE'.

      endif.

*... END OF LIST

      perform raise_end_of_list.

    endif.

* create and fill HTML-CONTROL

    if gt_grid-flg_no_html is initial.

      if gt_grid-r_form_tol is not bound.

        perform html.

      endif.

*B20K8A0R55 for Excel Inplace HTML Header

      call method gt_grid-grid->set_html_header.

    endif.

    if gt_grid-r_form_eol is not bound.

      if gt_grid-flg_no_html_end is initial.

        perform html_bottom.

      endif.

    endif.

*>>> new API

    perform salv_set_selections.

*<<< new API

    data: lr_focus_container type ref to cl_gui_control,

          l_accessibility_mode type abap_bool.

*    field-symbols: <t_cntrl> type table.

*<<< Y7AK113139

*    call function 'GET_ACCESSIBILITY_MODE'

*      importing

*        accessibility     = l_accessibility_mode

*      exceptions

*        its_not_available = 0

*        others            = 0.

*    if l_accessibility_mode eq abap_true

*        and gt_grid-splitter is bound

*        and not gt_grid-splitter->children is initial.

*

*      assign gt_grid-splitter->children to <t_cntrl>.

*      read table <t_cntrl> index 1 into lr_focus_container.

*    else.

*      lr_focus_container = gt_grid-grid.

*    endif.

*

*    if not ( gt_grid-flg_popup eq abap_false

*    and l_accessibility_mode eq abap_true ).

*      call method cl_gui_control=>set_focus

*        exporting

*          control = lr_focus_container.

*    elseif gt_grid-flg_no_html eq abap_true and

*           l_accessibility_mode eq abap_true.

*      call method cl_gui_control=>set_focus

*        exporting

*          control = lr_focus_container.

*    endif.

* usability: focus has always to be set to the fullscreen grid,

* idependent of accessibility_mode, popup, HTML-TOP

* <<< Y7AK130495

   data: l_view type UI_FUNC.

    call method gt_grid-grid->get_actual_view( importing e_view = l_view ).

* focus may only be set to grid container in case of grid view!

    if l_view eq '&VGRID'.

      lr_focus_container = gt_grid-grid.

      call method cl_gui_control=>set_focus

            exporting

              control = lr_focus_container.

*>>> Y7AK113139

    else.

* do nothing in case of Excel or Crystal view!

    endif.

*>>> Y7AK130495

    if g_form_pf_status_executed eq abap_false.

      perform pf_status_set using gt_grid-flg_popup.

    endif.

  else.

    if gt_grid-grid is initial.

      "Factory method instead of constructor

        if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.

        gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(

          exporting

            i_appl_events   = 'X'

            i_parent        = g_parent_grid

            i_fcat_complete = l_fcat_complete ).

        else.

        create object gt_grid-grid  "Factory

          exporting

            i_appl_events   = 'X'

            i_parent        = g_parent_grid

            i_fcat_complete = l_fcat_complete.

        endif.

      if gt_grid-lvc is initial.

        perform transfer_slis_to_lvc.

      else.

        perform transfer_lvc_to_lvc.

      endif.

      if not gt_grid-s_layout-box_fieldname is initial.

        gt_grid-s_lvc_layout-sel_mode = 'A'.

      endif.

      gt_grid-s_lvc_print-no_colwopt = i_grid_settings-no_colwopt.

      perform event_receiver.

*      if not sy-subty o con_hex02.

      if cl_gui_alv_grid=>offline( ) is initial. "Batch, Druck

* create TOP-Document

        if gt_grid-flg_no_html is initial and gt_grid-top is initial.

          create object gt_grid-top

            exporting

              style = 'ALV_GRID'.

        endif.

* create BOTTOM-Document

        if gt_grid-flg_no_html_end is initial and

        gt_grid-bottom is initial.

          create object gt_grid-bottom

            exporting

              style = 'ALV_GRID'.

        endif.

        call method gt_grid-grid->list_processing_events

          exporting

            i_event_name = 'TOP_OF_PAGE'

            i_dyndoc_id  = gt_grid-top.

        ">>>new 13.11.03

        call method gt_grid-grid->list_processing_events

          exporting

            i_event_name = 'END_OF_LIST'

            i_dyndoc_id  = gt_grid-bottom.

        "<<<new

      endif.

      if not gt_grid-i_callback_caller_exit is initial.

        perform (gt_grid-i_callback_caller_exit)

                               in program (gt_grid-i_callback_program)

                               using ls_data.

        call method gt_grid-grid->set_header_transport

          exporting

            i_header_transport = ls_data-callback_header_transport.

      endif.

      if gt_grid-lvc is initial.

        if is_reprep_id is initial.

          ls_reprep_id-s_rprp_id-tool = 'RT'.

          ls_reprep_id-s_rprp_id-onam = i_callback_program.

        else.

          ls_reprep_id = is_reprep_id.

        endif.

*>>> INSERT BRAUNMI RepRep

        read table it_events into ls_event

                   with key name = slis_ev_reprep_sel_modify.

        if sy-subrc eq 0.

          ls_reprep_id-cb_repid   = ls_reprep_id-s_rprp_id-onam.

          ls_reprep_id-cb_frm_mod = ls_event-form.

        endif.

*<<< INSERT BRAUNMI RepRep

      else.

        ls_reprep_id = is_reprep_id_lvc.

      endif.

      call method gt_grid-grid->activate_reprep_interface

        exporting

          is_reprep = ls_reprep_id

        exceptions

          no_sender = 1.

      call method gt_grid-grid->set_table_for_first_display

        exporting

          i_consistency_check  = i_interface_check

          i_buffer_active      = i_buffer_active

          i_structure_name     = i_structure_name

          is_variant           = ls_variant

          i_save               = i_save

          i_default            = i_default

          is_layout            = gt_grid-s_lvc_layout

          is_print             = gt_grid-s_lvc_print

          it_special_groups    = gt_grid-t_lvc_spec

          it_hyperlink         = gt_grid-t_lvc_hyperlink

          it_toolbar_excluding = gt_grid-t_excluding_lvc

          it_except_qinfo      = gt_grid-t_lvc_qinfo

          ir_salv_adapter      = gt_grid-r_salv_fullscreen_adapter

          it_alv_graphics      = gt_grid-t_alv_graphics

        changing

          it_fieldcatalog      = gt_grid-t_lvc_fieldcat

          it_sort              = gt_grid-t_lvc_sort

          it_filter            = gt_grid-t_lvc_filter

          it_outtab            = t_outtab[].

    endif.

* create and fill HTML-CONTROL

    if gt_grid-flg_no_html is initial.

      perform html.

    endif.

    if gt_grid-flg_no_html_end is initial.

      perform html_bottom.

    endif.

*>>> new API

    perform salv_set_selections.

*<<< new API

    if g_form_pf_status_executed eq abap_false.

      perform pf_status_set using gt_grid-flg_popup.

    endif.

  endif.

  if gt_grid-flg_first_time eq abap_true.

*... Accessibility Description

    data:

      l_text type string.

    if g_parent_html is bound.

      l_text = text-a02.

      g_parent_html->set_accdescription( l_text ).

      if gt_grid-html_cntrl is bound.

        gt_grid-html_cntrl->set_accdescription( l_text ).

      endif.

      if gt_grid-r_form_tol is bound.

        gt_grid-r_form_tol->if_salv_form~set_accdescription( l_text ).

      endif.

    endif.

    if g_parent_end is bound.

      l_text = text-a03.

      g_parent_end->set_accdescription( l_text ).

      if gt_grid-html_cntrl_bottom is bound.

        gt_grid-html_cntrl_bottom->set_accdescription( l_text ).

      endif.

      if gt_grid-r_form_eol is bound.

        gt_grid-r_form_eol->if_salv_form~set_accdescription( l_text ).

      endif.

    endif.

    if g_parent_grid is bound.

      l_text = text-a01.

      g_parent_grid->set_accdescription( l_text ).

      if gt_grid-grid is bound.

        l_text = text-a04.

        gt_grid-grid->set_accdescription( l_text ).

      endif.

    endif.

  endif.

  if cl_gui_alv_grid=>offline( ) is initial.

    clear gt_grid-flg_first_time.

  endif.

  g_form_pf_status_executed = abap_false.

endform.                               " PBO

*&---------------------------------------------------------------------

*

*&      Form  HTML

*&---------------------------------------------------------------------

*

form html.

  data l_length  type i.

*

  if gt_grid-html_cntrl is initial.

    create object gt_grid-html_cntrl

      exporting

        parent = g_parent_html.

  endif.

  if my_receiver is initial.

* set handler for change of gui-resources (fonts, colors, ...)

    create object my_receiver.

    set handler my_receiver->use_new_resources.

  endif.

* reuse_alv_grid_commentary_set

  call function 'REUSE_ALV_GRID_COMMENTARY_SET'

    exporting

      document = gt_grid-top

      bottom   = space

    importing

      length   = l_length.

  if l_length > 0 and i_grid_settings-coll_top_p is initial and

    gt_grid-i_callback_html_top_of_page is initial and

    gt_grid-i_callback_html_end_of_list is initial.

    call method gt_grid-splitter->set_row_mode

      exporting

        mode = cl_gui_splitter_container=>mode_absolute.

    call method gt_grid-splitter->set_row_height

      exporting

        height = l_length

        id     = 1.

  endif.

* get TOP->HTML_TABLE ready

  call method gt_grid-top->merge_document.

* set wallpaper

  call method gt_grid-top->set_document_background

    exporting

      picture_id = i_background_id.

* export to Memory for HTML Conversion

  export grid_top_html from  gt_grid-top->html_table

*** put in next line as soon as 5.0(B20) has cl_dd_area->table_of_pictu

*         top_pictures  from  gt_grid-top->table_of_pictures

                                    to memory id 'TOP_HTML_FOR_ALV'.

* connect TOP document to HTML-Control

  gt_grid-top->html_control = gt_grid-html_cntrl.

* display TOP document

  call method gt_grid-top->display_document

    exporting

      reuse_control      = 'X'

      parent             = g_parent_html

    exceptions

      html_display_error = 1.

  if sy-subrc ne 0.

* ??????????

  endif.

endform.                               " HTML

*---------------------------------------------------------------------*

*       FORM HTML_BOTTOM                                              *

*---------------------------------------------------------------------*

form html_bottom.

  data l_length type i.

*

  if gt_grid-html_cntrl_bottom is initial.

    create object gt_grid-html_cntrl_bottom

      exporting

        parent = g_parent_end.

  endif.

  if my_receiver is initial.

* set handler for change of gui-resources (fonts, colors, ...)

    create object my_receiver.

    set handler my_receiver->use_new_resources.

  endif.

* reuse_alv_grid_commentary_set

  call function 'REUSE_ALV_GRID_COMMENTARY_SET'

    exporting

      document = gt_grid-bottom

      bottom   = 'X'

    importing

      length   = l_length.

  if l_length > 0 and i_grid_settings-coll_end_l is initial and

    gt_grid-i_callback_html_top_of_page is initial and

    gt_grid-i_callback_html_end_of_list is initial.

    call method gt_grid-splitter->set_row_mode

      exporting

        mode = cl_gui_splitter_container=>mode_absolute.

    if gt_grid-flg_no_html is initial.

      call method gt_grid-splitter->set_row_height

        exporting

          height = l_length

          id     = 3.

    else.

      call method gt_grid-splitter->set_row_height

        exporting

          height = l_length

          id     = 2.

    endif.

  endif.

* get HTML_TABLE ready

  call method gt_grid-bottom->merge_document.

* set wallpaper

  call method gt_grid-bottom->set_document_background

    exporting

      picture_id = i_background_id.

* export to Memory for HTML Conversion

  export grid_bottom_html from  gt_grid-bottom->html_table

*** put in next line as soon as 5.0(B20) has cl_dd_area->table_of_pictu

*         bottom_pictures  from  gt_grid-bottom->table_of_pictures

                                    to memory id 'BOTTOM_HTML_FOR_ALV'.

* connect BOTTOM document to HTML-Control

  gt_grid-bottom->html_control = gt_grid-html_cntrl_bottom.

* display BOTTOM document

  call method gt_grid-bottom->display_document

    exporting

      reuse_control      = 'X'

      parent             = g_parent_end

    exceptions

      html_display_error = 1.

  if sy-subrc ne 0.

* ??????????

  endif.

endform.                    "html_bottom

*&---------------------------------------------------------------------

*

*&      Form  PF_STATUS_SET

*&---------------------------------------------------------------------

form pf_status_set using r_flg_popup.

  data: l_title type sy-title.

  data: lt_extab type kkblo_t_extab with header line.

  data: lt_extab_ida type kkblo_t_extab with header line.

  data: boolean type sap_bool.  "ACC

  "Take it_excluding every Roundtrip into account - before application gets the control

  lt_extab[] = it_excluding.

  perform adapt_excluding_tab changing lt_extab[].

*... Set the requested Status

  if not gt_grid-s_layout-window_titlebar is initial.

    set titlebar '003' of program 'SAPLKKBL' with

                 gt_grid-s_layout-window_titlebar.

  else.

    l_title = sy-title.

    set titlebar '003' of program 'SAPLKKBL' with l_title.

  endif.

  if not gt_grid-i_callback_pf_status_set is initial.

    "SALV or Application: calls ABAP command SET PF-STATUS....

    perform (gt_grid-i_callback_pf_status_set)

            in program (i_callback_program)

            using lt_extab[] if found.

  else.

    case gt_grid-s_layout-def_status.

      when ' ' or '1'.

        if r_flg_popup = 'X'.

          if not gt_grid-s_layout-box_fieldname is initial.

            set pf-status 'STDPOPBX_FULLSCREEN' excluding lt_extab

                          of program 'SAPLKKBL'.

          else.

            set pf-status 'STDPOPUP_FULLSCREEN' excluding lt_extab

                          of program 'SAPLKKBL'.

          endif.

        else.

          if gt_grid-s_layout-countfname eq space.

            boolean = cl_alv_check_third_party=>is_supported(

                           cl_alv_bds=>mc_crystal_frontend ).

            if boolean eq abap_true.

              set pf-status 'STANDARD_FULLSCR_CR' excluding lt_extab

                              of program 'SAPLKKBL'.

            else.

              set pf-status 'STANDARD_FULLSCREEN' excluding lt_extab

                              of program 'SAPLKKBL'.

            endif.

          else.

            set pf-status 'STANDARD_FULLSCR_CNT' excluding lt_extab

                            of program 'SAPLKKBL'.

          endif.

        endif.

      when '2'.

        if r_flg_popup = 'X'.

          if not gt_grid-s_layout-box_fieldname is initial.

            set pf-status 'STDPOPBX_FULLSCREEN' excluding lt_extab

                          of program 'SAPLKKBL'.

          else.

            set pf-status 'STDPOPUP_FULLSCREEN' excluding lt_extab

                          of program 'SAPLKKBL'.

          endif.

        else.

          set pf-status 'STANDARD_FULLSCR_HR' excluding lt_extab

                          of program 'SAPLKKBL'.

        endif.

      when '3'.

        if r_flg_popup = 'X'.

          if not gt_grid-s_layout-box_fieldname is initial.

            set pf-status 'STDPOPBX_FS_LIGHT' excluding lt_extab

                          of program 'SAPLKKBL'.

          else.

            set pf-status 'STDPOPUP_FS_LIGHT' excluding lt_extab

                          of program 'SAPLKKBL'.

          endif.

        else.

          set pf-status 'STD_LIGHT_FULLSCREEN' excluding lt_extab

                          of program 'SAPLKKBL'.

        endif.

    endcase.

  endif.

  gt_grid-t_excluding[] = lt_extab[].

  g_form_pf_status_executed = abap_true.

endform.                               " PF_STATUS_SET

*&---------------------------------------------------------------------

*

*&      Form  GRID

*&---------------------------------------------------------------------

*

form grid using rr_grid type ref to cl_gui_alv_grid.        "#EC CALLED

  rr_grid = gt_grid-grid.

endform.                    "grid

*&---------------------------------------------------------------------

*

*&      Form  USER

*&---------------------------------------------------------------------

*

form user_command using r_ucomm type sy-ucomm

                        r_refresh

                        r_exit

                        rs_stable type lvc_s_stbl.

  data: ls_selfield type slis_selfield.

*

  check not gt_grid-i_callback_user_command is initial.

  check not i_callback_program is initial.

  perform selfield_get using ls_selfield.

  if r_ucomm is initial.

    r_ucomm = '&IC1'.

  endif.

  perform (gt_grid-i_callback_user_command)

                                    in program (i_callback_program)

                                    using r_ucomm

                                          ls_selfield.

  rs_stable-row = ls_selfield-row_stable.

  rs_stable-col = ls_selfield-col_stable.

  r_refresh = ls_selfield-refresh.

  r_exit    = ls_selfield-exit.

endform.                    "user_command

*&---------------------------------------------------------------------

*

*&      Form  PAI

*&---------------------------------------------------------------------

*

form pai.

  class cl_gui_cfw definition load.

  data: ls_stable type lvc_s_stbl.

  data: l_ucomm type sy-ucomm.

  data: lflg_refresh(1) type c.

  data: lt_rows type lvc_t_row.                             "#EC *

  data: lflg_exit(1) type c.

  data: ls_event_exit type slis_event_exit.                 "#EC NEEDED

  data: l_subrc like sy-subrc.

  data: l_okcode type sy-ucomm.

  l_okcode = ok_code.

  clear ok_code.

  check l_okcode ne space.

  g_repid = sy-repid.

  case l_okcode.

    when 'BACK'.

      l_okcode = '&F03'.

    when 'RW'.

      l_okcode = '&F12'.

    when '%EX'.

      l_okcode = '&F15'.

  endcase.

  clear g_temp_ok_code.

  do 2 times.

    check not l_okcode is initial.

    l_ucomm = l_okcode.

    if not gt_grid-s_layout-f2code is initial and

      l_okcode eq '&IC1'.

      l_okcode = gt_grid-s_layout-f2code.

    endif.

    call method gt_grid-grid->set_function_code

      changing

        c_ucomm = l_okcode.

    if l_okcode eq '&F15' or

       l_okcode eq '&F03' or

       l_okcode eq '&F12'.

      read table it_event_exit into ls_event_exit

                               with key ucomm = l_okcode.

      if sy-subrc = 0.

        g_before = 'X'.

        perform user_command using l_okcode lflg_refresh lflg_exit

                                   ls_stable.

        clear g_before.

      endif.

    endif.

    case l_okcode.

      when space.

      when '&ONT'.

        perform user_command using l_okcode lflg_refresh lflg_exit

                                   ls_stable.

        clear l_okcode.

        perform exit.

      when '&F15'.

        l_subrc = 0.

        if not gt_grid-s_layout-confirmation_prompt is initial.

          perform confirmation_prompt using l_subrc.

        endif.

        if l_subrc eq 0.

          es_exit_caused_by_user-exit = 'X'.

          clear l_okcode.

          perform exit.

        endif.

      when '&F03'.

        l_subrc = 0.

        if not gt_grid-s_layout-confirmation_prompt is initial.

          perform confirmation_prompt using l_subrc.

        endif.

        if l_subrc eq 0.

          es_exit_caused_by_user-back = 'X'.

          clear l_okcode.

          perform exit.

        endif.

      when '&F12'.

        l_subrc = 0.

        if not gt_grid-s_layout-confirmation_prompt is initial.

          perform confirmation_prompt using l_subrc.

        endif.

        if l_subrc eq 0.

          es_exit_caused_by_user-cancel = 'X'.

          clear l_okcode.

          perform exit.

        endif.

      when '&AC1'.

        l_subrc = 0.

        if not gt_grid-s_layout-confirmation_prompt is initial.

          perform confirmation_prompt using l_subrc.

        endif.

        if l_subrc eq 0.

          es_exit_caused_by_user-back = 'X'.

          clear l_okcode.

          perform exit.

        endif.

      when '&IC1'.

        if not gt_grid-s_layout-f2code is initial.

          perform method_double_click using l_okcode.

        endif.

*      when '&EXPORT_ALVXML'.

*        perform salv_export_alvxml.

      when '&ADM'.

        perform memory_download.

      when '&ADMB'.

        perform download_to_memory.

      when '&ADX'.

        perform data_download tables t_outtab.

      when '&ADXBJ'.

        perform data_download_to_java_browser tables t_outtab.

      when '&ADXBA'.

        perform data_download_to_abap_browser tables t_outtab.

      when '&WD_DL'.

        perform wd_download tables t_outtab.

      when others.

        if l_okcode(4) eq '%_GC'.

          call method cl_gui_cfw=>dispatch.

          l_okcode = g_temp_ok_code.    "via double_click

        else.

          perform user_command using l_okcode lflg_refresh lflg_exit

                                     ls_stable.

          if lflg_exit eq 'X'.

            e_exit_caused_by_caller = 'X'.

            perform exit.

          else.

            if lflg_refresh is not initial.

*>>> new API

              perform salv_get_selections.

*<<< new API

              if lflg_refresh = 'X'.

                call method gt_grid-grid->refresh_table_display

                  exporting

                    is_stable = ls_stable.

              elseif lflg_refresh = 'S'.

                call method gt_grid-grid->refresh_table_display

                  exporting

                    is_stable      = ls_stable

                    i_soft_refresh = 'X'.

              endif.

*... TOP OF LIST

              perform raise_top_of_list.

*... END OF LIST

              perform raise_end_of_list.

            endif.

*>>> new API

            perform salv_set_selections.

*<<< new API

          endif.

        endif.

    endcase.

    if l_ucomm ne l_okcode.

      l_ucomm = l_okcode.

    else.

      clear l_ucomm.

      clear l_okcode.

    endif.

  enddo.

endform.                               " PAI

*&---------------------------------------------------------------------

*

*&      Form  SELFIELD_GET

*&---------------------------------------------------------------------

*

form selfield_get using rs_selfield type slis_selfield.

* ...

  data: ls_row_id type lvc_s_row.

  data: ls_col_id type lvc_s_col.

  data: l_value type lvc_s_data-value.

  data: ls_selfield type lvc_s_self.

  data: ls_fieldcat type slis_fieldcat_alv.

  data: ls_fieldcat_lvc type lvc_s_fcat.

  call method gt_grid-grid->get_current_cell

    importing

      es_row_id = ls_row_id

      es_col_id = ls_col_id

      e_value   = l_value.

  call method cl_gui_cfw=>flush.

  ls_selfield-s_row_id = ls_row_id.

  ls_selfield-s_col_id = ls_col_id.

  ls_selfield-value    = l_value.

  call function 'LVC_TRANSFER_TO_KKBLO'

    exporting

      is_selfield_lvc   = ls_selfield

    importing

      es_selfield_kkblo = rs_selfield.

*  if sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

*  endif.

  if gt_grid-lvc = 'X'.

    loop at it_fieldcat_lvc into ls_fieldcat_lvc where tabname ne space

.

      move-corresponding ls_fieldcat_lvc to ls_fieldcat.

      exit.

    endloop.

  else.

    loop at it_fieldcat into ls_fieldcat where tabname ne space.

      exit.

    endloop.

  endif.

  if sy-subrc = 0.

    rs_selfield-tabname = ls_fieldcat-tabname.

    replace '1' with ls_fieldcat-tabname into rs_selfield-sel_tab_field

.

    condense rs_selfield-sel_tab_field no-gaps.

  endif.

  rs_selfield-before_action = g_before.

  rs_selfield-after_action  = g_after.

endform.                               " SELFIELD_GET

*---------------------------------------------------------------------*

*       FORM exit                                                     *

*&--------------------------------------------------------------------*

form exit.

* <<< YI3K165259

  data: lr_salv_adapter type REF TO cl_salv_adapter,

        lr_salv_controller type REF TO cl_salv_controller_model,

        lt_changelist TYPE standard table of if_salv_controller_changelist=>salv_s_changelist,

        ls_changelist type if_salv_controller_changelist=>salv_s_changelist,

        valid type abap_bool.

*>>> YI3K165259

  perform salv_get_metadata.

  perform salv_get_selections.

*  endif.

  call method gt_grid-container->free.

  if gt_grid-r_salv_fullscreen_adapter is bound.

    gt_grid-r_salv_fullscreen_adapter->remove_grid( ).

* <<< YI3K165259

*adjust SALV objects, no return to SALV to update settings, function handled only here!

    lr_salv_adapter ?= gt_grid-r_salv_fullscreen_adapter.

    lr_salv_controller ?= lr_salv_adapter->R_CONTROLLER.

    read table lr_salv_controller->t_changelist into ls_changelist

                                   with key  method = 'CLOSE_SCREEN' .

    if ls_changelist-change eq abap_true.

      CALL METHOD LR_SALV_CONTROLLER->CLEAR_CHANGELIST

        EXPORTING

          METHOD       = 'CLOSE_SCREEN'

        RECEIVING

          BOOLEAN      = valid.

    else.

      "do nothing

    endif.

    clear lr_salv_adapter->close_screen.  " parameter has to be cleared additionally

*>>> YI3K165259

  endif.

  call method cl_gui_cfw=>flush.

  if g_parent_html is bound.

    clear g_parent_html.

  endif.

  if g_parent_grid is bound.

    clear g_parent_grid.

  endif.

  if g_parent_end is bound.

    clear g_parent_end.

  endif.

  set screen 0.

  leave screen.

endform.                    "exit

*&--------------------------------------------------------------------*

*&      Form  raise_top_of_list

*&--------------------------------------------------------------------*

*       text

*---------------------------------------------------------------------*

form raise_top_of_list.

  export alv_form_html from abap_true

         to memory id 'ALV_FORM_HTML'.

  cl_salv_form_content=>free( ).

  g_is_online_event = if_salv_c_bool_sap=>true.

  if gt_grid-r_salv_fullscreen_adapter is bound.

    call method gt_grid-grid->list_processing_events

      exporting

        i_event_name = 'TOP_OF_LIST'.

  else.

    call method gt_grid-grid->list_processing_events

      exporting

        i_event_name = 'TOP_OF_PAGE'

        i_dyndoc_id  = gt_grid-top.

  endif.

  if cl_salv_form_content=>is_active( ) eq abap_true.

    if gt_grid-i_callback_html_top_of_page is initial.

      perform set_salv_form_content_tol.

    endif.

    export alv_form_html from abap_false

           to memory id 'ALV_FORM_HTML'.

  else.

    clear g_is_online_event.

  endif.

endform.                    "raise_top_of_list

*&--------------------------------------------------------------------*

*&      Form  raise_end_of_list

*&--------------------------------------------------------------------*

*       text

*---------------------------------------------------------------------*

form raise_end_of_list.

  export alv_form_html from abap_true

         to memory id 'ALV_FORM_HTML'.

  cl_salv_form_content=>free( ).

  g_is_online_event = if_salv_c_bool_sap=>true.

  call method gt_grid-grid->list_processing_events

    exporting

      i_event_name = 'END_OF_LIST'

      i_dyndoc_id  = gt_grid-bottom.

  if cl_salv_form_content=>is_active( ) eq abap_true.

    if gt_grid-i_callback_html_end_of_list is initial.

      perform set_salv_form_content_eol.

    endif.

    export alv_form_html from abap_false

           to memory id 'ALV_FORM_HTML'.

  else.

    clear g_is_online_event.

  endif.

endform.                    "raise_end_of_list

*&--------------------------------------------------------------------*

*&      Form  set_salv_form_content_tol

*&--------------------------------------------------------------------*

*       text

*---------------------------------------------------------------------*

form set_salv_form_content_tol.

  data:

    lr_content type ref to cl_salv_form_element,

    l_height   type i.

  check gt_grid-flg_no_html eq abap_false.

  check cl_salv_form_content=>is_active( ) eq abap_true.

  lr_content = cl_salv_form_content=>get( ).

  if gt_grid-r_form_tol is bound.

    check lr_content ne gt_grid-r_form_tol->get_content( ).

  endif.

  if gt_grid-r_form_tol is not bound.

    create object gt_grid-r_form_tol

      exporting

        r_container = g_parent_html

        r_content   = lr_content

        wallpaper   = i_background_id.

  endif.

  gt_grid-r_form_tol->set_content( lr_content ).

  l_height = gt_grid-r_form_tol->get_height( ).

  gt_grid-r_form_tol->display( ).

  check gt_grid-splitter is not initial.

  if i_grid_settings-coll_top_p is initial and

    gt_grid-i_callback_html_top_of_page is initial and

    gt_grid-i_callback_html_end_of_list is initial.

    gt_grid-splitter->set_visible( abap_true ).

    call method gt_grid-splitter->set_row_mode

      exporting

        mode = cl_gui_splitter_container=>mode_absolute.

    if i_html_height_top is initial.

*      if cl_alv_z_params=>get_parameter(

*         cl_alv_z_params=>c_flag-gui_alv_grid_bridge_on ) eq abap_true.

*        call method gt_grid-splitter->set_row_height

*          exporting

*            height = l_height

*            id     = gs_splitter_id-top_of_list.

*      else.

        call method gt_grid-splitter->set_row_height

          exporting

            height = l_height

            id     = 1.

*      endif.

    endif.

  endif.

endform.                    "set_salv_form_content_tol

*&---------------------------------------------------------------------*

*&      Form  set_salv_form_content_eol

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

form set_salv_form_content_eol .

  data:

    lr_content type ref to cl_salv_form_element,

    l_height   type i.

  check gt_grid-flg_no_html_end eq abap_false.

  check cl_salv_form_content=>is_active( ) eq abap_true.

  lr_content = cl_salv_form_content=>get( ).

  if gt_grid-r_form_eol is bound.

    check lr_content ne gt_grid-r_form_eol->get_content( ).

  endif.

  if gt_grid-r_form_eol is not bound.

    create object gt_grid-r_form_eol

      exporting

        r_container = g_parent_end

        r_content   = lr_content.

  endif.

  gt_grid-r_form_eol->set_content( lr_content ).

  l_height = gt_grid-r_form_eol->get_height( ).

  gt_grid-r_form_eol->display( ).

  check gt_grid-splitter is not initial.

  if i_grid_settings-coll_end_l is initial and

    gt_grid-i_callback_html_top_of_page is initial and

    gt_grid-i_callback_html_end_of_list is initial.

    call method gt_grid-splitter->set_row_mode

      exporting

        mode = cl_gui_splitter_container=>mode_absolute.

*    if cl_alv_z_params=>get_parameter(

*       cl_alv_z_params=>c_flag-gui_alv_grid_bridge_on ) eq abap_true.

*      call method gt_grid-splitter->set_row_height

*        exporting

*          height = l_height

*          id     = gs_splitter_id-end_of_list.

*    else.

      if gt_grid-flg_no_html is initial.

        if i_html_height_end is initial.

          call method gt_grid-splitter->set_row_height

            exporting

              height = l_height

              id     = 3.

        endif.

      else.

        if i_html_height_end is initial.

          call method gt_grid-splitter->set_row_height

            exporting

              height = l_height

              id     = 2.

        endif.

      endif.

*    endif.  "brigde

  endif.

endform.                    " set_salv_form_content_eol

SAP ABAP开发之-Enhancement增强

SAP有很多功能,是支持去做增强开发的,标准的代码不会让你改,但标准代码之余,系统留下了很多“漏”洞,让你可以写入自己的程序,以卡控销售预收款才可以发货的增强为例,源代码Coding如下:

SAP ABAP开发之-User Exit出口

和增强类似,USER EXIT则是SAP指定的可供人工开发的窗口,以销售VC定价为例,SAP标准的产品批次特性里,就可以放单据的开发语言,自己定义,傻白甜都会做。因为原理就跟你考计算机二级的查询语句一样,源代码Coding如下:

*确定变式价格-SD20170905

*基础面积计价指定-ZHG_HYF_CPHD玻璃厚度-ZVA0:

$self.ZHG_VARCOND = 'ZMIANJ1' IF  $self.ZHG_HYF_CPHD = 6,

$SET_PRICING_FACTOR ($SELF, ZHG_VARCOND, 'ZMIANJ1',

ZHG_HYF_CPMJ ),

$self.ZHG_VARCOND = 'ZMIANJ2'   IF  $self.ZHG_HYF_CPHD = 8,

$SET_PRICING_FACTOR ($SELF,ZHG_VARCOND, 'ZMIANJ2',

ZHG_HYF_CPMJ ),

$self.ZHG_VARCOND = 'ZMIANJ3'   IF  $self.ZHG_HYF_CPHD = 10,

$SET_PRICING_FACTOR ($SELF, ZHG_VARCOND, 'ZMIANJ3',

ZHG_HYF_CPMJ ),

*这样做的意思,就是拿ZMIANJ3的价格去*变式CPMJ面积的值

*石基计价指定-ZHG_HYF_SFSJ是否配石基:

$self.ZHG_VARCOND = 'ZSHIJ1'   IF  $self.ZHG_HYF_SFSJ = '1',

*特殊工艺计价指定-ZHG_HYF_BLGY特殊工艺 :

$self.ZHG_VARCOND = 'ZTSGY001'   IF  $self.ZHG_HYF_BLGY = '1',

$self.ZHG_VARCOND = 'ZTSGY002'   IF  $self.ZHG_HYF_BLGY = '2',

$self.ZHG_VARCOND = 'ZTSGY003'   IF  $self.ZHG_HYF_BLGY = '3',

$self.ZHG_VARCOND = 'ZTSGY004'   IF  $self.ZHG_HYF_BLGY = '4',

$self.ZHG_VARCOND = 'ZTSGY005'   IF  $self.ZHG_HYF_BLGY = '5',

*拉手计价指定-ZHG_HYF_HBL1活动玻璃1拉手型号:

$self.ZHG_VARCOND = 'ZLashouA001'   IF  $self.ZHG_HYF_HBL1 = '1',

$self.ZHG_VARCOND = 'ZLashouA002'   IF  $self.ZHG_HYF_HBL1 = '2',

$self.ZHG_VARCOND = 'ZLashouA003'   IF  $self.ZHG_HYF_HBL1 = '3',

$self.ZHG_VARCOND = 'ZLashouA004'   IF  $self.ZHG_HYF_HBL1 = '4',

$self.ZHG_VARCOND = 'ZLashouA005'   IF  $self.ZHG_HYF_HBL1 = '5',

*拉手计价指定-ZHG_HYF_HBL2活动玻璃2拉手型号:

$self.ZHG_VARCOND = 'ZLashouB001'   IF  $self.ZHG_HYF_HBL2 = '1',

$self.ZHG_VARCOND = 'ZLashouB002'   IF  $self.ZHG_HYF_HBL2 = '2',

$self.ZHG_VARCOND = 'ZLashouB003'   IF  $self.ZHG_HYF_HBL2 = '3',

$self.ZHG_VARCOND = 'ZLashouB004'   IF  $self.ZHG_HYF_HBL2 = '4',

$self.ZHG_VARCOND = 'ZLashouB005'   IF  $self.ZHG_HYF_HBL2 = '5',

*拉手计价指定-ZHG_HYF_HBL3活动玻璃3拉手型号:

$self.ZHG_VARCOND = 'ZLashouC001'   IF  $self.ZHG_HYF_HBL3 = '1',

$self.ZHG_VARCOND = 'ZLashouC002'   IF  $self.ZHG_HYF_HBL3 = '2',

$self.ZHG_VARCOND = 'ZLashouC003'   IF  $self.ZHG_HYF_HBL3 = '3',

$self.ZHG_VARCOND = 'ZLashouC004'   IF  $self.ZHG_HYF_HBL3 = '4',

$self.ZHG_VARCOND = 'ZLashouC005'   IF  $self.ZHG_HYF_HBL3 = '5'

SAP ABAP开发之-例程

例程严格说也是USER EXIT,用于定价等的开发,SAP里有个单独的TCODEVOFM,用来专门新增一个小例程,这个例程,简直就是世外桃源!因为他写好后,还需要前端配置到标准的定价过程里,才可以用,否则就是山外山,人外人,以销售定价开票取订单未税价为例,源代码Coding如下:

FORM FRM_KONDI_WERT_931.

*{   INSERT         G4DK900682                                        1

*---------------------------------------------------------------------*

* PROGRAM ID          : RV64A931                                      *

* APPLICATION NAME    : SD                                            *

* AUTHOR              : Reed Jiang                                    *

* TRANSACTION         : N/A                                           *

* PROGRAM TYPE        : Include Program                               *

* INPUT FILES         : N/A                                           *

* OUTPUT FILES        : N/A                                           *

* Development class   : VKON                                          *

* Message class       : N/A                                           *

* DESCRIPTION         : Condition Value Routine 931                   *

*---------------------------------------------------------------------*

*=====================================================================*

*  000  2022/03/30   G4DK900682   Initial Version                     *

*---------------------------------------------------------------------*

  "Call Custom Routine

  CALL FUNCTION 'ZCSD_FUNC_PRICING_VALUE_931'

    EXPORTING

      iv_xmenge = xmenge

      is_komk   = komk

      is_komp   = komp

    TABLES

      tt_xkomv  = xkomv[]

    CHANGING

      cv_xkwert = xkwert.

*}   INSERT

ENDFORM.

SAP ABAP开发之-Function功能

当然,SAP也支持纯粹的功能开发!那就相当于增加一个新功能,和SAP标准的自带的功能平行, 只是要求必须是ZY开头命名,即不是SAP亲生的。这样在SAP版本升级时,才不至于被SAP升级抹杀掉。以客户销售合同批导为例,源代码Coding如下:

*&-----------------------------------------------------*

*****************************************************************

* System      :  客合同批导

* Module      :  合同数据批导

* program ID  :  ZSD_RP5001

* Author      :  YPJ

* Date        :  2019.10.17

* Description :

*****************************************************************

* Modified Recorder :

* Date            C#NO            Author             Content

*----------------------------------------------------*

*修改日期        C票或变更文档日期    修改者        修改内容

*传输请求号

*****************************************************************

REPORT zsd_rp5002.

*&---------------------------------------------------------------------*

*& Table declaration

*&---------------------------------------------------------------------*

TABLES: sscrfields,kna1.

*&---------------------------------------------------------------------*

*& Type pool declaration

*&---------------------------------------------------------------------*

TYPE-POOLS: icon,slis,truxs.

" Type pool for ALV

*&---------------------------------------------------------------------*

DATA:gs_fieldcat    TYPE lvc_s_fcat, "SLIS_FIELDCAT_ALV,

     gt_fieldcat    TYPE lvc_t_fcat, "SLIS_T_FIELDCAT_ALV,

     gs_layout      TYPE lvc_s_layo, "SLIS_LAYOUT_ALV,

     gt_ex_status   TYPE slis_t_extab,

     gs_variant_bom TYPE disvariant,

     gcl_alv_grid   TYPE REF TO cl_gui_alv_grid,

     i_title        TYPE lvc_title,

     i_flg          TYPE char1.

DATA: gs_fieldinfo TYPE slis_fieldinfo2,

      gt_fieldinfo TYPE TABLE OF slis_fieldinfo2.

DATA: stbl TYPE lvc_s_stbl.

DATA: w_ref_alv TYPE REF TO cl_gui_alv_grid.

DATA: ws_events1 TYPE slis_alv_event,

      it_events1 TYPE slis_t_event.

DATA: str_msg TYPE string.

DATA: functxt TYPE smp_dyntxt.

*--------定义下载模板相关---------

DATA:ls_key        LIKE  wwwdatatab,

     p_fd          LIKE rlgrap-filename,

     stripped_name TYPE rlgrap-filename,

     file_path     TYPE rlgrap-filename,

     ld_filename   TYPE string,

     ld_path       TYPE string,

     ld_fullpath   TYPE string,

     ld_result     TYPE i.

*DATA functxt TYPE smp_dyntxt.

DATA ok_code LIKE sy-ucomm.

DATA p_file  TYPE rlgrap-filename.

DATA: l_serno TYPE i,

      s_serno TYPE string.

*&---------------------------------------------------------------------*

*& Bapi Type declaration

*&---------------------------------------------------------------------*

DATA:ls_main       TYPE cmds_ei_main,

     ls_main1      TYPE cmds_ei_main,

     ls_main2      TYPE cmds_ei_main,

     ls_mesg       TYPE cvis_message,

     ls_mesg1      TYPE cvis_message,

     lt_msg        TYPE bapiret2_t,

     lwa_msg       TYPE bapiret2,

     lt_cust       TYPE cmds_ei_extern_t,

     lwa_cust      TYPE cmds_ei_extern,

     lt_bankn      TYPE cvis_ei_bankdetail_t,

     ls_bank       TYPE cvis_ei_cvi_bankdetail,

     lwa_sale      TYPE cmds_ei_sales,

     lt_sale       TYPE cmds_ei_sales_t,

     lt_functions  TYPE cmds_ei_functions_t,

     lwa_functions TYPE cmds_ei_functions,

     lt_company    TYPE cmds_ei_company_t,

     lt_text       TYPE cvis_ei_text_t,

     lwa_text      TYPE cvis_ei_text,

     lt_content    TYPE tline_tab,

     lwa_content   TYPE tline,

     lwa_tax       TYPE cmds_ei_tax_ind,

     lt_tax        TYPE cmds_ei_tax_ind_t,

     lt_remark     TYPE cvis_ei_rem_t,

     lwa_remark    TYPE cvis_ei_rem,

     lt_tel        TYPE cvis_ei_tlx_t,

     lwa_tel       TYPE cvis_ei_tlx_str,

     lt_fax        TYPE cvis_ei_fax_t,

     lwa_fax       TYPE cvis_ei_fax_str,

     lt_mail       TYPE cvis_ei_smtp_t,

     lwa_mail      TYPE cvis_ei_smtp_str,

     lt_tel01      TYPE cvis_ei_ttx_t,

     lwa_tel01     TYPE cvis_ei_ttx_str,

     lt_contact    TYPE cmds_ei_contacts_t,

     lwa_contact   TYPE cmds_ei_contacts,

     lt_version    TYPE cvi_ei_version_type1_t,

     lwa_version   TYPE cvi_ei_version_type1,

     lt_phone      TYPE cvis_ei_phone_t,

     lwa_phone     TYPE cvis_ei_phone_str,

     lt_phone1     TYPE cvis_ei_phone_t,

     lwa_phone1    TYPE cvis_ei_phone_str,

     lwa_company   TYPE cmds_ei_company.

*&---------------------------------------------------------------------*

*& Type declaration

*&---------------------------------------------------------------------*

TYPES: BEGIN OF ty_upload,

         vkorg   TYPE knvv-vkorg,

         vtweg   TYPE knvv-vtweg,

         spart   TYPE knvv-spart,

         kunnr   TYPE kna1-kunnr,

         parvw   TYPE vbpa-parvw,

         saleman TYPE vbpa-kunnr,

       END OF ty_upload.

DATA: gt_upload TYPE TABLE OF ty_upload,

      gs_upload TYPE ty_upload.

TYPES:BEGIN OF ty_bapi,

        kunnr   TYPE vbak-kunnr,

        lt_item LIKE  gt_upload.

TYPES END OF ty_bapi.

DATA:gt_bapi TYPE TABLE OF ty_bapi,

     gs_bapi TYPE ty_bapi.

DATA:BEGIN OF gs_alv,

       mark    TYPE char1,

       zicon   TYPE icon-id,

       message TYPE char200.

*       name1   TYPE kna1-name1.

        INCLUDE TYPE ty_upload.

DATA:END OF gs_alv.

DATA:gt_alv LIKE TABLE OF gs_alv.

*屏幕条件

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002.

PARAMETER: file_up LIKE rlgrap-filename.

SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN: FUNCTION KEY 1,

                  FUNCTION KEY 2.

*----------------------------------------------------------------------*

*        INITIALIZATION                                                *

*----------------------------------------------------------------------*

INITIALIZATION.

  functxt-icon_text  = '下载数据模板'.

  functxt-icon_id   = icon_xxl.

  sscrfields-functxt_01 = functxt .

AT SELECTION-SCREEN.

  CASE sy-ucomm.

    WHEN 'FC01'.

      PERFORM frm_select_file.

    WHEN 'ONLI'.

      IF file_up IS INITIAL.

        MESSAGE e000(zpub_msg) WITH '请选择上载文件数据' DISPLAY LIKE 'W'.

      ENDIF.

    WHEN OTHERS.

  ENDCASE.

*----------------------------------------------------------------------*

*        AT SELECTION-SCREEN    on value-request for                                        *

*----------------------------------------------------------------------*

*选择文件路径

AT SELECTION-SCREEN ON VALUE-REQUEST FOR file_up.

  PERFORM file_find_up.

START-OF-SELECTION.

  PERFORM frm_upload_excel.

* 数据合法性检查

  PERFORM frm_check_get_bapi.

  PERFORM frm_show_alv.

END-OF-SELECTION.

*&---------------------------------------------------------------------*

*&      Form  FRM_SELECT_FILE

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM frm_select_file .

  CALL METHOD cl_gui_frontend_services=>file_save_dialog

    EXPORTING

      window_title         = '下载模板'

      default_extension    = 'XLSX'

      default_file_name    = '泽强合同批导数据模板.XLSX'

      initial_directory    = 'c:\temp\'

    CHANGING

      filename             = ld_filename

      path                 = ld_path

      fullpath             = ld_fullpath

      user_action          = ld_result

    EXCEPTIONS

      cntl_error           = 1

      error_no_gui         = 2

      not_supported_by_gui = 3

      OTHERS               = 4.

  IF sy-subrc <> 0.

    SET CURSOR FIELD 'FILE_UP'.

    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno

    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    RETURN.

  ENDIF.

  IF ld_result = 0.

    p_fd  = ld_fullpath.

  ENDIF.

  CLEAR ls_key.

  ls_key-relid = 'MI'.

  ls_key-objid = 'ZSD_RP5002'.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'

    EXPORTING

      key         = ls_key

      destination = p_fd.

*  CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH' "对文件进行存在检查

*    EXPORTING

*      full_name     = p_fd

*    IMPORTING

*      stripped_name = stripped_name

*      file_path     = file_path.

*  IF sy-subrc = 0.

*    CALL FUNCTION 'GUI_RUN' "启动一个文件或者程序

*      EXPORTING

*        command   = 'EXCEL'

*        parameter = stripped_name

*        cd        = file_path.

*  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FILE_FIND_UP

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM file_find_up .

  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

    EXPORTING

      mask          = '.XLS'

      static        = 'X'

    CHANGING

      file_name     = file_up

    EXCEPTIONS

      mask_too_long = 1.

  IF sy-subrc <> 0.

    MESSAGE  '路徑不正確或選擇文件錯誤' TYPE 'E'.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_UPLOAD_EXCEL

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM frm_upload_excel .

  DATA: ls_line  TYPE i,

        ls_subrc TYPE sy-subrc.

  DATA: ls_mseg TYPE string.

  DATA:lt_itab   TYPE TABLE OF zalsmex_tabline WITH HEADER LINE.

  FIELD-SYMBOLS: <fs_up>.

  CLEAR:gt_upload.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'

    EXPORTING

      text = '数据处理中,请等待...'.

  "EXCEL转换成内表数据

  CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'

    EXPORTING

      filename                = file_up

      i_begin_col             = 2

      i_begin_row             = 6

      i_end_col               = 14

      i_end_row               = 9999

    TABLES

      intern                  = lt_itab[]

    EXCEPTIONS

      inconsistent_parameters = 1

      upload_ole              = 2

      OTHERS                  = 3.

  IF sy-subrc <> 0.

* Implement suitable error handling here

  ENDIF.

  LOOP AT lt_itab.

    ASSIGN COMPONENT lt_itab-col OF STRUCTURE gs_upload TO <fs_up>.         "动态方法将值传到相应的内表

    <fs_up> = lt_itab-value.

    AT END OF row.

      APPEND gs_upload TO gt_upload.

      CLEAR gs_upload.

    ENDAT.

  ENDLOOP.

  IF gt_upload IS INITIAL.

    MESSAGE  '无效的上载数据,请检查' TYPE 'E'.

    STOP.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_CHECK_GET_BAPI

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM frm_check_get_bapi .

  DATA:ls_message TYPE char100.

  DATA:ls_subrc TYPE sy-subrc.

  DATA:BEGIN OF gs_kna1,

         kunnr TYPE kna1-kunnr,

         name1 TYPE kna1-name1,

       END OF gs_kna1.

  DATA:gt_kna1 LIKE TABLE OF gs_kna1.

  LOOP AT  gt_upload  INTO gs_upload .

    gs_alv = CORRESPONDING #( gs_upload ).

    IF gs_upload-kunnr IS INITIAL.

      ls_message = '客户编码为必填/'.

    ENDIF.

    IF gs_upload-parvw IS INITIAL.

      ls_message = '类型为必填/'.

    ENDIF.

    IF gs_upload-saleman IS INITIAL.

      ls_message = '业务员编码为必填/'.

    ENDIF.

    IF NOT ls_message IS INITIAL.

      gs_alv-zicon = '@5C@'.

      gs_alv-message = ls_message.

    ELSE.

      gs_alv-zicon =  '@5B@'.

    ENDIF.

    APPEND gs_alv TO gt_alv.

    CLEAR:gs_alv,ls_message,gs_upload.

  ENDLOOP.

  SORT gt_alv BY  zicon.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_CHECK_DATE

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_<FS_UPLOAD>  text

*      <--P_LS_SUBRC  text

*----------------------------------------------------------------------*

FORM frm_check_date  USING    p_field

                     CHANGING p_subrc TYPE sy-subrc.

  CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'

    EXPORTING

      date                      = p_field

    EXCEPTIONS

      plausibility_check_failed = 1

      OTHERS                    = 2.

  IF sy-subrc NE 0. "如果返回非0,则日期不合法

    p_subrc = 1.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_DEAL_DATA

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM frm_deal_data .

  SORT gt_alv BY kunnr.

  LOOP AT gt_alv INTO gs_alv.

    READ TABLE gt_bapi ASSIGNING FIELD-SYMBOL(<fs_bapi>) WITH  KEY kunnr = gs_alv-kunnr.

    IF sy-subrc = 0.

      CLEAR: gs_upload.

      MOVE-CORRESPONDING gs_alv TO gs_upload.

      APPEND gs_upload TO <fs_bapi>-lt_item.

    ELSE.

      CLEAR: gs_bapi.

      gs_bapi-kunnr = gs_alv-kunnr.

      CLEAR: gs_upload.

      MOVE-CORRESPONDING gs_alv TO gs_upload.

      APPEND gs_upload TO gs_bapi-lt_item.

      APPEND gs_bapi TO gt_bapi.

    ENDIF.

  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_SHOW_ALV

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM frm_show_alv .

*&---------------------------------------------------------------------*

*          EVENTS CATALOG FOR GRID DISPLAY

*&---------------------------------------------------------------------*

  PERFORM events_catalog.

*&---------------------------------------------------------------------*

*          FIELD CATALOG FOR GRID DISPLAY

*&---------------------------------------------------------------------*

  PERFORM field_catalog.

*&---------------------------------------------------------------------*

*          FOR LAYOUT FOR FIRST GRID DISPLAY

*&---------------------------------------------------------------------*

  PERFORM set_layout.

*&---------------------------------------------------------------------*

*          FOR VARIANT FOR FIRST GRID DISPLAY

*&---------------------------------------------------------------------*

  PERFORM set_variant.

*&---------------------------------------------------------------------*

*          DISPLAY RECORDS IN ALV GRID FOR FIRST GRID DISPLAY

*&---------------------------------------------------------------------*

  PERFORM alv_display.

ENDFORM.

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM events_catalog .

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'

    EXPORTING

      i_list_type = 0

    IMPORTING

      et_events   = it_events1.

  READ TABLE it_events1 WITH KEY name = 'TOP_OF_PAGE'

                      INTO ws_events1.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FIELD_CATALOG

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM field_catalog .

  "动态字段名称赋值

  DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr.

  DATA: ls_field_in TYPE dfies,

        lt_dfies    TYPE ddfields.

  lo_tabdescr ?= cl_abap_structdescr=>describe_by_data( gs_alv ).

  CALL METHOD cl_salv_data_descr=>read_structdescr

    EXPORTING

      r_structdescr = lo_tabdescr

    RECEIVING

      t_dfies       = lt_dfies.

  PERFORM frm_get_tabname TABLES lt_dfies USING 'GT_ALV'.

  LOOP AT lt_dfies INTO ls_field_in.

    CLEAR: gs_fieldcat.

    MOVE-CORRESPONDING ls_field_in TO gs_fieldcat.

    gs_fieldcat-ref_table = ls_field_in-reftable.   "参照类型的表,搜索帮助,域控制

    gs_fieldcat-ref_field = ls_field_in-reffield. "参照类型字段

    IF gs_fieldcat-coltext IS INITIAL.         "COLTEXT不存在显示FILEDTEXT,如字段没域,只有手工描述的情况

      gs_fieldcat-coltext = ls_field_in-fieldtext.

    ENDIF.

    CASE ls_field_in-fieldname.

      WHEN 'MARK'.

        CONTINUE.

      WHEN 'ZICON'.gs_fieldcat-coltext = '状态标识'.

      WHEN 'MESSAGE'.gs_fieldcat-coltext = '返回消息'.

      WHEN 'KUNNR'.gs_fieldcat-coltext = '客户编码'.

*      WHEN 'NAME1'.gs_fieldcat-coltext = '客户名称'.

      WHEN 'SALEMAN'.gs_fieldcat-coltext = '业务员编码'.

    ENDCASE.

    APPEND gs_fieldcat TO gt_fieldcat.

  ENDLOOP.

ENDFORM.

FORM frm_get_tabname TABLES t_dfies TYPE ddfields USING tabname TYPE tfdir-funcname.

  " source container

  DATA: BEGIN OF ls_abap_source,

          line TYPE char300,

        END OF ls_abap_source,

        lt_abap_source LIKE TABLE OF ls_abap_source.

  DATA: lt_fieldinfo_old LIKE fieldinfo OCCURS 10 WITH HEADER LINE.

  CLASS cx_sy_read_src_line_too_long DEFINITION LOAD.

  DATA: ex_too_long TYPE REF TO  cx_sy_read_src_line_too_long.

  TRY.

      READ REPORT sy-repid INTO lt_abap_source.

    CATCH cx_sy_read_src_line_too_long INTO ex_too_long.

      MESSAGE '一行代码超过300个字符' TYPE 'S' DISPLAY LIKE 'E'.

  ENDTRY.

  CALL FUNCTION 'ABAP_SCAN_DATA_DESCRIPTION'

    EXPORTING

      structure_name      = tabname

      main_program_name   = sy-cprog

      i_context           = 'X'

    TABLES

      abap_source         = lt_abap_source

      ddic_fieldinfo      = lt_fieldinfo_old

      ddic_fieldinfo2     = gt_fieldinfo

    EXCEPTIONS

      source_not_accepted = 0

      OTHERS              = 0.

  LOOP AT t_dfies ASSIGNING FIELD-SYMBOL(<lfs_dfies>).

    IF <lfs_dfies>-reftable IS INITIAL. "auto set tablename

      READ TABLE gt_fieldinfo INTO gs_fieldinfo WITH KEY fieldname = <lfs_dfies>-fieldname.

      IF sy-subrc = 0.

        SPLIT gs_fieldinfo-name AT '-' INTO <lfs_dfies>-reftable <lfs_dfies>-reffield.

      ENDIF.

    ENDIF.

  ENDLOOP.

ENDFORM.

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM set_layout .

* 自动调整列宽

  gs_layout-cwidth_opt = 'X'.

* 变换行颜色

  gs_layout-zebra = 'X'.

  gs_layout-box_fname = 'MARK'.

ENDFORM.

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM set_variant .

*   设置variant

  CLEAR: gs_variant_bom.

  gs_variant_bom-report = sy-repid.

ENDFORM.

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM alv_display .

*Call function RESUE_ALV_GRID_DISPLAY_LVC

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

    EXPORTING

      i_callback_program       = sy-repid

      i_callback_pf_status_set = 'FRM_SET_STATUS'

      i_callback_user_command  = 'FRM_USER_COMMAND'

      is_layout_lvc            = gs_layout

      i_save                   = 'A'

      i_grid_title             = i_title

      is_variant               = gs_variant_bom "gs_variant

      it_fieldcat_lvc          = gt_fieldcat[]

      it_events                = it_events1

    TABLES

      t_outtab                 = gt_alv

    EXCEPTIONS

      program_error            = 1

      OTHERS                   = 2.

  IF sy-subrc <> 0.

* Implement suitable error handling here

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  SUB_USER_COMMAND

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM frm_set_status USING rt_extab TYPE slis_t_extab .      "#EC *

  SET PF-STATUS 'STANDARD'.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  SUB_USER_COMMAND

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM frm_user_command USING s_ucomm TYPE sy-ucomm

                            rs_selfield TYPE slis_selfield.

  DATA:ls_check TYPE char1.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'

    IMPORTING

      e_grid = w_ref_alv.

  CALL METHOD w_ref_alv->check_changed_data.

  rs_selfield-refresh     = 'X'.

  rs_selfield-col_stable  = 'X'.

  rs_selfield-row_stable  = 'X'.

  CASE s_ucomm.

    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.

      SET SCREEN 0.

    WHEN 'SUBMT'.

* 更新数据

      LOOP AT gt_alv TRANSPORTING NO FIELDS WHERE zicon   = '@5C@'.

      ENDLOOP.

      IF sy-subrc = 0.

        ls_check = 'X'.

        MESSAGE s001(00) WITH '请检查数据正确性...' DISPLAY LIKE 'E'.

      ENDIF.

      CHECK ls_check IS INITIAL.

*汇总bapi数据

      PERFORM frm_deal_data.

      PERFORM generate_customer_bapi.

    WHEN OTHERS.

  ENDCASE.

ENDFORM.                    "SUB_USER_COMMAND

*&---------------------------------------------------------------------*

*&      Form  GENERATE_CUSTOMER_BAPI

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM generate_customer_bapi .

  DATA:lv_subrc TYPE bapiret2-type.

  DATA:ls_msg TYPE char100.

  DATA:lv_percentage TYPE string.

  DESCRIBE TABLE gt_bapi LINES l_serno.

  CLEAR gs_bapi.

  LOOP AT gt_bapi INTO gs_bapi.

    CLEAR: lv_subrc,ls_msg.

*   处理状态

    lv_percentage =  sy-tabix / l_serno * 100.

    PERFORM process_indcator USING  lv_percentage.

    PERFORM frm_create_sls TABLES gs_bapi-lt_item[] CHANGING lv_subrc ls_msg .

    LOOP AT gt_alv INTO gs_alv WHERE  kunnr = gs_bapi-kunnr.

      IF lv_subrc = 'S'.

        gs_alv-zicon = '@5B@'.

      ELSE.

        gs_alv-zicon = '@5C@'.

      ENDIF.

      gs_alv-message = ls_msg.

      MODIFY gt_alv FROM gs_alv.

    ENDLOOP.

  ENDLOOP.

  CLEAR:gt_bapi,l_serno.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  FRM_CREATE_SLS

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_GS_BAPI_ITEM[]  text

*      <--P_LV_SUBRC  text

*----------------------------------------------------------------------*

FORM frm_create_sls  TABLES pt_bapi_item LIKE gt_upload

                     CHANGING pv_subrc TYPE bapiret2-type

                              ps_msg   TYPE char100.

  DATA: l_parza TYPE knvp-parza.

  DATA:l_line TYPE i.

  LOOP AT pt_bapi_item ASSIGNING FIELD-SYMBOL(<fs_bapi_item>).

    l_line = l_line + 1.

    AT NEW kunnr.

* Customer number (in case of external creating of numbers)

      lwa_cust-header-object_instance-kunnr =   |{ <fs_bapi_item>-kunnr ALPHA = IN }|."客户编码.

* Mark Change

      lwa_cust-header-object_task = 'U'.

      SELECT  MAX( parza )

   FROM knvp INTO l_parza

      WHERE kunnr =  lwa_cust-header-object_instance-kunnr

        AND vkorg = <fs_bapi_item>-vkorg

        AND vtweg = <fs_bapi_item>-vtweg

        AND spart = <fs_bapi_item>-spart

        AND parvw = <fs_bapi_item>-parvw.

    ENDAT.

* items_in

    lwa_sale-task = 'U'.

    lwa_sale-data_key-vkorg = <fs_bapi_item>-vkorg.

    lwa_sale-data_key-vtweg = <fs_bapi_item>-vtweg.

    lwa_sale-data_key-spart = <fs_bapi_item>-spart.

    l_parza = l_parza + 1.

    IF <fs_bapi_item>-saleman IS NOT INITIAL.

      lwa_functions-task = 'M'.

      lwa_functions-data_key-parvw = <fs_bapi_item>-parvw.

      lwa_functions-data_key-parza = l_parza.

*      lwa_functions-data-defpa = 'X'.

      lwa_functions-data-partner = |{ <fs_bapi_item>-saleman ALPHA = IN }|."业务员编码

      lwa_functions-datax-partner = 'X'.

*      lwa_functions-datax-defpa = 'X'.

      APPEND lwa_functions TO lt_functions.

      CLEAR lwa_functions.

    ENDIF.

  ENDLOOP.

  lwa_sale-functions-functions = lt_functions.

  APPEND lwa_sale TO lt_sale.

  lwa_cust-sales_data-sales = lt_sale.

  APPEND lwa_cust TO lt_cust.

  ls_main-customers = lt_cust.

*  FREE:cmd_ei_api=>gt_global_kna1_old.

  CALL METHOD cmd_ei_api=>maintain_bapi

    EXPORTING

*     iv_test_run              = p_test

      iv_collect_messages      = 'X'

      is_master_data           = ls_main

    IMPORTING

      es_master_data_correct   = ls_main1

      es_message_correct       = ls_mesg1

      es_master_data_defective = ls_main2

      es_message_defective     = ls_mesg.

  DELETE ls_mesg-messages WHERE type = 'S'.

  DELETE ls_mesg-messages WHERE type = 'W'.

  LOOP AT ls_mesg-messages TRANSPORTING NO FIELDS WHERE type CA 'AEX'.

  ENDLOOP.

  IF sy-subrc <> 0 .

    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

      EXPORTING

        wait = 'X'.

    pv_subrc = 'S'.

    ps_msg = '业务员更新成功'.

    WAIT UP TO '0.1' SECONDS.

  ELSE.

    READ TABLE ls_mesg-messages INTO DATA(ls_msg) INDEX 1.

    pv_subrc = 'E'.

    CONCATENATE ps_msg ls_msg-message INTO ps_msg SEPARATED BY '/'.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  ENDIF.

  FREE ls_main.

  CLEAR: lwa_sale,ls_main1,ls_mesg1,ls_main2,ls_mesg,l_parza.

  REFRESH: lt_functions,lt_sale,lt_cust.

ENDFORM.

*&---------------------------------------------------------------------*

*&      Form  PROCESS_INDCATOR

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_TEXT_T01  text

*      -->P_LV_PERCENTAGE  text

*----------------------------------------------------------------------*

FORM process_indcator  USING  p_index TYPE string.

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'

    EXPORTING

      percentage = p_index

      text       = '数据处理中,请等待...'.

ENDFORM.

SAP ABAP开发之-接口interface

几乎每个SAP系统的实施,都会伴随与外围系统接口,我最近的一个SAP项目,同时和18个外围系统做接口,有泛微OA,金税接口,报关系统,SRMMES,友云采,出口退税,报销,海波龙合并报表等众多平台,以OA接口为例,源代码Coding如下:

*******************************************************************

*   System-defined Include-files.                                 *

*******************************************************************

  INCLUDE LSLVC_FULLSCREENTOP.               " Global Data

  INCLUDE LSLVC_FULLSCREENUXX.               " Global Data

*******************************************************************

*   User-defined Include-files (if necessary).                    *

*******************************************************************

INCLUDE LSLVC_FULLSCREENO01.

INCLUDE LSLVC_FULLSCREENI01.

INCLUDE LSLVC_FULLSCREENF01.

INCLUDE LSLVC_FULLSCREENF02.

INCLUDE LSLVC_FULLSCREENF03.

INCLUDE LSLVC_FULLSCREENF04.

INCLUDE LSLVC_FULLSCREENO02.

INCLUDE LSLVC_FULLSCREENI02.

INCL

INCLUDE LSLVC_FULLSCREENF06.

INCLUDE LSLVC_FULLSCREENF07.

INCLUDE LSLVC_FULLSCREENF08.

INCLUDE LSLVC_FULLSCREENF09.

INCLUDE LSLVC_FULLSCREENF10.

INCLUDE LSLVC_FULLSCREENF11.

INCLUDE LSLVC_FULLSCREENF12.

INCLUDE LSLVC_FULLSCREENF13.

INCLUDE LSLVC_FULLSCREENF14.

INCLUDE LSLVC_FULLSCREENF15.

*INCLUDE LSLVC_FULLSCREENFBO.

INCLUDE LSLVC_FULLSCREENF16.

(由于每个INCLUDE下内容太多,不一一列出,需要的可以私信我)

总结,SAP的ABAP开发,虽然没有JAVA,安卓,网页XML PHP等大众化,属于一个管理软件小偏课,但随着企业信息化的深入,原来越多的企业都开始借助传统商品化的ERP,逐步打造自己公司的特性平台。所以,无论时外部实施咨询乙方顾问,还是企业甲方内部顾问,都开始作为一个职位的标准技能要求具备。所以,有兴趣的童鞋,可以顺带研究下。不难的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值