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
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.

 
110 Comments
WRoeckelein
Active Participant
0 Kudos
Yes, in the action implementation.

Mandatory is currently not validated by the RAP framework (neither with create/update nor with actions), you have to do this manually in the BDEV implementation...
hendrikp
Explorer
0 Kudos
Hello,

now this is strange(good?). The UI is enforcing the mandatory somehow without implementing a seperate validation. When trying to push the button with empty fields an error appears to enter a value for par1

The $metadata for the Functionimport looks like this:

in the BDEV only par1 is mandatory which implictly leads to a nullable="false" in the metadata?
<FunctionImport Name="SOMEACTIONAME" ReturnType="SOMETYPE" EntitySet="SOMEENTITYSET" m:HttpMethod="POST" sap:action-for="SOMETYPE" sap:applicable-path="ACTIONPATH">
<Parameter Name="HeadUuid" Type="Edm.Guid" Mode="In" sap:label="UUID"/>
<Parameter Name="PAR1" Type="Edm.String" Mode="In" MaxLength="2"/>
<Parameter Name="PAR2" Type="Edm.DateTime" Mode="In" Precision="0" Nullable="true" sap:display-format="Date"/>
<Parameter Name="PAR3" Type="Edm.String" Mode="In" MaxLength="2" Nullable="true"/>
</FunctionImport>
WRoeckelein
Active Participant
0 Kudos
Yes, the Fiori Elements UI is enfording this, since meanwhile the annotations are sent correctly (nullable is IMHO not enough, there is second thing sent somewhere).

But eg a API or a Fiori Freestyle app could ignore the annotation, thus the backend needs also to validate this.
kendrickc
Explorer
0 Kudos

Hello Ramjee,

Very helpful blog. I have a question for anyone. Is it possible to display a read-only field in the  RAP action popup?

I have tried a few annotations to do this like '@ObjectModel.readOnly: true' with no success.

Thank you 🙂

Ramjee_korada
Active Contributor
0 Kudos
Hi Kendrick,

 

i have not tried yet but I think it’s possible by defining “behaviour definition “ for abstract entity.( see above comments on 22-apr-2022 for the process and it is about mandatory and your case is read only)

there you can mark as read only.

but the challenge is how will you fill it to show on the screen unless it is constant to default in metadata.

 

best wishes,

Ramjee

 

 

 
kendrickc
Explorer
0 Kudos
Hello Ramjee,

 

Thank you for taking a look at my comment.
abstract;

define behavior for ABSTRACT_ENTITY alias ALIAS
{
field( readonly ) Currency;
field( mandatory ) Price;
}

It looks like this method does work for mandatory fields, but not read only.

If you can see I have added some text to the Trade currency field but the Price now has the mandatory * on it.



I will keep looking into possible solutions!

 

Thank you
0 Kudos
Hi Tassilo,

 

Did you resolve this issue?

I am also facing the same issue.
0 Kudos
Hi Ramjee,

Even after exposing the search help view in service definition, the F4 help is not working
0 Kudos
Hi Ramjee,

How Can I add the dialog for input fields for standard actions like Create, Update and Delete with RAP framework?

Thanks in Advance
Ramjee_korada
Active Contributor
0 Kudos
Hi Mohan,

Are you trying from fiori app or adt preview?

In case of fiori app, you have to sync metadata in BAS or WebIDE .

 

Best wishes,

Ramjee Korada
Ramjee_korada
Active Contributor
0 Kudos
I think no from RAP but I am not sure.

If needed, you might to enhance UI logic to generate dialogs
kawatra02
Explorer
0 Kudos
Hi koradaramjee789,

Can you please tell me, How to handle Warning or Error messages in an Unmanaged scenario?

 

Regards,

Himanshu Kawatra
Former Member
0 Kudos
Hello Ramjee,

Is it possible to fill the dialog box with a default value or leave it empty?

 

In my case (see picture) the dialog field ist filled with the value of the table, but this field should be empty. In an other case it should show an default value.


 

Or can I display a calculated value there? For example a calculated date.

 

regards
Ramjee_korada
Active Contributor
0 Kudos
Hello Tim,

If you don't want to default the value from the record, then you can use different field name in abstract entity different than the one in actual entity.

I have tried some logic to default based on some calculation.. it did not work so far. I don't know yet if there is a solution.

There is a workaround to use extension point in fiori app by creating new fragment to default these values.

  1. Define a function to get a calculated value

  2. Then map it on fiori and let user accept or change it

  3. Then fire the action with final user input.


Yes, there is fiori development needed here.

Best wishes,

Ramjee Korada
0 Kudos
Hi Ramjee,

 

I am trying explore the standard application like PO  and SO creation using the Restful ABAP, but could not find any RAP V2 services. Could you please help me with standard examples' package or application name or is there any way to find the standard examples with RAP?

Thanks in Advance
Ramjee_korada
Active Contributor
0 Kudos
Hi Mohan,

I think SAP has not yet migrated PO/SO apps to RAP in OnPremise. I am not sure on Cloud.

 

There is Business Partner application that is rebuilt using RAP in OnPremise.

 

Best wishes,

