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: 

READ THE PIPE DELIMITER FILE

Former Member
0 Kudos

Hi guys,

I am uploading the data from a file which is in the application server and in pipe delimiter format.

This file in the format like .... let us take 100 records among those one record is header, 98 data records and one trailer record. These are seperated by the record locater like header with 0, data record with 1 and trailer with 9.

So what i am doing is uploading that file first of all into one internal table I_ARFILE, then splitting the data at pipe into 3 different internal tables. In the mean time I am doing the validations also for the number of records...

like there should not be more than one header, and one trailer........

here I am pasting my code.....

IF l_subrc = 0.

LOOP AT I_ARFILE.

READ TABLE I_ARFILE INTO WA_ARFILE.

SPLIT WA_ARFILE AT C_PIPE INTO WA_ARHEADER-P_RECTYPE

WA_ARHEADER-P_PRCID

WA_ARHEADER-P_SENDR

WA_ARHEADER-P_CDATE

WA_ARHEADER-P_CTIME

WA_ARHEADER-P_OBTYP

WA_ARHEADER-P_SEQNO

WA_ARHEADER-P_FRTXT.

IF WA_ARHEADER-P_RECTYPE = 0.

APPEND WA_ARHEADER TO I_ARHEADER.

DESCRIBE TABLE I_ARHEADER LINES V_ITABLINES.

  • VALIDATION FOR NUMBER OF HEADER RECORDS

IF V_ITABLINES <> 1.

MESSAGE 'NUMBER OF LINES READ ARE NOT SAME' TYPE 'E'.

LEAVE PROGRAM.

ENDIF.

CLEAR V_ITABLINES.

ELSE.

SPLIT I_ARFILE AT C_PIPE

INTO WA_ARITEM-P_RECTYPE

WA_ARITEM-p_xblnr

WA_ARITEM-p_bldat

WA_ARITEM-p_budat

WA_ARITEM-p_blart

WA_ARITEM-p_awkey

WA_ARITEM-p_kunnr

WA_ARITEM-p_xref1

WA_ARITEM-p_xref2

WA_ARITEM-p_xref3

WA_ARITEM-p_wrbtr

WA_ARITEM-p_zterm

WA_ARITEM-p_zuonr

WA_ARITEM-p_rstgr

WA_ARITEM-p_wskto

WA_ARITEM-p_sgtxt.

IF WA_ARITEM-P_RECTYPE = 1.

APPEND WA_ARITEM TO I_ARITEM.

  • ENDIF.

  • VALIDAITON FOR THE NUMBER OF DATA RECORDS.

DESCRIBE TABLE I_ARITEM LINES V_ITABLINES.

DESCRIBE TABLE I_ARFILE LINES V_ITABLINES1.

V_ITABLINES1 = V_ITABLINES1 - 2.

IF V_ITABLINES1 <> V_ITABLINES.

MESSAGE 'NUMBER OF LINES READ ARE NOT SAME' TYPE 'E'.

LEAVE PROGRAM.

ENDIF.

LOOP AT I_ARITEM.

V_BAL1 = V_BAL1 + I_ARITEM-P_WRBTR.

V_DIS = V_DIS + I_ARITEM-P_WSKTO.

ENDLOOP.

  • CHECKING THE SUM OF THE BALANCE AMOUNT OF ALL THE RECORDS AND BALANCE AMOUNT IN TRAILER RECORD

IF V_BAL1 <> WA_ARTRAILER-TOBAL.

MESSAGE 'TOTAL AMOUNT IS NOT EQUAL TO THE SUM OF ALL THE AMOUNTS' TYPE 'E'.

ELSE.

  • CHECKING THE SUM OF THE DISCOUNT AMOUNT OF ALL THE RECORDS AND BALANCE AMOUNT IN TRAILER RECORD

IF V_DIS <> WA_ARTRAILER-TODIS.

MESSAGE 'TOTAL DISCOUNT AMOUNT IS NOT EQUAL TO THE SUM OF ALL THE DISCOUNT AMOUNTS' TYPE 'E'.

ENDIF.

CLEAR V_BAL1.

  • APPEND WA_ARITEM TO I_ARITEM.

CLEAR WA_ARITEM.

  • CLEAR WA_ARFILE.

CLEAR V_ITABLINES.

CLEAR V_ITABLINES1.

  • ENDIF.

  • ENDLOOP.

  • ENDLOOP.

  • ENDIF.

ELSE.

  • READ TABLE I_ARFILE INTO WA_ARFILE INDEX V_ITABLINES.

SPLIT WA_ARFILE AT C_PIPE INTO WA_ARTRAILER-P_RECTYPE

WA_ARTRAILER-COUNT

WA_ARTRAILER-TOBAL

WA_ARTRAILER-TODIS.

