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
...
Ваши пункты обработки будут иметь доступ к данным в записях тетради.