Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Ramjee_korada
Active Contributor
50,662
Prerequisites:

  • Knowledge on ABAP Restful Application Programming

  • Knowledge on Entity Manipulation Language (EML)

  • [Optional] Hands on exercises in OpenSAP course https://open.sap.com/courses/cp13.


This blog gives you an idea to develop a custom action with a dialog for additional input fields that are needed based on scenario.

  • Use case:

    • There is a purchase contract that needs to be extended to next year by buyer.



  • Business logic:

    • Only extend those validities which are running on existing valid to

      • [i.e. continue business with same supplier].



    • Don’t touch items which are older than existing valid to.

      • [i.e. no need to continue business with this supplier]






In my example: 

Old valid to: Jun 30, 2021

New valid to: Dec 31, 2021

Item #10 runs on Jun 30,2021 hence it is expected to extend till Dec 31, 2021

Item #20 ends on Mar 31, 2021 hence it is not expected to touch.


Click the button Extend and to see results on Object page and item page



 

Implementation steps:

  1. Create a data model with Header (Parent), Item (Child), Conditions (Grand Child) having fields “Valid from”, “Valid to “.

  2. Create an abstract CDS entity with required input fields.


@EndUserText.label: 'Abstract entity to extend the validity'
@Metadata.allowExtensions: true
define abstract entity ZRK_A_Doc_Extend
// with parameters parameter_name : parameter_type
{
extend_till : /dmo/end_date;
comments : abap.string( 300 );

}

3.Enrich the entity with UI annotations such as labels.
@Metadata.layer: #CORE
annotate entity ZRK_A_Doc_Extend
with
{
@EndUserText.label: 'New validity to:'
extend_till;
@EndUserText.label: 'Enter your comments:'
comments;

}

4. In Behavior Definition, define action “extendDoc” with parameter using the abstract entity                created in step#2.
  action extendDoc parameter ZRK_A_Doc_Extend result [1] $self;


       5. Implement the core ABAP logic for extend in Behavior Pool Class
METHOD extendDoc.

DATA : lt_update_doc TYPE TABLE FOR UPDATE zrk_i_doc_head.
DATA(lt_keys) = keys.
DATA(lv_today) = cl_abap_context_info=>get_system_date( ).

LOOP AT lt_keys ASSIGNING FIELD-SYMBOL(<fs_key>).

IF <fs_key>-%param-extend_till < lv_today.

APPEND VALUE #( %tky = <fs_key>-%tky ) TO failed-head.

APPEND VALUE #( %tky = <fs_key>-%tky
%msg = new_message( id = 'ZRK_CM_DOC'
number = '001' " Document cannot be extended into the past
severity = if_abap_behv_message=>severity-error )
%element-ValidTo = if_abap_behv=>mk-on ) TO reported-head.

DELETE lt_keys.


ELSE.
DATA(lv_new_valid_to) = <fs_key>-%param-extend_till.
ENDIF.

ENDLOOP.

" Once the validations are passed, proceed with extending document.
CHECK lt_keys IS NOT INITIAL.

READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Head
FIELDS ( ValidFrom ValidTo )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_doc_head).


CHECK lt_doc_head IS NOT INITIAL.

LOOP AT lt_doc_head ASSIGNING FIELD-SYMBOL(<fs_head>).

" Capture old valid to
DATA(lv_old_valid_to) = <fs_head>-ValidTo.

" Read items from entity
READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Head BY \_Items
FIELDS ( ValidFrom ValidTo )
WITH VALUE #( ( %tky = <fs_head>-%tky ) )
RESULT DATA(lt_items).

" Loop through items that are running on old valid to
LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<fs_item>)
WHERE ValidFrom LE lv_old_valid_to
AND ValidTo GE lv_old_valid_to.

" Modify item with new valid to
<fs_item>-ValidTo = lv_new_valid_to.

" Read conditions from entity
READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Items BY \_Conds
FIELDS ( ValidFrom ValidTo )
WITH VALUE #( ( %tky = <fs_item>-%tky ) )
RESULT DATA(lt_conds).

LOOP AT lt_conds ASSIGNING FIELD-SYMBOL(<fs_conds>)
WHERE ValidFrom LE lv_old_valid_to
AND ValidTo GE lv_old_valid_to..

<fs_conds>-ValidTo = lv_new_valid_to.

ENDLOOP.

" Modify conditions entity
MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Conds
UPDATE FIELDS ( ValidTo )
WITH CORRESPONDING #( lt_conds ).


ENDLOOP.

