cancel
Showing results for 
Search instead for 
Did you mean: 

How to Consume a class as and API or Consume it as an cds view

sunilpadhy
Explorer
0 Kudos
188

Hi All,
I have created a class in Eclipse ADT (ABAP CLoud Project )
1.created a CDS View Consuming the cds view Created a Class where i added all Logics 
2. Created a Entity defining the Class 
3. Created Service Binding and Definition defining reference to the entity
3. On Fiori preview i am unable to see data but the fields i can  

Class Code 

CLASS zstockcard DEFINITION PUBLIC CREATE PUBLIC.

 

PUBLIC SECTION.

* INTERFACES if_oo_adt_classrun.

INTERFACES if_rap_query_provider.

 

DATA:lv_mandt TYPE sy-mandt,

out TYPE REF TO if_oo_adt_classrun_out.

 

TYPES: BEGIN OF ty_material_data,

material TYPE zstockcardcdsview-material,

plant TYPE zstockcardcdsview-plant,

postingdate TYPE zstockcardcdsview-postingdate,

quantity_in_base TYPE zstockcardcdsview-quantityinbaseunit,

stockquantity TYPE zstockcardcdsview-matlwrhsstkqtyinmatlbaseunit,

unitprice TYPE zstockcardcdsview-unitprice,

currentdate TYPE zstockcardcdsview-currentdate,

END OF ty_material_data.

 

TYPES: BEGIN OF ty_material_data1,

material TYPE zstockcardcdsview-material,

plant TYPE zstockcardcdsview-plant,

quantity_in_base TYPE zstockcardcdsview-quantityinbaseunit,

stockquantity TYPE string,

END OF ty_material_data1.

 

TYPES: BEGIN OF ty_90_days,

material TYPE zstockcardcdsview-material,

plant TYPE zstockcardcdsview-plant,

unitprice TYPE zstockcardcdsview-unitprice,

quantity_in_base TYPE zstockcardcdsview-quantityinbaseunit,

END OF ty_90_days.

 

TYPES: BEGIN OF ty_180_days,

material TYPE zstockcardcdsview-material,

plant TYPE zstockcardcdsview-plant,

unitprice TYPE zstockcardcdsview-unitprice,

quantity_in_base TYPE zstockcardcdsview-quantityinbaseunit,

END OF ty_180_days.

 

TYPES: BEGIN OF ty_above180_days,

material TYPE zstockcardcdsview-material,

plant TYPE zstockcardcdsview-plant,

unitprice TYPE zstockcardcdsview-unitprice,

quantity_in_base TYPE zstockcardcdsview-quantityinbaseunit,

END OF ty_above180_days.

 

TYPES: BEGIN OF ty_output_data,

stockquantity TYPE string,

unitprice TYPE string,

plant TYPE werks_d,

material TYPE matnr,

qty_0to90days TYPE string,

value_0to90days TYPE string,

qty_90to180days TYPE string,

value_90to180days TYPE string,

qty_above180days TYPE string,

value_above180days TYPE string,

END OF ty_output_data.

.

DATA: lt_90days TYPE TABLE OF ty_90_days,

lt_180days TYPE TABLE OF ty_180_days,

lt_above180 TYPE TABLE OF ty_above180_days,

lt_stddata TYPE TABLE OF ty_material_data,

ls_stddata TYPE ty_material_data,

lt_stkstd TYPE TABLE OF ty_material_data1,

ls_stkstd TYPE ty_material_data1,

lt_output TYPE TABLE OF ty_output_data,

ls_output TYPE ty_output_data,

lv_days_diff TYPE int4,

lv_qty_left TYPE zstockcardcdsview-matlwrhsstkqtyinmatlbaseunit,

lv_index TYPE string.

 

ENDCLASS.

 

CLASS zstockcard IMPLEMENTATION.

 

 

METHOD if_rap_query_provider~select.

"in Local testing Method if_oo_adt_classrun~main.

 

 

SELECT material,

plant,

postingdate,

quantityinbaseunit,

matlwrhsstkqtyinmatlbaseunit,

unitprice,

currentdate

