IBM大型机论坛索引
 
登录
 
IBM大型机论坛索引 大型机:搜索 IBM Mainframe论坛:常见问题解答 寄存器
 

PLI-从多个程序打印


IBM大型机论坛 -> PL / I& Assembler
发表新话题   回复主题
查看上一个主题 :: 查看下一个主题  
作者 信息
佩德罗

全球主持人


已加入:2006年9月1日
帖子:2214
地点:硅谷

发布发表于:星期五九月08,2017 6:36上午
引用回复

我有几个大型程序可以打印到同一文件。

每个程序都有:
码:
Dcl mymsgs FILE流输出打印;


我最初是这样做的:
码:
放置文件(mymsgs) LIST('text1');
致电prog2

放入文件(mymsgs) LIST('text3');

外部prog2在哪里:
放置文件(mymsgs) LIST('text2');

但是结果是混乱的:
text2
text1
text3

所以我添加了FLUSH语句:
码:
放置文件(mymsgs) LIST('text1');
冲洗文件(mymsgs) ;
致电prog2

冲洗文件(mymsgs) ;
放入文件(mymsgs)  LIST('text3');

外部prog2在哪里:
放置文件(mymsgs) LIST('text2');

大!现在,我以正确的顺序获取了文本。

但是我进行了所有测试以:
码:
// MYMSGS  DD SYSOUT=*


现在,当我使用数据集而不是SYSOUT = *时,我只看到了prog2的一些文本。

码:
// MYMSGS DD  DISP=(NEW,CATLG),DSN=MY.OUTPUT,
//           SPACE=(CYL,(2,1))


是否有人对我为什么没有获得全部输出有任何见解?
回到顶部
查看用户资料 发送私信
史蒂夫·迈尔斯

活跃的成员


已加入:2013年11月30日
帖子:870
地点:宇宙

发布发表:星期五九月08,2017 7:02上午
引用回复

是。

将消息发送到JES2数据集时,该消息将添加到数据集中已有的任何消息中。

按照您的安排,第一个程序打开,然后关闭数据集,然后第二个程序执行相同的操作。当您拥有真实的数据集(与JES数据集相对,这有点不同)时,对数据集的第二次使用将重新开始输出到数据集。换句话说,正如您所观察到的,已将数据集中已有的数据丢弃。

如果MY.OUTPUT实际上不存在,一种可能的解决方法是指定DISP =(MOD.CATLG)而不是DISP =(NEW,CATLG)

对于它的价值,我怀疑JES2会告诉您它正在按设计工作。设计是否合适是另一个问题,并且可能可以追溯到HASP的设计历史并转发给JES2。当HASP提出数据集的概念时,当JCL指定SYSOUT = X时,DD语句被分配给伪打印机,并且OPEN / CLOSE边界被有效地忽略,HASP将该设备视为真实打印机。来了JES2,他们决定它应该以相同的方式运行。
回到顶部
查看用户资料 发送私信
普里诺
警告:1

高级会员


已加入:2009年2月7日
职位:1241
地点:立陶宛维尔纽斯

发布发表:星期五九月08,2017 12:59下午
引用回复

现在没有时间进行测试,几分钟后我们要去荷兰过生日,但是我感到很奇怪的是,打印到文件不会得到与打印到sysout相同的结果。在使用PL / I的32多年中,即使对于具有数十个外部子例程的程序,我也不必诉诸于FLUSH。

您可以尝试在主程序中显式打开myfile。文件默认为外部文件,因此,如果每个模块中的定义相同,则应该没有问题。
回到顶部
查看用户资料 发送私信
史蒂夫·迈尔斯

活跃的成员


已加入:2013年11月30日
帖子:870
地点:宇宙

发布发表:星期五九月08,2017 5:42下午
引用回复

《企业PL / I语言参考》写道:
FLUSH语句刷新与打开的输出文件(如果指定了*,则与所有打开的输出文件)关联的缓冲区。这通常在关闭文件或程序结束时发生,但是FLUSH语句可确保在进行任何其他处理之前刷新缓冲区。

