当记录尚未写入物理文件时如何从 RPGLE 的子文件中删除记录
How to delete a record from a subfile in RPGLE when the record is not already written on to a Physical file
如何在RPGLE中删除子文件中的一条记录,该记录没有写到物理文件中,所以从PF中删除记录并重新加载子文件是行不通的,有没有其他方法可以实现?
简短的回答是 DELETE
。
子文件就像任何其他非键控文件一样工作。您可以通过相对记录号访问记录。有 READC 操作代码,但这可能会混淆事情,并且并不总是 return 您可能期望的那样。在可以通过 300 波特调制解调器和异步工作站控制器访问 5250 会话的日子里,有很多 DDS 东西很有用。现在没有人这样做了。5250 是一种非常高效的协议,因此使用今天的带宽,您不需要在代码中增加额外的复杂性来处理慢速连接。如今,相对于 5250 认为的慢速,它们都快了。
话虽这么说。有几种方法可以从子文件中删除记录。如果你知道要删除的记录的记录号,你可以这样说:
dcl-s rrn Int(5);
rrn = /* record to delete */
delete rrn subfile;
或者如果您不知道要删除的记录的记录号,您可以通读子文件记录来找到它,然后将其删除。像这样:
dcl-s ix Int(5);
dcl-s max_subfile Int(5);
...
for ix = 1 to max_subfile;
chain ix subfile;
if /* the record read is the one to delete */
delete subfile;
endif;
endfor;
一些注意事项:我不喜欢从子文件中删除记录,因为它会在您必须处理的相对记录编号中留下空白,而且我喜欢使用 for 循环处理子文件链而不是 READC
。这样我就永远不必处理 SFLNXTCHG
。它简化了代码。我还立即保留对支持物理文件的更改。但如果这不是一个选项,我已经使用数组来完成 "delete"。方法是将子文件中的记录复制到一个数组中,跳过删除的记录。然后从数组中清除并重新加载子文件。这样子文件的相对记录号就没有间隙了。它看起来像这样:
// Copy subfile to an array, skipping the deleted records
jx = 0;
for ix = 1 to sfl_max;
chain ix subfile rec;
if /* record not deleted */
jx += 1;
array[jx] = rec;
endif;
endfor;
// clear the subfile
sflclear = *On;
write sflctl;
sflclear = *Off;
// load subfile from the array
for ix = 1 to jx;
rec = array[ix];
write subfile;
endfor;
sfl_max = jx;
最后一条评论。如果你不想用一个数组来临时保存好的子文件记录,你可以很容易地使用另一个子文件。
如何在RPGLE中删除子文件中的一条记录,该记录没有写到物理文件中,所以从PF中删除记录并重新加载子文件是行不通的,有没有其他方法可以实现?
简短的回答是 DELETE
。
子文件就像任何其他非键控文件一样工作。您可以通过相对记录号访问记录。有 READC 操作代码,但这可能会混淆事情,并且并不总是 return 您可能期望的那样。在可以通过 300 波特调制解调器和异步工作站控制器访问 5250 会话的日子里,有很多 DDS 东西很有用。现在没有人这样做了。5250 是一种非常高效的协议,因此使用今天的带宽,您不需要在代码中增加额外的复杂性来处理慢速连接。如今,相对于 5250 认为的慢速,它们都快了。
话虽这么说。有几种方法可以从子文件中删除记录。如果你知道要删除的记录的记录号,你可以这样说:
dcl-s rrn Int(5);
rrn = /* record to delete */
delete rrn subfile;
或者如果您不知道要删除的记录的记录号,您可以通读子文件记录来找到它,然后将其删除。像这样:
dcl-s ix Int(5);
dcl-s max_subfile Int(5);
...
for ix = 1 to max_subfile;
chain ix subfile;
if /* the record read is the one to delete */
delete subfile;
endif;
endfor;
一些注意事项:我不喜欢从子文件中删除记录,因为它会在您必须处理的相对记录编号中留下空白,而且我喜欢使用 for 循环处理子文件链而不是 READC
。这样我就永远不必处理 SFLNXTCHG
。它简化了代码。我还立即保留对支持物理文件的更改。但如果这不是一个选项,我已经使用数组来完成 "delete"。方法是将子文件中的记录复制到一个数组中,跳过删除的记录。然后从数组中清除并重新加载子文件。这样子文件的相对记录号就没有间隙了。它看起来像这样:
// Copy subfile to an array, skipping the deleted records
jx = 0;
for ix = 1 to sfl_max;
chain ix subfile rec;
if /* record not deleted */
jx += 1;
array[jx] = rec;
endif;
endfor;
// clear the subfile
sflclear = *On;
write sflctl;
sflclear = *Off;
// load subfile from the array
for ix = 1 to jx;
rec = array[ix];
write subfile;
endfor;
sfl_max = jx;
最后一条评论。如果你不想用一个数组来临时保存好的子文件记录,你可以很容易地使用另一个子文件。