Cobol 为小于指定长度的PIC子句赋值

Cobol 为小于指定长度的PIC子句赋值,cobol,mainframe,Cobol,Mainframe,我是COBOL的初学者,我想知道如果我做了以下事情会发生什么: (我知道下面的代码不是可运行的cobol,例如它就在那里) 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'qu

我是COBOL的初学者,我想知道如果我做了以下事情会发生什么:
(我知道下面的代码不是可运行的cobol,例如它就在那里)

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 用户输入的字符串长度仅为3个字符(例如yes) foo的价值仅仅是“是”吗?或者它会按照创建时指定的方式填充所有5个字符(例如:“(空格)(空格)yes)”或“yes(空格)(空格)”,还是其他字符

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 谢谢

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 这是我的密码

000100        IDENTIFICATION DIVISION.                           
000200       *--------------------                               
000300        PROGRAM-ID. ZIPCODES.                              
000400       *--------------------                               
000500        ENVIRONMENT DIVISION.                              
000600       *--------------------                               
000700        CONFIGURATION SECTION.                             
000800        INPUT-OUTPUT SECTION.                              
000900        FILE-CONTROL.                                      
001000            SELECT PRT ASSIGN TO UT-S-PRTAREA.             
001100                                                           
001200        DATA DIVISION.                                     
001300       *-------------                                      
001400        FILE SECTION.                                      
001500        FD  PRT                                            
001600            RECORD CONTAINS 80 CHARACTERS                  
001700            DATA RECORD IS LINE-PRT.
001800        01  LINE-PRT              PIC X(80).                
001900                                                            
002000        WORKING-STORAGE SECTION.                            
002100       *-----------------------                             
002200                 EXEC SQL INCLUDE SQLCA  END-EXEC.          
002300                                                            
002310        01 done.                                           
002320           02 donevar            PIC x(5) VALUE 'done '.    
002400        01 ZIP-RECORD.                                      
002500           02 ZIP                PIC X(5).                  
002600           02 ZCITY              PIC X(20).                 
002700           02 ZSTATE             PIC X(2).                  
002800           02 ZLOCATION          PIC X(35).                 
002900                                                            
003000        01 H1.                                              
003100           02 COLUMN-1           PIC X(8) VALUE 'Zip-Code'. 
003200           02 FILLER             PIC X(2).                  
003300           02 COLUMN-2           PIC X(5) VALUE 'State'.
003400           02 FILLER             PIC X(2).                       
003500           02 COLUMN-3           PIC X(4) VALUE 'City'.          
003600           02 FILLER             PIC X(16).                      
003700           02 COLUMN-4           PIC X(14) VALUE 'Location Text'.
003800           02 FILLER             PIC X(29).                      
003900                                                                 
004000        01 L1.                                                   
004100           02 ZIP-L1             PIC X(5).                       
004200           02 FILLER             PIC X(5).                       
004300           02 STATE-L1           PIC X(2).                       
004400           02 FILLER             PIC X(5).                       
004500           02 CITY-L1            PIC X(20).                      
004600           02 LOCTXT-L1          PIC X(35).                      
004700           02 FILLER             PIC X(28).                      
004800                                                                 
004900        PROCEDURE DIVISION.                                      
005000       *------------------                                       
005100        BEGIN.
 005200                 OPEN OUTPUT PRT.                                
 005220                 PERFORM ZIP-LOOKUP UNTIL ZIP = done.            
 005600        PROG-END.                                                
 005700                 CLOSE PRT.                                      
 005800                 GOBACK.                                         
 005900       *****************************************************     
 006000       * zip code lookup                                   *     
 006100       *****************************************************     
 006200        ZIP-LOOKUP.                                              
 006300                 DISPLAY 'enter 5 digit zip code'                
 006400                 ACCEPT ZIP                                      
 006500                 EXEC SQL                                        
 006600                  SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE   
 006700                  WHERE ZIP = :ZIP                               
 006800                 END-EXEC.                                       
 006801                 PERFORM PRINT-H1.                               
 006802                 PERFORM PRINT-L1.                               
 006900        PRINT-H1.
