#unix #cobol #mainframe #codepages
Вопрос:
Здравствуйте, это мой первый вопрос к StackOverflow, не уверен в форуме и теме.
Участвуя в инициативе по открытым мэйнфреймам с использованием кода Visual Studio и шпатлевки для Unix, я разработал пример программы на языке COBOL, в которой показаны международные поговорки (на данный момент на немецком, английском, французском, испанском, латыни). Он отлично работает в пакетном режиме с JCL в файл и вызывается из REXX. В файле я не вижу специальных символов для неанглийских языков, но мне повезло с двойной программой в PL/1 (делаю то же самое и показываю специальные символы в REXX).
Теперь мой вопрос: я также пытался позвонить по mvscmd из сценария Unix bash. Пока это работает, но не показывайте мне специальные символы. Хорошо, у меня есть последний шанс позвонить в mvscmd с Python. Или, в качестве альтернативы, я могу перенести файл из MVS в unix (по любой причине он автоматически преобразуется, и я вижу содержимое моих специальных символов). Где есть место, чтобы справиться с этим? Кобол? (как я уже сказал, по любой причине PL/1 может это сделать. Я использую только стандартное редактирование put в PL/1 против отображения в Cobol). Преобразование Sysprint/Sysout? Любой специалист может мне помочь?
Комментарии:
1. Не могли бы вы показать пример кода (COBOL, REXX, скрипт оболочки) и JCL? Пожалуйста, отредактируйте свой вопрос и вставьте его в формате образца кода, а не изображения.
2. «Я не вижу специальных символов» — что вы используете для просмотра выходных данных? Как предполагается кодировать выходные данные?
Ответ №1:
Здравствуйте и извините за поздний повтор. Ну, весь код немного многоват, но я думаю, что моя проблема в следующем — MVSCMD напрямую закодирован в сценарии оболочки
#!/bin/sh
parm='Z08800.FYD.DATA'
#echo "arg1=>"$1"<"
[ ! -z "$1" ] amp;amp; parm=$parm","$1
#echo "arg2=>"$2"<"
[ ! -z "$2" ] amp;amp; parm=$parm","$2
#echo "parm=>"$parm"<"
mvscmd --pgm=saycob --args=$parm
--steplib='z08800.fyd.load'
--sysin=dummy
--sysout=*
У меня есть еще несколько сценариев оболочки, но это главное. Я напрямую отправил его в sysout (это диплей COBOL. Я могу использовать фиксированную строку или мое высказывание, прочитанное из файла MVS). При использовании программы PL/1 последний файл затем является sysprint, потому что PL/1 создает его путем РЕДАКТИРОВАНИЯ.
Я предполагаю, что моя кодовая страница довольно неправильная. Но я не знаю, как это исправить. Я использовал некоторые настройки в оболочке, но LANG остается на C ??? Кстати, этот Unix кажется довольно старым, и у меня есть возможность использовать его только до августа. Мой основной интерес заключается в использовании программы на мэйнфреймах и в JCL и/или REXX. Но они дали нам шанс с этим встроенным Unix (?), Поэтому я тоже хотел попробовать. Прямой вывод из программы COBOL в терминал Unix.
Я имел в виду, что при выполнении программы на мэйнфрейме, а затем просмотре файла результатов в редакторе ISPF (старые вещи) с помощью PF3 я вижу специальные символы на немецком, испанском и французском языках. Так что они там, кажется, производятся COBOL и PL/1.
При передаче файла MVS (своего рода PDS) в UNIX с помощью MVSCMD это также нормально (специальные символы), но это не то, что я хотел.
Я попытался использовать Python вместо плоской оболочки, но все пошло еще хуже. Я не могу направить Sysout на терминал, все, что может вызвать Python, находится на мэйнфрейме и в файловой системе MVS. Так что я должен передать его после. Это слишком накладно для моих глаз, когда я говорю 7 высказываний, и я хочу, чтобы они отображались в терминале Unix, lol.
Ответ №2:
Вот мой РЕКС, который делает свое дело
/* rexx */
ARG PARM1 PARM2
PARAMETER = '/Z08800.FYD.DATA'
If Length(PARM1) > 0
Then PARAMETER = PARAMETER","PARM1
If Length(PARM2) > 0
Then PARAMETER = PARAMETER","PARM2
PARAMETER = "'"PARAMETER"'"
Address TSO "Alloc File(sysprint) Dataset(*)"
Address TSO "Alloc File(sysin) Dummy"
Address TSO "Call fyd.load(saypli)" PARAMETER
Address TSO "Free File(sysprint)"
Address TSO "Free File(sysin)"
Теперь это другая нагрузка, PL/1, но COBOL делает то же самое с Sysout вместо Sysprint.
Он отображается в моем терминале REXX, который также вызывается ISPF, а затем отображается на панели редактирования. Программа не имеет ручного ввода, но считывает файл. И да, высказывания здесь не выделяются, я читаю их с помощью динамического выделения, но не имеет значения, откуда мои строки поступают на ОТОБРАЖЕНИЕ / ВВОД РЕДАКТИРОВАНИЯ
Ответ №3:
И это теперь JCL. ОК работает немного по-другому, он сохраняется для участника PDS
//SAYCOB JOB
//COBCLG EXEC IGYWCLG,
// PARM.GO='Z08800.FYD.DATA'
// SET MBR=SAYCOB
//COBOL.SYSIN DD DSN=amp;SYSUID..FYD.SOURCE(amp;MBR),DISP=SHR
//LKED.SYSLMOD DD DSN=amp;SYSUID..FYD.LOAD(amp;MBR),DISP=SHR
//GO.SYSOUT DD SYSOUT=*
//*-------------------------------------------------------------
//*
//*-------------------------------------------------------------
//SAYCOB EXEC PGM=amp;MBR,PARM='Z08800.FYD.DATA,001,007'
//STEPLIB DD DSN=amp;SYSUID..FYD.LOAD,DISP=SHR
//SYSOUT DD DSN=amp;SYSUID..FYD.OUTPUT(amp;MBR),DISP=SHR
//*-------------------------------------------------------------
//LIST EXEC PGM=LINE80,PARM='/80'
//STEPLIB DD DSN=amp;SYSUID..FYD.LOAD,DISP=SHR
//SYSIN DD DSN=amp;SYSUID..FYD.OUTPUT(amp;MBR),DISP=SHR
//SYSPRINT DD SYSOUT=*
//
Здесь, в параметре, я даю им библиотеку моих высказываний, а затем распределяю по PL/1 или COBOL. Я, конечно, могу показать, но это немного многовато, около 200 строк… Проблема, я думаю, не в MVS, а в кодовой странице Unix.