Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

about idoc

Former Member
0 Kudos

could any one sent the idoc documentation, and sample programms in idoc,

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi,

Here is the sample IDOC program.

REPORT ZF_IDOC_OUT_CDS_REF_EXP NO STANDARD PAGE HEADING

LINE-SIZE 165

LINE-COUNT 65

MESSAGE-ID ZF_0.

***********************************************************************

*

  • Program Name : ZF_IDOC_OUT_CDS_REF_EXP

  • Title : GM Interface from SAP to CDS Refunds &

  • Expenditures

  • interagency invs

  • Analyst :

  • Developer :

  • Date :

  • Description : Daily Interface of Federal Grant related

  • expenditure and refund transactions to

  • CDS.Only records for Business area

  • implemented on SAP ( begining 7/1 wave 1

  • agencies,begining 10/1 wave 1&2 agencies,

  • begining 1/1/03 wave 1,2,&3 agencies )

  • should be included on the file.

  • Special Instruction: --

*

***********************************************************************

***********************************************************************

  • MODIFICATION LOG

*----


  • Date Correction No. Changed by Description

*----


*

***********************************************************************

*----


  • Constants

*----


constants : c_idoc_type like edidc-idoctp value 'ZCDS_REF_EXP01',

" used for idoc type

c_message_type like edmsg-msgtyp value 'ZCDS_REF_EXP',

" used for message type

c_rcvprn like edidc-rcvprn value 'COPA_BC',

" used for recieving

" port

c_h value 'H', " header segment -

" hdr_ind

c_bmis(4) value 'BMIS', " header segment -

" ag_id

c_7177877901(10) VALUE '7177877901', " header segment -

" trans_ag_ph

C_AFG840M01(9) VALUE 'AFG840M01', " header segment -

" file_lbl

C_P VALUE 'P', " header segment -

" file_typ_cd

C_FILLER VALUE '', " header segment -

" filler

C_COPA(4) VALUE 'COPA', " Financial management

" area

C_CON(3) VALUE 'CON', " Control segment-

" maint-cd

C_T VALUE 'T', " Trailer segment-

" trlr-ind

C_54(2) VALUE '54', " constant for value

" type

C_95(2) VALUE '95', " constant for value

" type

C_66(2) VALUE '66', " constant for value

" type

C_999900(6) VALUE '999900', " Constant for obj.no

C_XX999999(8) value 'XX999999', " constant for funding

" source

C_KG(2) VALUE 'KG', " Constant for document

" type

C_REF(3) VALUE 'REF', " maintnence code 'REF'

C_EXP(3) VALUE 'EXP', " maintnence code 'EXP'

C_ZQ(2) VALUE 'ZQ', " Constant for document

" type

C_VT(2) VALUE 'VT', " Constant for document

" type

C_KR(2) VALUE 'KR', " Constant for document

" type

C_460(3) VALUE '460', " Constant for item

" text

C_461(3) VALUE '461', " Constant for item

" text

C_462(3) VALUE '462', " Constant for item

" text

C_465(3) VALUE '465', " Constant for item

" text

C_470(3) VALUE '470', " Constant for item

" text

C_1300500(7) VALUE '1300500', " Debit G/l acct.no

C_4000200(7) VALUE '4000200', " Credit G/l acct.no

C_4000300(7) VALUE '4000300', " Credit G/l acct.no

C_TCODE LIKE TSTC-TCODE VALUE 'FB50', " Trans.

" code

C_UPDATE VALUE 'S', " Call trans. update

" mode

C_MODE VALUE 'N', " mode for call trans.

C_GROUP LIKE APQI-GROUPID VALUE 'SFB50'," Session

" group id

c_sb(2) value 'SB', " document type in

" BDC

c_s value 'S', " Debit acct.type

c_C0(2) value 'C0', " Tax code

C_P004(4) value 'P004', " payment term for

" pay upon receipt

c_y3(3) value 'Y%3', " constant for acct.

" type

C_HEADER_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISHDR' ,

" header segment name

C_DATA_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISDATA',

" data segment name

C_CONTROL_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISCON',

" control segment name

C_TRAILER_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISTRLR',

" trailer segment name

c_x value 'X', " To manipulate flag

c_success type i value 1, " Success Report

c_failure type i value 2, " Failure Report

c_1 value '1', " outbound

" indicator

c_orp(3) value 'OR%', " constant for

" object number

c_50p(3) value '50%', " constant for fund

c_70p(3) value '70%', " constant for fund

c_80p(3) value '80%', " constant for fund

c_54P(3) value '54%', " constant for

" value type

c_66P(3) value '66%', " constant for

" value type

c_95P(3) value '95%', " constant for

" value type

c_and(1) value '&'.

*----


  • Table Declarations

*----


tables : fmifiit, " FI Line Item Table in Funds Management

bkpf, " Accounting Document Header

aufk, " Order master data

edp13. " Partner Profile: Outbound (technical

" parameters)

*----


  • Variables

*----


data : v_total_records type i, " total number of records

v_total_refs type i, " total number of refund

" records

v_total_exps type i, " total number of

" expenditure records

v_total_exp_trbtr type p, " total refund

v_total_ref_trbtr type p, " total expenditure

v_date like sy-datum,

V_MESSTXT(99) TYPE C, " messasge text

v_line type i, " For line number

v_amount LIKE FMIFIIT-trbtr , " For summing amounts

v_cost_center like zfi_t_vfc-zfcrf," cost center

v_mm(2), " to store Month

v_dd(2), " to store Day

v_yy(2), " to store year

v_mmddyy(6), " date in MMDDYY format

v_acc_number(7), " Account number

v_lines type i, " Line number in error tab

v_trbtr(15),

v_zterm like lfb1-zterm, " Payment terms

v_currency like fmifiit-twaer,

v_title like sy-lisel, " Report Title

v_top_amount(14), " field to be passed to

" Fun.Mod which converts

" from lEGACY TO LOCAL DATA

v_linc(4),

v_amountc(13).

*----


  • Flags

*----


data : f_delete, " to delete record from it_bkpf_fmifiit

f_color, " Flag for color swap

f_flag type i, " Flag to set report title in

f_group . " to indicate batch input session is open

*----


  • Internal Tables

*----


  • structures to be filled with segment data

data : X_Z1BMISHDR like Z1BMISHDR,

X_Z1BMISDATA like Z1BMISDATA,

X_Z1BMISCON like Z1BMISCON,

X_Z1BMISTRLR like Z1BMISTRLR.

  • to hold data from bkpf and fmifiit tables

data : begin of i_bkpf_fmifiit occurs 0,

int_order(12) type c, " internal order number

fonds like fmifiit-fonds, " Fund

fmbelnr like fmifiit-fmbelnr, " Document number for a

" TR-FM line item

KNBELNR like fmifiit-KNBELNR, " FI document number

bus_area like fmifiit-bus_area, " Business Area

objnrz like fmifiit-objnrz, " Object number

wrttp like fmifiit-wrttp, " Value type

trbtr like fmifiit-trbtr, " Amount in trans.

" currency

sgtxt like fmifiit-sgtxt, " Item Text

twaer like fmifiit-twaer,

blart like bkpf-blart, " Document type

auart like aufk-auart, " Order Type

budat like bkpf-budat, " Posting date

bldat like bkpf-bldat, " Document date

end of i_bkpf_fmifiit.

  • for program messages

data : begin of i_prog_msg occurs 0,

pmsg1(50),

pmsg2(50),

end of i_prog_msg.

  • control record for IDOC

data : i_edidd like edidd occurs 0 with header line.

  • Data Record for IDOC

data : begin of i_edidc occurs 1.

include structure edidc.

data : end of i_edidc.

  • Status record for IDOC

data : begin of i_edidc_comm occurs 1.

include structure edidc.

data : end of i_edidc_comm.

  • Batch inputdata of single transaction

DATA: I_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.

  • messages of call transaction

DATA: I_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.

*Internal table to store error records

DATA : BEGIN OF I_ERROR_RECORDS OCCURS 0,

line(4), "(internal)inventory-managed material

PMSG(30), " program Error Message

SMSG(80), " system error message

END OF I_ERROR_RECORDS.

*Internal table to store success records

DATA : BEGIN OF I_success_RECORDS OCCURS 0,

document_no(10), " document no

int_order(12), " internal order number

fonds(20), " fund

END OF I_success_RECORDS.

data : x_bkpf_fmifiit like i_bkpf_fmifiit.

*----


  • Selection-screen

*----


selection-screen : begin of block blk with frame title text-001.

selection-screen skip 1.

select-options : s_b_area for fmifiit-bus_area.

select-options : s_budat for bkpf-budat default sy-datum.

selection-screen : end of block blk.

**----


    • At selection-screen

**----


AT SELECTION-SCREEN.

perform fill_i_bkpf_fmifiit.

if not i_bkpf_fmifiit[] is initial.

perform delete_i_bkpf_fmifiit.

endif.

  • find number of records

