【问题标题】:run time error in perfoming saving执行保存时出现运行时错误
【发布时间】:2012-03-03 03:02:16
【问题描述】:

您好,我需要一些帮助,如果用户只输入 2 个项目且不超过 5 个项目,我将无法保存。我只能保存 5 个项目,但是当我只输入 3 个项目时,我无法保存我得到运行时错误.也许我在循环时遇到问题。提前谢谢你

我正在使用 mscobol 2.20

这是我的代码,我把它放回文件状态

识别部。 程序 ID。 SOENTRY。 环境科。 输入输出部分。 文件控制。 选择系统文件 分配到磁盘 组织已编入索引 访问模式是随机的 记录密钥是 SYS-FY 文件状态是系统状态。 选择客户文件 分配到磁盘 组织已编入索引 访问模式是随机的 记录关键是 CUSNO 文件状态是客户状态。 选择项目文件 分配到磁盘 组织已编入索引 访问模式是随机的 记录关键是 ITMNO 文件状态是项目状态。 选择 SO-文件 分配到磁盘 组织已编入索引 访问模式是随机的 录音键是 SONO 文件状态是 SO-STATUS。 选择 SOD 文件 分配到磁盘 组织已编入索引 访问模式是随机的 记录键是 SODKEY 文件状态为 SOD 状态。 数据部门。 文件部分。 FD 系统文件标签记录是标准的 文件 ID 的值为“SYSTEM.DAT”。 01 系统记录。 03 SYS-FY PIC 9(4)。 03 系统名称图片 X(50)。 03 SYS-COADDR PIC X(50)。 03 系统用户图片 9(10)。 03 SYS-PWORD PIC 9(10)。 03 SYS-LASTCUSNO PIC 9(5)。 03 SYS-LASTITMNO PIC 9(5)。 03 SYS-LASTSONO PIC 9(7)。 03 SYS-LASTSINO PIC 9(7)。 03 SYS-LASTORNO PIC 9(7)。 03 SYS-RECSTAT PIC A. FD 客户文件标签记录是标准的 文件 ID 的值为“CUSTOMER.DAT”。 01 客户记录。 03 库斯诺图 9(5)。 03 CUSNAME PIC X(40)。 03 CUSADDR PIC X(40)。 03 客户图片 X(40)。 03 CUSCONTACTNO PIC 9(18)。 03 CUSCREDITLIMIT PIC 9(7)V99。 03 CUSBALANCE PIC S9(7)V99。 03 CUSLASTSONO PIC 9(7)。 03 CUSLASTSINO PIC 9(7)。 03 CUSLASTORNO PIC 9(7)。 03 CUSRECSTAT PIC A. FD 项目文件标签记录是标准的 文件 ID 的值为“ITEM.DAT”。 01 项目记录。 03 ITMNO PIC 9(5)。 03 ITMDESC PIC X(40)。 03 ITMUM PIC X(3)。 03 ITMPRICE PIC S9(6)V99。 03 ITMQTYONHAND PIC 9(4)。 03 ITMQTYONORDER PIC 9(4)。 03 ITMLASTONO PIC 9(7)。 03 ITMLASTSINO PIC 9(7)。 03 ITMRECSTAT PIC X。 FD SO-FILE 标签记录是标准的 文件 ID 的值为“SO.DAT”。 01 SO-记录。 03 SONO PIC 9(7)。 03 苏打水 PIC 9(8)。 03 SOCUSNO PIC 9(5)。 03 SOPAYMODE PIC XX。 03 总图 9(7)V99。 03 SOPREPBY PIC X(30)。 03 SOAPPRBY PIC X(30)。 03 SORECSTAT PIC X。 FD SOD 文件标签记录是标准的 文件 ID 的值为“SOD.DAT”。 01 SOD-记录。 03 索德基。 05 索德索诺图 9(7)。 05 SODITMNO PIC 9(5)。 03 SODQTYORD PIC 9(4)。 03 SODQTYINV PIC 9(4)。 03 SODUPRICE PIC 9(6)V99。 03 SODAMOUNT PIC 9(6)V99。 03 SODRECSTAT PIC X。 工作存储部分。 01 ESC 代码 PIC 99 值 0。 88 ESC 键值 1。 88 F2 值 3。 88 F10 值 11。 01 ERRMSG PIC X(75) 值空间。 01 ERR PIC 9 值 0。 01 TEMP-VAR 值归零。 03 VAR-ITMNO PIC 9(5) 发生 5 次。 03 VAR-ITMPRICE PIC 9(6) 发生 5 次。 03 VAR-ITMQTYONORDER PIC 9(4) 发生 5 次。 03 VAR-SODITMQTYORDER PIC 9(4) 发生 5 次。 03 VAR-AMOUNT PIC 9(6) 发生 5 次。 01 TEMP-STR 值空间。 03 VAR-ITMDESC PIC X(40) 发生 5 次。 03 VAR-ITMUM PIC X(3) 发生 5 次。 01 QTYORD PIC 9(4)。 01 行图 9。 01 右图 9。 01 编辑价格。 03 E-PRICE PIC ZZZ,ZZ9.99。 01 我的日期。 03 我的年图 9(4)。 03 我的月图 9(2)。 03 MY-DAY PIC 9(2)。 01 数量 PIC 9(6)V99。 01 总金额 PIC 9(7)V99。 01 客户。 03 VAR-CRDLIMIT PIC Z、ZZZ、ZZ9.99。 03 VAR-BALANCE PIC Z,ZZZ,ZZ9.99。 01 编辑量。 03 E-AMOUNT PIC ZZZ,ZZ9.99。 03 E-TOTAL PIC Z,ZZZ,ZZ9.99。 01 国防部图片 XX。 01 标志图片 9。 01 LBL。 03 LBLSONO PIC 9(7)。 01 APP-上一个。 03 准备好的图片 X(30)。 03 应用图片 X(30)。 01 VAR-项目。 03 VAR-QTYONHAND PIC 9(4)。 03 总数量订单 PIC 9(4)。 01 检查状态。 03 系统状态图片 XX。 03 客户状态图 XX。 03 项目状态图片 XX。 03 状态图 XX。 03 SOD-状态图 XX。 屏幕部分。 01 标题。 03 空白屏幕背景颜色 0。 01 报名表。 03 第 1 行第 31 列图片 X(50) 来自 SYS-CONAME 亮点。 03 第 3 行第 55 列值“SO NO :”。 03 第 4 行第 55 列值“所以日期:”。 03 第 4 行第 68 列值“/”。 03 第 4 行第 73 列值“/”。 03 第 4 行第 2 列值“客户 N0:”。 03 LINE 4 COLUMN 15 PIC 9(5) 使用 CUSNO。 03 第 6 行第 2 列值“名称:”。 03 第 7 行第 2 列值“地址:”。 03 第 17 行第 53 列值“总计 ======>”。 03 行 17 列 66 PIC Z,ZZZ,ZZ9.99 从总金额。 03 第 19 行第 2 列“由以下人员准备:”。 03 LINE 19 COLUMN 14 PIC X(30) 使用 SOPREPBY。 03 第 20 行第 2 列“批准人:”。 03 LINE 20 COLUMN 14 PIC X(30) 使用 SOAPPRBY。 03 第 19 行第 48 列值“CRDTLIMIT:”。 03 行 19 列 64 PIC Z,ZZZ,ZZ9.99 从 VAR-CRDLIMIT。 03 第 20 行第 48 列值“余额:”。 03 行 20 列 64 PIC Z,ZZZ,ZZ9.99 来自 VAR-BALANCE。 03 第 21 行第 48 列值“ITMQTYHAND:”。 03 第 21 行第 64 列图片 9(4) 来自 ITMQTYONHAND。 03 第 6 行第 55 列值“付款方式:”。 01 清除-CUSNO。 03 第 4 行第 15 列值“00000”。 01 CUST-PRO。 03 第 6 行第 15 列图片 X(40) 来自 CUSNAME 背景颜色 0。 03 第 7 行第 15 列图片 X(40) 来自 CUSADDR 背景颜色 0。 01 项目标题。 03 第 9 行第 2 列“项目编号”背景颜色 9。 03 第 9 行第 10 列“”背景颜色 9。 03 第 9 行第 12 列“描述”背景颜色 9。 03 第 9 行第 30 列“”背景颜色 9。 03 第 9 行第 41 列“UOM”背景颜色 9。 03 第 9 行第 47 列“数量”背景-颜色 9。 03 第 9 行第 53 列“单价”背景颜色 9。 03 第 9 行第 67 列“金额”背景颜色 9。 01 功能键。 03 第 24 行第 5 列“Esc”突出显示。 03“=退出”。 03“F2”亮点。 03“=保存”。 03“F10”亮点。 03“=取消”。 01 错误消息。 03 第 25 行第 5 列图片 X(70) 来自 ERRMSG 亮点。 01 清屏。 03 空白屏幕背景颜色 0。 程序部。 主要的。 OPEN I-O SYSTEM-FILE CUSTOMER-FILE ITEM-FILE SO-FILE SOD-FILE。 如果 SOD-STATUS 不 = '00' 显示“错误”SOD-STATUS 停止运行。 如果 SOD 状态 = '05' 显示“错误”SOD-STATUS 停止运行。 如果 SO-STATUS = '00' 显示“错误”SO-STATUS 停止运行。 如果 SO-STATUS = '05' 显示“错误”SO-STATUS 停止运行。 将 2012 年移至 SYS-FY。 读取系统文件无效键移动 1 到错误。 如果错误 = 1 显示“未找到系统记录”。 别的 执行初始化-ITEMREC 显示标题 执行 ENTRY1 直到 ESC-KEY 显示清晰的屏幕。 关闭系统文件客户文件项目文件 SO-FILE SOD-FILE。 停止运行。 条目 1。 计算 SONO = SYS-LASTSONO + 1。 将 SONO 移至 LBLSONO。 显示输入形式项目标题功能键错误消息。 显示 (3 , 65) LBLSONO。 将 2012 年移至我的一年。 显示 ( 4 , 74) 我的年份。 将 1 移动到标记处。 执行 ENTER-MONTH 直到 FLAG = 0 或 ESC-KEY 或 F2 或 F10。 将 1 移动到标记处。 执行 ENTER-DAY 直到 FLAG = 0 或 ESC-KEY 或 F2 或 F10。 移动 1 出错。 执行 ENTER-CUSNO 直到 ERR = 0 或 ESC-KEY 或 F2 或 F10。 显示 CUST-PRO。 将 CUSCREDITLIMIT 移动到 VAR-CRDLIMIT。 将 CUSBALANCE 移至 VAR-BALANCE。 显示 (19 , 66) VAR-CRDLIMIT。 显示(20 , 66) VAR-BALANCE。 移动 1 出错。 执行输入准备直到 ERR = 0 或 ESC 键。 移动 1 出错。 执行 ENTER-APP 直到 ERR = 0 或 ESC 键。 将 1 移动到标记处。 执行 CHCK-MOD 直到 FLAG = 0 或 ESC-KEY。 执行 ITM 输入。 如果 F2 执行保存条目 ELSE IF F10 执行取消条目。 进入月。 接受 (4 , 65) 我的月份。 接受来自 ESCAPE 键的 ESC 代码。 中频 F2 执行保存条目 否则如果 F10 执行取消条目 ELSE IF MY-MONTH 12 将“无效月份”移至 ERRMSG 显示错误信息 别的 将空间移动到 ERRMSG 显示错误信息 将 0 移至标志。 进入日。 接受(4 , 70) MY-DAY。 接受来自 ESCAPE 键的 ESC 代码。 中频 F2 执行保存条目 否则如果 F10 执行取消条目 ELSE IF MY-DAY 31 将“无效日期”移至 ERRMSG 显示错误信息 别的 将空间移动到 ERRMSG 显示错误信息 将 0 移至标志。 ENTER-CUSNO。 接受 (4 , 15) CUSNO。 接受来自 ESCAPE 键的 ESC 代码。 中频 F2 执行保存条目 否则如果 F10 执行取消条目 ELSE IF CUSNO = 零 移动 1 出错 别的 将空间移动到 ERRMSG 执行验证-CUSNO。 验证-CUSNO。 将 0 移至错误。 读取客户文件无效的密钥移动 1 到错误。 如果错误 = 1 将“客户编号未找到”移至 ERRMSG 移动 1 出错 显示清除-CUSNO 显示错误信息 执行清洁 别的 显示错误消息。 CHCK-MOD。 接受 (6 , 69) MOD。 接受来自 ESCAPE 键的 ESC 代码。 IF ESC键 显示清屏 停止运行 如果 F2 执行保存条目 ELSE IF F10 执行取消条目。 如果 MOD = "CA" 或 "CR" 将空间移动到 ERRMSG 显示错误信息 将 0 移至标志 别的 移动“无效输入”。到 ERRMSG 显示错误消息。 进入准备。 接受 (19 , 14 ) 道歉。 接受来自 ESCAPE 键的 ESC 代码。 IF ESC键 显示清屏 停止运行 否则,如果 SOPREPBY = 空格 将 1 移至 ERRMSG 将“请填写”移至 ERRMSG 显示错误信息 别的 将空间移动到 ERRMSG 显示错误信息 将 0 移至错误。 进入应用程序。 接受 (20 , 14 ) SOAPPRBY。 接受来自 ESCAPE 键的 ESC 代码。 IF ESC键 显示清屏 停止运行 ELSE IF SOAPPRBY = 空间 移动 1 出错 将“请填写”移至 ERRMSG 显示错误信息 别的 将空间移动到 ERRMSG 显示错误信息 将 0 移至错误。 ITM 输入。 将 10 移至 LIN。 总金额移动 0。 将 1 移动到行。 执行 ITM-INPUT1,使 R 从 1 到 1 变化,直到 R > 5。 ITM-输入 1。 移动 1 出错。 执行 ITM-INPUT2 直到 ERR = 0 或 F2 或 F10。 ITM-输入 2。 接受 (LIN, 4) ITMNO。 接受来自 ESCAPE 键的 ESC 代码。 IF ESC键 显示清屏 停止运行 否则如果 F2 执行保存条目 否则如果 F10 执行取消条目 别的 将空间移动到 ERRMSG 执行 ITM-INPUT3。 ITM-输入 3。 将 0 移至错误 读取项目文件无效键移动 1 到错误。 如果错误 = 1 移动“ITMNO 编号。未找到。”到 ERRMSG 显示错误信息 别的 显示错误信息 执行 ITM-INPUT4。 ITM-输入 4。 显示 (LIN , 10) ITMDESC 显示 (LIN , 41) ITMUM 将 ITMPRICE 转换为 E-PRICE 显示 (LIN , 52) 电子价格 显示 (21 , 66 ) ITMQTYONHAND 执行验证-ITMQTY。 验证-ITMQTY。 接受(林,48)QTYORD。 将 QTYORD 移动到 VAR-SODITMQTYORDER(R)。 接受来自 ESCAPE 键的 ESC 代码。 IF ESC键 显示清屏 停止运行 ELSE IF VAR-SODITMQTYORDER (R) > ITMQTYONHAND 将“库存不足”移至 ERRMSG 显示错误信息 别的 计算量 = VAR-SODITMQTYORDER (R) * ITMPRICE 将金额转为电子金额 显示 (LIN , 66)E-AMOUNT 林加 1 将 ITMNO 移至 VAR-ITMNO(R) * 将 ITMQTYONORDER 移动到 VAR-ITMQTYONORDER(R)。 将 ITMDESC 移至 VAR-ITMDESC(R) 将 ITMUM 移动到 VAR-ITMUM(行) 计算总数量-QTYONORDER = ITMQTYONORDER + VAR-SODITMQTYORDER(行) 将 ITMPRICE 移动到 VAR-ITMPRICE(R) 将金额移动到 VAR-AMOUNT(R) 计算总金额 = 总金额 + 金额 将总金额移动到 E-TOTAL 显示 (17 , 66) 总计 计算 VAR-QTYONHAND = ITMQTYONHAND - VAR-SODITMQTYORDER(R) 将 1 添加到行。 保存条目。 执行 SAVE-SOD 从 1 到 1 变化 R 直到 R = 行。 执行保存。 将 LBLSONO 移至 CUSLASTSONO。 重写客户记录。 将 LBLSONO 移至 SYS-LASTSONO。 重写系统记录。 移动“记录的条目”。到 ERRMSG。 显示错误消息。 执行初始化-ITEMREC。 保存草皮。 将 LBLSONO 移至 SODSONO。 将 VAR-ITMNO(R) 移至 SODITMNO。 将 VAR-SODITMQTYORDER(R) 移动到 SODQTYORD。 将 VAR-ITMPRICE(R) 移至 SODUPRICE。 将 VAR-AMOUNT(R) 移至 SODAMOUNT。 写 SOD 记录。 执行保存项目。 保存项目。 将 VAR-ITMNO(R) 移至 SODITMNO。 阅读项目文件。 将 VAR-QTYONHAND 移动到 ITMQTYONHAND。 将 TOTAL-QTYONORDER 移动到 ITMQTYONORDER。 将 LBLSONO 移至 ITMLASTONO。 重写项目记录。 保存,所以。 将 LBLSONO 移至 SONO。 将我的约会移至苏打。 将 CUSNO 移动到 SOCUSNO。 将总金额移动到总金额。 * 将准备工作转移到 SOPREPBY。 * 将应用程序移至 SOAPPRBY。 将“O”移至 SORECSTAT。 写记录。 取消条目。 将“已取消的条目”移至 ERRMSG。 执行初始化-ITEMREC。 初始化-ITEMREC。 向客户记录移动零。 将零移至 CUSNO ITMNO。 将零到 CUSBALANCE CUSCREDITLIMIT。 将零移至 SODAMOUNT SODUPRICE。 将零移至总金额 SORECSTAT。 将 0 移至 R。 将空间移动到 TEMP-STR。 将空间移至 SOPREPBY SOAPPRBY。 将“A”移动到 ITMRECSTAT。 将“O”移至 SODRECSTAT。 将空间移动到 SOPAYMODE MOD。 将零移至 SODQTYINV ITMQTYONHAND。 将空间移动到 CUSNAME CUSADDR。 干净的。 将空间移动到 CUSNAME。 将空间移动到 CUSADDR。