IF WA_ARTRAILER-P_RECTYPE = 9.

APPEND WA_ARTRAILER TO I_ARTRAILER.

ENDIF.

DESCRIBE TABLE I_ARTRAILER LINES V_ITABLINES.

IF V_ITABLINES <> 1.

MESSAGE 'NUMBER OF LINES READ ARE NOT SAME' TYPE 'E'.

LEAVE PROGRAM.

ENDIF.

  • CLEAR WA_ARFILE.

CLEAR V_ITABLINES.

ENDIF.

*CLEAR WA_ARFILE.

CLEAR V_ITABLINES.

CLEAR V_ITABLINES1.

ENDIF.

ENDLOOP.

In this code something wrong like....

I have to modify this code so that i can split the file based on the record indicator to different internal tables.

if you see my code I am going wrong after i split the data into header internal table... did the validations then I put the else condition and split the same record again into 2nd internal table. But I have to take the second record once the first one is filled..........

Can any one guide me how to do that plz...... I am bit confused with this

SRI

.

1 ACCEPTED SOLUTION

former_member194669
Active Contributor
0 Kudos

Hi,

I changed the code little bit , please check whether it will suit your needs



DO.
READ TABLE I_ARFILE INTO WA_ARFILE INDEX 1.
IF SY-SUBRC EQ 0.
 SPLIT WA_ARFILE AT C_PIPE INTO WA_ARHEADER-P_RECTYPE
 WA_ARHEADER-P_PRCID
 WA_ARHEADER-P_SENDR
 WA_ARHEADER-P_CDATE
 WA_ARHEADER-P_CTIME
 WA_ARHEADER-P_OBTYP
 WA_ARHEADER-P_SEQNO
 WA_ARHEADER-P_FRTXT.
 IF WA_ARHEADER-P_RECTYPE EQ 0.
  APPEND WA_ARHEADER TO I_HEADER.
  DELETE I_ARFILE INDEX 1. 
 ELSE.
  EXIT.
 ENDIF.
ENDDO.


LOOP AT I_ARFILE INTO WA_ARFILE.
 SPLIT I_ARFILE AT C_PIPE
 INTO WA_ARITEM-P_RECTYPE
 WA_ARITEM-p_xblnr 
 WA_ARITEM-p_bldat
 WA_ARITEM-p_budat
 WA_ARITEM-p_blart
 WA_ARITEM-p_awkey
 WA_ARITEM-p_kunnr
 WA_ARITEM-p_xref1
 WA_ARITEM-p_xref2
 WA_ARITEM-p_xref3
 WA_ARITEM-p_wrbtr
 WA_ARITEM-p_zterm
 WA_ARITEM-p_zuonr
 WA_ARITEM-p_rstgr
 WA_ARITEM-p_wskto
 WA_ARITEM-p_sgtxt.
 IF WA_ARITEM-P_RECTYPE NE 9.
   APPEND WA_ARITEM TO I_ITEM.
   DELETE I_ARFILE INDEX SY-TABIX.
 ENDIF.
ENDLOOP.

* HERE BALANCE ENTRIES WILL BE TRAILER
LOOP AT I_ARFILE INTO WA_ARFILE.
 SPLIT WA_ARFILE AT C_PIPE INTO WA_ARTRAILER-P_RECTYPE
 WA_ARTRAILER-COUNT
 WA_ARTRAILER-TOBAL
 WA_ARTRAILER-TODIS.
  APPEND WA_ARTRAILER TO I_TRAILER.
ENDLOOP

aRs

6 REPLIES 6

Former Member
0 Kudos

what I think...

first of all you should check the type of record..

then split it in to various type of records..

Record indicator might be of 1 char...

so check IF WA_ARFILE+0(1) EQ 0, then header record... else... ...

You can set the counter for various type of records.

Regards

Prax

0 Kudos

Prax,

Ur idea make sense to me

can you explain bit clearly.... plz

SRI

Former Member
0 Kudos

HI,

first loop at i_arfile.. and split all the records and take them into internal table say itab..

then take a temporary internal table say jtab same as i tab.

jtab[] = itab[].

delete jtab where rectype eq 1." delete recrods for items

delte jtab where rectype eq 9. " delete trailer

now say describe table jtab and see if there is only one header line.

you can repeate the same for trailer.

Thanks,

Mahesh

former_member194669
Active Contributor
0 Kudos

Hi,

Please check , first you need to split the file and move header, item, trailer , then using these internal tables do your validations


DESCRIBE TABLE I_ARFILE LINES V_LIN

