‎2005 Oct 26 2:17 PM
Hi ,
I want to call transaction FB65 for the company code , vendor , amount and GL_account.
Is there any BAPI which i can use for this purpose.
Thanks in advance.
‎2005 Oct 26 3:28 PM
Hi Asit,
Use BAPI_ACC_DOCUMENT_POST for posting .The fields need to be filled are as specified below:
Headerdata
BUS_ACT
USERNAME
HEADER_TXT
COMP_CODE
DOC_DATE
PSTNG_DATE
DOC_TYPE
REF_DOC_NO
Item Data
ACCOUNTGL
ITEMNO_ACC
GL_ACCOUNT
ITEM_TEXT
TAX_CODE
ACCOUNTPAYABLE
ITEMNO_ACC
VENDOR_NO
ITEM_TEXT
TAX_CODE
CURRENCYAMOUNT
ITEMNO_ACC
CURRENCY
AMT_DOCCUR
AMT_BASE
u can also use or submit RFBIBLOO
‎2005 Oct 26 2:23 PM
Asit,
There is a standard program for FB01, which can be used to post any related FI documents(even for FB65).
Try exploring the standard program RFBIBL00 for this.
Myself had used the above program for FB50/FB60 transactions.
Hope it helps.
Ravi.
‎2005 Oct 26 2:36 PM
Hi Ravi ,
Thanks.
Could you please send me some sample code , which you have used for FB50/60?
Thanks again.
‎2005 Oct 26 2:38 PM
Look the bapi BAPI_ACC_GL_POSTING_POST
Take care is little bit dangerous.
Regards
Frédéric
look the
Message was edited by: Frédéric Girod
‎2005 Oct 26 2:39 PM
Hi ,
there's a complete documentation for report RFBIBL00 in SE38
regards Andreas
‎2005 Oct 26 2:46 PM
Asit,
I used LSMW to do the upload both. Create project in LSMW and use this program for upload.
Ravi.
‎2005 Oct 26 3:28 PM
Hi Asit,
Use BAPI_ACC_DOCUMENT_POST for posting .The fields need to be filled are as specified below:
Headerdata
BUS_ACT
USERNAME
HEADER_TXT
COMP_CODE
DOC_DATE
PSTNG_DATE
DOC_TYPE
REF_DOC_NO
Item Data
ACCOUNTGL
ITEMNO_ACC
GL_ACCOUNT
ITEM_TEXT
TAX_CODE
ACCOUNTPAYABLE
ITEMNO_ACC
VENDOR_NO
ITEM_TEXT
TAX_CODE
CURRENCYAMOUNT
ITEMNO_ACC
CURRENCY
AMT_DOCCUR
AMT_BASE
u can also use or submit RFBIBLOO
‎2005 Oct 26 3:34 PM
sample code using RFBIBL00
TABLES : BGR00, " Batch Input Structure for Session Data
BBKPF, " Doc Hdr for Accntng Doc (Batch Input Structure)
BBSEG, " Accounting Document Segment (Batch Input Structure)
USR01.
----
Internal Table and structure Declarations *
----
Internal table to hold input file data
DATA:BEGIN OF IT_INFILE OCCURS 0.
INCLUDE STRUCTURE Z0FI_AP_FADS_TO_SAP. "Input file format
DATA:ERROR(1) TYPE C, "error indicator
END OF IT_INFILE.
Internal table to hold input file data
DATA:BEGIN OF IT_ERRORS OCCURS 0.
INCLUDE STRUCTURE Z0FI_AP_FADS_TO_SAP. "Input file format
DATA: MSG(200) TYPE C, "message
END OF IT_ERRORS.
Internal table to hold GL data
DATA:BEGIN OF IT_GL OCCURS 0,
SAP_GL_ACCOUNT LIKE ZFGLT_GL_PRI_SUB-SAP_GL_ACCOUNT, "G/L Account
LGCY_SYSTEM LIKE ZFGLT_GL_PRI_SUB-LGCY_SYSTEM, "Legacy System
LGCY_PRIME_ACCT LIKE ZFGLT_GL_PRI_SUB-LGCY_PRIME_ACCT,"Legacy Account
LGCY_SUB_ACCT LIKE ZFGLT_GL_PRI_SUB-LGCY_SUB_ACCT, "Legacy Sub Acct
END OF IT_GL.
Internal table to hold cost center data
DATA:BEGIN OF IT_COSTCTR OCCURS 0,
COST_OBJECT LIKE ZFCFT_CTR_DPT_LG-COST_OBJECT, "Cost center
LGCY_LDGR LIKE ZFCFT_CTR_DPT_LG-LGCY_LDGR, "Legacy ledger
LGCY_DEPT LIKE ZFCFT_CTR_DPT_LG-LGCY_DEPT, "Legacy Department
END OF IT_COSTCTR.
Internal table to hold vendor data
DATA:BEGIN OF IT_LFA1 OCCURS 0,
LIFNR TYPE LIFNR, "Vendor no
BUKRS TYPE BUKRS, "Company code
STCD1 TYPE STCD1, "Tax ID1
STCD2 TYPE STCD2, "Tax ID2
END OF IT_LFA1.
Internal table to hold Primary Sub Acct data
DATA:BEGIN OF IT_SUBACCT OCCURS 0,
PRYACT1(10) TYPE C, "Pry sub Acct1
PRYACT2(10) TYPE C, "Pry sub Acct2
END OF IT_SUBACCT.
Internal table to hold ledger data
DATA:BEGIN OF IT_LEDGER OCCURS 0,
LGR_ID(4) TYPE C, "Ledger ID
DEPT(4) TYPE C, "Department
END OF IT_LEDGER.
Internal table to hold tax id
DATA:BEGIN OF IT_TAXID OCCURS 0,
TAXID1(16) TYPE C, "Tax ID1
TAXID2(11) TYPE C, "Tax ID2
END OF IT_TAXID.
Internal table to hold line amounts sum data
DATA:BEGIN OF IT_SUM OCCURS 0,
TAX_ID_NO(10) TYPE C, "Tax Id No
INVOICE_NO(12) TYPE C, "Invoice No
SUM2(11) TYPE P DECIMALS 2, "Sum
END OF IT_SUM.
Internal table to hold Error records
DATA:BEGIN OF IT_ERROR OCCURS 0,
TAX_ID_NO(10) TYPE C, "Tax Id No
INVOICE_NO(12) TYPE C, "Invoice No
MSG(200) TYPE C, "Message
END OF IT_ERROR .
Internal table to hold success records
DATA : BEGIN OF IT_SUCCESS OCCURS 0,
DOCNUM(10) TYPE C, "Document No
BUKRS(4) TYPE C, "Company code
FISYR(4) TYPE C, "Fiscal year
MSG(100) TYPE C, "Message
END OF IT_SUCCESS.
Internal table to hold invoice no
DATA:BEGIN OF IT_INVNO OCCURS 0,
XBLNR(16) TYPE C, "Ref Doc No
END OF IT_INVNO.
Internal table to hold Invoice Document no's
DATA:BEGIN OF IT_BKPF OCCURS 0,
BUKRS LIKE BKPF-BUKRS,
BELNR LIKE BKPF-BELNR,
XBLNR LIKE BKPF-XBLNR,
END OF IT_BKPF.
Internal table to initialise structures
DATA: BEGIN OF IT_NAMETAB OCCURS 120.
INCLUDE STRUCTURE DNTAB.
DATA: END OF IT_NAMETAB.
Internal table to hold sessions data
DATA:BEGIN OF IT_LIST OCCURS 0.
INCLUDE STRUCTURE ABAPLIST.
DATA:END OF IT_LIST.
Structure to hold input file
DATA:X_INFILE LIKE IT_INFILE.
Structure to hold company code & currency data
DATA:BEGIN OF X_T001,
BUKRS LIKE T001-BUKRS, "Company code
WAERS LIKE T001-WAERS, "Currency
END OF X_T001.
----
Global Variables *
----
DATA: V_PGM_ID LIKE SY-REPID, "Program id
V_COUNT_INFILE TYPE I, "Counter
V_TEXT(100) TYPE C, "Text
V_CHAR(61) TYPE C, "Field name
V_FILE LIKE RLGRAP-FILENAME. "File name
DATA:
V_ERR TYPE I, "Counter
V_OBJKEY LIKE BAPIACHE09-OBJ_KEY, "object key
V_ERR_REC TYPE I, "Error Records
V_SUC_REC TYPE I, "Success Records
V_SESS LIKE APQI-GROUPID. "Session name
Field symbols
FIELD-SYMBOLS: <F1> .
----
Constants. *
----
DATA:
C_ITEMNO(6) TYPE C VALUE '000001', "Item no
C_DOCTYPE(2) TYPE C VALUE 'KU', "Doc type
C_BUSACT(4) TYPE C VALUE 'RMRP', "Business Account
C_FADS(7) TYPE C VALUE 'FADS', "Legacy system
C_COMMA(1) TYPE C VALUE ',' , "Comma
C_NODATA(1) TYPE C VALUE '/', "NODATA
C_SESS LIKE APQI-GROUPID VALUE 'FADS2SAP'."Session
----
Selection Screen
----
SELECTION-SCREEN: BEGIN OF BLOCK NO1 WITH FRAME TITLE TEXT-001.
*Input file name
PARAMETERS:P_BUKRS LIKE T001-BUKRS OBLIGATORY,
P_INFILE LIKE RLGRAP-FILENAME LOWER CASE DEFAULT
'C:\FB60.txt' OBLIGATORY,
*Filename for Error records
P_ERR LIKE RLGRAP-FILENAME LOWER CASE DEFAULT
'/int/D01/030/in/REQ853err.txt' OBLIGATORY.
*For selecting either a sequential file or local file.
PARAMETERS:
R_PSERV RADIOBUTTON GROUP GR1 DEFAULT 'X',
R_ASERV RADIOBUTTON GROUP GR1.
SELECTION-SCREEN: END OF BLOCK NO1.
----
INITIALIZATION
----
INITIALIZATION.
V_PGM_ID = SY-REPID.
----
AT SELECTION-SCREEN *
----
AT SELECTION-SCREEN.
Validating company code
SELECT SINGLE BUKRS
WAERS INTO (X_T001-BUKRS, X_T001-WAERS)
FROM T001 WHERE BUKRS = P_BUKRS.
IF SY-SUBRC <> 0.
MESSAGE E014 WITH 'Invalid Company code'(E01).
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_INFILE.
Getting help for presentation server files
IF R_PSERV = 'X'.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
PROGRAM_NAME = V_PGM_ID
DYNPRO_NUMBER = SY-DYNNR
FIELD_NAME = ' '
IMPORTING
FILE_NAME = P_INFILE.
ENDIF.
----
START-OF-SELECTION *
----
START-OF-SELECTION.
If sequential file is selected
IF R_ASERV = 'X'.
Form to get data for apllication server
PERFORM F_GET_INPUT_DATA.
if local file
ELSE.
If sequential file is selected
PERFORM F_GET_LOCAL_DATA.
ENDIF.
Selecting GL, Costcenter, vendor data
PERFORM F_SELECT_DATA.
Validate the the input file data
PERFORM F_VALIDATE_DATA.
Populate data to fill structures
PERFORM F_POPULATE_DATA.
Populate the error data
PERFORM F_ERROR_DATA.
----
END-OF-SELECTION
----
END-OF-SELECTION.
IF NOT IT_INFILE[] IS INITIAL.
For submitting the program to rfbibloo
PERFORM F_SUBMIT_RFBIBLOO.
ENDIF.
WRITE : / 'Number of success records '(003),
v_suc_rec LEFT-JUSTIFIED.
WRITE : / 'Number of error records '(004),
v_err_rec LEFT-JUSTIFIED.
IF NOT IT_ERRORS[] IS INITIAL.
Form to display the error report
PERFORM F_DISPLAY_REPORT.
ENDIF.
IF NOT IT_SUCCESS[] IS INITIAL.
Form to display the success report
PERFORM F_DISPLAY_SUC_REPORT.
ENDIF.
*--Standard footer
PERFORM STD_END_OF_REPORT.
----
TOP OF PAGE *
----
TOP-OF-PAGE.
*---Standard header
PERFORM STD_TOP_OF_PAGE CHANGING SY-TITLE.
&----
*& Form f_get_local_data
&----
Getting the data from presentation server
----
FORM F_GET_LOCAL_DATA.
DATA:LV_FILNAM TYPE STRING. "File name
LV_FILNAM = P_INFILE.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = LV_FILNAM
FILETYPE = 'ASC'
has_field_separator = ' '
TABLES
DATA_TAB = IT_INFILE
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
CLEAR V_COUNT_INFILE.
DESCRIBE TABLE IT_INFILE LINES V_COUNT_INFILE.
Determine if input file has data
IF V_COUNT_INFILE EQ 0.
MESSAGE A001(ZFI).
EXIT.
ELSE.
CONCATENATE 'Number of records read from input file '(002)
P_INFILE
': ' INTO V_TEXT.
WRITE: / V_TEXT, V_COUNT_INFILE LEFT-JUSTIFIED.
ENDIF.
ENDFORM. " f_get_local_data
&----
*& Form F_GET_INPUT_DATA
&----
Getting the data from apllication server
----
FORM F_GET_INPUT_DATA.
DATA: LV_FILNAM LIKE FILENAME-FILEEXTERN."File name
LV_FILNAM = P_INFILE.
Opening Dataset
OPEN DATASET LV_FILNAM FOR INPUT IN TEXT MODE.
Read legacy input file into internal table for furthing processing
DO.
CLEAR IT_INFILE.
READ DATASET P_INFILE INTO IT_INFILE.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
ADD 1 TO V_COUNT_INFILE.
ENDDO.
Determine if input file has data
IF V_COUNT_INFILE EQ 0.
MESSAGE A001(ZFI).
EXIT.
ELSE.
CONCATENATE 'Number of records read from input file '(002)
P_INFILE
': ' INTO V_TEXT.
WRITE: / V_TEXT, V_COUNT_INFILE LEFT-JUSTIFIED.
EXIT.
ENDIF.
closing dataset
CLOSE DATASET LV_FILNAM.
ENDFORM.
*&----
*& Form f_populate_data
*&----
Populate data
*----
FORM F_POPULATE_DATA.
CLEAR: X_INFILE,IT_SUCCESS,V_SUC_REC.
REFRESH IT_SUCCESS.
SORT IT_INFILE BY TAX_ID_NO INVOICE_NO.
CONCATENATE '/int/' SY-SYSID '/' SY-MANDT '/in/IR853_FB01.dat'
INTO V_FILE.
CONDENSE V_FILE NO-GAPS.
Open the dataset
OPEN DATASET V_FILE FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC EQ 0.
LOOP AT IT_INFILE.
X_INFILE = IT_INFILE.
AT FIRST.
To populate BGR00 structure
PERFORM F_POPULATE_BGR00.
TRANSFER BGR00 TO V_FILE.
ENDAT.
AT NEW INVOICE_NO.
To populate BBKPF structure
PERFORM F_POPULATE_BBKPF.
TRANSFER BBKPF TO V_FILE.
To populate BBSEG structure Credit
PERFORM POPULATE_BBSEG_C.
TRANSFER BBSEG TO V_FILE.
ENDAT.
To populate BBKPF structure Debit
PERFORM POPULATE_BBSEG_D.
TRANSFER BBSEG TO V_FILE.
CLEAR:X_INFILE.
ENDLOOP.
ENDIF.
ENDFORM. " f_populate_data
*&----
*& Form f_display_report
*&----
Display error report
*----
FORM F_DISPLAY_REPORT.
Open the dataset
OPEN DATASET P_ERR FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC EQ 0.
LOOP AT IT_ERRORS.
Transfer the error records to error file on application server
TRANSFER IT_ERRORS TO P_ERR.
ENDLOOP.
ENDIF.
Closing the dataset
CLOSE DATASET P_ERR.
IF NOT IT_ERRORS[] IS INITIAL.
FORMAT COLOR 1 INTENSIFIED OFF.
SKIP 2.
WRITE:/1(673) 'ERROR REPORT'(H01) CENTERED.
ULINE /1(673).
WRITE:/(4)'S.No'(005),
SY-VLINE,
(10) 'Tax Id No'(006),
SY-VLINE,
(12) 'Invoice No'(007),
SY-VLINE,
(8) 'Rec Type'(008),
SY-VLINE,
(6) 'Seq No'(009),
SY-VLINE,
(8) 'Batch No'(010),
SY-VLINE,
(8) 'UserID'(011),
SY-VLINE,
(8) 'NU1'(012),
SY-VLINE,
(11) 'Inv Amt'(013),
SY-VLINE,
(8) 'Inv Date'(014),
SY-VLINE,
(10) 'G/L Org ID'(015),
SY-VLINE,
(4) 'NU4'(012),
SY-VLINE,
(4) 'NU5'(012),
SY-VLINE,
(4) 'NU6'(012),
SY-VLINE,
(4) 'NU7'(012),
SY-VLINE,
(11) 'NU8'(012),
SY-VLINE,
(4) 'NU9'(012),
SY-VLINE,
(10) 'PO No'(016),
SY-VLINE,
(30) 'Inv Desc'(017),
SY-VLINE,
(10) 'Voucher No'(018),
SY-VLINE,
(10) 'Inv LinNo'(019),
SY-VLINE,
(11) 'Inv Lin Amt'(020),
SY-VLINE,
(9) 'Led ID-1'(021),
SY-VLINE,
(9) 'Led ID-2'(022),
SY-VLINE,
(15) 'Pri Sub Acc-1'(023),
SY-VLINE,
(15) 'Pri Sub Acc-2'(024),
SY-VLINE,
(15) 'Dept Win Lgr'(025),
SY-VLINE,
(5) 'NU2'(012),
SY-VLINE,
(6) 'NU3'(012),
SY-VLINE,
(11) 'Dist Amt'(026),
SY-VLINE,
(8) 'Inv Type'(027),
SY-VLINE,
(12) 'PO Line No'(028),
SY-VLINE,
(15) 'Inv Line Amt'(029),
SY-VLINE,
(5) 'NU10'(012),
SY-VLINE,
(13) 'NU11'(012),
SY-VLINE,
(5) 'NU12'(012),
SY-VLINE,
(6) 'NU13'(012),
SY-VLINE,
(5) 'NU14'(012),
SY-VLINE,
(5) 'NU15'(012),
SY-VLINE,
(200) 'Message'(030),
SY-VLINE.
FORMAT COLOR 6 INTENSIFIED OFF.
LOOP AT IT_ERRORS.
WRITE:/(4) SY-TABIX,
SY-VLINE,
(10) IT_ERRORS-TAX_ID_NO,
SY-VLINE,
(12) IT_ERRORS-INVOICE_NO,
SY-VLINE,
(8) IT_ERRORS-RECORD_TYPE,
SY-VLINE,
(6) IT_ERRORS-SEQ_NO,
SY-VLINE,
(8) IT_ERRORS-BATCH_NO,
SY-VLINE,
(8) IT_ERRORS-USERID,
SY-VLINE,
(8) IT_ERRORS-NU1,
SY-VLINE,
(11) IT_ERRORS-INV_HEADER_AMT,
SY-VLINE,
(8) IT_ERRORS-INVOICE_DATE,
SY-VLINE,
(10) IT_ERRORS-GL_ORG_ID,
SY-VLINE,
(4) IT_ERRORS-NU4,
SY-VLINE,
(4) IT_ERRORS-NU5,
SY-VLINE,
(4) IT_ERRORS-NU6,
SY-VLINE,
(4) IT_ERRORS-NU7,
SY-VLINE,
(11) IT_ERRORS-NU8,
SY-VLINE,
(4) IT_ERRORS-NU9,
SY-VLINE,
(10) IT_ERRORS-PONUMBER,
SY-VLINE,
(30) IT_ERRORS-INV_DESC,
SY-VLINE,
(10) IT_ERRORS-VOUCHER_NO,
SY-VLINE,
(10) IT_ERRORS-INV_LINE_NO,
SY-VLINE,
(11) IT_ERRORS-INV_LINE_AMT,
SY-VLINE,
(9) IT_ERRORS-LEDGER_ID1,
SY-VLINE,
(9) IT_ERRORS-LEDGER_ID2,
SY-VLINE,
(15) IT_ERRORS-PRI_SUBACCT1,
SY-VLINE,
(15) IT_ERRORS-PRI_SUBACCT2,
SY-VLINE,
(15) IT_ERRORS-DEPT_WIN_LDGR,
SY-VLINE,
(5) IT_ERRORS-NU2,
SY-VLINE,
(6) IT_ERRORS-NU3,
SY-VLINE,
(11) IT_ERRORS-DIST_AMT,
SY-VLINE,
(8) IT_ERRORS-INV_TYPE,
SY-VLINE,
(12) IT_ERRORS-PO_LINE_NO,
SY-VLINE,
(15) IT_ERRORS-INV_LINE_AMT_D,
SY-VLINE,
(5) IT_ERRORS-NU10,
SY-VLINE,
(13) IT_ERRORS-NU11,
SY-VLINE,
(5) IT_ERRORS-NU12,
SY-VLINE,
(6) IT_ERRORS-NU13,
SY-VLINE,
(5) IT_ERRORS-NU14,
SY-VLINE,
(5) IT_ERRORS-NU15,
SY-VLINE,
(200) IT_ERRORS-MSG,
SY-VLINE.
ENDLOOP.
ULINE /1(673).
ENDIF.
ENDFORM. " f_display_report
&----
*& Form f_select_data
----
Selection of GL, Costcenter, vendor data
----
FORM F_SELECT_DATA.
DATA:L_DEPT(4) TYPE N. "Legacy department
CLEAR:IT_GL, IT_COSTCTR, IT_LFA1, IT_SUBACCT, IT_TAXID , IT_SUM.
REFRESH:IT_GL, IT_COSTCTR, IT_LFA1, IT_SUBACCT, IT_TAXID,IT_SUM.
SORT IT_INFILE BY TAX_ID_NO INVOICE_NO.
*Looping at input file
LOOP AT IT_INFILE.
X_INFILE = IT_INFILE.
*Summing the invoice line items amount and moving the sum to it_sum
IT_SUM-TAX_ID_NO = IT_INFILE-TAX_ID_NO.
IT_SUM-INVOICE_NO = IT_INFILE-INVOICE_NO.
IT_SUM-SUM2 = IT_INFILE-INV_LINE_AMT.
COLLECT IT_SUM.
CLEAR IT_SUM.
*Storing Primary Sub Account data
IT_SUBACCT-PRYACT1 = IT_INFILE-PRI_SUBACCT1.
IT_SUBACCT-PRYACT2 = IT_INFILE-PRI_SUBACCT2.
APPEND IT_SUBACCT.
CLEAR IT_SUBACCT.
*Storing Ledger ID data
CONCATENATE IT_INFILE-LEDGER_ID1 IT_INFILE-LEDGER_ID2 INTO
IT_LEDGER-LGR_ID.
L_DEPT = IT_INFILE-DEPT_WIN_LDGR.
IT_LEDGER-DEPT = L_DEPT.
APPEND IT_LEDGER.
CLEAR IT_LEDGER.
*Storing Tax ID data
IT_TAXID-TAXID1 = IT_INFILE-TAX_ID_NO.
IT_TAXID-TAXID2 = IT_INFILE-TAX_ID_NO.
APPEND IT_TAXID.
CLEAR IT_TAXID.
CONDENSE IT_INFILE-INVOICE_NO.
IT_INVNO-XBLNR = IT_INFILE-INVOICE_NO.
APPEND IT_INVNO.
CLEAR IT_INVNO.
ENDLOOP.
SORT IT_SUBACCT BY PRYACT1 PRYACT2.
SORT IT_LEDGER BY LGR_ID DEPT.
SORT IT_TAXID BY TAXID1 TAXID2.
SORT IT_SUM BY TAX_ID_NO INVOICE_NO.
SORT IT_INVNO BY XBLNR.
DELETE ADJACENT DUPLICATES FROM IT_SUBACCT COMPARING PRYACT1 PRYACT2.
DELETE ADJACENT DUPLICATES FROM IT_LEDGER COMPARING LGR_ID DEPT.
DELETE ADJACENT DUPLICATES FROM IT_TAXID COMPARING TAXID1 TAXID2.
IF NOT IT_INVNO[] IS INITIAL.
SELECT BUKRS
BELNR
XBLNR
INTO TABLE IT_BKPF
FROM BKPF
FOR ALL ENTRIES IN IT_INVNO
WHERE BUKRS = P_BUKRS AND
GJAHR = SY-DATUM+0(4) AND
BLART = C_DOCTYPE AND
XBLNR = IT_INVNO-XBLNR.
.
ENDIF.
IF NOT IT_SUBACCT[] IS INITIAL.
*Selecting G/L Account from General Ledger Z Table
SELECT SAP_GL_ACCOUNT
LGCY_SYSTEM
LGCY_PRIME_ACCT
LGCY_SUB_ACCT FROM ZFGLT_GL_PRI_SUB
INTO TABLE IT_GL
FOR ALL ENTRIES IN IT_SUBACCT
WHERE LGCY_SYSTEM = C_FADS AND
LGCY_PRIME_ACCT = IT_SUBACCT-PRYACT1 AND
LGCY_SUB_ACCT = IT_SUBACCT-PRYACT2.
IF SY-SUBRC = 0.
SORT IT_GL BY SAP_GL_ACCOUNT
LGCY_SYSTEM
LGCY_PRIME_ACCT
LGCY_SUB_ACCT.
ENDIF.
IF NOT IT_LEDGER[] IS INITIAL.
*Selecting cost center from Cost Center Z Table
SELECT COST_OBJECT
LGCY_LDGR
LGCY_DEPT FROM ZFCFT_CTR_DPT_LG
INTO TABLE IT_COSTCTR
FOR ALL ENTRIES IN IT_LEDGER
WHERE LGCY_LDGR = IT_LEDGER-LGR_ID AND
LGCY_DEPT = IT_LEDGER-DEPT.
IF SY-SUBRC = 0.
SORT IT_COSTCTR BY COST_OBJECT
LGCY_LDGR
LGCY_DEPT.
ENDIF.
ENDIF.
IF NOT IT_TAXID[] IS INITIAL.
*Selecting vendor no from vendor master data
SELECT A~LIFNR
B~BUKRS
A~STCD1
A~STCD2
FROM LFA1 AS A JOIN LFB1 AS B
ON ALIFNR = BLIFNR
INTO TABLE IT_LFA1
FOR ALL ENTRIES IN IT_TAXID
WHERE BUKRS = P_BUKRS AND
( STCD1 = IT_TAXID-TAXID1 OR
STCD2 = IT_TAXID-TAXID2 ).
ENDIF.
ENDIF.
ENDFORM. " f_select_data
&----
*& Form f_validate_data
&----
Validation of input file data
----
FORM F_VALIDATE_DATA.
DATA:L_ERRFLAG TYPE C, "Error flag
L_DEPT(4) TYPE N, "Department
L_LGR_ID(4) TYPE C, "Ledger ID
LV_NO_OF_VENDORS TYPE I, "No of vendors
L_SUM(11) TYPE P DECIMALS 2, "Sum
LV_MSG1(30) TYPE C, "Message
LV_MSG2(25) TYPE C, "Message
LV_MSG3(6) TYPE C, "Message
LV_MSG4(31) TYPE C, "Message
LV_MSG5(53) TYPE C, "Message
LV_MSG6(30) TYPE C, "Message
LV_MSG7(50) TYPE C. "Message
LOOP AT IT_INFILE.
CLEAR:LV_MSG1,LV_MSG2, LV_MSG3,LV_MSG4,LV_MSG5, LV_MSG6, LV_MSG7.
CLEAR L_ERRFLAG.
SORT IT_SUM BY TAX_ID_NO
INVOICE_NO.
CLEAR IT_SUBACCT.
Validating Primary Sub Acct1 and Acct2.
READ TABLE IT_GL WITH KEY LGCY_SYSTEM = C_FADS
LGCY_PRIME_ACCT = IT_INFILE-PRI_SUBACCT1
LGCY_SUB_ACCT = IT_INFILE-PRI_SUBACCT2 .
IF SY-SUBRC <> 0.
LV_MSG1 = 'Primary Sub Acct1 and Acct2'(035).
L_ERRFLAG = 'X'.
ENDIF.
MOVE IT_INFILE-DEPT_WIN_LDGR TO L_DEPT.
MOVE L_DEPT TO IT_INFILE-DEPT_WIN_LDGR.
CONCATENATE IT_INFILE-LEDGER_ID1 IT_INFILE-LEDGER_ID2 INTO
L_LGR_ID.
CLEAR: IT_COSTCTR.
Validating Ledger id & department
READ TABLE IT_COSTCTR WITH KEY LGCY_LDGR = L_LGR_ID
LGCY_DEPT = IT_INFILE-DEPT_WIN_LDGR.
IF SY-SUBRC <> 0.
LV_MSG2 = 'Ledger id & department'(036).
L_ERRFLAG = 'X'.
ENDIF.
Validating Tax ID
CLEAR:IT_LFA1.
READ TABLE IT_LFA1 WITH KEY STCD2 = IT_INFILE-TAX_ID_NO..
IF SY-SUBRC <> 0.
READ TABLE IT_LFA1 WITH KEY STCD1 = IT_INFILE-TAX_ID_NO..
IF SY-SUBRC <> 0.
LV_MSG3 = 'Tax ID'(041).
L_ERRFLAG = 'X'.
ENDIF.
ENDIF.
Checking for no of vendors selected based on tax id. If no of vendors
selected are more than 1 or 0 then error out the record
LV_NO_OF_VENDORS = 0.
LOOP AT IT_LFA1 WHERE STCD1 = IT_INFILE-TAX_ID_NO OR
STCD2 = IT_INFILE-TAX_ID_NO.
LV_NO_OF_VENDORS = LV_NO_OF_VENDORS + 1.
ENDLOOP.
IF LV_NO_OF_VENDORS = 0.
LV_MSG6 = 'No vendor found for TAXID'(037).
L_ERRFLAG = 'X'.
ELSEIF LV_NO_OF_VENDORS > 1.
LV_MSG4 = 'More than one vendor for Tax id'(038).
L_ERRFLAG = 'X'.
ENDIF.
Checking whether KU Document already exists for this Invoice No
CLEAR IT_INVNO.
READ TABLE IT_BKPF WITH KEY XBLNR = IT_INFILE-INVOICE_NO.
IF SY-SUBRC = 0.
LV_MSG7 = 'KU Document already exists for this Invoice No '(042).
L_ERRFLAG = 'X'.
ENDIF.
Checking whether the invoice header amt is equal to the line items amt
CLEAR IT_SUM.
READ TABLE IT_SUM WITH KEY TAX_ID_NO = IT_INFILE-TAX_ID_NO
INVOICE_NO = IT_INFILE-INVOICE_NO BINARY SEARCH.
CLEAR L_SUM.
L_SUM = IT_INFILE-INV_HEADER_AMT.
IF L_SUM <> IT_SUM-SUM2.
LV_MSG5 = 'Header amt is not equal to the sum of all line items'(039).
L_ERRFLAG = 'X'.
ENDIF.
Moving error records to error internal table
IF L_ERRFLAG = 'X'.
MOVE IT_INFILE TO IT_ERRORS.
CONCATENATE 'Invalid:'(040) LV_MSG1 LV_MSG2 LV_MSG3 LV_MSG4 LV_MSG5
LV_MSG6 LV_MSG7 INTO IT_ERRORS-MSG SEPARATED BY SPACE.
APPEND IT_ERRORS.
CLEAR : IT_ERRORS.
Deleting all the errors records from the processing internal table
and moving them to error table
V_ERR = V_ERR + 1.
IT_INFILE-ERROR = 'X'.
MODIFY IT_INFILE TRANSPORTING ERROR.
CLEAR IT_INFILE.
ENDIF.
ENDLOOP.
DELETE IT_INFILE WHERE ERROR = 'X'.
Deleting all the line items from the processing internal table where
atleast one line item is error one
SORT IT_ERRORS BY TAX_ID_NO
INVOICE_NO.
CLEAR V_ERR_REC.
LOOP AT IT_ERRORS.
DELETE IT_INFILE WHERE TAX_ID_NO = IT_ERRORS-TAX_ID_NO AND
INVOICE_NO = IT_ERRORS-INVOICE_NO.
AT NEW INVOICE_NO.
V_ERR_REC = V_ERR_REC + 1.
ENDAT.
ENDLOOP.
ENDFORM. " f_validate_data
&----
*& Form f_error_data
&----
Processing error data
----
FORM F_ERROR_DATA.
DELETE IT_ERROR WHERE MSG = 'Error in document: BKPFF $ D01030'(E02).
SORT IT_ERROR BY TAX_ID_NO INVOICE_NO.
LOOP AT IT_INFILE.
X_INFILE = IT_INFILE.
READ TABLE IT_ERROR WITH KEY TAX_ID_NO = IT_INFILE-TAX_ID_NO
INVOICE_NO = IT_INFILE-INVOICE_NO BINARY SEARCH.
IF SY-SUBRC = 0.
AT NEW INVOICE_NO.
V_ERR_REC = V_ERR_REC + 1.
ENDAT.
MOVE X_INFILE TO IT_ERRORS.
IT_ERRORS-MSG = IT_ERROR-MSG.
APPEND IT_ERRORS.
CLEAR IT_ERRORS.
ENDIF.
ENDLOOP.
ENDFORM. " f_error_data
&----
*& Form f_display_suc_report
&----
Display success report
----
FORM F_DISPLAY_SUC_REPORT.
FORMAT COLOR OFF.
FORMAT COLOR 1 INTENSIFIED OFF.
SKIP 2.
WRITE:/1(150) 'SUCCESS REPORT'(S01) CENTERED.
ULINE /1(150).
WRITE:/1 SY-VLINE,
2 'Doc No'(031),
13 SY-VLINE,
14 'Company code'(032),
26 SY-VLINE,
27 'Fiscal Year'(033),
40 SY-VLINE,
41 'Message'(034),
150 SY-VLINE.
FORMAT COLOR OFF.
FORMAT COLOR 5 INTENSIFIED OFF.
LOOP AT IT_SUCCESS.
WRITE:/1 SY-VLINE,
2 IT_SUCCESS-DOCNUM,
13 SY-VLINE,
14 IT_SUCCESS-BUKRS,
26 SY-VLINE,
27 IT_SUCCESS-FISYR,
40 SY-VLINE,
41 IT_SUCCESS-MSG,
150 SY-VLINE.
ENDLOOP.
ULINE /1(150).
ENDFORM. " f_display_suc_report
&----
*& Form F_populate_bgr00
&----
To populate BGR00 structure
----
FORM F_POPULATE_BGR00.
PERFORM F_INIT_STRUCTURES USING 'BGR00' C_NODATA.
CLEAR V_SESS.
CONCATENATE C_SESS SY-DATUM+4(4) INTO V_SESS SEPARATED BY '-'.
BGR00-STYPE = '0'.
BGR00-GROUP = V_SESS.
BGR00-MANDT = SY-MANDT.
BGR00-USNAM = SY-UNAME.
BGR00-START = SPACE.
BGR00-XKEEP = 'X'.
ENDFORM. " F_populate_bgr00
&----
*& Form F_init_structures
&----
Form to initialise structures
----
FORM F_INIT_STRUCTURES USING TABNAME LIKE DNTAB-TABNAME
I_NODATA LIKE C_NODATA.
REFRESH IT_NAMETAB.
CLEAR IT_NAMETAB.
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
LANGU = SY-LANGU
TABNAME = TABNAME
TABLES
NAMETAB = IT_NAMETAB
EXCEPTIONS
NO_TEXTS_FOUND = 1.
IF SY-SUBRC = 0.
LOOP AT IT_NAMETAB.
CLEAR V_CHAR.
CONCATENATE IT_NAMETAB-TABNAME '-' IT_NAMETAB-FIELDNAME INTO V_CHAR.
ASSIGN (V_CHAR) TO <F1>.
<F1> = I_NODATA.
ENDLOOP.
ENDIF.
ENDFORM. " INIT_STRUCTURES
&----
*& Form f_populate_bbkpf
&----
To populate BBKPF structure
----
FORM F_POPULATE_BBKPF.
DATA:LV_DAT LIKE BKPF-BUDAT.
PERFORM F_INIT_STRUCTURES USING 'BBKPF' C_NODATA.
To post Header record.
BBKPF-STYPE = '1'.
BBKPF-TCODE = 'FB01'.
CLEAR LV_DAT.
LV_DAT = SY-DATUM.
WRITE LV_DAT TO BBKPF-BUDAT.
CLEAR LV_DAT.
LV_DAT = X_INFILE-INVOICE_DATE.
WRITE LV_DAT TO BBKPF-BLDAT.
BBKPF-BLART = C_DOCTYPE.
BBKPF-BUKRS = P_BUKRS..
BBKPF-WAERS = X_T001-WAERS.
BBKPF-XBLNR = X_INFILE-INVOICE_NO.
ENDFORM. " f_populate_bbkpf
&----
*& Form populate_bbseg_c
&----
To populate BBSEG structure Credit
----
FORM POPULATE_BBSEG_C.
PERFORM F_INIT_STRUCTURES USING 'BBSEG' C_NODATA.
BBSEG-STYPE = '2'.
BBSEG-TBNAM = 'BBSEG'.
BBSEG-NEWBS = '31'.
READ TABLE IT_LFA1 WITH KEY STCD2 = X_INFILE-TAX_ID_NO .
IF SY-SUBRC = 0.
BBSEG-NEWKO = IT_LFA1-LIFNR.
ELSE.
READ TABLE IT_LFA1 WITH KEY STCD1 = X_INFILE-TAX_ID_NO .
IF SY-SUBRC = 0.
BBSEG-NEWKO = IT_LFA1-LIFNR.
ENDIF.
ENDIF.
BBSEG-WRBTR = X_INFILE-INV_HEADER_AMT.
BBSEG-SGTXT = X_INFILE-INV_DESC.
ENDFORM. " populate_bbseg_c
&----
*& Form POPULATE_BBSEG_D
&----
To populate BBSEG structure Debit
----
FORM POPULATE_BBSEG_D.
DATA:L_LGR_ID(4) TYPE C. "ledger id
CLEAR L_LGR_ID.
PERFORM F_INIT_STRUCTURES USING 'BBSEG' C_NODATA.
BBSEG-STYPE = '2'.
BBSEG-TBNAM = 'BBSEG'.
BBSEG-NEWBS = '40'.
*Fetching G/L account
READ TABLE IT_GL WITH KEY LGCY_SYSTEM = C_FADS
LGCY_PRIME_ACCT = X_INFILE-PRI_SUBACCT1
LGCY_SUB_ACCT = X_INFILE-PRI_SUBACCT2.
IF SY-SUBRC = 0.
BBSEG-NEWKO = IT_GL-SAP_GL_ACCOUNT.
ENDIF.
BBSEG-WRBTR = X_INFILE-INV_LINE_AMT.
CONCATENATE X_INFILE-LEDGER_ID1 X_INFILE-LEDGER_ID2 INTO
L_LGR_ID.
*Fetching costcenter
READ TABLE IT_COSTCTR WITH KEY LGCY_LDGR = L_LGR_ID
LGCY_DEPT = X_INFILE-DEPT_WIN_LDGR.
IF SY-SUBRC = 0.
BBSEG-KOSTL = IT_COSTCTR-COST_OBJECT.
ENDIF.
BBSEG-SGTXT = X_INFILE-INV_DESC.
ENDFORM. " POPULATE_BBSEG_D
&----
*& Form f_submit_rfbibloo
&----
Submit the program to rfbibloo
----
FORM F_SUBMIT_RFBIBLOO.
Submitting the file for RFBIBL00
SUBMIT RFBIBL00 WITH DS_NAME = V_FILE
WITH CALLMODE = 'B'
WITH MAX_COMM = '9999'
WITH XINF = 'X'
AND RETURN.
Process the session if created successfully
IF SY-SUBRC = 0.
SUBMIT RSBDCSUB WITH MAPPE = V_SESS
WITH Z_VERARB = 'X'
WITH FEHLER = ''
EXPORTING LIST TO MEMORY
AND RETURN.
IF SY-SUBRC = 0.
Displaying the sessions data
PERFORM F_SESSION_LIST.
ENDIF.
ENDIF.
ENDFORM. " f_submit_rfbibloo
&----
*& Form f_session_list
&----
Displaying the sessions data
----
FORM F_SESSION_LIST.
DATA:LV_UCOMM LIKE SY-UCOMM. "usercommand
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
LISTOBJECT = IT_LIST
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.
IF NOT IT_LIST[] IS INITIAL.
CALL FUNCTION 'DISPLAY_LIST'
EXPORTING
FULLSCREEN = 'X'
CALLER_HANDLES_EVENTS =
IMPORTING
USER_COMMAND = LV_UCOMM
TABLES
LISTOBJECT = IT_LIST
EXCEPTIONS
EMPTY_LIST = 1
OTHERS = 2
.
ENDIF.
ENDFORM. " f_session_list
‎2005 Oct 26 3:36 PM
sample code using BAPI
----
Internal Table and structure Declarations *
----
Structure to hold header data
DATA: x_docheader LIKE bapiache09. "Header.
Internal table to hold account GL data
DATA: BEGIN OF it_accgl OCCURS 0.
INCLUDE STRUCTURE bapiacgl09. "G/L account item.
DATA: END OF it_accgl.
Internal table to hold account payee data
DATA: BEGIN OF it_accpy OCCURS 0.
INCLUDE STRUCTURE bapiacap09. "Vendor Item.
DATA: END OF it_accpy.
Internal table to hold currency amount data
DATA: BEGIN OF it_curramt OCCURS 0.
INCLUDE STRUCTURE bapiaccr09. "Currency Items.
DATA: END OF it_curramt.
Internal table to hold return data
DATA: BEGIN OF it_return OCCURS 0.
INCLUDE STRUCTURE bapiret2. "Return Parameter.
DATA: END OF it_return.
Internal table to hold input file data
DATA:BEGIN OF it_infile OCCURS 0.
INCLUDE STRUCTURE z0fi_ap_fads_to_sap. "Input file format
DATA:error(1) TYPE c, "error indicator
END OF it_infile.
Internal table to hold input file data
DATA:BEGIN OF it_errors OCCURS 0.
INCLUDE STRUCTURE z0fi_ap_fads_to_sap. "Input file format
DATA: msg(200) TYPE c, "message
END OF it_errors.
Internal table to hold GL data
DATA:BEGIN OF it_gl OCCURS 0,
sap_gl_account LIKE zfglt_gl_pri_sub-sap_gl_account, "G/L Account
lgcy_system LIKE zfglt_gl_pri_sub-lgcy_system, "Legacy System
lgcy_prime_acct LIKE zfglt_gl_pri_sub-lgcy_prime_acct,"Legacy Account
lgcy_sub_acct LIKE zfglt_gl_pri_sub-lgcy_sub_acct, "Legacy Sub Acct
END OF it_gl.
Internal table to hold cost center data
DATA:BEGIN OF it_costctr OCCURS 0,
cost_object LIKE zfcft_ctr_dpt_lg-cost_object, "Cost center
lgcy_ldgr LIKE zfcft_ctr_dpt_lg-lgcy_ldgr, "Legacy ledger
lgcy_dept LIKE zfcft_ctr_dpt_lg-lgcy_dept, "Legacy Department
END OF it_costctr.
Internal table to hold vendor data
DATA:BEGIN OF it_lfa1 OCCURS 0,
lifnr TYPE lifnr, "Vendor no
BUKRS TYPE BUKRS, "Company code
stcd1 TYPE stcd1, "Tax ID1
stcd2 TYPE stcd2, "Tax ID2
END OF it_lfa1.
Internal table to hold Primary Sub Acct data
DATA:BEGIN OF it_subacct OCCURS 0,
pryact1(10) TYPE c, "Pry sub Acct1
pryact2(10) TYPE c, "Pry sub Acct2
END OF it_subacct.
Internal table to hold ledger data
DATA:BEGIN OF it_ledger OCCURS 0,
lgr_id(4) TYPE C, "Ledger ID
dept(4) TYPE c, "Department
END OF it_ledger.
Internal table to hold tax id
DATA:BEGIN OF it_taxid OCCURS 0,
taxid1(16) TYPE c, "Tax ID1
taxid2(11) TYPE c, "Tax ID2
END OF it_taxid.
Internal table to hold line amounts sum data
DATA:BEGIN OF it_sum OCCURS 0,
tax_id_no(10) TYPE c, "Tax Id No
invoice_no(12) TYPE c, "Invoice No
sum2(11) TYPE p DECIMALS 2, "Sum
END OF it_sum.
Internal table to hold Error records
data:BEGIN OF IT_ERROR OCCURS 0,
tax_id_no(10) TYPE c, "Tax Id No
invoice_no(12) TYPE c, "Invoice No
MSG(200) TYPE C, "Message
END OF IT_eRROR .
Internal table to hold success records
DATA : BEGIN OF it_success OCCURS 0,
docnum(10) TYPE c, "Document No
bukrs(4) TYPE c, "Company code
fisyr(4) TYPE c, "Fiscal year
msg(100) TYPE c, "Message
END OF it_success.
data:begin of it_invno occurs 0,
xblnr(16) type c,
end of it_invno.
Internal table to hold Invoice Document no's
DATA:BEGIN OF IT_BKPF OCCURS 0,
bukrs LIKE BKPF-BUKRS,
belnr LIKE BKPF-BELNR,
xblnr like bkpf-xblnr,
END OF IT_BKPF.
Structure to hold input file
DATA:x_infile LIKE it_infile.
Structure to hold company code & currency data
DATA:BEGIN OF x_t001,
bukrs LIKE t001-bukrs, "Company code
waers LIKE t001-waers, "Currency
END OF x_t001.
----
Global Variables *
----
DATA: v_pgm_id LIKE sy-repid, "Program id
v_count_infile TYPE i, "Counter
v_text(100) TYPE c. "Text
DATA:
v_err TYPE i, "Counter
v_objkey LIKE bapiache09-obj_key, "object key
v_err_rec type i, "Error Records
v_suc_rec type i. "Success Records
----
Constants. *
----
DATA:
c_itemno(6) TYPE c VALUE '000001', "Item no
c_doctype(2) TYPE c VALUE 'KU', "Doc type
c_busact(4) TYPE c VALUE 'RMRP', "Business Account
c_fads(7) TYPE c VALUE 'FADS'. "Legacy system
----
Selection Screen
----
SELECTION-SCREEN: BEGIN OF BLOCK no1 WITH FRAME TITLE text-001.
*Input file name
PARAMETERS:p_bukrs LIKE t001-bukrs OBLIGATORY,
p_infile LIKE rlgrap-filename LOWER CASE DEFAULT
'C:\FB60.txt' OBLIGATORY,
*Filename for Error records
p_err LIKE rlgrap-filename LOWER CASE DEFAULT
'/int/D01/030/in/REQ853err.txt' OBLIGATORY.
*For selecting either a sequential file or local file.
PARAMETERS:
r_pserv RADIOBUTTON GROUP gr1 DEFAULT 'X',
r_aserv RADIOBUTTON GROUP gr1.
SELECTION-SCREEN: END OF BLOCK no1.
----
INITIALIZATION
----
INITIALIZATION.
v_pgm_id = sy-repid.
----
AT SELECTION-SCREEN *
----
AT SELECTION-SCREEN.
Validating company code
SELECT SINGLE bukrs
waers INTO (x_t001-bukrs, x_t001-waers)
FROM t001 WHERE bukrs = p_bukrs.
IF sy-subrc <> 0.
MESSAGE e014 WITH 'Invalid Company code'(e01).
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.
Getting help for presentation server files
IF r_pserv = 'X'.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = v_pgm_id
dynpro_number = sy-dynnr
field_name = ' '
IMPORTING
file_name = p_infile.
ENDIF.
----
START-OF-SELECTION *
----
START-OF-SELECTION.
If sequential file is selected
IF r_aserv = 'X'.
Form to get data for apllication server
PERFORM f_get_input_data.
if local file
ELSE.
If sequential file is selected
PERFORM f_get_local_data.
ENDIF.
Selecting GL, Costcenter, vendor data
PERFORM f_select_data.
Validate the the input file data
PERFORM f_validate_data.
Populate data to be passed to BAPI
PERFORM f_populate_data.
Populate the error data
PERFORM f_error_data.
----
END-OF-SELECTION
----
END-OF-SELECTION.
write : / 'Number of success records '(003),
v_suc_rec LEFT-JUSTIFIED.
write : / 'Number of error records '(004),
v_err_rec LEFT-JUSTIFIED.
IF NOT it_errors[] IS INITIAL.
Form to display the error report
PERFORM f_display_report.
ENDIF.
if not it_success[] is initial.
Form to display the success report
perform f_display_suc_report.
endif.
*--Standard footer
PERFORM std_end_of_report.
----
TOP OF PAGE *
----
TOP-OF-PAGE.
*---Standard header
PERFORM std_top_of_page CHANGING sy-title.
&----
*& Form f_get_local_data
&----
Getting the data from presentation server
----
FORM f_get_local_data.
DATA:lv_filnam TYPE string. "File name
lv_filnam = p_infile.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_filnam
filetype = 'ASC'
has_field_separator = ' '
TABLES
data_tab = it_infile
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR v_count_infile.
DESCRIBE TABLE it_infile LINES v_count_infile.
Determine if input file has data
IF v_count_infile EQ 0.
MESSAGE a001(zfi).
EXIT.
ELSE.
CONCATENATE 'Number of records read from input file '(002)
p_infile
': ' INTO v_text.
WRITE: / v_text, v_count_infile LEFT-JUSTIFIED.
ENDIF.
ENDFORM. " f_get_local_data
&----
*& Form F_GET_INPUT_DATA
&----
Getting the data from apllication server
----
FORM f_get_input_data.
DATA: lv_filnam LIKE filename-fileextern."File name
lv_filnam = p_infile.
Opening Dataset
OPEN DATASET lv_filnam FOR INPUT IN TEXT MODE.
Read legacy input file into internal table for furthing processing
DO.
CLEAR it_infile.
READ DATASET p_infile INTO it_infile.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ADD 1 TO v_count_infile.
ENDDO.
Determine if input file has data
IF v_count_infile EQ 0.
MESSAGE a001(zfi).
EXIT.
ELSE.
CONCATENATE 'Number of records read from input file '(002)
p_infile
': ' INTO v_text.
WRITE: / v_text, v_count_infile LEFT-JUSTIFIED.
EXIT.
ENDIF.
closing dataset
CLOSE DATASET lv_filnam.
ENDFORM.
*&----
*& Form f_populate_data
*&----
Populate data
*----
FORM f_populate_data.
CLEAR: x_infile,it_success,v_suc_rec.
refresh it_success.
SORT it_infile BY tax_id_no invoice_no.
LOOP AT it_infile.
x_infile = it_infile.
AT NEW invoice_no.
Populate header data
PERFORM f_populate_head_data.
Populate vendor header data
PERFORM f_acctpayee_data.
it_curramt-itemno_acc = c_itemno.
it_curramt-amt_doccur = x_infile-inv_header_amt * -1.
it_curramt-currency = x_t001-waers.
APPEND it_curramt.
CLEAR it_curramt.
ENDAT.
Populate Account G/L data
PERFORM f_acctgl_data.
Populate Currency Amount data
PERFORM f_curramt_data.
AT END OF invoice_no.
Call the BAPI to post the document
PERFORM f_call_bapi.
ENDAT.
CLEAR:x_infile.
ENDLOOP.
ENDFORM. " f_populate_data
*&----
*& Form f_populate_head_data
*&----
Populate header data
*----
FORM f_populate_head_data.
x_docheader-bus_act = c_busact.
x_docheader-username = sy-uname.
x_docheader-comp_code = p_bukrs.
x_docheader-doc_date = x_infile-invoice_date.
x_docheader-pstng_date = sy-datum.
x_docheader-doc_type = c_doctype.
x_docheader-ref_doc_no = x_infile-invoice_no.
ENDFORM. " f_populate_head_data
*&----
*& Form f_acctpayee_data
*&----
Populate vendor data
*----
FORM f_acctpayee_data.
READ TABLE it_lfa1 WITH KEY stcd2 = x_infile-tax_id_no .
IF sy-subrc = 0.
it_accpy-vendor_no = it_lfa1-lifnr.
ELSE.
READ TABLE it_lfa1 WITH KEY stcd1 = x_infile-tax_id_no .
IF sy-subrc = 0.
it_accpy-vendor_no = it_lfa1-lifnr.
ENDIF.
ENDIF.
it_accpy-itemno_acc = c_itemno.
it_Accpy-item_text = X_infile-INV_DESC.
APPEND it_accpy.
CLEAR it_accpy.
ENDFORM. " f_populate_item_data
*&----
*& Form f_acctgl_data
*&----
Populate Account G/L data
*----
FORM f_acctgl_data.
DATA:l_lgr_id(4) TYPE c. "ledger id
CLEAR l_lgr_id.
it_accgl-itemno_acc = x_infile-inv_line_no + 1.
*Fetching G/L account
READ TABLE it_gl WITH KEY lgcy_system = c_fads
lgcy_prime_acct = x_infile-pri_subacct1
lgcy_sub_acct = x_infile-pri_subacct2.
IF sy-subrc = 0.
it_accgl-gl_account = it_gl-sap_gl_account.
ENDIF.
it_accgl-item_text = x_infile-inv_desc.
CONCATENATE x_infile-ledger_id1 x_infile-ledger_id2 INTO
l_lgr_id.
*Fetching costcenter
READ TABLE it_costctr WITH KEY lgcy_ldgr = l_lgr_id
lgcy_dept = x_infile-dept_win_ldgr.
IF sy-subrc = 0.
it_accgl-costcenter = it_costctr-cost_object.
ENDIF.
it_accgl-tax_code = c_tax_code.
APPEND it_accgl.
CLEAR it_accgl.
ENDFORM. " f_acctgl_data
*&----
*& Form f_curramt_Data
*&----
Populate Currency Amount data
*----
FORM f_curramt_data.
it_curramt-itemno_acc = x_infile-inv_line_no + 1.
it_curramt-amt_doccur = x_infile-inv_line_amt.
it_curramt-currency = x_t001-waers.
APPEND it_curramt.
CLEAR it_curramt.
ENDFORM. " f_curramt_Data
*&----
*& Form F_CALL_BAPI
*&----
Calling BAPI
*----
FORM f_call_bapi.
CLEAR: it_return."it_success
REFRESH: it_return. "it_success
*Creating a posting in Accounting.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = x_docheader
IMPORTING
obj_key = v_objkey
TABLES
accountgl = it_accgl
accountpayable = it_accpy
currencyamount = it_curramt
return = it_return.
IF NOT v_objkey IS INITIAL AND v_objkey NE '$'.
Commit work
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
it_success-docnum = v_objkey+0(10).
it_success-bukrs = v_objkey+10(4).
it_success-fisyr = v_objkey+14(4).
READ TABLE it_return INDEX 1.
IF sy-subrc = 0.
it_success-msg = it_return-message.
ENDIF.
v_suc_rec = v_suc_rec + 1.
APPEND it_success.
CLEAR it_success.
ELSE.
LOOP AT it_return.
IT_ERROR-TAX_ID_NO = X_infile-TAX_ID_NO.
IT_ERROR-INVOICE_NO = X_infile-INVOICE_NO.
it_error-msg = it_return-message.
APPEND it_error.
CLEAR it_error.
Roll back
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDLOOP.
ENDIF.
REFRESH : it_accgl,it_curramt,it_return,it_accpy.
CLEAR : x_docheader,it_accgl, it_curramt,it_return,it_accpy.
ENDFORM. " f_CALL_BAPI
*&----
*& Form f_display_report
*&----
Display error report
*----
FORM f_display_report.
Open the dataset
OPEN DATASET p_err FOR OUTPUT IN TEXT MODE.
IF sy-subrc EQ 0.
LOOP AT it_errors.
Transfer the error records to error file on application server
TRANSFER it_errors TO p_err.
ENDLOOP.
ENDIF.
Closing the dataset
CLOSE DATASET p_err.
IF NOT it_errors[] IS INITIAL.
FORMAT COLOR 1 INTENSIFIED OFF.
SKIP 2.
WRITE:/1(673) 'ERROR REPORT'(H01) CENTERED.
ULINE /1(673).
WRITE:/(4)'S.No'(005),
sy-vline,
(10) 'Tax Id No'(006),
sy-vline,
(12) 'Invoice No'(007),
sy-vline,
(8) 'Rec Type'(008),
sy-vline,
(6) 'Seq No'(009),
sy-vline,
(8) 'Batch No'(010),
sy-vline,
(8) 'UserID'(011),
sy-vline,
(8) 'NU1'(012),
sy-vline,
(11) 'Inv Amt'(013),
sy-vline,
(8) 'Inv Date'(014),
sy-vline,
(10) 'G/L Org ID'(015),
sy-vline,
(4) 'NU4'(012),
sy-vline,
(4) 'NU5'(012),
sy-vline,
(4) 'NU6'(012),
sy-vline,
(4) 'NU7'(012),
sy-vline,
(11) 'NU8'(012),
sy-vline,
(4) 'NU9'(012),
sy-vline,
(10) 'PO No'(016),
sy-vline,
(30) 'Inv Desc'(017),
sy-vline,
(10) 'Voucher No'(018),
sy-vline,
(10) 'Inv LinNo'(019),
sy-vline,
(11) 'Inv Lin Amt'(020),
sy-vline,
(9) 'Led ID-1'(021),
sy-vline,
(9) 'Led ID-2'(022),
sy-vline,
(15) 'Pri Sub Acc-1'(023),
sy-vline,
(15) 'Pri Sub Acc-2'(024),
sy-vline,
(15) 'Dept Win Lgr'(025),
sy-vline,
(5) 'NU2'(012),
sy-vline,
(6) 'NU3'(012),
sy-vline,
(11) 'Dist Amt'(026),
sy-vline,
(8) 'Inv Type'(027),
sy-vline,
(12) 'PO Line No'(028),
sy-vline,
(15) 'Inv Line Amt'(029),
sy-vline,
(5) 'NU10'(012),
sy-vline,
(13) 'NU11'(012),
sy-vline,
(5) 'NU12'(012),
sy-vline,
(6) 'NU13'(012),
sy-vline,
(5) 'NU14'(012),
sy-vline,
(5) 'NU15'(012),
sy-vline,
(200) 'Message'(030),
sy-vline.
FORMAT COLOR 6 INTENSIFIED OFF.
LOOP AT it_errors.
WRITE:/(4) sy-tabix,
sy-vline,
(10) it_errors-TAX_ID_NO,
sy-vline,
(12) it_errors-INVOICE_NO,
sy-vline,
(8) it_errors-RECORD_TYPE,
sy-vline,
(6) it_errors-SEQ_NO,
sy-vline,
(8) it_errors-BATCH_NO,
sy-vline,
(8) it_errors-USERID,
sy-vline,
(8) it_errors-NU1,
sy-vline,
(11) it_errors-INV_HEADER_AMT,
sy-vline,
(8) it_errors-INVOICE_DATE,
sy-vline,
(10) it_errors-GL_ORG_ID,
sy-vline,
(4) it_errors-NU4,
sy-vline,
(4) it_errors-NU5,
sy-vline,
(4) it_errors-NU6,
sy-vline,
(4) it_errors-NU7,
sy-vline,
(11) it_errors-NU8,
sy-vline,
(4) it_errors-NU9,
sy-vline,
(10) it_errors-PONUMBER,
sy-vline,
(30) it_errors-INV_DESC,
sy-vline,
(10) it_errors-VOUCHER_NO,
sy-vline,
(10) it_errors-INV_LINE_NO,
sy-vline,
(11) it_errors-INV_LINE_AMT,
sy-vline,
(9) it_errors-LEDGER_ID1,
sy-vline,
(9) it_errors-LEDGER_ID2,
sy-vline,
(15) it_errors-PRI_SUBACCT1,
sy-vline,
(15) it_errors-PRI_SUBACCT2,
sy-vline,
(15) it_errors-DEPT_WIN_LDGR,
sy-vline,
(5) it_errors-NU2,
sy-vline,
(6) it_errors-NU3,
sy-vline,
(11) it_errors-DIST_AMT,
sy-vline,
(8) it_errors-INV_TYPE,
sy-vline,
(12) it_errors-PO_LINE_NO,
sy-vline,
(15) it_errors-INV_LINE_AMT_D,
sy-vline,
(5) it_errors-NU10,
sy-vline,
(13) it_errors-NU11,
sy-vline,
(5) it_errors-NU12,
sy-vline,
(6) it_errors-NU13,
sy-vline,
(5) it_errors-NU14,
sy-vline,
(5) it_errors-NU15,
sy-vline,
(200) it_errors-msg,
sy-vline.
ENDLOOP.
ULINE /1(673).
ENDIF.
ENDFORM. " f_display_report
&----
*& Form f_select_data
----
Selection of GL, Costcenter, vendor data
----
FORM f_select_data.
DATA:L_dEPT(4) TYPE N. "Legacy department
CLEAR:it_gl, it_costctr, it_lfa1, it_subacct, it_taxid , it_sum.
REFRESH:it_gl, it_costctr, it_lfa1, it_subacct, it_taxid,it_sum.
SORT it_infile BY tax_id_no invoice_no.
*Looping at input file
LOOP AT it_infile.
x_infile = it_infile.
*Summing the invoice line items amount and moving the sum to it_sum
it_sum-tax_id_no = it_infile-tax_id_no.
it_sum-invoice_no = it_infile-invoice_no.
it_sum-sum2 = it_infile-inv_line_amt.
COLLECT it_sum.
CLEAR it_sum.
*Storing Primary Sub Account data
it_subacct-pryact1 = it_infile-pri_subacct1.
it_subacct-pryact2 = it_infile-pri_subacct2.
APPEND it_subacct.
CLEAR it_subacct.
*Storing Ledger ID data
CONCATENATE it_infile-ledger_id1 it_infile-ledger_id2 INTO
it_ledger-lgr_id.
l_dept = it_infile-dept_win_ldgr.
it_ledger-dept = l_dept.
APPEND it_ledger.
CLEAR it_ledger.
*Storing Tax ID data
it_taxid-taxid1 = it_infile-tax_id_no.
it_taxid-taxid2 = it_infile-tax_id_no.
APPEND it_taxid.
CLEAR it_taxid.
condense it_infile-invoice_no.
it_invno-xblnr = it_infile-invoice_no.
append it_invno.
clear it_invno.
ENDLOOP.
SORT it_subacct BY pryact1 pryact2.
SORT it_ledger BY lgr_id dept.
SORT it_taxid BY taxid1 taxid2.
SORT it_sum BY tax_id_no invoice_no.
sort it_invno by xblnr.
DELETE ADJACENT DUPLICATES FROM it_subacct COMPARING pryact1 pryact2.
DELETE ADJACENT DUPLICATES FROM it_ledger COMPARING lgr_id dept.
DELETE ADJACENT DUPLICATES FROM it_taxid COMPARING taxid1 taxid2.
if not it_invno is initial.
select bukrs
belnr
xblnr
into table it_bkpf
from bkpf
for all entries in it_invno
where bukrs = p_bukrs and
gjahr = sy-datum+0(4) and
blart = c_doctype and
xblnr = it_invno-xblnr.
.
endif.
IF NOT it_subacct[] IS INITIAL.
*Selecting G/L Account from General Ledger Z Table
SELECT sap_gl_account
lgcy_system
lgcy_prime_acct
lgcy_sub_acct FROM zfglt_gl_pri_sub
INTO TABLE it_gl
FOR ALL ENTRIES IN it_subacct
WHERE lgcy_system = c_fads AND
lgcy_prime_acct = it_subacct-pryact1 AND
lgcy_sub_acct = it_subacct-pryact2.
IF sy-subrc = 0.
SORT it_gl BY sap_gl_account
lgcy_system
lgcy_prime_acct
lgcy_sub_acct.
ENDIF.
IF NOT it_ledger[] IS INITIAL.
*Selecting cost center from Cost Center Z Table
SELECT cost_object
lgcy_ldgr
lgcy_dept FROM zfcft_ctr_dpt_lg
INTO TABLE it_costctr
FOR ALL ENTRIES IN it_ledger
WHERE lgcy_ldgr = it_ledger-lgr_id AND
lgcy_dept = it_ledger-dept.
IF sy-subrc = 0.
SORT it_costctr BY cost_object
lgcy_ldgr
lgcy_dept.
ENDIF.
ENDIF.
IF NOT it_taxid[] IS INITIAL.
*Selecting vendor no from vendor master data
SELECT a~lifnr
b~bukrs
a~stcd1
a~stcd2
FROM lfa1 as A join lfb1 as B
on alifnr = blifnr
INTO TABLE it_lfa1
FOR ALL ENTRIES IN it_taxid
wHERE bukrs = p_bukrs and
( stcd1 = it_taxid-taxid1 OR
stcd2 = it_taxid-taxid2 ).
ENDIF.
ENDIF.
ENDFORM. " f_select_data
&----
*& Form f_validate_data
&----
Validation of input file data
----
FORM f_validate_data.
DATA:l_errflag TYPE c, "Error flag
l_dept(4) TYPE n, "Department
l_lgr_id(4) TYPE c, "Ledger ID
lv_no_of_vendors TYPE i, "No of vendors
l_sum(11) TYPE p DECIMALS 2, "Sum
lv_msg1(30) TYPE c, "Message
lv_msg2(25) TYPE c, "Message
lv_msg3(6) TYPE c, "Message
lv_msg4(31) TYPE c, "Message
lv_msg5(53) TYPE c, "Message
lv_msg6(30) TYPE c, "Message
lv_msg7(50) TYPE c. "Message
LOOP AT it_infile.
CLEAR:lv_msg1,lv_msg2, lv_msg3,lv_msg4,lv_msg5, lv_msg6, lv_msg7.
CLEAR l_errflag.
SORT it_sum BY tax_id_no
invoice_no.
CLEAR it_subacct.
Validating Primary Sub Acct1 and Acct2.
READ TABLE it_gl WITH KEY lgcy_system = c_fads
lgcy_prime_acct = it_infile-pri_subacct1
lgcy_sub_acct = it_infile-pri_subacct2 .
IF sy-subrc <> 0.
lv_msg1 = 'Primary Sub Acct1 and Acct2'(035).
l_errflag = 'X'.
ENDIF.
MOVE it_infile-dept_win_ldgr TO l_dept.
MOVE l_dept TO it_infile-dept_win_ldgr.
CONCATENATE it_infile-ledger_id1 it_infile-ledger_id2 INTO
l_lgr_id.
CLEAR: it_costctr.
Validating Ledger id & department
READ TABLE it_costctr WITH KEY lgcy_ldgr = l_lgr_id
lgcy_dept = it_infile-dept_win_ldgr.
IF sy-subrc <> 0.
lv_msg2 = 'Ledger id & department'(036).
l_errflag = 'X'.
ENDIF.
Validating Tax ID
CLEAR:it_lfa1.
READ TABLE it_lfa1 WITH KEY stcd2 = it_infile-tax_id_no..
IF sy-subrc <> 0.
READ TABLE it_lfa1 WITH KEY stcd1 = it_infile-tax_id_no..
IF sy-subrc <> 0.
lv_msg3 = 'Tax ID'(041).
l_errflag = 'X'.
ENDIF.
ENDIF.
Checking for no of vendors selected based on tax id. If no of vendors
selected are more than 1 or 0 then error out the record
lv_no_of_vendors = 0.
LOOP AT it_lfa1 WHERE stcd1 = it_infile-tax_id_no OR
stcd2 = it_infile-tax_id_no.
lv_no_of_vendors = lv_no_of_vendors + 1.
ENDLOOP.
IF lv_no_of_vendors = 0.
lv_msg6 = 'No vendor found for TAXID'(037).
l_errflag = 'X'.
ELSEIF lv_no_of_vendors > 1.
lv_msg4 = 'More than one vendor for Tax id'(038).
l_errflag = 'X'.
ENDIF.
Checking whether KU Document already exists for this Invoice No
clear it_invno.
read table it_invno with key xblnr = it_infile-invoice_no.
IF sy-subrc <> 0.
lv_msg7 = 'KU Document already exists for this Invoice No '(042).
l_errflag = 'X'.
ENDIF.
Checking whether the invoice header amt is equal to the line items amt
CLEAR it_sum.
READ TABLE it_sum WITH KEY tax_id_no = it_infile-tax_id_no
invoice_no = it_infile-invoice_no BINARY SEARCH.
CLEAR l_sum.
l_sum = it_infile-inv_header_amt.
IF l_sum <> it_sum-sum2.
lv_msg5 = 'Header amt is not equal to the sum of all line items'(039).
l_errflag = 'X'.
ENDIF.
Moving error records to error internal table
IF l_errflag = 'X'.
MOVE it_infile TO it_errors.
CONCATENATE 'Invalid:'(040) lv_msg1 lv_msg2 lv_msg3 lv_msg4 lv_msg5
lv_msg6 lv_msg7 INTO it_errors-msg SEPARATED BY space.
APPEND it_errors.
CLEAR : it_errors.
Deleting all the errors records from the processing internal table
and moving them to error table
v_err = v_err + 1.
it_infile-error = 'X'.
MODIFY it_infile TRANSPORTING error.
CLEAR it_infile.
ENDIF.
ENDLOOP.
DELETE it_infile WHERE error = 'X'.
Deleting all the line items from the processing internal table where
atleast one line item is error one
sort it_errors by tax_id_no
invoice_no.
clear v_err_rec.
LOOP AT it_errors.
DELETE it_infile WHERE tax_id_no = it_errors-tax_id_no AND
invoice_no = it_errors-invoice_no.
at new invoice_no.
v_err_rec = v_err_rec + 1.
endat.
ENDLOOP.
ENDFORM. " f_validate_data
&----
*& Form f_error_data
&----
Processing error data
----
form f_error_data.
DELETE it_error WHERE msg = 'Error in document: BKPFF $ D01030'(E02).
sort it_error by tax_id_no invoice_no.
loop at it_infile.
x_infile = it_infile.
READ TABLE IT_ERROR WITH KEY TAX_ID_NO = it_INFILE-TAX_ID_NO
INVOICE_NO = it_INFILE-INVOICE_NO binary search.
if sy-subrc = 0.
at new invoice_no.
v_err_rec = v_err_rec + 1.
endat.
MOVE x_INFILE TO IT_ERRORS.
IT_ERRORS-MSG = IT_eRROR-MSG.
APPEND IT_ERRORS.
CLEAR IT_ERRORS.
endif.
endloop.
endform. " f_error_data
&----
*& Form f_display_suc_report
&----
Display success report
----
form f_display_suc_report.
FORMAT COLOR OFF.
FORMAT COLOR 1 INTENSIFIED OFF.
SKIP 2.
WRITE:/1(150) 'SUCCESS REPORT'(S01) CENTERED.
ULINE /1(150).
WRITE:/1 sy-vline,
2 'Doc No'(031),
13 sy-vline,
14 'Company code'(032),
26 sy-vline,
27 'Fiscal Year'(033),
40 sy-vline,
41 'Message'(034),
150 sy-vline.
FORMAT COLOR OFF.
FORMAT COLOR 5 INTENSIFIED OFF.
LOOP AT it_success.
WRITE:/1 sy-vline,
2 it_success-docnum,
13 sy-vline,
14 it_success-bukrs,
26 sy-vline,
27 it_success-fisyr,
40 sy-vline,
41 it_success-msg,
150 sy-vline.
ENDLOOP.
ULINE /1(150).
endform. " f_display_suc_report
‎2005 Nov 08 9:46 AM