FROM zstockcardcdsview

INTO TABLE @lt_stddata UP TO 10000 ROWS.

 

TRY.

CASE io_request->get_entity_id( ).

WHEN 'ZStockAgeEntity'.

IF io_request->is_data_requested( ).

DATA(lv_offset) = io_request->get_paging( )->get_offset( ).

DATA(lv_page_size) = io_request->get_paging( )->get_page_size( ).

DATA(lv_max_rows) = COND #(

WHEN lv_page_size = if_rap_query_paging=>page_size_unlimited THEN 0

ELSE lv_page_size

).

 

 

" Categorize data into lt_90days, lt_180days, and lt_above180

LOOP AT lt_stddata INTO ls_stddata.

 

lv_days_diff = ls_stddata-currentdate - ls_stddata-postingdate.

 

IF lv_days_diff BETWEEN 0 AND 90.

READ TABLE lt_90days INTO DATA(ls_90days) WITH KEY material = ls_stddata-material plant = ls_stddata-plant.

lv_index = sy-tabix.

IF sy-subrc = 0.

ls_90days-quantity_in_base = ls_90days-quantity_in_base + ls_stddata-quantity_in_base.

MODIFY lt_90days FROM ls_90days INDEX lv_index.

ELSE.

MOVE-CORRESPONDING ls_stddata TO ls_90days.

INSERT ls_90days INTO TABLE lt_90days.

ENDIF.

 

ELSEIF lv_days_diff BETWEEN 91 AND 180.

READ TABLE lt_180days INTO DATA(ls_180days) WITH KEY material = ls_stddata-material plant = ls_stddata-plant.

lv_index = sy-tabix.

IF sy-subrc = 0.

ls_180days-quantity_in_base = ls_180days-quantity_in_base + ls_stddata-quantity_in_base.

MODIFY lt_180days FROM ls_180days INDEX lv_index.

ELSE.

MOVE-CORRESPONDING ls_stddata TO ls_180days.

INSERT ls_180days INTO TABLE lt_180days.

ENDIF.

 

ELSE.

READ TABLE lt_above180 INTO DATA(ls_above180) WITH KEY material = ls_stddata-material plant = ls_stddata-plant.

lv_index = sy-tabix.

IF sy-subrc = 0.

ls_above180-quantity_in_base = ls_above180-quantity_in_base + ls_stddata-quantity_in_base.

MODIFY lt_above180 FROM ls_above180 INDEX lv_index.

ELSE.

MOVE-CORRESPONDING ls_stddata TO ls_above180.

INSERT ls_above180 INTO TABLE lt_above180.

ENDIF.

 

ENDIF.

CLEAR:ls_stddata,ls_90days,ls_180days,ls_above180,lv_index.

ENDLOOP.

 

LOOP AT lt_stddata INTO ls_stddata.

MOVE-CORRESPONDING ls_stddata TO ls_stkstd.

COLLECT ls_stkstd INTO lt_stkstd.

ENDLOOP.

* MOVE-CORRESPONDING lt_stddata to lt_stkstd.

 

LOOP AT lt_stkstd INTO ls_stkstd.

CLEAR: ls_output, lv_qty_left.

 

" Initialize remaining quantity to process

lv_qty_left = ls_stkstd-stockquantity.

 

" Process 0 to 90 days

LOOP AT lt_90days INTO ls_90days WHERE material = ls_stkstd-material AND plant = ls_stkstd-plant.

IF lv_qty_left <= ls_90days-quantity_in_base.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_0to90days = lv_qty_left.

ls_output-unitprice = ls_90days-unitprice.

ls_output-value_0to90days = lv_qty_left * ls_90days-unitprice.

lv_qty_left = 0.

EXIT.

ELSE.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_0to90days = ls_90days-quantity_in_base.

ls_output-unitprice = ls_90days-unitprice.

ls_output-value_0to90days = ls_output-qty_0to90days * ls_90days-unitprice.

lv_qty_left = lv_qty_left - ls_90days-quantity_in_base.

ENDIF.

ENDLOOP.

 

" Process 91 to 180 days

