Ibm midrange 为什么READC操作会在单页子文件生成的单选择列表中获取以前选择的值?
我正在制作一个显示文件,其中包含由单个页面子文件创建的单个选择列表。通过这个实现,我发现了两个问题 第一个是,当我在加载显示文件后第一次按Enter键选择选项时,RPGLE中的READC操作将返回正确的值(它返回子文件记录中的字符串)。当我在选择不同选项的情况下再次按Enter键时,返回了上一次按Enter键时的值。在随后的循环中,它会在选择之前不断返回选择的值。我在程序中第一个READC之后添加了第二个READC,只是为了看看会发生什么,并发现两个READC都返回了值。第一个返回上一个选择的值,第二个返回我当前选择的值 第二个问题是,多次选择同一选项不起作用,即它只在第一次起作用,如果我立即再次尝试选择它,它不会响应 我将同样的逻辑应用于另一个由load all子文件组成的单一选择列表,它没有任何这些问题。这是否意味着单页子文件不适合制作单选择列表 以下是子文件的DDS:Ibm midrange 为什么READC操作会在单页子文件生成的单选择列表中获取以前选择的值?,ibm-midrange,Ibm Midrange,我正在制作一个显示文件,其中包含由单个页面子文件创建的单个选择列表。通过这个实现,我发现了两个问题 第一个是,当我在加载显示文件后第一次按Enter键选择选项时,RPGLE中的READC操作将返回正确的值(它返回子文件记录中的字符串)。当我在选择不同选项的情况下再次按Enter键时,返回了上一次按Enter键时的值。在随后的循环中,它会在选择之前不断返回选择的值。我在程序中第一个READC之后添加了第二个READC,只是为了看看会发生什么,并发现两个READC都返回了值。第一个返回上一个选择的值
A R ITFMAT02
A S1OPTN 50 A 6 11
A R ITFMAT01
A SFLCLT(ITFMAT02)
A 27 SFLDSP
A 28 SFLCLR
A 29 SFLEND
A CF12(12)
A SFLSNGCHC(*AUTOSLT)
以下是RPGLE主循环:
C *IN12 DOWEQ *OFF
C EXFMT ITFMAT01
C *IN12 IFEQ *ON
C LEAVE
C ENDIF
C READC ITFMAT02
C MOVEL S0OPTN W1OPTN
.
.
.
C ENDDO
READC的行为与预期完全一致。readchanged的“Changed”部分读取一个被称为修改的数据标记。如果用户对子文件记录进行了更改(包括空格键在内的任何更改),则会为该记录启用MDT。这意味着如果用户接触多个记录,则会打开多个MDT。典型的用法是将READC放入一个循环中,以便RPG程序处理每个被触摸的记录。至于MDT没有关闭的原因,您是否使用了
SFLNXTCHG
对第二个问题不确定;张贴您正在使用的DDS和RPG。这里是一个工作示例。我怀疑你没有清除选择控制区
A*
A R ITFMAT02 SFL
A CTL 1Y 0H SFLCHCCTL
A S1OPTN 50A 6 11
A*
A R ITFMAT01
A SFLCTL(ITFMAT02)
A 27 SFLDSP
A N28 SFLDSPCTL
A 28 SFLCLR
A 29 SFLEND
A SFLSIZ(15)
A SFLPAG(05)
A CF12(12)
A SFLSNGCHC(*AUTOSLT)
A SFLRRN 4S 0H SFLRCDNBR(CURSOR)
A 1 30'Title'
A CHOICE 4S 0 3 1
A 4 5'Choose one'
还有RPG。我通常不以固定的格式工作,但我尝试镜像现有的样式
fsotest cf e workstn
f SFILE(itfmat02:RRN)
c* clear sfl
c z-add 1 sflrrn
c setoff 272829
c seton 28
c write itfmat01
c setoff 28
c* load sfl
c 1 do 9 rrn 4 0
c movel rrn s1optn
c write itfmat02
c seton 27
c enddo
C *IN12 DOWEQ *OFF
C EXFMT ITFMAT01
C *IN12 IFEQ *ON
C LEAVE
C ENDIF
C READC ITFMAT02 80
C n80 do
C movel rrn choice
C z-add 0 ctl
C update itfmat02
C enddo
C ENDDO
c seton lr
它被定义为单个选择列表。它不应该只返回我选择的内容而不返回其他内容吗?正如我所说的,它对loadall子文件工作得很好。我没有在DDS中使用SFLNXTCHG。我从来没有在我的实现中使用这个SFLCHCCTL关键字,它们通常工作得很好。我怀疑它与单页子文件实现本身有关,而不是单选项列表部分。发布的DDS不是一个完整的子文件。缺少SFLSIZ和SFLPAG等,因此很难知道“单页子文件”是什么意思。在我看来,如果您有一个选择子文件SFLSIZ>SFLPAG,并且它可以工作,那么您唯一要做的更改就是使SFLSIZ=SFLPAG失败,那么您应该调用IBM支持人员并报告一个错误。作为单页子文件的要点是,每当按下page up和page down键时,当前子文件页将完全重新加载。是的,SFLSIZ=SFLPAG是这个实现的一部分,但我不能说这是问题的原因。单个选择是否可能与同一显示中的其他输入字段共存?现在不必担心。我已经找到了问题的真正原因。默认系统设置是不会自动取消选择子文件记录。因此,当我再次按Enter键时,READC将读取以前选择的一个,因为它仍处于被选择状态。解决方案是在DDS中使用SFLCHCCTL将状态重置回可用状态。我以前的工作实现实际上在每次选择记录后都会重新加载子文件,因此它没有问题。不管怎样,谢谢你。