
Sales Order Update 2 Step Process
Sales Order Update Using Custom API
@EndUserText.label : 'Sales Order Tolerance'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zsales_order_tol {
key client : abap.clnt;
key customer : idtw_kunnr;
@Semantics.quantity.unitOfMeasure : 'zsales_order_tol.unit_field'
change_tolerance : abap.quan(13,2);
unit_field : abap.unit(2);
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_locinst_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}
Custom Business Object UI Service Preview
class ZCL_DEMO_SO_UPDATE definition
public
create public .
public section.
interfaces IF_HTTP_SERVICE_EXTENSION .
protected section.
private section.
ENDCLASS.
CLASS ZCL_DEMO_SO_UPDATE IMPLEMENTATION.
method IF_HTTP_SERVICE_EXTENSION~HANDLE_REQUEST.
endmethod.
ENDCLASS.
TYPES:
BEGIN OF ty_demo_req,
sales_order(10) TYPE c,
sales_order_item(6) TYPE c,
requested_quantity(13) TYPE p DECIMALS 2,
END OF ty_demo_req,
BEGIN OF ty_demo_response,
sales_order(10) TYPE c,
sales_order_item(6) TYPE c,
previous_quantity(13) TYPE p DECIMALS 2,
updated_quantity(13) TYPE p DECIMALS 2,
END OF ty_demo_response.
TYPES:
BEGIN OF ty_inputs,
customer_number TYPE idtw_kunnr,
items TYPE STANDARD TABLE OF ty_demo_req WITH EMPTY KEY,
END OF ty_inputs,
BEGIN OF ty_output,
items TYPE STANDARD TABLE OF ty_demo_response WITH EMPTY KEY,
END OF ty_output.
DATA: lt_req TYPE ty_inputs,
lv_error(1) TYPE c,
lv_text TYPE string,
ls_response TYPE ty_demo_response,
es_response TYPE ty_output,
lc_header_content TYPE string VALUE 'content-type',
lc_content_type TYPE string VALUE 'text/json'.
DATA(lv_req_body) = request->get_text( ).
"first deserialize the request
xco_cp_json=>data->from_string( lv_req_body )->apply( VALUE #(
( xco_cp_json=>transformation->pascal_case_to_underscore )
) )->write_to( REF #( lt_req ) ).
response->set_status('200').
DATA(lv_json_string) = xco_cp_json=>data->from_abap( es_response )->apply( VALUE #(
( xco_cp_json=>transformation->underscore_to_pascal_case )
) )->to_string( ).
response->set_text( lv_json_string ).
response->set_header_field( i_name = lc_header_content
i_value = lc_content_type ).
"check the customer number supplied against our custom business object
SELECT SINGLE ChangeTolerance, UnitField FROM zi_sales_order_tol WHERE Customer = @lt_req-customer_number INTO @DATA(ls_tolerance).
LOOP AT lt_req-items INTO DATA(ls_req).
"retrieve the current quantity for comparison with our tolerance
SELECT SINGLE requestedquantity FROM i_salesorderitem WITH PRIVILEGED ACCESS WHERE
salesorder = @ls_req-sales_order AND
salesorderitem = @ls_req-sales_order_item
INTO @ls_response-previous_quantity.
"check for tolerance violations at item level and terminate entire process if any violations occur
IF abs( ls_req-requested_quantity - ls_response-previous_quantity ) > ls_tolerance-ChangeTolerance.
lv_error = 'X'.
lv_text = 'Tolerance Exceeded' .
EXIT.
ENDIF.
"Modify the quantity
MODIFY ENTITIES OF i_salesordertp PRIVILEGED
ENTITY salesorderitem
UPDATE
SET FIELDS
WITH VALUE #( ( requestedquantity = ls_req-requested_quantity
%key-salesorder = ls_req-sales_order
%key-salesorderitem = ls_req-sales_order_item ) )
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).
IF ls_failed IS NOT INITIAL.
lv_error = 'X'.
lv_text = 'Error during update'.
EXIT.
ENDIF.
"update our response structure
ls_response-sales_order = ls_req-sales_order.
ls_response-sales_order_item = ls_req-sales_order_item.
ls_response-updated_quantity = ls_req-requested_quantity.
APPEND ls_response TO es_response-items.
CLEAR ls_response.
ENDLOOP.
"commit our changes if no errors
COMMIT ENTITIES BEGIN
RESPONSE OF i_salesordertp
FAILED DATA(ls_save_failed)
REPORTED DATA(ls_save_reported).
COMMIT ENTITIES END.
{
"CustomerNumber": "0010100001",
"items": [
{
"SalesOrder": "0000000011",
"SalesOrderItem": "000010",
"RequestedQuantity": "15.00"
},
{
"SalesOrder": "0000000011",
"SalesOrderItem": "000020",
"RequestedQuantity": "5.00"
}
]
}
{
"Items": [
{
"SalesOrder": "0000000011",
"SalesOrderItem": "000010",
"PreviousQuantity": 10.0,
"UpdatedQuantity": 15.0
},
{
"SalesOrder": "0000000011",
"SalesOrderItem": "000020",
"PreviousQuantity": 1.0,
"UpdatedQuantity": 5.0
}
]
}
CLASS zcl_demo_so_update DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES if_http_service_extension .
TYPES:
BEGIN OF ty_demo_req,
sales_order(10) TYPE c,
sales_order_item(6) TYPE c,
requested_quantity(13) TYPE p DECIMALS 2,
END OF ty_demo_req,
BEGIN OF ty_demo_response,
sales_order(10) TYPE c,
sales_order_item(6) TYPE c,
previous_quantity(13) TYPE p DECIMALS 2,
updated_quantity(13) TYPE p DECIMALS 2,
END OF ty_demo_response.
TYPES:
BEGIN OF ty_inputs,
customer_number TYPE idtw_kunnr,
items TYPE STANDARD TABLE OF ty_demo_req WITH EMPTY KEY,
END OF ty_inputs,
BEGIN OF ty_output,
items TYPE STANDARD TABLE OF ty_demo_response WITH EMPTY KEY,
END OF ty_output.
PROTECTED SECTION.
PRIVATE SECTION.
DATA: lt_req TYPE ty_inputs,
lv_error(1) TYPE c,
lv_text TYPE string,
ls_response TYPE ty_demo_response,
es_response TYPE ty_output,
lc_header_content TYPE string VALUE 'content-type',
lc_content_type TYPE string VALUE 'text/json'.
ENDCLASS.
CLASS zcl_demo_so_update IMPLEMENTATION.
METHOD if_http_service_extension~handle_request.
DATA(lv_req_body) = request->get_text( ).
"first deserialize the request
xco_cp_json=>data->from_string( lv_req_body )->apply( VALUE #(
( xco_cp_json=>transformation->pascal_case_to_underscore )
) )->write_to( REF #( lt_req ) ).
"check the customer number supplied against our custom business object
SELECT SINGLE ChangeTolerance, UnitField FROM zi_sales_order_tol WHERE Customer = @lt_req-customer_number INTO @DATA(ls_tolerance).
IF ls_tolerance IS NOT INITIAL.
LOOP AT lt_req-items INTO DATA(ls_req).
"retrieve the current quantity for comparison with our tolerance
SELECT SINGLE requestedquantity FROM i_salesorderitem WITH PRIVILEGED ACCESS WHERE
salesorder = @ls_req-sales_order AND
salesorderitem = @ls_req-sales_order_item
INTO @ls_response-previous_quantity.
"check for tolerance violations at item level and terminate entire process if any violations occur
IF abs( ls_req-requested_quantity - ls_response-previous_quantity ) > ls_tolerance-ChangeTolerance.
lv_error = 'X'.
lv_text = 'Tolerance Exceeded' .
EXIT.
ENDIF.
"Modify the quantity
MODIFY ENTITIES OF i_salesordertp PRIVILEGED
ENTITY salesorderitem
UPDATE
SET FIELDS
WITH VALUE #( ( requestedquantity = ls_req-requested_quantity
%key-salesorder = ls_req-sales_order
%key-salesorderitem = ls_req-sales_order_item ) )
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).
IF ls_failed IS NOT INITIAL.
lv_error = 'X'.
lv_text = 'Error during update'.
EXIT.
ENDIF.
"update our response structure
ls_response-sales_order = ls_req-sales_order.
ls_response-sales_order_item = ls_req-sales_order_item.
ls_response-updated_quantity = ls_req-requested_quantity.
APPEND ls_response TO es_response-items.
CLEAR ls_response.
ENDLOOP.
ELSE.
lv_error = 'X'.
lv_text = 'Customer Not Maintained in Tolerance Table'.
ENDIF.
IF lv_error IS NOT INITIAL.
"propagate any errors raised
response->set_status('500').
response->set_text( lv_text ).
ELSE.
"commit our changes if no errors
COMMIT ENTITIES BEGIN
RESPONSE OF i_salesordertp
FAILED DATA(ls_save_failed)
REPORTED DATA(ls_save_reported).
COMMIT ENTITIES END.
"propagate any errors during save
IF ls_save_failed IS NOT INITIAL.
response->set_status('500').
response->set_text( 'Error during save' ).
ELSE.
"respond with success payload
response->set_status('200').
DATA(lv_json_string) = xco_cp_json=>data->from_abap( es_response )->apply( VALUE #(
( xco_cp_json=>transformation->underscore_to_pascal_case )
) )->to_string( ).
response->set_text( lv_json_string ).
response->set_header_field( i_name = lc_header_content
i_value = lc_content_type ).
ENDIF.
ENDIF.
ENDMETHOD.
ENDCLASS.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
11 | |
8 | |
7 | |
6 | |
6 | |
5 | |
4 | |
4 | |
4 | |
4 |