‎2016 Feb 18 11:02 AM
Hi
I have written below code in ABAP Proxy.
METHOD zii_si_bloomberg_exchange_rate~si_bloomberg_exchange_rate_as.
* Start of code added by Cybertech on 14/12/2015
* Forex rate upload Project
* Types Declaration
TYPES: BEGIN OF ty_fcurr_tcurr,
fcurr TYPE fcurr_curr,
tcurr TYPE tcurr_curr,
kurst TYPE kurst_curr,
END OF ty_fcurr_tcurr,
BEGIN OF ty_input,
rate_type TYPE kurst_curr,
from_curr TYPE fcurr_curr,
to_currncy TYPE tcurr_curr,
valid_from TYPE gdatu_cur,
exch_rate TYPE char50,
END OF ty_input,
BEGIN OF ty_tcurf,
kurst TYPE kurst_curr,
fcurr TYPE fcurr_curr,
tcurr TYPE tcurr_curr,
gdatu TYPE gdatu_invv,
ffact TYPE ffact_curr,
tfact TYPE tfact_curr,
abwct TYPE abwkt_curr,
abwga TYPE abwga_curr,
END OF ty_tcurf,
BEGIN OF ty_error,
kurst TYPE kurst_curr,
fcurr TYPE fcurr_curr,
tcurr TYPE tcurr_curr,
exch_rate TYPE char50,
descr TYPE char255,
END OF ty_error.
* Internal tables declaration
DATA: gt_input TYPE STANDARD TABLE OF ty_input,
gt_return TYPE STANDARD TABLE OF bapiret2,
gt_tcurf TYPE STANDARD TABLE OF ty_tcurf,
gt_fcurr_tcurr TYPE STANDARD TABLE OF ty_fcurr_tcurr,
gt_final TYPE STANDARD TABLE OF bapi1093_0,
gt_error TYPE STANDARD TABLE OF ty_error,
gt_enq TYPE STANDARD TABLE OF seqg3,
* gt_enq1 TYPE STANDARD TABLE OF seqg3,
gt_temp TYPE STANDARD TABLE OF ty_input,
gt_binary1 TYPE solix_tab,
gt_binary2 TYPE solix_tab,
gt_binary3 TYPE solix_tab.
* Work area declartion
DATA:
gw_return TYPE bapiret2,
gw_structure TYPE zdt_exchange_rate_exchange_rat,
gw_input TYPE ty_input,
gw_fcurr_tcurr TYPE ty_fcurr_tcurr,
gw_tcurf TYPE ty_tcurf,
gw_final TYPE bapi1093_0,
gw_error TYPE ty_error,
gw_enq TYPE seqg3,
* gw_enq1 TYPE seqg3,
gw_temp TYPE ty_input.
* Variables Declarations
DATA: gv_str1 TYPE char4,
gv_str2 TYPE string,
gv_str3 TYPE string,
gv_str4 TYPE string,
gv_str5 TYPE string,
gv_str6 TYPE string,
gv_str7 TYPE string,
gv_date TYPE char10,
gv_date2 TYPE char10,
gv_var TYPE char20,
gv_var2 TYPE char20,
gv_count TYPE num2,
gv_count3 TYPE num2,
gv_count4 TYPE num2,
gv_num1 TYPE char10,
gv_num2 TYPE char10,
gv_count2 TYPE num2,
gv_sisid TYPE sy-sysid,
gv_sydatum TYPE char10,
gv_uzeit TYPE char10,
gv_mailsub TYPE so_obj_des,
gv_attach1 TYPE sood-objdes,
gv_attach2 TYPE sood-objdes,
gv_attach3 TYPE sood-objdes,
gv_mbody TYPE string,
gv_date3 TYPE sy-datum,
gv_garg TYPE eqegraarg,
gv_tabix TYPE sy-tabix,
gv_rc TYPE sy-subrc,
gv_final TYPE string,
gv_final2 TYPE string,
gv_final3 TYPE string,
gv_size1 TYPE so_obj_len,
gv_size2 TYPE so_obj_len,
gv_size3 TYPE so_obj_len,
gv_send_request TYPE REF TO cl_bcs,
gv_sender TYPE REF TO if_sender_bcs,
gv_main_text TYPE soli_tab,
gv_document TYPE REF TO cl_document_bcs,
gv_recipient TYPE REF TO if_recipient_bcs,
gv_sent_to_all TYPE os_boolean,
gv_bcs_exception TYPE REF TO cx_bcs,
gv_user TYPE sy-uname,
gv_client TYPE sy-mandt.
* Constants Declarations
CONSTANTS: gc_x TYPE c LENGTH 1 VALUE 'X',
gc_csv TYPE c LENGTH 3 VALUE 'CSV',
gc_tab TYPE c VALUE cl_bcs_convert=>gc_tab,
gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf,
gc_xls TYPE c LENGTH 3 VALUE 'xls',
gc_4103 TYPE abap_encod VALUE '4103',
gc_01 TYPE c LENGTH 2 VALUE '01',
gc_rstable TYPE seqg3-gname VALUE 'RSTABLE'.
IF NOT input-mt_exchange_rate-exchange_rate IS INITIAL.
LOOP AT input-mt_exchange_rate-exchange_rate INTO gw_structure.
gw_fcurr_tcurr-fcurr = gw_structure-from_curr.
gw_fcurr_tcurr-tcurr = gw_structure-to_curr.
gw_fcurr_tcurr-kurst = gw_structure-rate_type.
APPEND gw_fcurr_tcurr TO gt_fcurr_tcurr.
CLEAR : gw_fcurr_tcurr, gw_structure.
ENDLOOP.
ENDIF.
* Checking currency combinations for business availability
IF NOT gt_fcurr_tcurr IS INITIAL.
SELECT kurst
fcurr
tcurr
gdatu
ffact
tfact
abwct
abwga
FROM tcurf
INTO TABLE gt_tcurf
FOR ALL ENTRIES IN gt_fcurr_tcurr
WHERE fcurr = gt_fcurr_tcurr-fcurr
AND tcurr = gt_fcurr_tcurr-tcurr
AND kurst = gt_fcurr_tcurr-kurst.
ENDIF.
IF sy-subrc EQ 0.
IF NOT gt_tcurf IS INITIAL.
LOOP AT gt_tcurf INTO gw_tcurf.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_OUTPUT'
EXPORTING
input = gw_tcurf-gdatu
IMPORTING
output = gv_date.
CALL FUNCTION 'CONVERSION_EXIT_SDATE_INPUT'
EXPORTING
input = gv_date
IMPORTING
output = gv_date2.
IF gv_date2 GT sy-datum.
DELETE gt_tcurf INDEX sy-tabix.
ENDIF.
CLEAR: gw_tcurf,gv_date,gv_date2.
ENDLOOP.
ENDIF.
SORT gt_tcurf BY kurst fcurr tcurr.
IF NOT input-mt_exchange_rate-exchange_rate IS INITIAL.
LOOP AT input-mt_exchange_rate-exchange_rate INTO gw_structure.
READ TABLE gt_tcurf INTO gw_tcurf
WITH KEY kurst = gw_structure-rate_type
fcurr = gw_structure-from_curr
tcurr = gw_structure-to_curr BINARY SEARCH.
IF sy-subrc EQ 0.
gw_input-rate_type = gw_structure-rate_type.
gw_input-from_curr = gw_structure-from_curr.
gw_input-to_currncy = gw_structure-to_curr.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = gw_structure-valid_from
days = 01
months = 00
signum = '+'
years = 00
IMPORTING
calc_date = gv_date3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
gw_input-valid_from = gv_date3.
gw_input-exch_rate = gw_structure-exch_rate.
APPEND gw_input TO gt_input.
CLEAR: gw_input,gw_tcurf,gv_count,gv_count2,gv_var,gv_num1,
gv_num2,gw_structure,gv_date3.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
* Deleting the indirect data which came from external xml file.
SORT gt_input BY rate_type from_curr to_currncy.
gt_temp[] = gt_input[].
SORT gt_temp BY rate_type from_curr to_currncy.
IF NOT gt_input IS INITIAL.
LOOP AT gt_input INTO gw_input.
gw_final-rate_type = gw_input-rate_type.
gw_final-from_curr = gw_input-from_curr.
gw_final-to_currncy = gw_input-to_currncy.
gw_final-valid_from = gw_input-valid_from.
gw_final-from_factor = gc_01.
gw_final-to_factor = gc_01.
gv_var = gw_input-exch_rate.
FIND FIRST OCCURRENCE OF '.' IN gv_var.
IF sy-subrc EQ 4.
gv_count = strlen( gv_var ).
IF gv_count LT 5.
gw_final-exch_rate = gw_input-exch_rate.
APPEND gw_final TO gt_final.
CLEAR gw_final.
READ TABLE gt_temp INTO gw_temp WITH KEY rate_type = gw_input-rate_type
from_curr = gw_input-to_currncy
to_currncy = gw_input-from_curr BINARY SEARCH.
IF sy-subrc EQ 0.
gv_tabix = sy-tabix.
gw_final-rate_type = gw_input-rate_type.
gw_final-from_curr = gw_input-to_currncy.
gw_final-to_currncy = gw_input-from_curr.
gw_final-valid_from = gw_input-valid_from.
gw_final-exch_rate_v = gw_input-exch_rate.
gw_final-from_factor_v = gc_01.
gw_final-to_factor_v = gc_01.
APPEND gw_final TO gt_final.
DELETE gt_temp INDEX gv_tabix.
DELETE gt_input INDEX gv_tabix.
ENDIF.
CLEAR: gw_final,gw_input,gw_temp,gv_tabix.
ELSE.
* Appending error file
gw_error-kurst = gw_input-rate_type.
gw_error-fcurr = gw_input-from_curr.
gw_error-tcurr = gw_input-to_currncy.
gw_error-exch_rate = gw_input-exch_rate.
gw_error-descr = 'Input rate exceeds the allowed length'.
APPEND gw_error TO gt_error.
CLEAR: gw_final,gw_input,gw_temp,gv_tabix,gw_error.
ENDIF.
ELSEIF sy-subrc EQ 0.
SPLIT gv_var AT '.' INTO gv_num1 gv_num2.
gv_count = strlen( gv_num1 ).
gv_count2 = strlen( gv_num2 ).
IF gv_count LT 5 AND gv_count2 LT 6.
gw_final-exch_rate = gw_input-exch_rate.
APPEND gw_final TO gt_final.
CLEAR gw_final.
READ TABLE gt_temp INTO gw_temp WITH KEY rate_type = gw_input-rate_type
from_curr = gw_input-to_currncy
to_currncy = gw_input-from_curr BINARY SEARCH.
IF sy-subrc EQ 0.
gv_tabix = sy-tabix.
gv_var2 = gw_temp-exch_rate.
FIND FIRST OCCURRENCE OF '.' IN gv_var2.
IF sy-subrc EQ 4.
gv_count2 = strlen( gv_var2 ).
IF gv_count2 GT 4.
gw_error-kurst = gw_temp-rate_type.
gw_error-fcurr = gw_temp-from_curr.
gw_error-tcurr = gw_temp-to_currncy.
gw_error-exch_rate = gw_temp-exch_rate.
gw_error-descr = 'Input rate exceeds the allowed length'.
APPEND gw_error TO gt_error.
CLEAR gw_error.
CLEAR: gv_var2,gv_count2.
ENDIF.
ELSEIF sy-subrc EQ 0.
SPLIT gv_var2 AT '.' INTO gv_num1 gv_num2.
gv_count3 = strlen( gv_num1 ).
gv_count4 = strlen( gv_num2 ).
IF gv_count3 GT 4 AND gv_count4 GT 5.
gw_error-kurst = gw_temp-rate_type.
gw_error-fcurr = gw_temp-from_curr.
gw_error-tcurr = gw_temp-to_currncy.
gw_error-exch_rate = gw_temp-exch_rate.
gw_error-descr = 'Input rate exceeds the allowed length'.
APPEND gw_error TO gt_error.
CLEAR: gw_error.
CLEAR gv_var2.
ENDIF.
ENDIF.
gw_final-rate_type = gw_input-rate_type.
gw_final-from_curr = gw_input-to_currncy.
gw_final-to_currncy = gw_input-from_curr.
gw_final-valid_from = gw_input-valid_from.
gw_final-exch_rate_v = gw_input-exch_rate.
gw_final-from_factor_v = gc_01.
gw_final-to_factor_v = gc_01.
APPEND gw_final TO gt_final.
DELETE gt_temp INDEX gv_tabix.
DELETE gt_input INDEX gv_tabix.
CLEAR: gw_final,gw_input,gw_temp,gv_tabix.
ENDIF.
ELSE.
* Appending error file
gw_error-kurst = gw_input-rate_type.
gw_error-fcurr = gw_input-from_curr.
gw_error-tcurr = gw_input-to_currncy.
gw_error-exch_rate = gw_input-exch_rate.
gw_error-descr = 'Input rate exceeds the allowed length'.
APPEND gw_error TO gt_error.
CLEAR: gw_final,gw_input,gw_temp,gv_tabix,gw_error.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
* Adding code for removing databas lock on OB08 & TCURR
CALL FUNCTION 'ENQUEUE_READ'
EXPORTING
gclient = sy-mandt
gname = gc_rstable
guname = ''
TABLES
enq = gt_enq
EXCEPTIONS
communication_failure = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc EQ 0.
* Implement suitable error handling here
ENDIF.
SORT gt_enq STABLE BY gname.
READ TABLE gt_enq INTO gw_enq WITH KEY gname = gc_rstable
garg+0(5) = 'TCURR' BINARY SEARCH.
IF sy-subrc = 0.
* MOVE-CORRESPONDING gw_enq TO gw_enq1.
* APPEND gw_enq1 TO gt_enq1.
gv_user = gw_enq-guname.
ENDIF.
IF NOT gv_user IS INITIAL.
gv_client = sy-mandt.
CALL FUNCTION 'TH_DELETE_USER'
EXPORTING
user = gv_user
client = gv_client
tid = -1
EXCEPTIONS
authority_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDIF.
* BAPI Called for Data upload in TCURR Database Table.
CALL FUNCTION 'BAPI_EXCHRATE_CREATEMULTIPLE'
EXPORTING
upd_allow = gc_x
chg_fixed = gc_x
dev_allow = '000'
TABLES
exchrate_list = gt_final
return = gt_return.
IF sy-subrc EQ 0.
* Forcing Database COMMIT
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = gc_x.
ENDIF.
* Code for processing Email
IF NOT gt_final IS INITIAL.
LOOP AT gt_final INTO gw_final.
gv_str1 = gw_final-rate_type.
gv_str2 = gw_final-from_curr.
gv_str3 = gw_final-to_currncy.
IF NOT gw_final-exch_rate IS INITIAL.
gv_str4 = gw_final-exch_rate.
ELSE.
gv_str4 = gw_final-exch_rate_v.
ENDIF.
gv_str5 = gw_final-valid_from.
IF NOT gw_final-from_factor IS INITIAL.
gv_str6 = gw_final-from_factor.
ELSE.
gv_str6 = gw_final-from_factor_v.
ENDIF.
IF NOT gw_final-to_factor IS INITIAL.
gv_str7 = gw_final-to_factor.
ELSE.
gv_str7 = gw_final-to_factor_v.
ENDIF.
CONCATENATE gv_final
gv_str1 gc_tab
gv_str2 gc_tab
gv_str3 gc_tab
gv_str4 gc_tab
gv_str5 gc_tab
gv_str6 gc_tab
gv_str7 gc_crlf
INTO gv_final.
CLEAR: gv_str1, gv_str2, gv_str3, gv_str3, gv_str4, gv_str5,
gv_str6 ,gv_str7,gw_final.
ENDLOOP.
ENDIF.
IF NOT gt_return IS INITIAL.
LOOP AT gt_return INTO gw_return.
gv_str2 = gw_return-message.
CONCATENATE gv_final2
gv_str2 gc_crlf
INTO gv_final2.
CLEAR: gv_str2,gw_return.
ENDLOOP.
ENDIF.
IF NOT gt_error IS INITIAL.
LOOP AT gt_error INTO gw_error.
gv_str1 = gw_error-kurst.
gv_str2 = gw_error-fcurr.
gv_str3 = gw_error-tcurr.
gv_str4 = gw_error-exch_rate.
gv_str5 = gw_error-descr.
CONCATENATE gv_final3
gv_str1 gc_tab
gv_str2 gc_tab
gv_str3 gc_tab
gv_str4 gc_tab
gv_str5 gc_crlf
INTO gv_final3.
CLEAR: gv_str1, gv_str2, gv_str3, gv_str4, gv_str5,gw_error.
ENDLOOP.
ENDIF.
gv_sisid = sy-sysid.
gv_uzeit = sy-uzeit.
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
date_internal = sy-datum
IMPORTING
date_external = gv_sydatum
EXCEPTIONS
date_internal_is_invalid = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* First attachment
IF NOT gv_final IS INITIAL.
TRY.
cl_bcs_convert=>string_to_solix(
EXPORTING
iv_string = gv_final
iv_codepage = gc_4103
iv_add_bom = gc_x
IMPORTING
et_solix = gt_binary1
ev_size = gv_size1 ).
CATCH cx_bcs.
MESSAGE e445(so).
ENDTRY.
ENDIF.
* Second attachment
IF NOT gv_final2 IS INITIAL.
TRY.
cl_bcs_convert=>string_to_solix(
EXPORTING
iv_string = gv_final2
iv_codepage = gc_4103
iv_add_bom = gc_x
IMPORTING
et_solix = gt_binary2
ev_size = gv_size2 ).
CATCH cx_bcs.
MESSAGE e445(so).
ENDTRY.
ENDIF.
* Third attachment
IF NOT gv_final3 IS INITIAL.
TRY.
cl_bcs_convert=>string_to_solix(
EXPORTING
iv_string = gv_final3
iv_codepage = gc_4103
iv_add_bom = gc_x
IMPORTING
et_solix = gt_binary3
ev_size = gv_size3 ).
CATCH cx_bcs.
MESSAGE e445(so).
ENDTRY.
ENDIF.
TRY.
* create persistent send request
gv_send_request = cl_bcs=>create_persistent( ).
gv_sender = cl_cam_address_bcs=>create_internet_address( 'Forex@User' ).
CALL METHOD gv_send_request->set_sender
EXPORTING
i_sender = gv_sender.
* Generating Mailbody & Subject
CONCATENATE 'Forex rates:-' gv_sisid'_Connected Cars' ',' 'DATE:' gv_sydatum
INTO gv_mailsub.
CONCATENATE 'Please go through above attachment of Forex rates for system:-' gv_sisid'Connected Cars' ','
'Dated:' gv_sydatum ',' 'Time:' gv_uzeit INTO gv_mbody SEPARATED BY space.
CALL FUNCTION 'SCMS_STRING_TO_FTEXT'
EXPORTING
text = gv_mbody
TABLES
ftext_tab = gv_main_text.
IF sy-subrc EQ 0.
ENDIF.
gv_document = cl_document_bcs=>create_document(
i_type = 'RAW'
i_text = gv_main_text
i_subject = gv_mailsub ).
* First attachment
IF NOT gt_binary1 IS INITIAL.
CONCATENATE 'Input Forex exhchange rate File_' gv_sisid INTO gv_attach1.
gv_document->add_attachment(
i_attachment_type = gc_xls
i_attachment_subject = gv_attach1
i_attachment_size = gv_size1
i_att_content_hex = gt_binary1 ).
ENDIF.
* Second attachment
IF NOT gt_binary2 IS INITIAL.
CONCATENATE 'Messages file_' gv_sisid INTO gv_attach2.
gv_document->add_attachment(
i_attachment_type = gc_xls
i_attachment_subject = gv_attach2
i_attachment_size = gv_size2
i_att_content_hex = gt_binary2 ).
ENDIF.
* Third attachment
IF NOT gt_binary3 IS INITIAL.
CONCATENATE 'Floating_rate Error file_' gv_sisid INTO gv_attach3.
gv_document->add_attachment(
i_attachment_type = gc_xls
i_attachment_subject = gv_attach3
i_attachment_size = gv_size3
i_att_content_hex = gt_binary3 ).
ENDIF.
* Add document object to send request
gv_send_request->set_document( gv_document ).
* Add recipient (e-mail address i.e. Distribution List)
gv_recipient = cl_distributionlist_bcs=>getu_persistent( i_dliname = 'ZFI_FOREX_EM'
i_private = space ).
* Add recipient object to send request
gv_send_request->add_recipient( gv_recipient ).
* Send document
gv_sent_to_all = gv_send_request->send( i_with_error_screen = gc_x ).
COMMIT WORK.
CATCH cx_bcs INTO gv_bcs_exception.
MESSAGE i865(so) WITH gv_bcs_exception->error_type.
ENDTRY.
REFRESH: gt_binary1, gt_binary2, gt_binary3,gt_input,gt_error,gt_return,gt_temp.
CLEAR: gv_size1, gv_size2, gv_size3,gv_attach1, gv_attach2, gv_attach3,
gv_mbody,gv_main_text,gv_final,gv_final2,gv_final3,gv_client,gv_user.
*End of code added by Cybertech on 14/12/2015
ENDMETHOD.
******************************************************************************* END OF CODE**************************************************************************
Function module TH_DELETE_USER is behaving strangely.
Interface is triggered by username RFC_PIT130 which has following authorizations.
OBJCT AUTH FIELD VON
S_ADMI_FCD T-PD47969101 S_ADMI_FCD AUDD
S_ADMI_FCD T-PD47969101 S_ADMI_FCD BTCH
S_ADMI_FCD T-PD47969101 S_ADMI_FCD F4MX
S_ADMI_FCD T-PD47969101 S_ADMI_FCD FONT
S_ADMI_FCD T-PD47969101 S_ADMI_FCD LC01
S_ADMI_FCD T-PD47969101 S_ADMI_FCD LC02
S_ADMI_FCD T-PD47969101 S_ADMI_FCD LC03
S_ADMI_FCD T-PD47969101 S_ADMI_FCD LC04
S_ADMI_FCD T-PD47969101 S_ADMI_FCD NADM
S_ADMI_FCD T-PD47969101 S_ADMI_FCD SM02
S_ADMI_FCD T-PD47969101 S_ADMI_FCD SM21
S_ADMI_FCD T-PD47969101 S_ADMI_FCD SP01
S_ADMI_FCD T-PD47969101 S_ADMI_FCD SP0R
S_ADMI_FCD T-PD47969101 S_ADMI_FCD ST0R
S_ADMI_FCD T-PD47969101 S_ADMI_FCD UDSP
S_ADMI_FCD T-PP513803 S_ADMI_FCD NADM
Session is not getting killed, because of that BAPI is throwing an USER LOCKED ERROR.
Please suggest us what should we do???
Thanks,
Darshan.
‎2016 Feb 18 12:18 PM
I don't understand much of why you try to delete the user. I guess becuase he/she is locking the TCURR table while the proxy tries to upload some data to this table.
Wouldn't it be better to try to set a lock on the TCURR table in a while loop (with a counter and a wait for x secs statement to be able to kill the while loop after for example 10 tries with a 2 second wait ) with the proper lock object ? Throwing a user out of the system is not really a nice solution.
You could in stead send a system message to the user asking him/her to leave the transaction.
That doesn't give an explanation about why the FM doesn't work, but I noticed you didn't do any error handling either.
I guess you did debug because you know which error is thrown by the bapi and you didn't do error handling in your code.
‎2016 Feb 18 12:41 PM
Hi Peter,
Thank you for your reply.
I did not get that much.
Please illustrate more with an example.
Thanks,
Darshan.