https://raw.githubusercontent.com/ajmaradiaga/feeds/main/scmt/topics/NW-ABAP-Business-Rule-Framework-(BRFplus)-blog-posts.xml SAP Community - NW ABAP Business Rule Framework (BRFplus) 2024-05-20T11:11:04.794910+00:00 python-feedgen NW ABAP Business Rule Framework (BRFplus) blog posts in SAP Community https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/purchase-order-output-management-via-brf-in-s4/ba-p/13511685 Purchase order output management via BRF+ in S4 2021-06-28T18:31:34+02:00 former_member751951 https://community.sap.com/t5/user/viewprofilepage/user-id/751951 <H1 id="toc-hId-829244833">Introduction :</H1><BR /> In this article, I will explain the complete set up required for output management to work for Purchase order in SAP S/4HANA using BRF+.<BR /> <H1 id="toc-hId-632731328">1. Definition of BRF+</H1><BR /> BRF+ is an application programming interface (API) and user interface for defining and processing business rule. It allows us to model rules in an intuitive way and to reuse these rules in different applications.<BR /> <BR /> BRF plus is also used in output management to<BR /> <UL><BR /> <LI>Issue business documents in response to certain business events</LI><BR /> <LI>External communication such as printouts, faxes, and e-mails with a print preview option</LI><BR /> <LI>Alerts</LI><BR /> <LI>Workflow</LI><BR /> </UL><BR /> Its main characteristics are:<BR /> <UL><BR /> <LI>It offers a unified solution for all output-related tasks across the product.</LI><BR /> <LI>It can be natively integrated into SAP Fiori apps (and SAPGUI apps).</LI><BR /> <LI>It provides a new option for form templates (separation of static layout &amp; content).</LI><BR /> <LI>It supports ready-to-use output scenarios (pre-delivered configuration).</LI><BR /> <LI>It supports standard extensibility for configuration &amp; documents (form &amp; email templates).</LI><BR /> <LI>It provides central monitoring tools.</LI><BR /> <LI>It runs in a cloud or an on-premise environment.</LI><BR /> </UL><BR /> With SAP S/4 HANA a new <STRONG>Output Management</STRONG> approach is in place. The complete configuration differs from the configuration that is used when output management is based on NAST (condition technique). The configuration is based on BRF+. In SAP S/4 HANA, the target architecture is based on Adobe Document Server and Adobe Forms only. For the form determination rules (along with other output parameters) BRF+ functionality is used.<BR /> <H1 id="toc-hId-436217823">2.1 Key Benefits:</H1><BR /> &nbsp;<BR /> <BR /> All output parameters can be automatically determined via a configuration activity based on BRFplus. The benefits are:<BR /> <UL><BR /> <LI>You can send multiple messages to multiple recipients using multiple channels at the same time.</LI><BR /> <LI>You can configure anything without the need for ABAP exits.</LI><BR /> <LI>You can base each determination step on application-specific fields that can be extended.</LI><BR /> <LI>You can use predelivered content/determination rules to simply run output control out of the box.</LI><BR /> <LI>Extensibility via CDS is supported.</LI><BR /> </UL><BR /> <H1 id="toc-hId-239704318"><A name="_Toc74756411" target="_blank"></A>2.2. Conversion NAST to BRF+</H1><BR /> <UL><BR /> <LI>ECC to HANA for new Output there is no tools available at the moment</LI><BR /> <LI>When converting to HANA from ECC only New PO’s will be coming in BFR+ if activated</LI><BR /> <LI>In 1511 only Sales Invoice and PO and available</LI><BR /> <LI>When it comes to 1709 12+ XML Forms and added</LI><BR /> </UL><BR /> <H1 id="toc-hId-43190813"><A name="_Toc74756412" target="_blank"></A><STRONG>3. Prerequisites:</STRONG></H1><BR /> <STRONG>&nbsp;</STRONG><BR /> <UL><BR /> <LI><STRONG>bgRFC configuration</STRONG>&nbsp;has been&nbsp;set up and prefixes for OM_QBGRFC_INBOUND_DEST (Define Inbound Dest.) are not modified (default value: OM_QUEUE)</LI><BR /> <LI><STRONG>Storage system and category&nbsp;</STRONG>has been maintained (KPRO)</LI><BR /> <LI><STRONG>BRFplus</STRONG>&nbsp;is active and&nbsp;usable</LI><BR /> <LI><STRONG>Adobe Document Services</STRONG>&nbsp;are available (only when using Adobe Forms)</LI><BR /> </UL><BR /> <H1 id="toc-hId--153322692"><STRONG>4. Configuration Steps:</STRONG></H1><BR /> <H2 id="toc-hId--220753478"><STRONG>&nbsp;</STRONG><STRONG>4.1. Switching from NAST to BRF+ </STRONG></H2><BR /> In order to switch from NAST to BRF+, we need to activate in IMG<BR /> <BR /> If It’s switched, we will not be able to use old way of NAST for output.<BR /> <UL><BR /> <LI>For Purchase orders, go to&nbsp;<EM>IMG</EM>&nbsp;→ Integration with Other SAP Components →&nbsp;<EM>Business Network Integration</EM>&nbsp;→&nbsp;<EM>Integration with the Ariba Network Application-specific settings&nbsp;</EM>→<EM>&nbsp;Define Message Output Control&nbsp;</EM>→&nbsp;<EM>Method 2: Use SAP S/4HANA-Based Output Management</EM>&nbsp;→&nbsp;<EM>Activate or Deactivate SAP S/4HANA-Based Output Management</EM></LI><BR /> </UL><BR /> Mode needs to be new output management is active<BR /> <BR /> &nbsp;<BR /> <H1 id="toc-hId--546349702"><A name="_Toc74756413" target="_blank"></A><A name="_Toc74590984" target="_blank"></A>4.2. Steps for configuring BRF+</H1><BR /> <STRONG>&nbsp;</STRONG><BR /> <OL><BR /> <LI>Storage repository settings.</LI><BR /> <LI>Import of BRF Plus application</LI><BR /> <LI>Activation of object type.</LI><BR /> <LI>Assign Output channel</LI><BR /> <LI>Define determination of Form master template</LI><BR /> <LI>Business Rules for output determination</LI><BR /> </OL><BR /> <STRONG>&nbsp;</STRONG><BR /> <H2 id="toc-hId--613780488"><A name="_Toc74591566" target="_blank"></A><STRONG>4.2.1. Storage system and repository.</STRONG></H2><BR /> <STRONG>&nbsp;</STRONG><BR /> <BR /> <STRONG>&nbsp;</STRONG>SAP Menu: SPRO &gt; Cross-Application Components &gt; Document Management &gt; General Data &gt; Settings for Storage Systems &gt; Maintain Storage System<BR /> <BR /> OR transaction Code: OAC0<BR /> <BR /> Create new entry SOMU_DB with following data (<STRONG>part of standard SAP</STRONG> )<BR /> <BR /> Storage type: SAP System Database<BR /> Storage subtype: Normal<BR /> Version: 0047<BR /> Content table: SFORM_A_STORAGE<BR /> <BR /> Now Go to transaction OACT and assign the content repository thus created to category SOMU<BR /> <H1 id="toc-hId--939376712"><A name="_Toc74756414" target="_blank"></A>4.2.2. Import of BRF Plus application:</H1><BR /> <STRONG>&nbsp;</STRONG><BR /> <BR /> Download relevant application file from SAP note – 2248229 – SAP S/4HANA output management – BRFplus files. Save these in your local system drive.<BR /> <BR /> If this is not uploaded, you will not see the output type in OPD transaction<BR /> <BR /> For Purchase order the file will be OPD_EF_PURCHASE_ORDER.xml:<BR /> <BR /> This will require a workbench TR<BR /> <H1 id="toc-hId--366150134"><A name="_Toc74756415" target="_blank"></A>4.2.3. Object type activation :</H1><BR /> Below Node of SPRO will be used for all configuration of output type<BR /> <BR /> IMG customization -&gt; Cross-Application Components -&gt; Output Control -&gt; Manage Application Object Type Activation<BR /> <BR /> In the path go to New entry and specify the object type as Purchase order and status as application active .<BR /> <H1 id="toc-hId--562663639"><A name="_Toc74756416" target="_blank"></A>4.2.4. Create output type:</H1><BR /> An output type represents a business document of a single application and defines the output parameters for that document.<BR /> <BR /> In new entry enter object type as Purchase_order and assign it to output type Purchase_order .<STRONG>&nbsp;</STRONG><BR /> <H1 id="toc-hId--759177144"><A name="_Toc74756417" target="_blank"></A>4.2.5. Assign Output Channels:</H1><BR /> In this step output channels selected wrt supported channels by output types. To prevent the end user from selecting output channels that are not applicable for a output type, only those output channels that can actually be used should be displayed in the applications.<BR /> <H1 id="toc-hId--955690649"><A name="_Toc74756418" target="_blank"></A>4.2.6. Define Rules for Determination of Master Form Template:</H1><BR /> Every time a document is output by the end user in an application, these rules identify the master form template that is to be used. The rules are based on several parameters: sender data, channel, and form template.<BR /> <BR /> Note: Master form templates can contain placeholders for static data, for example, a logo and a footer. This data is displayed on each form page. In this activity, you can assign SAPscript texts and graphics to these placeholders.<BR /> <BR /> <STRONG>4.2.7. Assign Form Templates:</STRONG><BR /> <BR /> <STRONG>&nbsp;</STRONG>With this activity, you can ensure that business applications use the correct predelivered and custom form templates.<BR /> <BR /> ( If this is not maintained correctly the output type will be in error Message no. APOC_OR_MESSAGES354)<BR /> <H1 id="toc-hId--1152204154">4.2.8. Define business rules for output determination:</H1><BR /> Business rules are created and maintained in BRFplus decision tables. These rules are used to determine the output parameters of specific business objects. Each rule comprises several determination steps connected to specific parameters. If you leave a column in the decision table blank, any value is deemed as satisfying the condition.<BR /> <BR /> The customization for this is done in following customization menu path<BR /> <BR /> IMG customization à Cross-Application Components à Output Control à Define business rules for output determination<BR /> <BR /> Transaction Code : OPD<BR /> <BR /> It opens in browser<BR /> <BR /> After selecting Purchase order determination steps can be configured<BR /> <H2 id="toc-hId--1642120666"><STRONG>i. </STRONG><STRONG>Rules for Output type :</STRONG></H2><BR /> Document type and Dispatch time can be set as per requirement, It needs to be activated<BR /> <H2 id="toc-hId--1838634171"><STRONG>ii. Rules for Receiver:</STRONG></H2><BR /> In drop down for show rules for select Purchase_order and in drop down for determination steps select receiver<BR /> <BR /> Change the mode to Edit mode<BR /> <BR /> Specify output type as Purchase order and role as “LF” for vendor.<BR /> <H2 id="toc-hId--2035147676"><STRONG>iii. Rules for channel determination:</STRONG></H2><BR /> Specify output type as Purchase order, role as “LF” for vendor and channel as Email, Print and IDOC in three different rows, if required.<BR /> <H2 id="toc-hId-2063306115"><STRONG>iv. Rules for Printer settings:</STRONG></H2><BR /> n drop down for show rules for select Purchase_order and in drop down for determination steps select Printer settings<BR /> <BR /> Change the mode to Edit mode and create required entries<BR /> <BR /> Specify output type as Purchase_order, role as “LF”, purchase organizations for which print must be generated and assign the default printer and no. of copies to be printed.<BR /> <BR /> The out put device assigned should allow PDF<BR /> <H2 id="toc-hId-1866792610"><STRONG>V. Rules for Email settings:</STRONG></H2><BR /> In this step you define Email address wrt output type, partner role<BR /> <BR /> In drop down for show rules for select Purchase_order and in drop down for determination steps select E-mail settings<BR /> <BR /> Change the mode to Edit mode and create required entries<BR /> <BR /> Specify output type as Purchase_order, role as “LF”, and leave all other fields blank if the email address is to be taken from business partner master data.<BR /> <BR /> (* Make sure that email address is maintained in BP master data and in customization of purchasing group)<BR /> <H2 id="toc-hId-1838462796"><STRONG>vi. Rules for Form Template settings :</STRONG></H2><BR /> <H1 id="toc-hId-1935352298"><A name="_Toc74756421" target="_blank"></A><A name="_Toc74590985" target="_blank"></A>4.3. BgRFC settings:</H1><BR /> <H2 id="toc-hId-1445435786"><A name="_Toc74595144" target="_blank"></A><A name="_Toc74592247" target="_blank"></A><A name="_Toc74591561" target="_blank"></A>· Create RFC destination</H2><BR /> In SALE transaction, go to communication, create rfc connections :<BR /> <BR /> (<STRONG>part of standard SAP</STRONG>)<BR /> <H1 id="toc-hId-1542325288"><A name="_Toc74756422" target="_blank"></A><A name="_Toc74666407" target="_blank"></A><A name="_Toc74595145" target="_blank"></A><A name="_Toc74592248" target="_blank"></A><A name="_Toc74591562" target="_blank"></A><A name="_Toc74590987" target="_blank"></A><A style="font-size: 1rem" name="_Toc74756423" target="_blank"></A><A style="font-size: 1rem" name="_Toc74666408" target="_blank"></A><A style="font-size: 1rem" name="_Toc74595146" target="_blank"></A><A style="font-size: 1rem" name="_Toc74592249" target="_blank"></A><A style="font-size: 1rem" name="_Toc74591563" target="_blank"></A><A style="font-size: 1rem" name="_Toc74590988" target="_blank"></A></H1><BR /> <A name="_Toc74590988" target="_blank"></A>Start transaction SBGRFCCONF<BR /> <BR /> <A name="_Toc74756424" target="_blank"></A><A name="_Toc74666409" target="_blank"></A><A name="_Toc74595147" target="_blank"></A><A name="_Toc74592250" target="_blank"></A><A name="_Toc74591564" target="_blank"></A><A name="_Toc74590989" target="_blank"></A>(part of standard SAP )<A name="_Toc74756425" target="_blank"></A><A name="_Toc74666410" target="_blank"></A><A name="_Toc74595148" target="_blank"></A><A name="_Toc74592251" target="_blank"></A><A name="_Toc74591565" target="_blank"></A><BR /> <H1 id="toc-hId-1345811783"><A name="_Toc74756426" target="_blank"></A>5.1. Limitations for printing via spool:</H1><BR /> <OL><BR /> <LI>Please note that printing via spool is not available in&nbsp;release&nbsp;S4CORE 1.00 SP00. Upgrade to S4CORE 1.00 SP01 or higher.</LI><BR /> <LI>Currently, a PDF is always created for any kind of form.<BR /> This has the following impact:</LI><BR /> <LI>Previewing the document from the spool request is only possible when the&nbsp;device type is PDF1 or PDFUC.</LI><BR /> <LI>Using another device type can lead to alignment issues for SAPscript and Smart Forms.</LI><BR /> <LI>Printer tray handling is not supported.</LI><BR /> </OL><BR /> Frontend output is currently not supported, as the output&nbsp;is processed via bgRFC<BR /> <H1 id="toc-hId-1149298278"><A name="_Toc74756427" target="_blank"></A>5.2. Configuring&nbsp;the PDF printer in SPAD transaction:</H1><BR /> SAP printing process basically involves the spool work process transferring the output data to a host spool system (operating system spooler) which in turn prints the output on the printer attached to it. There are various combinations (printing method) for this depending on where the host spool system resides. SAPLPD is the transfer program which accepts print data and forwards it to the host spooler on Microsoft Windows platforms. Host spooler in the frontend system is used for downloading PDF files. Add a new output device using the SPAD transaction with device type set to PDF1. Other device types maybe required for PDF files containing characters from languages like chinese, arabic etc. Create an output device as shown in the screenshots below. In this case “PDF_printer” value is maintained in “Host printer” field of the access method tab since the FILE printer we just created was named so.. If this FILE printer has been set as the default printer in the frontend system, then value “_DEFAULT” can be maintained in this field irrespective of the name given to the printer.<BR /> <BR /> The device type in out put device needs to be PDF1 or PDFUC to see print preview ( or get pdf)<BR /> <BR /> After configuration, Create a PO and check in messages<BR /> <BR /> Display document will show the print preview<BR /> <BR /> For scheduled output , transaction ME9FF can be used<BR /> <H1 id="toc-hId-952784773">Conclusion :</H1><BR /> After setting this output type , you can create a new purchase order and see the out put triggered in messages and also check print preview or take print out after configuring printer.<BR /> <H2 id="toc-hId-462868261"><A name="_Toc74756428" target="_blank"></A>Reference SAP Notes:</H2><BR /> 2294198 - SAP S/4HANA output control - customized forms<BR /> <BR /> 2292539 - SAP S/4HANA output control – configuration<BR /> <BR /> 2228611 -Output Management in SAP S/4HANA<BR /> <BR /> 2292571 - SAP S/4HANA output control - technical setup<BR /> <BR /> <A name="_Toc74591005" target="_blank"></A>2248229 - SAP S/4HANA output management - BRFplus files<BR /> <BR /> For customizing output types below given blog can be referred:<BR /> <BR /> <A href="https://blogs.sap.com/2019/03/17/s4hana-output-management-part-ii/" target="_blank" rel="noopener noreferrer">https://blogs.sap.com/2019/03/17/s4hana-output-management-part-ii/</A><BR /> <BR /> &nbsp; 2021-06-28T18:31:34+02:00 https://community.sap.com/t5/technology-blogs-by-members/brf-for-business-users/ba-p/13502047 BRF+ for Business Users 2021-09-20T15:47:38+02:00 rambandlasap https://community.sap.com/t5/user/viewprofilepage/user-id/15961 <UL><BR /> <LI style="list-style-type: none"><BR /> <UL><BR /> <LI><A href="#intro" target="_blank" rel="nofollow noopener noreferrer">What is BRF+</A></LI><BR /> <LI><A href="#1" target="_blank" rel="nofollow noopener noreferrer">BRF+ vs Config tables</A><BR /> <UL><BR /> <LI style="list-style-type: none"><BR /> <UL><BR /> <LI><A href="#2" target="_blank" rel="nofollow noopener noreferrer">Advantages of BRF+</A><BR /> <UL><BR /> <LI><A href="#2.1" target="_blank" rel="nofollow noopener noreferrer">Versioning</A></LI><BR /> <LI><A href="#2.2" target="_blank" rel="nofollow noopener noreferrer">Multiple Rules in a Rule Set</A></LI><BR /> <LI><A href="#2.3" target="_blank" rel="nofollow noopener noreferrer">Upload and download features on Decision Tables</A></LI><BR /> <LI><A href="#2.4" target="_blank" rel="nofollow noopener noreferrer">Simulation</A></LI><BR /> </UL><BR /> </LI><BR /> </UL><BR /> </LI><BR /> </UL><BR /> </LI><BR /> <LI><A href="#4" target="_blank" rel="nofollow noopener noreferrer">Access BRF+ workbench</A></LI><BR /> <LI><A href="#3" target="_blank" rel="nofollow noopener noreferrer">Terminology of BRF+</A><BR /> <UL><BR /> <LI><A href="#3.1.1" target="_blank" rel="nofollow noopener noreferrer">Application</A></LI><BR /> <LI><A href="#3.1" target="_blank" rel="nofollow noopener noreferrer">Function</A></LI><BR /> <LI><A href="#3.2" target="_blank" rel="nofollow noopener noreferrer">Rule Set</A></LI><BR /> <LI><A href="#3.3" target="_blank" rel="nofollow noopener noreferrer">Rule</A></LI><BR /> <LI><A href="#3.4" target="_blank" rel="nofollow noopener noreferrer">Expression </A></LI><BR /> </UL><BR /> </LI><BR /> <LI><A href="#FR" target="_blank" rel="nofollow noopener noreferrer">Further reading</A></LI><BR /> </UL><BR /> </LI><BR /> </UL><BR /> <H1 id="intro" id="toc-hId-828345215">What is BRF+</H1><BR /> <BR /> <HR /><BR /> <BR /> BRF+ stands for Business Rules Framework. It is a standard tool from SAP with the intention of separating the business rules from the coding. All the config tables like TVARVC etc potentially fit into this.<BR /> It not only helps developers but also business users. It speeds up the development process by providing inbuilt features like file upload, change management etc without writing a single line of code. Adding to that business users avail the flexibility of maintaining business rules in different formats, which best suits their requirement.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/loio52d0611778c146d5b731c89383c21c64_LowRes-1.png" /></P><BR /> <BR /> <H1 id="1" id="toc-hId-631831710">BRF+ vs Config tables</H1><BR /> <BR /> <HR /><BR /> <BR /> Historically we have tried to fit all the business rules into tables. By using BRF+ we can maintain config not only in a table format, known as Decision Table in BRF+, but also in other formats Boolean expression, Decision Table, Decision Tree, Case statement etc.<BR /> <H1 id="2" id="toc-hId-435318205">Advantages of BRF+</H1><BR /> <BR /> <HR /><BR /> <BR /> <H2 id="2.1" id="toc-hId-367887419">Versioning</H2><BR /> BRF+ provides inbuild versioning capability for almost all of the object types from Application to Expression. Versioning comes with capabilities like comparison, activating a previous version etc.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/11-16.png" /></P><BR /> <BR /> <H2 id="2.2" id="toc-hId-171373914">Multiple Rules in a Rule Set</H2><BR /> Each ruleset can be assigned with multiple rules and can be processed in a sequence.<BR /> Each rule in a rule set can process a different type of expression.<BR /> Each rule can be activated, processed based on a condition.<BR /> Each rule can be set to be active only for a particular date range.<BR /> <BR /> Check <A href="#3.3" target="_blank" rel="nofollow noopener noreferrer">Rule</A> below.<BR /> <H2 id="2.3" id="toc-hId--25139591">Upload and download features on Decision Tables</H2><BR /> Provides inbuilt excel upload and download functionality for Decision Table expression.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/10-20.png" /></P><BR /> <BR /> <H2 id="2.4" id="toc-hId--221653096">Simulation</H2><BR /> Every rule set can be tested via assigned Function, before activation, to make sure the new config is behaving as expected.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/9-22.png" /></P><BR /> <BR /> <H1 id="4" id="toc-hId--547249320">Access BRF+ workbench</H1><BR /> <BR /> <HR /><BR /> <BR /> Use TCODEs BRF+ or BRFPLUS to access BRF+ workbench. Workbench is a webdynpro application which opens in a browser.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/1-67.png" /></P><BR /> <BR /> <H1 id="3" id="toc-hId--743762825">Terminology of BRF+</H1><BR /> <BR /> <HR /><BR /> <BR /> There are a few different types of objects in BRF+ but the important ones are<BR /> <OL><BR /> <LI>Application</LI><BR /> <LI>Function</LI><BR /> <LI>Rule Set</LI><BR /> <LI>Rules</LI><BR /> <LI>Expression</LI><BR /> </OL><BR /> <H2 id="3.1.1" id="toc-hId--811193611">Application</H2><BR /> <P style="overflow: hidden;margin-bottom: 0px">Application groups related Functions and other objects. In the below 'Sample Application' we got one function 'Get Rate' and related data objects.</P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/2-48.png" />.</P><BR /> &nbsp;<BR /> <H2 id="3.1" id="toc-hId--660452759">Function</H2><BR /> Function is the top most element which defines the context of our business function. In other words the context is the input and output parameters. This is a developers job and we move this change via transport. The context involves Date, Site, Commodity etc.<BR /> <BR /> Below function 'Get Rate' takes 2 input parameters Customer, Quantity and calculates the Rate.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/3-46.png" /></P><BR /> <BR /> <H2 id="3.2" id="toc-hId--856966264">Rule Set</H2><BR /> Defines the set of rules that are assigned to a function. One function can contain one or more rule sets. If a function contains more than one rule set, we can define priority to define the execution order of the rule sets. We can even enable or disable a rule set.<BR /> <BR /> One rule set is assigned to the below example function.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/4-43.png" /></P><BR /> <BR /> <H2 id="3.3" id="toc-hId--1053479769">Rule</H2><BR /> Business rules where we define our rule logic. Any number of rules can be assigned to a rule set. Each rule can have an optional validity period.<BR /> <BR /> In the below example, 2 rules, Rule 1 and Rule 2 are assigned to a rule set. One with limited validity period and other with unlimited validity period.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/5-35.png" /></P><BR /> <BR /> <H2 id="3.4" id="toc-hId--1249993274">Expression</H2><BR /> There are many different expressions in BRF+ like below. These are different ways we can define the business rules.<BR /> <OL><BR /> <LI>Boolean</LI><BR /> <LI>Decision Table</LI><BR /> <LI>Decision Tree</LI><BR /> <LI>Case</LI><BR /> <LI>DB lookup</LI><BR /> <LI>Loop</LI><BR /> <LI>Formula</LI><BR /> </OL><BR /> In Rule 1, we are processing a formula expression if the customer is not 99991.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/6-37.png" /></P><BR /> In Rule 2, we are processing a decision table to calculate the amount<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/7-27.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/09/8-28.png" /></P><BR /> <BR /> <H1 id="FR" id="toc-hId--1153103772">Further reading</H1><BR /> <BR /> <HR /><BR /> <BR /> <UL><BR /> <LI><A href="https://help.sap.com/doc/7b783465728810148a4b1a83b0e91070/1511%20002/en-US/frameset.htm?frameset.htm" target="_blank" rel="noopener noreferrer">https://help.sap.com/doc/7b783465728810148a4b1a83b0e91070/1511%20002/en-US/frameset.htm?frameset.htm</A></LI><BR /> </UL> 2021-09-20T15:47:38+02:00 https://community.sap.com/t5/technology-blogs-by-members/sap-central-finance-replication-enhancement-via-brf/ba-p/13517606 SAP Central Finance – Replication Enhancement via BRF+ 2021-10-03T22:35:46+02:00 former_member1844 https://community.sap.com/t5/user/viewprofilepage/user-id/1844 <STRONG><U>Introduction</U>:</STRONG><BR /> <BR /> In Central Finance S/4 HANA Replication, we always get additional business requirement, which is not achievable using standard configuration setups. This triggers the use of different enhancement options to implement business logic,in order to have successful replication. There are different ways of custom enhancement in Central Finance:<BR /> <OL><BR /> <LI>Using <A href="https://help.sap.com/doc/4857c0540cf5ef05e10000000a4450e5/3.6/en-US/12d3d15437f66674e10000000a44538d.html" target="_blank" rel="noopener noreferrer">MDG Mapping</A> – By Creating custom mapping entity, if there is simple one- or two-level mapping requirement</LI><BR /> <LI>Using <A href="https://help.sap.com/saphelp_ewm900/helpdata/en/f5/302d241f3f42b6b42a1dfb1b82c4eb/frameset.htm" target="_blank" rel="noopener noreferrer">BRF+</A> in combination with Replication BADI</LI><BR /> <LI>Using Custom Tables in combination with Replication BADI</LI><BR /> </OL><BR /> This blog focuses on how to use BRF+(Business Rule Framework) in replication of documents in Central Finance.<BR /> <BR /> <STRONG><U>Approach</U>:</STRONG><BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Approach.jpg" /><BR /> </STRONG></P><BR /> <STRONG><U>Example:</U></STRONG><BR /> <BR /> In this blog, usage of BRF+ will be explained based on below use case:<BR /> <TABLE><BR /> <TBODY><BR /> <TR><BR /> <TD width="201">Company Code</TD><BR /> <TD width="129">Account Type</TD><BR /> <TD width="274">Change the Value of Item Text(SGTXT)</TD><BR /> </TR><BR /> <TR><BR /> <TD width="201">1000</TD><BR /> <TD width="129">K(Vendor)</TD><BR /> <TD width="274">SET</TD><BR /> </TR><BR /> </TBODY><BR /> </TABLE><BR /> &nbsp;<BR /> <BR /> Whenever company code is 1000 and line item account type is K(Vendor), then change the value of SGTXT(Item Text) to value <STRONG>SET</STRONG>. Please note that this is just an example of usage of BRF+ in Central Finance Replication. It can be used for complex business logic as well.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>Step 1: </STRONG>Create BRF+ Application using transaction Code BRF+<BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step1.png" />&nbsp;</STRONG></P><BR /> <STRONG>Step 2: </STRONG>Create Decision Table based on Business Logic<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step2.png" /></P><BR /> &nbsp;<BR /> <BR /> <STRONG>Step 3</STRONG>: Define the Ruleset using Decision Table<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step3.png" /></P><BR /> <STRONG>&nbsp;</STRONG><BR /> <BR /> <STRONG>Step 4: </STRONG>Create Function and assign Ruleset<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step4.png" /></P><BR /> &nbsp;<BR /> <BR /> <STRONG>Step 5: </STRONG>Call this function in FI Replication BADI BADI_FINS_CFIN_AC_INTERFACE. In this case, method MAP_VALUES<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step-5A.png" /></P><BR /> Sample Code for changing line items data using BRF+ Function:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step5B.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step5C.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Step5D.png" /></P><BR /> &nbsp;<BR /> <BR /> <STRONG>Step 6: </STRONG>&nbsp;Sample Document Posted in Source and Replicated in Central Finance after BRF+ implementation using BADI<BR /> <BR /> Document posted in Source ECC System<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Source.png" /></P><BR /> Replicated document in Central Finance<BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG><U><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2021/10/Target.png" /></U></STRONG></P><BR /> &nbsp;<BR /> <BR /> <STRONG><U>Conclusion</U></STRONG>:<BR /> <OL><BR /> <LI>BRF+ can be implemented and linked to any replication processes (Finance, CO, AUFK, etc.)</LI><BR /> </OL><BR /> &nbsp;<BR /> <OL start="2"><BR /> <LI>These business logics can be implemented using custom tables as well. However, with custom tables and logics written in BADI, makes it more technical.</LI><BR /> </OL><BR /> &nbsp;<BR /> <OL start="3"><BR /> <LI>If BRF+ is implemented using all the relevant parameters of BADI, then complete business logic requirement like profit centre determination, clearing any field, document type re-direction, etc, can be met by only working in BRF+ with business and functional expertise. There will be no requirement of changing ABAP code with new addition of any source systems/company codes or with change of existing business logic.</LI><BR /> </OL><BR /> &nbsp;<BR /> <BR /> I hope this blog post was helpful for you!<BR /> <BR /> <STRONG><U>Aberrations:</U></STRONG><BR /> <BR /> CFIN: Central Finance<BR /> <BR /> BRF+: Business Rule Framework<BR /> <BR /> MDG: Master Data Governance<BR /> <BR /> BADI: Business Addins<BR /> <BR /> FI: Finance<BR /> <BR /> CO: COBK Replication 2021-10-03T22:35:46+02:00 https://community.sap.com/t5/technology-blogs-by-members/raise-workflow-event-from-brf-plus/ba-p/13523074 Raise Workflow event from BRF plus 2022-01-11T11:20:16+01:00 former_member708019 https://community.sap.com/t5/user/viewprofilepage/user-id/708019 Sometimes it is more efficient to link BRF plus and SAP business workflow to establish close integration and simplify the rules for triggering workflows available. It should be clear to explain and maintain for an experienced SAP user.<BR /> <BR /> There are two options to call SAP business workflow from BRF plus:<BR /> <OL><BR /> <LI>starting workflow directly (WS*),</LI><BR /> <LI>triggering a workflow event.</LI><BR /> </OL><BR /> In comparison to starting workflow directly, a workflow event can trigger several workflows based on the Linkage maintained ( transaction SWETYPV - Type Linkages ).<BR /> <BR /> In this blog article, you can get a quick have a look at <STRONG>How to raise a Workflow event from BRF Plus</STRONG>.<BR /> <BR /> <STRONG>It is assumed that a workflow scenario is already created for the ABAP class's event. So the question is only how to call it from BRF plus.&nbsp;</STRONG><BR /> <BR /> In a test scenario, a test function WS_ATP_SIGNAL processes lines with available quantity for materials. As the input data, it receives a table to analyze the situation for availability for several materials using the set of predefined rules. The return parameter is Action as it is expected that during processing the function will run actions only.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B1.png" /></P><BR /> In the assigned Rule set it is the Loop expression 'ATP_LINES' that processes each line of the input table and decides on the action. The action raises as an event for a workflow.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B2.png" /></P><BR /> To link the Business workflow and BRF plus, create an expression with the type <STRONG>Raise Workflow Event (Action)</STRONG>. In this example, it is WS_SEND_NOTIFICATION and WS_PIR_CREATION.<BR /> <BR /> When the condition has been fulfilled the expression to raise and the workflow event will be executed.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B3.png" /></P><BR /> Each expression will contain a Business workflow ABAP object ( it can be also a Business object ). In this example, it is the ABAP Class technique. Set the ABAP class and the event.<BR /> <BR /> The ABAP class should contain Interface IF_WORKFLOW as the other class that is supposed for SAP Business workflow scenarios.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B4.png" /></P><BR /> The object instance is used to create an instance of the class, it is needed to assign the key for the object. In this case, it is the combination of Plant and Material. The key can be built with a formula expression using the data objects (elements) from the function's context.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B5.png" /></P><BR /> <BR /> <UL><BR /> <LI>FDT_E_SIBFBORIID = CONCATENATE ( IT_LINES-PLANT, IT_LINES-MATERIAL ).</LI><BR /> </UL><BR /> After setting ABAP class and Event, press the button to Update the container. It will read import data for the event and will propose the binding. ZBS_TS_ATPV_VIEW is the structure line of the input table from the function. The same type of structure is assigned to the event of the ABAP class.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/01/B6.png" /></P><BR /> When these prerequisites are fulfilled, the event will be raised during BRF plus function call or during BRF plus simulation with performing Actions. The event creation can be caught with a breakpoint in the FM SWW_WI_CREATE_VIA_EVENT_IBF.<BR /> <BR /> &nbsp; 2022-01-11T11:20:16+01:00 https://community.sap.com/t5/technology-blogs-by-members/import-event-push-of-configuration-text-tables-to-external-database/ba-p/13523708 Import Event Push of Configuration Text Tables to External Database 2022-02-09T22:39:46+01:00 Ryan-Crosby https://community.sap.com/t5/user/viewprofilepage/user-id/13126 <H1 id="toc-hId-830228652">Introduction</H1><BR /> I was recently posed with a problem that needed a new solution for our planned S4 migration in a few weeks. &nbsp;How to get the configuration domain text data to an external database to retain some existing reporting capabilities? &nbsp;I'm betting that a lot of folks work in heterogenous landscapes and sometimes it requires getting creative with how to tackle a problem. &nbsp;I have seen a couple of approaches in the past and have to admit that I'm not a fan of either, but I'll let you decide for yourself which one is least preferred. &nbsp;First example - two synchronous ABAP Proxies of megalith proportions statically defined to return data on several dozen configuration domains based on daily or weekly frequency. &nbsp;The second - several recurring job instances throughout the day (<EM>four or five maybe</EM>) that extract the data whenever change pointers are detected on dependent business objects, and saved as files on the application server, which requires some other process to fetch the data and load it.&nbsp; Is a many times daily, daily, or weekly cadence appropriate given the relatively infrequency that configuration tables are updated in a productive environment?<BR /> <H1 id="toc-hId-633715147">Proposal</H1><BR /> What if there were an event that could push the data for a pit stop into Integration Suite for some transformation before reaching its final destination in the external database? &nbsp;I spent a few hours pondering the question and came up with the following: Implement BADI CTS_IMPORT_FEEDBACK along with BRF+ to evaluate customizing requests and push table names to Integration Suite. &nbsp;Start with an iterating splitter, and sprinkle a little graphical mapping, content enricher via OData, and XSL transform and arrive at XML that can be processed by the JDBC adapter to initiate stored procedures for UPSERT. &nbsp;What follows is the culmination of a day and a half of build, learning, and experimentation with a couple of gotchas along the way.<BR /> <H1 id="toc-hId-437201642">ABAP</H1><BR /> The original intent was to execute the entirety of ABAP within this BADI method, but after I had completed the full service layer in Integration Suite and worked backward into this method, I discovered that it executes in client 000, and received a ST22 dump when the BRF+ application could not execute. &nbsp;The BRF+ code was pushed into the RFC function module. &nbsp;Consequently, after working in SAP software for 14 years and having never logged in to client 000, I have for the first time (<EM>SM59 destination</EM>), and doubtful I ever would again. &nbsp;You may also wonder why I wouldn't simply read keys and use a combination of RTTS and web services to push the data to Integration Suite. &nbsp;Beyond avoiding the megalith mentioned above, dealing with situations where some columns are ignored for certain tables, and determining appropriate structure, it certainly wouldn't be blog worthy and you wouldn't be reading this! &nbsp;After following the remaining steps I think it will be clear why I decided to go with the chosen route.<BR /> <PRE class="language-abap"><CODE>METHOD if_ex_cts_import_feedback~feedback_after_import.<BR /> <BR /> DATA: corr TYPE trwbo_request,<BR /> tables TYPE tt_tabnames.<BR /> <BR /> * Read object keys for import<BR /> CLEAR: tables.<BR /> LOOP AT requests INTO DATA(request).<BR /> CLEAR corr.<BR /> CALL FUNCTION 'TR_READ_REQUEST'<BR /> EXPORTING<BR /> iv_read_objs_keys = 'X'<BR /> iv_trkorr = request-trkorr<BR /> CHANGING<BR /> cs_request = corr<BR /> EXCEPTIONS<BR /> error_occured = 1<BR /> no_authorization = 2<BR /> OTHERS = 3.<BR /> <BR /> IF sy-subrc = 0.<BR /> * Record any tables for evaluation in BRF+<BR /> LOOP AT corr-keys INTO DATA(key)<BR /> WHERE object = 'TABU'.<BR /> APPEND key-objname TO tables.<BR /> ENDLOOP.<BR /> ELSE.<BR /> * Should never happen based on data requested in FM<BR /> ENDIF.<BR /> ENDLOOP.<BR /> <BR /> * Sort and remove duplicates and pass to RFC for<BR /> * communication<BR /> SORT tables.<BR /> DELETE ADJACENT DUPLICATES FROM tables.<BR /> CALL FUNCTION 'ZCA_WS_CONFIG_UPDATE_DISPATCH'<BR /> DESTINATION 'CFGUPDDISP'<BR /> EXPORTING<BR /> table = tables.<BR /> <BR /> ENDMETHOD.</CODE></PRE><BR /> Originally, this RFC was only intended to be a shell for my enterprise service consumer proxy generation (<EM>we do not have an ESR</EM>), but after experiencing the client 000 problem it became a suitable surrogate to execute the BRF+ application in the appropriate client, as well as the ABAP proxy.<BR /> <PRE class="language-abap"><CODE> FUNCTION zca_ws_config_update_dispatch.<BR /> *"----------------------------------------------------------------------<BR /> *"*"Local Interface:<BR /> *" IMPORTING<BR /> *" VALUE(TABLE) TYPE TT_TABNAMES<BR /> *"----------------------------------------------------------------------<BR /> <BR /> DATA:timestamp TYPE timestamp,<BR /> t_name_value TYPE abap_parmbind_tab,<BR /> name_value TYPE abap_parmbind,<BR /> r_data TYPE REF TO data,<BR /> input TYPE zzca_ws_config_update_dispatch,<BR /> proxy TYPE REF TO zco_zws_config_update_dispatch.<BR /> <BR /> CONSTANTS: function_id TYPE if_fdt_types=&gt;id VALUE '005056977E091EECA1F05A7D5FE1B25F'.<BR /> <BR /> * Set timestamp for processing and move input data into reference<BR /> GET TIME STAMP FIELD timestamp.<BR /> name_value-name = 'TT_TABNAMES'.<BR /> GET REFERENCE OF table INTO r_data.<BR /> cl_fdt_function_process=&gt;move_data_to_data_object( EXPORTING ir_data = r_data<BR /> iv_function_id = function_id<BR /> iv_data_object = '005056977E091EECA1F05DC93384D25F' "TT_TABNAMES<BR /> iv_timestamp = timestamp<BR /> iv_trace_generation = abap_false<BR /> iv_has_ddic_binding = abap_true<BR /> IMPORTING er_data = name_value-value ).<BR /> INSERT name_value INTO TABLE t_name_value.<BR /> CLEAR name_value.<BR /> <BR /> TRY.<BR /> * Execute BRF+ function<BR /> cl_fdt_function_process=&gt;process( EXPORTING iv_function_id = function_id<BR /> iv_timestamp = timestamp<BR /> IMPORTING ea_result = input-table-item<BR /> CHANGING ct_name_value = t_name_value ).<BR /> <BR /> * Only execute proxy if any tables of interest are found<BR /> IF input-table-item[] IS NOT INITIAL.<BR /> CREATE OBJECT proxy.<BR /> CALL METHOD proxy-&gt;zca_ws_config_update_dispatch<BR /> EXPORTING<BR /> input = input.<BR /> <BR /> COMMIT WORK.<BR /> ENDIF.<BR /> <BR /> CATCH cx_fdt.<BR /> * Do what on error?<BR /> CATCH cx_ai_system_fault.<BR /> * Do what on error?<BR /> ENDTRY.<BR /> <BR /> ENDFUNCTION.</CODE></PRE><BR /> <H1 id="toc-hId-240688137">BRF+</H1><BR /> I find BRF+ to be an often underutilized gem in the system. &nbsp; If I have a simple question for the system to answer, pass the necessary input and let it determine the outcome. &nbsp;The true beauty is that I can add or remove a table for this scenario without writing a single line of ABAP!!<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/02/Screen-Shot-2022-02-08-at-08.19.11.png" /></P><BR /> <BR /> <H1 id="toc-hId-44174632">Integration Flow</H1><BR /> The first two steps of the flow are setup steps to determine the backend OData host and split the incoming message by each table. &nbsp;The last three steps will be presented in more detail below.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/02/Screen-Shot-2022-02-08-at-10.02.13.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Full E2E Integration Process</P><BR /> <BR /> <H1 id="toc-hId--152338873">Graphical Mapping</H1><BR /> This mapping serves the purpose of mapping a backend table name into four corresponding bits of data... stored procedure, OData service name, resource, and query using a combination of the fixValues function and a couple of simple Groovy scripts. &nbsp;Folks could be wondering why not use value mapping, but I feel like that is a lot of overkill to maintain several input fields instead of simple 1:1 mappings with fixValues. &nbsp;Also, note the use of the query parameter is used because for one table we don't want the full field list. &nbsp;If we use $select query options for one table in the OData adapter we must maintain it for all (<I>Tried the empty string and it did not work</I>). &nbsp;This leaves me with a choice dilemma:<BR /> <BR /> <STRONG>Option 1 -&nbsp;</STRONG>Add a query parameter, which is more stuff to maintain in the graphical mapping<BR /> <BR /> <STRONG>Option 2 -&nbsp;</STRONG>Do not add query parameter and handle stripping of extra fields in XSL transform<BR /> <BR /> Since I'd rather not select fields and transport extra data over the network that is of no consequence, I went with the first option.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/02/Screen-Shot-2022-02-08-at-08.22.11.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic;font-family: 'SAPRegular', 'Helvetica Neue', Arial, sans-serif">Graphical mapping for OData/Stored procedure determination</P><BR /> The setHeader function should be self explanatory, but the joinContexts function is to establish a queue like some of the older PI/PO functions. &nbsp;I could not find an equivalent in Integration Suite, so I constructed my own (<EM>Feel free to share if there is some out of the box option that I could not find</EM>).<BR /> <PRE class="language-java"><CODE>// Insert message headers<BR /> def void setHeader(String[] keys, String[] values, Output output, MappingContext context){<BR /> def i = 0;<BR /> while(i &lt; keys.size()) {<BR /> context.setHeader(keys[i], values[i]);<BR /> i++;<BR /> }<BR /> }<BR /> <BR /> // Create context queue to match keys with values<BR /> def void joinContexts(String[] input1, String[] input2, String[] input3, Output output, MappingContext context){<BR /> output.addValue(input1[0]);<BR /> output.addValue(input2[0]);<BR /> output.addValue(input3[0]);<BR /> }</CODE></PRE><BR /> <H1 id="toc-hId--348852378">Content Enricher via OData</H1><BR /> The first image includes basic host and service metadata that is handled in the first step, and the graphical mapping step. &nbsp;I was unsure if externalized parameters and headers would be concatenated like two headers, so I went with this option. &nbsp;If externalized parameters do work in this way, then I could eliminate the first step in the flow. &nbsp;The second image shows the processing tab with the other metadata required for the OData service call. &nbsp;You may be wondering at this point... what about V2 vs. V4? &nbsp;For the 10 tables I need to push, I was able to identify 2 services that are both V2. &nbsp;If I have to cross that bridge in the future, I can manage with the addition of a version metadata field in the graphical mapping and an appropriate routing step.<BR /> <H1 id="toc-hId--545365883"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/02/Screen-Shot-2022-02-08-at-10.23.12.png" /></H1><BR /> <P class="image_caption" style="font-style: italic;font-family: SAPRegular, 'Helvetica Neue', Arial, sans-serif;text-align: center">OData Connection Information</P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/02/Screen-Shot-2022-02-08-at-10.28.59.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">OData Processing Information</P><BR /> The following XML is the result after the content enricher via OData using the combine algorithm. &nbsp;The nice feature/outcome being that I did not have to statically define any table structures or field types anywhere in the solution.<BR /> <PRE class="language-markup"><CODE>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<BR /> &lt;multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge"&gt;<BR /> &lt;multimap:Message1&gt;<BR /> &lt;Root&gt;<BR /> &lt;StoredProcedure&gt;sp_TVV1T&lt;/StoredProcedure&gt;<BR /> &lt;/Root&gt;<BR /> &lt;/multimap:Message1&gt;<BR /> &lt;multimap:Message2&gt;<BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1_ID&gt;T01&lt;/AdditionalCustomerGroup1_ID&gt;<BR /> &lt;AdditionalCustomerGroup1Text&gt;Tier 1&lt;/AdditionalCustomerGroup1Text&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1_ID&gt;T02&lt;/AdditionalCustomerGroup1_ID&gt;<BR /> &lt;AdditionalCustomerGroup1Text&gt;Tier 2&lt;/AdditionalCustomerGroup1Text&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1_ID&gt;T03&lt;/AdditionalCustomerGroup1_ID&gt; <BR /> &lt;AdditionalCustomerGroup1Text&gt;Tier 3&lt;/AdditionalCustomerGroup1Text&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1_ID&gt;T04&lt;/AdditionalCustomerGroup1_ID&gt; <BR /> &lt;AdditionalCustomerGroup1Text&gt;Tier 4&lt;/AdditionalCustomerGroup1Text&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1_ID&gt;T05&lt;/AdditionalCustomerGroup1_ID&gt;<BR /> &lt;AdditionalCustomerGroup1Text&gt;Tier 5&lt;/AdditionalCustomerGroup1Text&gt;<BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;AdditionalCustomerGroup1&gt;<BR /> &lt;AdditionalCustomerGroup1_ID/&gt;<BR /> &lt;AdditionalCustomerGroup1Text/&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt; <BR /> &lt;/AdditionalCustomerGroup1&gt;<BR /> &lt;/multimap:Message2&gt;<BR /> &lt;/multimap:Messages&gt;</CODE></PRE><BR /> <H1 id="toc-hId--741879388">XSL Transform</H1><BR /> For the sake of brevity, I have included a truncated XSL transform that only includes 3 tables despite my requirement being 10 tables. &nbsp;If you happen to be a savvy XSL veteran, and find my work to be rudimentary, keep in mind that this is my first XSL transform after spending 30 minutes reading and learning on W3Schools. &nbsp;I did implement the XSL transform in such a way that empty string key records would be removed from the stream.<BR /> <PRE class="language-markup"><CODE>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR /> <BR /> &lt;xsl:stylesheet version="1.0"<BR /> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge"&gt;<BR /> <BR /> &lt;xsl:template match="/"&gt;<BR /> &lt;root&gt;<BR /> &lt;StatementName&gt;<BR /> &lt;storedProcedureName action="EXECUTE"&gt;<BR /> &lt;table&gt;&lt;xsl:value-of select="multimap:Messages/multimap:Message1/Root/StoredProcedure"/&gt;&lt;/table&gt;<BR /> &lt;ProcedureParameter type="CLOB"&gt;<BR /> &lt;xsl:text disable-output-escaping="yes"&gt;&amp;lt;![CDATA[&lt;/xsl:text&gt;<BR /> <BR /> &lt;!-- TVM4T Procedure --&gt;<BR /> &lt;xsl:for-each select="multimap:Messages/multimap:Message2/AdditionalMaterialGroup4"&gt;<BR /> &lt;List&gt;<BR /> &lt;xsl:for-each select="AdditionalMaterialGroup4[AdditionalMaterialGroup4_ID!='']"&gt;<BR /> &lt;Item&gt;<BR /> &lt;MaterialGroup4&gt;&lt;xsl:value-of select="AdditionalMaterialGroup4_ID"/&gt;&lt;/MaterialGroup4&gt;<BR /> &lt;MaterialGroup4Text&gt;&lt;xsl:value-of select="AdditionalMaterialGroup4Text"/&gt;&lt;/MaterialGroup4Text&gt;<BR /> &lt;/Item&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> &lt;/List&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> <BR /> &lt;!-- TVM5T Procedure --&gt;<BR /> &lt;xsl:for-each select="multimap:Messages/multimap:Message2/AdditionalMaterialGroup5"&gt;<BR /> &lt;List&gt;<BR /> &lt;xsl:for-each select="AdditionalMaterialGroup5[AdditionalMaterialGroup5_ID!='']"&gt;<BR /> &lt;Item&gt;<BR /> &lt;MaterialGroup5&gt;&lt;xsl:value-of select="AdditionalMaterialGroup5_ID"/&gt;&lt;/MaterialGroup5&gt;<BR /> &lt;MaterialGroup5Text&gt;&lt;xsl:value-of select="AdditionalMaterialGroup5Text"/&gt;&lt;/MaterialGroup5Text&gt;<BR /> &lt;/Item&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> &lt;/List&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> <BR /> &lt;!-- TVV1T Procedure --&gt;<BR /> &lt;xsl:for-each select="multimap:Messages/multimap:Message2/AdditionalCustomerGroup1"&gt;<BR /> &lt;List&gt;<BR /> &lt;xsl:for-each select="AdditionalCustomerGroup1[AdditionalCustomerGroup1_ID!='']"&gt;<BR /> &lt;Item&gt;<BR /> &lt;CustomerGroup1&gt;&lt;xsl:value-of select="AdditionalCustomerGroup1_ID"/&gt;&lt;/CustomerGroup1&gt;<BR /> &lt;CustomerGroup1Text&gt;&lt;xsl:value-of select="AdditionalCustomerGroup1Text"/&gt;&lt;/CustomerGroup1Text&gt;<BR /> &lt;/Item&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> &lt;/List&gt;<BR /> &lt;/xsl:for-each&gt;<BR /> <BR /> &lt;xsl:text disable-output-escaping="yes"&gt;]]&amp;gt;&lt;/xsl:text&gt;<BR /> &lt;/ProcedureParameter&gt;<BR /> &lt;/storedProcedureName&gt;<BR /> &lt;/StatementName&gt;<BR /> &lt;/root&gt;<BR /> &lt;/xsl:template&gt;<BR /> <BR /> &lt;/xsl:stylesheet&gt;</CODE></PRE><BR /> The resulting XML is JDBC adapter ready<BR /> <PRE class="language-markup"><CODE>&lt;root xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge"&gt;<BR /> &lt;StatementName&gt;<BR /> &lt;storedProcedureName action="EXECUTE"&gt;<BR /> &lt;table&gt;sp_TVV1T&lt;/table&gt;<BR /> &lt;ProcedureParameter type="CLOB"&gt;<BR /> &lt;![CDATA[<BR /> &lt;List&gt;<BR /> &lt;Item&gt;&lt;CustomerGroup1&gt;T01&lt;/CustomerGroup1&gt;&lt;CustomerGroup1Text&gt;Tier 1&lt;/CustomerGroup1Text&gt;&lt;/Item&gt;<BR /> &lt;Item&gt;&lt;CustomerGroup1&gt;T02&lt;/CustomerGroup1&gt;&lt;CustomerGroup1Text&gt;Tier 2&lt;/CustomerGroup1Text&gt;&lt;/Item&gt;<BR /> &lt;Item&gt;&lt;CustomerGroup1&gt;T03&lt;/CustomerGroup1&gt;&lt;CustomerGroup1Text&gt;Tier 3&lt;/CustomerGroup1Text&gt;&lt;/Item&gt;<BR /> &lt;Item&gt;&lt;CustomerGroup1&gt;T04&lt;/CustomerGroup1&gt;&lt;CustomerGroup1Text&gt;Tier 4&lt;/CustomerGroup1Text&gt;&lt;/Item&gt;<BR /> &lt;Item&gt;&lt;CustomerGroup1&gt;T05&lt;/CustomerGroup1&gt;&lt;CustomerGroup1Text&gt;Tier 5&lt;/CustomerGroup1Text&gt;&lt;/Item&gt;<BR /> &lt;/List&gt;<BR /> ]]&gt;<BR /> &lt;/ProcedureParameter&gt;<BR /> &lt;/storedProcedureName&gt;<BR /> &lt;/StatementName&gt;<BR /> &lt;/root&gt;</CODE></PRE><BR /> <H1 id="toc-hId--938392893">JDBC</H1><BR /> <STRONG>Disclaimer:</STRONG> This part has not actually been tested, but instead the above XML was dumped to an FTP site for extraction during unit testing.<BR /> <BR /> Once the DB admins are able to create the necessary stored procedures I will include an editorial update. &nbsp;In the past, I have used the JDBC adapter in PI/PO where we can do bulk inserts, but I did stumble upon some blog/answer posts, and an OSS note indicating that bulk inserts are not supported in Integration Suite unless using a splitter in batch mode. &nbsp;I referred to the following blog on the topic of using stored procedures, which I had used in the past in PI/PO -&nbsp;<A href="https://blogs.sap.com/2021/09/30/sap-cloud-integration-cpi-hci-jdbc-adapter-part-3-update-the-db-using-jdbc-adapter-via-a-stored-procedure-parameter-as-xml-type/" target="_blank" rel="noopener noreferrer">Stored procedure as XML Type</A>&nbsp; I opted not to split an already split message, along with the fact that this approach fares far better from a performance perspective.<BR /> <H1 id="toc-hId--365166315">Conclusion</H1><BR /> After reaching a point where I can successfully unit test the full solution outside of of the JDBC handling, I'm pleased with the outcome. &nbsp;For future's sake, if I need to add a new table in the future the process is quite simple:<BR /> <OL><BR /> <LI>Add table to BRF+ expression</LI><BR /> <LI>Identify/build an OData service - <STRONG>Note:</STRONG> if you have spent inordinate amounts of time working backward from tables to a usable OData service, then you are not alone, and I would rather reuse than build. &nbsp;I don't need draft capabilities for this type of thing and I'm still presented with choosing from multiple options... whatever happened to software reusability, but that's a topic for another day</LI><BR /> <LI>Add four bits of metadata (<EM>maybe five if versioning enters the picture</EM>) for OData and a stored procedure into the graphical mapping step</LI><BR /> <LI>Add a new block to the XSL transform</LI><BR /> <LI>Get a DB Admin to create the required stored procedure</LI><BR /> </OL><BR /> &nbsp;<BR /> <BR /> Hope folks can get something useful out of this... enjoy! 2022-02-09T22:39:46+01:00 https://community.sap.com/t5/technology-blogs-by-sap/s-4hana-opd-procedure-creation-and-consumption/ba-p/13529649 S/4HANA - OPD - Procedure creation and consumption 2022-03-23T17:30:15+01:00 former_member185414 https://community.sap.com/t5/user/viewprofilepage/user-id/185414 Hello fellow community members,<BR /> <BR /> In this blog I would like to share my experience on the creation as well as consumption of a procedure call in BRF+ which is used by the OPD transaction.<BR /> <BR /> A little background, <A href="https://launchpad.support.sap.com/#/notes/2292539" target="_blank" rel="noopener noreferrer">OPD</A> is the newer equivalent of NACE in S/4HANA used for configuring and issuing outputs. NACE is used in ECC to configure output controls and map forms with driver programs and trigger the output.<BR /> <BR /> Back to the topic - Here, I will give an illustrative document on how to create procedures and use them. As an example I have done this on <A href="https://help.sap.com/viewer/af9ef57f504840d2b81be8667206d485/2021.000/en-US/f1ed148b14014e5cb68419948788a487.html" target="_blank" rel="noopener noreferrer">Central Purchase Contracts</A> business object available in the Central Procurement solution -<BR /> <BR /> The steps will be divided as below -<BR /> <STRONG>A. Creation of Element and Procedure</STRONG><BR /> <STRONG>B. Creation of application logic</STRONG><BR /> <STRONG>C. Embedding the created procedure in the OPD transaction</STRONG><BR /> <BR /> In Detail,<BR /> <BR /> <STRONG>A. Creation of Element and Procedure</STRONG><BR /> <BR /> 1. Open BRF+ transaction in SAP GUI.<BR /> URL will look like - <EM><A href="https:///sap/bc/webdynpro/sap/fdt_wd_workbench?sap-language=EN&amp;sap-client=&lt;3" target="test_blank" rel="nofollow noopener noreferrer">https:///sap/bc/webdynpro/sap/fdt_wd_workbench?sap-language=EN&amp;sap-client=&lt;3</A> digit client id&gt;#</EM><BR /> <BR /> 2. Put application - OPD_MM_CENTRAL_CONTRACT and search<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/1-22.jpg" /></P><BR /> 3. Creation of Element<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/2-22.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/3-15.jpg" /></P><BR /> -&gt; This creates an element.<BR /> <BR /> 4. Creation of Procedure<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/4-13.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/5-15.jpg" /></P><BR /> -&gt; This creates a procedure and also assigns the above created element as the result data object.<BR /> <BR /> <STRONG>B. Creation of application logic</STRONG><BR /> <BR /> 1. Creation of class and static method<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/6-9.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/7-4.jpg" /></P><BR /> -&gt; This creates the placeholder for the application logic<BR /> <BR /> 2. Map the parameters which will be used in application logic<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/8-3.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/9-3.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/10-4.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/11-3.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/12-3.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/13-3.jpg" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/14-2.jpg" /></P><BR /> -&gt; Newly added parameters are mapped.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/15-2.jpg" /></P><BR /> -&gt; Upon activation, message is displayed.<BR /> <BR /> <STRONG>C. Embedding the created procedure in the OPD transaction</STRONG><BR /> <BR /> 1. Launch the OPD transaction in SAP GUI<BR /> <BR /> 2. Choose the business object as 'Central Purchase Contract' and the determination step as 'Output Type'<BR /> <BR /> 3. Go to Edit – Table Settings – Pull the custom expression which was created above and maintain values in same.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/16-2.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Finally, to conclude - the issued outputs will look like rows in below table in Manage Central Purchase Contracts app -<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/17-2.jpg" /></P><BR /> Tips for working with expressions -<BR /> <BR /> 1. A 'blank' is different from a 'false' in the decision tables.<BR /> 2. If values are not maintained (left as 'blank') then the expression class is not called, and the static method is not invoked.<BR /> <BR /> Other Tips -<BR /> <BR /> 1. The Function Module - CNTRL_CONTRACT_OM_TRIGGER gets triggered for Central Purchase contracts for issuing output. It can be debugged for any behaviour conceptualization.<BR /> 2. Always put an external breakpoint on SAP_WFRT (Workflow User) and analyse.<BR /> <BR /> To further ignite the passion, I would like to highlight few practical use cases - this approach can be used to dynamically control output issuance like issue output only if Distribution Lines in a Contract are active, send emails to different recipients based on priority, etc.<BR /> <BR /> Please provide your valuable feedback.<BR /> <BR /> Thanks. 2022-03-23T17:30:15+01:00 https://community.sap.com/t5/technology-blogs-by-members/transport-changes-related-to-brf-object/ba-p/13525394 Transport changes related to BRF+ object 2022-03-25T09:02:42+01:00 former_member793622 https://community.sap.com/t5/user/viewprofilepage/user-id/793622 In OPD UI there is no way with which you can change the transport request hence, in this document I am going to show you a workaround<BR /> <BR /> One option is to use transaction FDT_HELPERS which is explained in the blog post <A href="https://blogs.sap.com/2017/07/29/transport-and-include-brfplus-objects-to-transport-request/" target="_blank" rel="noopener noreferrer">here</A><BR /> <BR /> In this blog post I am suggesting another way to write your changes related to decision tables to a TR<BR /> <BR /> First, you need to fetch the object id for a decision table which you can get by following the below steps<BR /> <BR /> In OPD transaction, select the object and determination step<BR /> <BR /> Click more&gt; display object version<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/ss-1.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Expand General section and copy the object id or make a note of it<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/OPD-2.jpg" /><BR /> <BR /> &nbsp;<BR /> <BR /> Execute BRF+ Tcode in SAP gui and switch the user mode to expert (KBA2830979)<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/exp-mode-brf-1.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Go to workbench and select open object<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/brf2.jpg" /></P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px">Search with the object id copied above</P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/BRF3-1.jpg" /></P><BR /> &nbsp;<BR /> <BR /> From here you can write your changes to a TR by clicking transport<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/03/BRF4-1.jpg" /></P><BR /> Once you click on transport, a pop up will appear where you can enter your TR number to which you want to write your changes.<BR /> <BR /> Tip- You can use this method instead of OPD (once you find the object id) as this screen offers more features than OPD UI<BR /> <BR /> Bonus Tip- While importing the OPD related changes make sure the OPD screen is not open otherwise the changes wont be copied in the target client<BR /> <BR /> &nbsp;<BR /> <BR /> Thank you, Please provide your valuable feedback or do let me know if you have any questions<BR /> <BR /> &nbsp;<BR /> <BR /> Thanks,<BR /> <BR /> Siddhant S.<BR /> <BR /> &nbsp;<BR /> <BR /> &nbsp; 2022-03-25T09:02:42+01:00 https://community.sap.com/t5/technology-blogs-by-members/pfcg-based-agent-rule-on-steroids/ba-p/13533699 PFCG based agent rule on steroids :) 2022-04-27T09:21:45+02:00 saif_kausar https://community.sap.com/t5/user/viewprofilepage/user-id/590714 <STRONG>Requirement:</STRONG> Many clients do not have one to one or one to many assignment of roles to role owners rather they have some specific logic to define role owners. In our setup, GRC approvers are defined based on functional area, business process, connector etc. For easy maintenance of GRC approvers role-based agent rule was created.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>Resolution:</STRONG> Create a BRF+ Agent rule that will fetch approvers, based on decision table criteria and dummy role assignment.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>BRF+ Design: </STRONG><BR /> <BR /> Below Steps will be followed to achieve required results:<BR /> <BR /> Step 1: Create Structure “AGR_USERS”<BR /> <BR /> Step 2: Create a decision table to provide “dummy role name” based on suitable selection.<BR /> <BR /> Step 3: Create a DB lookup on table “AGR_USERS” to fetch users assigned to appropriate dummy roles.<BR /> <BR /> Step 4: Create a “Ruleset” to process DB lookup and return approvers.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>BRF+ Configuration:</STRONG><BR /> <BR /> You have to generate the BRF+ Rule via Transaction SPRO in GRC system. Follow the below steps in your GRC system.<BR /> <BR /> Run the transaction SPRO, go to IMG =&gt; Governance, Risk and Compliance =&gt;Access Control =&gt;Workflow for Access Control =&gt; Define Workflow related MSMP rules.<BR /> <BR /> Or<BR /> <BR /> Directly execute TCode GRFNMW_DEV_RULES<BR /> <BR /> &nbsp;<BR /> <UL><BR /> <LI>Fill generation criteria (Process ID, Rule type, etc.)</LI><BR /> <LI>Specify Generation options</LI><BR /> <LI>Generate rule shell (Execute button)</LI><BR /> </UL><BR /> After successful rule generation, goto BRF+ to check newly created BRFPlus Application<BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig1.png" /></STRONG></P><BR /> <STRONG>Function Signature update: </STRONG><BR /> <BR /> In BRF+ function, change the mode to “Event Mode” and activate the function as shown below.<BR /> <UL><BR /> <LI>Since Function mode has been changed to “Event mode,” the result data object has changed automatically, so it has to be reset manually</LI><BR /> <LI>In “Signature” tab of BRF Function, change the result data object to GRFN_MW_T_AGENT_ID</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig2-1.png" /></STRONG></P><BR /> <STRONG>Create Structure: </STRONG><BR /> <UL><BR /> <LI>From context menu of BRF+ application, create a Structure and bind it to AGR_USERS.</LI><BR /> <LI>Save and activate this structure.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig3-1.png" /></STRONG></P><BR /> &nbsp;<BR /> <BR /> <STRONG>Create a Decision Table:</STRONG><BR /> <UL><BR /> <LI>From context menu of BRF+ application, create an Expression of type “Decision Table”</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig4-2.png" /></P><BR /> <BR /> <UL><BR /> <LI>Add “Condition” as well as “Result” column based on requirement</LI><BR /> <LI>Note that AGR_NAME in result column can only be selected if structure AGR_USERS has already been created. <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig5-1.png" /></LI><BR /> </UL><BR /> <UL><BR /> <LI>Create dummy roles in GRC backend system and assign to approvers</LI><BR /> <LI>Populate the decision table with business data as required</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig6-1.png" /></P><BR /> <STRONG>&nbsp;</STRONG><BR /> <BR /> <STRONG>Create DB Lookup:</STRONG><BR /> <UL><BR /> <LI>From context menu of BRF+ application, create an Expression of type “DB Lookup”<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig7.png" /></LI><BR /> </UL><BR /> <UL><BR /> <LI>Add below details to the DB Lookup, here we are applying DB lookup based on result received from ZROLEOWNER on table AGR_USERS and inserting user ID into&nbsp; GRFN_MW_T_AGENT_ID</LI><BR /> <LI>Save and generate the DB Lookup</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig8.png" /></STRONG></P><BR /> <STRONG>Create Ruleset:</STRONG><BR /> <BR /> Click “Create and Navigate To Object”<BR /> <BR /> Create Rule as below:<BR /> <P style="overflow: hidden;margin-bottom: 0px"><STRONG> <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig9.png" /></STRONG></P><BR /> <STRONG>&nbsp;</STRONG><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig10.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig11.png" /></P><BR /> Assign the ruleset to the function<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig12.png" /></P><BR /> Go to the function and under assigned ruleset you should be able to fine “GET_APPROVER” ruleset.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig13.png" /></P><BR /> <STRONG>Simulate BRF+ rule:</STRONG><BR /> <BR /> Provide mandatory context values like Business Process, Functional Area, Connector.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/04/fig14.png" /></P><BR /> The function should return users IDs of the role owner as per the settings in decision table.<BR /> <BR /> <STRONG>Conclusion:</STRONG>&nbsp;This custom agent rule will allow us to skip standard role owner maintenance process in GRC and simply assign approvers by assigning them dummy roles created in GRC system. Dummy roles can be created as per our requirement for example based on system\client, departments, business process etc. 2022-04-27T09:21:45+02:00 https://community.sap.com/t5/supply-chain-management-blogs-by-members/transportation-management-dynamic-determination-of-ppf-profiles-using/ba-p/13542120 Transportation Management : Dynamic determination of PPF profiles using BRFPlus 2022-08-10T11:24:49+02:00 former_member204244 https://community.sap.com/t5/user/viewprofilepage/user-id/204244 Hello Everyone,<BR /> <BR /> Welcome to the technical series of the SAP Transportation Management .<BR /> <BR /> With this blog post, we will learn how to assign the BRFPlus application which can be used to determine the PPF action profiles dynamically.<BR /> <BR /> We had the requirement where PPF profiles need to be determined based on TOR Type.<BR /> <UL><BR /> <LI>Lets get started and create the BRFPlus application using Tcode BRFPlus</LI><BR /> <LI>Create the BRF+ Application and then create the Function inside the same app</LI><BR /> </UL><BR /> <H4 id="toc-hId-1219288348">BRF+ Function</H4><BR /> <UL><BR /> <LI>We created the BRF+ Function as ZFUNC_PPF_GET_PPF_PROFILES with below signature<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-142221.jpg" /></LI><BR /> <LI>Here, IT_KEY and IT_KEY_DELETED and ET_PPF_PROFILES are mandatory parameters for BRF+ Function</LI><BR /> <LI>Other two parameters, ZT_FREIGHT_DATA and ZT_PPF_PROFILES are like internal tables ( created for intermediate processing)</LI><BR /> <LI>ET_PPF_PROFILES is the exporting parameter which will hold the PPF Profiles.</LI><BR /> <LI>Next step is to create Ruleset inside the BRF+ Function</LI><BR /> </UL><BR /> <H4 id="toc-hId-1022774843">Ruleset</H4><BR /> <UL><BR /> <LI>We created Ruleset ZRS_GET_PPF_PROFILE</LI><BR /> <LI>First Rule is to read the BOPF data as we need to get the TOR type. Here, you can call any Procedure to read the data</LI><BR /> <LI>So, we have basically called procedure to get the TOR details and stored it into ZT_FREIGHT_DATA<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-142908.jpg" /></LI><BR /> <LI>Now, after getting the data, we need to Loop on the data, and need to get the PPF profiles using the decision table. So Rule2 is as below<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-143534.jpg" /></LI><BR /> <LI>Inside the loop, Decision table is called to get the profiles.<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-143628.jpg" /></LI><BR /> <LI>Decision table is as below:<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-142003.jpg" /></LI><BR /> </UL><BR /> Please note, here, am not giving much complex details of each Rule as that's completely developer's logic to write in his own way. I would like to focus more on the concept.<BR /> <BR /> &nbsp;<BR /> <H3 id="toc-hId-697178619">Configuration:</H3><BR /> After BRF+ Application is created, we need to assign the app and function in the configuration so that PPF action profiles can be determined by calling this BRF+ Function based on TOR type of the document that gets created.<BR /> <P style="overflow: hidden;margin-bottom: 0px">Path is Open SPRO and then follow below path :<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-144832.jpg" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">SPRO</P><BR /> In the Maintain Output Management Adapter Settings, below config is required with Business Object and node :<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/08/Screenshot-2022-08-10-131611.jpg" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Assign BRF+ app</P><BR /> In the Func. for Act. Prof. field, enter the BRFplus selection function that returns the<BR /> list of PPF profiles for a given BO node.<BR /> <BR /> BRF+ application name.BRF+ Function name<BR /> <BR /> After successful configuration and maintenance, PPF profiles will be determined via BRF+ at runtime.<BR /> <BR /> Hope you enjoyed reading.<BR /> <BR /> &nbsp;<BR /> <BR /> Part1 of the series : <A href="https://blogs.sap.com/2022/07/18/transportation-management-read-freight-documents-from-delivery/" target="_blank" rel="noopener noreferrer">Transportation Management : Read Freight documents from Delivery | SAP Blogs</A><BR /> <BR /> &nbsp;<BR /> <BR /> Part2 of the series : <A href="https://blogs.sap.com/2022/07/19/part2-transportation-management-read-carrier-details-from-freight-order/" target="_blank" rel="noopener noreferrer">PART2 – Transportation Management : Read Carrier details from Freight Order | SAP Blogs</A><BR /> <BR /> &nbsp;<BR /> <BR /> Part3 of the series : <A href="https://blogs.sap.com/2022/07/20/part3-transportation-management-get-route-details-from-freight-unit/" target="_blank" rel="noopener noreferrer">PART3 – Transportation Management : Get Route details from freight Unit | SAP Blogs</A><BR /> <BR /> Thank You<BR /> <BR /> Ishani 2022-08-10T11:24:49+02:00 https://community.sap.com/t5/technology-blogs-by-members/how-to-use-dynamic-so10-text-in-brf-adobe-form-output/ba-p/13530116 How to Use Dynamic SO10 Text in BRF+ Adobe Form Output 2022-09-30T13:09:07+02:00 beyhan_meyrali https://community.sap.com/t5/user/viewprofilepage/user-id/338509 Hi,<BR /> <BR /> In this post ,I would like to share with you, how to use dynamic SO10 text elements on standard Adobe form that you maintain with SFP tcode and also show you, how to achieve same thing with BRF+ Adobe form outputs those need to be maintained in Adobe Live Cycle application.<BR /> <BR /> &nbsp;<BR /> <BR /> <SPAN style="text-decoration: underline"><STRONG>SFP PART</STRONG></SPAN><BR /> <BR /> <SPAN style="text-decoration: underline">For non BRF+ cases</SPAN>, If you want to use SO10 text elements with their styles in Adobe form, you can&nbsp; go to SFP transaction, create a form and add TEXT element to context, bind that text element to a text object on layout. That is it, it will work nicely.<BR /> <BR /> You can drag and drop from context to layout. It will create necessary element on layout with bindings.<BR /> <BR /> First lets see, how we can do it with SFP tcode.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/To-Add-text-1.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">To Add Text to Context</P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/Dynamic-Text-ShipType-Text.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Non BRF+ Form</P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/ShipTypeText.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">Layout Object properties for TEXT element</P><BR /> &nbsp;<BR /> <BR /> And sample code to read to text for the case above<BR /> <PRE class="language-abap"><CODE> METHOD fill_doc_ship_type_txt.<BR /> DATA: exref TYPE REF TO cx_root.<BR /> TRY.<BR /> CLEAR docstc-ship_type_text_name.<BR /> IF docstc-vstel IS NOT INITIAL AND docstc-vsart IS NOT INITIAL.<BR /> <BR /> "Some logic to determine name<BR /> docstc-ship_type_text_name = 'ZDLVY_XYZ' &amp;&amp; docstc-vstel &amp;&amp; '_' &amp;&amp; docstc-vsart.<BR /> CONDENSE docstc-ship_type_text_name NO-GAPS.<BR /> <BR /> IF langu IS INITIAL.<BR /> langu = 'E'.<BR /> ENDIF.<BR /> <BR /> docstc-ship_type_text_langu = langu.<BR /> <BR /> CALL FUNCTION 'READ_TEXT'<BR /> EXPORTING<BR /> id = 'ST'<BR /> language = docstc-ship_type_text_langu<BR /> name = docstc-ship_type_text_name<BR /> object = 'TEXT'<BR /> TABLES<BR /> lines = docstc-ship_type_text "Contains text lines, type TSFTEXT<BR /> EXCEPTIONS<BR /> id = 1<BR /> language = 2<BR /> name = 3<BR /> not_found = 4<BR /> object = 5<BR /> reference_check = 6<BR /> wrong_access_to_archive = 7<BR /> OTHERS = 8.<BR /> IF sy-subrc &lt;&gt; 0.<BR /> <BR /> IF langu NE 'E'.<BR /> result = fill_doc_ship_type_txt( langu = 'E' ).<BR /> ELSE.<BR /> result-status = c_stat_warning.<BR /> IF NOT sy-msgid IS INITIAL.<BR /> MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno<BR /> WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4<BR /> INTO result-status_text.<BR /> ENDIF.<BR /> ENDIF.<BR /> <BR /> ELSE.<BR /> result-status = c_stat_success.<BR /> ENDIF.<BR /> <BR /> ELSE.<BR /> result-status = c_stat_error.<BR /> ENDIF.<BR /> <BR /> CATCH cx_root INTO exref.<BR /> result-status = c_stat_error.<BR /> result-status_text = exref-&gt;get_text( ).<BR /> ENDTRY.<BR /> ENDMETHOD.</CODE></PRE><BR /> That is it for SFP form. With those steps above, you can use TEXT element with dynamic text objects in non BRF+ forms.<BR /> <BR /> &nbsp;<BR /> <BR /> <EM><STRONG>BRF+ PART</STRONG></EM><BR /> <BR /> But, <SPAN style="text-decoration: underline"><STRONG>if you want to have same functionality with BRF+</STRONG></SPAN>, you need to download your form from fiori app "Maintain Form Templates" and then edit form in Adobe Live Cycle Designer. Once you complete editing you need to upload them back. The problem is,&nbsp;Adobe Live Cycle Designer <SPAN style="text-decoration: underline"><STRONG>does not have</STRONG> context to add TEXT</SPAN> object. It does not know about SAP SO10.<BR /> <BR /> There is a solution! <span class="lia-unicode-emoji" title=":slightly_smiling_face:">🙂</span> You can pass string that contains html tags such as &lt;b&gt;&lt;/b&gt; and run Javascript code events to interpret the string as html.<BR /> <BR /> Now lets see how to do that.<BR /> <BR /> First we need to add tags to our SO10 text.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/so10.png" height="214" width="528" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">in Word Editor</P><BR /> &nbsp;<BR /> <BR /> In XYZ_get_entityset method we will read our text and concatenate it according SO10.<BR /> <PRE class="language-abap"><CODE>method xyz_get_entitsey.<BR /> ............<BR /> <BR /> CALL FUNCTION 'READ_TEXT' <BR /> EXPORTING <BR /> id = 'ST' <BR /> language = 'E' <BR /> name = name <BR /> object = 'TEXT' <BR /> TABLES <BR /> lines = texts-tdlines <BR /> EXCEPTIONS <BR /> id = 1 <BR /> language = 2 <BR /> name = 3 <BR /> not_found = 4 <BR /> object = 5 <BR /> reference_check = 6 <BR /> wrong_access_to_archive = 7 <BR /> OTHERS = 8. <BR /> <BR /> IF sy-subrc IS INITIAL. <BR /> <BR /> CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT' <BR /> EXPORTING <BR /> language = 'E' <BR /> lf = abap_true <BR /> IMPORTING <BR /> stream_lines = texts-strlines <BR /> TABLES <BR /> itf_text = texts-tdlines. <BR /> <BR /> "Add Lines to entityset table <BR /> DATA: newline TYPE LINE OF zcl_zfdp_ef_purchase_o_mpc=&gt;tt_pofixtext. <BR /> LOOP AT texts-strlines ASSIGNING FIELD-SYMBOL(&lt;wa&gt;). <BR /> CLEAR newline. <BR /> newline-seqno = sy-tabix. <BR /> newline-tdline = &lt;wa&gt;. <BR /> <BR /> "Some sort of logic to open close tags for each line, in case if user forgets to add <BR /> "Javascript event will work for each line,therefore tags needs to exists for each line<BR /> IF newline-tdline CP '*&lt;b&gt;*' AND NOT newline-tdline CP '*&lt;/b&gt;*'. <BR /> newline-tdline = newline-tdline &amp;&amp; '&lt;/b&gt;'. <BR /> ELSEIF newline-tdline CP '*&lt;/b&gt;*' AND NOT newline-tdline CP '*&lt;b&gt;*'. <BR /> newline-tdline = '&lt;b&gt;' &amp;&amp; newline-tdline. <BR /> ENDIF. <BR /> <BR /> IF newline-tdline CP '*&lt;u&gt;*' AND NOT newline-tdline CP '*&lt;/u&gt;*'. <BR /> newline-tdline = newline-tdline &amp;&amp; '&lt;/b&gt;'. <BR /> ELSEIF newline-tdline CP '*&lt;/u&gt;*' AND NOT newline-tdline CP '*&lt;u&gt;*'. <BR /> newline-tdline = '&lt;u&gt;' &amp;&amp; newline-tdline. <BR /> ENDIF. <BR /> <BR /> IF newline-tdline CP '*&lt;i&gt;*' AND NOT newline-tdline CP '*&lt;/i&gt;*'. <BR /> newline-tdline = newline-tdline &amp;&amp; '&lt;/b&gt;'. <BR /> ELSEIF newline-tdline CP '*&lt;/i&gt;*' AND NOT newline-tdline CP '*&lt;i&gt;*'. <BR /> newline-tdline = '&lt;i&gt;' &amp;&amp; newline-tdline. <BR /> ENDIF. <BR /> <BR /> APPEND newline TO et_entityset. <BR /> ENDLOOP. <BR /> ENDIF. <BR /> ..........<BR /> endmethod.<BR /> <BR /> </CODE></PRE><BR /> &nbsp;<BR /> <BR /> Add a table to list rows, as you would do for any table view.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/adobeset.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">shows Tdline element of table</P><BR /> &nbsp;<BR /> <BR /> And just add a javascript initialize event with following code.<BR /> <PRE class="language-javascript"><CODE>// Form.FixText.xyz.Tdline::initialize - (JavaScript, client)<BR /> if(this.rawValue != null)<BR /> {<BR /> var envelope = "&lt;?xml version='1.0' encoding='UTF-8'?&gt;" +<BR /> "&lt;exData contentType='text/html' xmlns='http://www.xfa.org/schema/xfa-template/2.8/'" +<BR /> "&gt;&lt;body xmlns='http://www.w3.org/1999/xhtml' xmlns:xfa='http://www.xfa.org/schema/xfa-data/1.0/' " +<BR /> "xfa:APIVersion='Acroform:2.7.0.0' xfa:spec='2.1'&gt;" +<BR /> "&lt;p&gt;"+ this.rawValue +"&lt;/p&gt;&lt;/body&gt;&lt;/exData&gt;";<BR /> <BR /> this.value.exData.loadXML(envelope,1,1);<BR /> }<BR /> </CODE></PRE><BR /> &nbsp;<BR /> <BR /> And if you print, you will see;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/09/pdfoutput.png" /></P><BR /> <P class="image_caption" style="text-align: center;font-style: italic">PDF Output</P><BR /> &nbsp;<BR /> <BR /> &nbsp;<BR /> <BR /> There were blog posts and answers to give clues on solving BRF+ and SO10 case. But there was not a complete answer. Therefore I decided to write a post. Hope that helps you.<BR /> <BR /> If you know an alternative solution, please add it to comments.<BR /> <BR /> Thanks for reading.<BR /> <BR /> &nbsp;<BR /> <BR /> <SPAN style="text-decoration: underline">Links:</SPAN><BR /> <BR /> <A href="https://blogs.sap.com/2014/06/09/how-to-place-an-se78-image-on-an-adobe-form/" target="_blank" rel="noopener noreferrer">A blog post</A> on dynamically placing image on form from se78.<BR /> <BR /> And this class is quite useful : <STRONG>cl_ssf_xsf_utilities</STRONG> , check the methods. 2022-09-30T13:09:07+02:00 https://community.sap.com/t5/technology-blogs-by-members/using-brfplus-in-sap-adhoc-query/ba-p/13564084 Using BRFplus in SAP Adhoc Query 2022-11-09T19:45:44+01:00 Binu_Jacob https://community.sap.com/t5/user/viewprofilepage/user-id/56336 SAP has two powerful frameworks to support a functional consultant. These are:<BR /> <UL><BR /> <LI>BRFplus</LI><BR /> <LI>SAP Adhoc query.</LI><BR /> </UL><BR /> In this blog I would like to share my experience in calling a BRFplus function within an SAP Adhoc query. This I hope with help in extending the reach that BRFplus and SAP Adhoc query can provide for your requirements.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>Scenario:</STRONG><BR /> <BR /> I am using an Adhoc query based on a simple table based infoset to display a set of fields. The query reads data from a custom table used in a custom application developed with ABAP. Now in the underlying infoset used by the adhoc query, I have created an 'additional field' called 'staff' which is populated by a call to a BRFplus function.<BR /> <BR /> Of course, there are other means to populate this additional field but the use of BRFplus is just to illustrate the power in using the combination of SAP Adhoc query with BRFplus.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>A: Create a simple BRFplus application:</STRONG><BR /> <BR /> While this blog is focused mainly to show the use of both the above frameworks in tandem, I will not be going through in detail to create the brfplus artifacts. So only the high-level steps are shown.<BR /> <BR /> <STRONG>This involves:</STRONG><BR /> <BR /> 1. Creating an application in BRFplus (the transaction code is brfplus)<BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/2022-11-07_140205.jpg" /></P><BR /> &nbsp;<BR /> <BR /> 2. Create the Function:<BR /> <BR /> This function has the input of 'User' (based on field UserID) and outputs 'PERNR' (based on fied PERNR). The ruleset used (ZJB01RS) consists of a 'Rule' that reads table 'PA0105' (standard table in HCM) passing User (UserID) and Subtype and fetching PERNR from table PA0105.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/2-3.jpg" /></P><BR /> The RULESET called ZJB01RS.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/3-1.jpg" /></P><BR /> The Database lookup "FETCHPERNR" used in rule above.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/4-2.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Once the BRFplus artifacts are saved and activated the 'simulation' to check the application is below.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/5-2.jpg" /></P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/6-3.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Now that the BRFplus application works, the 'Class' to be generated as below. Use the "Generate Function" to do this under the "Code Generation' tab<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/7-2.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Now to display the "code template' to be used in our infoset in the SAP Adhoc query. Click on the "Create Code Template' button (see the above image).<BR /> <BR /> The code template is as shown below. Copy this code to be later used in our 'INFOSET'.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/8-2.jpg" /></P><BR /> &nbsp;<BR /> <BR /> <STRONG>B: The SAP ADHOC Query:</STRONG><BR /> <BR /> The adhoc query creation has 2 steps:<BR /> <BR /> <STRONG>1.Create the Infoset</STRONG>:<BR /> <BR /> The infoset created using transaction 'SQ02' is based on a simple table as shown below.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/9-1.jpg" /></P><BR /> I have added the required fields from the table and also create an 'Additional field' called 'staff'.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/10-2.jpg" /></P><BR /> &nbsp;<BR /> <BR /> I will populate this field called 'Staff' using the brfplus function created earlier. Right click on the field "staff" and go to "field code".<BR /> <BR /> Copy and paste the 'Code Template"" that we created in the brfplus to the below and make minor modifications in the code.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/11-1.jpg" /></P><BR /> The modifications needed to read the data from the brfplus is below:<BR /> <OL><BR /> <LI>There is a field in the infoset called "Name of the person who changed the object". This field is of the type "UserID'. Use the technical name of the field and assign to the input parameter of the code.<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/12-1.jpg" /></LI><BR /> <LI>Similarly assign the output parameter as below. Field 'Staff' is assigned to the importing field 'ea_result".</LI><BR /> </OL><BR /> <PRE class="language-abap"><CODE> TRY.<BR /> cl_fdt_function_process=&gt;process( EXPORTING iv_function_id = lv_function_id<BR /> iv_timestamp = lv_timestamp<BR /> IMPORTING ea_result = staff <BR /> CHANGING ct_name_value = lt_name_value ).<BR /> CATCH cx_fdt into lx_fdt.</CODE></PRE><BR /> &nbsp;<BR /> <BR /> Save and Generate the infoset and assign to the appropriate 'User Group".<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG>2. Create the query based on the above infoset.</STRONG><BR /> <BR /> Create the Query based on the above infoset<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/13-1.jpg" /></P><BR /> The fields used<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/14-1.jpg" /></P><BR /> &nbsp;<BR /> <BR /> Now execute the query. You will see the field "Staff" getting populated from the brfplus as below.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/11/15-1.jpg" /></P><BR /> &nbsp;<BR /> <BR /> This blog post only provides a high-level overview of the creation of the BRFplus application and SAP Query since the idea was to only provide how BRFplus can be used in SAP Query and expand the reach of these two frameworks. Should you need details on the creation of the above artifacts, I am happy to provide.<BR /> <BR /> If you have any questions, you can comment below. I would love to hear from you on how you were able to use this option to provide more value to your business.<BR /> <BR /> &nbsp; 2022-11-09T19:45:44+01:00 https://community.sap.com/t5/human-capital-management-blogs-by-members/some-useful-and-important-tips-to-overcome-issues-and-challenges-while/ba-p/13566244 Some useful and important tips to overcome issues and challenges while configuring business rules in SAP SuccessFactors employee central (EC) 2022-12-05T04:43:02+01:00 manubhutani https://community.sap.com/t5/user/viewprofilepage/user-id/17674 This article has been written assuming the reader has fair amount of knowledge about Employee central and business rules. This can be handy for every functional configurator while working on business rules. Business rules can become highly complex sometimes, not in terms of writing the logic but testing as well. I would like to share some important points in this article that can be helpful for every configurator including a beginner.<BR /> <BR /> <STRONG>1</STRONG>. It is always suggested to choose the application specific <STRONG>category</STRONG> from rule scenario instead of directly taking a basic rule. This will be helpful to avoid <STRONG>unexpected issue</STRONG> or rework later. Choosing a rule category restricts the base objects for you.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled.png" height="117" width="504" /></P><BR /> <STRONG>2.</STRONG> It's very common at every client to configure background elements. Before you take a requirement to update these elements, please keep in mind that business rules are currently <STRONG>NOT</STRONG> supported for <STRONG>background elements</STRONG>.<BR /> <BR /> <STRONG>3</STRONG>. Make sure you choose the <STRONG>Model</STRONG> base objects ex. Job information model to write logic on field <STRONG>properties</STRONG> (ex. required, visibility, previous). System can only work on values with non-model objects ex. Job information.<BR /> <BR /> <STRONG>4</STRONG>. Make sure to choose 'Rule for Hire/Rehire' from rule category if you want your rule to get triggered only during <STRONG>new hire</STRONG> or <STRONG>rehire</STRONG>. This will restrict the base object to only Employee Information" and "Employee Information Model". But it <STRONG>does not mean</STRONG> that rules with other Base Objects will not trigger in during New Hire. All rules related to employee data (ex. with base entity job info or job info model), will trigger during new hire and rehire.<BR /> <BR /> <STRONG>5</STRONG>. To write business rules for complex requirements, <STRONG>variables</STRONG> can be explored to start with. Storing variables initially, helps reduce the processing logic. I would recommend starting to write the logic flow on a piece of paper and start configuring the rule. You may also come across some limitations of business rules while configuring so sooner the better you start configuring it.<BR /> <BR /> <STRONG>6</STRONG>. Make sure you <STRONG>don't</STRONG> configure more than <STRONG>5 cross entity</STRONG> business rules for an HRIS element ex. Job information portlet. System will give an error if you assign more than 6 cross entity rules. So, it is very important to make sure you haven't chosen cross entity rule from rule category when requirement can be met with a basic rule.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-1.png" height="141" width="229" /></P><BR /> <STRONG>7</STRONG>. Cross entity rules are triggered onSave. Limited functionality is given for onChange. Please note that cross entity rules assigned OnSave to Job info portlet are triggered from Position to Job Info sync rule. Support for onchange cross portlets is introduced for a limited functionality. It works for Job information, Compensation Information and Pay component Recurring when both Job Information and Compensation Information Change checkboxes are selected in MSS UI (Take action).<BR /> <BR /> <STRONG>8</STRONG>. To compare the values in the rule logic it is very important that <STRONG>data type</STRONG> of both fields match. Ex. you want to compare value from an MDF record using operator (&lt;,&gt;) with amount on recurring compensation information portlet, if you are not able to select amount on right side then try using any <STRONG>operator ex. Divide</STRONG>. In this case you will be able to select dividend from employee's comp info and divisor can be 1.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-2.png" height="60" width="595" /></P><BR /> <STRONG>9</STRONG>. Always use <STRONG>Business rule execution log</STRONG> (<STRONG>rule trace</STRONG>) to debug the rule. Most of the issues can be solved reviewing the trace. Make sure to enter your business rule name if you want to review only your rule logic. In case you want to review the whole log including all rules triggered during a transaction then don't enter the rule name.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-3.png" height="185" width="367" /></P><BR /> <STRONG>10</STRONG>. You can use the <STRONG>export and import utility</STRONG> to quickly export your business rule from one instance and import into another. Select the object 'Rule' to export the rules. The column' body' in the csv export will have the business rule logic.<BR /> <BR /> <STRONG>11</STRONG>. As you know '<STRONG>Lookup'</STRONG> is used to read records from a table. Please note that this function works with only MDF but not Foundation objects.<BR /> <BR /> <STRONG>12</STRONG>. Never <STRONG>delete</STRONG> a business rule from an instance if it is assigned to an HRIS element for ex. Job information portlet. If you do you won't be able to open the configuration screen. In this example if you delete a business rule that has been assigned on job info portlet then when you open Manage business configuration and clock Job info you will get an error. In this case create a <STRONG>dummy</STRONG> rule with same name, remove the assignment from job info portlet and then delete the dummy rule.<BR /> <BR /> <STRONG>13</STRONG>. You may come across a requirement to modify the employment dates like hire date, employment end date using a business rule but try to avoid doing that because it may lead to data issues and <STRONG>inconsistencies</STRONG>.<BR /> <BR /> <STRONG>14</STRONG>. Always try to search <STRONG>existing</STRONG> business rule that can be modified or updated to include new requirement instead of directly creating a new rule. For ex. if you have a default a value on Job Info based on value in another field then assess similar existing rules instead of creating a new one. More the number of business rules, more is the execution time for a transaction. Number of business rules is inversely proportional to performance.<BR /> <BR /> <STRONG>15</STRONG>. Make use of '<STRONG>Context</STRONG>' for business rules to prevent unnecessary triggering of business rules. You can select context by clicking details in Manage business configuration.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-5.png" height="23" width="513" /></P><BR /> For ex. you may not want a workflow rule to trigger during mass changes of data. In that case select 'Mass changes' No so that rule is not triggered during mass changes. Another example could be related to data conversion or imports. If you don't want a particular rule to get triggered during Imports, then select 'No' for imports.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-4.png" height="232" width="235" /></P><BR /> <STRONG>16</STRONG>. If you come across a requirement to trigger a rule based on <STRONG>event reason</STRONG> attribute on Job info but you don't see event reason field from manage business configuration (MBC) then enable it. This field is hardcoded in data model so it's not necessary to enable in from MBC unless you want to configure 'onChange' rule on this field.<BR /> <BR /> <STRONG>17</STRONG>. If you have <STRONG>multiple if else</STRONG> conditions in your rule, then try to keep those conditions on top that belongs to major employee population i.e., condition that narrows down the criteria the most.<BR /> <BR /> <STRONG>18. </STRONG>If you have a requirement to <STRONG>default a job relationship</STRONG> during <STRONG>hire/rehire,</STRONG> then it is suggested to add matrix relationship to the position of new hire employee. During new hire the matrix relationships from position are synced to job relationships (enable this setting in Position management settings). You cannot set the user id for a relationship in job relationship portlet during hire/rehire due to system limitation.<BR /> <BR /> <STRONG>19</STRONG>. If you have a requirement to set the field property editable, read only etc. for an MDF attribute then you have to create a <STRONG>configuration UI</STRONG> (Manage configuration UI) for the MDF and create a <STRONG>UI rule</STRONG> as shown below as an example.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/Untitled-6.png" height="212" width="341" /></P><BR /> <STRONG>20. </STRONG>If you have integration from Employee Central to Employee Central payroll and you have a requirement to make person id 8 digits through a business rule, then use the format function in business rule as shown below. Template %08d means that total digits in person id will be 8 digits.<BR /> <BR /> Ex if your person id range (in sequence MDF) starts from 1000 then this rule will make that value 00001000.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2022/12/s.png" height="84" width="469" /></P> 2022-12-05T04:43:02+01:00 https://community.sap.com/t5/technology-blogs-by-members/utility-for-copying-mdg-brf-workflow-decision-tables/ba-p/13548921 Utility for copying MDG BRF+ workflow Decision Tables 2023-02-15T13:15:07+01:00 wilbert_sison2 https://community.sap.com/t5/user/viewprofilepage/user-id/186461 If for any reason, you have a fairly detailed segmentation of BP types and activities in MDG, there's a chance you have had to copy over BRF+ workflows.<BR /> <BR /> Now, this is not a terribly difficult thing to do as the Import/Export functionality in BRF+ is a great feature. However minor changes can be a headache and I was getting tired of clicking the Import/Export button every time that happens.<BR /> <BR /> Below is a little code I used to quickly copy over data the workflow BRF+ decision tables from one Change Request Workflow into another.<BR /> <BR /> It's obviously rough. The error management could be improved, but it's good enough for occasional adjustment activity.<BR /> <BR /> <STRONG>Helper Class&nbsp;</STRONG><BR /> <BR /> This is the local class I used as a helper.<BR /> <PRE class="language-abap"><CODE>CLASS lcl_brf DEFINITION.<BR /> PUBLIC SECTION.<BR /> METHODS get_reference_decision_tab<BR /> IMPORTING iv_crtype TYPE string<BR /> RAISING zcx_mdg.<BR /> METHODS get_decision_tab_object<BR /> IMPORTING iv_name TYPE string<BR /> RETURNING VALUE(ro_object) TYPE REF TO cl_fdt_decision_table<BR /> RAISING zcx_mdg.<BR /> METHODS get_decision_tab_data<BR /> IMPORTING iv_name TYPE string<BR /> RETURNING VALUE(rt_decision_tab) TYPE if_fdt_Decision_table=&gt;ts_table_data<BR /> RAISING zcx_mdg.<BR /> METHODS copy_to<BR /> IMPORTING iv_crtype TYPE string<BR /> RAISING zcx_mdg.<BR /> METHODS copy_decision_table<BR /> IMPORTING iv_name TYPE string<BR /> it_decision_tab TYPE if_fdt_Decision_table=&gt;ts_table_data<BR /> RAISING zcx_mdg.<BR /> <BR /> METHODS constructor.<BR /> <BR /> PRIVATE SECTION.<BR /> DATA mo_brf_query TYPE REF TO if_fdt_query.<BR /> DATA mo_brf_factory TYPE REF TO if_fdt_factory.<BR /> DATA mt_user_agent TYPE if_fdt_decision_table=&gt;ts_table_data.<BR /> DATA mt_non_user_agent TYPE if_fdt_decision_table=&gt;ts_table_data.<BR /> DATA mt_single_value TYPE if_fdt_decision_table=&gt;ts_table_data.<BR /> ENDCLASS.<BR /> <BR /> CLASS lcl_brf IMPLEMENTATION.<BR /> METHOD constructor.<BR /> mo_brf_factory ?= cl_fdt_factory=&gt;if_fdt_factory~get_instance( ).<BR /> mo_brf_query ?= mo_brf_factory-&gt;get_query( ).<BR /> ENDMETHOD.<BR /> METHOD get_decision_tab_data.<BR /> DATA : o_decision_table TYPE REF TO cl_fdt_decision_table.<BR /> mo_brf_query-&gt;get_ids(<BR /> EXPORTING<BR /> iv_name = CONV #( iv_name )<BR /> iv_object_type = if_fdt_constants=&gt;gc_object_type_expression<BR /> IMPORTING<BR /> ets_object_id = DATA(app_ids) ).<BR /> o_decision_table ?= mo_brf_factory-&gt;get_expression( app_ids[ 1 ] ) .<BR /> o_decision_table-&gt;if_fdt_decision_table~get_table_data( IMPORTING ets_data = rt_decision_tab ).<BR /> ENDMETHOD.<BR /> METHOD get_reference_decision_tab.<BR /> DATA : o_ref_decision_table TYPE REF TO cl_fdt_decision_table.<BR /> mt_user_agent = get_decision_tab_data( |DT_USER_AGT_GRP_{ iv_crtype }| ).<BR /> mt_non_user_agent = get_decision_tab_data( |DT_NON_USER_AGT_GRP_{ iv_crtype }| ).<BR /> mt_single_value = get_decision_tab_data( |DT_SINGLE_VAL_{ iv_crtype }| ).<BR /> ENDMETHOD.<BR /> METHOD get_decision_tab_object.<BR /> mo_brf_query-&gt;get_ids(<BR /> EXPORTING<BR /> iv_name = CONV #( iv_name )<BR /> iv_object_type = if_fdt_constants=&gt;gc_object_type_expression<BR /> IMPORTING<BR /> ets_object_id = DATA(app_ids) ).<BR /> ro_object ?= mo_brf_factory-&gt;get_expression( app_ids[ 1 ] ) .<BR /> ENDMETHOD.<BR /> METHOD copy_decision_table.<BR /> <BR /> <BR /> DATA : o_decision_table TYPE REF TO cl_fdt_decision_table.<BR /> TRY.<BR /> o_decision_table = get_decision_tab_object( iv_name ).<BR /> o_decision_table-&gt;if_fdt_transaction~enqueue( ).<BR /> o_decision_table-&gt;if_fdt_decision_table~set_table_data( EXPORTING its_data = it_decision_tab ).<BR /> o_decision_table-&gt;if_fdt_transaction~activate(<BR /> EXPORTING iv_deep = abap_true<BR /> IMPORTING et_message = DATA(messages)<BR /> ev_activation_failed = DATA(lv_actv_failed) ).<BR /> if lv_actv_failed = abap_true.<BR /> MESSAGE e000(zmdg) WITH 'Error updating' iv_name INTO zcl_messages=&gt;sv_message_text.<BR /> RAISE EXCEPTION TYPE zcx_mdg<BR /> EXPORTING<BR /> mo_messages = NEW zcl_messages( )-&gt;set_system_message( ).<BR /> endif.<BR /> <BR /> o_decision_table-&gt;if_fdt_transaction~save( ).<BR /> o_decision_table-&gt;if_fdt_transaction~dequeue( ).<BR /> CATCH cx_fdt.<BR /> MESSAGE e000(zmdg) WITH 'Error updating' iv_name INTO zcl_messages=&gt;sv_message_text.<BR /> RAISE EXCEPTION TYPE zcx_mdg<BR /> EXPORTING<BR /> mo_messages = NEW zcl_messages( )-&gt;set_system_message( ).<BR /> ENDTRY.<BR /> ENDMETHOD.<BR /> METHOD copy_to.<BR /> <BR /> copy_decision_table( iv_name = |DT_USER_AGT_GRP_{ iv_crtype }|<BR /> it_decision_tab = mt_user_agent ).<BR /> <BR /> copy_decision_table( iv_name = |DT_NON_USER_AGT_GRP_{ iv_crtype }|<BR /> it_decision_tab = mt_non_user_agent ).<BR /> <BR /> copy_decision_table( iv_name = |DT_SINGLE_VAL_{ iv_crtype }|<BR /> it_decision_tab = mt_single_value ).<BR /> <BR /> ENDMETHOD.<BR /> ENDCLASS.</CODE></PRE><BR /> <STRONG>Execution</STRONG><BR /> <BR /> Below is a sample code for using the class above.<BR /> <PRE class="language-abap"><CODE>START-OF-SELECTION.<BR /> TRY.<BR /> DATA(o_brf) = NEW lcl_brf( ).<BR /> <BR /> o_brf-&gt;get_reference_decision_tab( 'ZCR1' ).<BR /> o_brf-&gt;copy_to( 'ZCR2' ).<BR /> o_brf-&gt;copy_to( 'ZCR3' ).<BR /> CATCH /gerp/cx_mdg INTO DATA(o_error).<BR /> o_error-&gt;mo_messages-&gt;show_as_log( ).<BR /> ENDTRY.</CODE></PRE><BR /> &nbsp;<BR /> <BR /> With that utility, I can update one workflow and then use the utility to copy to all the others.<BR /> <BR /> This approach can be used in decision tables outside of MDG, but note that (1) the structure has to be the same and (2)&nbsp; you have to identify the application name is those situations as the Decision Table Name is not unique.<BR /> <BR /> &nbsp;<BR /> <BR /> &nbsp; 2023-02-15T13:15:07+01:00 https://community.sap.com/t5/supply-chain-management-blogs-by-sap/brf-new-output-management-use-ddic-interface-based-regular-custom-adobe/ba-p/13568423 [BRF+ New Output Management]: Use DDIC Interface based Regular Custom Adobe Form – Handle ‘Spool request could not be found APOC_OR_MESSAGES 145’ 2023-03-10T22:34:24+01:00 robinthakral https://community.sap.com/t5/user/viewprofilepage/user-id/801057 <H2 id="toc-hId-963151584"><STRONG>INTRODUCTION</STRONG><STRONG>:</STRONG></H2><P>For the last few weeks, I have been working on a requirement that required a custom Adobe form for a standard <STRONG>GR label</STRONG> through NACE but later, we had to opt for new BRF+ O/P management. The ideal approach is to use fragmented Adobe form, but the number of fields was not there in the standard service interface. So, we opted for the&nbsp;<STRONG>DDIC interface option available in ‘Assign Form Templates’</STRONG>.<BR /><BR />Challenge: To achieve this requirement, I had faced a couple of challenges:</P><OL><OL><LI>Spool request could not be found - APOC_OR_MESSAGES (145): Discussed in this blog.</LI><LI>Dump - /BOBF/CX_FRW_FATAL – CLASS CL_APOC_OR_A_ITEM_GET_DOCUMENT: Create a Z* Driver program for the form individually and check the issue there – for my case, <A href="https://help.sap.com/saphelp_nwmobile71/helpdata/en/43/f0638873b56bede10000000a11466f/frameset.htm" target="_blank" rel="noopener noreferrer">ADS Configuration</A> was the issue, handled by me and basis tech guy</LI><LI>Bar code center alignment: <A href="https://blogs.sap.com/2023/03/16/adobe-form-centre-alignment-of-barcode-128-with-xml-schema/" target="_blank" rel="noopener noreferrer">Centre Alignment of BARCODE</A><SPAN> blog.</SPAN></LI></OL></OL><P><BR />In this blog post we will cover the steps to print GR Label and handle <STRONG>Spool request could not be found - APOC_OR_MESSAGES (145)</STRONG>.</P><H2 id="toc-hId-766638079"><STRONG>MAIN CONTENT</STRONG><STRONG>:</STRONG></H2><OL><OL><LI>Firstly, get the name of the standard program – subroutine (Form routine) that you would be triggered in the back-end from the business process. You can later, choose any other sub-routine as well, if that one has better parameters as per your requirement. Make sure the sub-routine you are choosing has *PDF or ADOBE* naming pattern to have the FP_JOB_OPEN/CLOSE else you must manually change the printout subroutine.</LI></OL></OL><P>** In my case, I have used Program – SAPM07DR, Routine - ENTRY_WE03_PDF.</P><P style=" padding-left : 60px; ">2. Create an executable report ZAB_IM_SAPM07DR replicating subroutine-pool SAPM07DR, Includes ZIN_IM_M07DRTOP, ZIN_IM_M07DRSON_PDF from M07DRTOP, M07DRSON_PDF resp. and replace the std. includes with them in program ZAB_IM_SAPM07DR.</P><P style=" padding-left : 60px; ">3. Go to SFP, create a DDIC interface as per the parameters exported in the sub-routine, handle the required processing logic, and create the required layout in ADOBE form to the interface.</P><P style=" padding-left : 60px; "><STRONG>4. Point of solution</STRONG>: In the subroutine, FORM_OPEN_PDF, just before FP_JOB_OPEN – handle the output parameters as below, as per <A href="https://me.sap.com/notes/0003016791" target="_blank" rel="noopener noreferrer">SAP KBA 3016791 - Error 'Spool request could not be found.'</A>:</P><P>&nbsp;</P><pre class="lia-code-sample language-abap"><code> gs_outputparams-getpdf = abap_false. gs_outputparams-reqnew = abap_true. gs_outputparams-covtitle = nast-tdcovtitle. gs_outputparams-nodialog = abap_true. gs_outputparams-preview = abap_false.​</code></pre><P>&nbsp;</P><P><BR />Activate the program.</P><P style=" padding-left : 60px; "><BR />5. Share the name to functional or manage it in SPRO.<BR /><BR /></P><UL><UL><LI>Application Area: 'Cross-Application Components'</LI></UL></UL><P>&nbsp;</P><UL><UL><LI>Sub Application Area: 'Output Control'</LI></UL></UL><P>&nbsp;</P><UL><UL><LI>Select the configuration step 'Assign Form Templates' (SSCUI 102313)</LI></UL></UL><P>&nbsp;</P><UL><UL><LI>Maintain<BR /><BR /><UL><UL><LI>Application Object Type - GOODS_MOVEMENT</LI></UL></UL><BR /><UL><UL><LI>Output Type - GOODS_RECEIPT_LABEL</LI></UL></UL><BR /><UL><UL><LI>Form type – 2 – Output Forms (DDIC Interface)</LI></UL></UL><BR /><UL><UL><LI>Form Template ID - ZAF_IM_GR_LABEL</LI></UL></UL><BR /><UL><UL><LI>Program – ZAB_IM_SAPM07DR</LI></UL></UL><BR /><UL><UL><LI>Routine - ENTRY_WE03_PDF<IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/03/assign-form-templates.png" border="0" /></LI></UL></UL></LI></UL></UL><P><EM>(Don’t forget to transport the config data with customizing transport in testing client – Tcode SCC1). </EM><BR /><BR /></P><OL><OL><LI>Now functional will go to transaction OPD or below process, that will trigger Fiori launchpad. <IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/03/OPD.png" border="0" width="523" height="92" /></LI></OL></OL><P style=" padding-left : 30px; ">And edit the entry for the configured form under ‘Form Template’ for Rules for ‘GOODS_MOVEMENT’ replacing the standard form and activate it.&nbsp;</P><H2 id="toc-hId-570124574"><STRONG>Outcome</STRONG><STRONG>:</STRONG></H2><P>Now create a document in the test client for Material document and go to MIGO, enter MBLNR -&gt; output-&gt; Display Outputs.<BR /><BR />Enter a row with Preparation status &amp; and details as per configuration.</P><P style=" padding-left : 30px; "><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/03/MIGO-1.png" border="0" width="467" height="118" /></P><P>Select the row and click Display document (pdf icon)</P><P style=" padding-left : 180px; "><IMG src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/03/output-1.png" border="0" width="424" height="181" /></P><P style=" text-align: center; ">GR_LABEL - Z*FORM*</P><P><BR /><STRONG>Reference links</STRONG>:<BR /><BR /><A href="https://userapps.support.sap.com/sap/support/notes/2736938" target="_blank" rel="noopener noreferrer">2736938 - Settings for processing program and form templates in billing document in new output management</A><BR /><BR /><A href="https://me.sap.com/notes/2294198" target="_blank" rel="noopener noreferrer">2294198 - SAP S/4HANA output control - customized forms</A><BR /><BR /><A href="https://userapps.support.sap.com/sap/support/knowledge/en/2608890" target="_blank" rel="noopener noreferrer">2608890&nbsp;-&nbsp;Standard S/4HANA Output Control settings for Purchasing (output forms and processing programs)</A><BR /><BR /><STRONG>Topic page</STRONG>:<BR /><BR />ABAP Topic: <A href="https://community.sap.com/topics/abap" target="_blank">https://community.sap.com/topics/abap</A>,<BR /><BR />post and answer questions <A href="https://answers.sap.com/tags/833755570260738661924709785639136" target="_blank" rel="noopener noreferrer">https://answers.sap.com/tags/833755570260738661924709785639136</A>.<BR /><BR /><BR />Follow me at&nbsp; <A href="https://www.linkedin.com/in/robinthakral/" target="_self" rel="nofollow noopener noreferrer">Robin Thakral</A></P> 2023-03-10T22:34:24+01:00 https://community.sap.com/t5/technology-blogs-by-sap/idoc-configuration-for-sales-order-via-new-output-management/ba-p/13552496 IDOC Configuration for Sales Order via New Output Management 2023-05-16T10:08:34+02:00 NishuBajpai https://community.sap.com/t5/user/viewprofilepage/user-id/128891 In this blog I would like to share my knowledge and learning for triggering IDOCs for Sales Order using BRF+ OPD concept.<BR /> <BR /> The document will focus on following points<BR /> <OL><BR /> <LI>Configuring Output type</LI><BR /> <LI>Configuring Output type for Sales Order in OPD</LI><BR /> <LI>Required Custom Code Changes</LI><BR /> <LI>Mandatory system configuration</LI><BR /> <LI>Debugging hints</LI><BR /> </OL><BR /> <STRONG><U>Configuration steps for creating Z Output type</U></STRONG><BR /> <BR /> SPRO-&gt;Cross-Application Components-&gt;Output Control<BR /> <OL><BR /> <LI>Define Output Type<IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture1-30.png" /><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture2-27.png" /></LI><BR /> </OL><BR /> 2.Assign Output Channels<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture3-24.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture4-23.png" /></P><BR /> <U style="font-weight: bold">Configuration steps for Output Type via transaction code OPD.</U><BR /> <BR /> &nbsp;<BR /> <OL><BR /> <LI style="list-style-type: none"><BR /> <OL><BR /> <LI>Run transaction OPD, Select Determination Step as Output Type</LI><BR /> </OL><BR /> </LI><BR /> </OL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture5-15.png" /></P><BR /> 2.&nbsp; &nbsp; Determination Step: Receiver<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture6-12.png" /></P><BR /> 3.&nbsp; &nbsp;Determination Step: Channel<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture7-13.png" /></P><BR /> 4.&nbsp; &nbsp;Determination step: Output Relevance<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture8-13.png" /></P><BR /> Output Relevance is based on the business requirement, but entry must exist in this step.<BR /> <BR /> If there is no specific business requirement, we can create it with generic condition like Overall Header = C (as mentioned in above screenshot).<BR /> <BR /> Output type is attached to Sales Order once above steps are complete.<BR /> <BR /> To enable new output management for sales order we need to activate it using following SPRO steps<BR /> <BR /> SPRO-&gt;Cross-Application Components-&gt;Output Control-&gt;Manage Application Object Type Activation<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture9-11.png" /></P><BR /> &nbsp;<BR /> <BR /> Mark status as Application Active for Sales Document.<BR /> <BR /> <STRONG><U>Custom Code Changes</U></STRONG><BR /> <BR /> At the time of defining Output Type, we can add a Z callback class. Create a Class by coyping standard class CL_SD_SLS_OUTPUT and add same under Z Output Type<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture10-11.png" /></P><BR /> In case of IDOC we need to modify method GET_LEGACY_DATA of class ZCL_CL_SD_SLS_OUTPUT<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture11-10.png" /></P><BR /> ET_LEGACY_DATA should be populated with Z output type.<BR /> <BR /> &nbsp;<BR /> <BR /> <STRONG><U>Mandatory System Configuration</U></STRONG><BR /> <OL><BR /> <LI>Customizing for SOMU</LI><BR /> </OL><BR /> <UL><BR /> <LI>Check if the Content Repository "SOMU_DB" exists in transaction OAC0.<BR /> The recommendation is the following:<BR /> Description: Output Management DB Storage<BR /> Storage type: SAP System Database<BR /> Storage subtype: Normal<BR /> Version: 0047<BR /> Content table: SFORM_A_STORAGE</LI><BR /> <LI>Check if the Content Repository "SOMU_DB" is assigned to Category "SOMU" in transaction OACT.</LI><BR /> </UL><BR /> Refer Note <STRONG><U>2279725</U></STRONG> for more details.<BR /> <BR /> 2. Open transaction SBGRFCCONF to check if supervisor destination and Inbound destination is defined or not.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture12-9.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture13-8.png" /></P><BR /> &nbsp;<BR /> <BR /> Supervisor destination should exist in SM59.<BR /> <BR /> For detailed steps follow Note 2292571.<BR /> <BR /> &nbsp;<BR /> <BR /> Once above steps are followed, it will trigger IDOC for sales order.<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture14-8.png" /></P><BR /> <STRONG><U>Debugging Hints</U></STRONG><BR /> <BR /> <STRONG><U>&nbsp;</U></STRONG><BR /> <BR /> Following are the debugging points which can be used if trigger output does not work for any reason<BR /> <OL><BR /> <LI>First and easiest: Breakpoint at constructor in call back class.</LI><BR /> </OL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/05/Picture15-7.png" /></P><BR /> &nbsp; &nbsp; &nbsp; &nbsp; 2. Breakpoint at function module APOC_OR_ISSUE_OUTPUT. This will trigger in update task so update breakpoint should be activated first.<BR /> <BR /> &nbsp;<BR /> <BR /> I have tried covering all the issues which I have encountered during my Research. Hope it is helpful for you. Happy Learning!!<BR /> <BR /> &nbsp;<BR /> <BR /> &nbsp; 2023-05-16T10:08:34+02:00 https://community.sap.com/t5/technology-blogs-by-members/syniti-rdg-provides-a-new-functionality-importing-of-ui-field-property/ba-p/13576475 Syniti RDG provides a new functionality-Importing of UI Field Property Rules by Change Request Step from one change request to another change request. 2023-09-07T11:04:10+02:00 former_member820385 https://community.sap.com/t5/user/viewprofilepage/user-id/820385 C<A href="https://www.sapappcenter.com/apps/59234" target="_blank" rel="nofollow noopener noreferrer">oncento Rapid Data Governance(RDG)</A> is a a SAP endorsed app based on SAP Master Data Governance. SAP Master Data Governance is a powerful solution to improve the quality and consistency of information across organizations by consolidating and centrally governing master data.<BR /> <BR /> This blog illustrates a copy feature in RDG. It involves multiple transactions and steps in SAP application for creating UI field rules in BRF+ and is considered as a complex process. With this feature, we can copy the field property rules from one change request to another change request type by change request step in a single screen.<BR /> <BR /> Below are the steps to copy the field property rules from one change request to another change request by CR step in RDG:<BR /> <UL><BR /> <LI>In the main RDG menu, select “Field Property Configuration.”</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog1.png" height="218" width="528" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>Users must select the change request type to copy the field property rules from the existing change request type.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog2.png" height="263" width="534" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>Select the “By CR Step Type” option in Select Rule Type dropdown.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog3.png" height="287" width="537" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>After selecting the change request type, the user must select the CR step to copy the rules.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog4.png" height="270" width="541" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>After selecting the CR Step, click on “Import” button to start the process of copying the rules.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog5.png" height="259" width="538" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>After clicking on import button, select the source change request, source change request step and the entities and click on “Save”.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog6.png" height="269" width="544" /></P><BR /> &nbsp;<BR /> <UL><BR /> <LI>Select the suitable package.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog7.png" height="108" width="531" /></P><BR /> <BR /> <UL><BR /> <LI>The UI property rules are copied from source cr to target cr .</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog8.png" height="238" width="535" /></P><BR /> <BR /> <UL><BR /> <LI>The copied rule is generated in BRF+ automatically when we do the above process in RDG UI.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/09/blog9.png" height="247" width="538" /></P><BR /> &nbsp;<BR /> <BR /> &nbsp;<BR /> <BR /> <A href="https://store.sap.com/dcp/en/product/display-0000059234_live_v1" target="_blank" rel="noopener noreferrer">Concento RDG</A>&nbsp;is a certified SAP BTP solution and is available on&nbsp;<A href="https://store.sap.com/dcp/en/" target="_blank" rel="noopener noreferrer">SAP App Store</A><BR /> <BR /> Your opinions and feedback are highly appreciated, and feel free to post them in the comments section.<BR /> <BR /> Please follow and read more interesting blogs at <A href="https://blogs.sap.com" target="test_blank" rel="noopener noreferrer">https://blogs.sap.com</A><BR /> <BR /> You can also find and post questions about the product here:&nbsp;<A href="https://answers.sap.com/tags/67837800100800004488" target="_blank" rel="noopener noreferrer">SAP Master Data Governance Community</A> 2023-09-07T11:04:10+02:00 https://community.sap.com/t5/technology-blogs-by-members/mdg-s-mdg-rule-based-workflow/ba-p/13574512 MDG-S: MDG rule-based workflow 2023-10-01T11:29:15+02:00 arijit_dutta https://community.sap.com/t5/user/viewprofilepage/user-id/515729 <H1 id="toc-hId-834874151"><STRONG><U>Introduction:</U></STRONG></H1><BR /> This blog post will describe in detail how to trigger email using using Rule Base Workflow(WS60800086)<BR /> <H1 class="dm-hd dm-align-left dm-section-hero__headline" id="toc-hId-638360646"><U>Requirement:</U></H1><BR /> <UL><BR /> <LI>Bank data in vendor master data when changed (Account no., IBAN, A/C holder name, etc), or deleted, an email notification to be triggered to the vendor</LI><BR /> <LI>Email available in the general section of vendor (LFA1) to be used to send the notification.</LI><BR /> <LI>Email to be triggered to the SPU owners.</LI><BR /> </UL><BR /> <H1 class="dm-hd dm-align-left dm-section-hero__headline" id="toc-hId-441847141"><U>Solution:</U></H1><BR /> For this requirement, I have enhanced the existing sub-workflow WS90100004 using transaction SWDD and the step already defined where BRFplus workflow (<STRONG>WS60800086</STRONG>) to call the sub-workflow. I did not pursue the BADI approach. Set up is already there I just enhance the existing subworkflow WS90100004<BR /> <BR /> <U>Steps to be followed:</U><BR /> <BR /> Tcode: MDGIMG<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/3-1.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/4.png" /></P><BR /> Based on the CR type check the decision table<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/5.png" /></P><BR /> <STRONG>Single Value Decision Table</STRONG><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/1.png" /></P><BR /> <STRONG>Non-User Agent Decision Table</STRONG><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/2.png" /></P><BR /> &nbsp;<BR /> <H2 id="toc-hId-374416355">Sub-workflow <STRONG>WS90100004</STRONG> Overview</H2><BR /> Enhance Subworkflow&nbsp;WS90100004<BR /> <UL><BR /> <LI>This &nbsp;WS90100004 workflow has 2 steps added:<BR /> <UL><BR /> <LI><STRONG>Check for CR Status</STRONG> –&nbsp; Condition steps: Check the status of the CR if status equal = 'AM' (changed by vendor MD team) then trigger email to Vendor and SPU owners</LI><BR /> <LI><STRONG>NOTIFICATION OF BANK ACCOUNT CHANGE</STRONG> – Activity steps: All the ABAP logic ( (Email recipient and email content) placed here in the class /BPMDG/SU_CL_BANK_CHANG_NOTIF and method SEND_NOTIF_BANK_ACCOUNT_CHANGE.</LI><BR /> <LI><STRONG>Workflow End</STRONG></LI><BR /> </UL><BR /> </LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/8.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/6.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/7.png" height="114" width="495" /></P><BR /> &nbsp;<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/9.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/10-1.png" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/11.png" /></P><BR /> &nbsp;<BR /> <BR /> Created 1 Workflow containers: CR_STATUS<BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2023/10/12.png" /></P><BR /> &nbsp;<BR /> <BR /> I hope this blog was useful for those of you trying to get email notification configured for MDG. 2023-10-01T11:29:15+02:00 https://community.sap.com/t5/technology-blogs-by-members/syniti-rdg-provides-a-new-functionality-copying-the-business-rules-from-one/ba-p/13575568 Syniti RDG provides a new functionality-copying the business rules from one change request to another change request 2024-01-15T16:04:05+01:00 ashok704 https://community.sap.com/t5/user/viewprofilepage/user-id/820390 <A href="https://www.sapappcenter.com/apps/59234" target="_blank" rel="nofollow noopener noreferrer">Concento Rapid Data Governance(RDG)</A> is a SAP endorsed app based on Data Governance. It also helps business users to automate many of important steps to implement the MDG.<BR /> <BR /> For example, the user can create different types of business rules effectively to the respective change request in less amount of time. RDG provides a user-friendly interface where all its functionalities would be in a single screen.<BR /> <BR /> In traditional SAP MDG system, the user with low technical knowledge is considered as a high technical task of copying the business rules from one change request to another change request type. RDG is now capable to copy different types of rules in easier way and in less amount of time effectively.<BR /> <BR /> Below are the additional steps to copy the business rules from one change request to another change request in RDG:<BR /> <UL><BR /> <LI>In the main RDG menu, select “Manage Business Rules”.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-15-125130.png" height="246" width="541" /></P><BR /> <BR /> <UL><BR /> <LI>Select change request type to which user want to copy the business rules from existing change request type.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/Screenshot-2024-01-15-125404.png" height="260" width="542" /></P><BR /> <BR /> <UL><BR /> <LI>After selecting the change request type, click on import button to copy the rules.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg1.png" height="359" width="537" /></P><BR /> <BR /> <UL><BR /> <LI>After selecting the existing change request type, the different types of business rules present in that change request can be seen. Then we have to select the rules which we want to copy to the current change request type and click on save button.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg2.png" height="361" width="530" /></P><BR /> <BR /> <UL><BR /> <LI>A status window will be popped up by displaying the status of business rules.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg3.png" height="233" width="534" /></P><BR /> <BR /> <UL><BR /> <LI>The rules which we selected are copied from existing change request to current change request and got generated automatically in Business Rule Framework Plus to respective change request type.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg4.png" height="246" width="537" /></P><BR /> <BR /> <UL><BR /> <LI>Below are the some standard screens related to brf+ where the copied rules generated automatically.</LI><BR /> </UL><BR /> <P style="overflow: hidden;margin-bottom: 0px">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg7.png" height="270" width="534" /></P><BR /> <P style="overflow: hidden;margin-bottom: 0px"><IMG class="migrated-image" src="https://community.sap.com/legacyfs/online/storage/blog_attachments/2024/01/rdg5.png" height="251" width="524" /></P><BR /> &nbsp;<BR /> <BR /> <A href="https://store.sap.com/dcp/en/product/display-0000059234_live_v1" target="_blank" rel="noopener noreferrer">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Concento RDG</A>&nbsp;is certified SAP BTP solution and is available on&nbsp;<A href="https://store.sap.com/dcp/en/" target="_blank" rel="noopener noreferrer">SAP App Store</A><BR /> <BR /> &nbsp; 2024-01-15T16:04:05+01:00 https://community.sap.com/t5/technology-blogs-by-members/mdg-dqm-troubleshooting-dqm-validation-rules-for-central-governance-product/ba-p/13586688 MDG DQM: Troubleshooting DQM validation rules for central governance - Product Master S/4 HANA 2024-01-30T16:03:50.529000+01:00 0012anirban https://community.sap.com/t5/user/viewprofilepage/user-id/39679 <P><FONT face="arial,helvetica,sans-serif">Hi All,</FONT></P><P><FONT face="arial,helvetica,sans-serif">Season's greetings!!&nbsp;</FONT></P><P><FONT face="arial,helvetica,sans-serif">In 2023 I focussed on sharing my insights on the data quality management module of <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Master+Data+Governance/pd-p/67837800100800004488" class="lia-product-mention" data-product="697-1">SAP Master Data Governance</a>&nbsp;through multiple blogs( "<STRONG><EM>as if it was used be called in the old website</EM></STRONG>"). If you have missed some of these then here is a quick link to all of the content published earlier.</FONT></P><OL><LI><FONT face="arial,helvetica,sans-serif">&nbsp;<A class="" href="https://community.sap.com/t5/technology-blogs-by-members/mdg-dqm-enriching-product-master-data-with-derivation-rules-in-s-4-hana/ba-p/13568112" target="_blank">MDG DQM: Enriching product master data with derivation rules in S/4 HANA</A></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;<A class="" href="https://community.sap.com/t5/technology-blogs-by-members/mdg-dqm-employing-rules-in-central-governance-mass-processing-in-s-4-hana/ba-p/13554483" target="_blank">MDG DQM:Employing rules in central governance &amp; mass processing in S/4 HANA</A></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;<A class="" href="https://community.sap.com/t5/technology-blogs-by-members/mdg-dqm-empowering-your-business-with-high-quality-data-in-s-4hana/ba-p/13548515" target="_blank">MDG DQM: Empowering Your Business with High-Quality Data in S/4HANA</A></FONT></LI></OL><P><FONT face="arial,helvetica,sans-serif">As I start 2024, I have delved a little deeper into this topic and with the new community platform launched, I was excited to share some of the insights from <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Master+Data+Governance/pd-p/67837800100800004488" class="lia-product-mention" data-product="697-2">SAP Master Data Governance</a>&nbsp;data quality management on this new platform.</FONT></P><P><FONT face="arial,helvetica,sans-serif">So without further Adieu let's dive in !!</FONT></P><H2 id="toc-hId-964941157"><FONT face="arial,helvetica,sans-serif"><STRONG>INTRODUCTION</STRONG></FONT></H2><P><FONT face="arial,helvetica,sans-serif">In this blog post we will cover a few steps on how we can troubleshoot the BRF+ validations which is the underlying framework for MDG DQM. This module of MDG is still evolving rapidly as we move towards cloud first and a clean core approach. As MDG developers we are still pretty comfortable with classical BADI's for doing validations and we all know it's quite easy to troubleshoot the rules. But when it comes to DQM we might wonder how do my rules get called? how can i troubleshoot my rules if they are not working as expected?&nbsp;</FONT></P><P><FONT face="arial,helvetica,sans-serif">So let's see how we can troubleshoot the rules.</FONT></P><H2 id="toc-hId-768427652"><FONT face="arial,helvetica,sans-serif">MAIN CONTENT</FONT></H2><OL><LI><FONT face="arial,helvetica,sans-serif">&nbsp;DQM rules will be triggered when we click the check button on our MDG UI.<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_1-1706620006918.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56161i2F8C0441F1E7F1EE/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_1-1706620006918.png" alt="0012anirban_1-1706620006918.png" /></span></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;Once click on check the MDQ adapter <STRONG>CL_MDQ_COMMON_ADAPTER_PROD</STRONG> class will be called which will in turn call the MDQ rule engine class&nbsp;<STRONG>CL_MDQ_RULE_ENGINE_CHECK</STRONG>. <span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_2-1706620128164.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56163i456D911503E7AC1C/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_2-1706620128164.png" alt="0012anirban_2-1706620128164.png" /></span></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;This rule engine check method will internally call many other methods and one of the methods which gets called is&nbsp;<STRONG>CL_MDQ_BRFPLUS_HANDLER, </STRONG>this class is responsible for executing the BRF+ functions by calling other standard methods. In this class, we can put a breakpoint in the execute_function method.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_5-1706620872953.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56179i810EC7A5BBFEE045/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_5-1706620872953.png" alt="0012anirban_5-1706620872953.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_6-1706622484448.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56219iBA157582A4B74FBC/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_6-1706622484448.png" alt="0012anirban_6-1706622484448.png" /></span>&nbsp;&nbsp;</FONT></LI><LI><FONT face="arial,helvetica,sans-serif">Inside <STRONG>execute_function</STRONG> we will find an FDT method which processes the BRF+ function.<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_8-1706622830964.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56227i3CE47A14CB6193FF/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_8-1706622830964.png" alt="0012anirban_8-1706622830964.png" /></span></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;Inside the <STRONG>process</STRONG> method, we will get the class name associated with the BRF function ID.&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_10-1706622927337.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56231i6062B6E485D0A3F7/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_10-1706622927337.png" alt="0012anirban_10-1706622927337.png" /></span></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">Using this class name we will call the <STRONG>process_dynamic</STRONG> method of the FDT.<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_11-1706623055370.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56235i15989F6C4614F121/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_11-1706623055370.png" alt="0012anirban_11-1706623055370.png" /></span></FONT></LI><LI><FONT face="arial,helvetica,sans-serif">&nbsp;Inside this method look for the&nbsp;<STRONG>process_pure</STRONG> method which will have the entire BRF+ generated code for a rule which you have created in DQM.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="0012anirban_12-1706623163317.png" style="width: 999px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/56237i9DFD5FF5B0A7D512/image-size/large?v=v2&amp;px=999" role="button" title="0012anirban_12-1706623163317.png" alt="0012anirban_12-1706623163317.png" /></span></FONT></LI></OL><P><FONT face="arial,helvetica,sans-serif">By following these steps you can easily navigate through the DQM validation rule framework troubleshoot your rules and make sure they are working perfectly fine.</FONT></P><H3 id="toc-hId-700996866"><FONT face="arial,helvetica,sans-serif">Scenarios which need troubleshooting:</FONT></H3><P><FONT face="arial,helvetica,sans-serif">1. You import your rule from one system to another, the rule is approved and enabled for check-in change requests but still doesn't work.</FONT></P><P><FONT face="arial,helvetica,sans-serif">2. You modified your BRF+ logic as per your requirements after the initial build, however, the latest rules don't reflect this.</FONT></P><H3 id="toc-hId-504483361"><FONT face="arial,helvetica,sans-serif">System details: </FONT></H3><P><FONT face="arial,helvetica,sans-serif">S/4 HANA 2023 FPS00.</FONT></P><H2 id="toc-hId-178887137"><FONT face="arial,helvetica,sans-serif">CONCLUSION</FONT></H2><P><FONT face="arial,helvetica,sans-serif">By following the above steps you will be easily able to troubleshoot DQM rules for <a href="https://community.sap.com/t5/c-khhcw49343/SAP+Master+Data+Governance/pd-p/67837800100800004488" class="lia-product-mention" data-product="697-3">SAP Master Data Governance</a>&nbsp;central governance.</FONT></P><P><FONT face="arial,helvetica,sans-serif">Hope you find this information useful.</FONT></P><P><FONT face="arial,helvetica,sans-serif">Regards</FONT></P><P><FONT face="arial,helvetica,sans-serif">Anirban</FONT></P> 2024-01-30T16:03:50.529000+01:00 https://community.sap.com/t5/enterprise-resource-planning-blogs-by-members/business-rule-framework-plus-brf/ba-p/13668731 Business Rule Framework Plus(BRF+) 2024-04-16T12:38:55.042000+02:00 VaraPrasadT https://community.sap.com/t5/user/viewprofilepage/user-id/38562 <P style=" text-align : left; ">What is BRF Plus? Why we need to use BRF+ ?</P><P>There will always be some amount of custom business logic available in the SAP system, even if we strive to minimize customization. Such ABAP-based customization must be handled carefully in order to prevent duplication of business logic and to keep it in line with other functional areas. Herein lies the value of SAP Business Rules Framework Plus (BRF Plus), a feature that enables centralized and reusable management of all custom business logic.</P><P>In general, BRF Plus features can be accessed on any SAP NetWeaver-based system with the relevant enhancement pack installed.</P><P>Both technical users (programmers, system administrators) and business users who manage operational business processes (like bidding, procurement, tax form validation, etc.) can benefit from BRF Plus's unified modeling and run-time environment for business rules.</P><P>The application programming interface and user interface that BRF+, or Business Rule Framework Plus, offers is extensive for defining business rules. We can define business rules with it without having to write ABAP code.</P><P><STRONG>Application :</STRONG> In BRF+, to start anything first we must have to create the application.&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_0-1713096869367.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96163iF6E46BBD527A1F9C/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_0-1713096869367.png" alt="VaraPrasadT_0-1713096869367.png" /></span></P><P><STRONG>Type of Storage Types :&nbsp;</STRONG></P><TABLE border="1" width="100%"><TBODY><TR><TD width="25%" height="30px">Storage Type</TD><TD width="25%" height="30px">Client</TD><TD width="25%" height="30px">Transport Request</TD><TD width="25%" height="30px">Cross-Application Usage</TD></TR><TR><TD width="25%" height="56px">System</TD><TD width="25%" height="56px">Client-Independent</TD><TD width="25%" height="56px">Transportable or Local</TD><TD width="25%" height="56px">Can use system objects.</TD></TR><TR><TD width="25%" height="56px">Customizing</TD><TD width="25%" height="56px">Client-Dependent</TD><TD width="25%" height="56px">Transportable or Local</TD><TD width="25%" height="56px">Can use system and<BR />customizing objects</TD></TR><TR><TD width="25%" height="30px">Master Data</TD><TD width="25%" height="30px">Client-Dependent</TD><TD width="25%" height="30px">Local</TD><TD width="25%" height="30px">Can use system, customizing,<BR />and master data objects</TD></TR></TBODY></TABLE><P><STRONG>Data Objects:</STRONG>&nbsp;&nbsp;Describes data types of the variable. They are the data carriers helping in signature or context of a function,&nbsp;variables in a rule or rulesets, building blocks for Decision tables, Etc. You can create data objects by defining&nbsp;attributes like element type, length, decimals or you can directly bind to existing DDIC elements.</P><P><STRONG>Expressions:&nbsp;</STRONG>&nbsp;Expressions are the computational units with well-defined logic. Usually, expressions are self-sustained and&nbsp;process the user input and gives result back to the caller.</P><P><STRONG>Rules:</STRONG> Rule is a central entity in BRF+ which builds the business logic. Evaluation of rule gives you the decision for the&nbsp;question in context</P><P><STRONG>Rule sets:&nbsp;</STRONG>Simply, collection of rules. Each rule set can be assigned to exactly one function. Priority can be set at rule set level&nbsp;for defining the order of execution.</P><P><STRONG>To Create Application :</STRONG> BRF+ or BRFPLUS is the transaction code to access the application.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_0-1713021847371.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96053i4D7208439612877A/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_0-1713021847371.png" alt="VaraPrasadT_0-1713021847371.png" /></span></P><P>Next, we click the <STRONG>Create Application</STRONG> Pushbutton. Below Pop-up will opened up and enter the required fields.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_2-1713022015549.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96055i1388EC4E301EEA56/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_2-1713022015549.png" alt="VaraPrasadT_2-1713022015549.png" /></span>Click on <STRONG>Create and Navigate To Object</STRONG> after filling out Name, Short Text, Text, and Development Package&nbsp; for Software Component.&nbsp;Another option is to store in the Temporary($tmp) Package.<BR />Next, we'll press the "Save &amp; Activate" button.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_3-1713022097755.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96056iAE2AC8F413D3B329/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_3-1713022097755.png" alt="VaraPrasadT_3-1713022097755.png" /></span></P><P>Next, within this application, we will talk about the following elements.<BR />1. Create an element in the data object.&nbsp;<BR />2. Create a structure in the data object.<BR />3. Make a Table Data Object<BR />4. Produce a Decision Table Expression</P><P>There are 3 ways to bind the data object in Binding Type :</P><P><STRONG>Create an element in the data object :&nbsp;</STRONG>The following steps are shown in the figure below after you right-click on the application:&nbsp;After completing all the required fields, we will click the designated button.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_4-1713022397069.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96057iE77DA41271EC75C2/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_4-1713022397069.png" alt="VaraPrasadT_4-1713022397069.png" /></span>There are three options under this option, which is called Binding type.<BR /><STRONG>Bind to DDIC Element:</STRONG> Select a DDIC Element that shares your attributes.</P><P><STRONG>Bind to an Existing BRF+ Element:</STRONG> Select an Existing BRF+ Element that possesses the same attributes.</P><P><STRONG>No Binding: </STRONG>Maintain the details freely.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_5-1713022564894.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96058i49E7CA7020E7F3BA/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_5-1713022564894.png" alt="VaraPrasadT_5-1713022564894.png" /></span>Therefore, in this case, if we select any of the first two options 1 or 2 Name, Text, Element Length, and Element Type will be automatically filled in from the DDIC element or an already-existing BRF+ element.<BR />However, if we select the No Binding option, we will have to enter all necessary information, including the element name, text, short text, element length, and element type.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_6-1713022749060.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96059i4FEA522B90642A4A/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_6-1713022749060.png" alt="VaraPrasadT_6-1713022749060.png" /></span></P><P>After entered all the required fields, click on&nbsp;<STRONG>Create and Navigate To Object</STRONG> button and then click&nbsp;Save &amp; Activate buttons to activate it.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_7-1713022846835.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96060i1A92C4536E44FF8D/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_7-1713022846835.png" alt="VaraPrasadT_7-1713022846835.png" /></span></P><P><STRONG>Structure Creation:</STRONG> The same application should be used to create the structure.<BR />It is not necessary to build a structure if our result contains just one column. There is also no need to create a structure if the output for a single condition is a single row.&nbsp;If more than one column appears in our result, we should make a structure with all of those columns. Additionally, a structure must be shown if the output consists of multiple rows. The generated structure must be used to create a table in order to produce multiple rows as output.</P><P>To Create a Structure,&nbsp;Select our application and follow the instructions shown in the figure below&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_8-1713022930354.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96061iF9BBE39A5AC524EC/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_8-1713022930354.png" alt="VaraPrasadT_8-1713022930354.png" /></span>After that, we must complete the required fields to create the structure. However, before that once more, there is a choice named Binding Type, which has the following options:-&nbsp;</P><P>a) Bind to Structure Type (DDIC)<BR />b) No Binding<BR />c) Binding to CDS View: Not to be used</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_9-1713012449124.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/95987iFC0858846B45FC5F/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_9-1713012449124.png" alt="VaraPrasadT_9-1713012449124.png" /></span></P><P>For Option a &amp; c, The required fields (Name, Short Text, Text) will automatically be filled in from the DDIC structure or the CDS View.<BR />However, if we select option b, which is No Binding, we will have to manually fill in every required field.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_9-1713023124169.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96062iF04832DA0A125913/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_9-1713023124169.png" alt="VaraPrasadT_9-1713023124169.png" /></span>Once all of these have been filled out, click <STRONG>Create And Navigate To Object</STRONG>, and lastly Save and Activate this structure.</P><P><STRONG>Table Creation:</STRONG> In order to have multiple result rows based on a single condition in our decision table, we can create a table in the same application. Therefore, table creation is necessary in our case.<BR />Select our application, then follow the instructions shown in the figure below.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_0-1713023441506.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96065i493BFA7D25F4459F/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_0-1713023441506.png" alt="VaraPrasadT_0-1713023441506.png" /></span>After that, fill out the fields required to create the table. We must first verify the Binding Type.<BR />There are two options for creating tables in Binding Type:<BR />a) No Binding<BR />b) Binding to Table Type (DDIC)</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_0-1713174547254.png" style="width: 271px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96523i046F80EE6D798540/image-dimensions/271x221?v=v2" width="271" height="221" role="button" title="VaraPrasadT_0-1713174547254.png" alt="VaraPrasadT_0-1713174547254.png" /></span>If we select option b "Binding to Table Type (DDIC)" All required fields (Name, Short Text, Text, Table Line Type) from the DDIC Table Type are automatically filled.<BR />If we select option a "No Binding"&nbsp; then it&nbsp; will have to manually fill out all required fields.<BR />Therefore, choose Table line from the application in order to display Multiple Rows.&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_1-1713023706302.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96066i1742F791BB33A72A/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_1-1713023706302.png" alt="VaraPrasadT_1-1713023706302.png" /></span>Once all required fields have been filled out, click <STRONG>Create And Navigate To Object</STRONG>, and then save and activate this table.</P><P><STRONG>Decision Table Creation :</STRONG><BR />The next important step is to construct our Decision Table using our application as well.&nbsp;Select the Decision Table and follow the steps outlined in the figure below.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_2-1713023796943.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96068i557BCD23E9E235EE/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_2-1713023796943.png" alt="VaraPrasadT_2-1713023796943.png" /></span></P><P>Once Name, Short Text, and Text are entered, click on the Highlighted button.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_3-1713023892828.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96069i3AA694319C0CD364/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_3-1713023892828.png" alt="VaraPrasadT_3-1713023892828.png" /></span>In the table settings, we can do the below enablement.&nbsp;</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_4-1713024095580.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96070i8052F269FC8EFCD3/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_4-1713024095580.png" alt="VaraPrasadT_4-1713024095580.png" /></span>There is a checkbox labeled "Return all matches found" in Settings. If we don't select this option, even though multiple rows may exist based on the same condition, only one row will ever display for that condition.<BR />Select the Result Data Object located in the same application as our recently created Table. Next, include the Condition Column.<BR />Select the Application Data Element's Column:<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_5-1713024147277.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96071i7DE8ED06879F8A79/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_5-1713024147277.png" alt="VaraPrasadT_5-1713024147277.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_6-1713025855102.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96072iC922602E87464ABE/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_6-1713025855102.png" alt="VaraPrasadT_6-1713025855102.png" /></span>To Select an object as the Condition Column, select it and then click OK. Declare a field as required in the condition column, indicating which column's value will be used to retrieve the value of the result columns.<BR />Thus, the Condition Column's input needs to be required and selected columns comes as result.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_7-1713026013941.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96073i5891C767E8180A87/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_7-1713026013941.png" alt="VaraPrasadT_7-1713026013941.png" /></span>Select these components from the table.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_8-1713026073702.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96074iF0F8A27592ECEAB3/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_8-1713026073702.png" alt="VaraPrasadT_8-1713026073702.png" /></span>Click OK once all of the table's objects have been selected.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_9-1713026104123.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96075i3086E70B8122797A/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_9-1713026104123.png" alt="VaraPrasadT_9-1713026104123.png" /></span>Click the OK button to proceed. All of the selected columns now appear as Result Columns.<BR /><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_10-1713026165037.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96076iA2553F764D678218/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_10-1713026165037.png" alt="VaraPrasadT_10-1713026165037.png" /></span>Save and Activate all Decision Table modifications after adding Table Contents. Now update this Decision Table with the Table Contents and&nbsp;Next, select "Start Simulation" to see if our decision table functions.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_1-1713092277220.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96145i963E0BB405495E0E/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_1-1713092277220.png" alt="VaraPrasadT_1-1713092277220.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_3-1713092447800.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96147iD408A11C987A4937/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_3-1713092447800.png" alt="VaraPrasadT_3-1713092447800.png" /></span>After entering the program name, select Execute.&nbsp;Will get the matched records as output.</P><P><STRONG>Use of Decision Table in ABAP Program:</STRONG> In order to obtain the required output rows, we must now use our Decision Table in an ABAP program and pass the condition column value from the program.<BR />In the same application, a function must be created for that.</P><P><STRONG>Function Creation:</STRONG> To begin, right-click on the application, then follow the instructions in the figure below.</P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_4-1713092824406.png" style="width: 308px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96148i21342E0F40754AD0/image-dimensions/308x278?v=v2" width="308" height="278" role="button" title="VaraPrasadT_4-1713092824406.png" alt="VaraPrasadT_4-1713092824406.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_5-1713092910328.png" style="width: 361px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96149iF0664F9AC6B3A321/image-dimensions/361x158?v=v2" width="361" height="158" role="button" title="VaraPrasadT_5-1713092910328.png" alt="VaraPrasadT_5-1713092910328.png" /></span>After entering the Name, Short Text, and text, press the Create and Navigate To Object button.<BR />Next, fill in the remaining necessary fields, as indicated in the figure below<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_7-1713093308614.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96151iA62D7AE8F89CFCB0/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_7-1713093308614.png" alt="VaraPrasadT_7-1713093308614.png" /></span>Select our created Decision Table in Expression and Mode as Functional Mode. Next, select the Data Element for the Condition Column and the Table of Result Columns after adding the Context from existing Data Object. Next, select our result columns, which are tables from the same application that we created, under Result Data Object then&nbsp;save and activate every modification.</P><P>After that, we must select Create Code Template, copy the sample code, and utilize it in our ABAP program<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_8-1713093364737.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96152iC8552BC082009868/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_8-1713093364737.png" alt="VaraPrasadT_8-1713093364737.png" /></span><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_9-1713093386386.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96153iB2AD9B7957BD9B55/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_9-1713093386386.png" alt="VaraPrasadT_9-1713093386386.png" /></span>At last, we need to save and apply all of the modifications. Following the use of this template in an ABAP program, all of the resultant columns and expected result values should appear in the program.</P><P><STRONG>Rules and RuleSets :&nbsp;</STRONG>It contains set of rules which can be executed as soon as our BRF+ application Function is getting executed.&nbsp;Rules must be contained in the ruleset, as expressions (IF-THEN-ELSE logic).&nbsp;If-THEN rules are another name for plain rules.&nbsp;<BR />A ruleset is an assemblage of rules.&nbsp;Select Event Mode by default. The Assign Ruleset option is under Event Mode.&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_10-1713093500474.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96154i8C2821067C40D32F/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_10-1713093500474.png" alt="VaraPrasadT_10-1713093500474.png" /></span>The function must then be given a ruleset. Please select the "Create Ruleset" button after selecting the "Assigned Rulesets" tab in the screenshot above. After giving the new ruleset a name, the screen below will appear. Following the creation of the ruleset, fill in the Name, Short Text, and Text fields. Then, click the <STRONG>Create and Navigate To Object</STRONG> button below.<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_11-1713093565290.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96155i23CBB0C12F6A7142/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_11-1713093565290.png" alt="VaraPrasadT_11-1713093565290.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_12-1713093665007.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96156i6C9471F82CA1EC42/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_12-1713093665007.png" alt="VaraPrasadT_12-1713093665007.png" /></span></P><P><span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_14-1713094058126.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96158iE0262FDFA6B3F202/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_14-1713094058126.png" alt="VaraPrasadT_14-1713094058126.png" /></span>Save and Activate the Ruleset function.<BR />Next, utilize this ruleset in ABAP code from the function using the Code Generation Template.</P><P><STRONG>Decision Tree:</STRONG> A binary tree of expressions can be defined using a decision tree expression. Condition Nodes are non-leaf nodes. The result is a Boolean. Left &amp; Right nodes will move forward in accordance with the outcome. When a leaf node is reached, the designated expression is executed, and the result of the entire expression is returned as the corresponding result. A decision tree has two nodes at all times: left and right. Every node has decisions that are True (Yes) or False (No). Depending on that new branches (nodes) will proceed.&nbsp;<span class="lia-inline-image-display-wrapper lia-image-align-center" image-alt="VaraPrasadT_15-1713094204964.png" style="width: 400px;"><img src="https://community.sap.com/t5/image/serverpage/image-id/96159i8D3142C1DFE34FF0/image-size/medium?v=v2&amp;px=400" role="button" title="VaraPrasadT_15-1713094204964.png" alt="VaraPrasadT_15-1713094204964.png" /></span></P><P>We can define business rules using the BRF+ interface without having to write ABAP code. These generated business rules can be used as substitution/validation rules or integrated into other SAP programs.</P><P><STRONG>Use cases of BRF+ that can be used into S4HANA:&nbsp;</STRONG><BR />Output management for Billing and Purchasing – Output determination (SAP S/4HANA).<BR />Integration with IMG transaction.<BR />SAP business Workflows.<BR />Cloud based Environment.</P><P><STRONG>Conclusion on BRF+ :&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</STRONG></P><UL><LI>It enables us to represent rules in an understandable manner and apply them again in various contexts.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</LI><LI>BRF+ eliminates the need to create and maintain custom tables for validation. It also does away with the traditional developer approach of hardcoding values.</LI><LI>In essence, BRF+ is used to make decisions, and decision input and output values are kept up to date in Decision Tables, which have sophisticated validation features.</LI></UL><P style=" text-align : left; "><STRONG>Roles that are required&nbsp;</STRONG><BR />SAP_BC_FDT_ADMINISTRATOR<BR />WD Configuration :<BR />/sap/bc/webdynpro/sap/fdt_wd_workbench<BR />/sap/bc/webdynpro/sap/fdt_wd_object_manager<BR />/sap/bc/webdynpro/sap/fdt_wd_catalog_browser</P> 2024-04-16T12:38:55.042000+02:00