007000                 MOVE H1 TO LINE-PRT                     
007100                 WRITE LINE-PRT.                         
007200        PRINT-L1.                                        
007300                 MOVE  ZIP          TO  ZIP-L1           
007400                 MOVE  ZSTATE       TO  STATE-L1         
007500                 MOVE  ZCITY        TO  CITY-L1          
007510                 STRING ZSTATE DELIMITED BY " ",", ",    
007520                 ZCITY DELIMITED BY SIZE INTO LOCTXT-L1  
007700                 MOVE  L1 TO LINE-PRT                    
007800                 WRITE LINE-PRT.
01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '.
我试图在zcity之前编写zstate,只要输入未“完成”,它就会不断询问邮政编码。

输入的前5个字符将移动到FOO。如果输入的字符少于5个,则它们将被放置在FOO的左侧位置,其余字符(右侧)将被放置将用空格填充。如果用户输入的字符超过5个,则仅移动前5个字符

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 因此,以您的示例为例,如果用户键入“yes”,那么FOO将包含“yesbb”

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 最好的办法就是试试看

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 根据更新的问题进行编辑… 我认为您的问题是终止循环所需的条件设置在循环体的开头,并且 不是最后。以下是解决此问题的几种常用技术:

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 预循环读取

DISPLAY 'Enter a 5 digit zip code' ACCEPT ZIP PERFORM ZIP-LOOKUP UNTIL ZIP = done. ... ... ZIP-LOOKUP. EXEC SQL SELECT * INTO :ZIP-RECORD FROM ZBANK.ZIPCODE WHERE ZIP = :ZIP END-EXEC. PERFORM PRINT-H1. PERFORM PRINT-L1. * Now get next zip code or 'done' DISPLAY 'Enter a 5 digit zip code' ACCEPT ZIP . 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 您不再需要
donevar
。请替换原始测试:

IF ZIP = DONE 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 当用户输入
done
quit
stop
中的任何一项时,88级名称
done
的计算结果为true

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 最后,我假设这只是程序的一个框架,完成的版本将检查I/O错误和错误的SQL代码 并进行基本的邮政编码验证。如果没有,你可能会遇到很多麻烦

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. COBOL标准物质

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 不幸的是,学习COBOL的最新资源很少 我想推荐的书是。 这本书提供了许多关于COBOL程序开发的例子和解释 构造很少被使用,过时或者是必需的。这是一个好消息,因为您应该使用现代COBOL开发新代码 编程技术(我继续看到许多使用前COBOL85编码实践开发的新COBOL,这很可怕)

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 开源软件 指南是。它的目标是OpenCOBOL,但是 大部分适用于任何口味的COBOL

01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '. 最后,还有一些供应商指南和手册,其中许多可以在互联网上找到 示例和 是 免费提供。微焦点COBOL
也可以使用指南。搜索您将找到的任何内容…

,作为奖励,rawrnerozero;COBOL在移动
PIC X
字符数据时具有从右到左的空格填充规则,不太常见,但在标准中定义得很好,具有高阶截断和数字零填充规则,ala
PIC 9
。MOVE-123到PIC S99给出-23。我试图创建一个循环,该循环在收到输入“完成”时结束,但它通常会收到一个邮政编码。我使用执行直到循环执行zipcodelookup直到zip=donevar,其中zip是收到的输入,donevar被定义为PIC x(5)值“完成”(空格字符)“。循环不会在我键入done时结束。我的问题不在pic子句中吗?@rawrnerozero向我们展示您的代码……问题可能更多地与执行循环的编码有关。此外,请注意,出于比较目的,“done”与“done”不同。我需要将ZIP-LOOKUP中的内容插入执行循环吗?另外:您知道吗有什么好的资源可以学习更多关于cobol的知识吗?谢谢!谢谢neal,是的,这只是程序的一个框架。你对我在哪里可以阅读更多关于cobol的知识有什么建议吗?我对java和lisp有相当的了解,但我似乎还找不到一本好的cobol书籍/资源。 01 ZIP-RECORD. 02 ZIP PIC X(5). 88 DONE VALUE 'done ', 'quit ', 'stop '.