Wednesday 9 November 2016

How to get the new ABAP editor in LSMW

SAP LSM Workbench (LSMW) has for years been a much used tool for data migration into SAP. It is both loved and hated  While LSMW has had its last update in 2004 it remains a much used tool in this age of more modern toolsets such as SLT,  SAP DS and the like.

For many frequent and hard core users of LSMW a big nuisance is the old style ABAP editor. This old editor takes up alot of development time, especially in those ABAP-rich LSMW projects.

One night, bored and out of beer, I managed to develop a relatively simple enhancement that enables the new ABAP editor for LSMW.

How to get the new ABAP editor in LSMW

Compare that with what you have been working with for the last decades:

How to get the new ABAP editor in LSMW

Features
  • New ABAP editor for all ABAP coding within LSMW (field mappings, events, user defined routines and form routines)
  • Code completion
  • Use of the Pretty printer
  • Use of the ABAP Syntax checker
  • Use of ABAP patterns
  • No Modification required, just a single implicit enhancement spot
  • Fix of a small LSMW bug where the wrong line is highlighted when doing a syntax check in the __GLOBAL DATA__
Limitations
  • Code completion is not aware of globally defined variables
  • A few, more exotic, editor menu commands are not working and will return ‘Function not implemented’
  • The use of Edit–>Find/Replace issues warning and will eventually cause a short dump (but who needs this function eh?)
The enhancement

The implementation of the new ABAP editor takes just one single Implicit enhancement spot. No modification or any other unwanted hacking! It has been tested on an ECC 606 system with LSMW version 4.0.0 (2004) and SAP Basis 731/02.

1. Create an Implicit enhancement spot  at the start of Subroutine EDITOR_START of Function group /SAPDMC/LSMW_AUX_080

How to get the new ABAP editor in LSMW

2. Paste in the code attached to this post & activate.
3. Create a user parameter ZLSMW_NEWEDITOR  in SE80.
Assign the parameter with value ‘X’ to each user that wants to use the new editor. All other users will not be affected.
4. Temporary solution to prevent lines > 72 char getting chopped off (as reported by Cyrus below):
– Open SE80 and go to Utilities –> settings
– Check the flag ‘Downwards-Comp. Line Lngth(72)’ and save.

How to get the new ABAP editor in LSMW

This will draw a thin red line at position 72 in the editor and will auto-fit lines when they go over 72 chars. This will be a global setting so also your SE38 will now look like this. 

Give it a try and inform me of any bugs. As stated above not all user commands work. All the important ones do and most of the others I have managed to catch and issue a friendly ‘not implemented’ message. 

" Joris Bots - Jan. 2016 - info@armadaconsulting.nl
" Posted on http://scn.sap.com
" Enable the new ABAP editor in LSMW
" Using user parameter 'ZLSMW_NEWEDITOR' to enable/disable per user
DATA lv_display_new.
DATA lv_fcode      TYPE sy-ucomm.
DATA lv_linecount  TYPE i.
DATA lv_continue   TYPE c VALUE 'X'.
DATA lv_editorstat TYPE editorstat.
DATA lv_new        TYPE c VALUE 'X'.
DATA lv_offset     TYPE sy-index.
DATA lv_line       TYPE sy-index.
DATA lv_message    TYPE string.
DATA lv_cursor     TYPE char1.
DATA lv_firstline  TYPE num6 VALUE '000001'.
DATA lt_usrpar     TYPE ustyp_t_parameters.
FIELD-SYMBOLS <ls_usrpar> LIKE LINE OF lt_usrpar.

" Check if user parameter 'ZLSMW_NEWEDITOR' = 'X' for this user
" if not, use standard editor
CALL FUNCTION 'SUSR_USER_PARAMETERS_GET'
  EXPORTING
    user_name           = sy-uname
  TABLES
    user_parameters     = lt_usrpar
  EXCEPTIONS
    user_name_not_exist = 1
    OTHERS              = 2.
IF sy-subrc <> 0.
  " Just continue.
ENDIF.

READ TABLE lt_usrpar WITH KEY parid = 'ZLSMW_NEWEDITOR' ASSIGNING <ls_usrpar>.
IF <ls_usrpar> IS ASSIGNED.
  IF <ls_usrpar>-parva = 'X'.

    CASE p_mode.
      WHEN con_mode_change OR con_mode_administrate.
        lv_display_new = no.
      WHEN OTHERS.
        lv_display_new = yes.
    ENDCASE.

"Inserting ABAP coding with S_DEVELOP authority only
    IF lv_display_new = no.
      AUTHORITY-CHECK OBJECT 'S_DEVELOP'
        ID 'DEVCLASS' DUMMY
        ID 'OBJTYPE'  DUMMY
        ID 'OBJNAME'  DUMMY
        ID 'P_GROUP'  DUMMY
        ID 'ACTVT'    FIELD '02'.
      IF sy-subrc NE 0.
        MESSAGE s003.
        lv_display_new = yes.   " toggle mode
      ENDIF.
    ENDIF.

    WHILE lv_continue = abap_true.
      CALL FUNCTION 'EDITOR_APPLICATION'
        EXPORTING
          anfangszeile       = lv_firstline
          application        = 'OB'         "This triggers new ABAP editor
*         CALLED_BY_SCRP     = ' '
          cursor             = lv_cursor
          display            = lv_display_new
*         DYNPRO_MODIFIED    = ' '
*         FBNAME             = ' '
          line               = lv_line
          message            = lv_message
*         NAME               = ' '
          new                = lv_new
          offset             = lv_offset
          varied             = lv_editorstat-changed  "Send back changed flag after code check
*         TRDIR_INF          = ' '
          title_text         = p_title
*         EXTEND_MOD         = ' '
*         EDITOR_MODE        = ' '
          callback_program   = '/SAPDMC/SAPLLSMW_AUX_080'
          callback_usercom   = 'EDITOR_CALLBACK_USER_COMMAND'
*         callback_set_pfkey = 'EDITOR_CALLBACK_SET_STATUS'
        IMPORTING
          changed            = p_flg_changed
*         DISPLAY            =
          fcode              = lv_fcode
*         PARAMETER          =
*         ANFANGSZEILE_O     =
*         LINE_O             =
*         OFFSET_O           =
        TABLES
          content            = pt_coding
        EXCEPTIONS
          line               = 1
          linenumbers        = 2
          offset             = 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.

      "Keep changed flag once p_flg_changed is X at one point
      IF p_flg_changed = abap_true.
        lv_editorstat-changed = abap_true.
      ENDIF.

      "Map Editor's user commands to commands LSMW framework understands
      "And prevent editor to show again when we do not want that (when pressing Back)
      CASE lv_fcode.
        WHEN 'OBCH'.
          lv_editorstat-fcode = 'CHCK'.
          lv_cursor = abap_true.
        WHEN 'SBCK'.
          lv_editorstat-fcode = 'BACK'.
          lv_continue = abap_false.
        WHEN 'OBUP'.
          lv_editorstat-fcode = 'OOSV'.
*        lv_continue = abap_false.
        WHEN OTHERS.
          MESSAGE 'Function not implemented' TYPE 'S'.
      ENDCASE.

      "Let LSMW framework handle user commands
      PERFORM editor_callback_user_command
                  TABLES
                     pt_coding
                  USING
                     lv_editorstat.

      "After a check, set the line/offset values and recall the editor
      IF lv_editorstat-fcode = 'CHCK'.
        lv_linecount   = lines( pt_coding ).
        lv_message     = lv_editorstat-message.
        lv_offset      = lv_editorstat-coffset.
        lv_line        = lv_editorstat-cline.
        IF lv_line > lv_linecount.
          "Don't overshoot the actual number of lines of the code (LSMW bug)
          lv_line = 1.
        ENDIF.
        lv_firstline = lv_line - 5. "First visible line number, triggers scroll down
        IF lv_firstline < 1.
          lv_firstline = 1.
        ENDIF.
      ELSE.
        CLEAR: lv_message, lv_line, lv_offset, lv_firstline.
      ENDIF.

      lv_new = abap_false.
    ENDWHILE.
    RETURN. "Do not process the rest of this Form
  ENDIF.
ENDIF.

No comments:

Post a Comment