Skip to Content
Author's profile photo Former Member

Workaround – SAPAddMessage triggers AfterRedisplay callback

Analysis will trigger an AfterRedisplay callback (if you’ve registered a callback procedure) after a wide array of events, and you might think that some of those events shouldn’t cause a redisplay, but they do. For example, viewing the help file, the about dialog or cancelling the prompts dialog all trigger an AfterRedisplay callback.

One of the actions that triggers an AfterRedisplay callback is the SAPAddMessage API method, and it will trigger the callback every time you call SAPAddMessage, so if you’re adding multiple messages, Analysis will execute the callback multiple times.

Analysis does recognise when you’ve called SAPAddMessage from within the AfterRedisplay callback stack, and will stop the AfterRedisplay procedure from triggering itself…. So you won’t inadvertantly cause an infinite loop by calling SAPAddMessage from within the AfterRedisplay procedure stack.

However, in other parts of your code, you could potentially trigger AfterRedisplay multiple times. So, how do you add multiple messages without triggering AfterRedsiplay multiple times? I’ve solved this problem by setting a global VBA variable. You could possibly use Application.Run(“SAPExecuteCommand”, “PauseVariableSubmit”, “Off”), or temporarily deregister the callback using Application.Run(“SAPExecuteCommand”, “UnregisterCallback”, “AfterRedisplay”) to achieve similar results.

Here’s my global variable approach:

1. Define a global VBA variable named bSkipCallBack:

    Public bSkipCallBack as Boolean ‘This will default to False

2. In your AfterRedisplay callback procedure, make the code execution depend upon the global variable:

    Public Sub callback_AfterRedisplay()

      If bSkipCallBack Then

         Exit Sub


         ‘Do AfterRedisplay actions here


      End If

    End Sub

3. Elsewhere in your code, when you need to call SAPAddMessage multiple times, set the global variable to True, add your messages, and then revert the variable to false

    Private Sub AddMessages()

      bSkipCallback = True

      Application.Run(“SAPAddMessage”, “First of many messages”, “INFORMATION”)

      ‘More messages here


      bSkipCallback = False

    End Sub

Assigned Tags

      Be the first to leave a comment
      You must be Logged on to comment or reply to a post.