Ramjee Korada
0 Kudos
Hi Ramjee,

Thanks for your immediate response. Could you please let me know in which package the business partner application is rebuilt..

Thanks
0 Kudos
HI Ramjee,

I found this package ODATA_SD_SALESORDER for sales order, i can only find projection BDEF, could not get  the actual BDEF. Please have a look into this package once. Thanks
Diegoborja
Explorer
0 Kudos
I had the same issue. The problem was due to using an external alias for the action. I removed the alias and it worked. I reckon there is a limitation with that generic service that provides value helps that cannot do the mapping between the internal and external action names.
static factory action CustomCreate parameter yrap_i_header_create_ae [1];
koonalaanand1
Explorer
0 Kudos
Hi Romina,

Did you find a solution on OData V2. Please share if you did.

Regards,

Koonal
koonalaanand1
Explorer
0 Kudos

koradaramjee789 ,

I am trying to achieve the same functionality but via OData V2. Can you kindly elaborate how do we achieve this through enriching the metadata ?

Any direction would be helpful. - Updated the behavior definition with action and pop up displayed.

Regards,

Koonal

 

Ramjee_korada
Active Contributor
0 Kudos
koonalaanand1

As discussed, issue is resolved after "using the action in projection behavior definition"

 

Best wishes,

Ramjee Korada
Ramjee_korada
Active Contributor
0 Kudos
Hello Christophe,

There are 2 points regarding value help in ODataV2.

  1. Actions with Parameters : In case a value help is added to an action parameter (e.g. via annotation @ValueHelpDefinition in corresponding abstract entity for the action parameters) the value help isn't added automatically to the service and must be added to the service definition explicitly.
    Reference : Documentation

  2. Field name in abstract entity must be different from the name in actual entity.
    Ex: Take an example of assign/change a supplier in an item.
    Field name entity : Supplier
    Field name in parameter / abstract entity : ToBeSupplier.
    Reference : Not found . But tested with different examples.


Best wishes,
Ramjee Korada

 
vinith1142
Discoverer
0 Kudos
Is there any way to get the labels in OData V2?

I'm getting entity names instead of label.
Ramjee_korada
Active Contributor
0 Kudos
Have you used annotation "@EndUserText.label: ' ' ".

Below example. Ideally this should be fine.
@Metadata.layer: #CORE
annotate entity ZRK_A_Doc_Extend
with
{
@EndUserText.label: 'New validity to:'
extend_till;
@EndUserText.label: 'Enter your comments:'
comments;

}
vinith1142
Discoverer
0 Kudos
Yes, I did exactly the same way.
former_member728638
Discoverer
0 Kudos

Hi Ramjee,

I have a case which has action button to change user status of order. In this action button, their is drop down which gives list of user status.
But, currently we get all user status maintained in the system.

so, is their a way to pass value of Status Profile to the action button in such a way that we only get user status based on that profile only.

We have implemented this button via RAP like -
action ( features : instance ) Update_UserStatus parameter ZOper_User_Status;

Abstract Entity - ZOper_User_Status

@EndUserText.label: 'Structure for Operation User status'
define abstract entity ZOper_User_Status
{
@EndUserText.label: 'User Status'
User_Status : abap.char(30);
StatusProfile : j_stsma;
}

And, created this action button via Annotation on lineitem