在我看来,该手册是在说FLUSH语句通过立即关闭PL / I文件来完成此任务。

现在,我主要在Assembler中工作,并且我注意到使用QSAM“定位模式” PUT宏时,直到关闭相关的DCB或发出下一个PUT宏,才会真正写入正在进行的行。这是有道理的:“定位模式” PUT返回要填充的I / O区域的地址,唯一可以确定已完成的方法是发出新的PUT或关闭DCB。 “移动模式” PUT通常看起来更直接。即使这样,如果正在填充I / O缓冲区,则在缓冲区被填充或相关的DCB关闭之前,缓冲区将不会被写入。
回到顶部
查看用户资料 发送私信
佩德罗

全球主持人


已加入:2006年9月1日
帖子:2214
地点:硅谷

发布发表:星期五九月08,2017 11:31下午
引用回复

需要更多调查。 OPEN FILE的默认设置为BUFFERED(与UNBUFFERED相比)。我将尝试使用UNBUFFERED。

另外,在声明中,我使用STREAM代替RECORD。有建议吗?
回到顶部
查看用户资料 发送私信
普里诺
警告:1

高级会员


已加入:2009年2月7日
职位:1241
地点:立陶宛维尔纽斯

发布发表:2017年9月11日星期一12:53上午
引用回复

我已经做了快速检查,一切都很好:

码:
// PRINOCOM工作(PRINO),
//             'RAHP COMP/LINK',
//             CLASS=A,
//             MSGCLASS=H,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
// **************************************************** *********************
// IEFBR14 EXEC PGM = IEFBR14
// SYSLIN    DD DSN=&&OBJECT,
//             DISP=(,PASS),
//             UNIT=SYSDA,
//             SPACE=(CYL,(2,2,1)),
//             DCB=(RECFM = FB,LRECL = 80,BLKSIZE = 27920)
// **************************************************** *********************
// IBMZPLI EXEC PGM = IBMZPLI,
//             REGION=0M,
//             PARM=('+DD:PLISTD +DD:PLIUSER')
// *
   DD DSN = PLI.V4R5M0.SIBMZCMP,
//             DISP=SHR
// *
// SYSUEXIT  DD DSN=NULLFILE,
//             DISP=SHR
// *
// SYSPRINT  DD SYSOUT=*
// *
// SYSUT1    DD UNIT=SYSDA,
//             SPACE=(CYL,(5,5))
// *
// PLISTD    DD DSN=&SYSUID..RAHP.DATA(PXEP45Z),
//             DISP=SHR
// *
// PLIUSER   DD *
无名单
  test(全部,符号,单独,名称) sysparm('TEST') opt(0)
最重要的系统('') opt(3)
// *
// SYSIN     DD *
 /* Roberts Q&D PL/I test program                              */
 test: proc(parm) options(main) reorder;
 dcl parm char     (100) var;
 dcl plixopt char (100) var ext
     init ('ISASIZE(64K) HEAP(128K,64K)');

 dcl sysprint file;
 on error snap
   begin;
     在错误捕捉系统上;
     call plidump('HB');
   end;

 dcl test2 entry(*);

 dcl orecord 文件记录输出环境(fb recsize(80) total);
 dcl ostream  file stream print;

 dcl orec char (80) init ('test 1');

 put skip list(orec);
 put skip file(ostream) list(orec);
 write file(orecord) from(orec);
 call test2('plork');

 orec = 'test 3';
 put skip list(orec);
 put skip file(ostream) list(orec);
 write file(orecord) from(orec);
 end test;
// *
// SYSLIN    DD DSN=&&OBJECT(OBJ),
//             DISP=(OLD,PASS)
// *
// SYSPUNCH  DD DUMMY
// **************************************************** *********************
// IBMZPLI EXEC PGM = IBMZPLI,
//             REGION=0M,
//             PARM=('+DD:PLISTD +DD:PLIUSER')
// *
   DD DSN = PLI.V4R5M0.SIBMZCMP,