我没有像你的例子那样使用,因为我不知道如何使用它。它在编译时给我一个错误。顺便说一句,先生为什么如果我有文件状态检查我的程序将不会运行它会写入 so.dat 和 sod.dat 并且会生成我的 sono,但是如果我将删除文件状态,我的程序将在仅输入 3 个或少于 5 个项目时出现输入输出错误。请您启发我的想法.提前谢谢你。

【问题讨论】:

  • 为什么每次 I/O 操作后不检查文件状态?这将非常有帮助。在对上一个问题的回答中向您展示了如何执行此操作 - 这仍然是我对您的最佳建议。
  • @NealB 嗨,先生,我没有检查文件状态是因为我试图运行以输入 5 个项目或 5 行吗?它会写入 so.dat 和我的 sod.dat。并且写作没有问题。我怀疑的是,我认为我在执行语句中循环从 1 到 1 到行 > 5 的行有问题。
  • @NealB,先生,我编辑了我的代码,现在将文件状态放入,但我没有使用 when 语句,因为我不知道如何使用它。我只使用 if 语句
  • 这里是一个很老的未解决问题。我尝试使用 GnuCOBOL 3.1.2 (cobc -fregister=LIN,COL SONAME.cbl) 编译它,并提示有两个语法错误,不确定 mscobol 是否真的编译了:ELSE IF MY-MONTH 12ELSE IF MY-DAY 31 都错过了 =(添加+编译)。我试图理解这个问题但失败了(也许你可以编辑它以使其简洁,类似于你最近的问题)。您是否知道代码的意图(回顾性内联 cmets 通常是一个好主意 :-) 做什么?逻辑:SO-FILE被检查为不存在,那么WRITE SO-RECORD就完成了?