describe table i_bkpf_fmifiit lines v_total_records.

if v_total_records = 0.

message e000 with 'No records exist'(014).

endif.

*endif.

**----


    • Start-of-selection

**----


START-OF-SELECTION.

  • populate control record

perform fill_control_record.

  • populate header segment

perform build_header_segment.

  • populate data segment

perform build_data_segment.

  • populate control segment

perform build_control_segment.

  • populate trailer segment

perform build_trailer_segment.

  • create idoc

perform create_idocs.

  • perform bdc for transaction fb50

perform bdc_fb50.

**----


    • End-of-selection

**----


End-of-selection.

perform error_messages.

perform sucess_messages.

***********************************************************************

  • Top-Of-Page

***********************************************************************

Top-Of-Page.

  • Display the Standard Heading

PERFORM TOP_OF_PAGE.

&----


*& Form fill_it_bkpf_fmifiit

&----


  • subroutine to fill internal table it_bkpf_fmifiit

----


FORM fill_i_bkpf_fmifiit.

select fmifiit~fmbelnr

fmifiit~knbelnr

fmifiit~bus_area

fmifiit~objnrz

fmifiit~fonds

fmifiit~wrttp

fmifiit~trbtr

fmifiit~sgtxt

fmifiit~twaer

bkpf~budat

bkpf~blart

bkpf~bldat

into corresponding fields of table i_bkpf_fmifiit

from bkpf

join fmifiit

on bkpfbelnr = fmifiitknbelnr

where fmifiit~bus_area in s_b_area

and bkpf~budat in s_budat

and fmifiit~objnrz like c_orp

and ( fmifiitfonds like c_50p or fmifiitfonds like c_70p or

fmifiit~fonds like c_80p )

and ( fmifiitwrttp like c_54p or fmifiitwrttp like c_66p or

fmifiit~wrttp like c_95p ) .

ENDFORM. " fill_i_bkpf_fmifiit

&----


*& Form delete_it_bkpf_fmifiit

&----


  • subroutine to delete unwnated records from it_bkpf_fmifiit

----


FORM delete_i_bkpf_fmifiit.

  • delete records which have object number 9-14 as 999900

  • or object number third character is not alphabet

delete i_bkpf_fmifiit

where objnrz+2(1) NA sy-abcde

or objnrz+8(6) EQ c_999900.

loop at i_bkpf_fmifiit.

  • deletion indicator flag

clear f_delete.

  • find internal order number

i_bkpf_fmifiit-int_order = i_bkpf_fmifiit-objnrz+2(12).

  • select order type , funding source from aufk

select AUART zzfsc from aufk

into (aufk-auart , aufk-zzfsc)

up to 1 rows

where AUFNR = i_bkpf_fmifiit-int_order.

endselect.

if sy-subrc = 0.

  • delete the record if funding source is XX999999

if aufk-zzfsc CO C_XX999999.

delete i_bkpf_fmifiit.

f_delete = C_X.

endif.

endif.

if f_delete is initial.

  • modify the order type value with value from previous select

i_bkpf_fmifiit-auart = aufk-auart.

v_top_amount = i_bkpf_fmifiit-trbtr.

  • set amount field using over punch logic

CALL FUNCTION 'Z_SIGNED_NUMBER_CONV'

EXPORTING

GROSS_AMT = v_top_amount

IMPORTING

CONV_AMT = v_top_amount

EXCEPTIONS

INPUT_ERR = 1

WRONG_CHAR = 2

OTHERS = 3

.

  • IF SY-SUBRC <> 0.

  • * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  • ENDIF.

i_bkpf_fmifiit-trbtr = v_top_amount.

modify i_bkpf_fmifiit.

endif.

endloop.

ENDFORM. " delete_i_bkpf_fmifiit

&----


*& Form fill_control_record

&----


  • build outbound control information

----


FORM fill_control_record.

  • select control information from edp13

select * from edp13 into edp13

up to 1 rows

where mestyp eq c_message_type

and rcvprn = c_rcvprn

and idoctyp = c_idoc_type.

endselect.

i_edidc-direct = C_1. "Outbound

i_edidc-outmod = edp13-outmod. "Collective processing

i_edidc-rcvprn = edp13-rcvprn. "Partner number of receiver

i_edidc-rcvpor = edp13-rcvpor. "Receiver port

i_edidc-rcvprt = edp13-rcvprt. "Partner type of receiver

i_edidc-rcvpfc = edp13-rcvpfc. "Partner function of recipient

i_edidc-mestyp = edp13-mestyp. "Message type

i_edidc-mescod = edp13-mescod. "Message code

i_edidc-mesfct = edp13-mesfct. "Message function

i_edidc-test = edp13-test. "Test flag

i_edidc-idoctp = edp13-idoctyp. "Idoc Type

i_edidc-cimtyp = edp13-cimtyp. "Extension to Basic type

i_edidc-std = edp13-std. "EDI standard

i_edidc-stdvrs = edp13-stdvrs. "Version of EDI standard

i_edidc-stdmes = edp13-stdmes. "EDI message type

append i_edidc.

ENDFORM. " fill_control_record

&----


*& Form build_header_segment

&----


  • subroutine to build zibmishdr segment

----


FORM build_header_segment.

*header segment

X_Z1BMISHDR-hdr_ind = C_H.

X_Z1BMISHDR-ag_id = c_bmis.

X_Z1BMISHDR-trns_ag_ph = c_7177877901.

X_Z1BMISHDR-file_lbl = C_AFG840M01.

X_Z1BMISHDR-file_typ_cd = C_P.

X_Z1BMISHDR-creat_date = sy-datum. " format ccyymmdd

X_Z1BMISHDR-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_HEADER_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISHDR.

append i_edidd.

clear i_edidd.

ENDFORM. " build_header_segment

&----


*& Form build_data_segment

&----


  • subroutine to build zibmisdata segment

----


FORM build_data_segment.

*main data segment

clear v_total_refs.

clear v_total_exps.

loop at i_bkpf_fmifiit.

  • if document type is KG(Vendor Credit Memo)

if i_bkpf_fmifiit-blart = C_KG.

X_Z1BMISDATA-maint_code = C_REF.

v_total_refs = v_total_refs + 1.

  • if document type is ZQ(Agencies not yet in SAP)

elseif i_bkpf_fmifiit-blart = C_ZQ .

if i_bkpf_fmifiit-sgtxt = c_460 or

i_bkpf_fmifiit-sgtxt = c_461 or

i_bkpf_fmifiit-sgtxt = c_462 or

i_bkpf_fmifiit-sgtxt = c_465 or

i_bkpf_fmifiit-sgtxt = c_470.

delete i_bkpf_fmifiit.

continue.

endif.

  • if document type is VT(Transfer posting)

elseif i_bkpf_fmifiit-blart = C_VT .

if i_bkpf_fmifiit-wrttp = C_66.

X_Z1BMISDATA-maint_code = C_EXP.

v_total_exps = v_total_exps + 1.

endif.

  • if document type is neither KG or ZQ

else .

if i_bkpf_fmifiit-wrttp = C_66 or i_bkpf_fmifiit-wrttp = C_95.

X_Z1BMISDATA-maint_code = C_REF.

v_total_refs = v_total_refs + 1.

endif.

if i_bkpf_fmifiit-wrttp = C_54 .

X_Z1BMISDATA-maint_code = C_EXP.

v_total_exps = v_total_exps + 1.

endif.

endif.

  • select grant department from cross walk table

  • zfi_t_busareacw

select ZDEPT from zfi_t_busareacw

into X_Z1BMISDATA-grant_dep

up to 1 rows

where GSBER = i_bkpf_fmifiit-bus_area.

endselect.

  • Assign internal order 2-6 char to grant number

X_Z1BMISDATA-grant_no = i_bkpf_fmifiit-int_order+1(5).

  • select fund type from fincode

select single type from FMFINCODE

into X_Z1BMISDATA-fund

where FIKRS = C_COPA

and FINCODE = i_bkpf_fmifiit-fonds.

  • depparment is same as grnat department

X_Z1BMISDATA-dept = X_Z1BMISDATA-grant_dep.

  • appropriarion is fonds 3-5 characters

X_Z1BMISDATA-approp = i_bkpf_fmifiit-fonds+2(3).

  • Year is fonds 6-7 characters

X_Z1BMISDATA-year = i_bkpf_fmifiit-fonds+5(2).

  • Ledger is fonds first character

X_Z1BMISDATA-ledger = i_bkpf_fmifiit-fonds+0(1).

  • document id is assigned with the SAP FI document number

X_Z1BMISDATA-doc_id = i_bkpf_fmifiit-knbelnr.

  • ICS posting date is assigned with SAP posting date

v_date = i_bkpf_fmifiit-budat.

v_mm = v_date+4(2).

v_dd = v_date+6(2).

v_yy = v_date+2(2).

concatenate v_mm v_dd v_yy into v_mmddyy.

