如何在微焦点cobol中更新索引文件的主键

问题描述

我需要更新我正在按顺序读取的索引记录的主键我知道我不能使用重写来做到这一点,任何建议

前 5 个 move 语句是主键。

           move perdt1-pno         to perat-pno
           move zeros              to perat-bno
           move space              to perat-eng-type
           move space              to perat-shift-code
           move zeros              to perat-area
           start perat-file key > perat-key
           invalid key
               set end-of-infile         to true
           not invalid key

             
               read perat-file next ignore lock
               at end
                   continue
               end-read

               
               display "meow"
               perform 
               varying ws-sub from 1 by 1
               until ws-sub > 10
               or perat-pno not = perdt1-pno
               
               
                   if  (perat-pno = perdt1-pno)
                   and (in-apc <> perat-bno)
                       
                       display "meow2"
                       display perat-pno
                       move in-apc     to perat1-bno
                       move in-perat-area
                                       to perat1-area
                       move in-primary-skill
                                       to perat1-eng-type
                       if in-primary-skill <> spaces
                           move "P" to perat-primary-skill
                       else
                           move "S" to perat-primary-skill
                       end-if
                       
                       //i cant do rewrite here.
                   
   

解决方法

如您所见,主索引没有 REWRITE,因为一旦您更改 REWRITE 不会更改先前的读取记录,而是更改具有新主记录的记录 -如果存在。
这就是 ORGANIZATION INDEXED 的工作原理。

常做的事情:

  • READ 旧记录(可能是 WITH LOCK
  • 如果您还没有:保存关键字段的旧值
  • 将新值放在关键字段中,然后是 WRITE,最好使用 INVALID KEY 子句来捕捉这种情况
  • 结果是以下之一:
    • INVALID KEY 条件(=重复):-您必须决定它是否应该是 DELETED(如果是,则再次重新读取旧记录,“更新”其关键字段并执行再次INSERT,否则通过手动错误消息或让运行时系统处理重复键来中止)
    • NOT INVALID KEY 条件 - 一切正常
  • 将保存的(旧)值放在键字段中,然后是 DELETE(否则文件中的记录将同时包含旧键值和新键值)

根据您环境中的规则,您可能需要使用新密钥 READ,因此在 INVALID KEY 期间永远不要进入 WRITE 条件。