标签: cobol


【解决方案1】:

我强烈建议使用 END-IF 语句整理您的代码,因为这会使代码更易于理解和阅读。如果您只依赖句号,那么您可能会错过一个,这似乎是“CHK-MOD”段落中的“STOP RUN”行的情况。虽然这可能不是您的文件错误的问题。

另外,我建议您弄清楚如何使用 EVALUATE 语句,因为这些语句可以使代码更具可读性。考虑以下替代 ENTER-MONTH 段落:

ENTER-MONTH.
       ACCEPT(4 , 65)MY-MONTH.
       ACCEPT ESC-CODE FROM ESCAPE KEY.
       EVALUATE TRUE
          WHEN F2
             PERFORM SAVE-ENTRIES

          WHEN F10
             PERFORM CANCEL-ENTRIES

          WHEN MY-MONTH > 12
             MOVE "INVALID MONTH" TO ERRMSG
             DISPLAY ERROR-MESSAGE

          WHEN OTHER
             MOVE SPACES TO ERRMSG
             DISPLAY ERROR-MESSAGE
             MOVE 0 TO FLAG
       END-EVALUATE.

您的 SAVE-ITEM 段落有点神秘。 ITEM-FILE 的键是 ITMNO,但您在 READ 之前将 Item No 移动到 SODITMNO。此外,您假设 ITEM-FILE 记录存在并且始终执行 REWRITE。如果记录不存在怎么办?

最后,我不确定这是否重要,但您没有定义 DECLARATIVES 部分。这通常是捕获 I/O 错误并继续处理它们的方法。

我还会在您的文件状态(ITEM-STATUS、SO-STATUS、SOD-STATUS 等)上放置 88 个级别值,以便您可以测试这些值而不是状态值。例如,您可能在 ITEM-STATUS 下的 ITEM-NOT-FOUND 有 88 级值。

如果可以的话,使用这些可读性改进来编辑您的源代码,我们或许能够更好地发现您的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 2021-02-22
    • 2013-06-05
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    相关资源
    最近更新 更多