Menu

#20 JRecord -- parser throwing exception for variable length record feed file

v1.0_(example)
open
1
2021-11-30
2021-11-26
Anonymous
No

Hi Bruce, please assist on the below , I m using IOBuilder from Jrecord to read the copybook that consists of the variable length reader and I m getting the following exception:

My java program :

ICobolIOBuilder iob =
            JRecordInterface1.COBOL.newIOBuilder("copybook.cob")
                .setDialect(ICopybookDialects.FMT_MAINFRAME).setFont("cp037")
                .setCopybookFileFormat(Cb2xmlConstants.FREE_FORMAT)
                .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL).setFileOrganization(Constants.IO_VB);


       AbstractLineReader reader = iob.newReader("Jrecorder_Full_Binary_Data_VBFormat.bin");

My copy Book :

05  *TAP-TRANSACTION-LINE-ITEM-COUNT*    PIC  9(2).
05  TAP-TRANSACTION-TAX-ON-FEES      PIC    S9(7)V99 COMP-3.     
05  FILLER                    PIC    X(234).     
05  FILLER                    PIC    X(229).                                                   
05  TAP-LINE-ITEM OCCURS 0 TO 100 TIMES 
                       DEPENDING ON *TAP-TRANSACTION-LINE-ITEM-COUNT*.
         10  TAP-LINE-ITEM-DEPT      PIC  9(3)     COMP-3.

Exception :

~~~
Caused by: java.lang.RuntimeException: Error With Occurs Depending On Field: TAP-TRAN-LINE-ITEM-COUNT
at net.sf.JRecord.External.Def.DependingOn.updateField(DependingOn.java:278)
at net.sf.JRecord.Details.RecordDetail.setDependingOn(RecordDetail.java:1322)
at net.sf.JRecord.External.ExternalRecord.toRecordDetail(ExternalRecord.java:722)
at net.sf.JRecord.External.ExternalRecord.asLayoutDetail(ExternalRecord.java:600)
at net.sf.JRecord.IO.builders.IOBuilderBase.getLayout(IOBuilderBase.java:515)
at net.sf.JRecord.IO.builders.IOBuilderBase.newReader(IOBuilderBase.java:256)
at net.sf.JRecord.IO.builders.IOBuilderBase.newReader(IOBuilderBase.java:248)
at com.macys.sabrecreditmanagement.SCMApplication.main(SCMApplication.java:31)
... 5 more

~~~