X_Z1BMISDATA-ics_post_date = v_mmddyy.

  • if document type is KR , then ics posting date is

  • modified based on the payment terms

if i_bkpf_fmifiit-blart = C_KR.

select lfb1~ZTERM

into v_zterm

up to 1 rows

from FMIFIHD

join lfb1

on FMIFIHDlifnr = lfb1lifnr

where FMIFIHD~fmbelnr = i_bkpf_fmifiit-FMBELNR.

endselect.

if v_zterm NE C_P004.

v_zterm = v_zterm+1(2).

X_Z1BMISDATA-ics_post_date = i_bkpf_fmifiit-bldat + v_zterm.

endif.

endif.

X_Z1BMISDATA-amount = i_bkpf_fmifiit-trbtr.

  • find cuureny type and assign to v_currency

if v_currency is initial.

v_currency = i_bkpf_fmifiit-twaer.

endif.

  • find total expenditure amount

if X_Z1BMISDATA-maint_code = C_EXP.

v_total_exp_trbtr = v_total_exp_trbtr + X_Z1BMISDATA-amount.

  • find total refund amount

elseif X_Z1BMISDATA-maint_code = C_REF.

v_total_ref_trbtr = v_total_ref_trbtr + X_Z1BMISDATA-amount.

endif.

  • fill with blanks

X_Z1BMISDATA-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_DATA_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISDATA.

append i_edidd.

clear i_edidd.

clear X_Z1BMISDATA.

endloop.

ENDFORM. " build_data_segment

&----


*& Form build_control_segment

&----


  • subroutine to build zibmiscon segment

----


FORM build_control_segment.

  • control segment

X_Z1BMISCON-maint_cd = C_CON.

  • assign total maintence records for expenditure

X_Z1BMISCON-tot_exp_no = v_total_exps.

  • assign total expenditure amount

X_Z1BMISCON-tot_exp_amt = v_total_exp_trbtr.

  • assign total maintence records for refund

X_Z1BMISCON-tot_ref_no = v_total_refs.

  • assign total refund amount

X_Z1BMISCON-tot_ref_amt = v_total_ref_trbtr.

v_date = sy-datum.

  • extract month from present date

X_Z1BMISCON-postdat_mm = v_date+4(2).

  • extract day from present date

X_Z1BMISCON-postdat_dd = v_date+6(2).

  • extract year from present date

X_Z1BMISCON-postdat_yy = v_date+2(2).

  • fiill with blanks

X_Z1BMISCON-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_CONTROL_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISCON.

append i_edidd.

clear i_edidd.

ENDFORM. " build_control_segment

&----


*& Form build_trailer_segment

&----


  • subroutine to build zibmistrlr segment

----


FORM build_trailer_segment.

  • trailer segment

X_Z1BMISTRLR-trlr_ind = C_T.

X_Z1BMISTRLR-ag_id = C_BMIS.

X_Z1BMISTRLR-file_lbl = C_AFG840M01.

  • assign total data segment records

X_Z1BMISTRLR-file_tot_recs = v_total_records.

X_Z1BMISTRLR-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_TRAILER_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISTRLR.

append i_edidd.

clear i_edidd.

ENDFORM. " build_trailer_segment

&----


*& Form create_idocs

&----


  • subroutine which creates IDOC document

----


FORM create_idocs.

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'

EXPORTING

MASTER_IDOC_CONTROL = i_edidc

TABLES

COMMUNICATION_IDOC_CONTROL = i_edidc_comm

MASTER_IDOC_DATA = i_edidd

EXCEPTIONS

ERROR_IN_IDOC_CONTROL = 1

ERROR_WRITING_IDOC_STATUS = 2

ERROR_IN_IDOC_DATA = 3

SENDING_LOGICAL_SYSTEM_UNKNOWN = 4

OTHERS = 5

.

ENDFORM. " create_idocs

&----


*& Form bdc_fb50

&----


  • subroutine to call transaction fb50

----


FORM bdc_fb50.

  • sort the internal table by internal order and fund

sort i_bkpf_fmifiit by int_order fonds.

clear i_bkpf_fmifiit.

loop at i_bkpf_fmifiit.

clear x_bkpf_fmifiit.

X_bkpf_fmifiit = i_bkpf_fmifiit.

  • when a new fonds occurs sum

at new fonds.

sum.

v_amount = i_bkpf_fmifiit-trbtr.

i_bkpf_fmifiit = x_bkpf_fmifiit.

i_bkpf_fmifiit-trbtr = v_amount.

if v_amount is initial.

clear i_prog_msg-pmsg1.

i_prog_msg-pmsg1 = 'Record not created for internal order and

fund'(018).

concatenate i_bkpf_fmifiit-int_order space

c_and

i_bkpf_fmifiit-fonds

' as amount is zero '(019) into i_prog_msg-pmsg2

separated by space.

append i_prog_msg.

clear i_prog_msg.

delete i_bkpf_fmifiit

where int_order = i_bkpf_fmifiit-int_order

and fonds = i_bkpf_fmifiit-fonds.

else.

modify i_bkpf_fmifiit.

endif.

endat.

endloop.

  • delete the duplicates as we have already summed up them

delete adjacent duplicates from i_bkpf_fmifiit

comparing int_order fonds.

  • fill bdcdata internal table

perform fill_bdc_tab.

ENDFORM. " call_bdc_fb50

&----


*& Form fill_bdc_tab

&----


  • subroutine to fill bdcdata

----


form fill_bdc_tab.

clear i_bkpf_fmifiit.

loop at i_bkpf_fmifiit.

refresh i_bdcdata.

clear i_bdcdata.

perform bdc_dynpro using 'SAPMF05A' '1001'.

perform bdc_field using 'BDC_OKCODE'

'=BU'.

  • change the date format into ddmmyyyy

concatenate i_bkpf_fmifiit-Bldat+6(2)

i_bkpf_fmifiit-Bldat+4(2)

i_bkpf_fmifiit-Bldat+0(4)

into v_date.

  • fill bdcdata with document date

perform bdc_field using 'ACGL_HEAD-BLDAT'

v_date.

clear v_date.

  • fill bdcdata with currency type

perform bdc_field using 'ACGL_HEAD-WAERS'

i_bkpf_fmifiit-twaer.

concatenate i_bkpf_fmifiit-Budat+6(2)

i_bkpf_fmifiit-Budat+4(2)

i_bkpf_fmifiit-Budat+0(4)

into v_date.

  • fill bdcdata with posting date

perform bdc_field using 'ACGL_HEAD-BUDAT'

v_date.

clear v_date.

  • fill bdcdata with document type

perform bdc_field using 'ACGL_HEAD-BLART'

C_SB.

  • if order type starts with Y and end with 3 then account number

  • is 4000300 else 4000200

if i_bkpf_fmifiit-auart EQ C_Y3.

v_acc_number = C_4000300.

else.

v_acc_number = C_4000200.

endif.

  • fill bdcdata with g/l acct.num

perform bdc_field using 'ACGL_ITEM-HKONT(01)'

v_acc_number.

  • fill bdcdata with account type

perform bdc_field using 'ACGL_ITEM-SHKZG(01)'

c_h.

  • take off sign from amount

clear v_amount .

V_AMOUNT = ABS( i_bkpf_fmifiit-TRBTR ).

v_amountc = v_amount.

  • v_amount = abs( i_bkpf_fmifiit-TRBTR ).

  • write i_bkpf_fmifiit-TRBTR to v_amount no-sign.

  • fill bdcdata with amount

perform bdc_field using 'ACGL_ITEM-WRBTR(01)'

v_amountc.

  • fill bdcdata with taxcode

perform bdc_field using 'ACGL_ITEM-MWSKZ(01)'

c_C0.

  • select cost center from zfi_t_vfc

select zfcrf from zfi_t_vfc

into v_cost_center

up to 1 rows

where zzaufnr = i_bkpf_fmifiit-int_order.

endselect.

  • fill bdcdata with cost centre

perform bdc_field using 'ACGL_ITEM-KOSTL(01)'

v_cost_center.

  • fill bdcdata with int. order

perform bdc_field using 'ACGL_ITEM-AUFNR(01)'

i_bkpf_fmifiit-int_order.

  • fill bdcdata with fund

perform bdc_field using 'ACGL_ITEM-GEBER(01)'

i_bkpf_fmifiit-fonds.

  • fill bdcdata with data for debit account

V_acc_number = C_1300500.

  • fill bdcdata with g/l acct.num

perform bdc_field using 'ACGL_ITEM-HKONT(02)'

V_acc_number.

  • fill bdcdata with acct. type

perform bdc_field using 'ACGL_ITEM-SHKZG(02)'

c_S.

  • fill bdcdata with amount

perform bdc_field using 'ACGL_ITEM-WRBTR(02)'

v_amountc.

  • call transaction

perform bdc_transaction.

endloop.

endform.

&----


*& Form BDC_DYNPRO

&----


  • subroutine to start new screen

----


FORM BDC_DYNPRO USING PROGRAM DYNPRO.

