比较时指定的 NetCOBOL 无效值
NetCOBOL Invalid Value Specified on Comparison
我正在使用 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) 时,我看到了这个
您正在使用带有子选项 (NUMERIC)
或 (ALL)
的编译器选项 CHECK
。
这正在生成 JMP0828I-U
消息。 U
表示它将结束执行。您可以在某个地方告诉它生成 E
作为消息的后缀,在这种情况下您会收到消息但执行会继续。
问题是你的数据没有"conform to PICture"。您的字段被定义为带符号的(您的 PICture 字符串中的 S
),但不存在指示正值或负值的重叠。
您提到您创建了数据。我怀疑的是,在您创建数据的地方,您不小心将该字段描述为无符号(PICture 字符串中没有 S
),然后为了方便起见,对记录进行了组移动,从而允许获得无符号值进入您的签名字段。
CHECK(NUMERIC) 或 CHECK(ALL) 在您尝试 IF 测试时发现了这一点,并生成了消息(并结束了您的程序)。
有趣的是,您的 NUMERIC
测试是正确的。可能有一个编译器选项来描述 NUMERIC 测试中有效的内容。您需要找到它,并确保只有正数和负数(而不是无符号)对带符号的字段有效。
几个教训:消息引用很重要,它可以让您找到有关消息的更多信息 - 为了您以后的搜索,排除后缀,因为文档中的描述没有单独描述后缀;避免 group MOVEs - 或者非常小心 - 一个丢失的符号,或者错误的长度或小数位数会给你带来细微的错误,它不值得节省编码而不是时间追逐细微之处。
使用调试器,您应该看看是否有某种方法可以查看实际源值,而不是您在问题中显示的 "edited" 值。看到实际的来源会更早地帮助你。
非计算数字是 "zoned"。每个字节一位,前面是 "zone" 值。对于无符号值,所有数字都已分区。对于有符号值,低位字节有 "overpunch" 来指示正数或负数。
无符号值始终被视为正值。
1985 年标准的 COBOL 没有针对 "catch" 由非数值引起的错误的机制。您的文档将表明您是否有任何方法可以使用您的 NetCOBOL 运行-time.
我正在使用 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) 时,我看到了这个
您正在使用带有子选项 (NUMERIC)
或 (ALL)
的编译器选项 CHECK
。
这正在生成 JMP0828I-U
消息。 U
表示它将结束执行。您可以在某个地方告诉它生成 E
作为消息的后缀,在这种情况下您会收到消息但执行会继续。
问题是你的数据没有"conform to PICture"。您的字段被定义为带符号的(您的 PICture 字符串中的 S
),但不存在指示正值或负值的重叠。
您提到您创建了数据。我怀疑的是,在您创建数据的地方,您不小心将该字段描述为无符号(PICture 字符串中没有 S
),然后为了方便起见,对记录进行了组移动,从而允许获得无符号值进入您的签名字段。
CHECK(NUMERIC) 或 CHECK(ALL) 在您尝试 IF 测试时发现了这一点,并生成了消息(并结束了您的程序)。
有趣的是,您的 NUMERIC
测试是正确的。可能有一个编译器选项来描述 NUMERIC 测试中有效的内容。您需要找到它,并确保只有正数和负数(而不是无符号)对带符号的字段有效。
几个教训:消息引用很重要,它可以让您找到有关消息的更多信息 - 为了您以后的搜索,排除后缀,因为文档中的描述没有单独描述后缀;避免 group MOVEs - 或者非常小心 - 一个丢失的符号,或者错误的长度或小数位数会给你带来细微的错误,它不值得节省编码而不是时间追逐细微之处。
使用调试器,您应该看看是否有某种方法可以查看实际源值,而不是您在问题中显示的 "edited" 值。看到实际的来源会更早地帮助你。
非计算数字是 "zoned"。每个字节一位,前面是 "zone" 值。对于无符号值,所有数字都已分区。对于有符号值,低位字节有 "overpunch" 来指示正数或负数。
无符号值始终被视为正值。
1985 年标准的 COBOL 没有针对 "catch" 由非数值引起的错误的机制。您的文档将表明您是否有任何方法可以使用您的 NetCOBOL 运行-time.