Skip to Content

In our company we have a big project migrating many coustomer clients from old systems to new systems (easy summarizied). For this they had to do several module-specific things, so that the migration with is automated in many points works succesfully.

For that our consultants must give our customers some training. This costs time for both sides and could be boring too 🙂

You don’t know if they understand the topics the first time and if they could do that in practice.

So we decided to find a soloution for that. And we did. So i decided to share a bit of my experiences developing that tool, because its a big help for our consultants and of course for our customers.

The answer for why we integrate a video-based training tool in our SAP-System is the proximity to the system. So our customers could track which user watched which video or the customers could use some help tools within the training tool, where they could jump to specific points in the sstem where they have something to do.

I decided to use the Floorplan Manager as UI-Technology, because you could use HTML and JavaScript within it for embedding our videos, which are the heart of our tool. Now there are first wishes to use the tool on mobile phone so it would have made sense to use Fiori/UI5. But there were other circumstances that made this difficult in this case.


For the Video I used a HTML_Container

METHOD process_event .

  DATA ls_row TYPE zcl_lst_schulung=>ty_list.

  CHECK wd_this->lo_html IS BOUND.

  IF io_event->mv_event_id EQ 'EV_SELECTED_ROW'.
               iv_key   = 'SELECTED_ROW'
               ev_value = ls_row

    IF ls_row-videolink IS INITIAL.

      wd_this->lo_html->set_html( '<p align="center"><b>Es wurde kein Video ausgewählt</b></p>' ).


      DATA(l_string) = '<video width="100%" height="100%" controls autoplay preload="none">'
      && '<source src=" ' && ls_row-videolink && '" type="video/mp4">'
      && 'Browser unterstützt keine Videos'
      && '</video>'.
      wd_this->lo_html->set_html( l_string ).

  elseif io_event->mv_event_id NE if_fpm_guibb_list=>gc_guibb_list_on_cell_action "Speichern und Auswahl in Liste ignorieren
         AND io_event->mv_event_id NE if_fpm_constants=>gc_event-save
         AND io_event->mv_event_id NE if_fpm_constants=>gc_event-edit.
      wd_this->lo_html->set_html( '<p align="center"><b>Es wurde kein Video ausgewählt</b></p>' ).



In Application I used the normal list UIBB whcich fires an event for a single click. Then in the Component Controller of the WD-Component I catch the event.


We have several pages in our tool with different videos. So that we could distinguish the videos and we could chance the links flexible(videos are in our intranet), I used BRF+.

There I store the links, where the videos belong to and if they are showed in the tool or not.

E.G. distinguish which videos are shown on which page

E.G. Video Information (e.g. videolinks)

So because of less personal contact I added two options for asking for a call or for a webinar, where our customers get a mail.

METHOD if_fpm_guibb_form~process_event.
    TYPES: BEGIN OF ty_mailadress,
             mailadress TYPE char100,
           END OF ty_mailadress.
    DATA mt_mailadress TYPE TABLE OF ty_mailadress. "Mailadressen

        iv_key   = 'DIALOG_BOX_ID'
        ev_value = m_dialog_box_id
        iv_key   = 'DIALOG_BUTTON_ACTION'
        ev_value = m_button

    "Pflichtefelder prüfen
    IF ( ms_rueckmeldung-kunde IS INITIAL OR ms_rueckmeldung-name IS INITIAL OR ms_rueckmeldung-telefon IS INITIAL )
        AND NOT ( m_button EQ if_fpm_constants=>gc_dialog_action_id-close OR m_button EQ if_fpm_constants=>gc_dialog_action_id-cancel ).
      et_messages = VALUE #( ( msgid = 'ZN_SCHULUNG' msgno = '002' severity = 'E' ) ).
      ev_result = if_fpm_constants=>gc_event_result-failed.

    IF m_button EQ if_fpm_constants=>gc_dialog_action_id-ok. "Anfrage senden

      "Mailadressen holen
      CONSTANTS:lv_function_id TYPE if_fdt_types=>id VALUE '005056AD48AD1ED7B28C9B8E681414E6'.
      DATA:lv_timestamp  TYPE timestamp,
           lt_name_value TYPE abap_parmbind_tab,
           ls_name_value TYPE abap_parmbind,
           lr_data       TYPE REF TO data,
           lx_fdt        TYPE REF TO cx_fdt.
      FIELD-SYMBOLS <la_any> TYPE any.
      GET TIME STAMP FIELD lv_timestamp.
      cl_fdt_function_process=>get_data_object_reference( EXPORTING iv_function_id      = lv_function_id
                                                                    iv_data_object      = '_V_RESULT'
                                                                    iv_timestamp        = lv_timestamp
                                                                    iv_trace_generation = abap_false
                                                          IMPORTING er_data             = lr_data ).
      ASSIGN lr_data->* TO <la_any>.
          cl_fdt_function_process=>process( EXPORTING iv_function_id = lv_function_id
                                                      iv_timestamp   = lv_timestamp
                                            IMPORTING ea_result      = <la_any>
                                            CHANGING  ct_name_value  = lt_name_value ).
        CATCH cx_fdt INTO lx_fdt.

      mt_mailadress = CORRESPONDING #( <la_any> ).
      IF mt_mailadress IS NOT INITIAL.

        DATA(lo_bcs_message) = NEW cl_bcs_message( ).
        lo_bcs_message->set_sender( '' ).
        lo_bcs_message->set_subject( |{ SWITCH #( m_dialog_box_id WHEN 'CALL' THEN 'Rückruf' WHEN 'WEBINAR' THEN 'Webinar' ) } angefordert für { ms_rueckmeldung-kunde }({ sy-sysid }/{ sy-mandt })| ).
        LOOP AT mt_mailadress ASSIGNING FIELD-SYMBOL(<ls_mailadress>).
          lo_bcs_message->add_recipient( CONV #( <ls_mailadress> ) ).
        lo_bcs_message->set_send_immediately( abap_true ).
            iv_contents_bin = get_mail_body( )     " Hauptdokument, 1. Bodypart (binär)
            iv_doctype      = 'htm'    " Dokumententyp
            lo_bcs_message->send( ).
            et_messages = VALUE #( ( msgid = 'ZN_SCHULUNG' msgno = '003' severity = 'S' ) ).
          CATCH cx_bcs_send INTO DATA(lo_cx).
            et_messages = VALUE #( ( severity = 'E' plaintext = lo_cx->get_longtext( ) ) ).


        et_messages = VALUE #( ( msgid = 'ZN_SCHULUNG' msgno = '004' severity = 'E' ) ).




So there is the functionallity for customers to check if they watched a video. This dates are stored in a normal table so that our customers can check which customer watched which video and if they are in correct timeplan.

Furthermore there are some more nice features like helpful reports combined with bounces and so on which help our customers to do their tasks much faster.

I just wanted to share some of my experience and maybe stimulate the imagination of what’s possible in SAP. A video-based training tool integrated into the SAP-system was something completely new for our customers and consultants.

I would be very interested if someone has already implemented something in the direction and if so how and with what background. 🙂


To report this post you need to login first.


You must be Logged on to comment or reply to a post.

  1. nabheet madan

    Thanks Sascha Wächter  for the blog. It actually triggered my mind:). We have been using knowledge management, FAQ etc. and recently a chat bot to help the end users. Video will definitely add more value i agree.


  2. Jelena Perfiljeva

    Wow, this is a very cool project! Nice and simple. And I agree too that videos can be quite helpful. Even when you train in person, people tend to forget over time what they learned. Or just get overwhelmed by all the new information.

    Thank you for sharing!



Leave a Reply