CLEAR I_BDCDATA.

I_BDCDATA-PROGRAM = PROGRAM.

I_BDCDATA-DYNPRO = DYNPRO.

I_BDCDATA-DYNBEGIN = C_X.

APPEND I_BDCDATA.

clear i_bdcdata.

ENDFORM.

&----


*& Form BDC_FIELD

&----


  • subroutine to insert a field

----


FORM BDC_FIELD USING FNAM FVAL type any.

IF NOT FVAL IS INITIAL.

CLEAR I_BDCDATA.

I_BDCDATA-FNAM = FNAM.

I_BDCDATA-FVAL = FVAL.

APPEND I_BDCDATA.

clear i_bdcdata.

ENDIF.

ENDFORM.

&----


*& Form BDC_DYNPRO

&----


  • subroutine to start new transaction

----


FORM BDC_TRANSACTION .

REFRESH I_MESSTAB.

clear i_messtab.

CALL TRANSACTION C_TCODE USING I_BDCDATA

MODE C_MODE

UPDATE C_UPDATE

MESSAGES INTO I_MESSTAB.

  • if call transaction fails

IF SY-SUBRC <> 0.

  • find no.of lines in message table

DESCRIBE TABLE I_MESStab LINES v_LINES.

  • read the lasr message from table

READ TABLE I_MESStab INDEX v_LINES.

*-- Format the error message

PERFORM FORMAT_MESSAGE.

*-- Appending the error records into error table

v_line = v_line + 1.

I_ERROR_RECORDS-line = v_line.

I_ERROR_RECORDS-SMSG = V_MESSTXT.

APPEND I_ERROR_RECORDS.

CLEAR I_ERROR_RECORDS.

  • create new session

if f_group is initial.

clear v_date.

v_date = sy-datum - 1.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING CLIENT = SY-MANDT

GROUP = C_GROUP

USER = SY-uname

KEEP = 'X'

HOLDDATE = v_date

EXCEPTIONS

CLIENT_INVALID = 1

DESTINATION_INVALID = 2

GROUP_INVALID = 3

GROUP_IS_LOCKED = 4

HOLDDATE_INVALID = 5

INTERNAL_ERROR = 6

QUEUE_ERROR = 7

RUNNING = 8

SYSTEM_LOCK_ERROR = 9

USER_INVALID = 10

OTHERS = 11.

clear v_date.

  • if session created, set the flag f_group

if sy-subrc = 0.

f_group = C_X.

endif.

ENDIF.

if not f_group is initial.

CALL FUNCTION 'BDC_INSERT'

EXPORTING TCODE = C_TCODE

TABLES DYNPROTAB = I_BDCDATA.

endif.

REFRESH i_BDCDATA.

clear i_BDCDATA.

else.

  • find no.of lines in message table

DESCRIBE TABLE I_MESStab LINES v_LINES.

  • read the last message

READ TABLE I_MESStab INDEX v_LINES.

  • format the message

PERFORM FORMAT_MESSAGE.

  • extract document no. from formatted message

I_success_RECORDS-document_no = V_MESSTXT+9(10).

  • assign the internal order number

I_success_RECORDS-int_order = i_bkpf_fmifiit-int_order.

  • assign the fund

I_success_RECORDS-fonds = i_bkpf_fmifiit-fonds.

  • append records to success messages

APPEND I_success_RECORDS.

CLEAR I_success_RECORDS.

ENDIF.

ENDFORM.

&----


*& Form 09 FORMAT_MESSAGE

&----


----


  • This subroutine is used to format the error message

----


FORM FORMAT_MESSAGE.

CLEAR V_MESSTXT.

CALL FUNCTION 'FORMAT_MESSAGE'

EXPORTING

ID = SY-MSGID

LANG = 'E'

NO = I_MESSTAB-MSGNR

V1 = I_MESSTAB-MSGV1

V2 = I_MESSTAB-MSGV2

V3 = I_MESSTAB-MSGV3

V4 = I_MESSTAB-MSGV4

iMPORTING

MSG = V_MESSTXT.

ENDFORM. " FORMAT_MESSAGE

&----


*& Form sucess_messages

&----


  • subroutine to print sucess full messages

----


form sucess_messages.

f_flag = c_success.

  • start a new page

new-page.

ULINE.

  • change the color to col_normal

format color col_normal intensified on.

write : /01 sy-vline.

write : 02 'Total Maintenance Records for Expenditure'(006),

v_total_exps.

write : 165(01) sy-vline.

format color col_normal intensified off.

write : /01 sy-vline.

write : 02 'Total Amount for Expenditure '(007),v_total_exp_trbtr

currency v_currency, v_currency .

write : 165(01) sy-vline.

format color col_normal intensified on.

write : /01 sy-vline.

write : 02 'Total Maintenance Records for Refunds '(008),

v_total_refs.

write : 165(01) sy-vline.

format color col_normal intensified off.

write : /01 sy-vline.

write : 02 'Total Amount for Refunds '(009), v_total_ref_trbtr

currency v_currency, v_currency .

write : 165(01) sy-vline.

uline.

skip.

  • if there are any successful records

if not I_success_RECORDS[] is initial.

FORMAT COLOR COL_heading .

write /01(90) sy-uline.

WRITE :/1(01) SY-VLINE,

02(29) 'Document No'(010) ,

31(01) SY-VLINE,

32(29) 'Internal order'(011) ,

61(01) sy-vline,

62(28) 'Fund'(012),

90(01) sy-vline.

FORMAT COLOR off.

endif.

  • loop at sucessfull records messages

LOOP AT I_success_RECORDS.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-vLINE,

02(29) I_success_RECORDS-document_no ,

31(01) SY-VLINE,

32(29) I_success_RECORDS-int_order ,

61(01) sy-vline,

62(28) I_success_RECORDS-fonds,

90(01) sy-vline.

ENDLOOP.

if not I_success_RECORDS[] is initial.

write /01(90) sy-uline.

endif.

endform.

&----


*& Form error_messages

&----


  • subroutine to print error messages

----


form error_messages.

  • if there are any error records

IF NOT I_ERROR_RECORDS[] IS INITIAL.

f_flag = c_failure.

FORMAT COLOR COL_HEADING.

WRITE :/1(01) SY-VLINE,

02(10) 'Line .No'(003),

12(01) SY-VLINE,

13(51) 'Reason For Failure'(004),

64(01) sy-vline,

65(100) 'SAP Message'(005) ,

165(01) sy-vline.

FORMAT COLOR OFF.

  • loop at error records messages

LOOP AT I_ERROR_RECORDS.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-VLINE,

02(10) I_ERROR_RECORDS-line,

12(01) SY-VLINE,

13(51) I_ERROR_RECORDS-PMSG,

64(01) sy-vline,

65(100) I_ERROR_RECORDS-SMSG ,

165(01) sy-vline.

ENDLOOP.

if not I_prog_msg[] is initial.

DESCRIBE TABLE I_ERROR_RECORDS LINES v_LINES.

  • loop at program messages

LOOP AT I_prog_msg.

v_lines = v_lines + 1.

PERFORM COLOR_SWAP.

v_linc = v_lines.

WRITE :/1(01) SY-VLINE,

02(10) v_linc,

12(01) SY-VLINE,

13(51) I_prog_msg-PMSG1,

64(01) sy-vline,

65(100) space,

165(01) sy-vline.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-VLINE,

02(10) space,

12(01) SY-VLINE,

13(51) I_prog_msg-PMSG2,

64(01) sy-vline,

65(100) space,

165(01) sy-vline.

ENDLOOP.

endif.

endif.

IF NOT I_ERROR_RECORDS[] IS INITIAL.

uline.

endif.

endform.

&----


*& Form TOP_OF_PAGE

&----


  • Description : For Standard Top of Page

----


FORM TOP_OF_PAGE.

IF F_FLAG = C_SUCCESS.

V_TITLE = 'Success Records'(013).

ELSEIF F_FLAG = C_FAILURE.

V_TITLE = 'Error Records'(002).

ENDIF.

CALL FUNCTION 'Z_STANDARD_HEADER'

EXPORTING

ZTYPE = C_H

TITLE2 = 'GM Interface from SAP to CDS Refunds &

Expenditures'(015)

TITLE3 = V_TITLE.

IF SY-SUBRC <> 0.

  • MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " TOP_OF_PAGE

&----


*& Form COLOR_SWAP

&----


  • Description : To Swap the display colour.

----


FORM COLOR_SWAP.

  • if flag is set

if f_color eq c_x.

clear f_color.

  • switch off the intensity

format color col_normal intensified off.

else.

  • if flag is not set.

f_color = c_x.

  • switch on the intensity

format color col_normal intensified on.

endif.

ENDFORM. " COLOR_SWAP

Hope it works.Reward points if it is helpful.

Regards

Suresh

1 REPLY 1

Former Member
0 Kudos

Hi,

Here is the sample IDOC program.

