Ibm midrange 为什么READC操作会在单页子文件生成的单选择列表中获取以前选择的值?

Ibm midrange 为什么READC操作会在单页子文件生成的单选择列表中获取以前选择的值?,ibm-midrange,Ibm Midrange,我正在制作一个显示文件,其中包含由单个页面子文件创建的单个选择列表。通过这个实现,我发现了两个问题 第一个是,当我在加载显示文件后第一次按Enter键选择选项时,RPGLE中的READC操作将返回正确的值(它返回子文件记录中的字符串)。当我在选择不同选项的情况下再次按Enter键时,返回了上一次按Enter键时的值。在随后的循环中,它会在选择之前不断返回选择的值。我在程序中第一个READC之后添加了第二个READC,只是为了看看会发生什么,并发现两个READC都返回了值。第一个返回上一个选择的值

我正在制作一个显示文件,其中包含由单个页面子文件创建的单个选择列表。通过这个实现,我发现了两个问题

第一个是,当我在加载显示文件后第一次按Enter键选择选项时,RPGLE中的READC操作将返回正确的值(它返回子文件记录中的字符串)。当我在选择不同选项的情况下再次按Enter键时,返回了上一次按Enter键时的值。在随后的循环中,它会在选择之前不断返回选择的值。我在程序中第一个READC之后添加了第二个READC,只是为了看看会发生什么,并发现两个READC都返回了值。第一个返回上一个选择的值,第二个返回我当前选择的值

第二个问题是,多次选择同一选项不起作用,即它只在第一次起作用,如果我立即再次尝试选择它,它不会响应

我将同样的逻辑应用于另一个由load all子文件组成的单一选择列表,它没有任何这些问题。这是否意味着单页子文件不适合制作单选择列表

以下是子文件的DDS:

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将状态重置回可用状态。我以前的工作实现实际上在每次选择记录后都会重新加载子文件,因此它没有问题。不管怎样,谢谢你。