//             DISP=SHR
// *
// SYSUEXIT  DD DSN=NULLFILE,
//             DISP=SHR
// *
// SYSPRINT  DD SYSOUT=*
// *
// SYSUT1    DD UNIT=SYSDA,
//             SPACE=(CYL,(5,5))
// *
// PLISTD    DD DSN=&SYSUID..RAHP.DATA(PXEP45Z),
//             DISP=SHR
// *
// PLIUSER   DD *
无名单
  test(全部,符号,单独,名称) sysparm('TEST') opt(0)
最重要的系统('') opt(3)
无选择权;
// *
// SYSIN     DD *
 /* Roberts Q&D PL/I test2 program                             */
 test2: proc(parm) reorder;
 dcl parm char     (100) var;

 dcl sysprint file;
 dcl orecord 文件记录输出环境(fb recsize(80) total);
 dcl ostream  file stream print;

 dcl orec char (80) init ('test 2');

 put skip list(orec);
 put skip file(ostream) list(orec);
 write file(orecord) from(orec);
 end test2;
// *
// SYSLIN    DD DSN=&&OBJECT(OBJ2),
//             DISP=(OLD,PASS)
// *
// SYSPUNCH  DD DUMMY
// **************************************************** *********************
// IEWL    EXEC PGM=IEWL,
//             PARM=('LET,LINECT = 0,LIST,XREF',
//             'AMODE=31,RMODE=ANY')
// *
// SYSLIN    DD *
 INCLUDE OBJECT(OBJ)
 INCLUDE OBJECT(OBJ2)
 NAME TEST(R)
// *
//目的    DD DSN=&&OBJECT,
//             DISP=(OLD,PASS)
// *
// SYSLIB   DD DSN = CEE.SCEELKED,
//             DISP=SHR
// *
// SYSUT1    DD UNIT=SYSDA,
//             SPACE=(CYL,(5,1))
// *
// SYSLMOD   DD DSN=&&LOAD,
//             DISP=(,PASS),
//             UNIT=SYSDA,
//             SPACE=(CYL,(2,2,1)),
//             DCB=(RECFM = U,LRECL = 27988,BLKSIZE = 0)
// *
// SYSPRINT  DD SYSOUT=*,
//             DCB=(RECFM = FBA,LRECL = 121,BLKSIZE = 27951)
// **************************************************** *********************
//走      EXEC PGM=TEST
   DD DSN=&&LOAD,
//             DISP=(OLD,PASS)
// *
// SYSPRINT  DD SYSOUT=*
// OSTREAM   DD SYSOUT=*
// ORECORD   DD SYSOUT=*


和输出:

码:
SDSF作业数据集显示-作业PRINOCOM(JOB14398)    LINE 1-9 (9)                         
命令输入===>                                                                         
前缀= *  DEST=(ALL)  OWNER=PRINO  SYSNAME=                                                 
NP   DDNAME   StepName ProcStep DSID所有者    C Dest               Rec-Cnt页面Cnt字节Cnt
     JESMSGLG JES2                 2 PRINO    H LOCAL                   16               888
     JESJCL   JES2                 3 PRINO    H LOCAL                  109             4,403
     JESYSMSG JES2                 4 PRINO    H LOCAL                  103             5,499
     SYSPRINT IBMZPLI            106 PRINO    H LOCAL                  414            13,830
     SYSPRINT IBMZPLI            107 PRINO    H LOCAL                  240             7,658
     SYSPRINT IEWL               108 PRINO    H LOCAL                  270            20,001
     SYSPRINT GO                 109 PRINO    H LOCAL                    3                48
     OSTREAM  GO                 110 PRINO    H LOCAL                    3                48
     ORECORD  GO                 111 PRINO    H LOCAL                    3                45


以及来自IEWL步骤结束的作业日志:

码:
 IEW2008I 0F03处理完成。  RETURN CODE =  0.



 ----------------------
 消息摘要报告
 ----------------------
  TERMINAL MESSAGES      (SEVERITY = 16)
  NONE

  SEVERE MESSAGES        (SEVERITY = 12)
  NONE

  ERROR MESSAGES         (SEVERITY = 08)
  NONE

  WARNING MESSAGES       (SEVERITY = 04)
  NONE

 信息性消息(SEVERITY = 00)
  2008  2278  2322


 ****邮件结束摘要报告****

1测试1
 test 2
 test 3
1测试1
 test 2
 test 3
测试 1
测试 2
测试 3

换句话说,(别无所求),完全可以。

ORECORD(显然)没有领先的ASA字符。

将// OSTREAM更改为临时数据集,然后将SORT(SORT FIELDS = COPY)更改为SORTSOUT DD SYSOUT = *将在输出中添加其他空行,这是由于 跳跃 在“放入跳过文件(ostream)列表(orec)”中;陈述。
回到顶部
查看用户资料 发送私信
佩德罗

全球主持人


已加入:2006年9月1日
帖子:2214
地点:硅谷

发布发表:2017年9月11日星期一8:35上午
引用回复

我可能有多个问题...至少一个问题是,调用第二个程序时,它收到未定义的文件条件。

我在调用第二个程序之前发布了一个PUT语句(我在数据集中看到了它),而第二个程序中的第一个语句是一个PUT,我没有得到。

费。我在现有的PLI程序中添加了一个新功能,其中一些是1万行或更多的代码行。我认为设置复杂性会干扰PUT功能/文件分配。
回到顶部
查看用户资料 发送私信
普里诺
警告:1

高级会员


已加入:2009年2月7日
职位:1241
地点:立陶宛维尔纽斯

发布发表于:星期一九月11,2017 3:44下午
引用回复

佩德罗写道:
我可能有多个问题...至少一个问题是,调用第二个程序时,它收到未定义的文件条件。

并且文件声明与主过程中的文件相同吗?

佩德罗写道:
我在调用第二个程序之前发布了一个PUT语句(我在数据集中看到了它),而第二个程序中的第一个语句是一个PUT,我没有得到。


你有一个
码:
错误
  begin;
    on error system
    "put whatever message"
    close file(sysprint);
  end;


佩德罗写道:
费。我在现有的PLI程序中添加了一个新功能,其中一些是1万行或更多的代码行。我认为设置复杂性会干扰PUT功能/文件分配。

极不可能的,但是您可以尝试编译“ OPT(0)”并再次运行该程序,尽管使用旧的OS编译器仅一次,但实际上可以解决问题。 Enterprise PL / I可以处理40k行的程序,我们的“那个”系统上有一个程序很长的程序,仍然使用EPLI V3.3!
回到顶部
查看用户资料 发送私信
佩德罗

全球主持人


已加入:2006年9月1日
帖子:2214
地点:硅谷

发布发表:2017年9月11日星期一9:51 pm
引用回复

我有单独链接的程序,带有几个单独的加载模块。

我在调用第二个程序之前先关闭文件,然后在返回后稍后再次打开它,这方面有了一些改进。这可能是问题的根源。现在,我必须弄清楚需要在哪里做同样的事情。
回到顶部
查看用户资料 发送私信
查看上一个主题 :: :: 查看下一个主题  
发表新话题   回复主题 查看书签
所有时间均为格林尼治标准时间+ 6小时
论坛索引 -> PL / I& Assembler

 


类似主题
话题 论坛 回覆
没有新帖 选择多个常量记录 DB2 3
没有新帖 使用CO创建单记录文件... DFSORT / ICETOOL 8
没有新帖 阅读4MB消息并拆分成多个... COBOL程式设计 9
没有新帖 一个文件中有多个求和 同步排序 2
该主题已锁定:您无法编辑帖子或回复。 通过JCL调用REXX以扩展公司范围... 清单和REXX 2
搜索我们的论坛:


回到顶部