logo

Are you need IT Support Engineer? Free Consultant

BRF+ Object Creation using ABAP Z-Report

  • By Sanjay
  • 09/05/2026
  • 3 Views


Introduction

When working with SAP BRF+ (Business Rule Framework Plus), Elements are the most basic building blocks. They represent data fields such as numbers, text, or dates, and act as reusable components for structures, tables, functions, and rules. Without elements, we cannot define or process rules effectively in BRF+.

In this blog, we will learn how to create BRF+ Elements programmatically using ABAP. This provides a scalable way to automate the creation of data objects and integrate them into larger rule frameworks.

Why Elements?

Describes data types of the variable. They are the data carriers helping in signature or context of a function, variables in a rule or rulesets, building blocks for Decision tables, Etc. You can create data objects by defining attributes like element type, length, decimals or you can directly bind to existing DDIC elements.

  • Reusability: Once created, elements can be used in multiple structures and rules.

  • Flexibility: Programmatic creation ensures consistency across environments.

    ABAP Program to Create Elements

    Below is a sample ABAP program (ZDEMO_BRF_APP) that:

    1. Creates a BRF+ Application.

    2. Defines three Elements (ELEMENT_1, ELEMENT_2, and CARRID).

*&---------------------------------------------------------------------*
*& Report ZDEMO_BRF_APP
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdemo_brf_app.

DATA: lo_factory           TYPE REF TO if_fdt_factory,
      lo_application       TYPE REF TO if_fdt_application,
      lt_message           TYPE if_fdt_types=>t_message,
      lv_message           TYPE string,
      lv_boolean           TYPE abap_bool,
      lv_demo_appl_id      TYPE if_fdt_types=>id,
      lv_string            TYPE string,
      lo_element_1         TYPE REF TO if_fdt_element,
      lo_element_2         TYPE REF TO if_fdt_element,
      lo_element_3         TYPE REF TO if_fdt_element,
      lo_table             TYPE REF TO if_fdt_table,
      lo_table_1           TYPE REF TO if_fdt_table,
      lo_structure         TYPE REF TO if_fdt_structure,
      lv_element1_id       TYPE if_fdt_types=>id,
      lv_element2_id       TYPE if_fdt_types=>id,
      lv_element3_id       TYPE if_fdt_types=>id,
      lv_input_number_id   TYPE if_fdt_types=>id,
      lv_result_counter_id TYPE if_fdt_types=>id,
     

FIELD-SYMBOLS:
   TYPE if_fdt_types=>s_message,
     TYPE any.


PARAMETERS: pv_lcl  TYPE abap_bool RADIOBUTTON GROUP r00 DEFAULT 'X',
            pv_sys  TYPE abap_bool RADIOBUTTON GROUP r00,
            pv_mstr TYPE abap_bool RADIOBUTTON GROUP r00,
            pv_name TYPE char30.
*           p_ele_01  TYPE i DEFAULT 5,
*            p_ele_02  TYPE i DEFAULT 4,
*            p_ele_03  TYPE i DEFAULT 8,
*            p_ele_04  TYPE i DEFAULT 3,
*            p_ele_05  TYPE i DEFAULT 13,
*            p_ele_06  TYPE i DEFAULT 2.
*           pv_ele   TYPE char20,
*           pv_str TYPE char20,
*           pv_tab TYPE char20.

IF pv_name IS NOT INITIAL AND pv_lcl IS NOT INITIAL OR pv_sys IS NOT INITIAL OR pv_mstr IS NOT INITIAL.

* get a reference to the instance of the factory
  lo_factory = cl_fdt_factory=>if_fdt_factory~get_instance( ).

* =============================================================
* definition of the new application:
* get an initial application object from the factory
  lo_application = lo_factory->get_application( ).
  lo_application->if_fdt_transaction~enqueue( ).
* set values for the application, especially the name is important
* You need to have a unique name for each application, here we use the
* FDT Service class method to get the unique name.
  lo_application->set_application_component( 'BC' ).        "#EC NOTEXT
  lo_application->set_software_component( 'SAP_BASIS' ).    "#EC NOTEXT
  lo_application->set_development_package( '$TMP' ).        "#EC NOTEXT
*lo_application->if_fdt_admin_data~set_name( cl_fdt_services=>get_unique_name( ) ).
  lo_application->if_fdt_admin_data~set_name( pv_name ).


* In FDT terms there are 3 different type of Applications, Local application,
* system pplication and MasterData Application. The following lines shows how you
* can create local Application, masterdata Application and system Application.
  IF pv_lcl EQ abap_true.
    lo_application->create_local_application( ).
  ELSEIF pv_sys EQ abap_true.
    lo_application->create_system_application( ).
  ELSEIF pv_mstr EQ abap_true.
    lo_application->create_masterdata_application( ).
  ENDIF.
  lo_application->if_fdt_transaction~activate(
             IMPORTING et_message           = lt_message
                       ev_activation_failed = lv_boolean ).
  IF lv_boolean EQ abap_true.
*     for some reason the activation failed -> individual handling needed
    lo_application->if_fdt_transaction~dequeue( ).
  ELSE.
    lo_application->if_fdt_transaction~save( ).
    lo_application->if_fdt_transaction~dequeue( ).
*     usually it makes sense to store the id for later access to the application
    lv_demo_appl_id = lo_application->mv_id.
  ENDIF.
  WRITE: 'The ID of the application created is: ', lv_demo_appl_id. "#EC NOTEXT
ELSE.
  MESSAGE 'Provide all the required information' TYPE 'E'.
