0

我正在使用 NetCOBOL for .NET 来扩展 COBOL 应用程序。当我通读并输入文件时,我正在对数字字段和某些记录进行简单比较,但INVALID VALUE SPECIFIED出现错误。

该字段为 INV-MST-ONHAND 定义:

 02   INV-MST-LOCATION OCCURS 3.                  
    04 INV-MST-ONHAND         PIC S9(7)V999.
    04 INV-MST-SALES          PIC S9(6) OCCURS 12.         
    04 INV-MST-PTDSALE        PIC S9(6)V999.

比较在这行代码中

IF INV-MST-ONHAND(1) > 0 MOVE INV-MST-ONHAND(1) TO WS-ITEM-ONHAND.

它只发生在一些记录上。数据文件已编入索引,因此不易手动解析。我正在寻找一种方法来修复它,甚至跳过这些,但我不知道如何捕捉和处理这种错误情况。

这是完整的记录布局:

000381 FD INVMAST
000382     RECORD 845 CHARACTERS.
000383 01  INV-MST-REC.
000384     02   INV-MST-MCS             PIC X(10).
000385     02   INV-MST-KEY.
000386       04 INV-MST-ITEM-NO            PIC X(15)
000387    02   INV-MST-ALT1-KEY.
000389       04 INV-MST-PLU                 PIC 9(13).
000390     02   INV-MST-ALT2-KEY.
000391       04 INV-MST-WORDS1         PIC X(10).
000392     02   INV-MST-ALT3-KEY.
000393       04 INV-MST-WORDS2         PIC X(10).
000394     02   INV-MST-ALT4-KEY        PIC X(10).
000395     02   INV-MST-ALT5-KEY.
000396       04 INV-MST-CATEGORY       PIC X(10).
000399     02   INV-MST-UPC-KEYS.
000400       04 INV-MST-UPC01-KEY       PIC X(15).
000401       04 INV-MST-UPC02-KEY       PIC X(15).
000402       04 INV-MST-UPC03-KEY       PIC X(15).
000403       04 INV-MST-UPC04-KEY       PIC X(15).
000404       04 INV-MST-UPC05-KEY       PIC X(15).
000405       04 INV-MST-UPC06-KEY       PIC X(15).
000406       04 INV-MST-UPC07-KEY       PIC X(15).
000407       04 INV-MST-UPC08-KEY       PIC X(15).
000408       04 INV-MST-UPC09-KEY       PIC X(15).
000409       04 INV-MST-UPC10-KEY       PIC X(15).
000410       04 INV-MST-UPC11-KEY       PIC X(15).
000411       04 INV-MST-UPC12-KEY       PIC X(15).
000412     02   INV-MST-ITEM-NAME.
000454      04  INV-MST-NAME1          PIC X(20).
000455      04  INV-MST-NAME2          PIC X(20).
000456      04  INV-MST-NAME3          PIC X(20).           
000457     02   INV-MST-SCRAP          PIC 9(6)V99.
000458     02   INV-MST-ENV-LEVY       PIC 9(3)V99.
000459     02   INV-MST-UORD           PIC XXX.
000460     02   INV-MST-USTOCK         PIC XXX.
000461     02   INV-MST-UUNO           PIC 99999.
000462     02   INV-MST-VEND1          PIC 9999.
000463     02   INV-MST-VEND2          PIC 9999.
000464     02   INV-MST-VEND3          PIC 9999.          
000465     02   INV-MST-ONORDER        PIC 9(6).
000466     02   INV-MST-COMMIT         PIC 9(6).
000467     02   INV-MST-REORD          PIC 9(5).          
000468     02   INV-MST-MINORD         PIC 9(5).
000469     02   INV-MST-BASIS          PIC 99.
000470     02   INV-MST-BIN            PIC X(6).
000471     02   INV-MST-GL             PIC 9(4).
000472     02   INV-MST-DEPT           PIC 999.
000473     02   INV-MST-ALTITEM1       PIC X(15).
000474     02   INV-MST-ALTITEM2       PIC X(15).            
000476     02   INV-MST-COST1          PIC 9(6)V99.
000477     02   INV-MST-COST2          PIC 9(6)V99.
000478     02   INV-MST-COST3          PIC 9(6)V99.
000479     02   INV-MST-COST4          PIC 9(6)V99.
000480     02   INV-MST-SELLPRICES. 
000481      04  INV-MST-SELL1          PIC 9(6)V99.
000482      04  INV-MST-SELL2          PIC 9(6)V99.
000483      04  INV-MST-SELL3          PIC 9(6)V99.
000484      04  INV-MST-SELL4          PIC 9(6)V99.
000485      04  INV-MST-SELL5          PIC 9(6)V99.         
000486     02   FILLER REDEFINES INV-MST-SELLPRICES.
000487      04  INV-MST-SELL                PIC 9(6)V99 OCCURS 5.
000488    02     INV-MST-SELLPRICE-FACTORS.
000489       04 INV-FACTOR OCCURS 5.
000490       06 INV-PRC-FACTOR          PIC 9V99.
000491       06 INV-COST-BASE               PIC X.              
000492     02   INV-MST-SALE-DECPT     PIC 9.
000493     02   INV-MST-STOCK-DECPT    PIC 9.
000494     02   INV-MST-PRICE-UNITS    PIC 9999.
000495     02   INV-MST-ALTERNATE-UNITS.
000496       04 INV-MST-ALT-DESC            PIC X(10).
000497       04 INV-MST-ALT-ABBREV      PIC XX.
000498       04 INV-MST-ALT-FACTOR      PIC 9(3)V9(4).
000499       04 INV-MST-ALT-SALE-FLAG   PIC X.
000500       04 INV-MST-ALT-ORDER-FLAG  PIC X.
000501     02   INV-MST-TAX1           PIC X.
000502     02   INV-MST-TAX2           PIC X.            
000503     02   INV-MST-LOCATION OCCURS 3.                  
000504       04 INV-MST-ONHAND         PIC S9(7)V999.
000505       04 INV-MST-SALES          PIC S9(6) OCCURS 12.         
000506       04 INV-MST-PTDSALE        PIC S9(6)V999.             
000507     02   INV-MST-FIL            PIC X(30). 

