COBOL читать / хранить в таблице

Цель этого упражнения - прочитать и сохранить входной файл в таблице, затем проверить определенные поля во входных данных и вывести любые записи об ошибках. Мне нужно прочитать и сохранить каждую группу политик, чтобы в таблице одновременно хранилось всего 5 записей, а не весь файл.

Поэтому мне нужно прочитать в группе политик из 5 записей, выполнить обработку, затем прочитать следующие 5 записей и т. Д. До конца файла.

This is the input file.
10A 011111          2005062520060625                                    
20A 011111000861038                                                     
32A 011111                            79372                             
60A 0111112020                                             6          4 
94A 011111     080 1                                                    
10A 02222          2005082520060825                                    
20A 022221000187062                                                     
32A 022221                            05038                             
60A 0222212003                                             6          4 
94A 022221     090 1                                                    
....

Я смог загрузить первые 5 записей в таблицу, имея свою таблицу OCCUR 5 TIMES, но я не знаю, как мне это продолжить. Мой код ниже. (Я написал его только для того, чтобы проверить, правильно ли он работает, но он печатает строку заголовка с первыми 4 записями, а не только с первыми 5). 01 ТАБЛИЦЫ.

05  T1-RECORD-TABLE.                                
    10  T1-ENTRY                OCCURS 5 TIMES      
                                INDEXED BY T1-INDEX.

        15  RECORD-TYPE-10      PIC X(80).          
        15  RECORD-TYPE-20      PIC X(80).          
        15  RECORD-TYPE-32      PIC X(80).          
        15  RECORD-TYPE-60      PIC X(80).          
        15  RECORD-TYPE-94      PIC X(80).          

 copy trnrec10.
 COPY TRNREC20.
 COPY TRNREC32.
 COPY TRNREC60.
 COPY TRNREC94.
.....

Z200-READ-FILES.                               
    READ DISK-IN INTO T1-ENTRY(T1-INDEX)       
        AT END MOVE 'YES' TO END-OF-FILE-SW.   

    WRITE PRINT-RECORD FROM T1-ENTRY(T1-INDEX).

Я не хочу шаг за шагом для этого (хотя это было бы неплохо:P), потому что я знаю, ЧТО мне нужно сделать, я просто не знаю, КАК это сделать, потому что мой учебник и заметки курса бесполезны для меня. Я застрял на этом некоторое время и ничего, что я пытаюсь, работает.

2 ответа

Решение

У вас есть учебник, заметки о курсе, руководство, редактор, JCL и компьютер.

Все это будет полезно для вас, но вы также должны заставить себя думать, как ваша программа.

Ваша задача - прочитать файл, загрузить пять записей в таблицу, что-то с ними сделать, а затем записать их.

У вас будет много задач, где вы читаете файл, делаете что-то и пишете файл.

Так как насчет начала обработки файлов?

Определите ваши файлы с помощью FILE STATUS

PERFORM OPEN-INPUT-POLICY-MASTER
PERFORM OPEN-OUTPUT-NEW-POLICY-MASTER

В этих параграфах (или РАЗДЕЛАХ, в зависимости от стандартов вашего сайта) ОТКРЫТЬ файлы, проверить статус файла, завершить, если не "00".

Вам понадобится ПРОЧИТАТЬ абзац. ПРОЧИТАЙТЕ там, проверьте состояние файла, помня, что "10" является действительным и указывает на конец файла (поэтому вам не нужны AT END и END-READ). Подсчитать все прочитанные записи (статус файла "00").

Вам понадобится НАПИСАТЬ абзац. Проверьте статус файла. Только "00" является действительным. Посчитайте записи, написанные.

PERFORM PRIMING-READ-OF-POLICY-MASTER

Все, что нужно сделать этому абзацу - это ВЫПОЛНИТЬ ПРОЧИТАТЬ Поместить его в отдельный абзац - это способ документировать, что он делает. Рассказывая следующему человеку.

Что оно делает? Читает или пытается прочитать первую запись. Если файл пуст, вы получите статус файла "10". Если файл не должен быть пустым, прекратите. Теперь вы имеете дело с пустым файлом, не влияя на логику обработки.

PERFORM PROCESS-POLICY-MASTER UNTIL END-OF-POLICY-MASTER

или же

PERFORM UNTIL END-OF-POLICY-MASTER
    ....
END-PERFORM

Я предпочитаю первое, чтобы избежать "распространения" основной логики, но хорошо начинать со второго, если вы предпочитаете / это соответствует вашему курсу.

Последняя вещь в параграфе или перед END-PERFORM - это ПРОИЗВОДИТЕЛЬНОСТЬ вашего ЧТЕНИЯ.

Затем вы можете выполнить команду CLOSE-INPUT-POLICY-MASTER и аналогичные для выходного файла.

Затем проверьте, что количество равно. Если нет, прекратите. В этом примере это тривиально, но по мере усложнения вашей логики все может пойти не так.

Всегда предоставляйте счетчики для согласования ввода с выходом, добавления, удаления. Посчитайте обновления отдельно для информации. Получите вашу программу, чтобы проверить, что она может. Если у вас больше обновлений, чем входных записей, определите это и прекратите. Сделайте так, чтобы ваша программа провела как можно больше проверок.

Теперь у вас будет простая программа, которая читает файл, записывает файл, проверяет столько, сколько может, и ей просто не хватает логики обработки.

Вы можете использовать эту программу в качестве основы для всех ваших задач, читая один файл и записывая другой.

Все эти вещи будут работать в вашей новой программе, без необходимости что-либо делать.

