Использование JRccord для доступа к схеме COBOL

Я пытаюсь использовать JRecord версии 0.93 для анализа тетради COBOL, чтобы понять отдельные поля, присутствующие в записи. Я новичок в JRecord и изо всех сил пытаюсь выполнить то, что кажется простой задачей.

В файле test.cbl у меня есть это:

      01 RECORD-DATA.
    05 KEY-FIELD PIC X(8).
    05 DATA-FIELD PIC X(72). 

Я надеюсь получить список имен полей, их типов данных и длин.

Я нашел начало примера (здесь https://sourceforge.net/p/jrecord/discussion/678634/thread/176dcea6):

      ICobolSchemaReader reader = CobolSchemaReader.newCobolSchemaReader("test.cbl");
CobolSchemaDetails schemaDetails = reader.getCobolSchemaDetails();

К сожалению, хотя приведенное выше компилируется чисто, похоже, оно не работает:

      java.lang.ClassCastException: net.sf.JRecord.schema.CobolSchemaReader incompatible with net.sf.JRecord.schema.ICobolSchemaReader
    at net.sf.JRecord.schema.CobolSchemaReader.newCobolSchemaReader(CobolSchemaReader.java:272)
    at TestXform.main(TestJReader.java:56)

Кто-нибудь делал подобные вещи раньше? Есть ли лучший подход или примеры в Интернете, на которых я мог бы поучиться?

2 ответа

Попробовав несколько разных вещей, я нашел подход, который, кажется, работает:

       IIOBuilder iob = JRecordInterface1.COBOL
                                   .newIOBuilder("test.cbl")
                                   .setFileOrganization(Constants.IO_FIXED_LENGTH_RECORDS)
                                   .setFont("cp037")
                                   .setDialect(ICopybookDialects.FMT_MAINFRAME);
 LayoutDetail ld = iob.getLayout();             
 String [] fields = ld.getFieldDescriptions(0, 0);
 for (int i = 0; i < fields.length; i++)
 {
    IFieldDetail fd = ld.getField(0, i);
    System.out.println("Field #" + i + " = " + fd.getGroupName() + fields[i] + 
                       ", Len = " + fd.getLen() + 
                       ", Type = " + fd.getType() + 
                       ", Decimal " + fd.getDecimal());
 }

Еще многое предстоит сделать: я замечаю, что если я определяю поле в тетради как массив, то в IFieldDetail, похоже, нет индикатора, сообщающего мне об этом. Но, по крайней мере, я чувствую, что сейчас нахожусь на правильном пути.

Глядя на код https://github.com/bmTas/JRecord/blob/a4b9d40ca525cc809588cf80fa592809fa2799f3/Source/JRecord_Project/JRecord/src/main/java/net/sf/JRecord/schema/CobolSchemaReader.java#L138-L141 - просто использовать

      CobolSchemaReader reader = CobolSchemaReader.newCobolSchemaReader("test.cbl");
CobolSchemaDetails schemaDetails = reader.getCobolSchemaDetails();

который также используется таким же образом в своих тестовых программах .

Пояснение: только читалкаimplements implements ISchemaIOBuilder, неICobolSchemaReader- для любой причины; но у этого объекта естьgetCobolSchemaDetails()метод.

Примечание. Если у вас есть вопросы по этой библиотеке, вы можете проверить ее систему отслеживания проблем .

Другие вопросы по тегам