IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

Issue with variable length fields


IBM Mainframe Forums -> DFSORT/ICETOOL
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Thu Feb 07, 2013 4:05 pm
Reply with quote

Hello,

I know that many questions have been asked about variables length fields in this forum, but I didn't find (or understand) the answer to my problem.

I want to change some records in some JCL.

I have a flat file, which is FBA LRECL 81.

Snipet in ISPF VIEW:
Code:
V//FSI21B50 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21B5'                     
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -   171 Line(s) not Displayed
V//FSI21301 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21301',COND=(4,LT)         
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -   106 Line(s) not Displayed
V//FSI21351 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21351',COND=(4,LT)         
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -   122 Line(s) not Displayed
V//FSI21401 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21401',COND=(4,LT)         
-  -  -  -  -  -  -  -  -  -  -  -  -  -  -   124 Line(s) not Displayed
V//FSI21451 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21451',COND=(4,LT)         


I want to replace for example :
Code:
V//FSI21B50 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21B5' 
V//FSI21301 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21301',COND=(4,LT)

by
Code:
V//FSI21B50 EXEC DSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21B5 
V//FSI21301 EXEC DSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21301,COND=(4,LT)

I tried this with ICETOOL :
Code:
//TOOLIN   DD *                                           
  COPY FROM(IN)   TO(TMP1) USING(CPY1)                     
//CPY1CNTL DD *                                           
  INCLUDE COND=(1,80,SS,EQ,C'EXEC DSNUPROC')               
  INREC IFTHEN=(WHEN=(1,80,SS,EQ,C'EXEC DSNUPROC'),       
    PARSE=(%00=(ABSPOS=1,ENDBEFR=C',',FIXLEN=40),         
           %01=(STARTAFT=X'7D',ENDBEFR=C',',FIXLEN=40),   
           %02=(ENDBEFR=X'7D',FIXLEN=40),                 
           %03=(ENDAT=BLANKS,FIXLEN=40)),                 
    BUILD=(%00,SQZ=(SHIFT=LEFT,MID=C' ',TRAIL=C',SYSTEM='),
           %01,SQZ=(SHIFT=LEFT,MID=C' ',TRAIL=C',UID='),   
           %02,SQZ=(SHIFT=LEFT,MID=C' '),                 
           %03))                                           

But extra space is always between my parsed fileds :
Code:
EDIT       A500SS.JOB18424.TMP1                            Columns 00001 00072
Command ===>                                                  Scroll ===> CSR 
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2----+----3----+----4----
000116 V//FSI21B50 EXEC DSNUPROC,SYSTEM=       %SYSTDB2.,UID=                          FSI21B5   
000117 V//FSI21301 EXEC DSNUPROC,SYSTEM=       %SYSTDB2.,UID=                          FSI21301                                ,COND=(4,LT)


Some help would be great !

Thank you.
Back to top
View user's profile Send private message
Bill Woodger

Moderator Emeritus


Joined: 09 Mar 2011
Posts: 7309
Location: Inside the Matrix

PostPosted: Thu Feb 07, 2013 4:32 pm
Reply with quote

Well, did you try SQZ on the whole record? PARSE fields are always a fixed length, you have got the data squeezed to the left, but will always have trailing blanks.
Back to top
View user's profile Send private message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Thu Feb 07, 2013 6:09 pm
Reply with quote

Thank you for reading.

Yes I tried to add
Code:
OUTREC BUILD=(1,160,SQZ=(SHIFT=LEFT,MID=C' '))

But it remains two extra blanks (after SYSTEM= and UID=)
Code:
EDIT       A500SS.JOB18499.TMP1                            Columns 00001 00072
Command ===>                                                  Scroll ===> CSR
000116 V//FSI21B50 EXEC DSNUPROC,SYSTEM= %SYSTDB2.,UID= FSI21B5               
000117 V//FSI21301 EXEC DSNUPROC,SYSTEM= %SYSTDB2.,UID= FSI21301 ,COND=(4,LT)

If I try to add
Code:
OUTREC BUILD=(1,160,SQZ=(SHIFT=LEFT))

I'm missing important blanks !
Code:
EDIT       A500SS.JOB18504.TMP1                            Columns 00001 00072
Command ===>                                                  Scroll ===> CSR 
000116 V//FSI21B50EXECDSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21B5                   
000117 V//FSI21301EXECDSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21301,COND=(4,LT)       


Thank you.
Back to top
View user's profile Send private message
bodatrinadh

Active User


Joined: 05 Jan 2007
Posts: 101
Location: chennai (India)

PostPosted: Thu Feb 07, 2013 8:39 pm
Reply with quote

Hi manuwankenobi,

