Friday 7 July 2017

Unveil the secret of @ObjectModel.readOnly Part-7

In my application with edit function enabled, I have set posting date as read only by using the annotation below according to sap help.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

It works as expected in the runtime. However, why it works? Being a developer, I hate the fact that these whole stuff work as a black box to me. I want to know what happens under the hood. Here below I will share with you how I dig it out via debugging in both frontend and backend.


SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

1. Debugging in UI5 application

In Chrome development tool, I know that the editable state is controlled by property “editable” of the given UI model.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

So set a breakpoint on SmartField.setEditable function as below, then click edit button, we can observe the parameter bValue is passed as false into this function. Now next question, how and where is this bValue calculated to false?

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

From the callstack I can find another important function: canUpdateProperty. Inside this function, from line 241 we can get this conclusion: any property with attribute “sap:updatable” equals to false, will be rendered as read only in UI.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

Apparently this attribute is set in backend, as we can confirm by checking in metadata:

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

Now question to ABAP backend: I never specify any annotation like sap:updatable = false in my CDS view, where does it come from?

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

2. Debugging in ABAP backend

In this method, framework is scanning against annotation with name “OBJECTMODEL.READONLY”, as defined in constant in line 836.

If found, ls_sfc-read_only is set as true.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

This assignment will lead to the check succeeds in line 848 ( since by default a field is editable ), as a result an entry is inserted into internal table mt_element_static_field_ctrl.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

This is the detail view of the entry for posting date in the table.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

Later, the internal table is evaluated and if there is entry with read_only = abap_true existing ( see line 71 ), lv_creatable and lv_updatable is set as false.

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

Finally in line 82 and 85, lv_creatable and lv_updatable are used to set property accordingly. All secrets are published now!

SAP ABAP Tutorials and Materials, SAP ABAP Certifications, SAP ABAP Guide

No comments:

Post a Comment