Tag:

  • Creating a Data Enrichment for SAP VIM Solutions Beyond Invoice (+ free Template)

    This article is intended for informational purposes only and does not supersede or replace the official documentation provided by OpenText. It serves as supplementary guidance to assist with common challenges that may arise during installation and upgrades. For authoritative instructions and compliance requirements, refer to OpenText’s official documentation.

    A data enrichment is a logic or learning based data manipulation which can run, for example, at the begin of a process. From a usage point it is very comparable with a logic module in the VIM Invoice process.

    Please note that this article is not about the VIM Invoice process but VIM Solutions Beyond Invoice which is, for example, used to process sales orders, quotations, remittance advices, order confirmations or fully custom document processes (including capture & recognition using OpenText Intelligent Capture for SAP Solutions [IC4S]).

    To be precise, Solutions Beyond Invoice describes the supplied solution packages, while the Foundation describes the creation of customised solutions, actions, rules and so on. For the sake of simplicity, I will refer to both as Solutions Beyond Invoice.

    In the following steps I will describe how to create a logic based data enrichment for SAP VIM Solutions Beyond Invoice.

    In case you are interested about learning based data enrichments please check the
    OpenText Vendor Invoice Management for SAP Solutions – Configuration Guide for Foundation.

    In case you are interested about using logic modules for the VIM Invoice process please refer to the OpenText Vendor Invoice Management for SAP Solutions – Configuration Guide for Invoice Solution.

    VIM Solutions Beyond Invoice is formerly known as Business Center and sometimes referred to as VIM Beyond.

    In earlier versions, data was changed with the help of business rules. This is becoming obsolete today and should therefore be avoided. Business rules check data, data enrichments change data. It is easy to convert old business rules into data enrichments.

    Creating a data enrichment ABAP class

    The initial step in this process is to create a new class that is both appropriately named and described, while adhering to the relevant naming conventions. You case use for example SE24 or SE80 to achieve this.

    It is essential to add the correct interface for data enrichments. In the version I am working with, this is /OTX/PF04_IF_DATA_ENRICH_EX.

    /OTX/PF04_IF_DATA_ENRICH_EX

    The implementation is carried out in method /OTX/PF04_IF_DATA_ENRICH_EX~DATA_ENRICH_LOGIC.

    /OTX/PF04_IF_DATA_ENRICH_EX~DATA_ENRICH_LOGIC

    I use the following minimalist template for my projects. It already declares the structures, table and field symbol which are needed for processing header and line information. In addition, the success marker is set, if you forget this, the data enrichment is not even executed.

    As the naming conventions for variables and the tables used change from project to project, I recommend creating this template once for each project.

    If the data enrichment is only executed at the start of the process, it will be helpful to use a debug loop. But beware: If only the VIM Solutions Beyond Invoice Invoices solution is used in the system, but not the packages for invoice processing, a custom debug table in the style of /opt/cp_debug must be created.

    ABAP TYPE […]_pli. ” line item table lt_pli = pct_item. * ls_plh = pcs_head. pe_success = ‘X’. LOOP AT lt_pli ASSIGNING . […] ENDLOOP. IF pe_success = ‘X’. * pcs_head = ls_plh. ” update header information pct_item[] = lt_pli[]. ” update item information ENDIF. ENDMETHOD.” style=”color:#657B83;display:none” aria-label=”Copy” class=”code-block-pro-copy-button”>
      METHOD /otx/pf04_if_data_enrich_ex~data_enrich_logic.
    
    * Optional: Debug loop
    
        DATA: ls_plh TYPE [...]_plh, " header table
              lt_pli TYPE TABLE OF [...]_pli, " line item table
              ls_msg TYPE bapiret2.
    
        FIELD-SYMBOLS:  TYPE [...]_pli. " line item table
    
        lt_pli = pct_item.
    *   ls_plh = pcs_head.
    
        pe_success = 'X'. 
    
        LOOP AT lt_pli ASSIGNING .
          [...]
        ENDLOOP.
    
        IF pe_success = 'X'.
    *     pcs_head = ls_plh. " update header information
          pct_item[] = lt_pli[]. " update item information
        ENDIF.
    
      ENDMETHOD.

    Whenever data is changed, I recommend issuing a helpful and transparent message to users so that they know what has been changed and why. Here is an example of what such a message could look like in the code. You can of course also assemble the messages (ls_msg) manually, but I find the option mentioned here easier to read.

    ABAPmessage_return_build EXPORTING pi_type = ‘S’ ” “S” = Success / “E” = Error / “I” = Info pi_cl = ‘Z…’ ” name of your message class pi_number = 019 ” your message number. pi_par1 = ” message parameter 1 pi_par2 = ” message parameter … ” […] IMPORTING pes_return = ls_msg. APPEND ls_msg TO pet_return.” style=”color:#657B83;display:none” aria-label=”Copy” class=”code-block-pro-copy-button”>
    DATA ls_msg TYPE bapiret2.
    
    " [...]
    
    CALL METHOD /otx/pf02_cl_error_message=>message_return_build
      EXPORTING
        pi_type    = 'S' " "S" = Success / "E" = Error / "I" = Info
        pi_cl      = 'Z...' " name of your message class
        pi_number  = 019  " your message number.
        pi_par1    = " message parameter 1
        pi_par2    = " message parameter ...
        " [...]
      IMPORTING
        pes_return = ls_msg.
        
      APPEND ls_msg TO pet_return.

    Customizing for a SAP VIM Solutions Beyond Invoice Data Enrichment

    Now we have created the class for our data enrichment and still have to create the corresponding customising, which can be done very quickly in the transaction /otx/pf00_img.

    /otx/pf00_img

    Navigate to Process Configuration > Profiles:

    Select your Profile Configuration and navigate to the corresponding Version Definition and then Data Enrichment Configuration. Here you can now create a Data Enrichment ID with a speaking name and description.

    The enrichment point decides when a data enrichment should be executed. For my example I select ALL to execute it at all enrichment points.

    Even if a data enrichment should only run at the beginning of the process, I like to use ALL at the beginning of my implementation because the jump to the debugger is super quick. Simply set a breakpoint in the class, execute the Enrich Data action and you are already in the ABAP Debugger and can analyse if everything is working according to plan.

    The last step is often forgotten in data enrichments because it was not necessary in earlier versions. The newly created Data Enrichment ID must still be assigned to the corresponding Characteristics Configuration and given a sequence.

    I have created a data enrichment but it is not working

    If your data enrichment does not work, please check the following points:

    • Is the success marker pe_success returned with true (‘X’)?
    • Is the newly created Data Enrichment Configuration active? There is a checkbox on the far right which can easily be overlooked.
    • Have you perhaps overlooked the last point Assign Data Enrichments?
    • Perhaps your debug loop can help you here? If this is not activated, this can also be a finding.

    Conclusion

    When using SAP VIM Solutions Beyond Invoice, there is no getting round the use of data enrichments. Only with these can the process be properly tidied up and optimised.

    Don’t forget to issue transparent and helpful messages for the users and make sure that the data enrichments run in a sensible sequence.

    I wish you every success with the implementation!

  • Using ABAP Debug Loops in OpenText Vendor Invoice Management for SAP Solutions (SAP VIM)

    When analysing problems in OpenText Vendor Invoice Management for SAP Solutions (SAP VIM), depending on the system architecture and authorisations, there are parts of the source code that are very difficult to access with the ABAP debugger. This is the case, for example, with data enrichments (e.g. logical modules) executed by a background user at the start of the process.

    A debug loop is an endless loop in the code which you can activate when required. The infinite loop allows you to find and debug the running code in the process monitor.

    Adding a debug loop to your ABAP code

    In order to be able to use a debug loop, it is first necessary for it to exist. This is the case in many parts of the product standard, but should not be forgotten in custom developments either. A debug loop can look like this, for example:

    ABAP
    DO.  
    
      SELECT SINGLE value 
      FROM /opt/cp_debug 
      INTO @DATA(lv_debug) 
      WHERE debugarea = 'Z_LOGIC_MODULE'.  " keep text below 20 chars
        
      IF lv_debug IS INITIAL.  
        EXIT.  
      ENDIF. 
         
    ENDDO.  

    Activating a debug loop using the ABAP Editor SE38

    The table /opt/cp_debug has some advantages over self-built tables. It is used in the product standard and the loop can be activated and deactivated with the ABAP Editor (SE38) using the program /OPT/VIM_DEBUG.

    If a debugging area is activated, the system remains in an infinite loop until it is deactivated again or until the infinite loop is exited manually in the debugger.

    But be careful, the debug loop runs for all users on the system, so this tool should only be used with caution. In the production system only in absolutely exceptional cases and only for a short time in consultation with the system supervisor.

    Some consultants even comment out the coding for debug loops before productive operation, but I find that the possibility of debugging in the P system can be a great advantage for tracking down tricky errors.

    Tip: As you often spend a long time in the code when debugging, I suggest that the debugging loop is always exited via /OPT/VIM_DEBUG. This way you cannot forget to deactivate the loop.

    Starting the debugger in Work process overview (SM50)

    If your debug loop is active, you are ready to go: Provoke the system to run the loop, for example by processing a new document.

    As soon as the corresponding line in the source code is run through, the process stops and we have the opportunity to jump to the debugger, for which we use the transaction code SM50.

    To make it easy to find our process, we switch to the Active Work Processes view.

    If you cannot find your process, have a look at the System-Wide List. The process you are looking for may be running on a different application server.

    Now we can select our process and start it via Administration > Program > Debugging in the ABAP Debugger and eliminate the error.

    Do you have any tips or best practices for dealing with debug loops in ABAP? Let us know in the comments!