Well, hello again!
I am here with yet another unsolved mystery, yup! You better believe me! As the subject is as clean as a whistle, this blog post is all about Simulating Shipment Cost through Function Module. Before I proceed, let’s have a clear understanding of what actually I am trying to do and what exactly we will be going to achieve!
So, here is the scenario. You have the Shipment created and you see the button on VT02N to simulate cost. Well, when you do it through T-code, it is as easy as anything but the reality is as different as cheese and chalk! Oh yes, I mean it. It’s not easy when it comes to implement via Function Module.
Recently, I have encountered the same problem but somehow I managed to pull that off. I thought I should be sharing it to those who are still stuck with this and automating the Shipment Cost simulation has undone them!
I will go step by step to implement the solution but first let’s see what is the Simulate Shipment Cost button and where it resides in Shipment (VT02N). Have a look this beautiful Shipment Created in the System. Have a look at the highlighted button, this is when you click and simulate the shipment cost.
Now let’s click it and Simulate it.
You see, bingo! Cost is simulated in split a second. Now let’s try using a Function Module. You need to follow the steps mentioned below:
- Shipment should be created
- Make use of FM: RV_SHIPMENT_VIEW
- Move the returned tables to a particular Deep Structure (Don’t worry, will elaborate)
- Finally, simulate the Shipment Cost using: SD_SCD_SIMULATE_FREIGHT_COSTS
Now we are ready to Simulate the Shipment Cost by following the above steps! So, why waste time? Let’s do it.
Let’s do the global declarations.
Data: f_vttkvb TYPE vttkvb, f_tvtk TYPE tvtk, f_tvtkt TYPE tvtkt, f_ttds TYPE ttds, f_ttdst TYPE ttdst, f_vbpla TYPE vbpla, e_delivery_missing TYPE rv56a-selkz, e_dsd_display TYPE rv56a-selkz, f_vttp TYPE STANDARD TABLE OF vttpvb, f_trlk TYPE STANDARD TABLE OF vtrlk, f_trlp TYPE STANDARD TABLE OF vtrlp, f_vtts TYPE STANDARD TABLE OF vttsvb, f_vtsp TYPE STANDARD TABLE OF vtspvb, f_vbpa TYPE STANDARD TABLE OF vbpavb, f_vbadr TYPE STANDARD TABLE OF sadrvb, f_vtfa TYPE STANDARD TABLE OF vtfavb, f_vbplk TYPE STANDARD TABLE OF vbplk, f_vbplp TYPE STANDARD TABLE OF vbplp, ls_vbplk TYPE vbplk, ls_vbplp TYPE vbplp, f_vbpls TYPE STANDARD TABLE OF vbpls, f_yvtfa TYPE STANDARD TABLE OF vtfavb, lt_shipments TYPE v54a0_refobj_tab, ls_shipments TYPE v54a0_refobj, i_scd_sim TYPE i VALUE 2, lt_freight_costs TYPE v54a0_scdd_tab, ls_freight_costs TYPE v54a0_scdd, e_errors_occured TYPE c, e_warnings_occured TYPE c, e_created_freight_costs TYPE i.
Now get the shipment data by passing Shipment Number.
CALL FUNCTION 'RV_SHIPMENT_VIEW' EXPORTING shipment_number = p_shipment_number option_tvtk = abap_true option_ttds = abap_true language = sy-langu option_items = abap_true option_minimized_item_data = abap_false option_sales_orders = abap_false option_export_data = abap_false option_stawn_read = abap_false option_segments = abap_true option_partners = abap_true option_messages = abap_true option_packages = abap_true option_flow = abap_true option_delivery_lock = abap_false option_authority_check = abap_false activity = 'A' "Display option_no_refresh = abap_true option_ignore_missing_deliv = abap_true i_filter_type = 'F' "Transportation Relevance IMPORTING f_vttkvb = f_vttkvb f_tvtk = f_tvtk f_tvtkt = f_tvtkt f_ttds = f_ttds f_ttdst = f_ttdst e_delivery_missing = e_delivery_missing TABLES f_vttp = f_vttp f_trlk = f_trlk f_trlp = f_trlp f_vtts = f_vtts f_vtsp = f_vtsp f_vbpa = f_vbpa f_vbadr = f_vbadr f_vbplk = f_vbplk f_vbplp = f_vbplp f_vbpls = f_vbpls EXCEPTIONS not_found = 1 no_authority = 2 delivery_missing = 3 delivery_lock = 4 OTHERS = 5. IF sy-subrc <> 0. * Implement Suitable Exceptions ENDIF.
Great, we have got the Shipment data, just give it a final go then! Pass all these Internal Tables and Structures to Simulate Cost FM.
ls_shipments-vttkf = f_vttkvb. ls_shipments-vttp = f_vttp. ls_shipments-vtrlk = f_trlk. ls_shipments-vtrlp = f_trlp. ls_shipments-vtrlp_c = f_trlp. ls_shipments-vtrlp_s = f_trlp. ls_shipments-vttsf = f_vtts. ls_shipments-vtsp = f_vtsp. ls_shipments-vbpa = f_vbpa. ls_shipments-vbplk = f_vbplk. ls_shipments-vbplp = f_vbplp. ls_shipments-vbadr = f_vbadr. ls_shipments-tvtk = f_tvtk. ls_shipments-ttds = f_ttds. APPEND ls_shipments TO lt_shipments. CLEAR: ls_shipments.
Brilliant, now lets Simulate the cost! Just pass LT_SHIPMENTS to the following FM:
CALL FUNCTION 'SD_SCD_SIMULATE_FREIGHT_COSTS' EXPORTING i_shipments = lt_shipments i_scd_sim = 3 i_run = 0 IMPORTING e_freight_costs = lt_freight_costs e_errors_occured = e_errors_occured e_warnings_occured = e_warnings_occured e_created_freight_costs = e_created_freight_costs. IF NOT lt_freight_costs IS INITIAL. LOOP AT lt_freight_costs INTO ls_freight_costs. LOOP AT ls_freight_costs-x-item INTO ls_item. LOOP AT ls_item-komv INTO ls_komv. APPEND ls_komv TO lt_komv. CLEAR: ls_komv. ENDLOOP. ENDLOOP. ENDLOOP. ELSE. p_error_message = 'Cost could not be Simulated'. ENDIF.
LT_FRIEGHT_COSTS will be returned and again it’s a deep structure, Simulated cost will be sitting in LT_FRIEGHT_COSTS-X-ITEM-KOMV.
Congratulations! We have managed to Simulate the Shipment cost but hang on! Mansoor, where is the test case? Oops! Sorry mate! Let me show you:
KOMV-KBETR with currency is your simulated cost, and KOMV-KWERT is your converted simulated cost.
Please let me know in comments how you felt about this thing.