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

DFSORT XML query


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

New User


Joined: 27 Jun 2006
Posts: 60

PostPosted: Tue Sep 06, 2011 5:51 pm
Reply with quote

Hi,

My requirement is that I have a XML file which can have the following data

Code:

            <SequenceNum>5</SequenceNum>               


The <SequenceNum> can start at any position in the line. The actual value can have maximum length of 8 bytes.

I want to initialize the SequenceNum value to 1 and increment thereafter.

For example if the input file is : -

Code:

<TransmissionHeader_1000>                                               
    <TransRecordHeader>                                                 
        <SequenceNum>5</SequenceNum>
    </TransRecordHeader>                                                 
    <FileReferenceNum>201202300000113922</FileReferenceNum>             
    <CDFVersionNum>3.00</CDFVersionNum>                                 
    <RunModeIndicator>P</RunModeIndicator>                               
    <ProcessorNum>00000003720</ProcessorNum>                             
    <SchemaVersionNum>10.01.02.00</SchemaVersionNum>                     
</TransmissionHeader_1000>                                               
<IssuerEntity ICANumber="00000000000" IssuerNumber="00600000000">       
    <IssuerInformation_3000>                                             
        <HierarchyRecordHeader>                                         
            <SequenceNum>6</SequenceNum>                               
            <StatusCode>A</StatusCode>                                   
        </HierarchyRecordHeader>                                         


My output should be

Code:

<TransmissionHeader_1000>                                               
    <TransRecordHeader>                                                 
        <SequenceNum>1</SequenceNum>                                   
    </TransRecordHeader>                                                 
    <FileReferenceNum>201202300000113922</FileReferenceNum>             
    <CDFVersionNum>3.00</CDFVersionNum>                                 
    <RunModeIndicator>P</RunModeIndicator>                               
    <ProcessorNum>00000003720</ProcessorNum>                             
    <SchemaVersionNum>10.01.02.00</SchemaVersionNum>                     
</TransmissionHeader_1000>                                               
<IssuerEntity ICANumber="00000000000" IssuerNumber="00600000000">       
    <IssuerInformation_3000>                                             
        <HierarchyRecordHeader>                                         
            <SequenceNum>2</SequenceNum>                                 
            <StatusCode>A</StatusCode>                                   
        </HierarchyRecordHeader>
Back to top
View user's profile Send private message
Frank Yaeger

DFSORT Developer


Joined: 15 Feb 2005
Posts: 7129
Location: San Jose, CA

PostPosted: Wed Sep 07, 2011 2:17 am
Reply with quote

Indrajit_57,