" Modify Items entity
MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Items
UPDATE FIELDS ( ValidTo )
WITH CORRESPONDING #( lt_items ).


ENDLOOP.

" Modify header entity
MODIFY ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Head
UPDATE
FIELDS ( ValidTo )
WITH VALUE #( FOR <fs_doc> IN lt_doc_head
( %tky = <fs_doc>-%tky
validTo = COND #( WHEN lv_new_valid_to IS NOT INITIAL
THEN lv_new_valid_to
ELSE <fs_doc>-ValidTo ) ) )
REPORTED DATA(lt_update_reported).

reported = CORRESPONDING #( DEEP lt_update_reported ).

" Return result to UI
READ ENTITIES OF zrk_i_doc_head IN LOCAL MODE
ENTITY Head
ALL FIELDS
WITH CORRESPONDING #( keys )
RESULT lt_doc_head.

result = VALUE #( FOR <fs_doc_head> IN lt_doc_head ( %tky = <fs_doc_head>-%tky
%param = <fs_doc_head> ) ).

ENDMETHOD.

6. Position the Action button on List Report and Object Page using annotations.
  @UI: {

lineItem: [
{ type: #FOR_ACTION, dataAction: 'ExtendDoc' , label: 'Extend' , position: 90 } ] ,

identification : [
{ type: #FOR_ACTION, dataAction: 'ExtendDoc' , label: 'Extend' , position: 90 } ]
}

7. Generate the service Binding using OData V4 . [ If you use OData V2, then you have to enrich metadata in fiori app from webide or business studio ]


Service binding for document app with OData V4


Everything is set and its ready for user action:) Hope it helps in learning advanced ABAP RAP.

 
111 Comments
Jagtar
Participant
Thanks for detail explanation , It will help a lot for start further extension and gives heads up 🙂 .
prat27
Discoverer
Dear Ramjee, thanks for a great introduction to RAP. Looking forward to more tricks and tips!
0 Kudos
Hello Ramjee,

I am trying to do basically the same thing, but for me it does not work as expected.

I added a button using @UI.identification and UI.lineItem annotations, that should open a dialog box with input fields.

I created the abstract entity :

@EndUserText.label: 'Abstract Entity for Release Information'
@Metadata.allowExtensions: true
define abstract entity ZOV_A_SYSTEM_RELEASE {
system_release : z_release_version;
}

and the metadata extension for UI labels:

@Metadata.layer: #CORE
annotate entity ZOV_A_SYSTEM_RELEASE with
{
@EndUserText.label: 'Release'
system_release;

}

 

I added the action in the Behaviour definition:

action SelectRelease parameter ZOV_A_SYSTEM_RELEASE;

 

The result in my app is the following: the dialog box opens, I can see the field maintained in the abstract entity, but no annotations are taken into consideration. No label is displayed. Just the field as written in the entity ( system_release ), not even the description from the data element.

Any idea what am I missing?
Ramjee_korada
Active Contributor
0 Kudos
Hi Oana,

Did you try to refresh the app ? Sometimes metadata reflection on UI takes more time.

Is it in trail system so that I can have look ?

 

Best wishes,

Ramjee Korada
malini123
Explorer
0 Kudos
Hi Ramjee, This is very interesting. Thanks for the detailed explanation.
0 Kudos
Hello Oana, Ramjee,

Have you resolved this issue?

I'm now into the same issue as the metadata entension for End user label not getting reflected on the popup.
0 Kudos
Thanks Ramjee for sharing. I'm not getting the popup being shown up although the abstract entity and its metadata is created properly. When triggering the action by pushing the corresponding button, it jumps directly to the behavior implementation where I can see the parameters defined in the abstract entity in blank (obviously 🙂 ) but no popup asks me for the input data.

Would you have an idea about how I can solve it? I already refresh the system a couple of times 🙂

Thx
0 Kudos
Hello Oana,

It is just the version of your Odata binding type, use OData V4 - UI instead of V2


 

So now its works, and there checkboxes instead of radiobuttons=)



BR, Aynur

0 Kudos
Dear Ramjee,

The popup and entity work fine, but there are some problems caused by changing binding type of my service to OData V4 - UI from V2.

Those are currency and unit of measure assignments for fields. So the error popup is like this:


How did manage this? And which data types did you use for that?

BR, Aynur

 
Ramjee_korada
Active Contributor
0 Kudos
Hi Aynur,

Thanks for highlighting. I was using V4 for quite sometime and did not realize that others might be using still V2.

I have updated the blog with this point.

BR,

Ramjee
Vignesh
Explorer
0 Kudos
Hi Ramjee,

Could you please explain, what needs to be added for OData V2 from the UI end ? Please try to provide a screenshot explanation for OData V2.

Thanks,

Vignesh.
Ramjee_korada
Active Contributor
0 Kudos

Hello Aynur,

This problem is solved when you enter respective Uom ( for quantity ) , Currency for ( Amount ) in object page.

However, It does not allow me to activate abstract entity with UoM field. 

Once I added semantics, I am able to see the values entered from the dialog in debugging.

 

BR,

Ramjee

0 Kudos
Hello Ramjee,

Actually, I had problem with UOM fields using that annotation. In Odata V2 it was ok to use any type of amout (INT4, DEC 15/2), while here with Odata V4 it causes errors, like: invalid type '\TYPE=STRING'.

Now, based on your screenshot I got that we should use 3 decimals after comma=)


That worked! Thanks!

BR, Aynur

Hi Ramjee,

 

we use OData V2 in our project and changing to Odata V4 is not possible at the time.

You wrote "If you use OData V2, then you have to enrich metadata in fiori app from webide or business studio". But I can't do this in my annotation file. Can you give an example, how this works?

 

Thanks, Romina.

0 Kudos
I am facing an issue

When am trying to add an action . it is giving error in service binding  -  Duplicate action external name .

There is no action with the same name . When am trying to expose the action in Behavior Implementation (Projection of Behavior Definition) . then this error comes, and without that the action button is not available in UI .

Can you please help me.

 

Thank you

Regards

Venkat Srikantan
sunlw999
Advisor
Advisor
0 Kudos
HI Ramjee

Thanks for your sharing, I just confused with this development mode, you didn't declare any logic about dialog, how system know it should popup a dialog rather than others?
Ramjee_korada
Active Contributor
0 Kudos
Hi David,

As mentioned in step #4, we are using parameters for an action. That means user has to fill the values and hence dialog is opened .
  action extendDoc parameter ZRK_A_Doc_Extend result [1] $self;
sunlw999
Advisor
Advisor
0 Kudos
hi Ramjee

Could you plz share the detail of the parameters value
Ramjee_korada
Active Contributor
0 Kudos

Hi David,

Its there in step #2 and step #3.

smuhsb
Participant
0 Kudos
This is a very informative post. Thanks!!!

What if we want to make a parameter as Mandatory? Do we have to add an annotation to achieve this?
smuhsb
Participant
0 Kudos
Found the annotation

@ObjectModel.mandatory: true

juryrychko
Explorer
0 Kudos

Many thanks Ramjee. Your post is very helpful.

Maybe somebody could answer me. Is it possible to call this action with popup from back-end? I need to fill comment field before save. I'm trying to call this action from determination via EML and action is called, but popup is not showed.

 determination CommentPopup on save { update; create; }
action extendComment parameter z_comment_ext result [1] $self;


METHOD commentpopup.
MODIFY ENTITY c_test
EXECUTE extendComment
FROM VALUE #( ( %key-uuid = keys[ 1 ]-uuid
%param-comments = 'Test' ) )
REPORTED DATA(edit_reported)
FAILED DATA(edit_failed)
MAPPED DATA(edit_mapped).
ENDMETHOD.