I added "OUTREC FIELDS=(IN=C' ',OUT=C'',STARTPOS=34) " to your code and got the output...

Code:

//*                                                                     
//S05S EXEC PGM=ICETOOL                                                 
//SYSPRINT DD SYSOUT=*                                                 
//SYSOUT   DD SYSOUT=*                                                 
//TOOLMSG DD SYSOUT=*                                                   
//DFSMSG  DD SYSOUT=*                                                   
//IN DD *                                                               
V//FSI21B50 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21B5'                     
V//FSI21301 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21301',COND=(4,LT)         
//TMP1 DD SYSOUT=*                                                     
//TOOLIN   DD *                                                         
    COPY FROM(IN)   TO(TMP1) USING(CPY1)                               
//CPY1CNTL DD *                                                         
    INCLUDE COND=(1,80,SS,EQ,C'EXEC DSNUPROC')                         
    INREC IFTHEN=(WHEN=(1,80,SS,EQ,C'EXEC DSNUPROC'),                   
      PARSE=(%00=(ABSPOS=1,ENDBEFR=C',',FIXLEN=40),                     
             %01=(STARTAFT=X'7D',ENDBEFR=C',',FIXLEN=40),               
             %02=(ENDBEFR=X'7D',FIXLEN=40),                             
             %03=(ENDAT=BLANKS,FIXLEN=40)),                             
      BUILD=(%00,SQZ=(SHIFT=LEFT,MID=C' ',TRAIL=C',SYSTEM='),           
             %01,SQZ=(SHIFT=LEFT,MID=C' ',TRAIL=C',UID='),             
             %02,SQZ=(SHIFT=LEFT,MID=C' '),                             
             %03))                                                     
    OUTREC FIELDS=(IN=C' ',OUT=C'',STARTPOS=34)                         


Output:-

Code:

V//FSI21B50 EXEC DSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21B5                   
V//FSI21301 EXEC DSNUPROC,SYSTEM=%SYSTDB2.,UID=FSI21301,COND=(4,LT)       


Thanks,
-3nadh
Back to top
View user's profile Send private message
bodatrinadh

Active User


Joined: 05 Jan 2007
Posts: 101
Location: chennai (India)

PostPosted: Fri Feb 08, 2013 5:54 am
Reply with quote

Sorry for the wrong syntax in my previous post. It should be

Code:

OUTREC FINDREP=(IN=C' ',OUT=C'',STARTPOS=34)     


Thanks
-3nadh
Back to top
View user's profile Send private message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Fri Feb 08, 2013 4:34 pm
Reply with quote

Hello,

With your help the job is now OK.

Thank you Bill, thnak you bodatrinadh.

Bye !
Back to top
View user's profile Send private message
Skolusu

Senior Member


Joined: 07 Dec 2007
Posts: 2205
Location: San Jose

PostPosted: Sat Feb 09, 2013 2:31 am
Reply with quote

Unless I am missing something here , isn't it easy with 2 FINDREP statements? get rid of the quote in first findrep and then use another findrep to replace PARM=%SYSTDB2., with SYSTEM=%SYSTDB2.,UID=
Code:

//STEP0100 EXEC PGM=SORT                                       
//SYSOUT   DD SYSOUT=*                                         
//SORTIN   DD *                                                 
V//FSI21B50 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21B5'             
V//FSI21301 EXEC DSNUPROC,PARM='%SYSTDB2.,FSI21301',COND=(4,LT)
//SORTOUT  DD SYSOUT=*                                         
//SYSIN    DD *                                                 
  OPTION COPY                                                   
  INREC FINDREP=(IN=C'''',OUT=C'')                             
  OUTREC FINDREP=(IN=C'PARM=%SYSTDB2.,',                       
                 OUT=C'SYSTEM=%SYSTDB2.,UID=')                 
//*
Back to top
View user's profile Send private message
manuwankenobi

New User


Joined: 02 Mar 2006
Posts: 32
Location: FRANCE

PostPosted: Sat Feb 09, 2013 11:39 am
Reply with quote

Hello Skolusu,

I don't think so, because it is not always "%systdb2" that is in the file, it could be "blahblah" !
I think I really need to get variable length fields.

Thank you.
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> DFSORT/ICETOOL

 


Similar Topics
Topic Forum Replies
No new posts Store the data for fixed length COBOL Programming 1
No new posts How to split large record length file... DFSORT/ICETOOL 10
No new posts PARSE Syntax for not fix length word ... JCL & VSAM 7
No new posts Extracting Variable decimal numbers f... DFSORT/ICETOOL 17
No new posts SFTP Issue - destination file record ... All Other Mainframe Topics 2
Search our Forums:

Back to Top