Discussion

  • Bruce Martin

    Bruce Martin - 2021-11-26
    • Description has changed:

    Diff:

    --- old
    +++ new
    @@ -2,18 +2,21 @@
    
     My java program : 
    
    +~~~java
     ICobolIOBuilder iob =
                 JRecordInterface1.COBOL.newIOBuilder("copybook.cob")
                     .setDialect(ICopybookDialects.FMT_MAINFRAME).setFont("cp037")
                     .setCopybookFileFormat(Cb2xmlConstants.FREE_FORMAT)
                     .setSplitCopybook(CopybookLoader.SPLIT_01_LEVEL).setFileOrganization(Constants.IO_VB);
    -        
    
    
            AbstractLineReader reader = iob.newReader("Jrecorder_Full_Binary_Data_VBFormat.bin");
    +         
    +~~~
    +      
    +### My copy Book : 
    
    -       My copy Book : 
    -       -----------------
    +~~~cobol
    
     05  *TAP-TRANSACTION-LINE-ITEM-COUNT*    PIC  9(2).
     05  TAP-TRANSACTION-TAX-ON-FEES      PIC    S9(7)V99 COMP-3.     
    @@ -23,8 +26,11 @@
                           DEPENDING ON *TAP-TRANSACTION-LINE-ITEM-COUNT*.
              10  TAP-LINE-ITEM-DEPT      PIC  9(3)     COMP-3.
    
    -         Exception :
    -         
    +~~~
    +
    +### Exception :
    +
    +~~~
              Caused by: java.lang.RuntimeException: Error With Occurs Depending On Field: TAP-TRAN-LINE-ITEM-COUNT
        at net.sf.JRecord.External.Def.DependingOn.updateField(DependingOn.java:278)
        at net.sf.JRecord.Details.RecordDetail.setDependingOn(RecordDetail.java:1322)
    @@ -35,4 +41,6 @@
        at net.sf.JRecord.IO.builders.IOBuilderBase.newReader(IOBuilderBase.java:248)
        at com.macys.sabrecreditmanagement.SCMApplication.main(SCMApplication.java:31)
        ... 5 more
    +    
    +    ~~~
    
     
  • Bruce Martin

    Bruce Martin - 2021-11-26

    Will look at it,

    is the definition of field TAP-TRANSACTION-LINE-ITEM-COUNT in a separate 01 level to its use in the occurs depending clause. I think I need to full copybook to understand what is going on


    The error occurs because JRecord can not find TAP-TRANSACTION-LINE-ITEM-COUNT in the current Record. Possible causes

    • SPLIT_01_LEVEL means TAP-TRANSACTION-LINE-ITEM-COUNT is in a different record to OCCURS Depending clause.
    • Duplicate field.

    I really need to see the full copybook to understand what is going on

     

    Last edit: Bruce Martin 2021-11-26
  • Anonymous

    Anonymous - 2021-11-29

    Hi Bruce the field name is TAP-TRAN-LINE-ITEM-COUNT :

    my copy book :

     05  TAP-TRAN-BASE-174.                                       
         10  TAP-TRAN-SORT-KEY.                                   
             15  TAP-TRAN-DATE           PIC  9(7)   COMP-3.      
             15  TAP-TRAN-CHG-RUNG-LOC       PIC  9(3)     COMP-3.
             15  TAP-TRAN-CHG-RUNG-LOC-4                          
                 REDEFINES TAP-TRAN-CHG-RUNG-LOC PIC 9(4) COMP.   
             15  TAP-TRAN-TERMINAL       PIC  9(4).               
             15  TAP-TRAN-FULL-SEQUENCE  PIC  9(5).               
             15  FILLER  REDEFINES  TAP-TRAN-FULL-SEQUENCE.         
                 20  TAP-TRAN-HIGH-SEQ-ROLL PIC 9.                
                 20  TAP-TRAN-SEQUENCE   PIC  9(4).               
             15  TAP-TRAN-POST-VOID-FLAG PIC  X.                  
                 88  TAP-TRAN-WAS-POST-VOID       VALUE 'V'.        
             15  TAP-TRAN-VERSION-RPS    PIC  9(2).               
             15  TAP-TRAN-VERSION-RSEQ   PIC  9.                  
         10  TAP-TRAN-RCP-REVERSAL-FLAG  PIC  X.                  
         10  TAP-TRAN-RPI-REVERSAL-FLAG  PIC  X.                  
         10  TAP-TRAN-EXCHANGE           PIC  X.                  
         10  TAP-TRAN-INTL-SCM-DIV       PIC  9(2).               
         10  TAP-TRAN-REAL-DIV-RPS       PIC  9(2).               
         10  TAP-TRAN-INHOUSE-FLAG       PIC  X.                  
             88  TAP-TRAN-WAS-IN-HOUSE    VALUE 'Y' 'M'.            
         10  TAP-TRAN-3RD-PARTY-FLAG     PIC  X.                  
             88  TAP-TRAN-WAS-3RD-PRTY             VALUE 'Y'.       
             88  TAP-TRAN-WAS-DEBIT-CARD           VALUE 'X'.       
         10  TAP-TRAN-INIT-FINAL         PIC  X.                  
             88  TAP-TRAN-WAS-INITIAL              VALUE 'I'.       
             88  TAP-TRAN-WAS-AUDITED              VALUE 'A'.       
             88  TAP-TRAN-WAS-RELEASED             VALUE 'R'.       
             88  TAP-TRAN-WAS-ADJUSTMENT           VALUE 'X'.       
             88  TAP-TRAN-WAS-LATE                 VALUE 'L'.       
         10  TAP-TRAN-TYPE-ORIG          PIC  X.                  
         10  TAP-TRAN-CODE               PIC  9(3).               
             88  TAP-SCM-SALE-CODE                    VALUE  010.   
             88  TAP-SCM-RETN-CODE                    VALUE  110.   
             88  TAP-SCM-SALE-EXCH-CODE               VALUE  011.   
             88  TAP-SCM-RETN-EXCH-CODE               VALUE  111.   
             88  TAP-SCM-PAYMENT-CODE                 VALUE  350. 
             88  TAP-SCM-PMT-DB-CODE                  VALUE  259. 
             88  TAP-SCM-SALE-VOID-CODE               VALUE  899.   
             88  TAP-SCM-RETN-VOID-CODE               VALUE  999.   
         10  TAP-TRAN-ACCT-NUM-INHOUSE   PIC  S9(17)  COMP-3.     
         10  TAP-TRAN-ACCT-TYPE-INHOUSE  PIC  9(2).               
         10  TAP-TRAN-ACCT-NUM-3RD-PRTY  PIC  9(17)   COMP-3.     
         10  TAP-TRAN-ACCT-NUM-3RD-TYPE  PIC  9(2).               
         10  TAP-TRAN-COMMON-TENDER-TYPE REDEFINES                
             TAP-TRAN-ACCT-NUM-3RD-TYPE  PIC  9(2).               
             88  TAP-TRAN-RPE-AMERICAN-EXPRESS VALUE 01.          
             88  TAP-TRAN-RPE-MASTERCARD      VALUE 02.           
             88  TAP-TRAN-RPE-VISA            VALUE 03.           
             88  TAP-TRAN-RPE-DINERS          VALUE 04.           
             88  TAP-TRAN-RPE-DISCOVER        VALUE 06.           
             88  TAP-TRAN-RPE-DEBIT-CARD      VALUE 88.           
         10  TAP-TRAN-ACCT-AMT-INHOUSE   PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-ACCT-AMT-3RD-PRTY  PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-COMP-AMT           PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-TAX                PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-GIFT-CERT          PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-ASSOC-DISC-AMT     PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-DEPOSIT-AMT-FOR-SCM PIC S9(7)V99 COMP-3.    
         10  TAP-TRAN-FEES               PIC  S9(7)V99 COMP-3.    
         10  TAP-TRAN-RUNG-LOC       PIC  9(3)   COMP-3.          
         10  TAP-TRAN-RUNG-LOC-4 REDEFINES TAP-TRAN-RUNG-LOC        
                                     PIC  9(4)   COMP.              
         10  TAP-TRAN-ORIG-REG-TRANS     PIC  9(9)     COMP-3.    
         10  TAP-TRAN-TIME               PIC  9(6)     COMP-3.    
         10  TAP-TRAN-SALES-PERSON       PIC  9(9)     COMP.      
         10  TAP-TRAN-ORIG-SALES-PERSON  PIC  9(9)     COMP.      
         10  TAP-TRAN-COMMISSION-SLSPRSN PIC  9(9)     COMP.      
         10  TAP-TRAN-AUTHORIZATION      PIC  X(8).               
         10  TAP-TRAN-ASSOC-DISC-PERCENT PIC  S9(2)V999 COMP-3.   
         10  TAP-TRAN-REGISTER-ID        PIC  X(2).               
         10  TAP-TRAN-DEFER-BILL-CODE    PIC  X.                  
         10  TAP-TRAN-RPS-MSR-CODE       PIC  X.                  
         10  TAP-TRAN-SPECIAL-CODE-3     PIC  X.                  
         10  TAP-TRAN-ORIGINAL-SALE-DATE PIC  9(7)    COMP-3.     
         10  TAP-TRAN-COBRAND-IND        PIC  X.                  
         10  TAP-TRAN-SPECIAL-CODE-1     PIC  X.                  
         10  TAP-TRAN-SEND-FLAG-Y        PIC  X.                  
         10  TAP-TRAN-DEFER-OVRD-DATE    PIC  9(7)    COMP-3.     
         10  TAP-TRAN-CRED-REF-NUM       PIC  9(9)    COMP.       
         10  TAP-TRAN-SYS-AFFINITY       PIC  X.                  
         10  TAP-TRAN-SPECIAL-CODE-2     PIC  X.                  
         10  TAP-TRAN-TRUE-RELEASE-CODE  PIC  X.                  
             88  TAP-TRAN-TRUE-INITIAL             VALUE 'I'.       
             88  TAP-TRAN-TRUE-LATE                VALUE 'L'.       
             88  TAP-TRAN-TRUE-AUDITED             VALUE 'A'.       
             88  TAP-TRAN-TRUE-REL-IN-ERROR        VALUE 'E'.       
         10  TAP-TRAN-INVALID-ACCT-FLAG  PIC  X.                  
             88  TAP-TRAN-INVALID-ACCT             VALUE 'Y'.       
             88  TAP-TRAN-INVALID-DIV-ACCT         VALUE 'X'.       
         10  TAP-TRAN-CROSS-SHOPPING-FLAG PIC X.                  
             88  TAP-TRAN-CROSS-SHOPPING           VALUE 'Y'.       
         10  TAP-TRAN-D-FORMAT-DIV-IND-X PIC  X(2).               
         10  TAP-TRAN-D-FORMAT-DIV-IND REDEFINES                    
             TAP-TRAN-D-FORMAT-DIV-IND-X PIC  9(2).               
         10  TAP-TRAN-BYPASS-CREDIT-FLAG PIC  X.                  
         10  TAP-TRAN-PRE-SALE-FLAG      PIC  X.                  
             88  TAP-TRAN-WAS-PRE-SALE             VALUE 'Y'.       
         10  TAP-TRAN-GIFT-REG-RETN-FLAG PIC  X.                  
             88  TAP-TRAN-WAS-GIFT-REG-RETN        VALUE 'Y'.       
         10  TAP-TRAN-ELEC-SIGNATURE-FLAG PIC X.                  
             88  TAP-TRAN-ELEC-SIG-234-YYN-YES     VALUE 'Y'.       
             88  TAP-TRAN-ELEC-NO-RPE90-27         VALUE ' '.       
             88  TAP-TRAN-ELEC-SIG-234-NNN         VALUE 'N'.       
             88  TAP-TRAN-ELEC-SIG-234-YNY         VALUE 'S'.       
             88  TAP-TRAN-ELEC-SIG-234-YYY         VALUE 'T'.       
         10  TAP-TRAN-NO-RECEIPT-FLAG    PIC  X.                  
             88  TAP-TRAN-NO-ORIG-RECEIPT  VALUE 'Y'.                
             88  TAP-TRAN-UNKNOWN-OSD-FLAG VALUE 'Y' 'U'.         
         10  TAP-TRAN-RDS-AUTH-FEEDBACK  PIC  X.                  
         10  TAP-TRAN-REWARD-DEPOSITS    PIC  S9(7)V99 COMP-3.                                                                       
         10  FILLER                      PIC  X(6).    
         10  TAP-TRAN-TRAN-SEQ           PIC  9(2).               
         10  TAP-TRAN-XREF-ACCT-FLAG     PIC  X(1).               
         10  TAP-TRAN-ZIP-CODE           PIC  S9(05) COMP-3.                                                            
         10  TAP-TRAN-LINE-ITEM-COUNT    PIC  9(2).               
     05  TAP-TRAN-STORE-COUPONS      PIC  S9(7)V99 COMP-3.     
     05  FILLER                      PIC  X(1).                 
     05  TAP-TRAN-RPI01-REGISTER-ID  PIC  X(1).                   
         88 TAP-TRAN-RUNG-AT-SMART-POS-REG                        
            VALUE 'S'.                                            
     05  TAP-TRAN-FEE-CODE           PIC  9(2).                   
     05  TAP-TRAN-ORIG-TRANS         PIC  S9(5) COMP-3.           
     05  FILLER                    PIC  X(1).                    
     05  TAP-TRAN-MULTI-TENDER-CNT PIC    9.                      
     05  TAP-TRAN-INPUT-METHOD     PIC X(01).                     
     05  TAP-TRAN-EMV-CVM          PIC X(01).                     
         88  TAP-TRAN-CVM-NON-EMV  VALUE ' '.                     
         88  TAP-TRAN-CVM-NO-CVM   VALUE '0'.                     
         88  TAP-TRAN-CVM-EMV-SIG  VALUE '1'.                     
         88  TAP-TRAN-CVM-ONLINE-PIN VALUE '2'.                   
         88  TAP-TRAN-CVM-OFFLINE-PIN VALUE '3'.                  
         88  TAP-TRAN-CVM-ONLINE-PIN-S VALUE '4'.                 
         88  TAP-TRAN-CVM-OFLINE-PIN-S VALUE '5'.                 
     05  TAP-TRAN-EXP-DATE         PIC X(04).                     
     05  TAP-TRAN-EMV-FALLBACK-CD  PIC X(02).                     
         88  TAP-TRAN-EMV-NOT-FALLBACK  VALUE '  '.               
         88  TAP-TRAN-EMV-TECH-FALLBACK VALUE '30'.               
         88  TAP-TRAN-EMV-MSR-FALLBACK  VALUE '31'.               
     05  TAP-TRAN-EMV-OFFLINE-TRAN PIC X(01).                     
     05  TAP-TRAN-EMV-CAPABLE          PIC X(01).                 
         88  TAP-EMV-CAPABLE           VALUE 'Y'.                 
         88  TAP-NOT-EMV-CAPABLE       VALUE 'N'.                 
     05  TAP-TRAN-EMV-PIN-CAPABLE      PIC X(01).                 
     05  TAP-TRAN-EMV-TERM-CAPABLE     PIC X(01).                 
     05  TAP-TRAN-ICC-DATA         PIC X(120).                    
     05  TAP-TRAN-ICC-DATA-R REDEFINES TAP-TRAN-ICC-DATA.         
         10  TAP-TRAN-ICC-AC            PIC X(08).                
         10  TAP-TRAN-ICC-CID           PIC X(01).                
         10  TAP-TRAN-ICC-IAD-LEN       PIC X(01).                
         10  TAP-TRAN-ICC-IAD           PIC X(32).                
         10  TAP-TRAN-ICC-UNPRDT-NO     PIC X(04).                
         10  TAP-TRAN-ICC-ATC           PIC X(02).                
         10  TAP-TRAN-ICC-TVR           PIC X(05).                
         10  TAP-TRAN-ICC-CARD-SEQ-NO   PIC X(01).                
         10  TAP-TRAN-ICC-TAP-TRAN-DATE PIC X(03).                
         10  TAP-TRAN-ICC-TAP-TRAN-TYPE PIC X(01).                
         10  TAP-TRAN-ICC-AUTHD-AMT     PIC X(06).                
         10  TAP-TRAN-ICC-TAP-TRAN-CURR PIC X(02).                
         10  TAP-TRAN-ICC-AIP           PIC X(02).                
         10  TAP-TRAN-ICC-CAPBLTY-PROF  PIC X(03).                
         10  TAP-TRAN-ICC-FORM-FACTR-IND PIC X(04).               
         10  TAP-TRAN-ICC-SCRIPT-RES    PIC X(21).                
         10  TAP-TRAN-ICC-ISS-AUTH-DATA PIC X(16).                
         10  TAP-TRAN-ICC-TERM-CNTRY    PIC X(02).                
         10  TAP-TRAN-ICC-AMT-OTHER     PIC X(06).                
     05  TAP-TRAN-TICKET-TERM      PIC    X(04).                  
     05  TAP-TRAN-OFFLINE-IND      PIC    X(01).                  
     05  TAP-TRAN-PLAN-TYP70       PIC    X(01).                  
     05  TAP-TRAN-PAYERID-PPL      PIC    X(13).                  
     05  TAP-TRAN-TRANSACTION-ID   PIC    X(17).                  
     05  FILLER                    PIC    X(35).             
     05  TAP-TRAN-COMB-SLSCHK-FLG  PIC    X(01).                  
         88 TAP-TRAN-IS-MIXED-BAG                 VALUE 'Y'.      
     05  TAP-TRAN-TAX-ON-FEES      PIC    S9(7)V99 COMP-3.     
     05  FILLER                    PIC    X(234).     
     05  FILLER                    PIC    X(229).
     05  TAP-TRAN-VARIABLE. 
         10  TAP-LINE-ITEMS. 
             15  TAP-LINE-ITEM-OCCURS OCCURS 0 TO 87 TIMES 
                                       DEPENDING ON TAP-TRAN-LINE-ITEM-COUNT.
                 20  TAP-LINE-ITEM-DEPT      PIC  9(3)     COMP-3.  
                 20  TAP-LINE-ITEM-CLASS     PIC  9(2).             
                 20  TAP-LINE-ITEM-RPS-SEQ   PIC  9(2)     COMP.    
                 20  TAP-LINE-ITEM-QTY       PIC  9(3)     COMP-3.  
                 20  TAP-LINE-ITEM-EXT-AMT   PIC  S9(7)V99 COMP-3.  
                 20  TAP-LINE-ITEM-ORIG-SLSDT PIC 9(7)     COMP-3.  
                 20  TAP-LINE-ITEM-TAX-AMT  PIC S9(7)V9999 COMP-3.  
                 20  TAP-LINE-ITEM-SKU        PIC 9(18)    COMP-3.  
                 20  TAP-LINE-OWN-DIV         PIC X(02).          
                 20  TAP-LINE-OWN-DIV-N REDEFINES                 
                     TAP-LINE-OWN-DIV         PIC 9(02).
    
     
  • Anonymous

    Anonymous - 2021-11-29
        HI Bruce, could you please refer me to any example program in java that is processing feed files(.bin) consuming the copybook (.cob) of  variable length records (occurs depending on).
    
     
  • Bruce Martin

    Bruce Martin - 2021-11-30

    I have done some basic testing and have had no problems. See the attached source code.

    The program logic to create a file and then read it is:

            ICobolIOBuilder iob =
                    JRecordInterface1.COBOL.newIOBuilder(new StringReader(copybook), "odCopybook")
                        .setDialect(ICopybookDialects.FMT_MAINFRAME).setFont("cp037")
                        .setCopybookFileFormat(Cb2xmlConstants.FREE_FORMAT)
                        .setFileOrganization(Constants.IO_VB);
            LayoutDetail layout = iob.getLayout();
            ByteArrayOutputStream os = new ByteArrayOutputStream(layout.getMaximumRecordLength()*2 + 8);
    
            AbstractLineWriter writer = iob.newWriter(os);
            AbstractLine newLine = iob.newLine();
    
            /** Setting the Occurs Depending size, needs to be done before the array is accesed */
            newLine.getFieldValue("TAP-TRAN-LINE-ITEM-COUNT").set(25);
    
            FieldIterator fieldIterator = newLine.getFieldIterator(0);
    
            int idx = 0;
            for (AbstractFieldValue fv : fieldIterator) {
                if ("TAP-TRAN-CHG-RUNG-LOC-4".equalsIgnoreCase(fv.getFieldDetail().getName())
                || "TAP-TRAN-RUNG-LOC-4".equalsIgnoreCase(fv.getFieldDetail().getName())) {
                } else if (fv.isNumeric()) {
                    if ( ! "TAP-TRAN-LINE-ITEM-COUNT".equalsIgnoreCase(fv.getFieldDetail().getName())) {
                        fv.set(idx++ % 10 );
                    }
                } else {
                    fv.set("");
                    //System.out.println(fv.getFieldDetail().getName());
                }
            }
    
            writer.write(newLine);
            writer.write(newLine);
            writer.close();
    
            AbstractLineReader reader = iob.newReader(new ByteArrayInputStream(os.toByteArray()));
    
            AbstractLine line = reader.read();
            fieldIterator = line.getFieldIterator(0);
            for (AbstractFieldValue fv : fieldIterator) {
                if (! "TAP-TRAN-CHG-RUNG-LOC-4".equalsIgnoreCase(fv.getFieldDetail().getName())) {
                    System.out.println(fv.getFieldDetail().getName() + "\t:\t" + fv.asString());
                }
            }
            reader.close();
    

    Potential problems:

    • Make sure the file has been transferred properly from the mainframe (i.e. is ebcdic and has net been corrupted.
    • Make sure the file File organization matches the definition on the mainframe. i.e. is VB on the mainframe
     
  • Anonymous

    Anonymous - 2021-11-30

    Thank you Bruce, its working.

     

Anonymous
Anonymous

Add attachments
Cancel





Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.