READ TABLE I_ARFILE INTO WA_ARFILE INDEX 1.
IF SY-SUBRC EQ 0.
 SPLIT WA_ARFILE AT C_PIPE INTO WA_ARHEADER-P_RECTYPE
 WA_ARHEADER-P_PRCID
 WA_ARHEADER-P_SENDR
 WA_ARHEADER-P_CDATE
 WA_ARHEADER-P_CTIME
 WA_ARHEADER-P_OBTYP
 WA_ARHEADER-P_SEQNO
 WA_ARHEADER-P_FRTXT.
 APPEND WA_ARHEADER TO I_HEADER.
ENDIF.

READ TABLE I_ARFILE INTO WA_ARFILE INDEX v_LIN.
IF SY-SUBRC EQ 0.
SPLIT WA_ARFILE AT C_PIPE INTO WA_ARTRAILER-P_RECTYPE
WA_ARTRAILER-COUNT
WA_ARTRAILER-TOBAL
WA_ARTRAILER-TODIS.
 APPEND WA_ARTRAILER TO I_TRAILER.
ENDIF.

* FIRST DELETE TRAILER THEN GO FOR HEADER
READ TABLE I_ARFILE INTO WA_ARFILE INDEX V_LIN.
DELETE I_ARFILE INDEX SY-TABIX

READ TABLE I_ARFILE INTO WA_ARFILE INDEX 1.
DELETE I_ARFILE INDEX SY-TABIX.


LOOP AT I_ARFILE INTO WA_ARFILE.
SPLIT I_ARFILE AT C_PIPE
INTO WA_ARITEM-P_RECTYPE
WA_ARITEM-p_xblnr
WA_ARITEM-p_bldat
WA_ARITEM-p_budat
WA_ARITEM-p_blart
WA_ARITEM-p_awkey
WA_ARITEM-p_kunnr
WA_ARITEM-p_xref1
WA_ARITEM-p_xref2
WA_ARITEM-p_xref3
WA_ARITEM-p_wrbtr
WA_ARITEM-p_zterm
WA_ARITEM-p_zuonr
WA_ARITEM-p_rstgr
WA_ARITEM-p_wskto
WA_ARITEM-p_sgtxt.
APPEND WA_ARITEM TO I_ITEM.
ENDLOOP.

aRs

0 Kudos

aRs,

I can't go with the index because I am assuming file structure is like what i said above ... if it is not like that then...?

like if there would be 2 headers, or 2 trailers ?

that y i am doing validations....

And not only that, I am asked to remove so many loops from the performance point of view

Can u guide me further how to modify that code in a better way.........

SRI

former_member194669
Active Contributor
0 Kudos

Hi,

I changed the code little bit , please check whether it will suit your needs



DO.
READ TABLE I_ARFILE INTO WA_ARFILE INDEX 1.
IF SY-SUBRC EQ 0.
 SPLIT WA_ARFILE AT C_PIPE INTO WA_ARHEADER-P_RECTYPE
 WA_ARHEADER-P_PRCID
 WA_ARHEADER-P_SENDR
 WA_ARHEADER-P_CDATE
 WA_ARHEADER-P_CTIME
 WA_ARHEADER-P_OBTYP
 WA_ARHEADER-P_SEQNO
 WA_ARHEADER-P_FRTXT.
 IF WA_ARHEADER-P_RECTYPE EQ 0.
  APPEND WA_ARHEADER TO I_HEADER.
  DELETE I_ARFILE INDEX 1. 
 ELSE.
  EXIT.
 ENDIF.
ENDDO.


LOOP AT I_ARFILE INTO WA_ARFILE.
 SPLIT I_ARFILE AT C_PIPE
 INTO WA_ARITEM-P_RECTYPE
 WA_ARITEM-p_xblnr 
 WA_ARITEM-p_bldat
 WA_ARITEM-p_budat
 WA_ARITEM-p_blart
 WA_ARITEM-p_awkey
 WA_ARITEM-p_kunnr
 WA_ARITEM-p_xref1
 WA_ARITEM-p_xref2
 WA_ARITEM-p_xref3
 WA_ARITEM-p_wrbtr
 WA_ARITEM-p_zterm
 WA_ARITEM-p_zuonr
 WA_ARITEM-p_rstgr
 WA_ARITEM-p_wskto
 WA_ARITEM-p_sgtxt.
 IF WA_ARITEM-P_RECTYPE NE 9.
   APPEND WA_ARITEM TO I_ITEM.
   DELETE I_ARFILE INDEX SY-TABIX.
 ENDIF.
ENDLOOP.

* HERE BALANCE ENTRIES WILL BE TRAILER
LOOP AT I_ARFILE INTO WA_ARFILE.
 SPLIT WA_ARFILE AT C_PIPE INTO WA_ARTRAILER-P_RECTYPE
 WA_ARTRAILER-COUNT
 WA_ARTRAILER-TOBAL
 WA_ARTRAILER-TODIS.
  APPEND WA_ARTRAILER TO I_TRAILER.
ENDLOOP

aRs