REPORT ZF_IDOC_OUT_CDS_REF_EXP NO STANDARD PAGE HEADING

LINE-SIZE 165

LINE-COUNT 65

MESSAGE-ID ZF_0.

***********************************************************************

*

  • Program Name : ZF_IDOC_OUT_CDS_REF_EXP

  • Title : GM Interface from SAP to CDS Refunds &

  • Expenditures

  • interagency invs

  • Analyst :

  • Developer :

  • Date :

  • Description : Daily Interface of Federal Grant related

  • expenditure and refund transactions to

  • CDS.Only records for Business area

  • implemented on SAP ( begining 7/1 wave 1

  • agencies,begining 10/1 wave 1&2 agencies,

  • begining 1/1/03 wave 1,2,&3 agencies )

  • should be included on the file.

  • Special Instruction: --

*

***********************************************************************

***********************************************************************

  • MODIFICATION LOG

*----


  • Date Correction No. Changed by Description

*----


*

***********************************************************************

*----


  • Constants

*----


constants : c_idoc_type like edidc-idoctp value 'ZCDS_REF_EXP01',

" used for idoc type

c_message_type like edmsg-msgtyp value 'ZCDS_REF_EXP',

" used for message type

c_rcvprn like edidc-rcvprn value 'COPA_BC',

" used for recieving

" port

c_h value 'H', " header segment -

" hdr_ind

c_bmis(4) value 'BMIS', " header segment -

" ag_id

c_7177877901(10) VALUE '7177877901', " header segment -

" trans_ag_ph

C_AFG840M01(9) VALUE 'AFG840M01', " header segment -

" file_lbl

C_P VALUE 'P', " header segment -

" file_typ_cd

C_FILLER VALUE '', " header segment -

" filler

C_COPA(4) VALUE 'COPA', " Financial management

" area

C_CON(3) VALUE 'CON', " Control segment-

" maint-cd

C_T VALUE 'T', " Trailer segment-

" trlr-ind

C_54(2) VALUE '54', " constant for value

" type

C_95(2) VALUE '95', " constant for value

" type

C_66(2) VALUE '66', " constant for value

" type

C_999900(6) VALUE '999900', " Constant for obj.no

C_XX999999(8) value 'XX999999', " constant for funding

" source

C_KG(2) VALUE 'KG', " Constant for document

" type

C_REF(3) VALUE 'REF', " maintnence code 'REF'

C_EXP(3) VALUE 'EXP', " maintnence code 'EXP'

C_ZQ(2) VALUE 'ZQ', " Constant for document

" type

C_VT(2) VALUE 'VT', " Constant for document

" type

C_KR(2) VALUE 'KR', " Constant for document

" type

C_460(3) VALUE '460', " Constant for item

" text

C_461(3) VALUE '461', " Constant for item

" text

C_462(3) VALUE '462', " Constant for item

" text

C_465(3) VALUE '465', " Constant for item

" text

C_470(3) VALUE '470', " Constant for item

" text

C_1300500(7) VALUE '1300500', " Debit G/l acct.no

C_4000200(7) VALUE '4000200', " Credit G/l acct.no

C_4000300(7) VALUE '4000300', " Credit G/l acct.no

C_TCODE LIKE TSTC-TCODE VALUE 'FB50', " Trans.

" code

C_UPDATE VALUE 'S', " Call trans. update

" mode

C_MODE VALUE 'N', " mode for call trans.

C_GROUP LIKE APQI-GROUPID VALUE 'SFB50'," Session

" group id

c_sb(2) value 'SB', " document type in

" BDC

c_s value 'S', " Debit acct.type

c_C0(2) value 'C0', " Tax code

C_P004(4) value 'P004', " payment term for

" pay upon receipt

c_y3(3) value 'Y%3', " constant for acct.

" type

C_HEADER_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISHDR' ,

" header segment name

C_DATA_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISDATA',

" data segment name

C_CONTROL_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISCON',

" control segment name

C_TRAILER_SEGMENT LIKE EDIDD-SEGNAM VALUE 'Z1BMISTRLR',

" trailer segment name

c_x value 'X', " To manipulate flag

c_success type i value 1, " Success Report

c_failure type i value 2, " Failure Report

c_1 value '1', " outbound

" indicator

c_orp(3) value 'OR%', " constant for

" object number

c_50p(3) value '50%', " constant for fund

c_70p(3) value '70%', " constant for fund

c_80p(3) value '80%', " constant for fund

c_54P(3) value '54%', " constant for

" value type

c_66P(3) value '66%', " constant for

" value type

c_95P(3) value '95%', " constant for

" value type

c_and(1) value '&'.

*----


  • Table Declarations

*----


tables : fmifiit, " FI Line Item Table in Funds Management

bkpf, " Accounting Document Header

aufk, " Order master data

edp13. " Partner Profile: Outbound (technical

" parameters)

*----


  • Variables

*----


data : v_total_records type i, " total number of records

v_total_refs type i, " total number of refund

" records

v_total_exps type i, " total number of

" expenditure records

v_total_exp_trbtr type p, " total refund

v_total_ref_trbtr type p, " total expenditure

v_date like sy-datum,

V_MESSTXT(99) TYPE C, " messasge text

v_line type i, " For line number

v_amount LIKE FMIFIIT-trbtr , " For summing amounts

v_cost_center like zfi_t_vfc-zfcrf," cost center

v_mm(2), " to store Month

v_dd(2), " to store Day

v_yy(2), " to store year

v_mmddyy(6), " date in MMDDYY format

v_acc_number(7), " Account number

v_lines type i, " Line number in error tab

v_trbtr(15),

v_zterm like lfb1-zterm, " Payment terms

v_currency like fmifiit-twaer,

v_title like sy-lisel, " Report Title

v_top_amount(14), " field to be passed to

" Fun.Mod which converts

" from lEGACY TO LOCAL DATA

v_linc(4),

v_amountc(13).

*----


  • Flags

*----


data : f_delete, " to delete record from it_bkpf_fmifiit

f_color, " Flag for color swap

f_flag type i, " Flag to set report title in

f_group . " to indicate batch input session is open

*----


  • Internal Tables

*----


  • structures to be filled with segment data

data : X_Z1BMISHDR like Z1BMISHDR,

X_Z1BMISDATA like Z1BMISDATA,

X_Z1BMISCON like Z1BMISCON,

X_Z1BMISTRLR like Z1BMISTRLR.

  • to hold data from bkpf and fmifiit tables

data : begin of i_bkpf_fmifiit occurs 0,

int_order(12) type c, " internal order number

fonds like fmifiit-fonds, " Fund

fmbelnr like fmifiit-fmbelnr, " Document number for a

" TR-FM line item

KNBELNR like fmifiit-KNBELNR, " FI document number

bus_area like fmifiit-bus_area, " Business Area

objnrz like fmifiit-objnrz, " Object number

wrttp like fmifiit-wrttp, " Value type

trbtr like fmifiit-trbtr, " Amount in trans.

" currency

sgtxt like fmifiit-sgtxt, " Item Text

twaer like fmifiit-twaer,

blart like bkpf-blart, " Document type

auart like aufk-auart, " Order Type

budat like bkpf-budat, " Posting date

bldat like bkpf-bldat, " Document date

end of i_bkpf_fmifiit.

  • for program messages

data : begin of i_prog_msg occurs 0,

pmsg1(50),

pmsg2(50),

end of i_prog_msg.

  • control record for IDOC

data : i_edidd like edidd occurs 0 with header line.

  • Data Record for IDOC

data : begin of i_edidc occurs 1.

include structure edidc.

data : end of i_edidc.

  • Status record for IDOC

data : begin of i_edidc_comm occurs 1.

include structure edidc.

data : end of i_edidc_comm.

  • Batch inputdata of single transaction

DATA: I_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.

  • messages of call transaction

DATA: I_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.

*Internal table to store error records

DATA : BEGIN OF I_ERROR_RECORDS OCCURS 0,

line(4), "(internal)inventory-managed material

PMSG(30), " program Error Message

SMSG(80), " system error message

END OF I_ERROR_RECORDS.

*Internal table to store success records

DATA : BEGIN OF I_success_RECORDS OCCURS 0,

document_no(10), " document no

int_order(12), " internal order number

fonds(20), " fund

END OF I_success_RECORDS.

data : x_bkpf_fmifiit like i_bkpf_fmifiit.

*----


  • Selection-screen

*----


selection-screen : begin of block blk with frame title text-001.

selection-screen skip 1.

select-options : s_b_area for fmifiit-bus_area.

select-options : s_budat for bkpf-budat default sy-datum.

selection-screen : end of block blk.

**----


    • At selection-screen

**----


AT SELECTION-SCREEN.

perform fill_i_bkpf_fmifiit.

if not i_bkpf_fmifiit[] is initial.

perform delete_i_bkpf_fmifiit.

endif.

  • find number of records

describe table i_bkpf_fmifiit lines v_total_records.

if v_total_records = 0.

