如何在microfocus cobol中更新索引文件的主键
我需要更新索引记录的主键,我正在按顺序读取它。我知道我不能使用“重写”来完成此操作,有什么建议吗 前5个move语句是主键如何在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
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规则,这是您在参观时了解的),以便更清楚地了解您想要了解的内容,然后编辑此问题,删除新问题中发现的部分。我没有得到此点->将旧的关键字段放入,然后删除您需要删除
该“旧”记录,否则文件中既有旧的记录,也有新的记录。