Use Floe for FI correspondence

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

See video