message e000 with 'No records exist'(014).

endif.

*endif.

**----


    • Start-of-selection

**----


START-OF-SELECTION.

  • populate control record

perform fill_control_record.

  • populate header segment

perform build_header_segment.

  • populate data segment

perform build_data_segment.

  • populate control segment

perform build_control_segment.

  • populate trailer segment

perform build_trailer_segment.

  • create idoc

perform create_idocs.

  • perform bdc for transaction fb50

perform bdc_fb50.

**----


    • End-of-selection

**----


End-of-selection.

perform error_messages.

perform sucess_messages.

***********************************************************************

  • Top-Of-Page

***********************************************************************

Top-Of-Page.

  • Display the Standard Heading

PERFORM TOP_OF_PAGE.

&----


*& Form fill_it_bkpf_fmifiit

&----


  • subroutine to fill internal table it_bkpf_fmifiit

----


FORM fill_i_bkpf_fmifiit.

select fmifiit~fmbelnr

fmifiit~knbelnr

fmifiit~bus_area

fmifiit~objnrz

fmifiit~fonds

fmifiit~wrttp

fmifiit~trbtr

fmifiit~sgtxt

fmifiit~twaer

bkpf~budat

bkpf~blart

bkpf~bldat

into corresponding fields of table i_bkpf_fmifiit

from bkpf

join fmifiit

on bkpfbelnr = fmifiitknbelnr

where fmifiit~bus_area in s_b_area

and bkpf~budat in s_budat

and fmifiit~objnrz like c_orp

and ( fmifiitfonds like c_50p or fmifiitfonds like c_70p or

fmifiit~fonds like c_80p )

and ( fmifiitwrttp like c_54p or fmifiitwrttp like c_66p or

fmifiit~wrttp like c_95p ) .

ENDFORM. " fill_i_bkpf_fmifiit

&----


*& Form delete_it_bkpf_fmifiit

&----


  • subroutine to delete unwnated records from it_bkpf_fmifiit

----


FORM delete_i_bkpf_fmifiit.

  • delete records which have object number 9-14 as 999900

  • or object number third character is not alphabet

delete i_bkpf_fmifiit

where objnrz+2(1) NA sy-abcde

or objnrz+8(6) EQ c_999900.

loop at i_bkpf_fmifiit.

  • deletion indicator flag

clear f_delete.

  • find internal order number

i_bkpf_fmifiit-int_order = i_bkpf_fmifiit-objnrz+2(12).

  • select order type , funding source from aufk

select AUART zzfsc from aufk

into (aufk-auart , aufk-zzfsc)

up to 1 rows

where AUFNR = i_bkpf_fmifiit-int_order.

endselect.

if sy-subrc = 0.

  • delete the record if funding source is XX999999

if aufk-zzfsc CO C_XX999999.

delete i_bkpf_fmifiit.

f_delete = C_X.

endif.

endif.

if f_delete is initial.

  • modify the order type value with value from previous select

i_bkpf_fmifiit-auart = aufk-auart.

v_top_amount = i_bkpf_fmifiit-trbtr.

  • set amount field using over punch logic

CALL FUNCTION 'Z_SIGNED_NUMBER_CONV'

EXPORTING

GROSS_AMT = v_top_amount

IMPORTING

CONV_AMT = v_top_amount

EXCEPTIONS

INPUT_ERR = 1

WRONG_CHAR = 2

OTHERS = 3

.

  • IF SY-SUBRC <> 0.

  • * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  • ENDIF.

i_bkpf_fmifiit-trbtr = v_top_amount.

modify i_bkpf_fmifiit.

endif.

endloop.

ENDFORM. " delete_i_bkpf_fmifiit

&----


*& Form fill_control_record

&----


  • build outbound control information

----


FORM fill_control_record.

  • select control information from edp13

select * from edp13 into edp13

up to 1 rows

where mestyp eq c_message_type

and rcvprn = c_rcvprn

and idoctyp = c_idoc_type.

endselect.

i_edidc-direct = C_1. "Outbound

i_edidc-outmod = edp13-outmod. "Collective processing

i_edidc-rcvprn = edp13-rcvprn. "Partner number of receiver

i_edidc-rcvpor = edp13-rcvpor. "Receiver port

i_edidc-rcvprt = edp13-rcvprt. "Partner type of receiver

i_edidc-rcvpfc = edp13-rcvpfc. "Partner function of recipient

i_edidc-mestyp = edp13-mestyp. "Message type

i_edidc-mescod = edp13-mescod. "Message code

i_edidc-mesfct = edp13-mesfct. "Message function

i_edidc-test = edp13-test. "Test flag

i_edidc-idoctp = edp13-idoctyp. "Idoc Type

i_edidc-cimtyp = edp13-cimtyp. "Extension to Basic type

i_edidc-std = edp13-std. "EDI standard

i_edidc-stdvrs = edp13-stdvrs. "Version of EDI standard

i_edidc-stdmes = edp13-stdmes. "EDI message type

append i_edidc.

ENDFORM. " fill_control_record

&----


*& Form build_header_segment

&----


  • subroutine to build zibmishdr segment

----


FORM build_header_segment.

*header segment

X_Z1BMISHDR-hdr_ind = C_H.

X_Z1BMISHDR-ag_id = c_bmis.

X_Z1BMISHDR-trns_ag_ph = c_7177877901.

X_Z1BMISHDR-file_lbl = C_AFG840M01.

X_Z1BMISHDR-file_typ_cd = C_P.

X_Z1BMISHDR-creat_date = sy-datum. " format ccyymmdd

X_Z1BMISHDR-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_HEADER_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISHDR.

append i_edidd.

clear i_edidd.

ENDFORM. " build_header_segment

&----


*& Form build_data_segment

&----


  • subroutine to build zibmisdata segment

----


FORM build_data_segment.

*main data segment

clear v_total_refs.

clear v_total_exps.

loop at i_bkpf_fmifiit.

  • if document type is KG(Vendor Credit Memo)

if i_bkpf_fmifiit-blart = C_KG.

X_Z1BMISDATA-maint_code = C_REF.

v_total_refs = v_total_refs + 1.

  • if document type is ZQ(Agencies not yet in SAP)

elseif i_bkpf_fmifiit-blart = C_ZQ .

if i_bkpf_fmifiit-sgtxt = c_460 or

i_bkpf_fmifiit-sgtxt = c_461 or

i_bkpf_fmifiit-sgtxt = c_462 or

i_bkpf_fmifiit-sgtxt = c_465 or

i_bkpf_fmifiit-sgtxt = c_470.

delete i_bkpf_fmifiit.

continue.

endif.

  • if document type is VT(Transfer posting)

elseif i_bkpf_fmifiit-blart = C_VT .

if i_bkpf_fmifiit-wrttp = C_66.

X_Z1BMISDATA-maint_code = C_EXP.

v_total_exps = v_total_exps + 1.

endif.

  • if document type is neither KG or ZQ

else .

if i_bkpf_fmifiit-wrttp = C_66 or i_bkpf_fmifiit-wrttp = C_95.

X_Z1BMISDATA-maint_code = C_REF.

v_total_refs = v_total_refs + 1.

endif.

if i_bkpf_fmifiit-wrttp = C_54 .

X_Z1BMISDATA-maint_code = C_EXP.

v_total_exps = v_total_exps + 1.

endif.

endif.

  • select grant department from cross walk table

  • zfi_t_busareacw

select ZDEPT from zfi_t_busareacw

into X_Z1BMISDATA-grant_dep

up to 1 rows

where GSBER = i_bkpf_fmifiit-bus_area.

endselect.

  • Assign internal order 2-6 char to grant number

X_Z1BMISDATA-grant_no = i_bkpf_fmifiit-int_order+1(5).

  • select fund type from fincode

select single type from FMFINCODE

into X_Z1BMISDATA-fund

where FIKRS = C_COPA

and FINCODE = i_bkpf_fmifiit-fonds.

  • depparment is same as grnat department

X_Z1BMISDATA-dept = X_Z1BMISDATA-grant_dep.

  • appropriarion is fonds 3-5 characters

X_Z1BMISDATA-approp = i_bkpf_fmifiit-fonds+2(3).

  • Year is fonds 6-7 characters

X_Z1BMISDATA-year = i_bkpf_fmifiit-fonds+5(2).

  • Ledger is fonds first character

X_Z1BMISDATA-ledger = i_bkpf_fmifiit-fonds+0(1).

  • document id is assigned with the SAP FI document number

X_Z1BMISDATA-doc_id = i_bkpf_fmifiit-knbelnr.

  • ICS posting date is assigned with SAP posting date

v_date = i_bkpf_fmifiit-budat.

v_mm = v_date+4(2).

v_dd = v_date+6(2).

v_yy = v_date+2(2).

concatenate v_mm v_dd v_yy into v_mmddyy.

X_Z1BMISDATA-ics_post_date = v_mmddyy.

  • if document type is KR , then ics posting date is

  • modified based on the payment terms

