This is how to set up FI correspondence to work with Floe.
[1] Activate email for FI correspondence
You may need to review SAP notes depending on what version of SAP you are using.
The email address of the receiver is determined from the clerk's internet address on the customer or vendor master.
The function to determining the output type 'I' for emails is configured in transaction BF41
Check that you have logic in place, or copy the sample function module and add in your own business logic, similar to this sample code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: |
FUNCTION z_process_00002310. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(I_BKORM) LIKE BKORM STRUCTURE BKORM *" VALUE(I_KOART) LIKE BKORM-KOART *" VALUE(I_KNA1) LIKE KNA1 STRUCTURE KNA1 OPTIONAL *" VALUE(I_KNB1) LIKE KNB1 STRUCTURE KNB1 OPTIONAL *" VALUE(I_LFA1) LIKE LFA1 STRUCTURE LFA1 OPTIONAL *" VALUE(I_LFB1) LIKE LFB1 STRUCTURE LFB1 OPTIONAL *" TABLES *" T_FIMSG STRUCTURE FIMSG *" CHANGING *" VALUE(C_FINAA) LIKE FINAA STRUCTURE FINAA *" VALUE(C_ITCPO) LIKE ITCPO STRUCTURE ITCPO *" VALUE(C_ARCHIVE_INDEX) LIKE TOA_DARA STRUCTURE TOA_DARA *" DEFAULT SPACE *" VALUE(C_ARCHIVE_PARAMS) LIKE ARC_PARAMS STRUCTURE ARC_PARAMS *" DEFAULT SPACE *"---------------------------------------------------------------------- *{ INSERT DM4K901120 1 TABLES: kna1, "Kunden A-Segment knb1, "Kunden B-Segment lfa1, "Lieferanten A-Segment lfb1, "Lieferanten B-Segment bkorm, "Korrespondenzanforderungen finaa. "Daten zum Sendemedium DATA: save_koart LIKE bkorm-koart, "Hilfsfeld Kontoart save_land1 LIKE kna1-land1, "Hilfsfeld Faxanschluß save_telfx LIKE kna1-telfx, "Hilfsfeld Faxanschluß save_zsabe LIKE knb1-zsabe, "Hilfsfeld Faxanschluß save_intad LIKE knb1-intad. "Hilfsfeld Internet kna1 = i_kna1. lfa1 = i_lfa1. knb1 = i_knb1. lfb1 = i_lfb1. bkorm = i_bkorm. save_koart = i_koart. CLEAR: save_land1, save_telfx, save_zsabe. IF save_koart = 'D'. save_land1 = kna1-land1. save_telfx = knb1-tlfxs. save_zsabe = knb1-zsabe. save_intad = knb1-intad. ELSE. save_land1 = lfa1-land1. save_telfx = lfb1-tlfxs. save_zsabe = lfb1-zsabe. save_intad = lfb1-intad. ENDIF. IF save_intad NE space. finaa-nacha = 'I'. "Email finaa-intad = save_intad. finaa-textf = 'PDF'. * Get some text for email body finaa-MAIL_BODY_TEXT = 'EMAIL_TEXT'. ELSE. finaa-nacha = '1'. "Print ENDIF. * Daten zum Sendemedium merken für Aufrufer c_finaa = finaa. CALL FUNCTION 'FDM_COLL_CORR_PROCESS_00002310' EXPORTING i_bkorm = i_bkorm i_koart = i_koart * I_KNA1 = * I_KNB1 = * I_LFA1 = * I_LFB1 = TABLES t_fimsg = t_fimsg CHANGING c_finaa = c_finaa c_itcpo = c_itcpo * C_ARCHIVE_INDEX = ' ' * C_ARCHIVE_PARAMS = ' ' . ENDFUNCTION. |
[2] Clone the Print Program Include for output RFKORI90
This is a common include for FI correspondence. In the cloned version we need to add in the call to Floe, and pass in data depending on the corresponding type. (An Account Statement needs different data to a Customer Invoice, for example.)
(i) Add subroutine call inside FORM close_internet.
(ii) Add new subroutine call_floe
- Find recipients
- Get attachmentFill Floe variables
- Call Floe
- Handle any error
In this subroutine, add specific fields for different correspondence types into lt_email_item and ls_email_header.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: |
*---------------------------------------------------------------------* * FORM CALL_FLOE * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM call_floe. DATA: lt_vars TYPE TABLE OF /floe/vars_s, lt_vars2 TYPE TABLE OF /floe/vars_s, ls_vars TYPE /floe/vars_s, lt_atts TYPE TABLE OF /floe/att_s, ls_atts TYPE /floe/att_s, lt_recs TYPE TABLE OF /floe/rec_email_s, ls_recs TYPE /floe/rec_email_s, lv_add TYPE string, lv_att TYPE xstring, lv_subrc TYPE sysubrc, BEGIN OF ls_tmp, type LIKE sxaddrtype-addr_type VALUE 'INT', address LIKE soextreci1-receiver, END OF ls_tmp. TYPES: BEGIN OF ty_email_header, company_name TYPE string, email_date TYPE string, contact_name TYPE string, currency TYPE string, pay_amount TYPE string, gross_amount TYPE string, discount TYPE string, pay_date TYPE string, pay_ref TYPE string, ref_num TYPE string, partner_id TYPE string, net_amount TYPE string, tax_amount TYPE string, tax_rate TYPE string, date_from TYPE string, date_to TYPE string, opening_bal TYPE string, closing_bal TYPE string, END OF ty_email_header. DATA: ls_email_header TYPE ty_email_header. TYPES: BEGIN OF ty_email_item. INCLUDE STRUCTURE hsortp. INCLUDE STRUCTURE bseg. TYPES: bldat TYPE bldat, xblnr TYPE xblnr, waers TYPE waers. TYPES: END OF ty_email_item. DATA: lt_email_item TYPE TABLE OF ty_email_item, ls_email_item TYPE ty_email_item, ls_hbkpf TYPE bkpf. * Find recipients lv_add = finaa-intad. WHILE lv_add <> space. WHILE lv_add(1) = space. SHIFT lv_add BY 1 PLACES. ENDWHILE. SPLIT lv_add AT ' ' INTO ls_tmp-address lv_add. CALL FUNCTION 'SX_INTERNET_ADDRESS_TO_NORMAL' EXPORTING address_unstruct = ls_tmp IMPORTING address_normal = ls_tmp EXCEPTIONS error_address = 2 error_group_address = 3. CHECK sy-subrc = 0. ls_recs-email = ls_tmp-address. ls_recs-type = '1'. APPEND ls_recs TO lt_recs. ENDWHILE. * Get attachment IF p_attac IS NOT INITIAL. CALL FUNCTION 'CONVERT_OTF' EXPORTING format = hformat * MAX_LINEWIDTH = 132 IMPORTING bin_filesize = doc_size bin_file = lv_att TABLES otf = hotfdata lines = htline EXCEPTIONS err_max_linewidth = 1 err_format = 2 err_conv_not_possible = 3 OTHERS = 4. IF hdbelgj+0(4) ne '0000'. CONCATENATE hdbelgj '.' hformat INTO ls_atts-att_filename. ls_atts-att_description = hdbelgj. ELSE. CONCATENATE text-204 '.' hformat INTO ls_atts-att_filename. ls_atts-att_description = text-204. ENDIF. ls_atts-att_data = lv_att. APPEND ls_atts TO lt_atts. ENDIF. * Get variables CASE bkorm-event. WHEN 'SAP01'. ls_email_header-email_date = sy-datum. ls_email_header-currency = rf140-waers. ls_email_header-pay_amount = rf140-zalbt. ls_email_header-gross_amount = rf140-brtbt. ls_email_header-discount = rf140-sktbt. ls_email_header-pay_date = bkpf-bldat. ls_email_header-pay_ref = bkpf-belnr. LOOP AT hbseg INTO ls_email_item WHERE belnr NE bkpf-belnr. READ TABLE hbkpf INTO ls_hbkpf WITH KEY bukrs = ls_email_item-bukrs belnr = ls_email_item-belnr gjahr = ls_email_item-gjahr. ls_email_item-bldat = ls_hbkpf-bldat. ls_email_item-xblnr = ls_hbkpf-xblnr. APPEND ls_email_item TO lt_email_item. ENDLOOP. WHEN 'SAP19' OR 'SAP16'. ls_email_header-email_date = sy-datum. ls_email_header-currency = bkpf-waers. ls_email_header-pay_date = bkpf-bldat. ls_email_header-pay_ref = bkpf-belnr. ls_email_header-ref_num = bkpf-xblnr. ls_email_header-partner_id = bsid-kunnr. ls_email_header-gross_amount = rf140-gsaldf. ls_email_header-net_amount = rf140-dmshb. ls_email_header-tax_amount = rf140-mdshb. ls_email_header-tax_rate = rf140-msatz. MOVE-CORRESPONDING bsid TO ls_email_item. APPEND ls_email_item TO lt_email_item. WHEN 'SAP06'. ls_email_header-email_date = sy-datum. ls_email_header-currency = bkpf-waers. ls_email_header-partner_id = bsid-kunnr. ls_email_header-date_from = rf140-datu1. ls_email_header-date_to = rf140-datu2. ls_email_header-opening_bal = hsaldo. ls_email_header-closing_bal = hsaldo2. LOOP AT hbsid. MOVE-CORRESPONDING hbsid TO ls_email_item. APPEND ls_email_item TO lt_email_item. ENDLOOP. LOOP AT hbsad. MOVE-CORRESPONDING hbsad TO ls_email_item. APPEND ls_email_item TO lt_email_item. ENDLOOP. SORT lt_email_item BY bldat belnr. ENDCASE. IF save_koart = 'D'. ls_email_header-company_name = kna1-name1. "Customer ls_email_header-contact_name = knb1-zsabe. "Customer ELSE. ls_email_header-company_name = lfa1-name1. "Vendor ls_email_header-contact_name = lfb1-zsabe. "Vendor ENDIF. IF ls_email_header-contact_name IS INITIAL. ls_email_header-contact_name = ls_email_header-company_name. ENDIF. * CALL METHOD /floe/core=>get_data_from_structure EXPORTING im_structure = ls_email_header IMPORTING ex_vars = lt_vars. CALL METHOD /floe/core=>get_data_from_table EXPORTING im_table = lt_email_item IMPORTING ex_vars = lt_vars2. LOOP AT lt_vars2 INTO ls_vars. APPEND ls_vars TO lt_vars. ENDLOOP. * CALL FUNCTION '/FLOE/EMAIL_OUT' EXPORTING im_etype = p_etype im_elang = language * IM_ESUBJECT_LONG = * IM_DOCUMENT = im_rec_emails = lt_recs im_variables = lt_vars * IM_FORM_DATA = im_attachments = lt_atts im_send_immediately = p_immed * IM_IMPORTANCE = '1' * IM_PREVIEW = * IM_NO_COMMIT = IMPORTING ex_subrc = lv_subrc * EX_MESS = * EX_EBODY = * EX_REC_EMAILS = * EX_ATTACHMENTS = * EX_ESUBJECT_LONG = * EX_EID = . IF lv_subrc EQ 0. CLEAR prot_ausgabe. prot_ausgabe-bukrs = save_bukrs. prot_ausgabe-event = save_event. prot_ausgabe-repid = save_repid. prot_ausgabe-intad = finaa-intad. prot_ausgabe-countp = countp. COLLECT prot_ausgabe. COMMIT WORK. CLEAR commit_c. ENDIF. ENDFORM. "CALL_FLOE |
[3] Clone the print program for the particular correspondence type
In transaction OB78 see the correspondence type link to print program:
Copy the program and make the following changes:
(i) Extend the selection screen
1: 2: 3: 4: 5: 6: 7: 8: |
*----------------------------------------------------------------------- * Floe Selection Parameters *----------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK floe WITH FRAME TITLE text-002. PARAMETERS: p_etype TYPE /floe/etype_code MATCHCODE OBJECT /floe/etype, p_immed AS CHECKBOX, p_attac as checkbox. SELECTION-SCREEN END OF BLOCK floe. |
(ii) Add text elements
(iii) Update program name variable
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: |
*----------------------------------------------------------------------- * Start-of-Selection *----------------------------------------------------------------------- SET BLANK LINES ON. START-OF-SELECTION. save_repid = 'Z_RFKORD00_FLOE'. "<---UPDATE save_event = revent. IF NOT rxbkor IS INITIAL. save_rxbkor = rxbkor. ENDIF. |
(i) Change the INCLUDE file reference
1: 2: 3: 4: 5: 6: 7: 8: 9: |
*----------------------------------------------------------------------- * Allgemeine Unterroutinen *----------------------------------------------------------------------- * Floe integration * * INCLUDE rfkori90. INCLUDE z_rfkori90_floe. *----------------------------------------------------------------------- |
[4] Create a new Email Type in the normal way
[5] Create new variant for the new print program.
Copy the selections from the variant for the current print program and add in the Floe selections
[6] Assign new print program and variant to the correspondence type (OB78)
[7] Copy configuration for sender details from old print program
[7] Copy configuration for output template from old print program
[8] Design your Email template in Floe Email Builder
[9] Generate Email Data User-Exit and add call to function to clean-up the SAP data
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: |
*---------------------------------------------------------------------------* * <<< Start of Customer Code >>> * *---------------------------------------------------------------------------* CALL FUNCTION 'Z_FORMAT_FI_DATA' EXPORTING im_document = im_document im_elang = im_elang CHANGING ch_variables = ch_variables. *---------------------------------------------------------------------------* * <<< End of Customer Code >>> * *---------------------------------------------------------------------------* |
[10] Check clean-up function handles all the fields you need.
Copy from sample code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: |
FUNCTION z_format_fi_data. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(IM_DOCUMENT) TYPE /FLOE/DOC_REF *" VALUE(IM_ELANG) TYPE /FLOE/ELANG *" CHANGING *" VALUE(CH_VARIABLES) TYPE /FLOE/VARS_T *"---------------------------------------------------------------------- DATA: ls_variables TYPE /floe/vars_s, ls_variables2 TYPE /floe/vars_s, lv_qty TYPE i, lv_val TYPE p LENGTH 7 DECIMALS 2, lv_valc TYPE c LENGTH 10, lt_terms TYPE TABLE OF szterm, ls_terms TYPE szterm, lv_date_temp TYPE d, lv_amount_temp TYPE wrbtr, lv_value_c TYPE char50, lt_shkzg TYPE TABLE OF dd07v, ls_shkzg TYPE dd07v. CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'SHKZG' text = 'X' langu = im_elang * BYPASS_BUFFER = ' ' * IMPORTING * RC = TABLES dd07v_tab = lt_shkzg. LOOP AT ch_variables INTO ls_variables. * CASE: ls_variables-var_code. * WHEN 'CURRENCY' OR 'PSWSL' OR 'WAERS'. * Map currency symbol CASE ls_variables-value. WHEN 'USD'. ls_variables-value = '$'. WHEN 'GBP'. ls_variables-value = '£'. WHEN 'EUR'. ls_variables-value = '€'. ENDCASE. MODIFY ch_variables FROM ls_variables. * WHEN 'PAY_DATE' OR 'EMAIL_DATE' OR 'DATE_FROM' OR 'DATE_TO'. * Format dates CALL FUNCTION 'CONV_EXIT_LDATE_OUTPUT_LANGU' EXPORTING input = ls_variables-value * LANGUAGE = SY-LANGU IMPORTING output = ls_variables-value. * REPLACE ALL OCCURRENCES OF '.' IN ls_variables-value WITH ''. MODIFY ch_variables FROM ls_variables. * WHEN 'BLDAT'. lv_date_temp = ls_variables-value. WRITE lv_date_temp TO lv_value_c DD/MM/YYYY. ls_variables-value = lv_value_c. MODIFY ch_variables FROM ls_variables. WHEN 'SHKZG'. READ TABLE lt_shkzg INTO ls_shkzg WITH KEY domvalue_l = ls_variables-value. ls_variables-value = ls_shkzg-ddtext. MODIFY ch_variables FROM ls_variables. WHEN 'PAY_AMOUNT' OR 'GROSS_AMOUNT'. SHIFT ls_variables-value RIGHT DELETING TRAILING '-'. SHIFT ls_variables-value LEFT DELETING LEADING ' '. MODIFY ch_variables FROM ls_variables. WHEN 'OPENING_BAL' OR 'CLOSING_BAL' OR 'WRBTR'. lv_amount_temp = ls_variables-value. WRITE lv_amount_temp TO lv_value_c. ls_variables-value = lv_value_c. MODIFY ch_variables FROM ls_variables. WHEN 'ZTERM'. CALL FUNCTION 'FI_F4_ZTERM' "Only returns description in logon language EXPORTING * I_KOART = ' ' * I_ZTERM = ' ' * I_XSHOW = ' ' * I_ZTYPE = ' ' i_no_popup = 'X' IMPORTING * E_ZTERM = et_zterm = lt_terms EXCEPTIONS nothing_found = 1 OTHERS = 2. READ TABLE lt_terms WITH KEY zterm = ls_variables-value INTO ls_terms. ls_variables-value = ls_terms-ztext. MODIFY ch_variables FROM ls_variables. WHEN 'TAX_RATE'. SHIFT ls_variables-value RIGHT DELETING TRAILING ' '. SHIFT ls_variables-value RIGHT DELETING TRAILING '0'. SHIFT ls_variables-value RIGHT DELETING TRAILING '.'. SHIFT ls_variables-value LEFT DELETING LEADING ' '. MODIFY ch_variables FROM ls_variables. WHEN 'PARTNER_ID'. SHIFT ls_variables-value LEFT DELETING LEADING '0'. MODIFY ch_variables FROM ls_variables. ENDCASE. ENDLOOP. ENDFUNCTION. |
[11] Check business partner has an email address assigned
[12] Test in the normal way
FB12, F.61