METHOD extendComment .

ENDMETHOD.
VijayCR
Active Contributor
0 Kudos
koradaramjee789  : Thanks for useful blog, I have similar requirement to read notes and expose via API instead of displaying in Fiori app. Should i expose abstract entity via action or Function ?
udita10
Explorer
0 Kudos
Hello koradaramjee789,

We have tried implementing an action by the exact same way as you have mentioned.
However, the button is coming disabled in our scenario.
Can you let us know what could be possibly missing here?

Thanks & Regards,

Udita Saklani
guilhermesalazar
Associate
Associate
0 Kudos
Hello, koradaramjee789,

Great and very useful explanation!

However, I have another requirement for a custom action that I was still not able to do:

Is it possible to open a popup confirmation in a custom action?

As an example, I have a custom action called "Cancel document", which I want the user confirmation before (Yes/No).

Is this possible?

Thanks in advance,

Guilherme
Ramjee_korada
Active Contributor
0 Kudos
Hello Guilherme,

This can be done using Fiori elements application . But I dont think possible at ABAP RAP level .

https://sapui5.hana.ondemand.com/sdk/#/topic/87130de10c8a44269c605b0322df6b1a

<Annotations Target="GWSAMPLE_BASIC.GWSAMPLE_BASIC_Entities/RegenerateAllData">
<Annotation Term="com.sap.vocabularies.Common.v1.IsActionCritical" Bool="true"/>
</Annotations>

 

