Как сделать баланс в Cobol, используя 3 входных файла? - PullRequest
0 голосов
/ 17 декабря 2018

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

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

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

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

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

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

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

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

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

0 голосов
/ 20 декабря 2018

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

Надеюсь, этот небольшой образец все еще оставляет васс возможностью узнать о MERGE и не отнимать у вас никакой возможности.

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

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

Чтобы избежать гниения ссылок;Вот код, но его всегда можно найти с помощью веб-поиска «GnuCOBOL FAQ» в записи зарезервированного слова 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, и не беспокоиться о взрывах головы .

0 голосов
/ 18 декабря 2018

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

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

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

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

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

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

  1. Sort Merge file-1 и файл-2 на ID-USER и создание файла-4
  2. Sort Merge файл-1 и файл-4 на Job-id

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

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