if i_bkpf_fmifiit-blart = C_KR.

select lfb1~ZTERM

into v_zterm

up to 1 rows

from FMIFIHD

join lfb1

on FMIFIHDlifnr = lfb1lifnr

where FMIFIHD~fmbelnr = i_bkpf_fmifiit-FMBELNR.

endselect.

if v_zterm NE C_P004.

v_zterm = v_zterm+1(2).

X_Z1BMISDATA-ics_post_date = i_bkpf_fmifiit-bldat + v_zterm.

endif.

endif.

X_Z1BMISDATA-amount = i_bkpf_fmifiit-trbtr.

  • find cuureny type and assign to v_currency

if v_currency is initial.

v_currency = i_bkpf_fmifiit-twaer.

endif.

  • find total expenditure amount

if X_Z1BMISDATA-maint_code = C_EXP.

v_total_exp_trbtr = v_total_exp_trbtr + X_Z1BMISDATA-amount.

  • find total refund amount

elseif X_Z1BMISDATA-maint_code = C_REF.

v_total_ref_trbtr = v_total_ref_trbtr + X_Z1BMISDATA-amount.

endif.

  • fill with blanks

X_Z1BMISDATA-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_DATA_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISDATA.

append i_edidd.

clear i_edidd.

clear X_Z1BMISDATA.

endloop.

ENDFORM. " build_data_segment

&----


*& Form build_control_segment

&----


  • subroutine to build zibmiscon segment

----


FORM build_control_segment.

  • control segment

X_Z1BMISCON-maint_cd = C_CON.

  • assign total maintence records for expenditure

X_Z1BMISCON-tot_exp_no = v_total_exps.

  • assign total expenditure amount

X_Z1BMISCON-tot_exp_amt = v_total_exp_trbtr.

  • assign total maintence records for refund

X_Z1BMISCON-tot_ref_no = v_total_refs.

  • assign total refund amount

X_Z1BMISCON-tot_ref_amt = v_total_ref_trbtr.

v_date = sy-datum.

  • extract month from present date

X_Z1BMISCON-postdat_mm = v_date+4(2).

  • extract day from present date

X_Z1BMISCON-postdat_dd = v_date+6(2).

  • extract year from present date

X_Z1BMISCON-postdat_yy = v_date+2(2).

  • fiill with blanks

X_Z1BMISCON-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_CONTROL_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISCON.

append i_edidd.

clear i_edidd.

ENDFORM. " build_control_segment

&----


*& Form build_trailer_segment

&----


  • subroutine to build zibmistrlr segment

----


FORM build_trailer_segment.

  • trailer segment

X_Z1BMISTRLR-trlr_ind = C_T.

X_Z1BMISTRLR-ag_id = C_BMIS.

X_Z1BMISTRLR-file_lbl = C_AFG840M01.

  • assign total data segment records

X_Z1BMISTRLR-file_tot_recs = v_total_records.

X_Z1BMISTRLR-filler = C_FILLER.

  • assign segment name

i_edidd-segnam = C_TRAILER_SEGMENT.

  • assign segment data

i_edidd-sdata = X_Z1BMISTRLR.

append i_edidd.

clear i_edidd.

ENDFORM. " build_trailer_segment

&----


*& Form create_idocs

&----


  • subroutine which creates IDOC document

----


FORM create_idocs.

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'

EXPORTING

MASTER_IDOC_CONTROL = i_edidc

TABLES

COMMUNICATION_IDOC_CONTROL = i_edidc_comm

MASTER_IDOC_DATA = i_edidd

EXCEPTIONS

ERROR_IN_IDOC_CONTROL = 1

ERROR_WRITING_IDOC_STATUS = 2

ERROR_IN_IDOC_DATA = 3

SENDING_LOGICAL_SYSTEM_UNKNOWN = 4

OTHERS = 5

.

ENDFORM. " create_idocs

&----


*& Form bdc_fb50

&----


  • subroutine to call transaction fb50

----


FORM bdc_fb50.

  • sort the internal table by internal order and fund

sort i_bkpf_fmifiit by int_order fonds.

clear i_bkpf_fmifiit.

loop at i_bkpf_fmifiit.

clear x_bkpf_fmifiit.

X_bkpf_fmifiit = i_bkpf_fmifiit.

  • when a new fonds occurs sum

at new fonds.

sum.

v_amount = i_bkpf_fmifiit-trbtr.

i_bkpf_fmifiit = x_bkpf_fmifiit.

i_bkpf_fmifiit-trbtr = v_amount.

if v_amount is initial.

clear i_prog_msg-pmsg1.

i_prog_msg-pmsg1 = 'Record not created for internal order and

fund'(018).

concatenate i_bkpf_fmifiit-int_order space

c_and

i_bkpf_fmifiit-fonds

' as amount is zero '(019) into i_prog_msg-pmsg2

separated by space.

append i_prog_msg.

clear i_prog_msg.

delete i_bkpf_fmifiit

where int_order = i_bkpf_fmifiit-int_order

and fonds = i_bkpf_fmifiit-fonds.

else.

modify i_bkpf_fmifiit.

endif.

endat.

endloop.

  • delete the duplicates as we have already summed up them

delete adjacent duplicates from i_bkpf_fmifiit

comparing int_order fonds.

  • fill bdcdata internal table

perform fill_bdc_tab.

ENDFORM. " call_bdc_fb50

&----


*& Form fill_bdc_tab

&----


  • subroutine to fill bdcdata

----


form fill_bdc_tab.

clear i_bkpf_fmifiit.

loop at i_bkpf_fmifiit.

refresh i_bdcdata.

clear i_bdcdata.

perform bdc_dynpro using 'SAPMF05A' '1001'.

perform bdc_field using 'BDC_OKCODE'

'=BU'.

  • change the date format into ddmmyyyy

concatenate i_bkpf_fmifiit-Bldat+6(2)

i_bkpf_fmifiit-Bldat+4(2)

i_bkpf_fmifiit-Bldat+0(4)

into v_date.

  • fill bdcdata with document date

perform bdc_field using 'ACGL_HEAD-BLDAT'

v_date.

clear v_date.

  • fill bdcdata with currency type

perform bdc_field using 'ACGL_HEAD-WAERS'

i_bkpf_fmifiit-twaer.

concatenate i_bkpf_fmifiit-Budat+6(2)

i_bkpf_fmifiit-Budat+4(2)

i_bkpf_fmifiit-Budat+0(4)

into v_date.

  • fill bdcdata with posting date

perform bdc_field using 'ACGL_HEAD-BUDAT'

v_date.

clear v_date.

  • fill bdcdata with document type

perform bdc_field using 'ACGL_HEAD-BLART'

C_SB.

  • if order type starts with Y and end with 3 then account number

  • is 4000300 else 4000200

if i_bkpf_fmifiit-auart EQ C_Y3.

v_acc_number = C_4000300.

else.

v_acc_number = C_4000200.

endif.

  • fill bdcdata with g/l acct.num

perform bdc_field using 'ACGL_ITEM-HKONT(01)'

v_acc_number.

  • fill bdcdata with account type

perform bdc_field using 'ACGL_ITEM-SHKZG(01)'

c_h.

  • take off sign from amount

clear v_amount .

V_AMOUNT = ABS( i_bkpf_fmifiit-TRBTR ).

v_amountc = v_amount.

  • v_amount = abs( i_bkpf_fmifiit-TRBTR ).

  • write i_bkpf_fmifiit-TRBTR to v_amount no-sign.

  • fill bdcdata with amount

perform bdc_field using 'ACGL_ITEM-WRBTR(01)'

v_amountc.

  • fill bdcdata with taxcode

perform bdc_field using 'ACGL_ITEM-MWSKZ(01)'

c_C0.

  • select cost center from zfi_t_vfc

select zfcrf from zfi_t_vfc

into v_cost_center

up to 1 rows

where zzaufnr = i_bkpf_fmifiit-int_order.

endselect.

  • fill bdcdata with cost centre

perform bdc_field using 'ACGL_ITEM-KOSTL(01)'

v_cost_center.

  • fill bdcdata with int. order

perform bdc_field using 'ACGL_ITEM-AUFNR(01)'

i_bkpf_fmifiit-int_order.

  • fill bdcdata with fund

perform bdc_field using 'ACGL_ITEM-GEBER(01)'

i_bkpf_fmifiit-fonds.

  • fill bdcdata with data for debit account

V_acc_number = C_1300500.

  • fill bdcdata with g/l acct.num

perform bdc_field using 'ACGL_ITEM-HKONT(02)'

V_acc_number.

  • fill bdcdata with acct. type

perform bdc_field using 'ACGL_ITEM-SHKZG(02)'

c_S.

  • fill bdcdata with amount

perform bdc_field using 'ACGL_ITEM-WRBTR(02)'

v_amountc.

  • call transaction

perform bdc_transaction.

endloop.

endform.

&----


*& Form BDC_DYNPRO

&----


  • subroutine to start new screen

