on 2024 Dec 03 12:22 PM
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
Request clarification before answering.
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
52 | |
6 | |
5 | |
5 | |
5 | |
4 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.