Best wishes,

Ramjee
Former Member
0 Kudos
Hello Ramjee,

 

Do Value Helps not work at all with these dialogs?

The annotation @Consumption.valueHelpDefinition do nothing.

 

Thanks
0 Kudos
Hi ojados koradaramjee789 ,

We are facing the similar issue in case of parameterized action where multi select is enabled. In my case actions are working fine if multi select is disabled ,once we are enabling multi select the action directly goes into further processing and doesn't ask for input data.

Did you get solution for this issue ?

 

Thanks & Regards,

Arushi Nautiyal
0 Kudos
maheshkumar.palavalli Can you please help here ?

I have created an order maintenance application in RAP and have exposed the service as Odata V2.  This development is done in 1909 version

Actions buttons are working as expected when we have not enabled multi select . Once we enable multi select for our application we get an error as below



 

Thanks,

Arushi Nautiyal

Current Behavior

Ramjee_korada
Active Contributor
0 Kudos

Hi Tim,

This annotation worked in Odata V4 but not in V2.

 

Below is example for V4.

WRoeckelein
Active Participant
0 Kudos
"@ObjectModel.mandatory: true"

gives error "Use of Annotation 'ObjectModel.mandatory' is not permitted (not released)" for me, so I need a different solution.

chrisgr
Explorer
0 Kudos
Hello,

Very nice blog.

I have created an app with two custom actions. The buttons are active only when a record is selected. Is there a way to have the button always active independently from a record has been selected or not.

Example: I have a button 'Create'. When the user click on create, a dialog appears where the user enter a contract number. Then a new line is added with the contract number and its data. As you can see this action is NOT relevant for record selection so I expect the button to be always active.

Thank you

Christophe
Ramjee_korada
Active Contributor

Hi Christophe,

Custom Actions :

you can declare the action as "static" so that button is always active.

static action <action name> parameter <parameter> result <entity_type>;

Create :

I think you use existing feature "Enabling Object Creation Using the Dialog in the List Report" for your case. please have a look

https://sapui5.hana.ondemand.com/sdk/#/topic/ceb9284b16f64f30865ce999dbd56064

 

Best wishes,

Ramjee

chrisgr
Explorer
0 Kudos
thank you
chrisgr
Explorer
0 Kudos

Hello,

I have created an OData V4 and I have an issue with the value help in the dialog screen. I used the annotation Consumption.valueHelpDefinition in metadat annotation abstract view.

@Consumption.valueHelpDefinition: [{ entity : { name: 'I_CndnContrCustomerStdVH' , element: 'ConditionContract'} }]

When I run the app and click on the value help I get an empty screen as below:

 

Any idea what is wrong?

The same entity for the value help of the selection field 'Condition Contract' is working find.

Thank you for your help

Christophe

chrisgr
Explorer
0 Kudos
Hello Ramjee,

it is related to the value help on the dialog screen. I have describe my problem in an above post. Currently I test the app  in ADT with the "Preview" functionality.

I want to mention that in the UI5 I get the below error:
/sap/opu/odata4/baa1/o2c_ccs_imptlev_srv/srvd_f4/sap/i_cndncontrcustomerctdvh/0001;ps=%27srvd-%2Abay0%2Ao2c_ccs_imptlev_srv-0001%27;va=%27com.sap.gateway.srvd.baa1.o2c_ccs_imptlev_srv.v0001.ae-/baa1/c_ccs_imptierlev.insert_records.selnum.ImpTierLevType.X%27/$metadata - In the context of Data Services an unknown internal server error occurred sap.ui.model.odata.v4.lib._MetadataRequestor

in debugging i can see that the service variant is: com.sap.gateway.srvd.baa1.o2c_ccs_imptlev_srv.v0001.ae-

Is there any specific step to be done for the value help to work correctly?

Best regards

Christophe
kretschj
Explorer
0 Kudos
Hi,

i have the same problem.

did you find a solutions on SAP HANA 1909 on premise ?

 
selvakumar_mohan
Active Participant
0 Kudos
The value help you linked must be tied to a View and not "View Entity".
selvakumar_mohan
Active Participant
Do you have an idea how to make the field which appears in pop up as a File uploader?
0 Kudos
Hello Ramjee,

 

Its very helpful blog. Can we create a custom bottom which will be active without selecting the line. Just like the "Create" button, Actually my requirement is create a line item without going to object page but should appear a dialog box.