@UI: {
lineItem: [
{ type: #FOR_ACTION, dataAction: 'Update_UserStatus', label: 'User Status
With Number', position: 70 },
] }

 

Regards.

Shweta

vinith1142
Discoverer
0 Kudos
Hi all,
While updating the UI, instead of updating the particular instance, is there any way to update the complete entity? I didn't get any references on the web.
abhishekd
Advisor
Advisor
0 Kudos
Thanks Ramjee for for sharing the link.

I have one question , I have created a separate abstract entity and created a action in BD also , but still I am not getting any pop up . I am using ODATA v2. Can you tell me what else I have to do in this ....
Ramjee_korada
Active Contributor
0 Kudos
Hi Abhishek,

There is no special steps needed for OData v2. Please check if you exposed action in projection level Behavior definition?

Regarding value help, you can refer to my previous comments .

Best wishes,

Ramjee Korada

 
abhishekd
Advisor
Advisor
0 Kudos
Thanks Ramjee for the reply ,

I have one doubt that can we show all the relevant Schedule line item data for the sales order in the popup once the user click on the Schedule lines button .

 

Ramjee_korada
Active Contributor
0 Kudos
Hi Abhishek,

I have not tried it yet. As per my knowledge, Answer is NO.

The popup is for the input to the action but not result.

I think the best way to do is to Define a function in Behavior definition and consume it from fragment in Fiori extension project.

 

Best wishes,

Ramjee Korada
jorgebastos
Discoverer
In manifest file, you have to delete the row that contain: "sap-value-list": "none"


manifest

akoethe
Explorer
0 Kudos
Hi Ramjee,

 

thank you very much for this post. We have implemented it in the way you discribed and it works well.

But now we have an additional requirement, for which we hvae not found a solution yet.

 

The requirement is to perform some validations before executing the action. That means, when the user presses the button we would like to check if the user has filled out everything correctly and only if the data are correct, we then show the pop up.

Our problem is mainly the time for the checks. In the action implementation the pop up has already been processed, so it is to late to trigger the checks here.

Also, we do not want to use the feature control, because we would like to give feedback, why the action is not possible.

Do you have any idea how we could do this?

Best regards and thanks in advance,

Alex

 

 
Ramjee_korada
Active Contributor
0 Kudos
Hi Alex,

Thanks for the feedback.

I have tried with "Precheck' but this is also executed after popup.

One way is to implement with Fiori Custom code to fire

  1.  A Function to give validation result if it is error or success

  2. If error, show the message

  3. If success, proceed with existing Action popup.


Also kindly request you raise a question so that SAP Experts can be notified and can answer this .

Best wishes,

Ramjee Korada
CUnterste
Discoverer
0 Kudos
Hi Ramjee,

 

thank you for your helpful blog.

I found out, that it is possible to fill the input fields in the dialog, if you name the fields after fields in your root entity. However, those fields must be non-key fields and must not be hidden with @UI.hidden annotation.

Do you know any way to fill the input parameters, with for example the key fields?

I use this action to copy entries, so I only have to enter the new key values.

 

Best regards

Christof
shilpi-a
Explorer
0 Kudos

Hello Ramjee,

I am facing a similar issue where i want custom action button to be always active and also on click of button should ask for parameters. Mine in V2 Unmanaged scenario.

i have defined button - CreateValCat in behaviour definition and also an abstract entity as below :

static action CreateValCat parameter ZValtCate;

define abstract entity ZValtCate
{
@EndUserText.label: 'Valuation Category'
VALUE_CATEGORY : acpos;

@UI.hidden : true
wteseq : numc3;

@UI.hidden : true
billmethod : zbillmeth;
}

so using

because of this blog i got to know about static and hence getting button active always. But on click this button, it does not give pop up to allow enter value for Value Category and so a blank entry gets created in the table.

Can you please let me know which step i am doing wrong.

Thanks.
Shilpi

Ramjee_korada
Active Contributor
0 Kudos
Hi Christof,

Isn't it late or external numbering ?

 

Best wishes

Ramjee Korada
CUnterste
Discoverer
0 Kudos
Hi Ramjee,

no, there is no numbering.

 

Best Regards

Christof
Ramjee_korada
Active Contributor
0 Kudos
I hope you defined it as factory action?
akshay154
Explorer
0 Kudos

Hi Ramjee,

Thank you for this informative blog. I was able to successfully implement the custom action button with dialog box by following your blog. However, I wanted to know if it is possible to have radio button group in the dialog box like in the image below:

Also, is it possible to have different title for the dialog box than the Custom action button name?

Ramjee_korada
Active Contributor
Hi Akhshay,

I don't think that flexibility we have in RAP annotations.

You have to implement custom Fiori Fragment.

 

Best wishes,

Ramjee Korada
DiegoValdivia
Participant
0 Kudos
Thanks Jorge! This one did the trick for me.
0 Kudos
Hi Ramjee,

Thank you for your informative and helpful blog.

I use a factory action to copy entries and I'm trying to figure out how to display an input field in the dialog only if the object you want to apply the factory action to meets certain properties. Do you know of any way to accomplish this?

 

Best Regards

Jonah Notthoff
Ramjee_korada
Active Contributor
0 Kudos
Hi Jonah,

thank you for the feedback.

you can use instance feature control so that you can do those validations and then enable the COPY button.

There is no opportunity available to execute some logic before opening the dialog.

Last option is to go with Fiori App extensions with custom code.

Best wishes,

Ramjee Korada.

 
0 Kudos
Hi Ramjee,

I have an abstract entity cds and have also created an action button with parameter in behaviour definition.This parameter points to abstract entity cds.

The abstract entity cds has many fields which in UI are displayed inside dialog.

I have a field as a drop-down used value help definition to get values.

Now I want to default values to a particular key for the drop-down. How can I default values to a drop down coming from abstract entity cds.

I tried all annotation like @consumptio.defaultvalue:"key".but it doesn't work.

Any specific way by which I can default the drop-down inside the dialog ?

Regards,

Abi
Ramjee_korada
Active Contributor
0 Kudos
Hi Abi,

It is not currently possible to have a custom logic to default from RAP.

It is planned to deliver in Q4 2023 or Q1 2022 in BTP environment.

You have to use annotation or custom code in Fiori.

 

Best wishes,

Ramjee Korada
0 Kudos
Hi Ramjee,

Thanks alot

If it's not possible via cds annotation.

What annotation can i use in XML to default the drop-down values for the field in abstract entity cds?

Suppose I have a function import named -> statusPut

In my annotation XML what can I use it

Kindly provide me a detailed example how I can use the annotation in this case?

 

Regards,

Abi
 
Ramjee_korada
Active Contributor
former_member872813
Discoverer
0 Kudos
HI Ramjee...

 

After executing custom action (Service is V4 version), the application is enabling the CREATE button at end of execution. How to avoid that error.  below is the screen shot.


 

If I use V2 version service, Im getting below error.


 

Could you please guide me, what could the root cause
Labels in this area