Test slow network speed for FIORI and web developments

If you are working with users across the globe you will be faced with performance complaints for your FIORI apps and web developments.

To analyze these user complaints you need to throttle you network speed so it is behaving like a far way computer:

  • Lower bandwidth
  • Higher ping response times

The applications you develop close to the server on fast network can become very sluggish when used by distant users. It is your job as developer to analyze this issues and to improve your design to have less roundtrips.

Network throttling in Chrome

The full details of Chrome network throttling can be found here.

Short instruction:

  1. Open the developer tools with F12 and go to the Network settings

2. Select the No throttling and create a new profile:

3. Now select your profile:

Enjoy the new end user experience. Don’t forget to switch back to your normal speed!

Code and table generation

In some cases you need to regenerate specific coding and tables. An SGEN is too extensive for your situation.

Regenerate programs

Use program TOUCHSRC:

Or worst case program TOUCHALL:

Regenerate tables

For table regeneration run program TOUCHTAB:

And TOUCHINC for includes in table structures:

Consistency checks

To perform a check concerning the consistency between the ABAP dictionary and the runtime object, use the ABAP program RSNTABCONSISTENCY. To perform a check concerning the consistency between the database and the runtime object, use the ABAP program RUTDBCHK. Read more in OSS note 526394 – Information about ABAP Dictionary error analysis.

Background

Background OSS notes:

Best practice notes:

TRDIR and TADIR: tables behind programs and tables

TRDIR and TADIR are the tables behind programs and table data.

The below section is for experts only. Sometimes direct interception in TRDIR or TADIR is needed to solve nasty upgrade and support package issues. But if you don't know what you are doing: don't touch and raise message to SAP.

TADIR: development objects

TADIR contains the development objects list.

For example you want to know how many Z classes are created in your system, search in TADIR with SE11 and count the records:

Using TADIR with a search on DEVCLASS $TMP will give you a list with all programs in the $TMP (temp) space.

TADIR also has information about the original system. To change: follow the instructions in this blog.

TADIR does not contain a program editor lock. This is stored in table PROGDIR. See more in this blog.

Background notes on TADIR:

TRDIR: source code

TRDIR is a view on table REPOSRC. REPOSRC contains the actual ABAP source codes in RAWSTRING format. In some cases inconsistencies between TRDIR and TADIR might happen (mainly during upgrades). Direct interception on TADIR or TRDIR level might be needed, if you know what you are doing.

Transaction STDR can be used to check consistency:

Background notes on TRDIR:

Network performance tips & tricks

One of the most irritating and annoying things in the basis area is when the network gives issues. For whatever reason.

This blog will give hints and tips on how to recognize network issues and options to analyze them.

SAP notes on network performance

Main OSS note is: 1100926 – FAQ: Network performance.

Main SAP wiki on network performance can be found via this link.

Detailed analysis notes:

Specific issues with application to database server issues:

Check if database is the issue, or network:

Network issues on Azure:

LAN check

Check by ST06: start the LAN check by Ping:

Or directly via transaction OS01:

SAP GUI network issues

If the user is far away from the server, network issues can be cause of slow transactions for the end user.

SAP GUI slow connection can be set on creation of GUI entry, or by right clicking on the GUI entry and then selecting the network option:

FIORI and web developments

FIORI tiles and web developments might be slow with users further away from the server. If the application has many round trips built in the increase network latency will definitely kill the end user performance.

Read more in this blog on how you can simulate a distant user in Chrome to analyze the issue.

Clean ABAP code ATC variant

Clean ABAP is the ABAP variant of the clean code principles. All background on clean ABAP code can be read in this blog.

This blog will explain how to upload the ABAP coding for the Clean ABAP ATC variant in your system and activate it.

Load ABAP Git code

To load the ATC variant code for clean ABAP you first need to install the ABAP Git code. Follow the instructions in this blog to do so. Simplest is the offline variant.

Download the ABAP clean code package

Now go to the Github code pal site for ABAP clean code and download the package:

Select the button Code and choose the option Download ZIP.

Upload the package

Now start the ABAP git that you loaded in your first step. Choose the option New Offline:

Give the repository a name and select a package:

Then push the button Create Offline Repo.

Now select Import Zip:

Import the file you downloaded in step 2 from the code pal site.

Next step is the Pull zip:

You might get a screen with differences. Do not select anything there, only press Ok.

Then wait until all the Y objects are pulled into the system. This might take 5 to 10 minutes.