Whether this can be achieved using RAP.

 

Regards,

Rajesh
Ramjee_korada
Active Contributor
0 Kudos

Hello Rajesh,

I dont prefer custom button in your case as this is available out of the box. please see below link for steps.

Enabling Object Creation Through Dialog in the List Report

Few restrictions : Draft is not supported , Maximum of 8 fields can be shown.

If above restrictions are concerns then you can create custom "Static" action so that button is always enabled without selecting any line.

Best wishes,

Ramjee Korada

0 Kudos

Thanks Ramjee for for sharing the link.

I will try to implement. Also in your blog as is there any option where will can set the values of the pop-up fields before the pop-up appears.

I mean add comment in comment field before pop-up like PBO of Pop-up. Also do we have the option to dynamically display the fields on pop-up.

Regards,

Rajesh

former_member778202
Discoverer
0 Kudos

Hello Ramjee,

I have tried to publish the Services Binding with the OData V4.
But I got the following error:


Can you help me further?
Or is there a way to include a value help in the ABSTRACT ENTITY even without OData V4?

thanks!

Ramjee_korada
Active Contributor
Finally I got answer for these value help dialogs in Odata V2.

In OData V2, If you need F4 help in an action Dialog, you have to expose the value help definition explicitly in Service definition along with "@Consumption.valueHelpDefinition".
@EndUserText.label: 'ZRK_UI_PUR_CON_UD'
define service ZRK_UI_PUR_CON_UD {
expose ZRK_C_PUR_CON_UD as PurCon; " Root view entity
expose ZRK_C_PUR_CON_I as PurConItems; " Child view entity
expose ZRK_C_PUR_COND_I as PurConItemConds; " Grand Child view entity
expose ZRK_I_BUYER as BuyerF4; " Value help definition
}
florian_halder
Participant
0 Kudos
Hello Ramjee,

is it possible to display a text area with multiple lines on the pop up.

I tried with the following UI annotation in the metadata extension, but this had no effect.
@UI.multiLineText: true

Thanks Florian
hendrikp
Participant
0 Kudos
Hello Wolfgang,

have you found another solution?

 
WRoeckelein
Active Participant

Hi Hendrik,

I had a lengthy incident discussion with SAP on this.

For Steampunk @ObjectModel.mandatory is not released because steampunk is only RAP and in RAP this is supposed to be specified in the BDEF and not in the CDS (but internally all parameters are currently considered to be mandatory, but this is neither signalled in the annotation - and thus the UI - nor is it enforced). Since 2202: If you don't use strict you can currently use "field ( mandatory ) Type;" in the BDEF and it is then at least signalled in the annotation and thus in the UI (and is then enforced in a fiori elements UI). You still have to manually validate this in the BDEF implementation. However this is not yet finalized by SAP (thus it does not work with strict).

Regards,

Wolfgang

hendrikp
Participant
0 Kudos
Hello Wolfgang,

thanks for the detailed answer. I did not understand in which behavior the part "field ( mandatory ) type" has to be since for the abstract entity there is no own behavior and the fields par1, par2 & par3 are not known in the behaviour where the action is defined.

 
  action ( features : instance ) ACTION parameter SOME_NAME result [1] $self;

 
define abstract entity SOME_NAME  {
par1 : abap.char(2);
par2 : abap.dats;
par3 : abap.char(2);
}

 

BR

Hendrik
WRoeckelein
Active Participant
No, there can be a BDEV for an abstract entity and this is the place where this belongs
abstract;
//strict;

define behavior for /NEO/A_SKD_TypeXYZ alias TypeXYZ
{
field ( mandatory ) Type;
}

Regards,

Wolfgang
hendrikp
Participant
0 Kudos
Thanks Wolfgang, this works.

For completion:

1. define abstract root entity with parameters
define root abstract entity SOME_NAME  {
par1 : abap.char(2);
par2 : abap.dats;
par3 : abap.char(2);
}

2. define own behavior definition for the abstract root view
abstract;
//strict;

define behavior for SOME_NAME
{
field ( mandatory ) par1, par2, par3;

}

3. use abstract cds in the behavior definition as parameter value for the action
  action ( features : instance ) ACTION parameter SOME_NAME result [1] $self;

 

Last question:

You wrote
 You still have to manually validate this in the BDEF implementation

By this you mean the validation has to be in the method which implements the action since abstract behavior definition throws an error when trying to do something like
validation validatePAR1 on save { create; update;}

Br

Hendrik

 
Labels in this area