----


FORM BDC_DYNPRO USING PROGRAM DYNPRO.

CLEAR I_BDCDATA.

I_BDCDATA-PROGRAM = PROGRAM.

I_BDCDATA-DYNPRO = DYNPRO.

I_BDCDATA-DYNBEGIN = C_X.

APPEND I_BDCDATA.

clear i_bdcdata.

ENDFORM.

&----


*& Form BDC_FIELD

&----


  • subroutine to insert a field

----


FORM BDC_FIELD USING FNAM FVAL type any.

IF NOT FVAL IS INITIAL.

CLEAR I_BDCDATA.

I_BDCDATA-FNAM = FNAM.

I_BDCDATA-FVAL = FVAL.

APPEND I_BDCDATA.

clear i_bdcdata.

ENDIF.

ENDFORM.

&----


*& Form BDC_DYNPRO

&----


  • subroutine to start new transaction

----


FORM BDC_TRANSACTION .

REFRESH I_MESSTAB.

clear i_messtab.

CALL TRANSACTION C_TCODE USING I_BDCDATA

MODE C_MODE

UPDATE C_UPDATE

MESSAGES INTO I_MESSTAB.

  • if call transaction fails

IF SY-SUBRC <> 0.

  • find no.of lines in message table

DESCRIBE TABLE I_MESStab LINES v_LINES.

  • read the lasr message from table

READ TABLE I_MESStab INDEX v_LINES.

*-- Format the error message

PERFORM FORMAT_MESSAGE.

*-- Appending the error records into error table

v_line = v_line + 1.

I_ERROR_RECORDS-line = v_line.

I_ERROR_RECORDS-SMSG = V_MESSTXT.

APPEND I_ERROR_RECORDS.

CLEAR I_ERROR_RECORDS.

  • create new session

if f_group is initial.

clear v_date.

v_date = sy-datum - 1.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING CLIENT = SY-MANDT

GROUP = C_GROUP

USER = SY-uname

KEEP = 'X'

HOLDDATE = v_date

EXCEPTIONS

CLIENT_INVALID = 1

DESTINATION_INVALID = 2

GROUP_INVALID = 3

GROUP_IS_LOCKED = 4

HOLDDATE_INVALID = 5

INTERNAL_ERROR = 6

QUEUE_ERROR = 7

RUNNING = 8

SYSTEM_LOCK_ERROR = 9

USER_INVALID = 10

OTHERS = 11.

clear v_date.

  • if session created, set the flag f_group

if sy-subrc = 0.

f_group = C_X.

endif.

ENDIF.

if not f_group is initial.

CALL FUNCTION 'BDC_INSERT'

EXPORTING TCODE = C_TCODE

TABLES DYNPROTAB = I_BDCDATA.

endif.

REFRESH i_BDCDATA.

clear i_BDCDATA.

else.

  • find no.of lines in message table

DESCRIBE TABLE I_MESStab LINES v_LINES.

  • read the last message

READ TABLE I_MESStab INDEX v_LINES.

  • format the message

PERFORM FORMAT_MESSAGE.

  • extract document no. from formatted message

I_success_RECORDS-document_no = V_MESSTXT+9(10).

  • assign the internal order number

I_success_RECORDS-int_order = i_bkpf_fmifiit-int_order.

  • assign the fund

I_success_RECORDS-fonds = i_bkpf_fmifiit-fonds.

  • append records to success messages

APPEND I_success_RECORDS.

CLEAR I_success_RECORDS.

ENDIF.

ENDFORM.

&----


*& Form 09 FORMAT_MESSAGE

&----


----


  • This subroutine is used to format the error message

----


FORM FORMAT_MESSAGE.

CLEAR V_MESSTXT.

CALL FUNCTION 'FORMAT_MESSAGE'

EXPORTING

ID = SY-MSGID

LANG = 'E'

NO = I_MESSTAB-MSGNR

V1 = I_MESSTAB-MSGV1

V2 = I_MESSTAB-MSGV2

V3 = I_MESSTAB-MSGV3

V4 = I_MESSTAB-MSGV4

iMPORTING

MSG = V_MESSTXT.

ENDFORM. " FORMAT_MESSAGE

&----


*& Form sucess_messages

&----


  • subroutine to print sucess full messages

----


form sucess_messages.

f_flag = c_success.

  • start a new page

new-page.

ULINE.

  • change the color to col_normal

format color col_normal intensified on.

write : /01 sy-vline.

write : 02 'Total Maintenance Records for Expenditure'(006),

v_total_exps.

write : 165(01) sy-vline.

format color col_normal intensified off.

write : /01 sy-vline.

write : 02 'Total Amount for Expenditure '(007),v_total_exp_trbtr

currency v_currency, v_currency .

write : 165(01) sy-vline.

format color col_normal intensified on.

write : /01 sy-vline.

write : 02 'Total Maintenance Records for Refunds '(008),

v_total_refs.

write : 165(01) sy-vline.

format color col_normal intensified off.

write : /01 sy-vline.

write : 02 'Total Amount for Refunds '(009), v_total_ref_trbtr

currency v_currency, v_currency .

write : 165(01) sy-vline.

uline.

skip.

  • if there are any successful records

if not I_success_RECORDS[] is initial.

FORMAT COLOR COL_heading .

write /01(90) sy-uline.

WRITE :/1(01) SY-VLINE,

02(29) 'Document No'(010) ,

31(01) SY-VLINE,

32(29) 'Internal order'(011) ,

61(01) sy-vline,

62(28) 'Fund'(012),

90(01) sy-vline.

FORMAT COLOR off.

endif.

  • loop at sucessfull records messages

LOOP AT I_success_RECORDS.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-vLINE,

02(29) I_success_RECORDS-document_no ,

31(01) SY-VLINE,

32(29) I_success_RECORDS-int_order ,

61(01) sy-vline,

62(28) I_success_RECORDS-fonds,

90(01) sy-vline.

ENDLOOP.

if not I_success_RECORDS[] is initial.

write /01(90) sy-uline.

endif.

endform.

&----


*& Form error_messages

&----


  • subroutine to print error messages

----


form error_messages.

  • if there are any error records

IF NOT I_ERROR_RECORDS[] IS INITIAL.

f_flag = c_failure.

FORMAT COLOR COL_HEADING.

WRITE :/1(01) SY-VLINE,

02(10) 'Line .No'(003),

12(01) SY-VLINE,

13(51) 'Reason For Failure'(004),

64(01) sy-vline,

65(100) 'SAP Message'(005) ,

165(01) sy-vline.

FORMAT COLOR OFF.

  • loop at error records messages

LOOP AT I_ERROR_RECORDS.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-VLINE,

02(10) I_ERROR_RECORDS-line,

12(01) SY-VLINE,

13(51) I_ERROR_RECORDS-PMSG,

64(01) sy-vline,

65(100) I_ERROR_RECORDS-SMSG ,

165(01) sy-vline.

ENDLOOP.

if not I_prog_msg[] is initial.

DESCRIBE TABLE I_ERROR_RECORDS LINES v_LINES.

  • loop at program messages

LOOP AT I_prog_msg.

v_lines = v_lines + 1.

PERFORM COLOR_SWAP.

v_linc = v_lines.

WRITE :/1(01) SY-VLINE,

02(10) v_linc,

12(01) SY-VLINE,

13(51) I_prog_msg-PMSG1,

64(01) sy-vline,

65(100) space,

165(01) sy-vline.

PERFORM COLOR_SWAP.

WRITE :/1(01) SY-VLINE,

02(10) space,

12(01) SY-VLINE,

13(51) I_prog_msg-PMSG2,

64(01) sy-vline,

65(100) space,

165(01) sy-vline.

ENDLOOP.

endif.

endif.

IF NOT I_ERROR_RECORDS[] IS INITIAL.

uline.

endif.

endform.

&----


*& Form TOP_OF_PAGE

&----


  • Description : For Standard Top of Page

----


FORM TOP_OF_PAGE.

IF F_FLAG = C_SUCCESS.

V_TITLE = 'Success Records'(013).

ELSEIF F_FLAG = C_FAILURE.

V_TITLE = 'Error Records'(002).

ENDIF.

CALL FUNCTION 'Z_STANDARD_HEADER'

EXPORTING

ZTYPE = C_H

TITLE2 = 'GM Interface from SAP to CDS Refunds &

Expenditures'(015)

TITLE3 = V_TITLE.

IF SY-SUBRC <> 0.

  • MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " TOP_OF_PAGE

&----


*& Form COLOR_SWAP

&----


  • Description : To Swap the display colour.

----


FORM COLOR_SWAP.

  • if flag is set

if f_color eq c_x.

clear f_color.

  • switch off the intensity

format color col_normal intensified off.

else.

  • if flag is not set.

f_color = c_x.

  • switch on the intensity

format color col_normal intensified on.

endif.

ENDFORM. " COLOR_SWAP

Hope it works.Reward points if it is helpful.

Regards

Suresh