Activating the SCI checks

Now start transaction SCI. Select menu option Code Inspector, Management of, Tests. Select all the newly load Y checks for Clean ABAP code:

Important now: Save them!

Now you can create a global SCI variant:

Select all the Clean code ABAP checks and save the variant:

You might get weird issues upon saving for other items, like for example missing CL_CI_CATEGORY_TOP. In that case, go to transaction SE16 -> look for table SCITESTS -> and look for CL_CI_CATEGORY_TOP if there is no entry. Enter the table SCITESTS and click "Create Entry", add CL_CI_CATEGORY_TOP entry and save.

Test and usage

Take a program you want check. Then select menu option Program, Check, ABAP Test Cockpit with….:

Select the ZCLEAN_ABAP SCI check we created above. Run the checks.

Results:

Tip: click on the blue line to jump to the Clean Code site exactly explaining about the issue.

Clean ABAP Eclipse plug-in: ABAP cleaner

To speed up clean ABAP in practice, you can install the clean ABAP cleaner plug-in. Read this blog on how to do this.

Clean ABAP

Clean ABAP is the ABAP implementation of Clean code. Clean code is one of the key principles to adhere to when going Agile. Clean code is part of agile software development craftmanship. Read more on clean code in the original book.

Clean ABAP reference site

Clean ABAP is published and maintained on a dedicated Clean ABAP Github site.

The site itself is excellent and also has a special chapter how to best start with Clean ABAP.

The site is extensive and might be overwhelming. If you are a more traditional person, you can also read the SAP Press book on Clean ABAP code.

Blog on SAP site on clean ABAP can be found here and here.

Patterns and anti-patterns

The Clean ABAP explanation on the site contains both patterns (how you should do) and anti-patterns (how you should not do).

Anyhow the Clean ABAP principles are fully built on Object Orientation. That is a must.

Introducing Clean ABAP in your organization

Regardless if your organization is doing Agile or Waterfall development, or other development methodologies, Clean ABAP can be applied anyhow.

First step is to embrace the Clean ABAP as a principle direction. It will take time to get there. Not all developers will pick up as fast as you might want to. It also takes time to refactor old code to the Clean ABAP principles.

Discuss as developers as a team which part of the principles and improvements you want to pick up first. If you master a few, you can make it mandatory. Then take the next set. Some might pick up more at a higher pace. But keep the discussion going to improve and pick up every 2 weeks (sprint) at least 1 improvement item.

For a nice overview: read this SAP blog.

Peer review or pair programming: ATC variant

You can make the Clean ABAP code rules a part of your peer review or pair programming.

There is an ATC variant that can be uploaded that check for the clean ABAP code rules. Read this blog for instructions on how to do this.

Boy Scout rule

The boy scout rule is as follows: leave the place nicer than when you arrived, even though you didn’t make the mess. When you do this repetitively the world becomes a cleaner place.

This also applies to poor code: don’t just do your change, but take along some minor improvements as well. When you do this a couple of times, the poor code will improve every time towards good code.

But this principle you also need to embrace and explain. There might be unlucky situations where the clean up part might cause unexpected bug. This might happen in 0.01% of the cases. When it happens you might get resistance and pushback. But stand up for the principle, and simply correct the bug. It is worth it in the long run.

Clean ABAP Eclipse plug-in: ABAP cleaner

To speed up clean ABAP in practice, you can install the clean ABAP cleaner plug-in. Read this blog on how to do this.

ODATA V4 activation

This blog will explain how to activate ODATA V4.

Questions that will be answered in this blog are:

  • How to activate ODATA V4 on your SAP system?
  • Does SAP support ODATA V3?
  • Do all consuming applications support ODATA V4?
  • What are the differences of ODATA V2 and V4?

ODATA V4

In the typical FIORI use case you will activate ODATA V2. SAP has skipped ODATA V3. ODATA V4 is supported by SAP.

Constraints of SAP ODATA V4 are listed in OSS note 2322624 – SAP Gateway SAP_GWFND OData V4 protocol – Known Constraints.

Filtering is powerful in ODATA V4. Read more on this in OSS note 2305033 – SAP Gateway OData V4 $flter Consulting Note.

Keep in mind not all application fully support all aspects of ODATA V4 or might not be able to consume ODATA V4 at all. Check first with the consumer before publishing an ODATA on V4.

Activation of ODATA V4

First step in activation is to check the virus scan settings for ODATA:

Activation of ODATA V4 messages via service administration:

Or use transaction /iwbep/v4_admin:

And for the front end /iwfnd/v4_admin:

Press button Add service groups:

Push the button Get Service Groups:

And select your entry and press Publish Service Groups:

Which one to publish has to be told to you. The consultant requesting it might link to the API hub.

After activation, you can use the Service Test button to check if the activation is ok:

On the screen hit Execute and the result should be a HTTP 200 success message:

OSS notes and background

Background notes:

Bug fix OSS notes:

Useful background blogs:

Differences between ODATA V2 and V4

For UI consumption differences between ODATA V2 and V4 read this SAP help file.

Generic blog on main differences ODATA V2 and V4: read here.

Or read this SAP blog on differences ODATA V2 and V4 for SAP specific.

Deleting SAP office documents

In your system the amount of SAP office documents is consuming more and more space. You want to clean up these tables: BCST_CAM, BCST_SR, SOC3, SOFFCONT1, SOFM, SOOD, SOOS, SOST. This blog will explain how.

Questions that will be answered are:

  • How to reduce size of tables BCST_CAM, BCST_SR, SOC3, SOFFCONT1, SOFM, SOOD, SOOS, SOST?
  • How to run the clean up programs before running RSBCS_REORG?
  • How to run program RSBCS_REORG?

SAP office documents to content server

If table SOFFCONT1 is growing fast, you can migrate data to the content server. This might be the easiest solution. Read more in this blog.

See also note 1634908 – Reduce the number of entries of table SOFFCONT1.

See OSS note 3225275 – BC-SRV-COM Guided Answer for the guided Q&A.

Preparations before running RSBCS_REORG

SAP office documents are stored in table SOFFCONT1, and can be deleted with program RSBCS_REORG. See note 966854 – Reorganization – new report. Note 988057 – Reorganization – information contained in the past a very useful PDF document that explains what to do in cases that RSBCS_REORG is not directly can delete an SAP office document. This was removed, but you can download it here:

In most cases you have to run a special program that breaks the link between the document and the data. After that is done you can delete the content. Extra explanation is in OSS note 1641830 – Reorganization of Business Communication Services data (RSBCS_REORG).

Set expiration date

Run program RSBCS_SREQ_EXPIRE (see OSS note 1478279 – Deleting send requests that have not expired) to set the expiration date when needed:

This will remove the expiry dates.

Release the send requests

Run program RSBCS_SREQ_RELEASE (see OSS note 1238740 – Deleting unreleased send requests):

Don’t select too much data, otherwise the program will dump (see note 3033843 – Program RSBCS_SREQ_RELEASE failed with dump TSV_TNEW_PAGE_ALLOC_FAILED).

This will release the send requests for deletion.

But it will only do so if a document is attached. Apply OSS note 3256308 – Initial send requests are not released to get new program RSBCS_SREQ_INITIAL_RELEASE:

This will also release the send request for deletion in case there is no document attached.

Unlink document from application

Run program RSBCS_SREQ_UNLINK (see note 1276402 – Send requests cannot be deleted due to links) to unlink the the document from the object:

Document is in SAP connect queue

Documents might still be in the SAP connect queue. Use program RSBCS_DELETE_QUEUE (see OSS note 1244680 – Deleting send requests from the queue) to remove the queue for the documents:

Document is in a folder

If the document is in a folder it might be in different sort of folder:

  • Hidden folder
  • Private folder
  • Document has GOS link
Document is in a hidden folder

Run program RSSODFRE (see OSS note 567975 – Hidden folder: Reorganization) to delete documents from the hidden folders:

Document is in a private folder

Run program RSSO_DELETE_PRIVATE (see OSS note 922671 – Deleting folder entries) to delete from private folder:

Document has GOS link

To be able to delete document with GOS link, run program RSGOSRE01 (see OSS notes 569123 – Reorganizing documents from generic object services, 1641800 – How to delete ‘Has links to GOS/Document not sent’ documents from the Hidden folder and 2016688 – RSGOSRE01: New selection parameters):

Or run program RSGOSRE02 (OSS note 2031234 – RSGOSRE02: Reorganizing documents from generic object services):

Running RSBCS_REORG

Program RSBCS_REORG will not archive, but only delete.

Test this first and check with the data owner that the documents are no longer needed.

Program RSBCS_REORG selection criteria:

Output:

Double clicking on the line will show the details for the issue why you cannot delete.

