• ABAP 下载XML文件


    ********************************************************************
    * Report for generating class from XML-file
    * Author: Sergey Korolev (slkorolev@mail.ru)
    * Does not work with interfaces and exception classes
    ********************************************************************
    REPORT  yrs_class_upload_xml                                        .
    PARAMETERS:
    xmlfile TYPE localfile.
    TYPE-POOLS: seok, seop.
    INCLUDE yrs_class_xml_const.
    DATA:
    corr_mode,
    * Extracted structures (from XML file)
    gt_locals_src    TYPE	seop_source_string,
    gt_locals_def    TYPE	seop_source_string,
    gt_locals_imp    TYPE	seop_source_string,
    gt_locals_mac    TYPE	seop_source_string,
    gs_class  TYPE  vseoclass,
    gt_attributes TYPE  seoo_attributes_r,
    gt_methods  TYPE  seoo_methods_r,
    gt_events TYPE  seoo_events_r,
    gt_types  TYPE  seoo_types_r,
    gt_parameters TYPE  seos_parameters_r,
    gt_exceps TYPE  seos_exceptions_r,
    gt_implementings  TYPE  seor_implementings_r,
    gs_inheritance  TYPE  vseoextend,
    gt_redefinitions  TYPE  seor_redefinitions_r,
    gt_impl_details TYPE  seor_redefinitions_r,
    gt_friendships  TYPE  seof_friendships_r,
    gt_typepusages  TYPE  seot_typepusages_r,
    gt_clsdeferrds  TYPE  seot_clsdeferrds_r,
    gt_intdeferrds  TYPE  seot_intdeferrds_r,
    gt_aliases  TYPE  seoo_aliases_r,
    gt_interfaces TYPE  seok_int_typeinfos,
    gs_includes TYPE  seop_methods_w_include,
    gt_texts TYPE TABLE OF textpool,
    gt_source TYPE  seop_source,
    gt_type_source     TYPE	seop_source,
    gt_mtd_source   TYPE seo_method_source_table,
    wa_mtd_source   TYPE seo_method_source.
    CLASS lcx_xml_error DEFINITION DEFERRED.
    DATA:
    ex TYPE REF TO lcx_xml_error.
    *----------------------------------------------------------------------*
    *       CLASS lCX_xml_error  DEFINITIO
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcx_xml_error DEFINITION
    INHERITING FROM cx_static_check.
    PUBLIC SECTION.
    DATA: error TYPE string.
    METHODS: constructor IMPORTING value(i_error) TYPE string OPTIONAL.
    ENDCLASS.                    "lCX_xml_error  DEFINITIO
    *----------------------------------------------------------------------*
    *       CLASS lcx_xml_section_error  DEFINITIO
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcx_xml_section_error DEFINITION
    INHERITING FROM lcx_xml_error.
    PUBLIC SECTION.
    METHODS: constructor IMPORTING value(i_section) TYPE string OPTIONAL
    .
    ENDCLASS.                    "lCX_xml_error  DEFINITIO
    *----------------------------------------------------------------------*
    *       CLASS lcx_xml_error IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcx_xml_error IMPLEMENTATION.
    METHOD constructor.
    CALL METHOD super->constructor.
    error = i_error.
    ENDMETHOD.                    "constructor
    ENDCLASS.                    "lcx_xml_error IMPLEMENTATION
    *----------------------------------------------------------------------*
    *       CLASS lcx_xml__section_error IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS lcx_xml_section_error IMPLEMENTATION.
    METHOD constructor.
    DATA:
    msg TYPE string.
    CONCATENATE 'File does not contain obligatory section'
    i_section
    INTO msg
    SEPARATED BY space.
    CALL METHOD super->constructor
    EXPORTING
    i_error = msg.
    ENDMETHOD.                    "constructor
    ENDCLASS.                    "lcx_xml__section_error IMPLEMENTATION
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR xmlfile.
    DATA:
    file_table  TYPE filetable,
    action TYPE i,
    rc TYPE sysubrc.
    FIELD-SYMBOLS:
    <file> TYPE file_table.
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
    default_extension       = 'xml'
    file_filter             = cl_gui_frontend_services=>filetype_xml
    CHANGING
    file_table              = file_table
    rc                      = rc
    user_action             = action
    EXCEPTIONS
    file_open_dialog_failed = 1
    cntl_error              = 2
    error_no_gui            = 3
    not_supported_by_gui    = 4
    OTHERS                  = 5.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    CHECK action = cl_gui_frontend_services=>action_ok.
    READ TABLE file_table INDEX 1 ASSIGNING <file>.
    xmlfile = <file>.
    START-OF-SELECTION.
    DATA:
    retcode TYPE sysubrc,
    source_node TYPE REF TO if_ixml_node,
    xml TYPE REF TO cl_xml_document.
    CREATE OBJECT xml.
    TRY.
    CALL METHOD xml->import_from_file
    EXPORTING
    filename = xmlfile
    RECEIVING
    retcode  = retcode.
    IF retcode NE xml->c_ok.
    DATA:
    msg TYPE string.
    CASE retcode.
    WHEN xml->c_no_ixml.
    msg = 'This is not XML file'.
    WHEN xml->c_failed.
    msg = 'Failed to parse the XML file'.
    WHEN xml->c_not_found.
    msg = 'XML file not found'.
    ENDCASE.
    RAISE EXCEPTION TYPE lcx_xml_error
    EXPORTING i_error = msg.
    ENDIF.
    DEFINE load_section.
    call method xml->get_data
    exporting
    name       = &1
    importing
    retcode    = retcode
    changing
    dataobject = &2.
    if retcode ne xml->c_ok.
    raise exception type lcx_xml_section_error
    exporting i_section = &1.
    endif.
    END-OF-DEFINITION.
    load_section:
    c_xml_root gs_class,
    c_xml_attributes gt_attributes,
    c_xml_methods gt_methods,
    c_xml_events gt_events,
    c_xml_types gt_types,
    c_xml_parameters gt_parameters,
    c_xml_exceps gt_exceps,
    c_xml_implementings gt_implementings,
    c_xml_impl_details gt_impl_details,
    c_xml_friendships gt_friendships,
    c_xml_typepusages gt_typepusages,
    c_xml_clsdeferrds gt_clsdeferrds,
    c_xml_intdeferrds gt_intdeferrds,
    c_xml_aliases gt_aliases,
    c_xml_inheritance gs_inheritance,
    c_xml_interfaces gt_interfaces,
    c_xml_redefinitions gt_redefinitions,
    c_xml_typesource gt_type_source,
    *        c_xml_text_pool gt_texts,
    c_xml_locals_src gt_locals_src,
    c_xml_locals_def gt_locals_def,
    c_xml_locals_mac gt_locals_mac,
    c_xml_locals_imp gt_locals_imp.
    * Now find method implementation node containing sources
    * for each method as a subnode
    CALL METHOD xml->find_node
    EXPORTING
    name = c_xml_method_src
    RECEIVING
    node = source_node.
    IF source_node IS INITIAL.
    RAISE EXCEPTION TYPE lcx_xml_section_error
    EXPORTING i_section = c_xml_methods.
    ENDIF.
    source_node = source_node->get_first_child( ).
    DATA:
    name1 TYPE string,
    name2 TYPE string,
    xml_sep(5) VALUE '_--7E'.
    WHILE NOT source_node IS INITIAL.
    CLEAR wa_mtd_source.
    name1 = source_node->get_name( ).
    SPLIT name1 AT xml_sep INTO name1 name2.
    IF name2 IS INITIAL.
    wa_mtd_source-cpdname = name1.
    ELSE.
    CONCATENATE name1 name2 INTO wa_mtd_source-cpdname
    SEPARATED BY '~'.
    ENDIF.
    CALL METHOD xml->get_node_data
    EXPORTING
    node       = source_node
    IMPORTING
    dataobject = wa_mtd_source-source
    retcode    = retcode.
    IF retcode = xml->c_ok.
    APPEND wa_mtd_source TO gt_mtd_source.
    ENDIF.
    source_node = source_node->get_next( ).
    ENDWHILE.
    CATCH lcx_xml_error INTO ex.
    MESSAGE ex->error TYPE 'E'.
    ENDTRY.
    DATA:
    answer,
    fields TYPE TABLE OF sval WITH HEADER LINE,
    parameter	TYPE TABLE OF spar WITH HEADER LINE,
    clskey TYPE seoclskey.
    clskey-clsname = gs_class-clsname.
    corr_mode = 'I'.
    DO.
    CALL FUNCTION 'SEO_CLASS_GET'
    EXPORTING
    clskey       = clskey
    EXCEPTIONS
    not_existing = 1
    deleted      = 2
    is_interface = 3
    model_only   = 4
    OTHERS       = 5.
    IF sy-subrc NE 0.
    EXIT.
    ENDIF.
    REFRESH parameter.
    parameter-param = 'CLASS'.
    parameter-value = clskey-clsname.
    APPEND parameter.
    CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
    titlebar              = 'Class already exists'
    text_question         =
    'Class &CLASS& already exists. Overwrite?'
    default_button        = '2'
    IMPORTING
    answer                = answer
    TABLES
    parameter             = parameter
    EXCEPTIONS
    text_not_found        = 0
    OTHERS                = 0.
    CASE answer.
    WHEN '1'.
    corr_mode = 'U'.
    EXIT.
    WHEN 'A'.
    RETURN.
    ENDCASE.
    REFRESH fields.
    fields-tabname = 'SEOCLSKEY'.
    fields-fieldname = 'CLSNAME'.
    fields-value = clskey-clsname.
    APPEND fields.
    CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
    popup_title     = 'Enter new class name'
    IMPORTING
    returncode      = answer
    TABLES
    fields          = fields
    EXCEPTIONS
    error_in_fields = 1
    OTHERS          = 2.
    IF answer = 'A'.
    RETURN.
    ENDIF.
    READ TABLE fields INDEX 1.
    clskey-clsname = fields-value.
    ENDDO.
    IF clskey-clsname NE gs_class-clsname.
    gs_class-clsname = clskey-clsname.
    gs_class-author = sy-uname.
    gs_class-changedby = sy-uname.
    gs_class-changedon = sy-datum.
    gs_inheritance-clsname = clskey-clsname.
    PERFORM rename_class TABLES gt_implementings USING clskey-clsname.
    PERFORM rename_class TABLES gt_attributes USING clskey-clsname.
    PERFORM rename_class TABLES gt_methods USING clskey-clsname.
    PERFORM rename_class TABLES gt_events USING clskey-clsname.
    PERFORM rename_class TABLES gt_types USING clskey-clsname.
    PERFORM rename_class TABLES gt_parameters USING clskey-clsname.
    PERFORM rename_class TABLES gt_exceps USING clskey-clsname.
    PERFORM rename_class TABLES gt_aliases USING clskey-clsname.
    PERFORM rename_class TABLES gt_typepusages USING clskey-clsname.
    PERFORM rename_class TABLES gt_clsdeferrds USING clskey-clsname.
    PERFORM rename_class TABLES gt_intdeferrds USING clskey-clsname.
    PERFORM rename_class TABLES gt_redefinitions USING clskey-clsname.
    PERFORM rename_class TABLES gt_impl_details USING clskey-clsname.
    PERFORM rename_class TABLES gt_friendships USING clskey-clsname.
    ENDIF.
    DATA:
    devclass  LIKE  tadir-devclass,
    korrnum LIKE  e070-trkorr.
    CALL FUNCTION 'RS_CORR_INSERT'
    EXPORTING
    object              = gs_class-clsname
    object_class        = 'CLAS'
    mode                = corr_mode
    global_lock         = 'X'
    master_language     = gs_class-langu
    IMPORTING
    devclass            = devclass
    korrnum             = korrnum
    EXCEPTIONS
    cancelled           = 1
    permission_failure  = 2
    unknown_objectclass = 3
    OTHERS              = 4.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    DATA:
    overwrite TYPE seox_boolean.
    IF corr_mode = 'U'.
    overwrite = seox_true.
    ENDIF.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Generating class definition'.
    CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE'
    EXPORTING
    corrnr          = korrnum
    devclass        = devclass
    version         = seoc_version_inactive
    overwrite       = overwrite
    IMPORTING
    korrnr          = korrnum
    CHANGING
    class           = gs_class
    inheritance     = gs_inheritance
    redefinitions   = gt_redefinitions
    implementings   = gt_implementings
    impl_details    = gt_impl_details
    attributes      = gt_attributes
    methods         = gt_methods
    events          = gt_events
    types           = gt_types
    type_source     = gt_type_source
    PARAMETERS      = gt_parameters
    exceps          = gt_exceps
    aliases         = gt_aliases
    typepusages     = gt_typepusages
    clsdeferrds     = gt_clsdeferrds
    intdeferrds     = gt_intdeferrds
    friendships     = gt_friendships
    EXCEPTIONS
    existing        = 1
    is_interface    = 2
    db_error        = 3
    component_error = 4
    no_access       = 5
    other           = 6
    OTHERS          = 7.
    IF sy-subrc <> 0.
    MESSAGE 'Error generating class' TYPE 'E'.
    ENDIF.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = 'Generating local class definitions'.
    CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS'
    EXPORTING
    clskey                 = clskey
    force                  = seox_true
    corrnr                 = korrnum
    implementation         = gt_locals_src
    locals_def             = gt_locals_def
    locals_imp             = gt_locals_imp
    locals_mac             = gt_locals_mac
    EXCEPTIONS
    not_existing           = 1
    model_only             = 2
    locals_not_generated   = 3
    locals_not_initialised = 4
    OTHERS                 = 5.
    IF sy-subrc <> 0.
    MESSAGE 'Error generating local class definitions' TYPE 'E'.
    ENDIF.
    FIELD-SYMBOLS:
    <mtd_source> TYPE seo_method_source.
    DATA:
    status_line(128),
    mtdkey TYPE seocpdkey.
    LOOP AT gt_mtd_source ASSIGNING <mtd_source>.
    CONCATENATE 'Generating implementation of the method'
    <mtd_source>-cpdname
    INTO status_line
    SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = status_line.
    mtdkey-clsname = clskey-clsname.
    mtdkey-cpdname = <mtd_source>-cpdname.
    CALL FUNCTION 'SEO_METHOD_GENERATE_INCLUDE'
    EXPORTING
    mtdkey                         = mtdkey
    force                          = seox_true
    suppress_corr                  = seox_true
    implementation_expanded        = <mtd_source>-source
    corrnr                         = korrnum
    without_method_frame           = seox_true
    EXCEPTIONS
    not_existing                   = 1
    model_only                     = 2
    include_existing               = 3
    method_imp_not_generated       = 4
    method_imp_not_initialised     = 5
    _internal_class_not_existing   = 6
    _internal_method_overflow      = 7
    cancelled                      = 8
    method_is_abstract_implemented = 9
    method_is_final_implemented    = 10
    internal_error_insert_report   = 11
    OTHERS                         = 12.
    *    IF sy-subrc <> 0.
    *      MESSAGE 'Error generating class' TYPE 'E'.
    *    ENDIF.
    ENDLOOP.
    * Now find text pool node containing textpools for
    * different languages as subnodes
    DATA:
    langu TYPE sy-langu,
    include_name TYPE programm.
    TRY.
    CALL FUNCTION 'SEO_CLASS_GET_INCLUDE_BY_NAME'
    EXPORTING
    clskey   = clskey
    IMPORTING
    progname = include_name.
    CALL METHOD xml->find_node
    EXPORTING
    name = c_xml_text_pool
    RECEIVING
    node = source_node.
    IF source_node IS INITIAL.
    RAISE EXCEPTION TYPE lcx_xml_section_error
    EXPORTING i_section = c_xml_text_pool.
    ENDIF.
    source_node = source_node->get_first_child( ).
    WHILE NOT source_node IS INITIAL.
    langu = source_node->get_name( ).
    REFRESH gt_texts.
    CALL METHOD xml->get_node_data
    EXPORTING
    node       = source_node
    IMPORTING
    dataobject = gt_texts
    retcode    = retcode.
    source_node = source_node->get_next( ).
    CHECK retcode = xml->c_ok
    AND   NOT gt_texts IS INITIAL.
    CONCATENATE 'Generating class text pool for language'
    langu
    INTO msg
    SEPARATED BY space.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
    text = msg.
    INSERT textpool include_name
    FROM gt_texts
    LANGUAGE langu.
    ENDWHILE.
    CATCH lcx_xml_section_error.
    MESSAGE 'XML-file does not contain Text pool data' TYPE 'S'.
    ENDTRY.
    SET PARAMETER ID 'CLASS' FIELD clskey-clsname.
    CALL TRANSACTION 'SE24'.
    *&---------------------------------------------------------------------*
    *&      Form  rename_class
    *&---------------------------------------------------------------------*
    *       Renames class references in arbitrary table
    *----------------------------------------------------------------------*
    *      -->P_TABLE    some generation structure
    *      -->P_NAME     new class name
    *----------------------------------------------------------------------*
    FORM rename_class  TABLES   p_table
    USING    p_name.
    FIELD-SYMBOLS:
    <field> TYPE ANY,
    <line> TYPE ANY.
    DEFINE set_field.
    assign component &1 of structure <line> to <field>.
    if sy-subrc = 0.
    <field> = &2.
    endif.
    END-OF-DEFINITION.
    LOOP AT p_table ASSIGNING <line>.
    set_field 'CLSNAME' p_name.
    set_field 'AUTHOR' sy-uname.
    set_field 'CHANGEDBY' sy-uname.
    ENDLOOP.
    ENDFORM.                    " rename_class
    

    [Edit section] Report YRS_CLASS_DOWNLOAD_XML

    ********************************************************************
    * Report for generating XML-file from class
    * Author: Sergey Korolev (slkorolev@mail.ru)
    * Does not work with interfaces and exception classes
    ********************************************************************
    REPORT yrs_class_download.
    PARAMETERS: class TYPE seoclskey OBLIGATORY.
    SELECTION-SCREEN SKIP.
    PARAMETERS: p_show AS CHECKBOX.
    TYPE-POOLS: seok, seop, srext.
    INCLUDE yrs_class_xml_const.
    INCLUDE lseopm01.
    DATA:
    g_xml TYPE REF TO cl_xml_document,
    gs_class  TYPE  vseoclass,
    gt_attributes TYPE  seoo_attributes_r,
    gt_methods  TYPE  seoo_methods_r,
    gt_events TYPE  seoo_events_r,
    gt_types  TYPE  seoo_types_r,
    gt_parameters TYPE  seos_parameters_r,
    gt_exceps TYPE  seos_exceptions_r,
    gt_implementings  TYPE  seor_implementings_r,
    gs_inheritance  TYPE  vseoextend,
    gt_redefinitions  TYPE  seor_redefinitions_r,
    gt_impl_details TYPE  seor_redefinitions_r,
    gt_friendships  TYPE  seof_friendships_r,
    gt_typepusages  TYPE  seot_typepusages_r,
    gt_clsdeferrds  TYPE  seot_clsdeferrds_r,
    gt_intdeferrds  TYPE  seot_intdeferrds_r,
    gt_aliases  TYPE  seoo_aliases_r,
    gt_interfaces TYPE  seok_int_typeinfos,
    gs_includes TYPE  seop_methods_w_include,
    gt_source TYPE  seop_source_string.
    DATA:
    typkey TYPE seocmpkey,
    single_source TYPE seop_source,
    type_source TYPE seop_source_string.
    FIELD-SYMBOLS:
    <type> TYPE seoo_type_r,
    <source_line> TYPE LINE OF seop_source.
    FIELD-SYMBOLS:
    <include> TYPE LINE OF seop_methods_w_include.
    AT SELECTION-SCREEN ON VALUE-REQUEST FOR class.
    DATA:
    clsname TYPE seoclass-clsname.
    clsname = class.
    CALL FUNCTION 'F4_OBJECTS_CLASS'
    EXPORTING
    object = clsname
    IMPORTING
    RESULT = clsname.
    class = clsname.
    AT SELECTION-SCREEN ON class.
    DATA:
    clskey  TYPE  seoclskey.
    clskey-clsname = class.
    * Check if active version of class exists
    CALL FUNCTION 'SEO_CLASS_GET'
    EXPORTING
    clskey       = clskey
    version      = '1'
    state        = '1'
    EXCEPTIONS
    not_existing = 1
    deleted      = 2
    is_interface = 3
    model_only   = 4
    OTHERS       = 5.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    START-OF-SELECTION.
    CALL FUNCTION 'SEO_CLASS_TYPEINFO_GET'
    EXPORTING
    clskey        = class
    version       = seoc_version_active
    IMPORTING
    class         = gs_class
    attributes    = gt_attributes
    methods       = gt_methods
    events        = gt_events
    types         = gt_types
    PARAMETERS    = gt_parameters
    exceps        = gt_exceps
    implementings = gt_implementings
    inheritance   = gs_inheritance
    redefinitions = gt_redefinitions
    impl_details  = gt_impl_details
    friendships   = gt_friendships
    typepusages   = gt_typepusages
    clsdeferrds   = gt_clsdeferrds
    intdeferrds   = gt_intdeferrds
    aliases       = gt_aliases
    EXCEPTIONS
    not_existing  = 1
    is_interface  = 2
    model_only    = 3
    OTHERS        = 4.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    * Load all method include names
    CALL FUNCTION 'SEO_CLASS_GET_METHOD_INCLUDES'
    EXPORTING
    clskey                       = class
    IMPORTING
    includes                     = gs_includes
    EXCEPTIONS
    _internal_class_not_existing = 1
    OTHERS                       = 2.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    * Gathering together internal type source
    LOOP AT gt_types ASSIGNING <type>.
    typkey-clsname = <type>-clsname.
    typkey-cmpname = <type>-cmpname.
    REFRESH single_source.
    PERFORM get_type_source USING    typkey
    CHANGING single_source.
    *    CALL FUNCTION 'SEO_CLASS_GET_TYPE_SOURCE'
    *      EXPORTING
    *        typkey                       = typkey
    *      IMPORTING
    *        SOURCE                       = single_source
    *      EXCEPTIONS
    *        _internal_class_not_existing = 1
    *        not_existing                 = 2
    *        not_edited                   = 3
    *        OTHERS                       = 4.
    CHECK NOT single_source[] IS INITIAL.
    <type>-srcrow1 = LINES( type_source ) + 1.
    <type>-srccolumn1 = 0.
    LOOP AT single_source ASSIGNING <source_line>.
    CONDENSE <source_line>.
    <type>-srccolumn2 = STRLEN( <source_line> ).
    APPEND <source_line> TO type_source.
    ENDLOOP.
    <type>-srcrow2 = LINES( type_source ).
    ENDLOOP.
    END-OF-SELECTION.
    DATA:
    mtd_name TYPE string,
    class_root TYPE REF TO if_ixml_node,
    section    TYPE REF TO if_ixml_node,
    l_description TYPE sdok_descr.
    l_description = gs_class-descript.
    CREATE OBJECT g_xml
    EXPORTING
    description = l_description
    object_type = cl_xml_document=>c_bor_classtype
    object_name = gs_class-clsname.
    * Simply generate sections of XML document
    * First create root section
    g_xml->set_data( name = c_xml_root
    dataobject  = gs_class ).
    class_root = g_xml->find_node( name   = c_xml_root ).
    * All other sections will be under the root (see parent_node)
    g_xml->set_data( name = c_xml_attributes
    parent_node = class_root
    dataobject  = gt_attributes ).
    g_xml->set_data( name = c_xml_methods
    parent_node = class_root
    dataobject  = gt_methods ).
    g_xml->set_data( name = c_xml_events
    parent_node = class_root
    dataobject  = gt_events ).
    g_xml->set_data( name = c_xml_types
    parent_node = class_root
    dataobject  = gt_types ).
    g_xml->set_data( name = c_xml_parameters
    parent_node = class_root
    dataobject  = gt_parameters ).
    g_xml->set_data( name = c_xml_exceps
    parent_node = class_root
    dataobject  = gt_exceps ).
    g_xml->set_data( name = c_xml_implementings
    parent_node = class_root
    dataobject  = gt_implementings ).
    g_xml->set_data( name = c_xml_impl_details
    parent_node = class_root
    dataobject  = gt_impl_details ).
    g_xml->set_data( name = c_xml_friendships
    parent_node = class_root
    dataobject  = gt_friendships ).
    g_xml->set_data( name = c_xml_typepusages
    parent_node = class_root
    dataobject  = gt_typepusages ).
    g_xml->set_data( name = c_xml_clsdeferrds
    parent_node = class_root
    dataobject  = gt_clsdeferrds ).
    g_xml->set_data( name = c_xml_intdeferrds
    parent_node = class_root
    dataobject  = gt_intdeferrds ).
    g_xml->set_data( name = c_xml_aliases
    parent_node = class_root
    dataobject  = gt_aliases ).
    g_xml->set_data( name = c_xml_inheritance
    parent_node = class_root
    dataobject  = gs_inheritance ).
    g_xml->set_data( name = c_xml_interfaces
    parent_node = class_root
    dataobject  = gt_interfaces ).
    g_xml->set_data( name = c_xml_redefinitions
    parent_node = class_root
    dataobject  = gt_redefinitions ).
    g_xml->set_data( name = c_xml_typesource
    parent_node = class_root
    dataobject  = type_source ).
    * Extract local definitions (classes, macros)
    DEFINE set_locals.
    refresh gt_source.
    call function 'SEO_CLASS_GET_INCLUDE_SOURCE'
    exporting
    clskey                       = class
    inctype                      = &1
    importing
    source_expanded              = gt_source
    exceptions
    _internal_class_not_existing = 0
    not_existing                 = 0
    others                       = 0.
    g_xml->set_data( name = &2
    parent_node = class_root
    dataobject  = gt_source ).
    END-OF-DEFINITION.
    DATA:
    include_name TYPE programm.
    CALL FUNCTION 'SEO_CLASS_GET_INCLUDE_BY_NAME'
    EXPORTING
    clskey   = class
    limu     = seok_limu_locals
    IMPORTING
    progname = include_name.
    set_locals:
    include_name c_xml_locals_src,
    seop_ext_class_locals_def c_xml_locals_def,
    seop_ext_class_locals_imp c_xml_locals_imp,
    seop_ext_class_macros c_xml_locals_mac.
    * Extract text pool
    DATA:
    gt_texts TYPE TABLE OF textpool.
    CALL FUNCTION 'SEO_CLASS_GET_INCLUDE_BY_NAME'
    EXPORTING
    clskey   = class
    IMPORTING
    progname = include_name.
    READ TEXTPOOL include_name INTO gt_texts LANGUAGE sy-langu.
    g_xml->set_data( name = c_xml_text_pool
    parent_node = class_root
    dataobject  = gt_texts ).
    * Create section for method source.
    * Then each metod as a single node under the common section
    section = g_xml->create_simple_element( name   = c_xml_method_src
    parent = class_root ).
    LOOP AT gs_includes ASSIGNING <include>.
    REFRESH gt_source.
    CALL FUNCTION 'SEO_METHOD_GET_SOURCE'
    EXPORTING
    mtdkey                        = <include>-cpdkey
    state                         = 'A'
    IMPORTING
    source_expanded               = gt_source
    EXCEPTIONS
    _internal_method_not_existing = 1
    _internal_class_not_existing  = 2
    version_not_existing          = 3
    inactive_new                  = 4
    inactive_deleted              = 5
    OTHERS                        = 6.
    CHECK sy-subrc = 0.
    mtd_name = <include>-cpdkey-cpdname.
    g_xml->set_data( name = mtd_name
    parent_node = section
    dataobject  = gt_source[] ).
    ENDLOOP.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    * Now display resulting XML-file or export it into workstation file
    mtd_name = class.
    IF p_show = 'X'.
    g_xml->display( ).
    EXIT.
    ENDIF.
    DATA:
    user_action TYPE i,
    path TYPE string,
    full_path TYPE string,
    file_name TYPE string.
    CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
    default_extension    = 'xml'
    default_file_name    = mtd_name
    file_filter          = cl_gui_frontend_services=>filetype_xml
    CHANGING
    filename             = file_name
    path                 = path
    fullpath             = full_path
    user_action          = user_action
    EXCEPTIONS
    cntl_error           = 1
    error_no_gui         = 2
    not_supported_by_gui = 3
    OTHERS               = 4.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
    CHECK user_action = cl_gui_frontend_services=>action_ok.
    DATA:
    localfile TYPE localfile.
    localfile = full_path.
    g_xml->export_to_file( filename = localfile ).
    *&---------------------------------------------------------------------*
    *&      Form  get_type_source
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *      -->VALUE(P_TYPKEY)  text
    *      -->P_SOURCE         text
    *----------------------------------------------------------------------*
    FORM get_type_source  USING    value(p_typkey) TYPE seocmpkey
    CHANGING p_source TYPE seop_source.
    STATICS:
    loaded,
    private_section TYPE seop_source,
    protected_section TYPE seop_source.
    DATA:
    filename TYPE progstruc,
    expanded_srouce TYPE seop_source_string,
    type TYPE vseotype.
    FIELD-SYMBOLS:
    <dest> TYPE seop_source.
    IF loaded IS INITIAL.
    class_include p_typkey srext_ext_class_protected filename.
    READ REPORT filename INTO expanded_srouce.
    protected_section[] = expanded_srouce[].
    class_include p_typkey srext_ext_class_private filename.
    READ REPORT filename INTO expanded_srouce.
    private_section[] = expanded_srouce[].
    loaded = 'X'.
    ENDIF.
    CALL FUNCTION 'SEO_TYPE_GET'
    EXPORTING
    typkey  = typkey
    version = seoc_version_inactive
    IMPORTING
    type    = type
    EXCEPTIONS
    OTHERS  = 0.
    IF type-exposure = seoc_exposure_protected.
    ASSIGN protected_section TO <dest>.
    ELSE.
    ASSIGN private_section TO <dest>.
    ENDIF.
    PERFORM extract_type_source(saplseop)
    USING <dest> type-srcrow1 type-srccolumn1
    type-srcrow2 type-srccolumn2
    CHANGING p_source.
    *  CALL FUNCTION 'SEO_CLASS_GET_TYPE_SOURCE'.
    ENDFORM.                    " GET_TYPE_SOURCE
    

    [Edit section] Include YRS_CLASS_XML_CONST

    *&---------------------------------------------------------------------*
    *&  Include           YRS_CLASS_XML_CONST
    *&---------------------------------------------------------------------*
    CONSTANTS:
    c_xml_root TYPE string VALUE 'CLASS_ROOT',
    c_xml_public TYPE string VALUE 'PUBLIC_SECTION',
    c_xml_protected TYPE string VALUE 'PROTECTED_SECTION',
    c_xml_private TYPE string VALUE 'PRIVATE_SECTION',
    c_xml_inheritance TYPE string VALUE 'INHERITANCE',
    c_xml_friends TYPE string VALUE 'FRIENDS',
    c_xml_interfaces TYPE string VALUE 'INTERFACES',
    c_xml_redefinitions TYPE string VALUE 'REDEFINITIONS',
    c_xml_typesource TYPE string VALUE 'TYPE_SOURCE',
    c_xml_locals_src TYPE string VALUE 'LOCALS_SRC',
    c_xml_locals_def TYPE string VALUE 'LOCALS_DEF',
    c_xml_locals_imp TYPE string VALUE 'LOCALS_IMP',
    c_xml_locals_mac TYPE string VALUE 'LOCALS_MAC',
    c_xml_method_src TYPE string VALUE 'METHOD_SOURCE'.
    CONSTANTS:
    c_xml_attributes TYPE string VALUE 'ATTRIBUTES',
    c_xml_methods TYPE string VALUE 'METHODS',
    c_xml_events TYPE string VALUE 'EVENTS',
    c_xml_types TYPE string VALUE 'TYPES',
    c_xml_parameters TYPE string VALUE 'PARAMETERS',
    c_xml_exceps TYPE string VALUE 'EXCEPTIONS',
    c_xml_implementings TYPE string VALUE 'IMPLEMENTINGS',
    c_xml_impl_details TYPE string VALUE 'IMPL_DETAILS',
    c_xml_friendships TYPE string VALUE 'FRIENDSHIPS',
    c_xml_typepusages TYPE string VALUE 'TYPEPUSAGES',
    c_xml_clsdeferrds TYPE string VALUE 'CLSDEFERRDS',
    c_xml_intdeferrds TYPE string VALUE 'INTDEFERRDS',
    c_xml_aliases TYPE string VALUE 'ALIASES',
    c_xml_text_pool TYPE string VALUE 'TEXT_POOL'.
    

    [Edit section] Sample class

    This is tiny yet useful ABAP class, implementing progress indicator functionality by utilizing SAPGUI_PROGRESS_INDICATOR function module. Sometimes you need to show a progress of some process. For example, you can process quite large internal table in a loop. Also it should be better to show progress only when it really changes and not very often or else a user can see blinking watch-icon in the GUI status line. Also it would be nice not to bother with percent calculation. All this can be done with ZCL_PROGRESS_INDICATOR class. First, call its START method to define total amount of process steps (say internal table line count) and status line text. Also you can set percent threshold which defines frequency of progress indicator updates. If you set threshold to 5 then the progress indicator will be updated less often than 5% of step count. Next, call ADVANCE method on every countable process step (say on every loop step). It will show progress when needed and increment internal progress counts. Also you can call SET method to set current progress absolutely. Finally, call FINISH method to clear GUI status line.

    Save the contents of this page starting with <?xml version="1.0"?> tag and ending with </CLASS_ROOT> tag, then save it as XML file and finally upload with YRS_UPLOAD_CLASS_XML report.

    <?xml version="1.0" encoding="utf-16"?> <CLASS_ROOT>

     <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Progress indicator</DESCRIPT>
    <UUID>CHTdPkI0GECU1I4g7Jzm4A==</UUID>
    <CATEGORY>00</CATEGORY>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <RELEASE>0</RELEASE>
    <AUTHOR>SKOROLEV</AUTHOR>
    <CREATEDON>2005-10-19</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <CHGDANYON>0000-00-00</CHGDANYON>
    <FIXPT>X</FIXPT>
    <UNICODE>X</UNICODE>
    <R3RELEASE>700</R3RELEASE>
    <CLSBCCAT>00</CLSBCCAT>
    <DURATION_TYPE>0</DURATION_TYPE>
    <RISK_LEVEL>0</RISK_LEVEL>
    <ATTRIBUTES>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>PROGRESS_TEXT</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Progress text</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>1</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>STRING</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>HIGH_BOUND</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>High bound</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>2</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>TIME_LIMIT</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>System time out limit</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>3</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTRDONLY>X</ATTRDONLY>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>F</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>CURRENT_PROGRESS</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Current indicator value (absolute)</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>4</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTRDONLY>X</ATTRDONLY>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>LAST_SHOWN_PROGRESS</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Last shown indicator value (absolute)</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>1</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>TRESHOLD</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Percent treshold</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>2</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START_TIME_STAMP</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Start time</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>3</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>TIMESTAMP</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>TRESHOLD_SEC</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Treshold in seconds</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>4</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>STEP_TIME_STAMP</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>step timestamp</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>5</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <ATTDECLTYP>0</ATTDECLTYP>
    <ATTEXPVIRT>0</ATTEXPVIRT>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>TIMESTAMP</TYPE>
    <SRCROW1>0</SRCROW1>
    <SRCCOLUMN1>0</SRCCOLUMN1>
    <SRCROW2>0</SRCROW2>
    <SRCCOLUMN2>0</SRCCOLUMN2>
    <R3RELEASE>700</R3RELEASE>
    <TYPESRC_LENG>0</TYPESRC_LENG>
    </item>
    </ATTRIBUTES>
    <METHODS>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Start progress</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>FINISH</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Finish progress, clear status line</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>2</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>ADVANCE</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Advance indicator relatively</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>3</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>SET</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Set indicator absolutely</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>4</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START_TIME</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Start Time checking</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>5</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>SET_STATUS_TEXT</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Set Status Text</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>6</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>RESET_TIME</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>reset times</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>CHECK_TIME</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>check elapsed time</DESCRIPT>
    <EXPOSURE>0</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>2</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <MTDTYPE>0</MTDTYPE>
    <MTDDECLTYP>0</MTDDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCMTDCAT>00</BCMTDCAT>
    <BCMTDSYN>0</BCMTDSYN>
    </item>
    </METHODS>
    <EVENTS>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>ON_TIMEOUT</CMPNAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Fired when system timeout treshold exceeded</DESCRIPT>
    <EXPOSURE>2</EXPOSURE>
    <STATE>1</STATE>
    <EDITORDER>1</EDITORDER>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <EVTDECLTYP>0</EVTDECLTYP>
    <R3RELEASE>700</R3RELEASE>
    <BCEVTCAT>00</BCEVTCAT>
    </item>
    </EVENTS>
    <TYPES/>
    <PARAMETERS>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>ADVANCE</CMPNAME>
    <SCONAME>I_STATUS_TEXT</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Status line text</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>ANY</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>ADVANCE</CMPNAME>
    <SCONAME>I_STEP</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Advance step</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>2</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <PARVALUE>1</PARVALUE>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>ON_TIMEOUT</CMPNAME>
    <SCONAME>I_PERCENT_REMAINING</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Number of percent remaining in curr process</DESCRIPT>
    <CMPTYPE>2</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>1</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>SET</CMPNAME>
    <SCONAME>I_STATUS_TEXT</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Status line text</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>ANY</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>SET</CMPNAME>
    <SCONAME>I_PROGRESS</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>New indicator value (absolute)</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>2</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>SET_STATUS_TEXT</CMPNAME>
    <SCONAME>I_STATUS_TEXT</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Status line text</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>ANY</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <SCONAME>I_STATUS_TEXT</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Status line text</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>1</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>ANY</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <SCONAME>I_HIGH_BOUND</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Maximum step count</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>2</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <PARVALUE>100</PARVALUE>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <SCONAME>I_PERCENT_TRESHOLD</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Percent treshold to update indicator and status
    

    line</DESCRIPT>

         <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>3</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <PARVALUE>5</PARVALUE>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <SCONAME>I_ANY_TAB</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Data table to count the high bound</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>4</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>1</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>ANY TABLE</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    <item>
    <CLSNAME>ZCL_PROGRESS_INDICATOR</CLSNAME>
    <CMPNAME>START</CMPNAME>
    <SCONAME>I_SEC_TRESHOLD</SCONAME>
    <VERSION>1</VERSION>
    <LANGU>E</LANGU>
    <DESCRIPT>Seconds treshold</DESCRIPT>
    <CMPTYPE>1</CMPTYPE>
    <MTDTYPE>0</MTDTYPE>
    <EDITORDER>5</EDITORDER>
    <DISPID>0</DISPID>
    <AUTHOR>KOROLESE</AUTHOR>
    <CREATEDON>2006-07-31</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    <PARDECLTYP>0</PARDECLTYP>
    <PARPASSTYP>0</PARPASSTYP>
    <TYPTYPE>1</TYPTYPE>
    <TYPE>I</TYPE>
    <PAROPTIONL>X</PAROPTIONL>
    </item>
    </PARAMETERS>
    <EXCEPTIONS/>
    <IMPLEMENTINGS/>
    <IMPL_DETAILS/>
    <FRIENDSHIPS/>
    <TYPEPUSAGES/>
    <CLSDEFERRDS/>
    <INTDEFERRDS/>
    <ALIASES/>
    <INHERITANCE>
    <VERSION>0</VERSION>
    <STATE>0</STATE>
    <CREATEDON>0000-00-00</CREATEDON>
    <CHANGEDON>0000-00-00</CHANGEDON>
    </INHERITANCE>
    <INTERFACES/>
    <REDEFINITIONS/>
    <TYPE_SOURCE/>
    <LOCALS_SRC/>
    <LOCALS_DEF/>
    <LOCALS_IMP/>
    <LOCALS_MAC/>
    <TEXT_POOL>
    <E/>
    </TEXT_POOL>
    <METHOD_SOURCE>
    <ADVANCE>
    <item>METHOD advance.</item>
    <item>  DATA:</item>
    <item>    l_progress TYPE i.</item>
    <item/>
    <item>  l_progress = current_progress + i_step.</item>
    <item>  CALL METHOD set( i_status_text = i_status_text</item>
    <item>                   i_progress = l_progress ).</item>
    <item>ENDMETHOD.</item>
    </ADVANCE>
    <FINISH>
    <item>METHOD finish.</item>
    <item>  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'.</item>
    <item>ENDMETHOD.</item>
    </FINISH>
    <SET>
    <item>METHOD set.</item>
    <item>  DATA:</item>
    <item>    text TYPE string,</item>
    <item>    delta TYPE i,</item>
    <item>    timestamp TYPE timestamp,</item>
    <item>    last_percent TYPE i,</item>
    <item>    need_show,</item>
    <item>    l_new_progress TYPE i.</item>
    <item/>
    <item>  current_progress = i_progress.</item>
    <item>  IF current_progress > high_bound.</item>
    <item>    current_progress = high_bound.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>  l_new_progress = 100 * current_progress / high_bound.</item>
    <item>  CHECK last_shown_progress NE l_new_progress.</item>
    <item/>
    <item>  last_percent = 100 - treshold.</item>
    <item/>
    <item>  CALL METHOD check_time.</item>
    <item/>
    <item>  IF  treshold_sec > 0</item>
    <item>  AND l_new_progress < last_percent.</item>
    <item>    GET TIME STAMP FIELD timestamp.</item>
    <item>    IF timestamp > step_time_stamp.</item>
    <item>      CALL FUNCTION 'SRET_TIME_DIFF_GET'</item>
    <item>           EXPORTING</item>
    <item>                utc_start = step_time_stamp</item>
    <item>                utc_end   = timestamp</item>
    <item>           IMPORTING</item>
    <item>                second    = delta</item>
    <item>           EXCEPTIONS</item>
    <item>                paramerr  = 0</item>
    <item>                OTHERS    = 0.</item>
    <item/>
    <item>      IF delta > treshold_sec.</item>
    <item>        need_show = 'X'.</item>
    <item>        step_time_stamp = timestamp.</item>
    <item>      ENDIF.</item>
    <item>    ENDIF.</item>
    <item>  ELSE.</item>
    <item>    delta = abs( l_new_progress - last_shown_progress ).</item>
    
         <item>    IF delta >= treshold.</item>
    <item>      need_show = 'X'.</item>
    <item>    ENDIF.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>  IF  need_show = 'X'.</item>
    <item/>
    <item>    last_shown_progress = l_new_progress.</item>
    <item/>
    <item>    IF i_status_text IS INITIAL.</item>
    <item>      text = progress_text.</item>
    <item>    ELSE.</item>
    <item>      text = i_status_text.</item>
    <item>    ENDIF.</item>
    <item/>
    <item>    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'</item>
    <item>         EXPORTING</item>
    <item>              percentage = last_shown_progress</item>
    <item>              text       = text.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>ENDMETHOD.</item>
    </SET>
    <START>
    <item>METHOD start.</item>
    <item>  CLEAR:</item>
    <item>    current_progress,</item>
    <item>    last_shown_progress.</item>
    <item/>
    <item>  treshold = i_percent_treshold.</item>
    <item>  progress_text = i_status_text.</item>
    <item/>
    <item>  GET TIME STAMP FIELD step_time_stamp.</item>
    <item/>
    <item>  IF i_any_tab[] IS INITIAL.</item>
    <item>    high_bound = i_high_bound.</item>
    <item>  ELSE.</item>
    <item>    DESCRIBE TABLE i_any_tab LINES high_bound.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>  IF high_bound > 0.</item>
    <item>    last_shown_progress = 1.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>  IF i_sec_treshold > 0.</item>
    <item>    treshold_sec = i_sec_treshold.</item>
    <item>  ENDIF.</item>
    <item/>
    <item>  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'</item>
    <item>       EXPORTING</item>
    <item>            percentage = last_shown_progress</item>
    <item>            text       = i_status_text.</item>
    <item/>
    <item/>
    <item>ENDMETHOD.</item>
    </START>
    <RESET_TIME>
    <item>METHOD reset_time.</item>
    <item>  DATA:</item>
    <item>    e_value TYPE spfpflpar-pvalue.</item>
    <item/>
    <item>  GET TIME STAMP FIELD start_time_stamp.</item>
    <item/>
    <item>  CALL FUNCTION 'RSAN_SYSTEM_PARAMETER_READ'</item>
    <item>       EXPORTING</item>
    <item>            i_name     = 'rdisp/max_wprun_time'</item>
    <item>       IMPORTING</item>
    <item>            e_value    = e_value</item>
    <item>       EXCEPTIONS</item>
    <item>            read_error = 0</item>
    <item>            OTHERS     = 0.</item>
    <item/>
    <item>  time_limit = e_value + e_value / 2.</item>
    <item/>
    <item>ENDMETHOD.</item>
    </RESET_TIME>
    <CHECK_TIME>
    <item>METHOD check_time.</item>
    <item>  DATA:</item>
    <item>    diff TYPE i,</item>
    <item>    l_remaining_percent TYPE i,</item>
    <item>    current_time TYPE timestamp.</item>
    <item/>
    <item>  CHECK NOT start_time_stamp IS INITIAL</item>
    <item>  AND   NOT time_limit       IS INITIAL.</item>
    <item/>
    <item>  GET TIME STAMP FIELD current_time.</item>
    <item>  CHECK current_time > start_time_stamp.</item>
    <item/>
    <item>  CALL FUNCTION 'SRET_TIME_DIFF_GET'</item>
    <item>       EXPORTING</item>
    <item>            utc_start = start_time_stamp</item>
    <item>            utc_end   = current_time</item>
    <item>       IMPORTING</item>
    <item>            second    = diff</item>
    <item>       EXCEPTIONS</item>
    <item>            paramerr  = 0</item>
    <item>            OTHERS    = 0.</item>
    <item/>
    <item>  IF diff > time_limit.</item>
    <item>    CALL METHOD reset_time.</item>
    <item/>
    <item>    l_remaining_percent = 100 - 100 * current_progress /
    

    high_bound.</item>

         <item>    RAISE EVENT on_timeout</item>
    <item>      EXPORTING i_percent_remaining =
    

    l_remaining_percent.</item>

         <item>  ENDIF.</item>
    <item>ENDMETHOD.</item>
    </CHECK_TIME>
    <START_TIME>
    <item>METHOD start_time.</item>
    <item>  CALL METHOD reset_time.</item>
    <item>ENDMETHOD.</item>
    </START_TIME>
    <SET_STATUS_TEXT>
    <item>METHOD set_status_text .</item>
    <item>  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'</item>
    <item>    EXPORTING</item>
    <item>      text = i_status_text.</item>
    <item>ENDMETHOD.</item>
    </SET_STATUS_TEXT>
    </METHOD_SOURCE>
    

    </CLASS_ROOT>

  • 相关阅读:
    Assembly Manifest 通俗简易手册
    CruiseControl服务器安装配置
    关于URL编码
    从A到Z来说说Web开发
    通过注册表查看 .NET Framework的版本信息
    云数据存在哪里?
    C#中你可能不知道的8件事(zz)
    用PBKDF2 或BCrypt 来存储密码
    C++编译器什么时候为我们自动生成拷贝构造函数?
    C#中你可能不知道的8件事(zz)
  • 原文地址:https://www.cnblogs.com/byfhd/p/859829.html
Copyright © 2020-2023  润新知