当我检查INV-MST-ONHAND(1)失败时的值时,Visual Studio 调试器显示 +0000000.000 的值,并且使用 Quick Watch 条件测试为真。

当我检查 INV-MST-LOCATION(1) 时,我看到了这个快速观看

4

1 回答 1

2

CHECK您正在使用带有子选项的编译器选项(NUMERIC)(ALL)

这正在产生JMP0828I-U消息。U意味着它将结束执行。您可以在某个地方告诉它生成E消息的后缀,在这种情况下,您会收到消息,但会继续执行。

问题是您的数据不“符合图片”。您的字段被定义为有符号(S在您的 PICture 字符串中),但不存在表示正值或负值的过冲。

您提到您创建了数据。我怀疑的是,您在创建数据时不小心将该字段描述为无符号(S图片字符串中没有),然后为了方便起见,将组移动到记录中,允许无符号值进入您的签名字段。

当您尝试 IF 测试时,CHECK(NUMERIC) 或 CHECK(ALL) 发现了这一点,并产生了消息(并结束了您的程序)。

有趣的是,您的NUMERIC测试是正确的。可能有一个编译器选项来描述 NUMERIC 测试中的有效内容。您需要找到它,并确保只有正数和负数,而不是无符号,对有符号字段有效。

一些经验教训:消息参考很重要,它允许您找到有关消息的更多信息 - 为您将来的搜索,排除后缀,因为文档中的描述没有单独描述后缀;避免分组 MOVE - 或非常小心它们 - 缺少符号,或错误的长度或小数位数可能会给您带来细微的错误,不值得节省编码与时间追逐细微之处。

使用调试器,您应该查看是否有某种方法可以查看实际源值,而不是您在问题中显示的“编辑”值。看到实际的来源会更早地帮助你。

非 COMPUTATIONAL 数字是“分区的”。每个字节一个数字,前面是“区域”值。对于无符号值,所有数字都已分区。对于有符号值,低位字节具有“overpunch”来指示正数或负数。

无符号值始终被视为正数。

1985 标准的 COBOL 没有“捕获”由非数字值引起的错误的机制。您的文档将表明您是否有任何方法可以使用 NetCOBOL 运行时执行此操作。

于 2016-02-24T23:46:03.203 回答