Bug fix OSS notes for RSBCS_REORG:

ABAP to content server check

A content server can be used to store attachments and other documents. In some cases both the ABAP stack and content server are up and running, but the connection between the two is broken for some reason.

This blog will provide a check program which you can plan in a batch job to check the connection between the ABAP stack content repository and the the content server.

Questions that will be answered in this blog are:

  • How can I automate the content server check?
  • How can I be alerted if the connection between ABAP stack and content server is broken?

The OAC0 connection check

In transaction OAC0 for maintaining the content server link there is a check button:

We will use the function module SCMS_HTTP_PING which is behind this button for our custom code ABAP test program.

Custom code ABAP check program for testing the ABAP to content server connection

Load this ABAP code into your system and create the texts:

*&---------------------------------------------------------------------*
*& Report ZCSCHECK
*&---------------------------------------------------------------------*
REPORT ZCSCHECK.

DATA: z_ok TYPE boolean.
CONSTANTS: c_mesid      TYPE char3 VALUE 'ZZZ', "system log message ID defined in SE92
           c_zero       TYPE string VALUE '0 ',
           c_secirity_n TYPE c VALUE 'N',
           c_secirity_s TYPE c VALUE 'S'.
PARAMETERS p_crep TYPE scms_crep MATCHCODE OBJECT h_crep_http.

* initialize ok code
  z_ok = abap_true.

*Fetch http server details
  SELECT SINGLE crep_id, http_serv, http_port, http_sport, http_scrpt, version
         FROM   crep_http INTO @DATA(ls_crep)
         WHERE  crep_id = @p_crep.
  IF sy-subrc EQ 0.
    IF NOT ls_crep-http_port CO c_zero OR
            ls_crep-http_sport CO c_zero.
      CALL FUNCTION 'SCMS_HTTP_PING'
        EXPORTING
          crep_id    = ls_crep-crep_id
          http_serv  = ls_crep-http_serv
          http_port  = ls_crep-http_port
          http_sport = ls_crep-http_sport
          http_scrpt = ls_crep-http_scrpt
          version    = ls_crep-version
          security   = c_secirity_n"'N'
        EXCEPTIONS
          error_http = 1
          OTHERS     = 2.
      IF sy-subrc <> 0.
        z_ok = abap_false. "not ok
      ENDIF.
    ENDIF.
*Check Security with S
    IF z_ok <> abap_false AND NOT ls_crep-http_sport CO c_zero.
      CALL FUNCTION 'SCMS_HTTP_PING'
        EXPORTING
          crep_id    = ls_crep-crep_id
          http_serv  = ls_crep-http_serv
          http_port  = ls_crep-http_port
          http_sport = ls_crep-http_sport
          http_scrpt = ls_crep-http_scrpt
          version    = ls_crep-version
          security   = c_secirity_s"'S'
        EXCEPTIONS
          error_http = 1
          OTHERS     = 2.
      IF sy-subrc <> 0.
        z_ok = abap_false. "not ok
      ENDIF.
    ENDIF.

    IF z_ok = abap_false. "not ok
* write to SM21 system log
      WRITE: / TEXT-004. "ping not ok
      CALL FUNCTION 'RSLG_WRITE_SYSLOG_ENTRY'
        EXPORTING
          sl_message_area    = c_mesid(2)
          sl_message_subid   = c_mesid+2
          data_word1         = ls_crep-crep_id
        EXCEPTIONS
          data_missing       = 1
          data_words_problem = 2
          other_problem      = 3
          pre_params_problem = 4
          OTHERS             = 5.

      IF sy-subrc EQ 0.
        WRITE: / TEXT-001  , ls_crep-crep_id. "succes to write to SM21
      ELSE.
        WRITE: / TEXT-002  , ls_crep-crep_id. "fail to write to SM21
      ENDIF.
    ELSE.
      WRITE: / TEXT-003  ,  ls_crep-crep_id. "ping ok
    ENDIF.
  ELSE.
    WRITE: / TEXT-004  ,  ls_crep-crep_id. "Ping to webservice not ok
  ENDIF.

The program uses function module SCMS_HTTP_PING to test the connection. In case of issues it will write an entry to the application log. Use SE92 to create a new system log message. You can choose to replace this code by sending a mail or do anything else.

Running the check program

Running the program is simple:

If the connection fails it writes an entry to SM21.

In case you have multiple content repositories to check: create multiple variants and run the program in background with multiple steps.