ENDIF.
*for creating Element,Structure,Table by Data Object


lo_factory = cl_fdt_factory=>if_fdt_factory~get_instance( lv_demo_appl_id ).
*                          if_fdt_constants=>gc_application_tmp  ).
* Note, that you are not required to use an application as input; however,
* we recommend to do so and work with a specific application instead of
* the generic local FDT applications.
*------------Element
lo_element_1 ?= lo_factory->get_data_object(
    iv_data_object_type = if_fdt_constants=>gc_data_object_type_element ).
lo_element_1->if_fdt_transaction~enqueue( ).
lo_element_1->if_fdt_admin_data~set_name( 'ELEMENT_1' ).

* set the element-type (see if_fdt_constants=>gc_element_type_* for
* a list of available element types)
lo_element_1->set_element_type( if_fdt_constants=>gc_element_type_number ).

******************************************************************************
* Alternately user can create an element using the service clas method
* CL_FDT_CONVENIENCE=>CREATE_ELEMENT as follows.
*
* cl_fdt_convenience=>create_element( EXPORTING iv_name="DEMO_ELEMENT_1"
*                                              iv_application_id = if_fdt_constants=>gc_application_tmp
*                                              iv_element_type   = if_fdt_constants=>gc_element_type_number
*                                              iv_activate       = ABAP_false
*                                    IMPORTING
*                                              eo_element        = lo_element ).
*******************************************************************************
* Set some attributes for the element.
lo_element_1->set_element_type_attributes(
  EXPORTING
    iv_length        = 6
    iv_decimals      = 2
    iv_only_positive = abap_false ).

lo_element_1->if_fdt_transaction~activate(
  IMPORTING
    et_message           = lt_message
    ev_activation_failed = lv_boolean ).
IF lv_boolean EQ abap_true.
* for some reason the activation failed -> individual handling needed
  lo_element_1->if_fdt_transaction~dequeue( ).
ELSE.
  lo_element_1->if_fdt_transaction~save( ).
  lo_element_1->if_fdt_transaction~dequeue( ).
* usually it makes sense to store the id for later access
  lv_element1_id = lo_element_1->mv_id.

  ls_element-position = 1.
  ls_element-element_id = lv_element1_id.
  APPEND ls_element TO lts_element.
ENDIF.

* Create another element
lo_element_2 ?= lo_factory->get_data_object(
    iv_data_object_type = if_fdt_constants=>gc_data_object_type_element ).
lo_element_2->if_fdt_transaction~enqueue( ).
lo_element_2->if_fdt_admin_data~set_name( 'ELEMENT_2' ).



* set the element-type (see if_fdt_constants=>gc_element_type_* for
* a list of available element types)
lo_element_2->set_element_type( if_fdt_constants=>gc_element_type_number ).

lo_element_2->if_fdt_transaction~activate(
  IMPORTING
    et_message           = lt_message
    ev_activation_failed = lv_boolean ).
IF lv_boolean EQ abap_true.
* for some reason the activation failed -> individual handling needed
  lo_element_2->if_fdt_transaction~dequeue( ).
ELSE.
  lo_element_2->if_fdt_transaction~save( ).
  lo_element_2->if_fdt_transaction~dequeue( ).
* usually it makes sense to store the id for later access to the application
  lv_element2_id = lo_element_2->mv_id.
  ls_element-position = 2.
  ls_element-element_id = lv_element2_id.
  APPEND ls_element TO lts_element.
ENDIF.

* create a third element
lo_element_3 ?= lo_factory->get_data_object(
    iv_data_object_type = if_fdt_constants=>gc_data_object_type_element ).
lo_element_3->if_fdt_transaction~enqueue( ).
lo_element_3->if_fdt_admin_data~set_name( ' CARRID ' ).
lo_element_3->set_element_type( if_fdt_constants=>gc_element_type_number ).

lo_element_3->if_fdt_transaction~activate(
  IMPORTING
    et_message           = lt_message
    ev_activation_failed = lv_boolean ).
IF lv_boolean EQ abap_true.
* for some reason the activation failed -> individual handling needed
  lo_element_3->if_fdt_transaction~dequeue( ).
ELSE.
  lo_element_3->if_fdt_transaction~save( ).
  lo_element_3->if_fdt_transaction~dequeue( ).
* usually it makes sense to store the id for later access to the application
  lv_element3_id = lo_element_3->mv_id.
  ls_element-position = 3.
  ls_element-element_id = lv_element3_id.
  APPEND ls_element TO lts_element.
ENDIF.
* WRITE: / lo_element->mv_id .
lv_string = lo_element_1->if_fdt_admin_data~to_string(  iv_mode = if_fdt_constants=>gc_tostring_mode_complete ).
WRITE : / 'The result of to string method call Element: ' , lv_string. "#EC NOTEXT

Execution & Output

When you execute the above ABAP report, the newly created Application and Elements will immediately be reflected in the BRF+ Workbench (/nBRF+). You can navigate to the workbench to verify that the application ZDEMO_APP and its elements have been created successfully.

Screenshot 2025-09-17 183254.PngScreenshot 2025-09-17 183237.PngScreenshot 2025-09-17 183157.PngScreenshot 2025-09-17 183106.Png

After running the program, you will see system-generated IDs for each element created. These IDs are crucial when referencing the elements in Structures, Rules, or Functions.

 

Conclusion

In the next part of this blog series, we will explore how to create Structures using these Elements. Subsequent blogs will also cover Table, DB Lookup, Loop, Formula, Rule, and Function in detail.

 



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *