Michael's profileAt world's endBlogGuestbookNetwork Tools Help

Blog


    November 25

    creation of authorization object based on user and plant

    creation of authorization object based on user and plant

    Reply from Luis Martins on 12/14/2006 2:07 PM

    Hi Venki,
    To create an authorization object:
    1) Execute transaction SU21
    2) Double-click an Object Class to select a class that should contain
    your new auth object
    3) Click on CREATE (F5)
    4) (If creating custom field) - Click the 'Field Maintenance' button -->
    Click on CREATE (Shift+F1)
    5) Enter the Name for the New Authorization field and the corresponding
    Data Element and SAVE
    6) Confirm the Change Request data for the new Authorization Field
    7) Go back two screens (F3-->F3)
    8) Enter the Authorization field name and document the object:
    9) SAVE and ACTIVATE the documentation
    10) Save the new Authorization Object
    11) Confirm the change request data for the Authorization Object and
    EXIT SU21
    12) Finally, the SAP_ALL profile must be re-generated
    You may not need steps 4, 5 and 6 for restrictions at plant code level.
    For that, just use the existing WERKS field or data element WERKS_D.
    To lookup existing authorization fields, use transaction SU20.
    I'm sure there's more help in http://help.sap.com. You'll need the
    background info available there.

    November 20

    FUNCTION RSPO_OUTPUT_SPOOL_REQUEST.

    FUNCTION RSPO_OUTPUT_SPOOL_REQUEST.
    *"----------------------------------------------------------------------
    *"*"Lokale Schnittstelle:
    *"  IMPORTING
    *"     VALUE(COPIES) LIKE  TSP02-PJCOPIES DEFAULT 0
    *"     VALUE(DEVICE) LIKE  TSP03-PADEST DEFAULT '*'
    *"     VALUE(DIVISION) LIKE  TSP02-PJDIVISION DEFAULT '*'
    *"     VALUE(ENDPAGE) LIKE  TSP02-PJENDPAGE DEFAULT 0
    *"     VALUE(PRIO) LIKE  TSP02-PJPRIO DEFAULT 0
    *"     VALUE(RECEIVER) LIKE  TSP02-PJRECEIVER DEFAULT '*'
    *"     VALUE(REQEST_TITLE) LIKE  TSP01-RQTITLE DEFAULT '*'
    *"     VALUE(SPOOL_REQUEST_ID) LIKE  TSP01-RQIDENT
    *"     VALUE(STARTPAGE) LIKE  TSP02-PJSTRTPAGE DEFAULT 0
    *"     VALUE(TELELAN) LIKE  ITCPP-TDTELELAND DEFAULT '*'
    *"     VALUE(TELENUM) LIKE  TSKPA-TELNR DEFAULT '*'
    *"     VALUE(POSNAME) LIKE  TSP02-PJPOSNAME OPTIONAL
    *"     VALUE(ACTTIME) LIKE  TSP02-PJACTTIME OPTIONAL
    *"  TABLES
    *"      ATTRIBUTES STRUCTURE  RSPOATTR OPTIONAL
    *"  EXCEPTIONS
    *"      ARCHIVE_DEST_INVALID
    *"      ARCHIVE_DEST_NOT_FOUND
    *"      ARCHIVE_DEST_NO_RIGHT
    *"      CANNOT_ARCHIVE
    *"      CHANGE_ARCHDEST_NO_RIGHT
    *"      CHANGE_COPIES_NO_RIGHT
    *"      CHANGE_DEST_NO_RIGHT
    *"      CHANGE_DEVTYPE_NO_RIGHT
    *"      CHANGE_PRIO_NO_RIGHT
    *"      CHANGE_TELENUM_NO_RIGHT
    *"      CHANGE_TITLE_NO_RIGHT
    *"      DEST_INVALID
    *"      DEST_NOT_FOUND
    *"      DEST_NO_RIGHT
    *"      INTERNAL_PROBLEM
    *"      INVALID_FAX_ATTRIBUTE
    *"      INVALID_PARAMETERS
    *"      NON_OWNER_NO_RIGHT
    *"      NO_LAYOUT
    *"      NO_SPOOL_REQUEST
    *"      OUT_AGAIN_NO_RIGHT
    *"      SPOOLER_PROBLEM
    *"----------------------------------------------------------------------
    ***********************************************************************
    *
    * (c) SAP Aktiengesellschaft
    *     Systeme, Anwendungen und Produkte in der Datenverarbeitung
    *
    *----------------------------------------------------------------------
    * Autor:    Ma.Mittelstein
    * Reviewer: ??
    ***********************************************************************
    * @(#)lspoou22.abi      %I%     SAP     %E%
    *-HISTORY-------------------------
    *-1.1
    * 21.07.1994 mit      First release.
    *-END-HISTORY--------------------*/
    " No longer IMPORT parameters:
    "
    DATA: ARCHDEST LIKE TSP03-PADEST VALUE '*   '
          , ARCHIVE                    VALUE ' '
          .
    TABLES: RSPOCHECK                     "Parameterpruefung
            .
    DATA: FCODE(4)            VALUE 'FPRI'
          , BEGIN OF ORIG_REQ.
    INCLUDE STRUCTURE TSP01.
    DATA:   RQIDENTEXT LIKE TSP0E-RQIDENTEXT
          ,   RQARCHDAT1 LIKE TSP0E-RQARCHDAT1
          ,   RQARCHDAT2 LIKE TSP0E-RQARCHDAT2
          ,   DEVTYPE    LIKE TSP03-PATYPE
          ,   IS_FAX_OR_TELETEX
          , END OF  ORIG_REQ
          , BEGIN OF WANTED.
    INCLUDE STRUCTURE TSP01.
    DATA:   RQIDENTEXT LIKE TSP0E-RQIDENTEXT
          ,   RQARCHDAT1 LIKE TSP0E-RQARCHDAT1
          ,   RQARCHDAT2 LIKE TSP0E-RQARCHDAT2
          ,   DEVTYPE    LIKE TSP03-PATYPE
          ,   IS_FAX_OR_TELETEX
          , END OF  WANTED
          , IDENT(10)
          , ANSWER_300
          , STATUS       LIKE SY-SUBRC
          , DONT_MOD_RQDEST     VALUE ' '
          , DONT_MOD_RQCOPIES   VALUE ' '
          , DONT_MOD_RQPRIO     VALUE ' ' "never set?
          , DONT_MOD_RQRECEIVER VALUE ' '
          , DONT_MOD_RQDIVISION VALUE ' '
          , DONT_MOD_RQTITLE    VALUE ' '
          , DONT_MOD_RQPAPER    VALUE ' '
          , DONT_MOD_RQARCHDEST VALUE ' '
          , DONT_MOD_RQTELELAN  VALUE ' '
          , DONT_MOD_RQTELENUM  VALUE ' '
          , DONT_MOD_RQTELENUME VALUE ' '
          , DONT_MOD_DEVTYPE    VALUE ' '
          .
    * (1a) Find the spool request,
    *
    CLEAR ORIG_REQ.
    SELECT SINGLE * FROM TSP01 WHERE RQIDENT = SPOOL_REQUEST_ID.
    IF SY-SUBRC >< 0.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 106 WITH SPOOL_REQUEST_ID
    RAISING NO_SPOOL_REQUEST.
    ENDIF.
    MOVE-CORRESPONDING TSP01 TO ORIG_REQ.
    ". IF TSP01-RQARCHTYPE = '3' AND TSP01-RQARCHSTAT <= '1'.
    ".   MESSAGE S314.             "Wird nach ausdruck archiviert.
    ". ENDIF.
    ". IF TSP01-RQARCHTYPE = '2' AND TSP01-RQARCHSTAT <= '1'.
    ".   MESSAGE I315.             "Der Auftrag soll nur archiviert werden
    ". ENDIF.
    * (1b) and the extension record for the spool request,
    *
    UNPACK ORIG_REQ-RQIDENT TO IDENT.
    SELECT SINGLE * FROM TSP0E WHERE  RQIDENT = IDENT
    AND    RQIDENTEXT = '0'.
    IF SY-SUBRC <> 0.
    "
    ELSE.
        ORIG_REQ-RQIDENTEXT = TSP0E-RQIDENTEXT.
        ORIG_REQ-RQARCHDAT1 = TSP0E-RQARCHDAT1.
        ORIG_REQ-RQARCHDAT2 = TSP0E-RQARCHDAT2.
    ENDIF.
    * (1c) and some info about output device.
    *
    SELECT SINGLE * FROM TSP03C WHERE PADEST = ORIG_REQ-RQDEST.
    SELECT SINGLE * FROM TSP03 WHERE PADEST = ORIG_REQ-RQDEST.
    IF SY-SUBRC >< 0.
          ORIG_REQ-DEVTYPE = 'bad'.
    ELSE.
          ORIG_REQ-DEVTYPE = TSP03-PATYPE.
    IF TSP03C-PAARCHIVER = 'F' OR TSP03C-PAARCHIVER = 'T'.
            ORIG_REQ-IS_FAX_OR_TELETEX = 'X'.
    ENDIF.
    ENDIF.
    CLEAR WANTED.
    MOVE-CORRESPONDING ORIG_REQ TO WANTED.
    * (2)  If this spool request is protected, look what is (not) allowed.
    *
    * if orig_req-rqauth <> ' '.
    *   (2a) caller must be the owner or needs BASE permission.
    *
    *   if orig_req-rqowner <> sy-uname or orig_req-rqclient <> sy-mandt.
    *   authority-check object 'S_SPO_ACT'
    *                     id     'SPOACTION' field  'BASE'
    *                     id     'SPOAUTH'   field  orig_req-rqauth.
    DATA: SPOOLREQ LIKE TSP01.
    MOVE-CORRESPONDING ORIG_REQ TO SPOOLREQ.
    PERFORM CHECK_JOB_PERMISSION USING SPOOLREQ 'BASE'.
    IF SY-SUBRC <> 0.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 358 RAISING NON_OWNER_NO_RIGHT.
    ENDIF.
    *   endif.
    *   (2b) Allowed to redirect?
    *
    *   authority-check object 'S_SPO_ACT'
    *                   id     'SPOACTION' field  'REDI'
    *                   id     'SPOAUTH'   field  orig_req-rqauth.
    PERFORM CHECK_JOB_PERMISSION USING SPOOLREQ 'REDI'.
    IF SY-SUBRC <> 0.
          DONT_MOD_RQDEST     = 'X'.
    ENDIF.
    *   (2c) Allowed to change attributes?
    *
    *   authority-check object 'S_SPO_ACT'
    *                   id     'SPOACTION' field  'ATTR'
    *                   id     'SPOAUTH'   field  orig_req-rqauth.
    PERFORM CHECK_JOB_PERMISSION USING SPOOLREQ 'ATTR'.
    IF SY-SUBRC <> 0.
          DONT_MOD_RQCOPIES   = 'X'.
          DONT_MOD_RQRECEIVER = 'X'.
          DONT_MOD_RQDIVISION = 'X'.
          DONT_MOD_RQTITLE    = 'X'.
          DONT_MOD_RQPAPER    = 'X'.
          DONT_MOD_RQARCHDEST = 'X'.
          DONT_MOD_DEVTYPE    = 'X'.
    ENDIF.
    * endif.
    * (3)  Look at status of spool request
    *
    IF TSP01-RQARCHSTAT = '4'.
    " Archvierung war fehlgeschlagen !
    "?? MESSAGE W324.                     "Archivierung fehlgeschlagen
    ENDIF.
    IF TSP01-RQARCHSTAT = '4'.
    " Fine.
    ELSEIF TSP01-RQARCHTYPE = '2' AND
             TSP01-RQARCHSTAT <= '1'.                "#EC PORTABLE
    " Fine.
    ELSE. "Cannot archive !
    IF ARCHIVE = 'X'.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 232 RAISING CANNOT_ARCHIVE.
    ENDIF.
    ENDIF.
    IF TSP01-RQARCHTYPE = '1'.
        DONT_MOD_RQARCHDEST = 'X'.
    ENDIF.
    * (4)  Does the caller want to override some of the attributes?
    *      (1st group)
    *
    IF DEVICE >< '*' AND DEVICE >< WANTED-RQDEST.
    IF DONT_MOD_RQDEST >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 233 WITH WANTED-RQDEST DEVICE
    RAISING CHANGE_DEST_NO_RIGHT.
    ELSE.
          WANTED-RQDEST     = DEVICE.
    ENDIF.
    ENDIF.
    IF COPIES >< 0 AND COPIES >< WANTED-RQCOPIES.
    IF DONT_MOD_RQCOPIES >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 234
    RAISING CHANGE_COPIES_NO_RIGHT.
    ELSE.
          WANTED-RQCOPIES   = COPIES.
    ENDIF.
    ENDIF.
    IF PRIO >< 0 AND PRIO >< WANTED-RQPRIO.
    IF DONT_MOD_RQPRIO >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 235 RAISING CHANGE_PRIO_NO_RIGHT.
    ELSE.
          WANTED-RQPRIO     = PRIO.
    ENDIF.
    ENDIF.
    IF RECEIVER >< '*' AND RECEIVER >< WANTED-RQRECEIVER.
    IF DONT_MOD_RQRECEIVER >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 236 RAISING CHANGE_TITLE_NO_RIGHT.
    ELSE.
          WANTED-RQRECEIVER = RECEIVER.
    ENDIF.
    ENDIF.
    IF REQEST_TITLE >< '*' AND REQEST_TITLE >< WANTED-RQTITLE.
    IF DONT_MOD_RQTITLE >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 236 RAISING CHANGE_TITLE_NO_RIGHT.
    ELSE.
          WANTED-RQTITLE    = REQEST_TITLE.
    ENDIF.
    ENDIF.
    IF DIVISION >< '*' AND DIVISION >< WANTED-RQDIVISION.
    IF DONT_MOD_RQDIVISION >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 236 RAISING CHANGE_TITLE_NO_RIGHT.
    ELSE.
          WANTED-RQDIVISION = DIVISION.
    ENDIF.
    ENDIF.
    IF ARCHDEST >< '*' AND ARCHDEST >< WANTED-RQARCHDEST.
    IF DONT_MOD_RQARCHDEST >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 237
    RAISING CHANGE_ARCHDEST_NO_RIGHT.
    ELSE.
    CALL FUNCTION 'RSPO_CHECK_ARCHIVE_PERMISSION'
    CHANGING
                    DEST           = ARCHDEST
    EXCEPTIONS
                    NO_SUCH_DEVICE = 1
                    NO_PERMISSION  = 2
                    NO_ARCHIVER    = 3.
    IF SY-SUBRC NE 0.
    MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO WITH SY-MSGV1
    RAISING CHANGE_ARCHDEST_NO_RIGHT.
    ENDIF.
          WANTED-RQARCHDEST = ARCHDEST.
    ENDIF.
    ENDIF.
    * (5)  Is this an additional print out, and has user permission
    *      to print more than once?
    *
    * if wanted-rqpjreq > 0 and wanted-rqauth <> ' '.
    IF WANTED-RQPJREQ > 0.
    MOVE-CORRESPONDING WANTED TO SPOOLREQ.
    PERFORM CHECK_JOB_PERMISSION USING SPOOLREQ 'REPR'.
    *   authority-check object 'S_SPO_ACT'
    *                   id     'SPOACTION' field  'REPR'
    *                   id     'SPOAUTH'   field  wanted-rqauth.
    ELSE.
    PERFORM CHECK_JOB_PERMISSION USING SPOOLREQ 'PRNT'.
    ENDIF.
    IF SY-SUBRC <> 0.
    " Keine Berechtigung
    MESSAGE ID 'PO' TYPE 'E' NUMBER 320 RAISING OUT_AGAIN_NO_RIGHT.
    ENDIF.
    * (6)  Look at output device:
    *
    CALL FUNCTION 'RSPO_CHECK_DEVICE_PERMISSION'
    EXPORTING
                DEST           = WANTED-RQDEST
    EXCEPTIONS
                NO_SUCH_DEVICE = 1
                NO_PERMISSION  = 2
    OTHERS         = 3.
    CASE SY-SUBRC.
    WHEN '1'.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 238 WITH WANTED-RQDEST
    RAISING DEST_NOT_FOUND.
    WHEN '2' OR '3'.
    " Keine Berechtigung für Gerät.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 240 WITH WANTED-RQDEST
    RAISING DEST_NO_RIGHT.
    ENDCASE.
      WANTED-DEVTYPE = TSP03-PATYPE.
    IF TSP03C-PAARCHIVER <> 'F' AND TSP03C-PAARCHIVER <> 'T'.
    " Kein Telefax ausgeben
        WANTED-IS_FAX_OR_TELETEX = ' '.
    ELSE.
        WANTED-IS_FAX_OR_TELETEX = 'X'.
    ENDIF.
    ". DATA: HEX TYPE X.
    ". MOVE TSP03-PAMSG TO PRTMSG_300.
    ". MOVE TSP03-PASTATUS TO HEX.
    ". IF HEX O 2.
    ".   MOVE 'gesperrt'(046) TO STATUS_300.
    ". ELSEIF HEX O 4.
    ".   MOVE 'nicht aktiv'(047) TO STATUS_300.
    ". ELSEIF HEX O 16.
    ".   MOVE 'fehlerhaft'(048) TO STATUS_300.
    ". ELSE.
    ".   CLEAR STATUS_300.
    ". ENDIF.
    * (6c) Valid destination?
    *
    CLEAR RSPOCHECK.
    MOVE-CORRESPONDING WANTED TO RSPOCHECK.
    MOVE 'G' TO RSPOCHECK-RQ1DISPO. "Geraeterecht pruefen
    "archiv-ID ??
    "
    CALL FUNCTION 'RSPO_CHECK_DESTINATION'
    EXPORTING PRINT_PARAMETER = RSPOCHECK
    EXCEPTIONS ARCHIVE_DEST_INVALID     = 11
                       ARCHIVE_DEST_NOT_FOUND   = 12
                       ARCHIVE_DEST_NO_RIGHT    = 13
                       DEST_INVALID             = 14
                       DEST_NOT_FOUND           = 15
                       DEST_NO_RIGHT            = 16
                       INVALID_PARAMETERS       = 17
    OTHERS                   = 10
            .
    IF SY-SUBRC >< 0.
    CASE SY-SUBRC.
    WHEN 10.
    MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 RAISING INVALID_PARAMETERS.
    WHEN 11.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 351 WITH WANTED-RQARCHDEST
    RAISING ARCHIVE_DEST_INVALID.
    WHEN 12.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 351 WITH WANTED-RQARCHDEST
    RAISING ARCHIVE_DEST_NOT_FOUND.
    WHEN 13.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 351 WITH WANTED-RQARCHDEST
    RAISING ARCHIVE_DEST_NO_RIGHT.
    WHEN 14.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 238 WITH WANTED-RQDEST
    RAISING DEST_INVALID.
    WHEN 15.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 238 WITH WANTED-RQDEST
    RAISING DEST_NOT_FOUND.
    WHEN 16.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 352 WITH WANTED-RQDEST
    RAISING DEST_NO_RIGHT.
    WHEN 17.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 231 WITH 0 0
    'INVALID_PARAMETERS' 'CD_'
    RAISING INVALID_PARAMETERS.
    WHEN OTHERS.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 231 WITH 0 0
    'INTERNAL_PROBLEM' 'OSR'
    RAISING INTERNAL_PROBLEM.
    ENDCASE.
    ENDIF.
    * (6d) Does the wanted layout match to the output devive?
    *
    CALL FUNCTION 'RSPO_TEST_LAYOUT'
    EXPORTING
                DEVICE = WANTED-RQDEST
                LAYOUT = WANTED-RQPAPER
    IMPORTING
                ANSWER = ANSWER_300.
    IF ANSWER_300 = ' '.
    " Hmmm. Existiert nicht.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 304 WITH WANTED-RQDEST
                                                 WANTED-RQPAPER
    RAISING NO_LAYOUT.
    ENDIF.
    * (6e) Changing device to one of different type?
    *
    IF ORIG_REQ-RQDEST >< WANTED-RQDEST.
    " Not the original output device.
    IF ORIG_REQ-DEVTYPE >< WANTED-DEVTYPE.
    *     Benötigt Attribut-Rechte
    IF DONT_MOD_DEVTYPE <> ' '.
    " Keine Berechtigung
    MESSAGE ID 'PO' TYPE 'E' NUMBER 322
    RAISING CHANGE_DEVTYPE_NO_RIGHT.
    ENDIF.
    ENDIF.
    ENDIF.
    * (7)  Does the caller want to override some of the attributes?
    *      (2nd group)
    *
    IF TELENUM >< '*' AND TELENUM >< WANTED-RQTELENUM.
    IF DONT_MOD_RQTELENUM >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 239
    RAISING CHANGE_TELENUM_NO_RIGHT.
    ELSEIF WANTED-IS_FAX_OR_TELETEX = ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 226 WITH WANTED-RQDEST
    RAISING INVALID_FAX_ATTRIBUTE.
    ELSE.
          WANTED-RQTELENUM  = TELENUM.
    ENDIF.
    ENDIF.
    IF TELELAN >< '*' AND TELELAN >< WANTED-RQTELELAN.
    IF DONT_MOD_RQTELELAN >< ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 239
    RAISING CHANGE_TELENUM_NO_RIGHT.
    ELSEIF WANTED-IS_FAX_OR_TELETEX = ' '.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 226 WITH WANTED-RQDEST
    RAISING INVALID_FAX_ATTRIBUTE.
    ELSE.
          WANTED-RQTELELAN  = TELELAN.
    ENDIF.
    ENDIF.
    IF WANTED-IS_FAX_OR_TELETEX <> ' '.
    IF ORIG_REQ-RQDEST <> WANTED-RQDEST OR
           ORIG_REQ-RQTELELAN <> WANTED-RQTELELAN OR
           ORIG_REQ-RQTELENUM <> WANTED-RQTELENUM.
    CALL FUNCTION 'SK_DEST_TO_NUMBER'
    EXPORTING
    COUNTRY     = WANTED-RQTELELAN
    NUMBER      = WANTED-RQTELENUM
              DESTINATION = WANTED-RQDEST
              SERVICE     = 'TELEFAX'
    "??       EXTERN      = 'X'
    IMPORTING
              DNUMBER     = WANTED-RQTELENUME
    EXCEPTIONS
              COUNTRY_NOT_CONFIGURED = 1
              SERVER_NOT_FOUND       = 2
              SERVICE_NOT_SUPPORTED  = 3
              WRONG_SERVICE_FOR_DEST = 4.
    CASE SY-SUBRC.
    WHEN 0.
    " OK.
    WHEN 1.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 261 WITH WANTED-RQTELELAN
    RAISING INVALID_FAX_ATTRIBUTE.
    WHEN 2.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 262 WITH WANTED-RQDEST
    RAISING INVALID_FAX_ATTRIBUTE.
    WHEN 3.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 263
    RAISING INVALID_FAX_ATTRIBUTE.
    WHEN 4.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 228 WITH WANTED-RQDEST
    RAISING INVALID_FAX_ATTRIBUTE.
    ENDCASE.
    ENDIF.
    ENDIF.
    if not posname is initial.
        wanted-rqposname = posname.
    endif.
    * (8)  Action !
    *
    IF ARCHIVE = 'X'.        "?? Not yet implemented.
    *        -====-  Starte Archvierung
    CALL 'RSPOAEPJ' ID 'ID' FIELD IDENT
    ID 'DEST' FIELD WANTED-RQDEST
    ID 'ARCHDEST' FIELD WANTED-RQARCHDEST
    ID 'ARCHIVE' FIELD 'X'
    ID 'COPY' FIELD WANTED-RQCOPIES
    ID 'PRIO' FIELD WANTED-RQPRIO
    ID 'TITLE' FIELD WANTED-RQTITLE
    ID 'RECEIVER' FIELD WANTED-RQRECEIVER
    ID 'DIVISION' FIELD WANTED-RQDIVISION
    "  'TELENUM'
    "  'STARTPAGE'
    "  'ENDPAGE'
    ID 'RC' FIELD RC
    ID 'ERRMSG' FIELD ERRMSG.
    MOVE SY-SUBRC TO STATUS.
    ELSE. " print or fax
    *        -====-  Starte Faxauftrag
    *        -====-  Drucken
    if acttime is initial.
    CALL 'RSPOAEPJ' ID 'ID' FIELD IDENT
    ID 'DEST' FIELD WANTED-RQDEST
    "  'ARCHDEST'
    "  'ARCHIVE'
    ID 'COPY' FIELD WANTED-RQCOPIES
    ID 'PRIO' FIELD WANTED-RQPRIO
    ID 'TITLE' FIELD WANTED-RQTITLE
    ID 'RECEIVER' FIELD WANTED-RQRECEIVER
    ID 'DIVISION' FIELD WANTED-RQDIVISION
    ID 'TELENUM' FIELD WANTED-RQTELENUME
    ID 'STARTPAGE' FIELD STARTPAGE
    ID 'ENDPAGE' FIELD ENDPAGE
    ID 'POSNAME' field WANTED-RQPOSNAME
    ID 'ATTRIBUTES' field attributes[]
    ID 'RC' FIELD RC
    ID 'ERRMSG' FIELD ERRMSG.
    MOVE SY-SUBRC TO STATUS.
    else.
    CALL 'RSPOAEPJ' ID 'ID' FIELD IDENT
    ID 'DEST' FIELD WANTED-RQDEST
    "  'ARCHDEST'
    "  'ARCHIVE'
    ID 'COPY' FIELD WANTED-RQCOPIES
    ID 'PRIO' FIELD WANTED-RQPRIO
    ID 'TITLE' FIELD WANTED-RQTITLE
    ID 'RECEIVER' FIELD WANTED-RQRECEIVER
    ID 'DIVISION' FIELD WANTED-RQDIVISION
    ID 'TELENUM' FIELD WANTED-RQTELENUME
    ID 'STARTPAGE' FIELD STARTPAGE
    ID 'ENDPAGE' FIELD ENDPAGE
    ID 'POSNAME' field WANTED-RQPOSNAME
    ID 'ACTTIME' field ACTTIME
    ID 'ATTRIBUTES' field attributes[]
    ID 'RC' FIELD RC
    ID 'ERRMSG' FIELD ERRMSG.
    MOVE SY-SUBRC TO STATUS.
    endif.
    ENDIF.
    IF STATUS NE 0.
    ". PERFORM SHOW_RSPO_ERROR_MESSAGE(RSPOSP01) USING 'EPJ' STATUS
    ".                                                 RC ERRMSG.
    MESSAGE ID 'PO' TYPE 'E' NUMBER 231 WITH STATUS RC ERRMSG 'EPJ'
    RAISING SPOOLER_PROBLEM.
    ENDIF.
    ENDFUNCTION.
    FORM CHECK_JOB_PERMISSION USING SPOOLREQ LIKE TSP01 ACCESS.
    CALL FUNCTION 'RSPO_CHECK_JOB_PERMISSION'
    EXPORTING
                ACCESS        = ACCESS
                SPOOLREQ      = SPOOLREQ
    EXCEPTIONS
                NO_PERMISSION = 2
    OTHERS        = 3.
    ENDFORM.

    * read OTF spooljob and convert to PDF, write into new spooljob

    REPORT RSTXPDF4.
    *
    * read OTF spooljob and convert to PDF, write into new spooljob
    *
    parameters: spoolno like tsp01-rqident,
                dstdevic like tsp03-padest.
    constants:  c_pdfcnv_pdfdst_spooljob type c value 'S',
                c_pdfcnv_otfsrc_spooljob type c value 'S'.
    data: otf like itcoo occurs 1,
          pdf like tline occurs 1.
    data: cur_system_lang like sy-langu,
          otf_pagecount type i,
          toolarge,
          pdf_bytecount type i,
          arcindex like toa_dara,
          pdf_spoolid like tsp01-rqident,
          subrc like sy-subrc,
          pdf_file type xstring.
    cur_system_lang = SY-LANGU.
    * select device for PDF spooljob
    if dstdevic = space.
    perform spo_get_defdevice(SAPLSTXW) using dstdevic.
    endif.
    * convert to PDF
    pdf_bytecount = 0.
    perform pdfcnv_convertotf(SAPLSTXW)
    tables otf
                                     PDF
    using  C_PDFCNV_OTFSRC_SPOOLJOB
                                     arcindex
    0
                                     spoolno
                                     C_PDFCNV_PDFDST_SPOOLJOB
                                     dstdevic
                                     pdf_spoolid
                                     pdf_bytecount
                                     pdf_file
                                     space.
    subrc = sy-subrc.
    set locale language cur_system_lang.
    IF pdf_bytecount < 0 or subrc <> 0.
    perform msg_v1(SAPLSTXW) using 'E'
    'Fehler bei PDF-Konvertierung von Spoolauftrag $'(003)
                     spoolno.
    else.
    perform msg_v1(SAPLSTXW) using 'S'
    'Spoolauftrag $ mit PDF-Daten wurde erzeugt'(004)
                     pdf_spoolid.
    endif.

    November 19

    Stock/valuation data of previous (Date Back)

    25.05.2009 Page 1 of 3
    SAP Note 193554 - Stock/valuation data of previous
    periods
    Note Language: English Version: 5 Validity: Valid Since 29.01.2001
    Summary
    Symptom
    As of Release 4.5, stock and valuation fields that refer to the previous
    period or those dating back even farther, are not stored in those tables in
    which the current stock data is stored (MBEW, MARD, MCHB, and so on) but in
    so-called history tables (MBEWH, MARDH, MCHBH, and so on.).
    (Also compare release note for period closing as of Release 4.5)
    These history tables can have one entry per period. The values of such an
    entry refer to the end of the period. For the current period, there are no
    entries in the history tables. An entry is not written in this history
    table for every period. If stock-relevant or valuation-relevant data
    change, the system might generate an entry in the history table.
    Furthermore, the fields LFMON ('Current Period (Booking period)') and LFGJA
    ('Fiscal Year of the Current Period') in the stock tables are no longer
    automatically set to the current period by the period closing program. The
    period is only transferred to the new period during the first movement. At
    the same time, the relevant history entries are also generated.
    Example:
    Material 4711 has a stock of 10 pieces at the end of period 01
    In period 02, a goods receipt of 5 pieces occurs.
    Now, an entry is added in the history table for period 01 with a stock of
    10 pieces. Simultaneously, the current stock is increased to 15 pieces and
    the 'Current Period' field (LFMON) is set to 02.
    In period 02, an additional goods receipt occurs with 2 pieces.
    The history table is not affected by this operation since an entry already
    exists for period 01. The current stock is increased to 17 pieces.
    In period 04, a goods issue of 4 pieces occurs.
    Now, the system adds an entry for period 03 with a stock of 17 pieces in
    the history table. Simultaneously, the current stock is decreased to 13
    pieces and the 'Current Period' field (LFMON) is changed from 02 to 04.
    Since no goods movement has occurred in period 03, there is no entry for
    period 02 in the history table.
    Thus, the following applies:
    1. The stock in the stock table describes the situation since the last
    goods movement which changed this segment. The period of this movement
    appears in the fields LFMON and LFGJA. All stocks for periods which
    are earlier than the periods given in the fields LFMON and LFGJA
    relate to the current stocks and can be found in the stock tables.
    2. If for a previous period n, no entry exists in the history table, then
    the values of this period correspond to the values of the period n+1.
    Since the 2nd rule can be used recursively, under consideration of the two
    above rules the values can be determined for any periods of that period in
    which Release 4.5 or a higher release were implemented.
    Please note: Since the history tables are not created retroactively, the
    history entries only exist in their completed form from the time from which
    users work with the new period closing program. The periods for which the
    period closing program has run for the first time with history records are
    listed in the table MARV for every company code in the fields GJA_40C and
    25.05.2009 Page 2 of 3
    SAP Note 193554 - Stock/valuation data of previous
    periods
    MON_40C. For technical reasons it is possible that there are also entries
    in the history tables with an older period. Nevertheless, these entries are
    not available without gaps for all stocks.
    This algorithm is also implemented in function modules MBEW_EXTEND,
    MARD_EXTEND and so on. These function modules are used in the standard SAP
    programs in order to determine the values of the previous period and to
    extend tables with the reference structure MBEW, MARD and so on
    correspondingly.
    If you have your own programs which use the prior-period values from the
    tables MARD, MBEW etc., you should call up the relevant EXTEND component
    after reading the data from the table. This then returns the data as though
    no change had taken place in the previous logic. You can then remove the
    prior-period values from the known fields.
    Additional key words
    MBEWH, MARDH, MCHBH, stock information, previous period stock,
    previous month stock
    Cause and prerequisites
    The error occurs by new data design of the stock data and the valuation
    data in the material, batch and special stock tables.
    Solution
    See above text.
    Source code corrections
    Header Data
    Release Status: Released for Customer
    Released on: 06.05.2003 13:57:44
    Original Lang.: German
    Priority: Recommendations/additional info
    Category: Consulting
    Main Component: LO-MD-MM Material Master
    Valid Releases
    Software Component Release From
    Release
    To
    Release
    and
    Subsequent
    SAP_APPL 45 45A 45B
    SAP_APPL 46 46A 46B
    SAP_APPL 46C 46C 46C
    Related Notes
    25.05.2009 Page 3 of 3
    SAP Note 193554 - Stock/valuation data of previous
    periods
    Number Short Text
    550263 SD_VBAK: check for stock of previous period
    415349 Usage of modules XXXX_EXTEND for previous period values

    November 16

    abap中的弹出窗口函数

    abap中的弹出窗口函数

    POPUP_TO_CONFIRM_WITH_MESSAGE     会话框确实处理步骤; 用识别正文POPUP_TO_SELECT_MONTH             日历:弹出

    POPUP_TO_CONFIRM                  标准对话弹出消息

    POPUP_TO_CONFIRM_STEP          会话框确实任何处理步骤 (CONFIRM, POPUP)

    SPO3                           用于输入数据的对话框
    POPUP_TO_GET_ONE_VALUE         Pop-up window, in order to confirm use
    POPUP_TO_GET_VALUE             POPUP for requesting a value

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/05/15/2447107.aspx

    Table Control例子

    Table Control例子 收藏
    实现了Table Control的主要的一些功能,可以作为例子参考,实现的功能有是否可编辑切换,选择某一条记录点击按钮显示详细信息,新增记录,删除记录,选择所有记录,选择光标所有记录,取消选择所有,排序,行选择栏位,列不可编辑,固定列,Table Control标题,分页功能,根据输入A字段的值显示B字段的值,某字段的值如果等于XXX就不可编辑等功能。相信这些功能已经可以满足大部份的开发了。

    主程序代码:
    DATA: ok_code TYPE sy-ucomm,
          save_ok TYPE sy-ucomm.
    DATA: l_field TYPE char50,
          l_line  TYPE i.

    TYPES: BEGIN OF ty_spfli,
             carrid TYPE spfli-carrid,
             connid TYPE spfli-connid,
             countryfr TYPE spfli-countryfr,
             cityfrom TYPE spfli-cityfrom,
             airpfrom TYPE spfli-airpfrom,
             mask(1),
    END OF ty_spfli.

    DATA g_lines TYPE i.
    DATA sp2 TYPE TABLE OF ty_spfli WITH HEADER LINE.

    DATA sp1 TYPE ty_spfli.

    SELECT * INTO CORRESPONDING FIELDS OF TABLE sp2 FROM spfli.

    CONTROLS content TYPE TABLEVIEW USING SCREEN 100.
    content-top_line = 1.
    content-lines = LINES( sp2 ).

    CALL SCREEN 100.

    LOOP AT sp2.
      WRITE: / sp2-carrid,sp2-connid,sp2-countryfr,sp2-cityfrom.
    ENDLOOP.

    *----------------------------------------------------------------------*
    *  MODULE status_0100 OUTPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE status_0100 OUTPUT.
      SET PF-STATUS 'STA'.
    ENDMODULE.                    "status_0100 OUTPUT

    *----------------------------------------------------------------------*
    *  MODULE user_command_0100 INPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE user_command_0100 INPUT.
      save_ok = ok_code.
      CLEAR ok_code.
      CASE save_ok.
        WHEN 'EXIT'.
          LEAVE TO SCREEN 0.
        WHEN 'SWITH'.
          PERFORM f_switch.
        WHEN 'SORT_UP'.
          PERFORM f_sort USING 'UP'.
        WHEN 'SORT_DOWN'.
          PERFORM f_sort USING 'DOWN'.
        WHEN 'DETAIL'.
          PERFORM f_detail.
        WHEN 'P--'.
          PERFORM f_page USING save_ok.
        WHEN 'P-'.
          PERFORM f_page USING save_ok.
        WHEN 'P+'.
          PERFORM f_page USING save_ok.
        WHEN 'P++'.
          PERFORM f_page USING save_ok.
        WHEN 'SELECT'.
          PERFORM f_select USING 'SELECT'.
        WHEN 'BLOCK'.
          PERFORM f_select USING 'BLOCK'.
        WHEN 'DESELECT'.
          PERFORM f_select USING 'DESELECT'.
        WHEN 'INSERT'.
          PERFORM f_row USING 'INSERT'.
        WHEN 'DELETE'.
          PERFORM f_row USING 'DELETE'.
      ENDCASE.
    ENDMODULE.                    "user_command_0100 INPUT

    *----------------------------------------------------------------------*
    *  MODULE filltab OUTPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE filltab OUTPUT.
      READ TABLE sp2 INTO sp1 INDEX content-current_line.
    ENDMODULE.                    "filltab OUTPUT

    *----------------------------------------------------------------------*
    *  MODULE readtab INPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE readtab INPUT.
      g_lines = sy-loopc.
      MODIFY sp2 FROM sp1 INDEX content-current_line.
    ENDMODULE.                    "readtab INPUT

    *----------------------------------------------------------------------*
    *  MODULE chang_val INPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE chang_val INPUT.
      DATA lwa_cols LIKE LINE OF content-cols.

      LOOP AT content-cols INTO lwa_cols.
        IF lwa_cols-screen-name = 'SP1-COUNTRYFR'
          AND sp1-countryfr = 'AA'.
          sp1-cityfrom = 'SDSDSD'.
          MODIFY sp2 FROM sp1 INDEX content-current_line.
        ENDIF.
      ENDLOOP.
    ENDMODULE.                    "chang_val INPUT

    *----------------------------------------------------------------------*
    *  MODULE get_cursor INPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE get_cursor INPUT.
      GET CURSOR FIELD l_field LINE l_line.
    ENDMODULE.                    "get_cursor INPUT

    *----------------------------------------------------------------------*
    *  MODULE set_cursor OUTPUT
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE set_cursor OUTPUT.
      SET CURSOR FIELD l_field LINE l_line.
    ENDMODULE.                    "set_cursor OUTPUT

    *----------------------------------------------------------------------*
    *  MODULE SET_EDITABLE
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    MODULE set_editable OUTPUT.
      LOOP AT SCREEN.
        IF screen-name = 'SP1-CITYFROM'.
          IF sp1-cityfrom = 'SDSDSD'.
            screen-input = 0.
            MODIFY SCREEN.
          ENDIF.
        ENDIF.
      ENDLOOP.
    ENDMODULE.                    "SET_EDITABLE

    *&---------------------------------------------------------------------*
    *&      Form  f_page
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->CODE       text
    *----------------------------------------------------------------------*
    FORM f_page USING code TYPE sy-ucomm.
      DATA: i TYPE i,
            j TYPE i.
      CASE code.
        WHEN 'P--'.
          content-top_line = 1.
        WHEN 'P-'.
          content-top_line = content-top_line - g_lines.
          IF content-top_line <= 0.
            content-top_line = 1.
          ENDIF.
        WHEN 'P+'.
          i = content-top_line + g_lines.
          j = content-lines - g_lines + 1.
          IF j <= 0.
            j = 1.
          ENDIF.
          IF i <= j.
            content-top_line = i.
          ELSE.
            content-top_line = j.
          ENDIF.
        WHEN 'P++'.
          content-top_line = content-lines - g_lines + 1.
          IF content-top_line <= 0.
            content-top_line = 1.
          ENDIF.
      ENDCASE.
    ENDFORM.                    "f_page

    *&---------------------------------------------------------------------*
    *&      Form  f_switch
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM f_switch.
      DATA lwa_cols LIKE LINE OF content-cols.

      LOOP AT content-cols INTO lwa_cols WHERE index > 2.
        IF lwa_cols-screen-input = 0.
          lwa_cols-screen-input = 1.
        ELSE.
          lwa_cols-screen-input = 0.
        ENDIF.
        MODIFY content-cols FROM lwa_cols INDEX sy-tabix.
      ENDLOOP.
    ENDFORM.                    "f_switch

    *&---------------------------------------------------------------------*
    *&      Form  F_SORT
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->CODE       text
    *----------------------------------------------------------------------*
    FORM f_sort USING code.
      DATA: str1 TYPE string,
            str2 TYPE string,
            lwa_cols LIKE LINE OF content-cols.

      READ TABLE content-cols INTO lwa_cols WITH KEY selected = 'X'.

      IF sy-subrc = 0.
        SPLIT lwa_cols-screen-name AT '-' INTO str1 str2.
        IF code = 'UP'.
          SORT sp2 STABLE BY (str2) ASCENDING.
        ELSEIF code = 'DOWN'.
          SORT sp2 STABLE BY (str2) DESCENDING.
        ENDIF.
        lwa_cols-selected = ''.
        MODIFY content-cols FROM lwa_cols TRANSPORTING selected WHERE selected = 'X'.
      ENDIF.
    ENDFORM.                    "F_SORT

    *&---------------------------------------------------------------------*
    *&      Form  f_detail
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM f_detail.
      READ TABLE sp2 INTO sp1 WITH KEY mask = 'X'.

      IF sy-subrc = 0 AND sp1-mask = 'X'.
        CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
          EXPORTING
            textline1 = sp1-carrid
            textline2 = sp1-connid.
      ENDIF.
    ENDFORM.                    "f_detail

    *&---------------------------------------------------------------------*
    *&      Form  f_select
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->CODE       text
    *----------------------------------------------------------------------*
    FORM f_select USING code.
      CASE code.
        WHEN 'SELECT'.
          sp1-mask = 'X'.
          MODIFY sp2 FROM sp1 TRANSPORTING mask WHERE mask IS INITIAL.
        WHEN 'BLOCK'.
          sp1-mask = 'X'.
          MODIFY sp2 FROM sp1 INDEX l_line TRANSPORTING mask.
        WHEN 'DESELECT'.
          sp1-mask = ''.
          MODIFY sp2 FROM sp1 TRANSPORTING mask WHERE mask = 'X'.
      ENDCASE.
    ENDFORM.                    "f_select

    *&---------------------------------------------------------------------*
    *&      Form  F_ROW
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->CODE       text
    *----------------------------------------------------------------------*
    FORM f_row USING code.
      DATA lwa_cols LIKE LINE OF content-cols.
      DATA: l_int TYPE i,
            lt_cols LIKE TABLE OF l_int.
      CASE code.
        WHEN 'INSERT'.
          INSERT INITIAL LINE INTO sp2 INDEX l_line.
        WHEN 'DELETE'.
          DELETE sp2 WHERE mask = 'X'.
      ENDCASE.
    ENDFORM.                    "F_ROW

    屏幕100的代码:
    PROCESS BEFORE OUTPUT.
      MODULE status_0100.
      LOOP WITH CONTROL content.
        MODULE filltab.
        MODULE set_editable.
      ENDLOOP.
      MODULE set_cursor.

    PROCESS AFTER INPUT.
      LOOP WITH CONTROL content.
        MODULE readtab.
        MODULE chang_val.
      ENDLOOP.
      MODULE get_cursor.
      MODULE user_command_0100.

    GUI Status的设置

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/10/09/3039909.aspx

    Function实现ALV Table

    Function实现ALV Table 九:
    ALV除了可以实现列表的显示之外,它还有个编辑的功能,可以对ALV显示列表的内容进行增删改等动作。
    ALV有三种方法实现,其中除了用CL_SALV_TABLE实现的ALV没有编辑的功能之外,另外两种都可以实现编辑功能,另外两种分别是用REUSE_ALV_GRID_DISPLAY和CL_GUI_ALV_GRID。
    这次我们要讲的是用REUSE_ALV_GRID_DISPLAY实现的ALV编辑功能,其实很简单,只能在把它的一个参数(SLIS_LAYOUT_ALV-EDIT = 'X')打上勾就可以了,ALV列表就全部变成可编辑的状态了。我们还可以控制ALV列表的某一列可编辑,或者某一行某一个单元格可编辑,这个功能用REUSE_ALV_GRID_DISPLAY实现不了,需要用到它的改进版本REUSE_ALV_GRID_DISPLAY_LVC,下面的例子就是用这个Function实现的

    源代码:
    TYPE-POOLS slis.

    DATA: BEGIN OF gs_style,
            style TYPE lvc_t_styl,
           END OF gs_style.
    TYPES BEGIN OF ty_spfli.
            INCLUDE STRUCTURE spfli.
            INCLUDE STRUCTURE gs_style.
    TYPES END OF ty_spfli.
    TYPES ty_tab_spfli TYPE ty_spfli OCCURS 0.
    DATA gt_spfli TYPE ty_tab_spfli.
    DATA gr_grid TYPE REF TO cl_gui_alv_grid.

    START-OF-SELECTION.
      PERFORM f_display.

    *----------------------------------------------------------------------*
    *       CLASS lcl_event_receiver DEFINITION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_event_receiver DEFINITION.
      PUBLIC SECTION.
        METHODS:
          handle_modify
            FOR EVENT data_changed_finished OF cl_gui_alv_grid
            IMPORTING e_modified et_good_cells.
    ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION

    *----------------------------------------------------------------------*
    *       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcl_event_receiver IMPLEMENTATION.
      METHOD  handle_modify.
        DATA stbl TYPE lvc_s_stbl.
        DATA lwa_cell LIKE LINE OF et_good_cells.

        stbl-row = 'X'."
        stbl-col = 'X'."

        LOOP AT et_good_cells INTO lwa_cell WHERE fieldname = 'FLTIME'.
          CALL METHOD gr_grid->refresh_table_display
            EXPORTING
              is_stable = stbl.
        ENDLOOP.
      ENDMETHOD.                    "HANDLE_MODIFY
    ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

    *&---------------------------------------------------------------------*
    *&      Form  f_getdata
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PT_SPFLI   text
    *----------------------------------------------------------------------*
    FORM f_getdata TABLES pt_spfli TYPE ty_tab_spfli.
      FIELD-SYMBOLS <fs_spfli> LIKE LINE OF pt_spfli.
      DATA: lt_style TYPE lvc_t_styl,
            lwa_style LIKE LINE OF lt_style.

      SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE pt_spfli.

      LOOP AT pt_spfli ASSIGNING <fs_spfli> WHERE countryto = 'US'.
        CLEAR lwa_style.
        REFRESH lt_style.
        lwa_style-fieldname = 'COUNTRYTO'.
        lwa_style-style = cl_gui_alv_grid=>mc_style_enabled.
        APPEND lwa_style TO lt_style.
        <fs_spfli>-style = lt_style.
      ENDLOOP.
    ENDFORM.                    "f_getdata

    *&---------------------------------------------------------------------*
    *&      Form  f_display
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM f_display.

      DATA: lt_fcat  TYPE lvc_t_fcat,
            ls_layout TYPE lvc_s_layo,
            lt_event  TYPE slis_t_event,
            ls_glay  TYPE lvc_s_glay.

      PERFORM f_getdata TABLES gt_spfli.
      PERFORM f_layout_build USING ls_layout.
      PERFORM f_fcat_build TABLES lt_fcat.
      PERFORM f_events_build TABLES lt_event.
      PERFORM f_glay USING ls_glay.

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
        EXPORTING
          i_callback_program      = sy-repid
          i_callback_user_command = 'F_USER_COMMAND'
          it_fieldcat_lvc         = lt_fcat
          it_events               = lt_event
          is_layout_lvc           = ls_layout
          i_grid_settings         = ls_glay
        TABLES
          t_outtab                = gt_spfli
        EXCEPTIONS
          program_error           = 1.
    ENDFORM.                    "f_display

    *&---------------------------------------------------------------------*
    *&      Form  f_events_build
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PT_EVENTS  text
    *----------------------------------------------------------------------*
    FORM f_events_build TABLES pt_events TYPE slis_t_event.
      DATA lwa_event LIKE LINE OF pt_events.

      lwa_event-name = 'CALLER_EXIT'.
      lwa_event-form = 'F_CALLER_EXIT_AT_START'.
      APPEND lwa_event TO pt_events.
    ENDFORM.                    "f_events_build

    *&---------------------------------------------------------------------*
    *&      Form  f_fcat_build
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PT_FCAT    text
    *----------------------------------------------------------------------*
    FORM f_fcat_build TABLES pt_fcat TYPE lvc_t_fcat.
      DATA ls_fcat LIKE LINE OF pt_fcat.

      DEFINE set_column.
        clear ls_fcat.
        ls_fcat-fieldname = &1.
        ls_fcat-scrtext_l = &2.
        ls_fcat-edit      = &3.
        ls_fcat-do_sum = &4.
        append ls_fcat to pt_fcat.
      END-OF-DEFINITION.

      set_column 'CARRID' 'Airline Code' '' ''.
      set_column 'CONNID' 'Flight Connection Number' '' ''.
      set_column 'COUNTRYFR' 'Country Key' '' ''.
      set_column 'CITYFROM' 'Departure city' '' ''.
      set_column 'AIRPFROM' 'Departure airport' '' ''.
      set_column 'COUNTRYTO' 'Country Key' '' ''.
      set_column 'CITYTO' 'Arrival city' '' ''.
      set_column 'AIRPTO' 'Destination airport' '' ''.
      set_column 'FLTIME' 'Flight time' 'X' 'X'.
      set_column 'DEPTIME' 'Departure time' '' ''.
      set_column 'ARRTIME' 'Arrival time' '' ''.
      set_column 'DISTANCE' 'Distance' 'X' ''.

    ENDFORM.                    "f_fcat_build

    *&---------------------------------------------------------------------*
    *&      Form  f_layout_build
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->PT_LAYOUT  text
    *----------------------------------------------------------------------*
    FORM f_layout_build USING p_layout TYPE lvc_s_layo.
    *  p_layout-edit = 'X'.
      p_layout-zebra = 'X'.
      p_layout-stylefname = 'STYLE'.
    ENDFORM.                    "f_layout_build

    *&---------------------------------------------------------------------*
    *&      Form  f_user_command
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->UCOMM        text
    *      -->RS_SELFIELD  text
    *----------------------------------------------------------------------*
    FORM f_user_command USING ucomm LIKE sy-ucomm
                              rs_selfield TYPE slis_selfield.
    *  rs_selfield-refresh = 'X'.
      CASE ucomm.
        WHEN '&DATA_SAVE'.
    *   do sth for save.
        WHEN ''.
      ENDCASE.
      CLEAR ucomm.
    ENDFORM.                    "f_user_command

    *&---------------------------------------------------------------------*
    *&      Form  F_CALLER_EXIT_AT_START
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->RS_DATA    text
    *----------------------------------------------------------------------*
    FORM f_caller_exit_at_start USING rs_data TYPE slis_data_caller_exit.
      DATA lr_grid TYPE REF TO cl_gui_alv_grid.
      DATA lr_event TYPE REF TO lcl_event_receiver.
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = gr_grid.

    *  CALL METHOD gr_grid->register_edit_event
    *    EXPORTING
    *      i_event_id = cl_gui_alv_grid=>MC_EVT_MODIFIED
    *    EXCEPTIONS
    *      error      = 1
    *      OTHERS     = 2.

      CREATE OBJECT lr_event.
      SET HANDLER lr_event->handle_modify FOR gr_grid.
    ENDFORM.                    "F_CALLER_EXIT_AT_START

    *&---------------------------------------------------------------------*
    *&      Form  f_glay
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->P_GLAY     text
    *----------------------------------------------------------------------*
    FORM f_glay USING p_glay TYPE lvc_s_glay.
      p_glay-edt_cll_cb = 'X'.
    ENDFORM.                    "f_glay

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/10/10/3047472.aspx

    如何从SAP中连接其他数据库

    如何从SAP中连接其他数据库

    1.       工作环境需求
        A. The operating system user <sid>adm must be able to log on to the secondary database.
        B. The R/3 table DBCON must be maintained.
        C. The correct database library 'dboraslib.<ext>' must exist in the kernel directory.
    Connect  to SQL Server database Prerequisite: At least one Windows application server must be available on the R/3 system and the DBSL dynamic library (DLL) dbmssslib.dll must be installed on this server. This dll can be downloaded from the SAP Service Marketplace.
    dbmssslib.dll
    2.       配置连接信息
    配置TCODE: dbco
    任何配置信息都存储在DBCON表中.
    配置示例:
    A.      访问MSSQL的配置示例(参见SAP Notes 178949)
    CON_NAME: <my_conn_name>
    DBMS: MSS
    USER_NAME: <db_user>
    PASSWORD:  <password>
    CON_ENV: MSSQL_SERVER=<server_name> MSSQL_DBNAME=<db_name>
       db_user could be sapr3 for example if the server is running R/3.  The password field may be blocked from view by asterisks in sm30. USER_NAME can be left blank in order to use integrated security (4.6d kernel and later).  In that case make sure that the OS User running R/3 has the required privilege on the remote server.  A dummy password must be entered in sm30, it will not be used when the user name is blank.

    Specifying the server name
               The server name is simply the name of the SQL Server or named instance i.e. the hostname (for a default instance), or <host>\<instname>
    Starting with release 6.40 however there are some special considerations that should be taken into account.  When running with kernel release 6.40 or later, the R/3 system will prepend a protocol specifier to the server name.  Example:
       1. For a server running on the same server:
                np:<servername>
      2. For a remote server:
                tcp:<servername>
    This forces the connection to be made with a named pipes and tcp/ip protocols respectively.
    When specifying the server name you can override this by setting your own protocol (tcp: or np:), or you can make R/3 avoid setting any prefix by using simply :<servername> - a colon in front of the server name.

    B.      访问ORACLE的配置示例()
       Connection name        logical name of the connection
         DBMS                   ORA
         User name              Oracle users
         DB password            password for the above-mentioned Oracle user
         Conn.info              TNS alias
         Permanent              Usually should not be set for a secondary connection.
    3.       程序中如何使用
    例程一
    report zdbcon .
    data: dbn(128).
    EXEC SQL.
    CONNECT TO 'DAN1'
    ENDEXEC.
    EXEC SQL.
    SET CONNECTION 'DAN1'
    ENDEXEC.
    EXEC SQL.
    SELECT db_name() INTO :DBN FROM SVERS
    ENDEXEC.
    write: / 'current database name', dbn.
    DAN1在DBCON表中配置
    CON NAME DAN1
    DBMS MSS
    USER NAME iis_log
    PASSWORD CON ENV
    MSSQL_SERVER=tcp:###.###.###.### MSSQL_DBNAME=iislog

    例程二
    Here is an example for how to connect to another server with CON_NAME=BSK.  The example assumes BSK is running R/3:

    EXEC SQL.
      CONNECT TO 'BSK'
    ENDEXEC.
    EXEC SQL.
      SET CONNECTION 'BSK'
    ENDEXEC.
    EXEC SQL.
      SELECT db_name() INTO :DBN FROM SVERS
    ENDEXEC.
    WRITE: / 'current database name', DBN.
    EXEC SQL.
      SET CONNECTION DEFAULT
    ENDEXEC.
    EXEC SQL.
      SELECT db_name() INTO :DBN FROM SVERS
    ENDEXEC.
    WRITE: / 'current database name', DBN.

    notes: https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=178949&nlang=EN&smpsrv=https%3a%2f%2fwebsmp103%2esap-ag%2ede

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/10/22/3122591.aspx

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/10/22/3122591.aspx

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/10/22/3122591.aspx

    BOM Copy

    SAP BOM的操作 收藏

    这个程序是根据条件把某些工厂的某些物料的某些BOM,Copy到别外的工厂,当目标工厂存在要复制的BOM的时候,用源BOM代替目标BOM,当目标BOM不存在的时候,就根据源BOM创建目标BOM。
    这个程序用到了BOM的一些常用Function和BAPI
    BAPI_MATERIAL_BOM_GROUP_CREATE
    CSAP_MAT_BOM_READ
    CSAP_MAT_BOM_OPEN
    CSAP_BOM_ITEM_MAINTAIN
    CSAP_MAT_BOM_CLOSE
    REPORT  zppinf1001.
    INCLUDE <icon>.
    *----------------------------------------------------------------------*
    *       变量定义
    *----------------------------------------------------------------------*
    TABLES mast.
    TYPES: ty_tab_matnr TYPE mara-matnr OCCURS 0,
           ty_tab_plant TYPE marc-werks OCCURS 0,
           ty_tab_stpo2 TYPE stpo_api02 OCCURS 0,
           ty_tab_stko2 TYPE stko_api02 OCCURS 0,
           ty_tab_s_mat TYPE s_matnr OCCURS 0.
    TYPES: BEGIN OF ty_mast,
            matnr TYPE mast-matnr,
            werks TYPE mast-werks,
            stlan TYPE mast-stlan,
            stlnr TYPE mast-stlnr,
            stlal TYPE mast-stlal,
           END OF ty_mast.
    TYPES: BEGIN OF ty_material,
            matnr TYPE mara-matnr,
            werks TYPE marc-werks,
           END OF ty_material.
    TYPES ty_tab_mast TYPE ty_mast OCCURS 0.
    TYPES ty_tab_messages TYPE messages OCCURS 0.
    TYPES ty_tab_material TYPE ty_material OCCURS 0.
    DATA: g_valid_from TYPE csap_mbom-datuv.
    *----------------------------------------------------------------------*
    *       选择屏幕设计
    *----------------------------------------------------------------------*
    SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-000.
    SELECT-OPTIONS: s_matnr  FOR mast-matnr,
                    s_stlan  FOR mast-stlan NO-EXTENSION NO INTERVALS OBLIGATORY,
                    s_stlal  FOR mast-stlal NO-EXTENSION NO INTERVALS OBLIGATORY,
                    s_source FOR mast-werks NO-EXTENSION NO INTERVALS OBLIGATORY.
    SELECTION-SCREEN SKIP.
    SELECT-OPTIONS: s_target FOR mast-werks,
                    s_stlan2 FOR mast-stlan NO-EXTENSION NO INTERVALS OBLIGATORY,
                    s_stlal2 FOR mast-stlal NO-EXTENSION NO INTERVALS OBLIGATORY.
    PARAMETERS p_exist TYPE c AS CHECKBOX.
    SELECTION-SCREEN END OF BLOCK blk.
    *----------------------------------------------------------------------*
    *       CLASS lcl_bom DEFINITION
    *----------------------------------------------------------------------*
    *       BOM的处理类定义
    *----------------------------------------------------------------------*
    CLASS lcl_bom DEFINITION FINAL.
      PUBLIC SECTION.
        METHODS write_header_text  "输出结果列表的选择条件的相关信息
          IMPORTING
            pt_plant TYPE ty_tab_plant.
        METHODS check_exist_bom     "检验指定条件的物料是否存在BOM
          IMPORTING
            p_material    TYPE csap_mbom-matnr  "料号
            p_plant       TYPE csap_mbom-werks  "工厂
            p_bom_usage   TYPE csap_mbom-stlan  "BOM Usage
            p_alternative TYPE csap_mbom-stlal  "Alternative BOM
            pt_target     TYPE ty_tab_mast
          RETURNING
            value(p_flag) TYPE char01.        "检查结果返回标识,X代表存在
        METHODS get_data                      "根据条件查询数据
          EXPORTING
            value(pt_source) TYPE ty_tab_mast
            value(pt_target) TYPE ty_tab_mast.
        METHODS get_target_plant
          RETURNING
            value(pt_plant) TYPE ty_tab_plant.
        METHODS check_matnr                    "检查指定的物料是否在指定的工厂存在
          IMPORTING
            p_matnr       TYPE mast-matnr
            p_plant       TYPE mast-werks
          RETURNING
            value(p_flag) TYPE char01.
        METHODS check_component                "检查指定的组件是否在指定的工厂存在
          IMPORTING
            p_matnr       TYPE mast-matnr
            p_plant       TYPE mast-werks
            pt_stpo       TYPE ty_tab_stpo2
          RETURNING
            value(p_flag) TYPE char01.
        METHODS set_log.                        "设置Log,可以事务码SLG1查看
        METHODS get_current_log                 "取得当前Log信息
          RETURNING
            value(pt_messages) TYPE ty_tab_messages.
        METHODS read_bom                        "查看BOM信息
          IMPORTING
            p_material     TYPE csap_mbom-matnr
            p_plant        TYPE csap_mbom-werks
            p_bom_usage    TYPE csap_mbom-stlan
            p_alternative  TYPE csap_mbom-stlal
            p_valid_from   TYPE csap_mbom-datuv
          EXPORTING
            value(pt_stpo) TYPE ty_tab_stpo2
            value(pt_stko) TYPE ty_tab_stko2
            value(p_flag)  TYPE char01.
        METHODS create_bom                      "创建BOM
            IMPORTING
              p_material    TYPE csap_mbom-matnr
              p_plant       TYPE csap_mbom-werks
              pt_stpo       TYPE ty_tab_stpo2
              pt_stko       TYPE ty_tab_stko2
            RETURNING
              value(p_flag) TYPE char01.
        METHODS maintain_bom                      "维护BOM
            IMPORTING
              p_material    TYPE csap_mbom-matnr
              p_plant       TYPE csap_mbom-werks
              p_usage       TYPE csap_mbom-stlan
              p_alternative TYPE csap_mbom-stlal
              p_valid       TYPE csap_mbom-datuv
              pt_stpo       TYPE ty_tab_stpo2
              pt_stko       TYPE ty_tab_stko2
            RETURNING
              value(p_flag) TYPE char01.
        METHODS constructor.                      "构造方法
        "类的全局变量
        DATA: BEGIN OF lwa_mat_wer,
                matnr TYPE mara-matnr,
                werks TYPE marc-werks,
              END OF lwa_mat_wer.
        DATA: lt_mat_wer2  LIKE TABLE OF lwa_mat_wer.
      PRIVATE SECTION.
        DATA: lt_mat_wer  LIKE TABLE OF lwa_mat_wer.
    ENDCLASS.                    "lcl_bom DEFINITION
    *----------------------------------------------------------------------*
    *       CLASS lcl_bom IMPLEMENTATION
    *----------------------------------------------------------------------*
    *       BOM的处理类实现
    *----------------------------------------------------------------------*
    CLASS lcl_bom IMPLEMENTATION.
    *输出结果列表的选择条件的相关信息
      METHOD write_header_text.
        DATA: l_temp TYPE i VALUE 1,
              l_plant TYPE marc-werks.
        FORMAT COLOR 1 ON.
        IF s_matnr IS INITIAL.
          WRITE: 'BOM Material: All'.
        ELSEIF s_matnr-low IS NOT INITIAL AND s_matnr-high IS NOT INITIAL.
          WRITE: / 'BOM Material:',s_matnr-low,'To',s_matnr-high.
        ELSEIF s_matnr-high IS INITIAL.
          WRITE: / 'BOM Material:',s_matnr-low.
        ENDIF.
        WRITE: / 'Source Plant:',s_source-low.
        WRITE: / 'BOM Usage:',s_stlan-low.
        WRITE: / 'Alternative BOM:',s_stlal-low.
        SKIP.
        WRITE / 'Target Plant:'.
        LOOP AT pt_plant INTO l_plant.
          IF l_temp > 15.
            WRITE /16 l_plant.
            l_temp = 2.
            CONTINUE.
          ENDIF.
          WRITE l_plant.
          l_temp = l_temp + 1.
        ENDLOOP.
        WRITE: / 'BOM Usage:',s_stlan2-low.
        WRITE: / 'Alternative BOM:',s_stlal2-low.
        IF p_exist = 'X'.
          WRITE / 'Skip if target plant exist'.
        ENDIF.
        FORMAT COLOR OFF.
        ULINE.
      ENDMETHOD.                    "wwrite_header_text
    *检验指定条件的物料是否存在BOM
      METHOD check_exist_bom.
        DATA l_alternative LIKE p_alternative.
        READ TABLE pt_target WITH KEY matnr = p_material
                                      werks = p_plant
                                      stlan = p_bom_usage
                                      stlal = p_alternative
                             TRANSPORTING NO FIELDS.
        IF sy-subrc = 0.
          p_flag = 'X'.
        ENDIF.
      ENDMETHOD.                    "check_exist_bom
    *根据条件取得所有要复制到其他工厂的BOM的物料
      METHOD get_data.
        "取得表MAST的数据
        SELECT DISTINCT matnr
                        werks
                        stlan
                        stlnr
                        stlal
        INTO TABLE pt_source FROM mast
        WHERE matnr IN s_matnr.
        pt_target = pt_source.
        DELETE pt_source WHERE NOT ( werks IN s_source AND stlan IN s_stlan AND stlal IN s_stlal ).
        DELETE pt_target WHERE NOT ( werks IN s_target AND stlan IN s_stlan2 AND stlal IN s_stlal2 ).
      ENDMETHOD.                    "get_data
    *根据条件取得目标工厂
      METHOD get_target_plant.
        SELECT werks INTO TABLE pt_plant FROM t001w
                     WHERE werks IN s_target.
      ENDMETHOD.                    "get_target_plant
    *判断指定的料号在指定的工厂是否存在
      METHOD check_matnr.
        "根据条件取得物料和工厂的内表
        IF lt_mat_wer IS INITIAL.
          SELECT mara~matnr
                 marc~werks
          INTO TABLE lt_mat_wer
          FROM mara
          INNER JOIN marc ON mara~matnr = marc~matnr
          WHERE mara~matnr IN s_matnr
            AND marc~werks IN s_target.
        ENDIF.
        "查询内表,判断指定料号是否在指定的工厂里
        READ TABLE lt_mat_wer WITH KEY matnr = p_matnr
                                       werks = p_plant
                              TRANSPORTING NO FIELDS.
        "存在
        IF sy-subrc = 0.
          p_flag = 'X'.
        ENDIF.
      ENDMETHOD.                    "check_matnr
    *检查指定的组件是否在指定的工厂存在
      METHOD check_component.
        DATA: l_matnr TYPE mara-matnr,
              lt_matnr LIKE RANGE OF l_matnr,
              lwa_matnr LIKE LINE OF lt_matnr,
              lwa_stpo LIKE LINE OF pt_stpo.
        "组织选择内表
        LOOP AT pt_stpo INTO lwa_stpo.
          lwa_matnr-sign   = 'I'.
          lwa_matnr-option = 'EQ'.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = lwa_stpo-component
            IMPORTING
              output = lwa_stpo-component.
          lwa_matnr-low    = lwa_stpo-component.
          lwa_matnr-high   = ''.
          APPEND lwa_matnr TO lt_matnr.
        ENDLOOP.
        "根据条件取得物料和工厂的内表
        IF lt_mat_wer2 IS INITIAL.
          SELECT mara~matnr
                 marc~werks
          INTO TABLE lt_mat_wer2
          FROM mara
          INNER JOIN marc ON mara~matnr = marc~matnr
          WHERE mara~matnr IN lt_matnr
            AND marc~werks = p_plant.
        ENDIF.
        "查询内表,判断指定料号是否在指定的工厂里
        READ TABLE lt_mat_wer2 WITH KEY matnr = p_matnr
                               TRANSPORTING NO FIELDS.
        "存在
        IF sy-subrc = 0.
          p_flag = 'X'.
        ENDIF.
      ENDMETHOD.                    "check_component
    *设置Log,可以用事务码SLG1查看
      METHOD set_log.
        CALL FUNCTION 'CALO_INIT_API'
          EXCEPTIONS
            log_object_not_found     = 1
            log_sub_object_not_found = 2
            other_error              = 3
            OTHERS                   = 4.
      ENDMETHOD.                    "set_log
    *取得当前Log信息
      METHOD get_current_log.
        CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
          TABLES
            messages_and_parameters = pt_messages
          EXCEPTIONS
            warning                 = 1
            error                   = 2
            OTHERS                  = 3.
      ENDMETHOD.                    "get_current_log
    *读取指定的BOM
      METHOD read_bom.
        "调用FM查看指定的物料的BOM
        CALL FUNCTION 'CSAP_MAT_BOM_READ'
          EXPORTING
            material    = p_material
            plant       = p_plant
            bom_usage   = p_bom_usage
            alternative = p_alternative
            valid_from  = p_valid_from
          TABLES
            t_stpo      = pt_stpo
            t_stko      = pt_stko
          EXCEPTIONS
            error       = 1.
        "判断是否查看bom数据成功
        IF sy-subrc = 0.
          p_flag = 'X'.
        ELSE.
          p_flag = ''.
        ENDIF.
      ENDMETHOD.                    "read_bom
    *创建BOM
      METHOD create_bom.
        DATA: lwa_bomgroup TYPE bapi1080_bgr_c,
              lt_bomgroup  LIKE TABLE OF lwa_bomgroup,
              lwa_variant  TYPE bapi1080_bom_c,
              lt_variant   LIKE TABLE OF lwa_variant,
              lwa_items    TYPE bapi1080_itm_c,
              lt_items     LIKE TABLE OF lwa_items,
              lwa_mbm      TYPE bapi1080_mbm_c,
              lt_mbm       LIKE TABLE OF lwa_mbm,
              lwa_itemass  TYPE bapi1080_rel_itm_bom_c,
              lt_itemass   LIKE TABLE OF lwa_itemass,
              lwa_return   TYPE bapiret2,
              lt_return    LIKE TABLE OF lwa_return.
        DATA: l_alternative TYPE stpo_api02-bom_alt,
              l_component   TYPE stpo_api02-component,
              l_error       TYPE string.
        CONSTANTS: bom_group_identification TYPE bapi1080_bgr_c-bom_group_identification
                                            VALUE 'BAPI_SMP_COL4',
                   object_id TYPE bapi1080_bgr_c-object_id VALUE 'SIMPLE1'.
        FIELD-SYMBOLS: <fs_stko> LIKE LINE OF pt_stko,
                       <fs_stpo> LIKE LINE OF pt_stpo.
        "循环内表pt_stpo
        LOOP AT pt_stpo ASSIGNING <fs_stpo>.
          "在Component前面添零
          CLEAR l_component.
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = <fs_stpo>-component
            IMPORTING
              output = l_component.
          "添加BOM Items
          CLEAR lwa_items.
          lwa_items-bom_group_identification = bom_group_identification.
          lwa_items-object_type = 'ITM'.
          lwa_items-object_id = object_id.
          lwa_items-item_no = <fs_stpo>-item_no.
          lwa_items-item_cat = <fs_stpo>-item_categ.
          lwa_items-component = l_component.
          lwa_items-comp_qty = <fs_stpo>-comp_qty.
          lwa_items-comp_unit = <fs_stpo>-comp_unit.
          lwa_items-valid_from_date = sy-datum.
          APPEND lwa_items TO lt_items.
        ENDLOOP.
        "循环内表
        LOOP AT pt_stko ASSIGNING <fs_stko>.
          "添加BOM Group信息
          CLEAR lwa_bomgroup.
          lwa_bomgroup-bom_group_identification = bom_group_identification.
          lwa_bomgroup-object_type = 'BGR'.
          lwa_bomgroup-object_id = object_id.
          lwa_bomgroup-bom_usage = s_stlan2-low.
          lwa_bomgroup-bom_group = <fs_stko>-bom_group.
          lwa_bomgroup-created_in_plant = p_plant.
          lwa_bomgroup-auth_group = <fs_stko>-auth_group.
          lwa_bomgroup-technical_type = ' '.
          lwa_bomgroup-ltxt_lang = sy-langu.
          lwa_bomgroup-bom_text = <fs_stko>-bom_text.
          APPEND lwa_bomgroup TO lt_bomgroup.
          "添加Variant信息
          CLEAR lwa_variant.
          lwa_variant-bom_group_identification = bom_group_identification.
          lwa_variant-object_type = 'BOM'.
          lwa_variant-object_id = object_id.
          lwa_variant-alternative_bom = s_stlal2-low.
          lwa_variant-bom_status = <fs_stko>-bom_status.
          lwa_variant-deletion_ind = <fs_stko>-delete_ind.
          lwa_variant-base_qty = <fs_stko>-base_quan.
          lwa_variant-base_unit = <fs_stko>-base_unit.
          lwa_variant-lab_design = <fs_stko>-laboratory.
          lwa_variant-ltxt_lang = sy-langu.
          lwa_variant-alt_text = <fs_stko>-alt_text.
          lwa_variant-valid_from_date = sy-datum.
          lwa_variant-change_no = <fs_stko>-chg_no.
          lwa_variant-function = 'NEW'.
          APPEND lwa_variant TO lt_variant.
        ENDLOOP.
        CLEAR lwa_mbm.
        lwa_mbm-bom_group_identification = bom_group_identification.
        lwa_mbm-material = p_material.
        lwa_mbm-bom_usage = s_stlan2-low.
        lwa_mbm-plant = p_plant.
        lwa_mbm-alternative_bom = s_stlal2-low.
        APPEND lwa_mbm TO lt_mbm.
        CLEAR lwa_itemass.
        lwa_itemass-bom_group_identification = bom_group_identification.
        lwa_itemass-sub_object_type = 'ITM'.
        lwa_itemass-sub_object_id = object_id.
        lwa_itemass-super_object_type = 'BOM'.
        lwa_itemass-super_object_id = object_id.
        lwa_itemass-valid_from_date = sy-datum.
        lwa_itemass-function = 'NEW'.
        APPEND lwa_itemass TO lt_itemass.
        "调用BAPI创建BOM
        CALL FUNCTION 'BAPI_MATERIAL_BOM_GROUP_CREATE'
          EXPORTING
            all_error         = 'X'
          TABLES
            bomgroup          = lt_bomgroup
            variants          = lt_variant
            items             = lt_items
            materialrelations = lt_mbm
            itemassignments   = lt_itemass
            return            = lt_return.
        p_flag = 'X'.
        LOOP AT lt_return INTO lwa_return WHERE type = 'A' OR type = 'E'.
          p_flag = ''.
          l_error = lwa_return-message.
          EXPORT p1 = l_error TO MEMORY ID 'CREATE'.
          EXIT.
        ENDLOOP.
        IF p_flag = 'X'.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.
        FREE: lt_bomgroup,
              lt_variant,
              lt_items,
              lt_mbm,
              lt_itemass,
              lt_return.
      ENDMETHOD.                    "create_bom
    *维护BOM
      METHOD maintain_bom.
        DATA: lwa_stpo      LIKE LINE OF pt_stpo,
              l_material    LIKE p_material,
              lt_stpo2      TYPE ty_tab_stpo2,
              lt_stpo2_temp TYPE ty_tab_stpo2,
              lt_messages   TYPE ty_tab_messages,
              lwa_messages  LIKE LINE OF lt_messages,
              l_error       TYPE string.
        FIELD-SYMBOLS <fs_stpo> LIKE LINE OF pt_stpo.
        "补0
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = p_material
          IMPORTING
            output = l_material.
        p_flag = 'X'.
        "Log
        CALL METHOD me->set_log.
        "打开BOM维护
        CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
          EXPORTING
            material    = l_material
            plant       = p_plant
            bom_usage   = p_usage
            alternative = p_alternative
            valid_from  = p_valid
          TABLES
            t_stpo      = lt_stpo2
          EXCEPTIONS
            error       = 1.
        IF sy-subrc = 0.
          "先把所有目标工厂的BOM数据打上删除标记
          lwa_stpo-fldelete = 'X'.
          MODIFY lt_stpo2 FROM lwa_stpo TRANSPORTING fldelete WHERE fldelete <> 'X'.
          LOOP AT pt_stpo INTO lwa_stpo.
            READ TABLE lt_stpo2 ASSIGNING <fs_stpo> WITH KEY component = lwa_stpo-component.
            IF sy-subrc = 0.
              "找到则是需要修改的
              lwa_stpo-itm_ident  = <fs_stpo>-itm_ident.
              lwa_stpo-bom_no     = <fs_stpo>-bom_no.
              lwa_stpo-item_node  = <fs_stpo>-item_node.
              lwa_stpo-item_count = <fs_stpo>-item_count.
              lwa_stpo-valid_from = p_valid.
              APPEND lwa_stpo TO lt_stpo2_temp.
              "删除lt_stpo3里修改的记录,剩下的就是删除的
              DELETE lt_stpo2 WHERE itm_ident = <fs_stpo>-itm_ident.
            ELSE.
              "找不到的则是新增的
              lwa_stpo-itm_ident = ''.
              lwa_stpo-bom_no = ''.
              lwa_stpo-item_node = ''.
              lwa_stpo-item_count = ''.
              lwa_stpo-valid_from = p_valid.
              APPEND lwa_stpo TO lt_stpo2_temp.
            ENDIF.
          ENDLOOP.
          "把lt_stpo2剩下的,即是删除的添加内表lt_stpo2_temp
          APPEND LINES OF lt_stpo2 TO lt_stpo2_temp.
        ELSE.
          p_flag = ''.
          lt_messages = me->get_current_log( ).
          LOOP AT lt_messages INTO lwa_messages WHERE msg_type = 'E'
                                                OR msg_type = 'A'.
            l_error = lwa_messages-msg_txt.
            EXPORT p1 = l_error TO MEMORY ID 'MAINTAIN'.
            EXIT.
          ENDLOOP.
          EXIT.
        ENDIF.
        "循环处理BOM Item
        LOOP AT lt_stpo2_temp INTO lwa_stpo.
          "补零
          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = lwa_stpo-component
            IMPORTING
              output = lwa_stpo-component.
          CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
            EXPORTING
              i_stpo = lwa_stpo
            EXCEPTIONS
              error  = 1.
          IF sy-subrc <> 0.
            p_flag = ''.
            lt_messages = me->get_current_log( ).
            LOOP AT lt_messages INTO lwa_messages WHERE msg_type = 'E'
                                                  OR msg_type = 'A'.
              EXPORT p1 = lwa_messages-msg_txt TO MEMORY ID 'MAINTAIN'.
              EXIT.
            ENDLOOP.
            EXIT.
          ENDIF.
        ENDLOOP.
        "关闭BOM维护
        CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
          EXCEPTIONS
            error = 1.
        IF sy-subrc <> 0.
          p_flag = ''.
          EXIT.
        ENDIF.
        FREE: lt_stpo2,
              lt_stpo2_temp.
      ENDMETHOD.                    "maintain_bom
    *构造方法
      METHOD constructor.
        "格式化有限日期
        CONCATENATE sy-datum+6(2)
                    sy-datum+4(2)
                    sy-datum+0(4)
        INTO g_valid_from SEPARATED BY '.'.
      ENDMETHOD.                    "contructor
    ENDCLASS.                    "lcl_bom IMPLEMENTATION
    *&---------------------------------------------------------------------*
    *&      Form  f_set_clock
    *&---------------------------------------------------------------------*
    *       程序处理时状态栏显示的小时钟
    *----------------------------------------------------------------------*
    *      -->P_PERCENTAGE  时钟显示的百分比
    *----------------------------------------------------------------------*
    FORM f_set_clock USING p_percentage.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          percentage = p_percentage.
    ENDFORM.                    "f_set_clock
    *&---------------------------------------------------------------------*
    *&      Form  f_main
    *&---------------------------------------------------------------------*
    *       子程序。整合所有方法,执行并输出结果
    *----------------------------------------------------------------------*
    FORM f_main.
      DATA: lt_source TYPE ty_tab_mast,
            lwa_source LIKE LINE OF lt_source,
            lt_target  TYPE ty_tab_mast,
            lwa_target LIKE LINE OF lt_target,
            lt_plant   TYPE ty_tab_plant,
            lt_stpo2   TYPE ty_tab_stpo2,
            lwa_stpo2  LIKE LINE OF lt_stpo2,
            lt_stko2   TYPE ty_tab_stko2.
      DATA: l_flag,
            l_error  TYPE string,
            l_count  TYPE string,
            l_count1 TYPE i,    "成功的记录数
            l_count2 TYPE i,    "失败的记录数
            l_werks  LIKE LINE OF lt_plant.
      DATA: lr_bom   TYPE REF TO lcl_bom.
    *创建类LCL_BOM对象
      CREATE OBJECT lr_bom.
    *筛选选择的物料
      CALL METHOD lr_bom->get_data
        IMPORTING
          pt_source = lt_source
          pt_target = lt_target.
      PERFORM f_set_clock USING 10.
    *取得目标工厂内表
      lt_plant = lr_bom->get_target_plant( ).
      IF lt_source IS INITIAL
        OR lt_plant IS INITIAL.
        MESSAGE s003(zmm).
        EXIT.
      ENDIF.
      PERFORM f_set_clock USING 50.
    *输出选择条件文本
      lr_bom->write_header_text( lt_plant ).
      SORT lt_source BY werks.
      "按工厂处理BOM
      LOOP AT lt_plant INTO l_werks.
        CLEAR: l_count1,l_count2.
        "如果源BOM和目标BOM相同,跳过
        IF s_source-low = l_werks
          AND s_stlan-low = s_stlan2-low
          AND s_stlal-low = s_stlal2-low.
          CONTINUE.
        ENDIF.
        WRITE:/ 'Start plant',l_werks.
        "循环源物料内表,处理指定工厂的物料
        LOOP AT lt_source INTO lwa_source.
          "查看BOM数据
          CALL METHOD lr_bom->read_bom
            EXPORTING
              p_material    = lwa_source-matnr
              p_plant       = s_source-low
              p_bom_usage   = s_stlan-low
              p_alternative = s_stlal-low
              p_valid_from  = g_valid_from
            IMPORTING
              pt_stpo       = lt_stpo2
              pt_stko       = lt_stko2
              p_flag        = l_flag.
          "查得数据成功
          IF sy-subrc = 0 AND l_flag = 'X'.
            "如果BOM的Item为空
            IF lt_stpo2 IS INITIAL.
              FORMAT COLOR 6 ON.
              WRITE: /3 icon_cancel AS ICON,
                        'Material',
                        lwa_source-matnr+10(8),
                        'BOM Usage',
                        s_stlan-low,
                        'not found in source plant',
                        s_source-low.
              FORMAT COLOR 6 OFF.
              l_count2 = l_count2 + 1.
              CONTINUE.
            ENDIF.
            "判断当前物料是否在目标工厂中存在
            l_flag = lr_bom->check_matnr(
              p_matnr = lwa_source-matnr
              p_plant = l_werks
            ).
            "物料不在目标工厂就跳过
            IF l_flag <> 'X'.
              WRITE: /3 icon_skip AS ICON,
                        'Material',
                        lwa_source-matnr+10(8),
                        'not found in target plant',
                        l_werks.
              l_count2 = l_count2 + 1.
              CONTINUE.
            ENDIF.
            " 判断组件是否在目标工厂中存在
            CLEAR lr_bom->lt_mat_wer2.
            LOOP AT lt_stpo2 INTO lwa_stpo2.
              "补零
              CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
                EXPORTING
                  input  = lwa_stpo2-component
                IMPORTING
                  output = lwa_stpo2-component.
              l_flag = lr_bom->check_component(
                p_matnr = lwa_stpo2-component
                p_plant = l_werks
                pt_stpo = lt_stpo2
              ).
              IF l_flag <> 'X'.
                WRITE: /3 icon_skip AS ICON,
                          'Component',
                          lwa_stpo2-component+10(8),
                          'not found in target plant',
                          l_werks.
                l_count2 = l_count2 + 1.
                EXIT.
              ENDIF.
            ENDLOOP.
            "如果组件在目标工厂不存在,跳过
            CHECK l_flag = 'X'.
            "判断目标BOM是否存在
            l_flag = lr_bom->check_exist_bom(
              p_material    = lwa_source-matnr
              p_plant       = l_werks
              p_bom_usage   = s_stlan2-low
              p_alternative = s_stlal2-low
              pt_target     = lt_target
            ).
            "目标BOM存在
            IF l_flag = 'X'.
              "存在是否跳过
              IF p_exist <> 'X'.
                "维护BOM
                l_flag = lr_bom->maintain_bom(
                    p_material = lwa_source-matnr
                    p_plant = l_werks
                    p_usage = s_stlan2-low
                    p_alternative = s_stlal2-low
                    p_valid = g_valid_from
                    pt_stpo = lt_stpo2
                    pt_stko = lt_stko2
                 ).
                IF l_flag = 'X'.
    *              WRITE: /3 icon_okay AS ICON,
    *                        'Material',
    *                        lwa_source-matnr+10(8),
    *                        'copy success to plant',
    *                        l_werks.
                  l_count1 = l_count1 + 1.
                ELSE.
                  "从内存取得错误文本
                  IMPORT p1 = l_error FROM MEMORY ID 'MAINTAIN'.
                  IF sy-subrc = 0.
                    FORMAT COLOR 6 ON.
                    WRITE: /3 icon_cancel AS ICON,l_error.
                    FORMAT COLOR 6 OFF.
                    FREE MEMORY ID 'MAINTIAN'.
                    l_count2 = l_count2 + 1.
                    CONTINUE.
                  ENDIF.
                ENDIF.
              ELSE.
                WRITE: /3 icon_skip AS ICON,
                          'Material',
                          lwa_source-matnr+10(8),
                          'BOM exists and skip copy to plant',
                          l_werks.
                l_count2 = l_count2 + 1.
              ENDIF.
            ELSE.
              "BOM不存在,创建BOM
              l_flag = lr_bom->create_bom(
                  p_material = lwa_source-matnr
                  p_plant = l_werks
                  pt_stpo = lt_stpo2
                  pt_stko = lt_stko2
              ).
              IF l_flag = 'X'.
    *            "输出成功创建BOM的信息
    *            WRITE: /3 icon_okay AS ICON,
    *                      'Material',
    *                      lwa_source-matnr+10(8),
    *                      'copy success to plant',
    *                      l_werks.
                l_count1 = l_count1 + 1.
              ELSE.
                IMPORT p1 = l_error FROM MEMORY ID 'CREATE'.
                IF sy-subrc = 0.
                  FORMAT COLOR 6 ON.
                  WRITE: /3 icon_cancel AS ICON,
                            l_error.
                  FREE MEMORY ID 'CREATE'.
                  l_count2 = l_count2 + 1.
                ENDIF.
                FORMAT COLOR 6 OFF.
                CONTINUE.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDLOOP.
        l_count = l_count1.
        WRITE:/ l_count,'material copied success'.
        l_count = l_count2.
        WRITE:/ l_count,'material copied fail'.
        SKIP.
      ENDLOOP.
      WRITE / '-- End of Report --'.
      FREE: lt_source,
            lt_target,
            lt_plant,
            lt_stpo2,
            lt_stko2.
    ENDFORM.                    "f_main
    *----------------------------------------------------------------------*
    *       执行事件
    *----------------------------------------------------------------------*
    START-OF-SELECTION.

    设置SAP GUI Status的按钮为灰色

    设置SAP GUI Status的按钮为灰色

    一,首先设置按钮的属性为‘Display All’

       具体路径为Goto-Attributes-Pushbutton Assignment

    二,在代码SET PF-STATUS排除此按钮。

       SET PF-STATUS '111' EXCLUDING 'TEST' .

    具体效果

    OO实现ALV TABLE 二:ALV显示的三种形式

    OO实现ALV TABLE 二:ALV显示的三种形式
    一般的ALV有三种显示形式,分别为

    一、普通的List

    二、全屏的Grid

    三、在自定义屏幕的显示的Grid

    跟以往实现这三种ALV显示方式相比,以往的三种显示方式分别是调用不同的Function和Class,实现方式复杂。现在这三种显示方式可以通过一个类(CL_SALV_TABLE)来实现,而且通过这个类和它的子类可以更加容易的实现ALV的功能,比如:排序,总计,过滤,页眉页脚,单击双击事件等。

    下面让我们一步一步地来实现这三种显示形式。

    1.首先我们先创建选择屏幕,屏幕有三个选项,三个选项分别为三种显示方式。

    SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.

      PARAMETERS: p_full RADIOBUTTON GROUP rg,

                  p_list RADIOBUTTON GROUP rg,

                  p_grid RADIOBUTTON GROUP rg.

    SELECTION-SCREEN END OF BLOCK blk.

    2取得要显示的数据。

    SELECT * INTO TABLE lt_tab FROM spfli

    3.判断选择屏幕的选项创建不同的实例。

       CASE 'X'.

          WHEN p_full.             

            me->alv_full( lt_tab ).

          WHEN p_list.

            me->alv_list( lt_tab ).

          WHEN p_grid.

            me->alv_grid( lt_tab ).

    ENDCASE.

    4.当用户选择第一个选项,列表输出为全屏的网格列表,执行方法alv_full( )。

    METHOD alv_full.

        "创建实例

        TRY.

            cl_salv_table=>factory(

              IMPORTING

                r_salv_table = gr_table

              CHANGING

                t_table      = lt_tab

            ).

          CATCH cx_salv_msg.

        ENDTRY.

        "显示列表

        gr_table->display( ).

      ENDMETHOD.                    "alv_full

    5.当用户选择第二个选项,列表输出为普通的列表,执行方法alv_list( ).alv_list方法跟alv_full方法不同的是在创建实例的时候多了一个选项list_display = ‘X’.

      METHOD alv_list.

        "创建实例

        TRY.

            cl_salv_table=>factory(

              EXPORTING

                list_display = 'X'

              IMPORTING

                r_salv_table = gr_table

              CHANGING

                t_table      = lt_tab

            ).

          CATCH cx_salv_msg.

        ENDTRY.

        "显示列表

        gr_table->display( ).

      ENDMETHOD.                    "alv_list

    6.当用户选择第三个选项,列表在自定义屏幕上输出网格列表,执行方法alv_grid( ).方法alv_grid()调用了屏幕100。执行屏幕的时候会执行它的PBO和PAI,也就是会执行module status_0100和user_command_0100。Status_0100的代码是:

        "定义变量

      DATA: lr_container TYPE REF TO cl_gui_custom_container,

            lr_alv2       TYPE REF TO lcl_alv,

            lt_tab       TYPE TABLE OF spfli.

      "创建容器实例

      IF cl_salv_table=>is_offline( ) = ''.

        CREATE OBJECT lr_container

          EXPORTING

            container_name = 'CONTAINER'.

      ENDIF.

      "创建类LCL_ALV实例

      CREATE OBJECT lr_alv2.

      "取得列表数据

      lt_tab = lr_alv2->getdata( ).

      "创建ALV实例

      TRY.

          cl_salv_table=>factory(

            EXPORTING

              r_container    = lr_container

              container_name = 'CONTAINER'

            IMPORTING

              r_salv_table   = gr_table

            CHANGING

              t_table        = lt_tab

          ).

        CATCH cx_salv_msg.

      ENDTRY.

      "显示ALV列表

      gr_table->display( ).

      "释放内存

      FREE lt_tab.

    下面是程序的所有代码:

    REPORT  y_xin_002.

    *变量定义

    TYPES ty_spfli TYPE spfli OCCURS 0.

    DATA: gr_table     TYPE REF TO cl_salv_table.

    *选择屏幕设计

    SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME.

    PARAMETERS: p_full RADIOBUTTON GROUP rg,

                p_list RADIOBUTTON GROUP rg,

                p_grid RADIOBUTTON GROUP rg.

    SELECTION-SCREEN END OF BLOCK blk.

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

    *       CLASS lcl_alv DEFINITION

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

    *       ALV操作类(定义)

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

    CLASS lcl_alv DEFINITION.

      PUBLIC SECTION.

        METHODS: getdata         "取得要显示的数据

                   RETURNING value(lt_tab) TYPE ty_spfli,

                 alv_full        "全屏Grid列表处理方法

                   IMPORTING value(lt_tab) TYPE ty_spfli,

                 alv_list        "普通List处理方法

                   IMPORTING value(lt_tab) TYPE ty_spfli,

                 alv_grid        "在自定义屏幕上显示的列表

                   IMPORTING value(lt_tab) TYPE ty_spfli,

                 main.           "主方法

    ENDCLASS.                    "lcl_alv DEFINITION

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

    *       CLASS lcl_alv IMPLEMENTATION

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

    *       ALV操作类(实现)

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

    CLASS lcl_alv IMPLEMENTATION.

    *取得要显示的数据

      METHOD getdata.

        SELECT * INTO TABLE lt_tab FROM spfli.

      ENDMETHOD.                    "getdata

    *输出全屏网格列表的方法

      METHOD alv_full.

        "创建实例

        TRY.

            cl_salv_table=>factory(

              IMPORTING

                r_salv_table = gr_table

              CHANGING

                t_table      = lt_tab

            ).

          CATCH cx_salv_msg.

        ENDTRY.

        "显示列表

        gr_table->display( ).

      ENDMETHOD.                    "alv_full

    *输出全屏普通列表的方法

      METHOD alv_list.

        "创建实例

        TRY.

            cl_salv_table=>factory(

              EXPORTING

                list_display = 'X'

              IMPORTING

                r_salv_table = gr_table

              CHANGING

                t_table      = lt_tab

            ).

          CATCH cx_salv_msg.

        ENDTRY.

        "显示列表

        gr_table->display( ).

      ENDMETHOD.                    "alv_list

    *输出在自定义屏幕上的列表

      METHOD alv_grid.

        CALL SCREEN '0100'.

      ENDMETHOD.                    "alv_grid

    *主方法,整合数据

      METHOD main.

        DATA: lt_tab TYPE TABLE OF spfli.

        "取得要显示的数据

        lt_tab = me->getdata( ).

        "判断选择屏幕的选择条件调用不同的方法

        CASE 'X'.

          WHEN p_full.

            me->alv_full( lt_tab ).

          WHEN p_list.

            me->alv_list( lt_tab ).

          WHEN p_grid.

            me->alv_grid( lt_tab ).

        ENDCASE.

      ENDMETHOD.                    "main

    ENDCLASS.                    "lcl_alv IMPLEMENTATION

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

    *  MODULE status_0100

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

    *  PBO 屏幕输出前执行

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

    MODULE status_0100 OUTPUT.

      "定义变量

      DATA: lr_container TYPE REF TO cl_gui_custom_container,

            lr_alv2       TYPE REF TO lcl_alv,

            lt_tab       TYPE TABLE OF spfli.

      "创建容器实例

      IF cl_salv_table=>is_offline( ) = ''.

        CREATE OBJECT lr_container

          EXPORTING

            container_name = 'CONTAINER'.

      ENDIF.

      "创建类LCL_ALV实例

      CREATE OBJECT lr_alv2.

      "取得列表数据

      lt_tab = lr_alv2->getdata( ).

      "创建ALV实例

      TRY.

          cl_salv_table=>factory(

            EXPORTING

              r_container    = lr_container

              container_name = 'CONTAINER'

            IMPORTING

              r_salv_table   = gr_table

            CHANGING

              t_table        = lt_tab

          ).

        CATCH cx_salv_msg.

      ENDTRY.

      "显示ALV列表

      gr_table->display( ).

      "释放内存

      FREE lt_tab.

    ENDMODULE.                    "status_0100

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

    *  MODULE user_command_0100

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

    *  PAI 屏幕输出后的动作

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

    MODULE user_command_0100 INPUT.

    ENDMODULE.                    "user_command_0100

    *报表执行

    START-OF-SELECTION.

      DATA  lr_alv   TYPE REF TO lcl_alv.

      CREATE OBJECT lr_alv.

      lr_alv->main( ).

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lhx20/archive/2008/08/19/2793824.aspx

    November 10

    ALV常用参数的详细描述

     

    调用功能模块:

      CALL FUNCTION \'REUSE_ALV_GRID_DISPLAY\'

      EXPORTING

       i_interface_check        = \'\'                      接口一致性检查

       i_callback_program       = sy-repid                当前程序名

       is_layout                = layout                  输出样式

       it_fieldcat              = fieldcat[]              字段定义描述表

       i_callback_pf_status_set = \'PF_STATUS_SET\'         触发事件调用子程序

       i_callback_user_command  = \'USER_COMMAND\'          鼠标事件操作子程序

       it_events                = i_events[]              出口程序触发事件

       i_callback_html_top_of_page  = \'ALV_TOP_OF_PAGE\'   ALV输出表头设置

       i_grid_settings = wl_lvc_s_glay                    打印表头设置

       it_sort = sortable[]                               排序设置

    TABLES

       t_outtab                 = ig_out

    EXCEPTIONS

       program_error            = 1

       OTHERS                   = 2.

    常用属性:(赋值’’中内容必须为大写)

    1.  Fieldcat

    data: fieldcat type slis_t_fieldcat_alv with header line.

    it_fieldcat              = fieldcat[]

    属性

      (用来定义表单中的各个列的相关信息)

       Fieldcat-col_pos = n.                  输出列

       Fieldcat-tabname = ‘FIELDNAME’.      对应的内表字段名

       Fieldcat-seltext_s/m/l = ‘列名’.     输出列文本

      (_s:短文本

       _l:长文本)

       Fieldcat-emphasize = ‘CX10’.    带有颜色的高亮列

      (其中X=(1-7)

      颜色同format)

       Fieldcat-hotspot = ‘X’.           作为热点显示

      可触发鼠标触发事件

       Fieldcat-currency = ‘CURRKEY’.   表 TCURX 中的货币名称

       Fieldcat-quantity(3)            计量单位

       Fieldcat-qfieldname           参考计量单位的字段名称

       Fieldcat-round = n.           四舍五入至小数位数下

       n 位

       Fieldcat-exponent = n.         浮点数的幂指数为n

       Fieldcat-key = ‘X’.           关键字段

       Fieldcat-icon = ‘X’.          作为图标输出

       Fieldcat-symbol = ‘X’.        输出作为符号

       Fieldcat-checkbox = ‘X’.      作为复选框输出

       Fieldcat-just = SPACE, \'R\', \'L\', \'C\'.   对齐方式

       Fieldcat-lzero = ‘X’.          输出前导零

       Fieldcat-no_sign = ‘X’.        输出抑制符号

       Fieldcat-no_zero = ‘X’.        为输出隐藏零

       Fieldcat-edit_mask = SPACE, mask..  输出为mask的模式

       Fieldcat-fix_column = ‘X’.      固定列

       Fieldcat-do_sum = ‘X’.        总计列值总和

       Fieldcat-no_out = ‘X’.         列不输出

       Fieldcat-tech = ‘X’.           该字段为技术字段

       Fieldcat-outputlen = n        列的字符宽度为n

       Fieldcat-decimals_out = n     能控制小数点的位数为n 

       Fieldcat-datatype = C,I,N…        定义数据类型

    2.  SORT

    data: sortable type slis_t_sortinfo_alv with header line.

    it_sort = sortable[]

    属性

      (排序)

        Sortable-Fieldname        字段名

                 Up              升序排列

                 Down            降序排列

                 Subtot          

    3.  Layout

        data: layout type slis_layout_alv .

        is_layout                = layout

    属性 (用于定义ALV表单的相关格式、属性)

    info_fieldname = \'LINE_COLOR\'.  设置特殊行颜色

    (将LINE_COLOR增加到内表字段,写\'CX10\'到特殊行的LINE_COLOR, X为颜色值)

            colwidth_optimize = ‘X’.   优化列宽设置

    no_colhead = \'X\'.         不显示列名

    no_vline = \'X\'.            不显示列间竖线

    zebra      

            f2code = \'&ETA\'.    设置触发弹出详细信息窗口的功能码,这里是双击

    no_vline           这个用来设置列间隔线

            detail_initial_lines  

    detail_popup        是否弹出详细信息窗口

            detail_titlebar       设置弹出窗口的标题栏

            totals_text

            totals_only

            group_change_edit

            header_text

    4.按钮

      DATA: i_events TYPE slis_t_event WITH HEADER LINE.

      事件:

      it_events     = i_events[]   

      i_callback_pf_status_set = \'PF_STATUS_SET\'   

      i_callback_user_command  = \'USER_COMMAND\'

    出口程序触发事件对应子程序:

      FORM PF_STATUS_SET USING rt_extab TYPE slis_t_extab.

      FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.

    功能代码:              函数文本:                          图标名称:

    &ETA                   细节                        ICON_SELECT_DETAIL

    &EB9                 调用报告...                     ICON_TABLE_SETTINGS

    &REFRESH              刷新                        ICON_REFRESH

    &ALL                 全部选择                      ICON_SELECT_ALL

    &SAL                 取消全选                      ICON_DESELECT_ALL

    &OUP                按升序排列                     ICON_SORT_UP

    &ODN                按降序排列                     ICON_SORT_DOWN

    &ILT                  设置过滤器                    ICON_FILTER

    &UMC                  总计                         ICON_SUM

    &SUM                  小计...                      ICON_INTERMEDIATE_SUM

    &RNT_PREV           打印预览                      ICON_LAYOUT_CONTROL

    &VEXCEL            Microsoft Excel                   ICON_XLS

    &AQW                字处理...                       ICON_WORD_PROCESSING

    %PC                   本地文件  ...                   ICON_EXPORT

    %SL                  邮件收件人                      ICON_MAIL

    &ABC                 ABC 分析                      ICON_ABC

    &GRAPH                图形                         ICON_GRAPHICS

    &OL0                 更改布局...                      ICON_ALV_VARIANTS

    &OAD                选择格式...                 ICON_ALV_VARIANT_CHOOSE

    &AVE                 保存格式...                  ICON_ALV_VARIANT_SAVE

    &INFO                  信息                      ICON_INFORMATION

    1.  ALV表头设置

    i_callback_html_top_of_page  = \'ALV_TOP_OF_PAGE\'

    form top_of_page using cl_dd type ref to cl_dd_document.

    语法同HTML fomat  

    ALV_GRID介绍

    一.ALV介绍 

    The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用.

       SAP提示: 在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具,然而,目前这个功能只在实验计划中使用,还没有向客户发布.

       下面是一个ALV GRID的图片:

    它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏.

        ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.

    二.ALV GRID CONTROL (ALV网格控制器)

       ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作.

       使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.

    三.ALV GRID CONTROL 实例

       ALV GRID实例的定义,参照CL_GUI_ALV_GRID类

         data ALV_GRID1 type ref to cl_gui_alv_grid.

      ALV GRID继承结构:

    ALV_GRID介绍二(1)

    四、ALV GRID相关的几个控制结构

        1.字段目录  [Field catalog]

           字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.

           常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURE LVC_S_FCAT)

    2 ROW_POS ALV 控制: 输出行 (内部使用)  

    3 COL_POS ALV 控制: 输出列 列的位置,第几列,例如1,2,…..

    4 FIELDNAME ALV 控制: 内部表字段的字段名称 字段名称

    5 TABNAME LVC 标签名称 表名,如果是内表,是1

    6 CURRENCY ALV 控制: 货币单位  

    7 CFIELDNAME ALV 控制: 参考的当前单位的字段名称  

    8 QUANTITY ALV 控制: 计量单位  

    9 QFIELDNAME ALV 控制: 参考计量单位的字段名称  

    10 IFIELDNAME ALV 控制: 内部表字段的字段名称  

    11 ROUND ALV 控制: ROUND 值  

    12 EXPONENT ALV 控制:流动表示的指数  

    13 KEY ALV 控制: 关键字段 关键字段,前面变蓝色

    14 KEY_SEL ALV 控制: 可以被隐藏的关键列 可以被隐藏的关键列

    15 ICON ALV 控制: 作为图标输出 此列作为图标输出

    16 SYMBOL ALV 控制: 输出作为符号  

    17 CHECKBOX ALV 控制: 作为复选框输出 复选框输出

    18 JUST ALV 控制: 对齐 对齐方式:

    \'R\': right justified

    \'L\': left justified

    \'C\': centered

    19 LZERO ALV 控制: 输出前导零 X\'

    20 NO_SIGN ALV 控制:输出抑制符号 X\',不输出符号

    21 NO_ZERO ALV 控制: 为输出隐藏零 X\',隐藏0

    22 NO_CONVEXT ALV 控制: 不考虑输出的转换退出  

    23 EDIT_MASK ALV 控制: 为输出编辑掩码 格式

    24 EMPHASIZE ALV 控制: 带有颜色的高亮列 列的颜色

    25 FIX_COLUMN ALV 控制: 固定列  

    26 DO_SUM ALV 控制: 总计列值 X\',合计

    ALV_GRID介绍二(2)

    27 NO_SUM ALV 控制: 没有总计列值 X\' ,没有合计

    28 NO_OUT ALV 控制: 列没有输出 X\' ,隐藏此列

    29 TECH ALV 控制: 技术字段 X\'.也是隐藏,但是有点不一样

    30 OUTPUTLEN ALV 控制: 列的字符宽度 输出的长度

    31 CONVEXIT 转换例程  

    32 SELTEXT ALV 控制: 对话功能的列标识符  

    33 TOOLTIP ALV 控制: 列抬头的工具提示  

    34 ROLLNAME ALV 控制: F1 帮助的数据元素  

    35 DATATYPE ABAP 字典中的数据类型 ABAP 字典中的数据类型

    36 INTTYPE ABAP 数据类型(C,D,N,...) ABAP 数据类型(C,D,N,...)

    37 INTLEN 以字节计的内部长度 内容的长度

    38 LOWERCASE 允许/不允许小写字母 X\' 允许大小写

    39 REPTEXT 标题  

    40 HIER_LEVEL ALV 控制: 内部使用  

    41 REPREP ALV 控制: 价值是补充/补充接口的选择标准  

    42 DOMNAME 定义域名  

    43 SP_GROUP 组代码  

    44 HOTSPOT ALV 控制: 单击敏感 X\',下面出现下划线,响应单击

    45 DFIELDNAME ALV 控制: 数据库中列组的字段名称  

    46 COL_ID ALV 控制: 列 ID  

    47 F4AVAILABL 字段有输入帮助吗 X\'.此列有搜索帮助

    48 AUTO_VALUE ALV 控制: 自动复制值  

    49 CHECKTABLE 表名  

    50 VALEXI 固定值存在  

    51 WEB_FIELD ALV 控制: 内部表字段的字段名称  

    52 HREF_HNDL 自然数 热点连接的句柄

    53 STYLE ALV 控制: 样式 下面有例子会介绍,比如PUSHBUTTION

    54 STYLE2 ALV 控制: 样式  

    55 STYLE3 ALV 控制: 样式  

    56 STYLE4 ALV 控制: 样式  

    57 DRDN_HNDL 自然数 下拉的句柄

    58 DRDN_FIELD ALV 控制: 内部表字段的字段名称 下拉的字段

    59 NO_MERGING 字符字段长度 1 相同的值不合并

    60 H_FTYPE ALV 树控制: 功能类型 (总计,平均,最大.最小, ...)  

    61 COL_OPT 可选列优化的条目  

    62 NO_INIT_CH 字符字段长度 1  

    63 DRDN_ALIAS 字符字段长度 1  

    64 REF_FIELD ALV 控制: 内部表字段的参考字段名称  

    65 REF_TABLE ALV 控制: 内部表字段的参考表名称  

    66 TXT_FIELD ALV 控制: 内部表字段的字段名称  

    67 ROUNDFIELD ALV 控制: 带有 ROUND 说明的字段名称  

    68 DECIMALS_O ALV 控制: 输出小数位的编号  

    69 DECMLFIELD ALV 控制: 带有 DECIMALS 说明的字段名称  

    70 DD_OUTLEN ALV 控制: 输出字符长度  

    71 DECIMALS 小数点后的位数 设置小数的位数

    72 COLTEXT ALV 控制: 列标题 列标题

    73 SCRTEXT_L 长字段标签  

    74 SCRTEXT_M 中字段标签  

    75 SCRTEXT_S 短字段标签  

    76 COLDDICTXT ALV 控制: 确定 DDIC 文本参考  

    77 SELDDICTXT ALV 控制: 确定 DDIC 文本参考  

    78 TIPDDICTXT ALV 控制: 确定 DDIC 文本参考  

    79 EDIT ALV 控制: 准备输入 输出状态.\'X\'可输入

    80 TECH_COL ALV 控制: 内部使用  

    81 TECH_FORM ALV 控制: 内部使用  

    82 TECH_COMP ALV 控制: 内部使用  

    83 HIER_CPOS ALV 控制: 层次列位置  

    84 H_COL_KEY 树控制: 列名称/项目名称  

    85 H_SELECT 标识是否可以选择树控制中的列  

    86 DD_ROLL 数据元素 (语义域)  

    87 DRAGDROPID ALV 控制: 拖&放处理拖放对象  

    88 MAC 字符字段长度 1  

    89 INDX_FIELD 自然数  

    90 INDX_CFIEL 自然数  

    91 INDX_QFIEL 自然数  

    92 INDX_IFIEL 自然数  

    93 INDX_ROUND 自然数  

    94 INDX_DECML 自然数  

    95 GET_STYLE 字符字段长度 1  

    96 MARK 字符字段长度 1  

    ALV_GRID介绍二(3)

    2.布局控制[layout]

       布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.

       参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.

       详细的结构说明

    字段名 描述  Value range

    CWIDTH_OPT 最优化宽度 SPACE, \'X\'

    SMALLTITLE 小标题,如果设置了这个字段,

    则标题与列标题大小一样 SPACE, \'X\'

    GRID_TITLE 标题,在网格和工具条之间 最长70个字符

    NO_HEADERS 如果被设置,列标题隐藏 SPACE, \'X\'

    NO_HGRIDLN 隐藏水平线 SPACE, \'X\'

    NO_MERGING 禁用单元格合并 SPACE, \'X\'

    NO_ROWMARK 如果被设置,选择列在选择模式

    为D和A的时候隐藏 SPACE, \'X\'

    NO_TOOLBAR 隐藏工具条 SPACE, \'X\'

    NO_VGRIDLN 隐藏垂直线 SPACE, \'X\'

    SEL_MODE 选择模式 SPACE, \'A\', \'B\', \'C\', \'D\'

    EXCP_CONDS 合计例外 SPACE, \'X\'

    EXCP_FNAME 字段名称带有例外编码 最长30个字符

    EXCP_LED 例外作为 LED SPACE, \'X\'

    EXCP_ROLLN 例外文档的数据元素 SPACE, \'X\'

    CTAB_FNAME 带有复杂单元格颜色编码的字段名称 最长30个字符

    INFO_FNAME 带有简单行彩色代码的字段名称 最长30个字符

    ZEBRA 可选行颜色,如果设置了,出现了间隔色带 SPACE, \'X\'

    NO_TOTLINE 没有总计 SPACE, \'X\'

    NUMC_TOTAL 可以对NUMC字段进行合计 SPACE, \'X\'

    TOTALS_BEF 总计输出在第一行,小计在新的值之前 SPACE, \'X\'

    STYLEFNAME 设置单元格,比如PUSHBUTTON 最长30个字符

    ALV_GRID介绍二(4)

    3.打印和排序,过滤控制

       打印的参数控制请参考结构 [LVC_S_PRNT]

       排序的参数控制请参考结构[LVC_S_SORT]

       过滤的参数控制请参考结构[LVC_S_FILT]

    这里不再一一解释,进入中文版本,里面应该也有解释的,虽然一些不是很清楚.

    五.编写简单的ALV程序.

       首先这里就不详细介绍DIALOG的用法了.

       OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.

       首先ALV的显示需要有几个先决条件.

       1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.

       2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.

       这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.

    第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.

      DATA:

          WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,

          WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .

      *--- 存放字段目录的内表

        DATA gt_fieldcat TYPE lvc_t_fcat .

      *--- 布局结构

        DATA gs_layout TYPE lvc_s_layo .

      *----声明需要显示的内表(以SFLIGHT为例)

        DATA BEGIN OF gt_list OCCURS 0 .

             INCLUDE STRUCTURE SFLIGHT .

        DATA END OF gt_list .

    第二步: 创建ALV这个对象,它的父组件是那个容器.

           在PBO中写入如下代码:

             PROCESS BEFORE OUTPUT .

                 MODULE display_alv .

           创建DISPLAY_ALV的MODULE后,写下如下代码:

                 MODULE display_alv OUTPUT .

                     PERFORM display_alv .

               ENDMODULE .

           在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:

         IF  WCL_ALV IS INITIAL .

          CREATE OBJECT: WCL_CONTAINER

           EXPORTING

             CONTAINER_NAME = \'ALV_CON\'.

          CREATE OBJECT WCL_ALV

           EXPORTING

             I_PARENT = WCL_CONTAINER.

           *-----准备获取字段目录

    PERFORM prepare_field_catalog CHANGING gt_fieldcat .

           *-----设置布局

    PERFORM prepare_layout CHANGING gs_layout .

           *-----显示ALV

    CALL METHOD gr_alvgrid->set_table_for_first_display

    EXPORTING

    * I_BUFFER_ACTIVE =

    * I_CONSISTENCY_CHECK =

    * I_STRUCTURE_NAME =

    * IS_VARIANT =

    * I_SAVE =

    * I_DEFAULT = \'X\'

    is_layout = gs_layout

    * IS_PRINT =

    * IT_SPECIAL_GROUPS =

    * IT_TOOLBAR_EXCLUDING =

    * IT_HYPERLINK =

    CHANGING

    it_outtab = gt_list[]

    it_fieldcatalog = gt_fieldcat

    * IT_SORT =

    * IT_FILTER =

    EXCEPTIONS

    invalid_parameter_combination = 1

    program_error = 2

    too_many_lines = 3

    OTHERS = 4 .

           ELSE .

            *----刷新ALV

    CALL METHOD gr_alvgrid->refresh_table_display

    * EXPORTING

    * IS_STABLE =

    * I_SOFT_REFRESH =

    EXCEPTIONS

    finished = 1

    OTHERS = 2 .

    IF sy-subrc <> 0.

    *--异常处理

    ENDIF.

          ENDIF .

      方法"set_table_for_first_display"的参数说明

    参数 含义

    I_BUFFER_ACTIVE 如果方法调用是静态的,可以设置这个标记,这表示,如果每次显示ALV都是

    相同的字段目录.既然这样,那么字段目录会被放到一个特殊的缓存里,

    这样加速了ALV的显示

    I_STRUCTURE_NAME 输出数据参考的数据字典的结构名,例如\'SFLIGHT\'.如果指定了这个参数,字段

    目录会自动生成,下面的参数IT_FIELDCATALOG不需要传值.

    IS_VARIANT 决定布局显示的变式

    I_SAVE 决定用户是否可以保存变式:

    \'X\' 只能保存全局变式

    \'U\' 只能保存特定变式

    \'A\' 都可以保存

    SPACE 不可以保存变式

    I_DEFAULT 决定用户是否可以定义默认的布局:

    \'X\' 可以定义默认布局,这个参数是默认的

    SPACE 不可以定义默认布局

    IS_LAYOUT 布局参数,传递布局控制的一些信息

    IS_PRINT 后台打印属性的参数

    IT_SPECIAL_GROUPS 如果在字段目录中,一些字段通过SP_GROUP被分组在一起.我们就必须为这些

    组传递一个组的文本内表进去

    IT_TOOLBAR_EXCLUDING 需要隐藏的标准的按钮的内表

    IT_HYPERLINK 为每个句柄分配了超连接的内表,LVC_S_HYPE中的HREF存放了超连接的地址,

    HANDLE指定了句柄,使用这些句柄,你可以在GRID中使用超连接

    IT_ALV_GRAPHICS 比较复杂,没有用过,意思好象是可以在图表中显示ALV.

    IT_OUTTAB 输出数据存放的内表,数据都是存放在这个内表里

    IT_FIELDCATALOG 字段目录

    IT_SORT 排序的标准

    IT_FILTER 过滤的标准

    方法"REFRESH_TABLE_DISPLAY"的参数说明

    参数 含义

    IS_STABLE 刷新的稳定性,有2个参数,一个是行,一个是列.如果设置了相应的值,

    那么对应的行,或者列,在刷新的时候,将会保持稳定,就是滚动条保持不动.

    I_SOFT_REFRESH 这个参数只是在异常情况下被使用,如果设置了这个参数,任何创建的合计,

    任何排序次序,任何为了显示数据而设置的过滤都将保持不变.这个是非常

    有意义的.例如:当然你没有修改数据内表里的数据而想刷新ALV,仅仅只是

    改变一下布局和字段目录.

    ALV_GRID介绍二(5)

       第三步,获取要显示数据的字段目录.有两种方式.

           1.手动创建

    FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .

    DATA ls_fcat type lvc_s_fcat .

    ls_fcat-fieldname = \'CARRID\' .

    ls_fcat-inttype = \'C\' .

    ls_fcat-outputlen = \'3\' .

    ls_fcat-coltext = \'Carrier ID\' .

    ls_fcat-seltext = \'Carrier ID\' .

    APPEND ls_fcat to pt_fieldcat .

    CLEAR ls_fcat .

    ls_fcat-fieldname = \'CONNID\' .

    ls_fcat-ref_table = \'SFLIGHT\' .

    ls_fcat-ref_table = \'CONNID\' .

    ls_fcat-outputlen = \'3\' .

    ls_fcat-coltext = \'Connection ID\' .

    ls_fcat-seltext = \'Connection ID\' .

    APPEND ls_fcat to pt_fieldcat .

    ENDFORM .

       2.半自动的创建

    FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .

    DATA ls_fcat type lvc_s_fcat .

    CALL FUNCTION \'LVC_FIELDCATALOG_MERGE\'

    EXPORTING

    i_structure_name = \'SFLIGHT\'

    CHANGING

    ct_fieldcat = pt_fieldcat[]

    EXCEPTIONS

    inconsistent_interface = 1

    program_error = 2

    OTHERS = 3.

    IF sy-subrc <> 0.

    *--Exception handling

    ENDIF.

    LOOP AT pt_fieldcat INTO ls_fcat .

    CASE pt_fieldcat-fieldname .

    WHEN \'CARRID\' .

    ls_fcat-outpulen = \'10\' .

    ls_fcat-coltext = \'Airline Carrier ID\' .

    MODIFY pt_fieldcat FROM ls_fcat .

    WHEN \'PAYMENTSUM\' .

    ls_fcat-no_out = \'X\' .

    MODIFY pt_fieldcat FROM ls_fcat .

    ENDCASE .

    ENDLOOP .

    ENDFORM .

    ALV_GRID介绍二(6)

    第四步,设置布局

    FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.

        ps_layout-zebra = \'X\' .

        ps_layout-grid_title = \'Flights\' .

        ps_layout-smalltitle = \'X\' .

    ENDFORM. " prepare_layout

    第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)

        在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.

        如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".

    FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .

         DATA ls_exclude TYPE ui_func.

         ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_fc_sum .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_fc_average .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_mb_sum .

         APPEND ls_exclude TO pt_exclude.

         ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .

    ENDFORM .

    ALV_GRID介绍二(7)

    按照上面的步骤,一个ALV的DEMO基本可以创建了.下面我们将讲述一些功能.

    功能一:在第一次显示以后,修改字段目录和布局.

        在运行的时候,很有可能需要在显示之后,需要设置一个新的布局或者字段目录.有下面这些方法去实现.

       字段目录 :    get_frontend_fieldcatalog

                    set_frontend_fieldcatalog

       布局:         get_frontend_layout

                    set_frontend_layout

       使用这些方法,你在执行的任何时候,可以获取这些内容,然后修改他们.

    DATA ls_fcat TYPE lvc_s_fcat .

    DATA lt_fcat TYPE lvc_t_fcat .

    DATA ls_layout TYPE lvc_s_layo .

    CALL METHOD gr_alvgrid->get_frontend_fieldcatalog

      IMPORTING

        et_fieldcatalog = lt_fcat[] .

    LOOP AT lt_fcat INTO ls_fcat .

       IF ls_fcat-fieldname = \'PAYMENTSUM\' .

         ls_fcat-no_out = space .

         MODIFY lt_fcat FROM ls_fcat .

       ENDIF .

    ENDLOOP .

    CALL METHOD gr_alvgrid->set_frontend_fieldcatalog

       EXPORTING

         it_fieldcatalog = lt_fcat[] .

    CALL METHOD gr_alvgrid->get_frontend_layout

      IMPORTING

        es_layout = ls_layout .

       ls_layout-grid_title = \'Flights (with Payment Sums)\' .

    CALL METHOD gr_alvgrid->set_frontend_layout

      EXPORTING

        is_layout = ls_layout .

    ALV_GRID介绍二(8)

    功能二:设置排序条件

       有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.

    FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .

         DATA ls_sort TYPE lvc_s_sort .

         ls_sort-spos = \'1\' .

         ls_sort-fieldname = \'CARRID\' .

         ls_sort-up = \'X\' . "A to Z

         ls_sort-down = space .

         APPEND ls_sort TO pt_sort .

         ls_sort-spos = \'2\' .

         ls_sort-fieldname = \'SEATSOCC\' .

         ls_sort-up = space .

         ls_sort-down = \'X\' . "Z to A

         APPEND ls_sort TO pt_sort .

    ENDFORM. " prepare_sort_table

       这有2点特别的说明:

          1.如果这边排序的字段名,不存在于字段目录中,那将出现DUMP.

          2.排序以后,垂直的网格中,如果出现相同的内容,就会合并,如果要避免,请在布局中设置"no_merging"为"X" .

        你可以通过使用方法“get_sort_criteria” 和“set_sort_criteria”来获取和设置排序的标准.

    ALV_GRID介绍二(9)

    功能三:设置过滤(和排序类似)

       ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"

    FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .

         DATA ls_filt TYPE lvc_s_filt .

         ls_filt-fieldname = \'FLDATE\' .

         ls_filt-sign = \'E\' .

         ls_filt-option = \'BT\' .

         ls_filt-low = \'20030101\' .

         ls_filt-high = \'20031231\' .

         APPEND ls_filt TO pt_filt .

    ENDFORM. " preparefiltertable

        我们可以使用"get_filter_criteria" 和"set_filter_criteria"来获取过滤条件和设置过滤条件.

    ALV_GRID介绍二(10)

    功能四:选择方式

       有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.

    值 模式 可能的选择 注释

    SPACE 等同于B 参考B 默认设置

    \'A\' 行和列的选择,无法选择单元格 多行,多列 用户可以使用最左边的选择按钮来选择多行

    \'B\' 单选,不可以多选行,不可以多选单元格 多行,多列  

    \'C\' 多选,可以多选行,不可以多选单元格 多行,多列  

    \'D\' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行

    注意:

      1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.

      2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"

      3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.

    ALV_GRID介绍二(11)

    功能五:颜色设置

       有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.

    如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.

    先介绍ALV里色码.就是颜色编码,4位CHAR型.

                                Cxyz---

                 Color ||    |

                         |    1/0: 相反 开/关

                         1/0: 强化 开/关

    其中C是固定的第一位,第二位代表是颜色编码(1到7),第三位是加强的设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化.

    颜色编码:

    x 颜色 主要使用在

    1 Gray-blue headers

    2 Light gray List bodies

    3 yellow totals

    4 Blue-green Key columns

    5 green Positive threshold value

    6 red Negative threshold value

    7 orange Control levels

    A)设置列的颜色.

       我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:

               LS_FCAT-EMPHASIZE = \'C701\'.

    如果这列被设置为关键列,就是    LS_FCAT-KEY = \'X\' ,那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.

    B)设置行的颜色

      为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.

      那我们就需要这样来定义我们的数据内表:

    DATA BEGIN OF gt_list OCCURS 0 .

         INCLUDE STRUCTURE SFLIGHT .

         DATA rowcolor(4) TYPE c .

    DATA END OF gt_list .

      很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.

       ps_layout-info_fname = \'ROWCOLOR\'.

      请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.

    C)设置单元格的颜色    

       设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要2个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了DEEP结构了,不过ALV是可以处理的.不需要担心.

    插入的这个表类型的类型为"LVC_T_SCOL".

       里面有3个参数:

         FNAME告诉我们你需要设置的是哪个字段,如果为空,然后直接在COLOR中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.

         COLOR字段是用来设置颜色的.

         NOKEYCOL字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列覆盖.

      同样,ALV在布局中有个字段"CTAB_FNAME"告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的.

    DATA BEGIN OF gt_list OCCURS 0 .

        INCLUDE STRUCTURE SFLIGHT .

    DATA rowcolor(4) TYPE c .

    DATA cellcolors TYPE lvc_t_scol .

    DATA END OF gt_list .

    DATA ls_cellcolor TYPE lvc_s_scol .

    ...

      READ TABLE gt_list INDEX 5 .

        ls_cellcolor-fname = \'SEATSOCC\' .

        ls_cellcolor-color-col = \'7\' .

        ls_cellcolor-color-int = \'1\' .

        APPEND ls_cellcolor TO gt_list-cellcolors .

      MODIFY gt_list INDEX 5 .

    注意:

       颜色设置中有优先级顺序,他们是单元格--->行--->列.

    ALV_GRID介绍二(12)

    功能六:插入超链接

        插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE" ,句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.

       下面举个例子来说明,我们要为字段CARRID,CONNID建立超级链接:

    首先,内表定义中,我们加入2个句柄字段:

    DATA BEGIN OF gt_list OCCURS 0 .

        INCLUDE STRUCTURE SFLIGHT .

    DATA rowcolor(4) TYPE c .

    DATA cellcolors TYPE lvc_t_scol .

    DATA carrid_handle TYPE int4 .

    DATA connid_handle TYPE int4 .

    DATA END OF gt_list .

    第二: 建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".

    FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype .

    DATA ls_hype TYPE lvc_s_hype .

       ls_hype-handle = \'1\' .

       ls_hype-href = \'http://www.company.com/carrids/car1\' .

       APPEND ls_hype TO pt_hype .

       ls_hype-handle = \'2\' .

       ls_hype-href = \'http://www.company.com/carrids/car1\' .

       APPEND ls_hype TO pt_hype .

       ls_hype-handle = \'3\' .

       ls_hype-href = \'http://www.company.com/carrids/car1\' .

       APPEND ls_hype TO pt_hype .

       ls_hype-handle = \'4\' .

       ls_hype-href = \'http://www.company.com/connids/con11\' .

       APPEND ls_hype TO pt_hype .

       ls_hype-handle = \'5\' .

       ls_hype-href = \'http://www.company.com/connids/con12\'

       APPEND ls_hype TO pt_hype .

    .. ..

    ENDFORM .

    第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.

        对于CARRID的field catalog

           Ls_fieldcat-web_field = ‘CARRID_HANDLE’.

        对于CONNID的field catalog

           Ls_fieldcat-web_field = ‘CONNID_HANDLE’.

    在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。

    第四:在数据显示的内表中,指定对应的句柄:

      LOOP AT gt_list.

       IF gt_list-carrid = ‘XX’.

      Gt_list-carrid_handle = ‘1’.

      IF gt_list-connid = ‘01’.

       Gt_list-connid_handle = ‘4’.

      ENDIF.

       ENDIF.

      ENDLOOP.

    ALV_GRID介绍二(13)

    功能七:把字段设置为下拉

       有时候我们可以把一些字段设置为下拉,比如一些类型,一些字段的值是比较固定的一些值,当然,我们也可以通过搜索帮助来做,这些只是看各自的爱好和需要了.

       设置为下拉,和上一篇设置超级链接是类似的,也是使用了一个内表存放了句柄和对应的值,这个表类型为"LVC_T_DROP".不过传递给ALV的方式有点区别.超级链接是通过方法"SET_TABLE_FOR_FIRST_DISPLAY"的参数来传递的,而下拉的内表传递需要使用方法"SET_DROP_DOWN_TABLE".

       如果我们希望把这个列都设置为下拉,那么我们可以在字段目录中,把控制字段"DRDN_HNDL"指向对应的下拉内表的句柄就可以了.例如:

          ps_fcat-drdn_hndl = \'1\' .

    如果是某个单元格设置为下拉,那我们就需要在数据显示的内表中增加一个句柄字段(如果是有多个不同的字段需要设置下拉,可以增加多个字段),同时得在字段目录里设置"DRDN_FIELD".例如:

         ps_fcat-drdn_field = \'PTYP_DD_HNDL\' .

    数据显示内表定义为:

    DATA BEGIN OF gt_list OCCURS 0 .

    INCLUDE STRUCTURE SFLIGHT .

    DATA rowcolor(4) TYPE c .

    DATA cellcolors TYPE lvc_t_scol .

    DATA carrid_handle TYPE int4 .

    DATA connid_handle TYPE int4 .

    DATA ptype_dd_hndl TYPE int4 .

    DATA END OF gt_list .

    定义下拉的句柄内表:

    FORM prepare_drilldown_values.

    DATA lt_ddval TYPE lvc_t_drop .

    DATA ls_ddval TYPE lvc_s_drop .

       ls_ddval-handle = \'1\' .

       ls_ddval-value = \'JFK-12\' .

       APPEND ls_ddval TO lt_ddval .

       ls_ddval-handle = \'1\' .

       ls_ddval-value = \'JSF-44\' .

       APPEND ls_ddval TO lt_ddval .

       ls_ddval-handle = \'1\' .

       ls_ddval-value = \'KMDA-53\' .

       APPEND ls_ddval TO lt_ddval .

       ls_ddval-handle = \'1\' .

       ls_ddval-value = \'SS3O/N\' .

       APPEND ls_ddval TO lt_ddval .

    CALL METHOD gr_alvgrid->set_drop_down_table

       EXPORTING

          it_drop_down = lt_ddval .

    ENDFORM. " prepare_drilldown_values

    准备好内表,以后,使用方法set_drop_down_table来传递给ALV.

    ALV_GRID介绍二(14)

    功能八:基于事件的附加功能

         作为使用面向对象的方法开发的一个组件,ALV GRID控制器有很多响应用户交互的事件.这些事件经常被用来增强一些用户响应的功能.为实现这样的功能,我们必须在程序中创建一个类的实例来作为ALV GRID实例的事件处理者.

        下表列出了一些ALV GRID的事件,后面的HTML列用来说明是否在HTML形式SAP GUI上支持.

    用户定义文本输出:

    Event Application HTML

    Print_end_of_list Define output text to be printed at the end of the entire list √

    Print_top_of_list Define output text to be printed at begin of the entire list √

    Print_top_of_page Define output text to be printed at begin of each page √

    Print_end_of_page Define output text to be printed at the end of each page √

    Subtotal_text Define self-defined subtotal texts √

    ALV GRID的鼠标动作事件

    Event Application HTML

    Button_click Query click on a push button in the ALV GRID control √

    Double_click Query a double click on a cell of the ALV GRID √

    Hotspot_click Query a hotspot click on columns defined for this purpose in advance √

    ondrag Collect information when elements of the ALV GRID Control are dragged ×

    ondrop Process information when elements of the ALV GRID Control are dropped ×

    ondropComplete Perform final actions after successful drag&drop ×

    ondropGetFlavor Distinguish between options for drag&drop behavior ×

    自定义和标准功能实现

    Event Application HTML

    Before_user_command Query self-defined and standard functions √

    User_command Query self-defined function codes √

    After_user_command Query self-defined and standard functions codes √

    自定义功能的定义(自定义按钮,菜单等等)

    Event Application HTML

    Tool bar Change,delete or add gui elements on alv grid √

    Menu_button Define menus for menu buttons in the toolbar √

    Context_menu_request Change context menu ×

    Onf1 Define self-defined f1 help √

    下面是一段代码,举例说明如果定义我们的事件处理类.

    CLAS lcl_event_handler DEFINITION.

    PUBLIC SECTION.

    METHODS:

    *--在ALV的工具条上增加新的按钮

    Handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid

        IMPORTING e_object e_interactive,

    *--实现用户命令

    Handle_user_command

           FOR EVENT user_command OF cl_gui_alv_grid

           IMPORTING e_ucomm.

    *--热点点击控制

    Handle_hotspot_click

           FOR EVENT hotspot_click OF cl_gui_alv_grid

           IMPORTING e_row_id e_column_id es_row_no.

    *--在用户命令触发之前

    Handle_before_user_command

       FOR EVENT before_user_command OF cl_gui_alv_grid

            IMPORTING e_ucomm.

    *--在用户命令触发之后

    Handle_after_user_command

       FOR EVENT after_user_command OF cl_gui_alv_grid

           IMPORTING e_ucomm.

    *--在ALV可修改的情况下,控制数据修改

    Handle_data_changed

       FOR EVENT data_changed OF cl_gui_alv_grid

            IMPORTING er_data_changed.

    *--在数据修改完成之后

    Handle_data_changed_finished

       FOR EVENT data_changed_finished OF cl_gui_alv_grid

            IMPORTING e_modified.

    *--管理菜单

    Handle_menu_button

       FOR EVENT menu_button OF cl_gui_alv_grid

            IMPORTING e_object e_ucomm.

    *--管理按钮点击

    Handle_button_click

       FOR EVENT button_click OF cl_gui_alv_grid

            IMPORTING e_objec e_ucomm.

    PRIVATE SECTION.

    ENDCLASS.

    下面是类的实现的一些概要代码,参数可以从ALV的事件中直接获取出来:

    CLASS lcl_event_handler IMPLEMENTATION.

    *-- Handle toolbar

    METHOD handle_toolbar.

        PERFORM handle_toolbar USIGN e_object e_interactive.

    ENDMETHOD.

    *-- Handle hotspot click

    METHOD handle_hotspot_click.

        PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.

    ENDMETHOD.

    *-- Handle double click

    METHOD handle_double_click.

        PERFORM handle_double_click USING e_row e_column es_row_no.

    ENDMETHOD.

    *-- Handle after user command

    METHOD handle _after_user_command.

        PERFORM handle_after_user_command USING e_object.

    ENDFORM.

    *-- Handle before user command

    METHOD handle_before_user_command.

        PERFORM handle_before_user_command.

    ENDMETHOD.

    *--Handle data changed

    METHOD handle_data_changed.

        PERFORM handle_data_changed USING er_data_changed.

    ENDMEHTOD.

    METHOD handle_data_changed_finished.

         PERFORM handle_data_chaged USING e_modified.

    ENDMETHOD.

    METHOD handle_menu_button.

         PERFORM handle_menu_button USING e_object e_ucomm.

    ENDMEHTOD.

    MEHTOD handle_button_click.

         PERFORM handle_button_click USING e_objcet e_ucomm.

    ENDMETHOD.

    ENDCALSS.

    光定义了这些还不够,我们需要把事件管理类注册到ALV GRID的实例事件.

    DATA gr_event_handler TYPE REF TO lcl_event_handler .

    .. ..

    *--Creating an instance for the event handler

    CREATE OBJECT gr_event_handler .

    *--Registering handler methods to handle ALV Grid events

    SET HANDLER gr_event_handler->handle_user_command FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_toolbar FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_menu_button FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_double_click FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_hotspot_click FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_button_click FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_before_user_command

    FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_context_menu_request

    FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_data_changed FOR gr_alvgrid .

    SET HANDLER gr_event_handler->handle_data_changed_finished

    FOR gr_alvgrid .

    November 02

    ABAP Source Scan

    * 6.00
    * MAWP3HK007362 01092005 RPR_ABAP_SOURCE_SCAN: Selektion
    *                        "Kommentarzeilen ignorieren" (note 875190)
    * 5.00
    * MAWSLNK002692 19042004 RPR_ABAP_SOURCE_SCAN: Ausgabeformatierung der
    *                        Kopfzeile.[note 729038]
    *
    *----------------------------------------------------------------------*
    * Scan a set of reports for a particular string
    *----------------------------------------------------------------------*
    REPORT rpr_abap_source_scan MESSAGE-ID 56
    NO STANDARD PAGE HEADING LINE-SIZE 150.
    TABLES: d020s,
            tadir,
            trdir,
            tuchk3.
    TYPES:  BEGIN OF result_ln,
              repname LIKE sy-repid,
              dynnr   LIKE sy-dynnr,
              line_no(6) TYPE n,
    *         text    like rstxp-tdline,
    text TYPE string,
              sstring,
    END OF result_ln,
           result_tab TYPE result_ln OCCURS 0.
    DATA: disptype   VALUE 'A',
          dtab       TYPE result_tab WITH HEADER LINE,
          ftab       TYPE result_tab WITH HEADER LINE,
          hit_count  TYPE i,
          tabix      LIKE sy-tabix,
    *     text_line  like rstxp-tdline,
          text_line  TYPE string,
          top_flag.
    DATA: BEGIN OF dyn OCCURS 0,
            prog  LIKE d020s-prog,
            dnum  LIKE d020s-dnum,
    END OF dyn,
    BEGIN OF fm OCCURS 0,
            obj_name LIKE tadir-obj_name,
    END OF fm,
    BEGIN OF irdir OCCURS 50,
            name LIKE trdir-name,
    END OF irdir,
    BEGIN OF itab OCCURS 50,
            repname LIKE sy-repid,
    END OF itab,
          itab_ii LIKE itab OCCURS 50 WITH HEADER LINE,
    BEGIN OF rtab OCCURS 0,
    *      text like rpy_dyflow-line,
    text(1000),
    END OF rtab,
         rtab_lcase LIKE LINE OF rtab,
         rtab_tmp   LIKE LINE OF rtab.
    SELECTION-SCREEN: BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
    SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID scan_repid,
                      dynnr    FOR d020s-dnum,
                      subc     FOR trdir-subc,
                      appl     FOR trdir-appl,
                      cnam     FOR trdir-cnam,
                      unam     FOR trdir-unam,
                      devclass FOR tadir-devclass.
    SELECTION-SCREEN: END OF BLOCK a10,
    BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
    SELECT-OPTIONS:   sstring     FOR tuchk3-object NO INTERVALS.
    PARAMETERS:       plusminu(2) TYPE n DEFAULT 2,
                      inclu       AS CHECKBOX DEFAULT 'X',
                      modiass     AS CHECKBOX,
    comment AS CHECKBOX,
    mask AS CHECKBOX.
    SELECTION-SCREEN: END OF BLOCK a20,
    BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
    PARAMETERS:       rb_code  RADIOBUTTON GROUP r10,
                      rb_dyn   RADIOBUTTON GROUP r10,
                      rb_all   RADIOBUTTON GROUP r10.
    SELECTION-SCREEN: END OF BLOCK a30.
    DATA: string LIKE sstring-low.
    INITIALIZATION.
      a10 = 'Report/Dynpro Selektion'(a10).
      a20 = 'Suchkriterien'(a20).
      a30 = 'Suchbereich'(a30).
    TOP-OF-PAGE.
    PERFORM top_of_page.
    TOP-OF-PAGE DURING LINE-SELECTION.
    PERFORM top_of_page.
    AT SELECTION-SCREEN.
    IF sstring[] IS INITIAL AND modiass IS INITIAL.
    MESSAGE e016 WITH 'Bitte Suchstring eingeben'(003).
    ENDIF.
    START-OF-SELECTION.
    IF NOT modiass IS INITIAL.
        sstring-sign    = 'I'.
        sstring-option  = 'EQ'.
        sstring-low     = '{'.
    APPEND sstring.
        sstring-low     = '}'.
    APPEND sstring.
    ENDIF.
    READ TABLE sstring INDEX 1.
    DESCRIBE TABLE sstring LINES sy-tfill.
    IF sy-tfill = 1.
        string = sstring-low.
    ELSE.
    CONCATENATE sstring-low
    '...'
    INTO string SEPARATED BY space.
    ENDIF.
    SET PF-STATUS 'MAIN'.
    IF NOT devclass[] IS INITIAL.
    SELECT obj_name INTO TABLE irdir
    FROM tadir
    WHERE pgmid  = 'R3TR'
    AND   object = 'PROG'
    AND   devclass IN devclass.                     "#EC CI_SGLSELECT
    SELECT obj_name INTO TABLE fm
    FROM tadir
    WHERE pgmid  = 'R3TR'
    AND   object = 'FUGR'
    AND   devclass IN devclass.                     "#EC CI_SGLSELECT
    LOOP AT fm.
    CONCATENATE 'SAPL'
                       fm-obj_name INTO irdir.
    APPEND irdir.
    ENDLOOP.
    ENDIF.
    IF NOT repname[] IS INITIAL.
    SELECT name APPENDING TABLE irdir
    FROM trdir
    WHERE name IN repname
    AND   cnam IN cnam
    AND   unam IN unam
    AND   subc IN subc
    AND   appl IN appl.
    ENDIF.
    CHECK NOT irdir[] IS INITIAL.
    IF rb_code IS INITIAL.
    *   Also scan dynpro flow logic
    SELECT prog dnum INTO TABLE dyn
    FROM d020s FOR ALL ENTRIES IN irdir
    WHERE prog = irdir-name
    AND   dnum IN dynnr.
    ENDIF.
    IF NOT inclu IS INITIAL.
    LOOP AT irdir.
    REFRESH itab_ii.
    CALL FUNCTION 'GET_INCLUDES'
    EXPORTING
              progname = irdir-name
    TABLES
              incltab  = itab_ii.
    APPEND LINES OF itab_ii TO itab.
    ENDLOOP.
    ENDIF.
    APPEND LINES OF irdir TO itab.
    SORT itab.
    DELETE ADJACENT DUPLICATES FROM itab.
    IF rb_dyn IS INITIAL.
    LOOP AT itab.
    READ REPORT itab-repname INTO rtab.
    CHECK sy-subrc = 0.
    IF NOT comment IS INITIAL.
    DELETE rtab
    *         where text(1) = '*'.                              "MAWK007362
    WHERE text(1) = '*' "MAWK007362
    OR text(1) = '"'.                              "MAWK007362
    ENDIF.
    LOOP AT sstring.
    IF mask IS INITIAL.
    SEARCH rtab FOR sstring-low.
    CHECK sy-subrc = 0.
    ELSE.
              sy-tabix = 1.
    ENDIF.
    LOOP AT rtab FROM sy-tabix.
              tabix      = sy-tabix.
              rtab_lcase = rtab.
    TRANSLATE rtab TO UPPER CASE.
    CASE mask.
    WHEN space.
    IF rtab-text CS sstring-low.
    PERFORM: get_hit_set USING rtab_lcase tabix space.
    ENDIF.
    WHEN OTHERS.
    IF rtab-text CP sstring-low.
    PERFORM: get_hit_set USING rtab_lcase tabix space.
    ENDIF.
    ENDCASE.
    ENDLOOP.
    ENDLOOP.
    ENDLOOP.
    ENDIF.
    FREE: itab.
    IF rb_code IS INITIAL.
    LOOP AT dyn.
    PERFORM get_dynpro_flow_logic.
    IF NOT comment IS INITIAL.
    DELETE rtab
    *         where text(1) = '*'.                              "MAWK007362
    WHERE text(1) = '*' "MAWK007362
    OR text(1) = '"'.                              "MAWK007362
    ENDIF.
    LOOP AT sstring.
    IF mask IS INITIAL.
    SEARCH rtab FOR sstring-low.
    CHECK sy-subrc = 0.
    ELSE.
              sy-tabix = 1.
    ENDIF.
    LOOP AT rtab FROM sy-tabix.
              tabix      = sy-tabix.
              rtab_lcase = rtab.
    TRANSLATE rtab TO UPPER CASE.
    CASE mask.
    WHEN space.
    IF rtab-text CS sstring-low.
    PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
    ENDIF.
    WHEN OTHERS.
    IF rtab-text CP sstring-low.
    PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
    ENDIF.
    ENDCASE.
    ENDLOOP.
    ENDLOOP.
    ENDLOOP.
    ENDIF.
    FREE: dyn.
    END-OF-SELECTION.
    IF ftab[] IS INITIAL AND dtab[] IS INITIAL.
    MESSAGE s016 WITH 'String'(006) string 'nicht gefunden'(m01).
    EXIT.
    ENDIF.
    SORT: ftab BY repname line_no sstring DESCENDING,
            dtab BY repname dynnr line_no sstring DESCENDING.
    DELETE ADJACENT DUPLICATES FROM: ftab COMPARING repname line_no,
                                       dtab COMPARING repname dynnr line_no.
    MESSAGE s016 WITH hit_count 'Treffer für String'(m02) string.
    PERFORM: display_ftab_alt,
               display_dtab_alt.
    AT LINE-SELECTION.
    PERFORM call_editor.
    AT USER-COMMAND.
    CASE sy-ucomm.
    WHEN 'TOGL'.
    CASE disptype.
    WHEN 'M'.
              disptype = 'A'.
    PERFORM: display_ftab_alt,
                       display_dtab_alt.
    WHEN 'A'.
              disptype = 'M'.
    PERFORM: display_ftab,
                       display_dtab.
    ENDCASE.
          sy-lsind = sy-lsind - 1.
    ENDCASE.
    *---------------------------------------------------------------------*
    *       FORM APPEND_FTAB                                              *
    *---------------------------------------------------------------------*
    FORM append_ftab USING text LIKE rtab_lcase
                           line_no LIKE sy-tabix
                           sstring TYPE c
                           source  TYPE c.
    DATA: ln TYPE result_ln.
      ln-line_no = line_no.
      ln-text    = text.
      ln-sstring = sstring.
    IF source IS INITIAL.
        ln-repname = itab-repname.
    APPEND ln TO ftab.
    ELSE.
        ln-repname = dyn-prog.
        ln-dynnr   = dyn-dnum.
    APPEND ln TO dtab.
    CLEAR: ln-dynnr.
    ENDIF.
    IF NOT ln-sstring IS INITIAL.
    ADD 1 TO hit_count.
    ENDIF.
    ENDFORM.                    "append_ftab
    *---------------------------------------------------------------------*
    *       FORM TOP_OF_PAGE                                              *
    *---------------------------------------------------------------------*
    FORM top_of_page.
    DATA: repname(50).
    FORMAT INTENSIFIED OFF.
    ULINE /(150).
    * Begin MAWK002692
    *  write: /  sy-vline,
    *           'Source Scan für String:'(h01),
    *            string                              color col_total,
    *        48 'Datum:'(t01),
    *            sy-datum dd/mm/yyyy,
    *        66  'Zeit:'(t02),
    *            sy-uzeit,
    *      150   sy-vline.
    WRITE: /  sy-vline,
    'Source Scan für String:'(h01),
                string                              COLOR COL_TOTAL,
    55 'Datum:'(t01),
                sy-datum DD/MM/YYYY,
    77 'Zeit:'(t02),
                sy-uzeit,
    150   sy-vline.
    * End MAWK002692
    ULINE /(150).
    FORMAT INTENSIFIED ON.
    WRITE: / sy-vline.
    IF top_flag = 'A'.
        repname = ftab-repname.
    ELSE.
    CONCATENATE dtab-repname
    'Dynpro'(004)
                    dtab-dynnr
    INTO repname SEPARATED BY space.
    ENDIF.
    CASE disptype.
    WHEN 'A'.
    CONCATENATE 'Zeile  Source Code ('(001)
                       repname
    ')' INTO text_line.
    WRITE: text_line.
    WHEN 'M'.
    IF top_flag = 'A'.
    WRITE: 'Source Code ...'(002).
    ELSE.
    WRITE: 'Source Code ...'(005).
    ENDIF.
    ENDCASE.
    WRITE: 150 sy-vline.
    ULINE (150).
    ENDFORM.                    "top_of_page
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_FTAB                                             *
    *---------------------------------------------------------------------*
    *       Display search results
    *---------------------------------------------------------------------*
    FORM display_ftab.
    CHECK rb_dyn IS INITIAL.
      top_flag = 'A'.
    NEW-PAGE.
    LOOP AT ftab.
    FORMAT HOTSPOT ON.
    IF ftab-sstring IS INITIAL.
    WRITE: / sy-vline,
                   ftab-text INTENSIFIED OFF.
    ELSE.
    WRITE: / sy-vline,
                   ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
    ENDIF.
    WRITE:   sy-vline       NO-GAP,
                 ftab-line_no   NO-GAP INTENSIFIED,
                 sy-vline       NO-GAP,
                 ftab-repname   NO-GAP INTENSIFIED,
    150  sy-vline       NO-GAP.
    HIDE: ftab-repname,
              ftab-line_no.
    AT END OF repname.
    FORMAT HOTSPOT OFF.
    ULINE /(150).
    ENDAT.
    ENDLOOP.
    ENDFORM.                    "display_ftab
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_DTAB                                             *
    *---------------------------------------------------------------------*
    *       Display search results (dynpro)
    *---------------------------------------------------------------------*
    FORM display_dtab.
    CHECK rb_code IS INITIAL.
      top_flag = 'D'.
    NEW-PAGE.
    LOOP AT dtab.
    FORMAT HOTSPOT ON.
    IF dtab-sstring IS INITIAL.
    WRITE: / sy-vline,
                   dtab-text INTENSIFIED OFF.
    ELSE.
    WRITE: / sy-vline,
                   dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
    ENDIF.
    WRITE:   sy-vline       NO-GAP,
                 dtab-line_no   NO-GAP INTENSIFIED,
                 sy-vline       NO-GAP,
                 dtab-repname   NO-GAP INTENSIFIED,
                 dtab-dynnr     NO-GAP INTENSIFIED,
    150  sy-vline       NO-GAP.
    HIDE:    dtab-repname,
                 dtab-dynnr,
                 dtab-line_no.
    AT END OF repname.
    FORMAT HOTSPOT OFF.
    ULINE /(150).
    ENDAT.
    ENDLOOP.
    ENDFORM.                    "display_dtab
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_FTAB_ALT
    *---------------------------------------------------------------------*
    *       Display hit list without report name on every line
    *---------------------------------------------------------------------*
    FORM display_ftab_alt.
    CHECK rb_dyn IS INITIAL.
      top_flag = 'A'.
    NEW-PAGE.
    LOOP AT ftab.
    AT NEW repname.
    FORMAT HOTSPOT ON.
    IF sy-tabix > 1.
    NEW-PAGE.
    ENDIF.
    ENDAT.
    WRITE: / sy-vline       NO-GAP,
                 ftab-line_no   NO-GAP,
                 sy-vline       NO-GAP.
    IF ftab-sstring IS INITIAL.
    WRITE: ftab-text INTENSIFIED OFF.
    ELSE.
    WRITE: ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
    ENDIF.
    WRITE: 150 sy-vline.
    HIDE:    ftab-repname,
                 ftab-line_no.
    AT END OF repname.
    FORMAT HOTSPOT OFF.
    ULINE /(150).
    ENDAT.
    ENDLOOP.
    ENDFORM.                    "display_ftab_alt
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_DTAB_ALT
    *---------------------------------------------------------------------*
    *       Display dynpro hit list without report name on every line
    *---------------------------------------------------------------------*
    FORM display_dtab_alt.
    CHECK rb_code IS INITIAL.
      top_flag = 'D'.
    NEW-PAGE.
    LOOP AT dtab.
    AT NEW repname.
    FORMAT HOTSPOT ON.
    IF sy-tabix > 1.
    NEW-PAGE.
    ENDIF.
    ENDAT.
    WRITE: / sy-vline       NO-GAP,
                 dtab-line_no   NO-GAP,
                 sy-vline       NO-GAP.
    IF dtab-sstring IS INITIAL.
    WRITE: dtab-text INTENSIFIED OFF.
    ELSE.
    WRITE: dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
    ENDIF.
    WRITE: 150 sy-vline.
    HIDE:    dtab-repname,
                 dtab-dynnr,
                 dtab-line_no.
    AT END OF repname.
    FORMAT HOTSPOT OFF.
    ULINE /(150).
    ENDAT.
    ENDLOOP.
    ENDFORM.                    "display_dtab_alt
    *----------------------------------------------------------------------*
    *       Form  GET_PLUS_MINUS_X_LINES
    *----------------------------------------------------------------------*
    *       Get x lines before the found string and x lines after
    *----------------------------------------------------------------------*
    FORM get_hit_set USING value(ctext)   LIKE rtab_lcase
    value(line_no) LIKE sy-tabix
                           srce_type      TYPE c.
    DATA: end TYPE i,
            start  TYPE i,
            xtabix LIKE sy-tabix.
    IF plusminu <= 0.
    PERFORM append_ftab USING ctext line_no 'X' srce_type.
    EXIT.
    ENDIF.
      start = line_no - plusminu .
    end   = line_no + plusminu.
    IF start < 1.
        start = 1.
    ENDIF.
    WHILE start <= end.
    READ TABLE rtab INTO ctext INDEX start.
    IF sy-subrc <> 0.
    EXIT.
    ENDIF.
        xtabix = sy-tabix.
    IF start = line_no.
    PERFORM append_ftab USING ctext xtabix 'X' srce_type.
    ELSE.
    PERFORM append_ftab USING ctext xtabix space srce_type.
    ENDIF.
    ADD 1 TO start.
    ENDWHILE.
    ENDFORM.                               " GET_HIT_SET
    *----------------------------------------------------------------------*
    *       Form  CALL_EDITOR
    *----------------------------------------------------------------------*
    *       Call ABAP or screen painter editor
    *----------------------------------------------------------------------*
    FORM call_editor.
    CLEAR: ftab,
             dtab.
    READ LINE sy-lilli
    FIELD VALUE ftab-repname
                       ftab-line_no
                       dtab-repname
                       dtab-dynnr
                       dtab-line_no.
    IF ftab-repname IS INITIAL AND dtab-repname IS INITIAL.
    MESSAGE s016 WITH 'Ungültige Cursor Position'(m03).
    EXIT.
    ENDIF.
    IF dtab-dynnr IS INITIAL.
    *   Call ABAP editor
    CALL FUNCTION 'EDITOR_PROGRAM'
    EXPORTING
            display = 'X'
    program = ftab-repname
            topline = ftab-line_no
    EXCEPTIONS
    OTHERS  = 1.
    SET PARAMETER ID 'RID' FIELD sy-repid.
    ELSE.
    CALL FUNCTION 'RS_SCRP'
    EXPORTING
            abl_line       = dtab-line_no
            dynnr          = dtab-dynnr
            progname       = dtab-repname
            wanted_mode    = 'SHOW'
    EXCEPTIONS
            already_exists = 1
            not_found      = 2
            not_executed   = 3
    OTHERS         = 4.
    ENDIF.
    ENDFORM.                               " CALL_EDITOR
    *---------------------------------------------------------------------*
    *       Form  GET_DYNPRO_FLOW_LOGIC
    *----------------------------------------------------------------------*
    *       Get flow logic of the dynpro
    *----------------------------------------------------------------------*
    FORM get_dynpro_flow_logic.
    DATA: dhead  LIKE d020s,
            dfield LIKE d021s OCCURS 0,
            dflow  LIKE d022s OCCURS 0,
            dmatch LIKE d023s OCCURS 0,
    BEGIN OF dynp_id,
              prog LIKE d020s-prog,
              dnum LIKE d020s-dnum,
    END OF dynp_id.
      dynp_id-prog = dyn-prog.
      dynp_id-dnum = dyn-dnum.
    IMPORT DYNPRO dhead dfield dflow dmatch ID dynp_id.
      rtab[] = dflow[].
    ENDFORM.                               " GET_DYNPRO_FLOW_LOGIC

    SEARCH_ABAP_STRING

    *&---------------------------------------------------------------------*
    *& Report  Z_BARRY_SEARCH_ABAP_STRING                                  *
    *& Scan a set of reports for a particular string                       *
    *&---------------------------------------------------------------------*
    *&  Ver 1.1 2007.06.04                                                 *
    *&---------------------------------------------------------------------*
    REPORT ZRS08127 MESSAGE-ID 56  NO STANDARD PAGE HEADING LINE-SIZE 150.

    TABLES: d020s,
            tadir,
            trdir,
            tuchk3,
            rsrepl.
    TYPES:  BEGIN OF result_ln,
              repname LIKE sy-repid,
              dynnr   LIKE sy-dynnr,
              line_no(6) TYPE n,
    *         text    like rstxp-tdline,
              text TYPE string,
              sstring ,
              del_flag,
           END OF result_ln,

           result_tab TYPE result_ln OCCURS 0.

    DATA: disptype   VALUE 'A',
          dtab       TYPE result_tab WITH HEADER LINE,
          ftab       TYPE result_tab WITH HEADER LINE,
          hit_count  TYPE i,
          tabix      LIKE sy-tabix,
    *     text_line  like rstxp-tdline,
          text_line  TYPE string,
          top_flag.

    DATA: BEGIN OF dyn OCCURS 0,
            prog  LIKE d020s-prog,
            dnum  LIKE d020s-dnum,
          END OF dyn,

          BEGIN OF fm OCCURS 0,
            obj_name LIKE tadir-obj_name,
          END OF fm,

          BEGIN OF irdir OCCURS 50,
            name LIKE trdir-name,
          END OF irdir,

          BEGIN OF itab OCCURS 50,
            repname LIKE sy-repid,
          END OF itab,

          itab_ii LIKE itab OCCURS 50 WITH HEADER LINE,

         BEGIN OF rtab OCCURS 0,
    *      text like rpy_dyflow-line,
           text(1000),
         END OF rtab,

         rtab_lcase LIKE LINE OF rtab,
         rtab_tmp   LIKE LINE OF rtab.

    SELECTION-SCREEN: BEGIN OF BLOCK a10 WITH FRAME TITLE a10.
    SELECT-OPTIONS:   repname  FOR trdir-name MEMORY ID scan_repid OBLIGATORY,
                      dynnr    FOR d020s-dnum,
                      subc     FOR trdir-subc,
                      appl     FOR trdir-appl,
                      cnam     FOR trdir-cnam,
                      unam     FOR trdir-unam,
                      devclass FOR tadir-devclass.
    SELECTION-SCREEN: END OF BLOCK a10,
                      BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
    *SELECT-OPTIONS:   sstring     FOR tuchk3-object NO INTERVALS.
    SELECT-OPTIONS:   sstring     FOR rsrepl-tdfind NO INTERVALS OBLIGATORY.
    PARAMETERS:       plusminu(2) TYPE n DEFAULT 2,
                      inclu       AS CHECKBOX DEFAULT 'X',
                      modiass     AS CHECKBOX,
                      comment     AS CHECKBOX,
                      mask        AS CHECKBOX.
    SELECTION-SCREEN: END OF BLOCK a20,
                      BEGIN OF BLOCK a30 WITH FRAME TITLE a30.
    PARAMETERS:       rb_code  RADIOBUTTON GROUP r10,
                      rb_dyn   RADIOBUTTON GROUP r10,
                      rb_all   RADIOBUTTON GROUP r10.
    SELECTION-SCREEN: END OF BLOCK a30.

    DATA: string LIKE sstring-low.

    INITIALIZATION.
      a10 = '报表/屏幕选择'.
      a20 = '搜索标准'.
      a30 = '搜索区域'.

    TOP-OF-PAGE.
      PERFORM top_of_page.

    TOP-OF-PAGE DURING LINE-SELECTION.
      PERFORM top_of_page.

    START-OF-SELECTION.
      IF NOT modiass IS INITIAL.
        sstring-sign    = 'I'.
        sstring-option  = 'EQ'.
        sstring-low     = '{'.
        APPEND sstring.
        sstring-low     = '}'.
        APPEND sstring.
      ENDIF.

      READ TABLE sstring INDEX 1.
      DESCRIBE TABLE sstring LINES sy-tfill.
      IF sy-tfill = 1.
        string = sstring-low.
      ELSE.
        CONCATENATE sstring-low
                   '...'
                    INTO string SEPARATED BY space.
      ENDIF.

      SET PF-STATUS 'MAIN'.

      IF NOT devclass[] IS INITIAL.
        SELECT obj_name INTO TABLE irdir
          FROM tadir
          WHERE pgmid  = 'R3TR'
          AND   object = 'PROG'
          AND   devclass IN devclass .

        SELECT obj_name INTO TABLE fm
          FROM tadir
          WHERE pgmid  = 'R3TR'
          AND   object = 'FUGR'
          AND   devclass IN devclass.

        LOOP AT fm.
          CONCATENATE 'SAPL' fm-obj_name INTO irdir.
          APPEND irdir.
        ENDLOOP.
      ENDIF.

      IF NOT repname[] IS INITIAL.
        SELECT name APPENDING TABLE irdir
          FROM trdir
          WHERE name IN repname
          AND   cnam IN cnam
          AND   unam IN unam
          AND   subc IN subc
          AND   appl IN appl.
      ENDIF.

      CHECK NOT irdir[] IS INITIAL.

      IF rb_code IS INITIAL.
    *   Also scan dynpro flow logic
        SELECT prog dnum INTO TABLE dyn
          FROM d020s FOR ALL ENTRIES IN irdir
          WHERE prog = irdir-name
          AND   dnum IN dynnr.
      ENDIF.

      IF NOT inclu IS INITIAL.
        LOOP AT irdir.
          REFRESH itab_ii.
          CALL FUNCTION 'GET_INCLUDES'
            EXPORTING
              progname = irdir-name
            TABLES
              incltab  = itab_ii.

          APPEND LINES OF itab_ii TO itab.
        ENDLOOP.
      ENDIF.

      APPEND LINES OF irdir TO itab.
      SORT itab.
      DELETE ADJACENT DUPLICATES FROM itab.

      IF rb_dyn IS INITIAL.
        LOOP AT itab.
          READ REPORT itab-repname INTO rtab.
          CHECK sy-subrc = 0.
    *      IF NOT comment IS INITIAL.
    *        DELETE rtab
    *          WHERE text(1) = '*'.
    *      ENDIF.

          LOOP AT sstring.
            IF mask IS INITIAL.
              SEARCH rtab FOR sstring-low.
              CHECK sy-subrc = 0.
            ELSE.
              sy-tabix = 1.
            ENDIF.

            LOOP AT rtab FROM sy-tabix.
              tabix      = sy-tabix.
              rtab_lcase = rtab.
              TRANSLATE rtab TO UPPER CASE.

              CASE mask.
                WHEN space.
                  IF rtab-text CS sstring-low.
                    PERFORM: get_hit_set USING rtab_lcase tabix space.
                  ENDIF.

                WHEN OTHERS.
                  IF rtab-text CP sstring-low.
                    PERFORM: get_hit_set USING rtab_lcase tabix space.
                  ENDIF.
              ENDCASE.
            ENDLOOP.
          ENDLOOP.
        ENDLOOP.
      ENDIF.

      FREE: itab.

      IF rb_code IS INITIAL.
        LOOP AT dyn.
          PERFORM get_dynpro_flow_logic.

    *      IF NOT comment IS INITIAL.
    *        DELETE rtab
    *          WHERE text(1) = '*'.
    *      ENDIF.

          LOOP AT sstring.
            IF mask IS INITIAL.
              SEARCH rtab FOR sstring-low.
              CHECK sy-subrc = 0.
            ELSE.
              sy-tabix = 1.
            ENDIF.

            LOOP AT rtab FROM sy-tabix.
              tabix      = sy-tabix.
              rtab_lcase = rtab.
              TRANSLATE rtab TO UPPER CASE.

              CASE mask.
                WHEN space.
                  IF rtab-text CS sstring-low.
                    PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
                  ENDIF.

                WHEN OTHERS.
                  IF rtab-text CP sstring-low.
                    PERFORM: get_hit_set USING rtab_lcase tabix 'D'.
                  ENDIF.
              ENDCASE.
            ENDLOOP.
          ENDLOOP.
        ENDLOOP.
      ENDIF.

      FREE: dyn.

    END-OF-SELECTION.
      IF ftab[] IS INITIAL AND dtab[] IS INITIAL.
        MESSAGE s016 WITH '字符串' string '未找到'.
        EXIT.
      ENDIF.

      SORT: ftab BY repname line_no sstring DESCENDING,
            dtab BY repname dynnr line_no sstring DESCENDING.

      DELETE ADJACENT DUPLICATES FROM: ftab COMPARING repname line_no,
                                       dtab COMPARING repname dynnr line_no.

      MESSAGE s016 WITH hit_count '命中字符串' string.

      PERFORM: display_ftab_alt,
               display_dtab_alt.

    AT LINE-SELECTION.
      PERFORM call_editor.

    AT USER-COMMAND.
      CASE sy-ucomm.
        WHEN 'TOGL'.
          CASE disptype.
            WHEN 'M' OR 'L'.
              disptype = 'A'.
              PERFORM: display_ftab_alt,
                       display_dtab_alt.
            WHEN 'A' OR 'L'.
              disptype = 'M'.
              PERFORM: display_ftab,
                       display_dtab.
          ENDCASE.
          sy-lsind = sy-lsind - 1.
        WHEN 'REPT'.
          PERFORM: display_rep_list.
          sy-lsind = sy-lsind - 1.
        WHEN 'DOWN'.
          PERFORM download_list.
        WHEN 'EXIT'.
          LEAVE SCREEN.
      ENDCASE.

    *---------------------------------------------------------------------*
    *       FORM APPEND_FTAB                                              *
    *---------------------------------------------------------------------*
    FORM append_ftab USING text    LIKE rtab_lcase
                           line_no LIKE sy-tabix
                           sstring TYPE c
                           source  TYPE c.

      DATA: ln TYPE result_ln.

      ln-line_no = line_no.
      ln-text    = text.
      ln-sstring = sstring.

      IF source IS INITIAL.
        ln-repname = itab-repname.
        APPEND ln TO ftab.
      ELSE.
        ln-repname = dyn-prog.
        ln-dynnr   = dyn-dnum.
        APPEND ln TO dtab.
        CLEAR: ln-dynnr.
      ENDIF.

      IF NOT ln-sstring IS INITIAL.
        ADD 1 TO hit_count.
      ENDIF.
    ENDFORM.                    "append_ftab

    *---------------------------------------------------------------------*
    *       FORM TOP_OF_PAGE                                              *
    *---------------------------------------------------------------------*
    FORM top_of_page.
      DATA: repname(50).
      DATA: title LIKE trdirt-text .

      FORMAT INTENSIFIED OFF.
      ULINE /(150).
      WRITE: /  sy-vline,
               '源扫描字符串:',
                string  COLOR COL_NEGATIVE INVERSE,
            78 '日期:',
                sy-datum DD/MM/YYYY,
            96  '时间:',
                sy-uzeit,
          150   sy-vline.
      ULINE /(150).
      FORMAT INTENSIFIED ON.
      WRITE: / sy-vline.

      IF top_flag = 'A'.
        repname = ftab-repname.
        CLEAR title.
        SELECT SINGLE text INTO title FROM trdirt
                           WHERE name = repname AND sprsl = sy-langu.
      ELSEIF top_flag = 'D' .
        CONCATENATE dtab-repname
                   '屏幕'
                    dtab-dynnr
                    INTO repname SEPARATED BY space.
      ENDIF.

      CASE disptype.
        WHEN 'A'.
          CONCATENATE '行     源代码 ['
                       repname
                       ']' '    程序描述 [' title ']' INTO text_line.
          WRITE: text_line.
        WHEN 'M'.
          IF top_flag = 'A'.
            WRITE: '源代码', 102 '行     报表'.
          ELSE.
            WRITE: '源代码', 102 '行     屏幕'.
          ENDIF.
        WHEN 'L'.
          WRITE '程序列表'.
      ENDCASE.
      WRITE: 150 sy-vline.
      ULINE (150).
    ENDFORM.                    "top_of_page
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_FTAB                                             *
    *---------------------------------------------------------------------*
    *       Display search results
    *---------------------------------------------------------------------*
    FORM display_ftab.
      CHECK rb_dyn IS INITIAL.

      top_flag = 'A'.

      NEW-PAGE.

      LOOP AT ftab.
        IF ftab-sstring IS INITIAL.
          WRITE: / sy-vline,
                   ftab-text INTENSIFIED OFF.
        ELSE.
          FORMAT HOTSPOT ON.
          WRITE: / sy-vline .
    *               ftab-text INTENSIFIED OFF COLOR COL_TOTAL.
          IF ftab-text+0(1) <> '*'.
            WRITE: ftab-text      INTENSIFIED OFF COLOR COL_TOTAL.
          ELSE.
            WRITE: ftab-text      INTENSIFIED OFF COLOR COL_KEY.
          ENDIF.

          FORMAT HOTSPOT OFF.
        ENDIF.
        WRITE: 100  sy-vline       NO-GAP,
                 ftab-line_no   NO-GAP INTENSIFIED,
                 sy-vline       NO-GAP,
                 ftab-repname   NO-GAP INTENSIFIED,
            150  sy-vline       NO-GAP.

        HIDE: ftab-repname,
              ftab-line_no.

        AT END OF repname.
          ULINE /(150).
        ENDAT.
      ENDLOOP.
    ENDFORM.                    "display_ftab
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_DTAB                                             *
    *---------------------------------------------------------------------*
    *       Display search results (dynpro)
    *---------------------------------------------------------------------*
    FORM display_dtab.
      CHECK rb_code IS INITIAL.

      top_flag = 'D'.

      NEW-PAGE.

      LOOP AT dtab.
        IF dtab-sstring IS INITIAL.
          WRITE: / sy-vline,
                   dtab-text INTENSIFIED OFF.
        ELSE.
          FORMAT HOTSPOT ON.
          WRITE: / sy-vline,
                   dtab-text INTENSIFIED OFF COLOR COL_TOTAL.
          FORMAT HOTSPOT OFF.
        ENDIF.
        WRITE:   sy-vline       NO-GAP,
                 dtab-line_no   NO-GAP INTENSIFIED,
                 sy-vline       NO-GAP,
                 dtab-repname   NO-GAP INTENSIFIED,
                 dtab-dynnr     NO-GAP INTENSIFIED,
            150  sy-vline       NO-GAP.

        HIDE:    dtab-repname,
                 dtab-dynnr,
                 dtab-line_no.

        AT END OF repname.
          ULINE /(150).
        ENDAT.
      ENDLOOP.
    ENDFORM.                    "display_dtab

    *---------------------------------------------------------------------*
    *       FORM DISPLAY_FTAB_ALT
    *---------------------------------------------------------------------*
    *       Display hit list without report name on every line
    *---------------------------------------------------------------------*
    FORM display_ftab_alt.
      CHECK rb_dyn IS INITIAL.

      top_flag = 'A'.

      NEW-PAGE.
      IF comment = 'X'.
        LOOP AT ftab.
          IF ftab-text <> '' .
            IF ftab-text+0(1) = '*'.
              ftab-del_flag = 'X'.
              MODIFY ftab.
            ENDIF.
          ENDIF.
        ENDLOOP.
        DELETE ftab WHERE del_flag = 'X'.
      ENDIF.
      LOOP AT ftab.
        AT NEW repname.
          IF sy-tabix > 1.
            NEW-PAGE.
          ENDIF.
        ENDAT.

        WRITE: / sy-vline       NO-GAP,
                 ftab-line_no   NO-GAP,
                 sy-vline       NO-GAP.

        IF ftab-sstring IS INITIAL.
          WRITE: ftab-text      INTENSIFIED OFF.
        ELSE.
          FORMAT HOTSPOT ON.
          IF ftab-text+0(1) <> '*'.
            WRITE: ftab-text      INTENSIFIED OFF COLOR COL_TOTAL.
          ELSE.
            WRITE: ftab-text      INTENSIFIED OFF COLOR COL_KEY.
          ENDIF.
          FORMAT HOTSPOT OFF.
        ENDIF.

        WRITE: 150 sy-vline.

        HIDE:    ftab-repname,
                 ftab-line_no.

        AT END OF repname.
          ULINE /(150).
        ENDAT.
      ENDLOOP.
    ENDFORM.                    "display_ftab_alt
    *---------------------------------------------------------------------*
    *       FORM DISPLAY_DTAB_ALT
    *---------------------------------------------------------------------*
    *       Display dynpro hit list without report name on every line
    *---------------------------------------------------------------------*
    FORM display_dtab_alt.
      CHECK rb_code IS INITIAL.

      IF comment = 'X'.
        LOOP AT dtab.
          IF dtab-text <> '' .
            IF dtab-text+0(1) = '*'.
              dtab-del_flag = 'X'.
              MODIFY dtab.
            ENDIF.
          ENDIF.
        ENDLOOP.
        DELETE dtab WHERE del_flag = 'X'.
      ENDIF.

      top_flag = 'D'.

      NEW-PAGE.

      LOOP AT dtab.

        AT NEW repname.
          IF sy-tabix > 1.
            NEW-PAGE.
          ENDIF.
        ENDAT.

        WRITE: / sy-vline       NO-GAP,
                 dtab-line_no   NO-GAP,
                 sy-vline       NO-GAP.

        IF dtab-sstring IS INITIAL.
          WRITE: dtab-text      INTENSIFIED OFF.
        ELSE.
          FORMAT HOTSPOT ON.
          WRITE: dtab-text      INTENSIFIED OFF COLOR COL_TOTAL.
          FORMAT HOTSPOT OFF.
        ENDIF.

        WRITE: 150 sy-vline.

        HIDE:    dtab-repname,
                 dtab-dynnr,
                 dtab-line_no.

        AT END OF repname.
          ULINE /(150).
        ENDAT.
      ENDLOOP.
    ENDFORM.                    "display_dtab_alt
    *----------------------------------------------------------------------*
    *       Form  GET_PLUS_MINUS_X_LINES
    *----------------------------------------------------------------------*
    *       Get x lines before the found string and x lines after
    *----------------------------------------------------------------------*
    FORM get_hit_set USING value(ctext)   LIKE rtab_lcase
                           value(line_no) LIKE sy-tabix
                           srce_type      TYPE c.

      DATA: end    TYPE i,
            start  TYPE i,
            xtabix LIKE sy-tabix.

      IF plusminu <= 0.
        PERFORM append_ftab USING ctext line_no 'X' srce_type.
        EXIT.
      ENDIF.

      start = line_no - plusminu .
      end   = line_no + plusminu.

      IF start < 1.
        start = 1.
      ENDIF.

      WHILE start <= end.
        READ TABLE rtab INTO ctext INDEX start.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.
        xtabix = sy-tabix.
        IF start = line_no.
          PERFORM append_ftab USING ctext xtabix 'X' srce_type.
        ELSE.
          PERFORM append_ftab USING ctext xtabix space srce_type.
        ENDIF.
        ADD 1 TO start.
      ENDWHILE.
    ENDFORM.                               " GET_HIT_SET
    *----------------------------------------------------------------------*
    *       Form  CALL_EDITOR
    *----------------------------------------------------------------------*
    *       Call ABAP or screen painter editor
    *----------------------------------------------------------------------*
    FORM call_editor.
      CLEAR: ftab,
             dtab.

      READ LINE sy-lilli
           FIELD VALUE ftab-repname
                       ftab-line_no
                       dtab-repname
                       dtab-dynnr
                       dtab-line_no.

      IF ftab-repname IS INITIAL AND dtab-repname IS INITIAL.
        MESSAGE s016 WITH '无效的光标定位'.
        EXIT.
      ENDIF.

      IF dtab-dynnr IS INITIAL.
    *   Call ABAP editor
        CALL FUNCTION 'EDITOR_PROGRAM'
          EXPORTING
            display = ''
            program = ftab-repname
            topline = ftab-line_no
          EXCEPTIONS
            OTHERS  = 1.

        SET PARAMETER ID 'RID' FIELD sy-repid.
      ELSE.
        CALL FUNCTION 'RS_SCRP'
          EXPORTING
            abl_line       = dtab-line_no
            dynnr          = dtab-dynnr
            progname       = dtab-repname
            wanted_mode    = 'MODIFY'
          EXCEPTIONS
            already_exists = 1
            not_found      = 2
            not_executed   = 3
            OTHERS         = 4.
      ENDIF.
    ENDFORM.                               " CALL_EDITOR
    *----------------------------------------------------------------------*
    *       Form  GET_DYNPRO_FLOW_LOGIC
    *----------------------------------------------------------------------*
    *       Get flow logic of the dynpro
    *----------------------------------------------------------------------*
    FORM get_dynpro_flow_logic.
      DATA: dhead  LIKE d020s,
            dfield LIKE d021s OCCURS 0,
            dflow  LIKE d022s OCCURS 0,
            dmatch LIKE d023s OCCURS 0,

            BEGIN OF dynp_id,
              prog LIKE d020s-prog,
              dnum LIKE d020s-dnum,
           END OF dynp_id.

      dynp_id-prog = dyn-prog.
      dynp_id-dnum = dyn-dnum.

      IMPORT DYNPRO dhead dfield dflow dmatch ID dynp_id.

      rtab[] = dflow[].
    ENDFORM.                               " GET_DYNPRO_FLOW_LOGIC
    *&---------------------------------------------------------------------*
    *&      Form  display_rep_list
    *&---------------------------------------------------------------------*
    FORM display_rep_list .
      DATA: lineno TYPE i .
      top_flag = 'L'.
      disptype = 'L'.
      CLEAR lineno.
      LOOP AT ftab.
        AT NEW repname.
          lineno = lineno + 1.
          WRITE /(6) lineno .
          WRITE  ftab-repname .
          HIDE ftab-repname.  "可以不要
        ENDAT.
      ENDLOOP.
    ENDFORM.                    " display_rep_list
    *&---------------------------------------------------------------------*
    *&      Form  download_list
    *&---------------------------------------------------------------------*
    FORM download_list .
      sy-lsind = sy-lsind - 1.
      CALL FUNCTION 'LIST_DOWNLOAD' .
      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.                    " download_list

    October 29

    SAP用户密码加密函数

    REPORT  z_barry_user_pass.
    TABLES: usr02,xu400 .

    DATA: msgid LIKE sy-msgid,
          msgno LIKE sy-msgno,
          param.
         
    usr02-bname = 'BARRY'.
    xu400-newcode = 'BARRY'.

    CALL 'XXPASS'
      ID 'CODE' FIELD xu400-newcode
      ID 'CODX' FIELD usr02-bcode
      ID 'NAME' FIELD usr02-bname  
      ID 'VERS' FIELD usr02-codvn  
      ID 'MESG' FIELD msgno
      ID 'ARBG' FIELD msgid.

    WRITE usr02-bcode .

    友情提示:运行CALL 'XXPASS'前最好跟Basis搞好关系,在你运行后好让他给你解除用户锁定,哈哈

    利用Excel显示数据

    REPORT  zrs08056        .

    TABLES: t001,dd02l.
    DATA: zx030l LIKE x030l.
    DATA BEGIN OF zdfies OCCURS 0.
            INCLUDE STRUCTURE dfies.
    DATA END OF zdfies.
    DATA: BEGIN OF flditab OCCURS 0,
          fldname(11) TYPE c,
          END OF flditab.
    DATA itabt001 LIKE t001 OCCURS 0 WITH HEADER LINE.
    DATA tname LIKE dd02l-tabname.

    START-OF-SELECTION.
      SELECT * FROM t001 INTO TABLE itabt001.
      tname = 'T001'.
      PERFORM getfieleds.
      PERFORM showdata.

    *&---------------------------------------------------------------------*
    *&      Form  GETFIELEDS
    *&---------------------------------------------------------------------*
    FORM getfieleds.
      CALL FUNCTION 'GET_FIELDTAB'
        EXPORTING
          langu               = sy-langu
          only                = space
          tabname             = tname
          withtext            = 'X'
        IMPORTING
          header              = zx030l
        TABLES
          fieldtab            = zdfies
        EXCEPTIONS
          internal_error      = 01
          no_texts_found      = 02
          table_has_no_fields = 03
          table_not_activ     = 04.
      CASE sy-subrc.
        WHEN 0.
          LOOP AT zdfies.
            flditab-fldname = zdfies-fieldname.
            APPEND flditab.
          ENDLOOP.
        WHEN OTHERS.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH  sy-subrc.
      ENDCASE.
    ENDFORM.                    "GETFIELEDS

    *&---------------------------------------------------------------------*
    *&      Form  SHOWdata
    *&---------------------------------------------------------------------*
    FORM showdata.
      CALL FUNCTION 'EXCEL_OLE_STANDARD_DAT'
        EXPORTING
          file_name                 = 'C:\T001.XLS'
          data_sheet_name           = 'USER LIST'
        TABLES
          data_tab                  = itabt001
          fieldnames                = flditab
        EXCEPTIONS
          file_not_exist            = 1
          filename_expected         = 2
          communication_error       = 3
          ole_object_method_error   = 4
          ole_object_property_error = 5
          invalid_filename          = 6
          invalid_pivot_fields      = 7
          download_problem          = 8
          OTHERS                    = 9.
      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.           

    通过RFC把本系统程序放入另外一个系统执行并返回结果

    *&---------------------------------------------------------------------*
    *& Report                                                              *
    *&                                                                     *
    *&---------------------------------------------------------------------*
    *&  通过RFC把本系统程序放入另外一个系统执行并返回结果                  *
    *&                                                                     *
    *&---------------------------------------------------------------------*
    REPORT  z_barry_insert_abap             .
     
    DATA : itab_prog(140) OCCURS 0 WITH HEADER LINE.
    DATA : itab_ret(1023) OCCURS 0 WITH HEADER LINE.
    DATA : err_msg LIKE sy-msgv1.
     
    PARAMETER p_report LIKE sy-repid MEMORY ID rid.
    PARAMETER p_rfcdes LIKE rfcdes-rfcdest.
     
    START-OF-SELECTION.
      REFRESH : itab_prog , itab_ret.
      READ REPORT p_report INTO itab_prog.
      CALL FUNCTION 'RFC_ABAP_INSTALL_AND_RUN' DESTINATION p_rfcdes
        EXPORTING
          mode         = 'F'
        IMPORTING
          errormessage = err_msg
        TABLES
          program      = itab_prog
          writes       = itab_ret
        EXCEPTIONS
          OTHERS       = 1.
      IF sy-subrc <> 0.
        MESSAGE e000(z900) WITH err_msg. WRITE :/ err_msg.
      ELSE.
        IF NOT itab_ret[] IS INITIAL.
          LOOP AT itab_ret.
            WRITE :/ itab_ret.
          ENDLOOP.
        ENDIF.
      ENDIF.
     
    注:因此函数为RFC函数,可以利用第三方软件做远程程序执行,如Excel。但需要注意的是,如果目标Client设置为不允许修改(SCC4),则会返回错误

    用 HTML 输出 LIST 报表

    *&---------------------------------------------------------------------*
    *& Report  ZRS08186                                                    *
    *&                                                                     *
    *&---------------------------------------------------------------------*
    *& 用 HTML 输出 LIST 报表                                                *
    *& Submit一个程序,然后把结果保存为HTML文件                                *
    *&---------------------------------------------------------------------*
    REPORT  z_barry_html_out   LINE-SIZE 450     .
    DATA: mtab_report_list LIKE abaplist OCCURS 0 WITH HEADER LINE,
          mtab_report_html LIKE w3html OCCURS 0 WITH HEADER LINE.
    PARAMETERS: p_fname LIKE rlgrap-filename OBLIGATORY DEFAULT 'C:\testhtm.htm' ,
                p_sname(128) DEFAULT '/usr/sap/DEV/DVEBMGS00/work/TESThtml.htm' LOWER CASE NO-DISPLAY .
    SUBMIT z_barry_html_out_alv EXPORTING LIST TO MEMORY AND RETURN.
    CALL FUNCTION 'LIST_FROM_MEMORY'
      TABLES
        listobject = mtab_report_list
      EXCEPTIONS
        not_found  = 1.
    CALL FUNCTION 'WRITE_LIST'
      TABLES
        listobject = mtab_report_list
      EXCEPTIONS
        empty_list = 1
        OTHERS     = 2.
    *CALL FUNCTION 'WWW_LIST_TO_HTML'
    *  TABLES
    *    html = mtab_report_html.
    CALL FUNCTION 'WWW_HTML_FROM_LISTOBJECT'
      TABLES
        html       = mtab_report_html
        listobject = mtab_report_list.
    IF sy-subrc NE 0.
      WRITE: / 'ERROR IN GENERATING THE HTML FORMAT'.
      EXIT.
    ENDIF.
    *CALL FUNCTION 'WS_DOWNLOAD'
    *  EXPORTING
    *    filename = p_fname
    *    mode     = 'BIN'
    *  TABLES
    *    data_tab = mtab_report_html
    *  EXCEPTIONS
    *    OTHERS   = 1.
    *
    *IF sy-subrc <> 0.
    *  WRITE:/ 'ERROR DOWNLOADING', p_fname.
    *ELSE.
    *  WRITE: / 'OUTPUT SAVED IN FILE', p_fname.
    *ENDIF.
    OPEN DATASET p_sname FOR OUTPUT IN BINARY MODE.
    LOOP AT mtab_report_html.
      TRANSFER mtab_report_html TO p_sname.
    ENDLOOP.
    CLOSE DATASET p_sname.
    PERFORM down_file USING p_sname p_fname .
    IF sy-subrc <> 0.
      WRITE:/ 'ERROR DOWNLOADING', p_fname.
    ELSE.
      WRITE: / 'OUTPUT SAVED IN FILE', p_fname.
    ENDIF.
    *&--------------------------------------------------------------------*
    *&      Form  down_file
    *&--------------------------------------------------------------------*
    FORM down_file USING    p_path file_name .
      DATA: path LIKE rcgfiletr-ftappl .
      DATA: localfile LIKE rcgfiletr-ftfront.
      path = p_path .
      localfile = file_name .
      CALL FUNCTION 'C13Z_FILE_DOWNLOAD_BINARY'
        EXPORTING
          i_file_front_end    = localfile
          i_file_appl         = path
          i_file_overwrite    = 'X'
        EXCEPTIONS
          fe_file_open_error  = 1
          fe_file_exists      = 2
          fe_file_write_error = 3
          ap_no_authority     = 4
          ap_file_open_error  = 5
          ap_file_empty       = 6
          OTHERS              = 7.
      IF sy-subrc <> 0.
        IF sy-msgty = '' .
          sy-msgty = 'E' .
        ENDIF .
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDFORM.                               " DOWN_FILE

    ME21N/VA01的行项目回车后检查出口

    ME21N的行项目回车后检查出口
    MM06E005 --> EXIT_SAPMM06E_017 (PAI)
     
    IF sy-uname = 'BERRY'.
      DATA: tmpafnam LIKE ekpo-afnam,
            tmpmatnr LIKE mara-matnr,
            tmpxchpf LIKE marc-xchpf.
     
      SELECT SINGLE xchpf INTO tmpxchpf FROM marc
      WHERE werks = i_ekpo-werks AND
            matnr = i_ekpo-matnr .
      IF tmpxchpf = 'X'.
        IF i_ekpo-afnam = ''.
          MESSAGE w000(z900) WITH '请填写色号' INTO gl_dummy.
          mmpur_message 'W' 'Z900' '000' '请填写色号' '' '' ''.
        ENDIF.
      ENDIF.
    ENDIF.
     
     
    附:VA01 行项目回车后检查出口:
     
    MV45AFZZ 
    FORM userexit_move_field_to_vbap.