Assuming that <SequenceNum> can start anywhere in the input record, but can be placed starting at position 5 in the output record (since it's freeform), you can use a DFSORT job like the following to do what you asked for:

Code:

//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
<TransmissionHeader_1000>
    <TransRecordHeader>
           <SequenceNum>5</SequenceNum>
    </TransRecordHeader>
    <FileReferenceNum>201202300000113922</FileReferenceNum>
    <CDFVersionNum>3.00</CDFVersionNum>
    <RunModeIndicator>P</RunModeIndicator>
    <ProcessorNum>00000003720</ProcessorNum>
    <SchemaVersionNum>10.01.02.00</SchemaVersionNum>
</TransmissionHeader_1000>
<IssuerEntity ICANumber="00000000000" IssuerNumber="00600000000">
    <IssuerInformation_3000>
        <HierarchyRecordHeader>
               <SequenceNum>6</SequenceNum>
            <StatusCode>A</StatusCode>
        </HierarchyRecordHeader>
//SORTOUT DD SYSOUT=*
//SYSIN DD *
 OPTION COPY
 INREC IFTHEN=(WHEN=(1,80,SS,EQ,C'<SequenceNum>'),
    BUILD=(5:C'<SequenceNum>',SEQNUM,8,FS,C'</SequenceNum>'),
    HIT=NEXT),
  IFTHEN=(WHEN=(5,13,CH,EQ,C'<SequenceNum>'),
    BUILD=(5:5,40,SQZ=(SHIFT=LEFT)))
/*


SORTOUT would have:

Code:

<TransmissionHeader_1000>
    <TransRecordHeader>
    <SequenceNum>1</SequenceNum>
    </TransRecordHeader>
    <FileReferenceNum>201202300000113922</FileReferenceNum>
    <CDFVersionNum>3.00</CDFVersionNum>
    <RunModeIndicator>P</RunModeIndicator>
    <ProcessorNum>00000003720</ProcessorNum>
    <SchemaVersionNum>10.01.02.00</SchemaVersionNum>
</TransmissionHeader_1000>
<IssuerEntity ICANumber="00000000000" IssuerNumber="00600000000">
    <IssuerInformation_3000>
        <HierarchyRecordHeader>
    <SequenceNum>2</SequenceNum>
            <StatusCode>A</StatusCode>
        </HierarchyRecordHeader>
Back to top
View user's profile Send private message
Indrajit_57
Warnings : 1

New User


Joined: 27 Jun 2006
Posts: 60

PostPosted: Thu Sep 08, 2011 11:08 am
Reply with quote

Thanks Frank, it worked perfectly.

I have one question though, is it possible to start the <SequenceNum> from the same position where it was there in the input file?
Back to top
View user's profile Send private message
Frank Yaeger

DFSORT Developer


Joined: 15 Feb 2005
Posts: 7129
Location: San Jose, CA

PostPosted: Fri Sep 09, 2011 4:24 am
Reply with quote

Kolusu and I came up with the following way to do that with DFSORT. We assumed that your input file has RECFM=FB and LRECL=80, and that you don't have a " (quote) in position 1 in any of your input records.

Code:

//S1 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
<TransmissionHeader_1000>
    <TransRecordHeader>
           <SequenceNum>5</SequenceNum>
    </TransRecordHeader>
    <FileReferenceNum>201202300000113922</FileReferenceNum>
    <CDFVersionNum>3.00</CDFVersionNum>
    <RunModeIndicator>P</RunModeIndicator>
    <ProcessorNum>00000003720</ProcessorNum>
    <SchemaVersionNum>10.01.02.00</SchemaVersionNum>
</TransmissionHeader_1000>
<IssuerEntity ICANumber="00000000000" IssuerNumber="00600000000">
    <IssuerInformation_3000>
        <HierarchyRecordHeader>
               <SequenceNum>6</SequenceNum>
            <StatusCode>A</StatusCode>
        </HierarchyRecordHeader>
//SORTOUT DD SYSOUT=*
//SYSIN DD *
 OPTION COPY                                                     
 INREC IFOUTLEN=80,                                               
  IFTHEN=(WHEN=(1,80,SS,EQ,C'<SequenceNum>'),                     
    BUILD=(C'"',1,80),HIT=NEXT),                                 
  IFTHEN=(WHEN=(1,1,CH,EQ,C'"'),                                 
    FINDREP=(SHIFT=NO,IN=C'<SequenceNum>',                       
       OUT=C'<SequenceNum>"                      '),HIT=NEXT),   
  IFTHEN=(WHEN=(1,1,CH,EQ,C'"'),                                 
      OVERLAY=(82:SEQNUM,8,FS,C'</SequenceNum>',                 
        1:1,104,SQZ=(SHIFT=LEFT,PAIR=QUOTE)),HIT=NEXT),           
  IFTHEN=(WHEN=(1,1,CH,EQ,C'"'),                                 
    FINDREP=(IN=C'"',OUT=C''))                                   
/*

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 Modifying Date Format Using DFSORT DFSORT/ICETOOL 9
No new posts Replace Multiple Field values to Othe... DFSORT/ICETOOL 12
No new posts Calling DFSORT from Cobol, using OUTF... DFSORT/ICETOOL 5
No new posts RC query -Time column CA Products 3
No new posts DFsort help with SUM() DFSORT/ICETOOL 12
Search our Forums:

Back to Top