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

如何在microfocus cobol中更新索引文件的主键,cobol,microfocus,Cobol,Microfocus,我需要更新索引记录的主键,我正在按顺序读取它。我知道我不能使用“重写”来完成此操作,有什么建议吗 前5个move语句是主键 move perdt1-pno to perat-pno move zeros to perat-bno move space to perat-eng-type move space to p

我需要更新索引记录的主键,我正在按顺序读取它。我知道我不能使用“重写”来完成此操作,有什么建议吗

前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.
                   
   
按DT1 pno移动到操作pno
移动零以操作bno
将空格移动到操作引擎类型
移动空格以操作移位代码
将零移动到操作区域
启动操作文件密钥>操作密钥
无效密钥
将内嵌结束设置为true
非无效密钥
读取操作文件下一个忽略锁
最后
持续
结束阅读
显示“喵喵”
表演
将ws-sub从1变为1
直到ws sub>10
或操作pno not=perdt1 pno
如果(操作pno=每个DT1 pno)
和(在apc操作bno中)
显示“meow2”
显示操作pno
将apc移到perat1 bno
迁入禁区
到第1区
初级技能中的移动
到1个eng类型
如果在主要技能空间中
移动“P”来操作初级技能
其他的
移动“S”来操作基本技能
如果结束
//我不能在这里重写。

正如您所看到的,主索引没有
重写
,因为只要您更改
重写
就不会更改以前的读取记录,而是更改具有新主记录的记录(如果存在)。
这就是编制索引的组织的工作方式

通常的做法是:

  • 读取
    旧记录(可能
    带锁
  • 如果还没有:保存键字段的旧值
  • 将新值放在键字段中,然后
    写入
    ,最好使用
    无效键
    子句来捕捉这种情况
  • 结果是:
    • 无效密钥
      条件(=重复):-您必须决定是否应删除该项(如果是,则再次重新读取旧记录,“更新”其密钥字段,并再次执行
      插入
      ,否则,通过手动错误消息或让运行时系统处理重复密钥来中止)
    • 钥匙不无效
      状况-一切正常
  • 将保存的(旧)值放在键字段中,然后
    删除
    (否则文件中的记录将同时包含旧键值和新键值)

根据您环境中的规则,您可能需要使用新钥匙
读取
,因此在
写入

过程中永远不要进入
无效钥匙
状态。我想我已经回答了您的主要问题,带有
的发生
是另一个问题。我强烈建议将其放入一个单独的问题中(根据SO的1 Q+1规则,这是您在参观时了解的),以便更清楚地了解您想要了解的内容,然后编辑此问题,删除新问题中发现的部分。我没有得到此点->将旧的关键字段放入,然后删除您需要
删除
该“旧”记录,否则文件中既有旧的记录,也有新的记录。