Как сделать линию баланса в Cobol, используя 3 входных файла?

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

В файле 1 есть поле ID-USER (упорядоченное по нему) и другие; Файл 2 имеет поля ID-USER (заказанный им), ID-JOB и другие; В файле 3 есть поле ID-JOB (упорядоченное по нему) и другие. Выходной файл объединит данные из 3 файлов.

Строка баланса в коболе с 2 файлами - тяжелая работа, но я справлюсь. Но используя 3 входных файла, когда ID-USER соответствует в файлах 1 и 2, я должен заранее прочитать файл 3, чтобы записать соответствующий ID-JOB в файлы 2 и 3, и моя линия баланса больше не работает, потому что я не не знаю, возможен ли "перезапуск" чтения в файле 3.

Возобновление: как перезапустить чтение в последовательном режиме для определенного входного файла (файл 3)? Или изменить направление поиска в той же программе cobol.


person Robson de Melo    schedule 17.12.2018    source источник
comment
Какой компилятор вы используете? Добавьте это в теги.   -  person Rick Smith    schedule 17.12.2018
comment
перемотка назад и назад не применимы теги IMO, это просто обработка файла   -  person SaggingRufus    schedule 17.12.2018


Ответы (3)


Два возможных процесса

  1. 2 программы слияния сортировки, одна по Job-Id, одна по ID-USER
  2. Загрузите файл 3 в индексированный файл (файл VSAM на мейнфрейме) или в базу данных. Ключом для Index-File/Db будет Job-Id. Затем вы можете выполнить индексированное чтение

Две программы

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

  1. Отсортируйте файл-2 и файл-3 по идентификатору задания и создайте выходной файл-4 с необходимыми данными из обоих файлов.
  2. Сортировать файл-1 и файл-4 по ID-USER и merge по 2 файлам

В качестве альтернативы вы могли бы

  1. Sort Merge файл-1 и файл-2 для ID-USER и создать файл-4
  2. Sort Merge файл-1 и файл-4 в идентификаторе задания

Решение для индексного файла

  1. Загрузите файл-3 в индексный файл (скажем, файл-3i) (можно использовать массив, если он небольшой) либо перед запуском вашей программы, либо как часть инициализации.
  2. Sort Merge файл-1 и файл-2 в ID-USER и выполнить индексный поиск в файле-3i
person Bruce Martin    schedule 17.12.2018

Как перезапустить чтение в последовательном режиме для определенного входного файла (файл 3)?

Чтобы перезапустить чтение файла с начала, используйте CLOSE, затем OPEN INPUT.

Или изменить направление поиска в той же программе cobol.

Нет операторов COBOL для чтения последовательного файла строки в обратном порядке. Можно вызвать программу C для сканирования файла 3 в обратном порядке, рассматривая его как «двоичный» файл.

Мне не ясно, какой термин «линия баланса» следует применять в данном случае. Это связано с тем, что третий файл не имеет той же последовательности, что и второй файл.

Брюс Мартин дал несколько советов по выполнению этой задачи.

Поскольку это «вызов [в] классе», это может быть случай, когда вы не можете использовать эти предложения.

Однако, если вы хотите продолжить, как вы описали, вам нужно знать, что если вы «перезапускаете», когда ID-JOB файла 2 меньше, чем ID-JOB файла 3, вам нужно рассматривать это как потенциальный пограничный случай. В частности, когда ID-JOB файла 2 меньше минимального значения ID-JOB файла 3, возможен бесконечный цикл.

person Rick Smith    schedule 19.12.2018

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

Надеемся, что небольшой пример все же оставит у вас возможность узнать о MERGE и не лишит вас ни одной возможности.

https://open-cobol.sourceforge.io/faq/index.html#merge

Обратите внимание на синтаксическую диаграмму, как фразы ON ... KEY могут повторяться в файле с несколькими файлами.

Чтобы избежать гниения ссылок; вот код, но его всегда можно найти с помощью веб-поиска «Часто задаваемые вопросы по GnuCOBOL» в записи зарезервированного слова MERGE.

GCobol >>SOURCE FORMAT IS FIXED
      *> ***************************************************************
      *> Author:    Brian Tiffin
      *> Date:      20140610
      *> Purpose:   Demonstrate a merge pass
      *> Tectonics: cobc -x gnucobol-merge-sample.cob
      *> ***************************************************************
       identification division.
       program-id. gnucobol-merge-sample.

       environment division.
       configuration section.
       repository.
           function all intrinsic.

io     input-output section.
       file-control.
           select master-file
               assign to "master-sample.dat"
               organization is line sequential.

           select eastern-transaction-file
               assign to "east-transact-sample.dat"
               organization is line sequential.

           select western-transaction-file
               assign to "west-transact-sample.dat"
               organization is line sequential.
           select merged-transactions
               assign to "merged-transactions.dat"
               organization is line sequential.

           select working-merge
               assign to "merge.tmp".

data   data division.
       file section.
       fd master-file.
          01 master-record     pic x(64).

       fd eastern-transaction-file.
          01 transact-rec      pic x(64).

       fd western-transaction-file.
          01 transact-rec      pic x(64).

       fd merged-transactions.
          01 new-rec           pic x(64).

       sd working-merge.
          01 merge-rec.
             02 master-key     pic 9(8).
             02 filler         pic x.
             02 action         pic xxx.
             02 filler         PIC x(52).

code  *> ***************************************************************
      *> not much code
      *>     trick.  DEP, CHQ, BAL are action keywords.  They sort
      *>     descending as DEP, CHQ, BAL, so do all deposits, then
      *>     all withdrawals, then balance reports.
      *> ***************************************************************
       procedure division.
       merge working-merge
           on ascending key master-key
              descending key action
           using eastern-transaction-file,  western-transaction-file,
                 master-file
           giving merged-transactions
done   goback.
       end program gnucobol-merge-sample.

Образцы данных выглядят как

11111111 CHQ 0001111.11 withdrawal from account one
33333333 DEP 0333333.33 third of a million in, pocket change
33333333 CHQ 0000333.33 payroll
33333333 CHQ 0000333.33 payroll
33333333 CHQ 0000333.33 payroll
55555555 DEP 0000555.55 deposit to new record five
55555555 CHQ 0000055.55 withdrawal from account five

Восток

11111111 CHQ 0001111.11 withdrawal from account one
44444444 DEP 0000044.44 deposit to account four
66666666 BAL balance request for account six

Запад и др.

GnuCOBOL упрощает работу с частью LINE SEQUENTIAL.

В вашем вопросе есть еще вопросы, не упомянутые здесь, так как этот список предназначен только для демонстрации MERGE с LINE SEQUENTIAL, и чтобы не беспокоиться о взрывах головы.

person Brian Tiffin    schedule 19.12.2018