Логика, в которой вы сейчас нуждаетесь, - хранить данные в таблице.

Хорошо, как правильно показал Гилберт, сохранение в таблице не имеет смысла в вашем реальном случае. Но это требование. Вам также нужно хорошо разбираться в столах.

Ваша таблица не определена правильно. Попробуй это:

01  T1-RECORD-TABLE.                                
    05  T1-ENTRY                OCCURS 5 TIMES      
                                INDEXED BY T1-INDEX.

        10  POLICY-RECORD.
            15  POLICY-RECORD-TYPE PIC XX.
            15  POLICY-RECORD-DATA PIC X(78).

Поместите 88 внизу POLICY-RECORD-TYPE для каждого из ваших типов записей. Создайте описание бизнес-функции, а не просто скажите "RECORD-IS-TYPE-10".

Вы используете индекс для ссылки на элементы в таблице. Прежде чем поместить первую запись в таблицу, вы должны установить индекс в 1. Чтобы получить доступ к следующей записи, вы должны установить индекс UP BY 1.

После того, как вы сохранили свои предметы в таблице, вам нужно получить их снова. Установите индекс снова на 1, и вы можете сослаться на первую запись. Установите индекс UP BY 1 последовательно, чтобы получить доступ к другим записям.

Установите индекс TO 1 перед началом обработки. Переместите ноль в число записей таблицы. Получить в свой цикл обработки файлов.

Там посчитайте то, что вы храните, каждый раз, когда количество записей в вашей таблице достигает пяти, ВЫПОЛНИТЕ абзац, чтобы вывести ваши записи, и УСТАНОВИТЕ свой индекс на 1. Если количество не пять, УСТАНОВИТЕ свой индекс UP BY 1

В вашем параграфе для вывода записей используйте PERFORM VARYING ваш индекс ОТ 1 BY 1 ДО БОЛЬШЕ 5. Чем в PERFORM, ВЫПОЛНИТЕ свой абзац WRITE с текущей записью таблицы в качестве источника записи.

Теперь у вас будет две программы, каждая из которых читает входной файл и создает идентичный выходной файл.

Затем вы можете сделать свою логику проверки.

Если вы разобьете все на части, разберетесь с вещами, упростите вещи, назовите их правильно, вы начнете писать программы на языке COBOL, которые одинаковы, за исключением конкретной бизнес-логики. Все стандартные вещи, все скучные вещи, если хотите, вся базовая структура остается прежней. Новый код, который вы пишете, является лишь особенностью следующей задачи.

Да, вы сможете читать больше файлов, либо как справочные файлы, либо как несколько входов. У вас будет несколько выходов. Но вы можете построить основы всех этих точно таким же образом. Тогда у вас будет больше примеров, на которых будут основаны ваши будущие программы.

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

С хорошими именами ваши программы скажут, что они делают.

Код, который вы на самом деле пишете, будет "интересным", а не тем, что вы делаете "каждый раз".

Я только что "разработал" это для вас. Это не единственный работоспособный дизайн. Это то, как я это делаю, и делаю уже некоторое время. Вы должны также разработать каждую часть вашей обработки. Вы должны знать, что он делает, прежде чем писать код.

В качестве примера возьмем простой цикл. Представь, как ты это проверишь. Что происходит с нулевыми записями в таблице? С одним? С промежуточным номером? На один меньше, чем максимум? Максимум? Еще больше, чем максимум? На 10 больше, чем максимум? Затем напишите код, зная, что вам нужно знать, как обращаться с этими случаями.

Со временем, не слишком долго, вы будете думать о низкоуровневом дизайне, пока будете писать код. Через некоторое время вы также создадите высокоуровневый дизайн. Через достаточно времени вы будете создавать только те вещи, с которыми вам не приходилось иметь дело раньше, а все остальное вы уже знаете.

У вас есть учебник, заметки о курсе, руководство, редактор, JCL и компьютер. Я дал вам несколько идей. Как насчет того, чтобы увидеть, если все вместе они полезны для вас. Я думаю, что у вас есть некоторые разочарования сейчас. Напишите несколько основных программ, а затем примените их к своим задачам.

Я предполагаю, что каждая группа политик имеет ровно 5 записей с 5 типами записей.

Вы можете настроить свое рабочее хранилище следующим образом.

05  T1-RECORD.
    10  T1-RECORD-TYPE               PIC XX.
    10  FILLER                       PIC X(78).      

 COPY TRNREC10.
 COPY TRNREC20.
 COPY TRNREC32.
 COPY TRNREC60.
 COPY TRNREC94.

Тогда ваш прочитанный абзац будет выглядеть так. Я предположил, что TRNREC10-RECORD был уровнем 01 тетради TRNREC10. если нет, замените фактические уровни 01 в следующем коде.

2200-READ-FILE.                               
    READ DISK-IN INTO T1-RECORD      
        AT END MOVE 'YES' TO END-OF-FILE-SW.  

    IF END-OF-FILE-SW = 'NO'
        IF T1-RECORD-TYPE = '10'
            MOVE T1-RECORD TO TRNREC10-RECORD
        END-IF
        IF T1-RECORD-TYPE = '20'
            MOVE T1-RECORD TO TRNREC20-RECORD
        END-IF
        ...
    END-IF.

Ваш абзац записи будет выглядеть так

2400-WRITE-FILE.
    WRITE PRINT-RECORD FROM TRNREC10-RECORD
    WRITE PRINT-RECORD FROM TRNREC20-RECORD
    ...

Ваши пункты обработки будут иметь доступ к данным в записях тетради.

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