如何在microfocus cobol中更新索引文件的主键

how to update primary key of index file in microfocus 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 使用新密钥,因此永远不要在 WRITE.[=25 期间进入 INVALID KEY 状态=]