LOOP AT lt_180days INTO ls_180days WHERE material = ls_stkstd-material AND plant = ls_stkstd-plant.

IF lv_qty_left <= ls_180days-quantity_in_base.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_90to180days = lv_qty_left.

ls_output-unitprice = ls_180days-unitprice.

ls_output-value_90to180days = lv_qty_left * ls_180days-unitprice.

lv_qty_left = 0.

EXIT.

ELSE.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_90to180days = ls_180days-quantity_in_base.

ls_output-unitprice = ls_180days-unitprice.

ls_output-value_90to180days = ls_output-qty_90to180days * ls_180days-unitprice.

lv_qty_left = lv_qty_left - ls_180days-quantity_in_base.

ENDIF.

ENDLOOP.

 

" Process above 180 days

LOOP AT lt_above180 INTO ls_above180 WHERE material = ls_stkstd-material AND plant = ls_stkstd-plant.

IF lv_qty_left <= ls_above180-quantity_in_base.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_above180days = lv_qty_left.

ls_output-unitprice = ls_above180-unitprice.

ls_output-value_above180days = lv_qty_left * ls_above180-unitprice.

lv_qty_left = 0.

EXIT.

ELSE.

ls_output-material = ls_stkstd-material.

ls_output-plant = ls_stkstd-plant.

ls_output-stockquantity = ls_stkstd-stockquantity.

ls_output-qty_above180days = ls_above180-quantity_in_base.

ls_output-unitprice = ls_above180-unitprice.

ls_output-value_above180days = ls_output-qty_above180days * ls_above180-unitprice.

lv_qty_left = lv_qty_left - ls_above180-quantity_in_base.

ENDIF.

ENDLOOP.

APPEND ls_output TO lt_output.

ENDLOOP.

** out->write( EXPORTING data = lt_output name = 'Table display' ).

IF io_request->is_total_numb_of_rec_requested( ).

io_response->set_total_number_of_records( lines( lt_output ) ).

ENDIF.

SORT lt_output ASCENDING BY material plant.

io_response->set_data( lt_output ).

 

ENDIF.

ENDCASE.

CATCH cx_rap_query_provider.

ENDTRY.

ENDMETHOD.

 

ENDCLASS.


Entity-

@EndUserText.label: 'Entity to define class for stock card report'

@ObjectModel.query.implementedBy: 'ABAP:ZSTOCKCARD'

define custom entity ZStockAgeEntity

{

 

key plant : abap.char(4);

key material : matnr;

stockquantity : abap.string;

unitprice : abap.string;

qty_0to90days : abap.string;

value_0to90days : abap.string;

qty_90to180days : abap.string;

value_90to180days : abap.string;

qty_above180days : abap.string;

value_above180days : abap.string;

 

}

Errors-
Short Dump Error
403 Error

Questins
1. can i consume it into a cds view or a table
2. How to pass data based on custom logic written in class to custom cds entity

3. implementing filter for point 2

4. Custom entity can be mapped to CDS view

 

 

@Andre_Fischer @yevgen_trukhin @julieplummer20 @krishnanunni_sudhakaranpi @kaitorsten_schipper 

 

View Entire Topic
krishnanunni_sudhakaranpi
Product and Topic Expert
Product and Topic Expert
0 Kudos

Hi Sunil, 

Is the short dump getting triggered at the io_response->set_data( lt_output ) statement? If so, I think it is because the data type of the internal table lt_output does not match the CDS custom entity type. You can try defining lt_output as shown below:

DATA lt_output TYPE TABLE OF ZStockAgeEntity.

I am not sure if I fully understood all your questions, but here are some relevant points that might help:

1. CDS Custom Entity Limitations:

A CDS custom entity cannot be used as a data source in other CDS entities or in ABAP SQL. 

https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abencds_f1_define_custom_entity.html

2. Filter and Search Capabilities:

It is possible to implement filter and search operations within a CDS custom entity.

https://help.sap.com/docs/abap-cloud/abap-rap/implementing-unmanaged-query

Hope this helps.

Best regards,

Krishnan

 

sunilpadhy
Explorer
0 Kudos
Thank you