免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jlwrp
打印 上一主题 下一主题

ILE RPG4 C表常用操作码学习笔记(按字母顺序发) [复制链接]

论坛徽章:
0
31 [报告]
发表于 2005-06-13 15:47 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

EXFMT(写/然后读格式)

                操作码                因子1                因子2                结果字段                  指示器
                EXFMT                                        记录格式名                                -  ER  -

    EXFMT操作是对同一个记录格式先写后读的组合操作。EXFMT仅对外部描述的WORKSTN文件有效,该文件可以定义为一个外部描述的(文件描述规范表22列是E)全过程文件(文件描述规范表的18列是F)或组合文件(文件描述规范表的17列是C)。
    因子2必须是先写后读的记录格式名。可以在73和74列上说明一个结果指示器,当EXFMT操作不成功时置为ON。当指示器置为ON时,操作的读部分不执行(记录标识指示器和字段不改变)。71,72,75和76列必须是空格。
    对多设备文件使用EXFMT,请参阅READ和WRITE操作的描述。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      FFilename++IPEASFRLen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++
      F*
      F* PROMTD是WORKSTN文件,它提示用户一个选项,根据用户输入的
      F* 内容,程序执行不同的子例程进行增加、删除或修改记录。
      F*
      FPROMTD    CF   E             WORKSTN
      F*
      F* 如果用户按了F3键,指示器*IN03为ON,结束DOW循环。
      F*
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C
      C                   DOW       *in03 = *off
      C
      C* EXFMT在屏幕上给出提示,等待用户输入一个选项,SCR1是定义在
      C* WORKSTN文件的记录格式名,OPT是记录中的一个字段。
      C*
      C
      C                   EXFMT     SCR1
      C                   SELECT
      C                   WHEN      OPT = 'A'
      C                   EXSR      ADDREC
      C                   WHEN      OPT = 'D'
      C                   EXSR      DELREC
      C                   WHEN      OPT = 'C'
      C                   EXSR      CHGREC
      C                   ENDSL
      C                   ENDDO
                           :
                           :
  
图137  EXFMT举例

4.4.36  EXSR(激活子例程)

                操作码                因子1                因子2                结果字段                指示器
                EXSR                                        子程序名

    EXSR操作是执行在因子2规定的RPGⅣ子程序。该子程序名必须是一个唯一的符号名,而且必须在BEGSR操作的因子1上出现。EXSR操作可以在计算说明的任何地方编写。它一出现就执行命名的子程序。
    子程序中的操作执行以后,执行EXSR后面的语句,除非子程序内的一个GOTO语句给出子程序外的一个标号或该子程序是一个在ENDSR操作的因子2上规定的异常/错误子程序。
    因子2中的*PSSR说明执行程序异常/错误子程序。因子2中的*INZSR用于说明执行程序初始化子程序。

4.4.37 编写子程序

    一个RPGⅣ子程序可以在计算操作中的任一点上执行。所有RPG操作都可在一个子程序内执行,而且这些操作可以用9-11列的有效指示器来进行条件限制。7-8列上可以是SR或空格。在这些列上不能使用控制级指示器(L1-L9)。然而,子程序内的AND/OR行可以在7-8列上指出。
    子程序使用的字段可以在子程序内定义,也可以在程序其它地方定义。主程序和子程序都能使用该字段。
    一个子程序不能包含另一个子程序。但一个子程序可以调用另一个子程序;即一个子程序中可有EXSR或CASxx语句 ,但在一个子程序内的EXSR或CASxx不能调用它本身。因为这可能产生不可预测的结果。如果想走到同一个子程序内的另一点时,可以使用GOTO和TAG语句。
    不必须说明子程序的使用顺序。每一个子程序都必须有一个唯一的符号名,必须有一个BEGSR和一个ENDSR语句。
    在子程序内允许使用GOTO(分支)操作。GOTO可以在子程序的ENDSR操作上指定标号。GOTO不能用于走到某个子程序内的TAG或ENDSR发出,除非此GOTO与TAG或ENDSR在同一子程序内。子程序内的GOTO可以走到明细计算或总计计算内的TAG处。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* 对于子例程,7和8列必须是空格或SR。
      C*
      C                         :
      C                         :
      C                   EXSR      SUBRTB
      C                         :
      C                         :
      C                         :
      CL2                 EXSR      SUBRTA
      C                         :
      C                         :
      C                         :
      C     SUBRTA        BEGSR
      C                         :
      C                         :
      C                         :
      C*  一个子例程调用另一个子例程。
      C*
      C                   EXSR      SUBRTC
      C                         :
      C                         :
      C                         :
      C                   ENDSR
      C     SUBRTB        BEGSR
      C                         :
      C                         :
      C                         :
      C*
      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  在子例程中可以使用GOTO和TAG操作。
      C     START         TAG
      C                         :
      C                         :
      C                         :
      C   23              GOTO      END
      C                         :
      C                         :
      C                         :
      C   24              GOTO      START
      C     END           ENDSR
      C     SUBRTC        BEGSR
      C                         :
      C                         :
      C                         :
      C                   ENDSR
      C*

图138  子程序编码举例
IF (if)

                操作码                因子1                因子2
                  IF                        空格                表达式
    如果条件满足,IF操作码允许执行一系列操作码。它的功能与IFxx操作码相似,区别在于扩展因子2输入的表达式的值做为逻辑条件。当扩展因子2字段上的表达式为真时,执行IF操作控制的操作。


      CL0N01Factor1+++++++OpcodeE+Extended-factor2+++++++++++++++++++++++++++++++
      C                           Extended-factor2-continuation++++++++++++++++++
      C*
      C* 当表达式为真时,执行IF控制的操作,即A大于等于10且指示器20为ON。
      C*
      C
      C                   IF      A>;10 AND *IN(20)
      C                   :
      C                   ENDIF
      C*
      C* 当Date1比Date2的日期晚时,执行由IF控制的操作。
      C*
      C
      C                   IF      Date1 >; Date2
      C                   :
      C                   ENDIF
      C*
  
图141  IF操作

4.4.43  IFxx(如果)

                操作码                因子1                因子2                结果字段                指示器
                IFxx                        比较字                比较字

    当因子1与因子2之间存在由xx说明的某种关系时,IFxx 操作允许执行一组计算。当“ANDxx”和“ORxx”与IFxx 联用,如果组合操作条件成立,才执行这组计算,xx的含义,见4.3.19的“结构程序设计操作”。
    可以使用条件指示器,因子1和因子2必须是文字、一个命名常量、一个象征常量、一个表名、一个数组元素、一个数据结构名或一个字段名。因子1与因子2必须是同一的类型。
    如果由IFxx和任何组合的ANDxx或ORxx操作说明的关系不成立,控制转给紧跟在相匹配的ENDIF操作后面的计算操作。如果也说明了ELSE操作,则控制转给跟在ELSE操作后第的第一条计算操作。
    与IFxx相匹配的ENDIF操作的条件指示器项必须为空格。
    一个IFxx组必须用一个ENDIF语句关闭,如果IFxx语句跟随着一个ELSE语句,ENDIF语句应在ELSE语句后,而不是在IFxx语句后。
    有些选项可在编辑清单中标识DO语句,IF-ELSE分句和SELECT-WHENxx-OTHER分句,这样看起来很清晰。这些标识的办法可参看ILE RPG/400程序员指南“结构化程序设计”一节。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  如果FLDA等于FLDB,执行IFEQ后的计算。如果FLDA不等于FLDB,
      C*  程序转至ENDIF后的操作。
      C
      C     FLDA          IFEQ      FLDB
      C                       :
      C                       :
      C                       :
      C                   ENDIF
      C
      C*  如果FLDA等于FLDB,执行IFEQ后的计算,并且控制转给ENDIF后的语
      C*  句。如果FLDA不等于FLDB,控制转给ELSE语句并执行跟在其后的计算。
      C
      C     FLDA          IFEQ      FLDB
      C                       :
      C                       :
      C                       :
      C                   ELSE
      C                       :
      C                       :
      C                       :
      C                   ENDIF

      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  如果FLDA等于FLDB且大于FLDC或者FLDD等于FLDE且大于FLDF,执行
      C*  ANDGT后的计算。假如其中有一个条件不存在,程序转至ENDIF后的语句。
      C
      C     FLDA          IFEQ      FLDB
      C     FLDA          ANDGT     FLDC
      C     FLDD          OREQ      FLDE
      C     FLDD          ANDGT     FLDF
      C                       :
      C                       :
      C                       :
      C                   ENDIF

论坛徽章:
0
32 [报告]
发表于 2005-06-13 15:52 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

OPEN(打开文件)

                操作码                        因子1                因子2                结果字段                指示器
                OPEN                                                文件名                                          -  ER  -

    明确的OPEN操作打开因子2上说明的文件。因子2中不能说明一个主文件、次文件或表文件。可以在73-74列说明一个结果指示器,如操作不成功,指示器设置为ON。如果没说明指示器,但说明了INFSR,当出现异常/错误时,INFSR自动接收控制。如果没说明指示器,也没说明INFSR,出现错误时,缺省的错误/异常处理接收控制。
    为了在程序中用明确的OPEN操作第一次打开因子2上说明的文件,在文件描述规范中说明USROPN键字。使用USROPN键字的限制,参看第15章“文件描述规范”。
    如果文件是打开的而后在程序中用CLOSE操作关闭。程序员可以用OPEN操作重新打开文件,且不需在文件描述规范中说明USROPN键字。如文件描述规范中未说明USROPN键字,文件在程序初始化时被打开,对一个已打开的文件说明OPEN操作,将出现错误。
    程序中允许对同一个文件发出多个OPEN操作,只要文件是关闭的,就可对文件发出OPEN操作。
    如果打开规定了DEVID键字的文件(在文件描述规范中),做为DEVID键字参数的字段名要设置为空格,DEVID键字的描述,参看第15章“文件描述规范”。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++++
      F
      FEXCEPTN   O    E             DISK    USROPN
      FFILEX     F    E             DISK
      F
      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  当指示器97为ON,98为OFF时,用明显的OPEN操作打开EXCEPTN来处理。
      C*  EXCEPTN文件在文件描述规范中有USROPN的键字,如果OPEN失败,指示器
      C*  99为ON。
      C*
      C                   IF        *in97 and not *in98
      C                   OPEN      EXCEPTN                              99
      C                   IF        not *in99
      C                   WRITE     ERREC
      C                   ENDIF
      C                   ENDIF
      C*
      C*  FILEX在程序初始化时打开,在控制转给RTNX前用CLOSE来关闭FILEX。
      C*  RTNX或其它程序能打开和使用FILEX。依据返回情况,OPEN重打开文件。
      C*  由于FILEX没有规定USROPN键字,文件在程序初始化时打开。
      C*
      C                   CLOSE     FILEX
      C                   CALL      'RTNX'
      C                   OPEN      FILEX

论坛徽章:
0
33 [报告]
发表于 2005-06-13 15:53 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

OTHER(其它)

                操作码                        因子1                因子2                结果字段                指示器
                OTHER                                                                                 

    如果在一个SELECT组里,所有的WHEN、WHENxx的条件都不满足,则执行从OTHER开始的操作序列,这个序列以ENDSL或END结束。
    使用OTHER操作时,记住如下规则:
                ·OTHER操作在SELECT组中是可选的。
                ·一个SELECT组中只能说明一个OTHER操作。
                ·同一个SELECT组中,OTHER操作之后不能说明WHENxx或WHEN操作。
                ·OTHER组中计算操作的序列可以为空,效果与没说明OTHER语句一样。
                ·总计计算中,控制级项(7-8列)可以是空格也可以是L1-L9指示器,LR
                    指示器或L0项组成程序中相应段内的语句组,控制级项只是为文本所用,不允                  许条件指示器(9-11列)。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* 下面是在WHENxx和DTHER中的SELECT组。如果X=1,做顺序1中的操作。
      C* 如果X不等于1且Y=2,做顺序2的操作。如果上面的两个条件都不成立,
      C* 做顺序3的操作。
      C*
      C                   SELECT
      C     X             WHENEQ    1
      C*
      C* Sequence 1
      C*
      C                      :
      C                      :
      C     Y             WHENEQ    2
      C*
      C* Sequence 2
      C*
      C                      :
      C                      :
      C                   OTHER
      C*
      C* Sequence 3
      C*
      C                      :
      C                      :
      C                   ENDSL
  
图159  OTHER 操作

论坛徽章:
0
34 [报告]
发表于 2005-06-13 15:54 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

PARM(参数)

                操作码                        因子1                因子2                结果字段                指示器
                PARM                        目的字段                源字段                参数                 

    PARM操作定义了组成参数列表(PLIST)的参数。PARM操作可以出现在计算中的任何地方,只要接在引用它的PLIST、CALL或CALLB操作的后面。PARM语句的顺序必须与被调用的程序或过程要求的顺序一致。可以说明一个PARM语句,对于CALL最多允许255个PARM语句,对于CALLB或PLIST最多允许399个        PARM语句。
    PARM操作可以在计算中任何位置出现,包括总计计算,控制级项(7-8列)可以是空格,也可以是L1-L9指示器或LR指示器或L0项来组成程序中相应段内语句组,不允许条件指示器(9-11列)。
    因子1、因子2是可选的。如果说明了,必须与结果字段是同一类型,因子1不能说明文字或命名常量。如果结果字段是多次出现数据结构名,因子1、因子2必须为空格。
    结果字段必须有一个名字,它们可以是:
    对所有PARM语句:
        —字段
        —数据结构
        —数组
    对非*ENTRT  PLIST  PARM语句也可包括:
        —数组元素
        —*OMIT(只用于CALLB)
    如说明*OMIT,因子1、因子2必须是空格,不能说明长度和小数位。
    *ENTRY  PLIST中的PARM操作的结果字段不能是:*IN,*Inxx,*IN(xx),*OMIT。
                        一个标号
                        一个文字
                        一个命名常量
                        一个数据区名
                        一个数据区数据结构名
                        一个全局初始化数据结构
                        一个有初始化字段的数据结构
                        一个用编译时数组做子字段的数据结构
                        一个表名
                        用键字BASE、IMPORT或EXPORT定义的字段或数据结构
                        一个数组元素
                        一个数据结构子字段名
                        编译时数组名
                        程序状态或文件信息数据结构(INFDS)名、
    *ENTRY  PLIST中对一个字段名只能定义一次。
    如果结果字段说明了一个数组,数组定义的区域传递给被调用的程序或过程时,数据结构的所有出现作为一个单独的字段传递,然而,如果结果字段说明的是一个多次出现数据结构的子字段,仅把这个子字段的当前出现传递到被调用的程序或过程中。
   每个参数字段仅有一个存储位置,它是在调用程序或过程中结果字段存储位置的地址,在PARM操作时,传递到被调用的程序或过程中。如果被调用程序或过程修改了参数的值,也就修改了那个存储位置中的数据,当控制返回调用程序或过程,调用程序或过程的参数(也就是结果字段)已被修改。即使被调用的程序或过程在修改参数值后,由于有错误而结束,调用程序中已存在这个修改后的值,为了保护传递到被调用程序或过程的信息以后使用,在因子2上规定保存传递到被调用程序或过程信息的字段名,因子2被拷贝到结果字段,结果字段的存储器地址传到被调用程序或过程。
    由于参数字段是用地址而不是用字段名来访问,调用和被调用的程序不必为传递的字段使用相同的名字,但调用程序或被调用程序或过程中,相应参数的属性必须相同,否则,将产生不可预料的结果。
    当CALL或CALLB运行时,将发生下列情况:
        1、在调用过程中,PARM操作因子2的内容拷贝到同一个PARM操作的结果字段中          (接收字段);
        2、在CALLB操作中如结果字段是*OMIT。一个空地址被传递到被调用过程。
        3、在被调用过程中,在它接收控制并完成正常的程序初始化之后,PARM操作的结           果字段的内容被拷贝到同一个PARM操作的因子1字段(接收字段)。
        4、在被调用过程中,当控制返回到调用程序时,PARM操作因子2中的内容拷贝到           同一个PARM操作的结果字段(接收字段),但当被调用过程非正常结时,不发生           这种传送。
        5、当返回到调用程序中,PARM操作的结果字段内容拷贝到同一个PARM操作的因           子1字段(接收字段),但当被调用程序非正常结束或调用出错,不做这种传送。
    注意:数据传送方式与用EVAL操作码传送数据相同,实行严格的类型一致,关于怎样通过CL调用和传递参数,见CL程序设计。
4.4.66的图160说明了PARM操作

PLIST(参数列表)

                操作码                        因子1                因子2                结果字段                指示器
                PLIST                        PLIST名                                                         

    PLIST操作定义了在CALL或CALLB操作中说明的参数列表的唯一符号名。
    可以在计算中任意位置说明PLIST操作,包括总计计算、子程序之间操作。控制级项(7-8列)可以是空格,或L1-L9指示器,LR指示器或L0项来组成程序中相应段内的语句组、PLIST操作后直接跟着至少一个PARM操作,不允许条件指示器(9-11列)。
    因子1必须是参数列表名,如果参数列表是输入参数列表,因子1必须是*ENTRY。一个程序或过程只能说明一个*ENTRY参数列表。当遇到非PARM操作时参数列表结束。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  在调用程序中,CALL调用PROG1且允许PROG1访问参数列表字段的数据。
      C*
      C                   CALL     'PROG1'        PLIST1
      C*
      C*  在第一个PARM语句中,当执行CALL时,因子2的内容*IN27放到结果
      C*  字段BYTE中。当PROG1返回控制,结果字段BYTE的内容放到因子1字
      C*  段中,*IN30。因子1和因子2在PARM中是可选的。
      C*
      C     PLIST1        PLIST
      C                   PARM                    Amount            5 2
      C     *IN30         PARM      *IN27         Byte              1
      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C                   CALLB     'PROG2'
      C*  在这例中,紧跟在CALLB操作后的PARM代替PLIST操作。
      C*
      C                   PARM                    Amount            5 2
      C     *IN30         PARM      *IN27         Byte              1
      *...1....+....2....+....3....+....4....+....5....+....6....+....7....+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*  在被调用程序PROG2中,PLIST的因子1*ENTRY指出它是一个参数列表。
      C*  当控制传给PROG2时, 参数列表中结果字段(FieldE和FieldG)的内容
      C*  放到因子1字段(FieldA和FieldD)。当被调用过程返回时,参数列表
      C*  (FieldB和FieldE)因子2的内容放到结果字段中(FieldC和FieldG),
      C*  所有这些字段都在过程的其它地方定义。
      C     *ENTRY        PLIST
      C     FieldA        PARM      FieldB        FieldC
      C     FieldD        PARM      FieldE        FieldG

论坛徽章:
0
35 [报告]
发表于 2005-06-13 15:55 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

READ(读一个记录)

        操作码                        因子1                因子2                        结果字段                  指示器
        READ(N)                                文件名、记录名        数据结构                -  ER  EOF

    READ操作从全过程文件(文件描述规范中18列用F标志)读当前指向的记录。
    因子2必须是一个文件名,仅对外部描述文件(文件描述规范22列为E)因子2允许为记录格式名。有这种情况,即用格式名读操作接收到一个不同于因子2中指定的格式,如果是这样,READ操作因错误中止运行。
    如果因子2中的文件名是程序描述文件(文件描述规范22列用F标志),结果字段可以是一个只读记录的数据结构名。数据在文件、数据结构间传递的内容,参看4.3.11的“文件操作”。
    如果READ操作是成功的。文件定位在下一个可读的记录。如果某个指示器设为ON,则必须对文件重新定位(用CHAIN、SETLL、SETGT)。
    如果正读的文件是磁盘更新文件,可以说明一个N操作扩展,指示当一个记录正读时,不对它加锁,更多信息参看ILE RPG/400程序员指南。
    可以在73-74列说明一个指示器,若READ操作没有成功完成,指示器设为ON。如发生了错误,且没有说明指示器,控制转移到INFDS子程序(如果说明了)或缺省的错误/异常处理程序。
    75-76列必须说明一个指示器,反映是读到文件末。如果指示器为ON,必须对文件重定位,才能继续对文件成功进行其它操作(如READ、READP),每次执行READ操作都要把指示器设置为ON或OFF。
    图161说明了READ操作。
    当你在因子2 说明了一个多设备文件,READ操作完成下列操作之一:
                ·从最近的NEXT操作说明的设备读数据(如果已执行这样一个NEXT操作)。
                ·从这个文件已取得的设备上接收第一个响应,且这个设备的“请求状态”已用                  DDS键字INVITE说明。如果没有请求设备,操作接收到一个文件结束信息。                  输入根据相应的格式被处理。如果设备是工作站,使用最后一个对工作站写入                  的格式。如果设备是通讯设备,可以选择格式。
                ·处理ICF文件时的格式选择参考ICF设计程序。如果使用BSC、CMN或MXD
                   文件,参考系统/38 CL参考手册,也有CRTBSCF、CRTCMNF  ADDCMND命                 令的FMTSLT参数的信息。
                ·如没有提供输入,READ操作要停下来等待一段时间,说明了控制选项的下列             CL命令之一时,READ操作也停止:
                —ENDJOB(结束作业)
                —ENDSYS(结束子系统)
                —PWRDWNSYS(系统下电)
                —ENDSYS(结束系统)
    这时73-74列指示器设为ON,参看ICF程序设计中生成和修改文件命令中使用WAITRCD参数内容,这个参数控制READ操作等待输入的时间。
    当在因子2说明一个格式名,且这个格式名与多设备文件相对联,数据是从文件规范中用DEVID键字说明设备中读出的。如果没有这样项说明,从最后一次成功的输入操作使用的设备中读数据。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  READ从文件FILEA中读取下一条记录,FIELA必须是一个全过程文件。
      C*  如果读到文件末或以前发生过文件末,但文件没重定位。当61为ON,
      C*  程序转到GOTO语句规定的标号(EOF)处,指示器61为ON。
      C*
      C                   READ      FILEA                                  61
      C   61              GOTO      EOF
      C*
      C*  READ从外部描述文件中读取RECI(因子2)的下一条记录。
      C*  RECI是记当格式名。如果READ时到文件末,或以前到过文件末但没重
      C*  定位,指示器64为ON,如果64为ON,程序转至在GOTO语句中定义的
      C*  标号(EOF)处,N操作扩展指出记录不加锁。
      C*
      C                   READ(N)   REC1                                   64
      C   64              GOTO      EOF
      C
      C     EOF           TAG
  
图161  READ操作

4.4.69  READC(读下一个修改过的记录)

                操作码                因子1                因子2                结果字段                  指示器
                READC                                        记录名                                        -  ER  EOF

    READC操作仅用于一个外部描述的WORKSTN的文件,去取子文件中下一个修改了的记录。因子2是必需的,是一个记录格式名,该记录格式在文件描述规范表上用SFILE键字定义为一个子文件,见3.3.2.24中SFILE键字的描述。
    对一个多设备文件,从与程序设备相对的子文件记录中读数据。程序设备是在文件规范表上用DEVID键字说明的字段。如果没有这样的说明,从最后成功输入操作中使用的程序设备中读数据。
    可以在73-74列说明结果指示器,当操作运行中出现错误时置为ON。75-76列的结果指示器是必须的,当子文件中再没有修改过的记录时置为ON。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++++
      F* CUSSCR是WORKSTN文件,它显示CUSINFO的一些记录。SFCUSR是子文件名。
      F*
      FCUSINFO   UF   E             DISK
      FCUSSCR    CF   E             WORKSTN SFILE(SFCUSR:RRN)
      F
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C* 当记录从CUSINFO文件中装入到子文件后,它用EXFMT根据子文件控制
      C* 记录CTLCUS的规定写到屏幕上。如果列到屏幕上的记录有修改,READC
      C* 操作在DOW循环中依次读出修改过的记录,在CUSINFO中相应的记录用
      C* CHAIN装入且用修改过的字段更新。
      C*
      C                   :
      C                   EXFMT     CTLCUS
      C                   :
      C* SCUSNO、SCUSNAM、SCUSADR、SCUSTEL是在子文件中定义的字段。
      C* CUSNAM、CUSADR、CUSTEL是在记录中定义的字段,CUSREC是在
      C* 文件CUSINFO中定义的。
      C*
      C                   READC     SFCUSR                              27
      C                   DOW       *IN27 = *OFF
      C     SCUSNO        CHAIN     CUSINFO                            25
      C* 仅在文件中找到记录时才更新。
      C                   :
      C                   IF        NOT *IN25
      C                   EVAL      CUSNAM = SCUSNAM
      C                   EVAL      CUSADR = SCUSADR
      C                   EVAL      CUSTEL = SCUSTEL
      C                   UPDATE    CUSREC
      C                   ENDIF
      C                   READC     SFCUSR                              27
      C                   ENDDO
  
图162  READC的例子

4.4.70  READE(读等于键字的记录)

                操作码                因子1                因子2                        结果字段                  指示器
                READE                检索自变量        文件名、记录名        数据结构                -  ER  EOF
        (N)

    READE操作从一个全过程文件(文件描述规范表中18列用F说明)中读取下一个有序记录,该记录的键字与检索自变量相匹配。如果键字与检索自变量不匹配,75-76列指示器要置为ON,该记录不返回给程序。
    因子1放检索自变量,它是可选的,来定义要检索的记录。它可以是一个字段名、一个文字、一个命名常量或一个象征常量。在因子1上可以为外部描述文件说明KLIST名,如果因子1为空格,下一个记录的全部键字与当前记录相等,取得文件的下一个记录,全部键字用因子2中的记录格式或文件定义。
    注意:如果正在读的文件是更新文件,需要对下一个记录临时加锁,并用检索自变量与该记录的键字相比较,如果记录加锁,程序必须等到该记录可用,然后,获得临时锁,并做比较。如果比较不相等,未发现记录指示器为ON,并撤消记录的临时锁。如果说明为无锁(N操作扩展),不需要临时加锁。
    因子2必须是要检索的文件或记录格式名,对一个外部描述文件,因子2可以说明一个记录格式名。
    如果因子2的文件名是一个程序描述文件,结果字段可以是数据结构名,该数据结构中的字段是只读的。关于数据在文件与数据结构之间传送方式介绍,参看4.3.11“文件操作”。
    如果正在读的文件是磁盘更新文件,可以说明一个N操作扩展,指出当正读记录时,对其不加锁。详细资料参看ILE RPG/400程序员指南。
    可以在73-74列说明结果指示器,当操作没有成功地完成时置为ON,必须在75-76列说明一个结果指示器,当没找到键字与检索自变量相等的记录或文件结束时,该指示器置为ON。如果READE操作不成功,必须重新对文件定位。(例如可用CHAIN、SETGT、SETLL等操作)。
    如果说明了因子1,并且正处理的是分布数据管理(DDM)文件,该文件是在3.10版本前生成的,那么能在数据管理级进行键字比较。READE操作要使用十六进制分配顺序做键字比较。当访问路径建立的字段内容与READE使用字段的实际内容不同时,可能出现与所期望的不同的结果。引起键字比较不同的DDS特性有:
                ·文件说明了ALTSEQ
                ·键字段有ABSVAL、ZONE、UNSIGNED或DIGIT
                ·变长日期、时间、时间标记键字段
                ·文件的SRTSEQ不是十六进制
                ·符号与系统指定符号不同
    直接跟在OPEN操作或EOF条件后的READE(说明了因子1)如果记录的键字与检索自变量匹配,将得到文件的第一个记录。这种情况下如没说明因子1,则产生一个错误结果。如果规定了73-74列错误指示器,它将设置为ON,只在文件成功关闭并重新打开后,才能进行其它I/O操作。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  当规定因子1时:
      C*  READE从文件FIELA中读下一条记录,把它的键字与检索自变量
      C*  KEYFCD比较。如果不等于或到文件末,指示器55为ON。
      C*
      C     KEYFLD        READE     FILEA                                  55
      C*
      C*  READE从外部描述文件的记录RECI中读取下一条记录。把它的键字与
      C*  检索自变量(KEYFLD)比较,如果不等或到文件末,指示器56为ON。
      C     KEYFLD        READE     REC1                                   56
      C*
      C*  没规定因子1时:
      C*
      C*  READE从文件A的访问路径中读取键字值等于当前光标位置所指记录
      C*  键字值的下一条记录。如果键字值不等,指示器55为ON。
      C                   READE     FILEA                                  55
      C*
      C*  READE从文件A的访问路径上读取键字值等于当前光标位置所指记录键字值
      C*  的下一条记录。RECI是记录格式名。如果键字值不等,指示器56为ON。
      C*  N指出记录不加锁。
      C                   READE(N)  REC1                                   56
  
图163  READE操作

4.4.71  READP(读前面的记录)

                操作码                因子1                因子2                        结果字段                  指示器
                READP                                        文件名、记录名        数据结构                -  ER  BOF

    READP操作从一个全过程文件(文件描述规范中18列用F标志)中读前面的记录。
    因子2必须是要读的文件或记录格式名,记录格式名仅用于外部描述文件。如果因子2说明了一个记录格式名,得到的是规定类型记录前面的第一个,中间的记录被忽略。
    如果因子2是程序描述文件(文件描述规范22列用F标志),结果字段可以是一个只读的数据结构名,有关数据怎样在文件与数据结构之间传送,参看4.3.11“文件操作”。
    如果READP操作成功,文件定位在下一个可读记录。如READP操作不成功,必须对文件重新定位(例如,用CHAIN、SETLL或SETGT)可以在73-74列说明一个指示器,当READP操作没有成功完成时置为ON。
    如果正读的文件是一个磁盘更新文件,可以说明N操作扩展,表明当记录正读时,不能再对它加锁,详细信息参看ILE RPG/400程序员指南。
    75-76列必须说明一个指示器,当文件中不存在前面记录时(处于文件开始的情况)指示器置为ON。如指示器为ON后,不对文件重定位,对该文件后续的多个READP操作,都要设置指示器。
    在75、76列文件开始指示器为ON,来处理其它后续操作后,要用CHAIN、SETLL、SETGT操作对文件重新定位。
    图164给出了在因子2给出文件名和记录格式名的READP操作。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  READP从FILEA中读前一条记录,如到了文件头,指示器71为ON,
      C*  当它为ON时,程序转至GOTO中指出的标号BOF处。
      C*
      C                   READP     FILEA                                  71
      C   71              GOTO      BOF
      C*
      C*  READP从外部描述文件的RECI中读前面的一条记录。RECI是记录
      C*  格式名,如在READP中遇到文件头,指示器72为ON,当它为ON时,
      C*  程序转至GOTO中规定的BOF处。
      C*
      C                   READP     PREC1                                  72
      C   72              GOTO      BOF
      C*
      C     BOF           TAG

图164  READP操作

4.4.72  READPE(读前面相等的记录)

                操作码                因子1                因子2                        结果字段                   指示器
                READPE                检索自变量        文件名、记录名        数据结构                -  ER  BOF
        (N)

    READPE操作从一个全过程文件读取下一个前面的顺序记录。该记录的键字要与检索自变量相匹配。如果记录的键字与检索自变量不匹配,75-76列指示器为ON。记录不返给程序。
    因子1放检索自变量,是可选的,确定要得到的记录,它可以是一个字段名、一个文字、一个命名常量或一个象征常量,对外部定义文件也可以在因子1说明一个KLIST名字。如果因子1为空格,且下一个前面记录的全部键字与当前记录的相等,就取到文件的下一个前面记录。全部键字用因子2的记录格式或文件定义。
    因子2必须是要取得的文件或记录格式名,记录格式名只对外部描述文件(文件描述规范表上22列用E标志)有效。
    如果因子2的文件名是程序描述文件(文件描述规范表的22列用F标志),结果字段可以是一个只读的数据结构名。文件与数据结构之间的数据传送方式的描述,参看4.3.11的“文件操作”。
    如果正读的是一个磁盘更新文件,可以说明一个N操作扩展,表明当记录正读时,不能加锁,详细信息参看“ILE RPG/400程序员指南”。
    可以在73-74列说明一个结果指示器,当操作没成功完成时置为ON。75-76列的指示器必须说明,当找不到键字与检索自变量相等的记录或遇到文件开头,75-76列指示器为ON。如果READPE操作不成功,则必须对文件重定位(例如,用CHAIN、SETLL、SETGT操作)。
    注意:如果正读的文件定义为更新文件,需要对前面的记录临时加锁,并且检索自变量与记录键字要做比较。如果记录已加锁,程序必须等到记录可用,然后得到临时锁并进行比较。如果比较不相等,没找到记录时指示器为ON,撤消临时锁。如果没有说明加锁(N操作扩展),不需要临时锁。
    如果说明了因子1,正在处理的是分布数据管理文件(DDM)且它是在版本3.10前生成的,那么在数据管理级不能进行键字比较,READPE用16进制分配顺序进行键字比较。如果READPE使用字段的实际内容与建立访问路径的字段内容不同,可能会产生与期望不同的结果。做键字比较不同的DDS特征有:
                ·对文件说明ALTSEQ
                ·键字字段说明ABSVAL、ZONE、UNSIGNED键字
                ·变长的日期、时间、时间标记键字字段
                ·文件的SRTSEQ不是十六进制
                ·符号与系统指定的符号不同
    直接跟在OPEN操作或BOF条件后的READPE(说明了因子1)返回BOF,这种情况下,不说明因子1会产生一个错误条件。如果73-74列说明了条件指示器,则它置为ON。必须在做一个因子1为空格的READPE操作之前,用CHAIN、SETLL、READ、READE或说明了因子1的READP对文件重定位。不用SETGT操作码来对前边做过READPE的文件定位,来做为记录没找到的结果。(因为在做SETGT之后,当前记录与其前面记录不会有相同键字)。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* 当规定因子1时:
      C*
      C* 读前面的记录,它的键字与FieldA比较。如果记录键字不等于FieldA,
      C* 指示器99为ON。
      C*
      C     FieldA        READPE    FileA                                  99
      C*
      C* 从FileB中读前一条记录。把它的键字与FieldB比较。记录放到数据结构
      C* DS1中。如果键字不等,指示器99为ON。
      C*
      C     FieldB        READPE    FileB         Ds1                      99
      C*
      C* 从记录格式RecA中读前一条记录,把它的键字与FieldC比较,如果操作
      C* 不成功,指示器88为ON。如果键字不匹配,指示器99为ON。
      C*
      C     FieldC        READPE    RecA                                 8899
      C*
      C* 当没有规定因子1时:
      C*
      C* 如果访问路径中的前一条记录的键值等于当前记录键值,那么读出它。
      C* 如键值不等99为ON。
      C*
      C                   READPE    FileA                                  99
      C*
      C* 文件FieldB中前一条记录的键值与文件中当前位置的键值匹配,则从此
      C* 文件中读出。记录放到数据结构DS1中,如键值不等,指示器99为ON。
      C*
      C                   READPE    FileB         Ds1                      99
      C*
      C* 在记录格式RecA中的访问路径的前一条记录,如果它的键值与当前记录
      C* 的键值相等,读出它。如操作不成功,指示器88为ON。如果键值不等,
      C* 指示器99为ON。
      C*
      C                   READPE    RecA                                 8899

论坛徽章:
0
36 [报告]
发表于 2005-06-13 15:56 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

RETURN(返回到调用者)

                操作码                因子1                因子2                        结果字段                指示器
                RETURN               

        RETURN操作把控制返回给调用者:
        1、检查暂停指示器,如果暂停指示器为ON,过程非正常结束(关闭所有打开的文件。           设置错误返回码,告诉调用例程这个过程非正常结束,控制转移到调用例程)。
    2、如没有暂停指示器为ON,检查LR指示器。如果LR指示器为ON,程序正常结           束。(写锁住的数据区结构,数组,表,重置外部指示器)。
        3、如暂停指示器、LR指示器均非ON,过程返回到调用例程,保存数据用于下一次运行,文件、数据区不做写出。关于在一个*NEW活动组中影响RETURN操作的信息,参看程序员指南。

4.4.76  ROLBK(取消)

                操作码                因子1                因子2                        结果字段                  指示器
                ROLBK                                                                                                -  ER  -

    ROLBK操作:
                消除从上一个COMMIT或ROLBK操作以来,所有输出操作对文件的修改,(如                果没有前面的COMMIT或BOLBK操作,就从委托控制下开始的操作以来)。
                释放委托控制下文件的所有记录锁。
                文件重新定位到上一个COMMIT操作时的位置(如没有上一个COMMIT操作定                位到文件打开时的位置)。
    当执行STRCMTCTL命令时,委托控制开始,详细信息参看ILE RPG/400程序员指南中“委托控制”。
    文件的修改和记录锁的释放,适用于活动组或作业中在委托控制下的所有文件。无论这个修改的是由程序ROLBK操作请求的,还是由同一活动组或作业中另一个程序来做的委托程序发出BOLBK操作,不一定都在文件委托控制下。例如,假定程序A调用程序B和程序C,程序B有在委托控制下的文件,而程序C没有,在程序C中的ROLBK操作仍然影响由程序B修改的文件。
    如果操作没能成功完成,73-74列可选的指示器设为ON。
SELECT(开始一个选择组)

                操作码                因子1                因子2                        结果字段                指示器
                SELECT               

    选择组有条件的处理几个交替顺序的操作,它包括:
                一个SELECT语句
                没有或多个WHENxx、WHEN组
                一个可选的OTHER组
                ENDSL或END语句
    SELECT操作之后,控制转移到满足条件的第一个WHENxx后面的语句,然后执行所有的语句,直到遇上下一个WHENxx操作。控制转移到ENDSL语句(只执行一个WHENxx)。如果没有WHENxx条件满足,并说明了OTHER操作,控制转移到OTHER操作后的语句。如果即没有WHENxx条件满足,也没说明OTHER操作。控制转移到选择组ENDSL后面的语句。
    SELECT操作可用条件指示器,如条件不满足,控制直接转移到选择组的ENDSL后的语句,条件指示器不能用于单个的WHENxx、WHEN、OTHER或ENDSL操作。
    选择组可在计算中任何地方说明,可以嵌入到IF、DO或其他选择组中,IF、DO组可以嵌入选择组中。
    如在选择组内说明SELECT操作,WHENxx和OTHER用于新选择组,直到说明ENDSL。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* 下例中,假如X=1,做顺序1中的操作。(在下一个WHENxx前没有END)。
      C* 如果X不等于1,且Y=2和X<10,做顺序2操作。如果上述条件都不为
      C* 真,做顺序3操作。
      C*
      C                   SELECT
      C                   WHEN      X = 1
      C                   Z-ADD     A             B
      C                   MOVE      C             D
      C*  Sequence 1
      C                   :
      C                   WHEN      ((Y = 2) AND (X < 10))
      C*  Sequence 2
      C                   :
      C                   OTHER
      C*  Sequence 3
      C                   :
      C                   ENDSL
      C*
      C* 下例给出有条件指示器的选择组,在CHAIN操作后,如果指示器10为
      C* ON,控制转移给ADD,如果10不为ON,执行选择组。
      C*
      C     KEY           CHAIN     FILE                               10
      C  N10              SELECT
      C                   WHEN      X = 1
      C*  Sequence 1
      C                   :
      C                   WHEN      Y = 2
      C*  Sequence 2
      C                   :
      C                   ENDSL
      C                   ADD       1              N

论坛徽章:
0
37 [报告]
发表于 2005-06-13 15:56 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

SETGT(设置大于)

                操作码                因子1                因子2                        结果字段                  指示器
                SETGT                检索自变量        文件名                                                NR  ER  -

    SETGT操作把文件定位在键字或相对记录号大于因子1中说明的键字或相对记录号的记录上。文件必须是全过程文件(文件描述规范表中18列用F说明)。
    因子1是必须的,如果文件是用键字访问,因子1可以是一个字段名、一个命名常量、一个象征常量或一个文字,它作为定位文件的检索自变量。对一个外部分描述的键字文件,可以在因子1说明一个KLIST名。如文件用相对记录号访问,因子1必须是一个整型文字、命名常量或字段。
     因子2是必须的,而且必须是文件名或记录格式。因子2上的记录格式名,只对外部描述文件有效。
     可以在71-72列说明一个结果指示器,如未找到键字或相对记录号大于因子1中的检索自变量规定的记录,指示器设为ON。在73-74列允许说明指示器,当操作运行出错时,设为ON。
    如SETGT操作不成功(未找到记录的情况),文件定位到末尾。
    象征常量也可以用来定位文件。
    注意:下面使用象征常量的讨论或例子中,假定*LOVAL、*HIVAL(不作为文件的实际键字)。
    当处理组合键字的文件时,象征常量要通过每个键字中包含这个象征常量的字段来处理。大多数情况下,用*LOVAL来定位文件,使第一个读到的记录是最低值键字。用*HIVAL来定位文件,使READ操作收到文件末指示,随后的READP取到文件的最后一个记录。在下列情况使用*LOVAL  *HIVAL,请注意:
                ·对降序排列有键字的外部描述文件,用*HIVAL对文件定位,使第一个读操作取                  到文件的第一个记录(具有最高键的记录),用*LOVAL对文件定位,使READ                       
                    操作取到文件的最后一个记录(具有最小键的记录)。
                ·在有*LOVAL或*HIVAL的SETGT操作之后,如果加一个记录或修改一个键字                  段,文件不再用低值和高值键字来定位。
                ·数字的*LOVAL代表键值X’99…9D’,*HIVAL代表键值X’99…9F’。如程序                  描述文件在文件规范表中说明有压缩十进制键字,而实际上文件的键字段是字                  符数据,则记录的键字可能比*LOVAL小,也可能比*HZVAL大。当一个键字                     段含有无符号二进制数据,*LOVAL可能不是最小的键。
    当日期或时间类型的键字段用*LOVAL或*HIVAL时,它的值取决于所用的日期-时间格式。这些内容的细节请参看第7章2.1中“数据类型及数据格式”。
    在SETGT操作后,文件定位到键字或相对记录号大于因子1中说明的检索自变量第一个记录。读文件能得到这个记录,但是在读之前,记录可被另一个作业或同作业中另一个文件删除,这样,可能得不到想要的记录。要防止对文件做不期望的修改,有关内容请参看“CL参考”中分配目标的讨论。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*  这例给出如何定位文件使READ读下一条记录。SETGT的检索自变量
      C*  KEY的值为98。这样,SETGT把文件格式FIELA定位在键值大于98的
      C*  第一条记录前。文件定位在键值为100的第一个记录前,READ读出键值为
      C*  100的那条记录。
      C
      C     KEY           SETGT     FILEA
      C                   READ      FILEA                                  64
      C*
      C*  这例给出如何从程序描述文件读出具有相同键值的一组记录中的最后一条
      C*  记录。在SETGT中的KEY把文件FILEB定位在键值大于70的第一条记录前,
      C*  文件定位在有键值80的第一条记录前,READP操作读出键值为70的最后一
      C*  条记录。
      C
      C     KEY           SETGT     FILEB
      C                   READP     FILEB                                  64
  

                  键字字段值                       键字字段值
              
                      97                                50        
              
                      97                                60        
              
                      97                                70        
              
                      97               (READP)          70        
                                FILEA  (SETGT)                    FILEB
                      98                                80        
    (SETGT)
    (READ)           100                                80        
              
                     100                                80        
              
                     100                                90        
              
                     101                                90        
              
                     101                                91        
              


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  这例给出如何使用*LOVAL。SETLL按升序把文件定位在第一条记录前,
      C*  READ读第一条记录(键值97)。
      C*
      C
      C     *LOVAL        SETLL     RECDA
      C                   READ      RECDA                                  64
      C
      C*  这例给出使用*HIVAL,SETGT按升序把文件定位在最后一条记录后,
      C*  READP读最后一条记录(键值91)。
      C
      C     *HIVAL        SETGT     RECDB
      C                   READP     RECDB                                  64
  

                 键字字段值                       键字字段值
    (SETGT)
     (READ)            97                             50        
               
                       97                             60        
               
                       97                             70        
               
                       97                             70        
                                 RECDA                           RECDB
                       98        Record               80         Record
                                 Format                          Format
                      100                             80        
               
                      100                             80        
               
                      100                             90        
               
                      101                             90        
               
                      101           (READP)           91        
                                    (SETGT)


图170  SETGT操作
4.4.80  SETLL(设置低界)

                操作码                因子1                因子2                结果字段                          指示器
                STELL                检索自变量        文件名                                                NR  ER  EQ

    SETLL操作把文件定位到键字或相对记录号大于或等于因子1中说明的检索自变量的下一个记录。文件必须是全过程文件(文件描述规范表中18列用F说明)。
    因子1是必须的,如文件是用键字访问,因子1可以是字段名、命名常量、象征常量或文字,它们作为定位文件的检索自变量。对键字存取的外部描述文件也可在因子1中说明一个KLIST名。如文件用相对记录号访问,因子1必须是一个整型文字、命名常量或无小数位的数字字段。
    因子2是必须的,而且必须是文件名或记录格式名,只对外部描述文件,因子2可以是记录格式名。
    结果指示反映操作状态,如在71-72列说明指示器,当检索自变量大于文件的最大键字或相对记录号时,指示器设置为ON。如在73-74列说明指示器,当操作运行期间出现错误,设置为ON。如在75-76列说明一个指示器,在当前记录的键字或相对记录号与检索自变量相等时,设置为ON。
    如因子2是要设置低界的文件名,文件定位到键字或相对记录号大于或等于因子1中规定的检索自变量的第一个记录。
    如因子2中是要设置低界的记录格式名,文件定位到键字等于或大于因子1规定的检索自变量指定类型的第一个记录。
    象征常量可用来定位文件。
    注意:下面讨论的使用象征常量的例子中,假定*LOVAL和*HIVAL不做文件的实际键字。
    当使用有组合键的文件时,象征常量通过其键字包含象征常量的每个字段来处理,使用有*LOVAL的SETLL来定位文件,第一个读到的记录具有最小键值。大多数情况下(不允许重复键),用*HIVAL定位文件使READP操作得到文件的最后一个记录,用READ操作得到文件末指示。在下列情况使用*LOVAL和*HIVAL时要注意:
        ·对键字是降序排列的外部描述文件。*HIVAL使把文件定位到使第一个读操作得到文件第一个记录(最大键的记录)。*LOVAL把文件定位到READP操作得到文件最后一个记录(最小键的记录),在有*LOVAL或*HIVAL的SETLL操作之后,增加记录或修改键字,文件不再定位到有最大或最小键的记录。
        ·对数字键字,*LOVAL代表键值X’99…9D’,*HIVAL代表键值X’99…9F’。当程序描述文件在文件规范表中说明文件有压缩十进制键字,但实际上文件键字字段包含字符数据,记录可能有小于*LOVAL或大于*HIVAL的键字,当键字段含有无符号二进制数据时,*LOVAL可能不是最小键。
    当*LOVAL或*HIVAL 用于日期、时间型键字时,它的值取决于日期-时间格式,详细内容可参看第七章2.1中“数据类型及数据格式”。
    在4.4.79的图170给出了在SETGT操作中的使用SETGT操作中的情况与它在SETLL中的使用方法相同。
    使用SETLL操作请记住:
        ·如SETLL操作不成功(没找到记录),文件定位到文件末。
        ·当已执行SETLL到达文件末,还可用另一个SETLL对文件重新定位。       
        ·在SETLL操作成功地对文件定位到一个记录后,读该文件得到这个记录。但是,在读这个记录之前,它可能被另一个作业或同作业中的另一个文件删除。这样,可能得不到期望的记录。即使75-76列的指示器设为ON表明找到一个匹配记录,也可能得不到这个记录。有关详细信息,参看“CL参考”中有关目标分配的讨论。
        ·SETLL并不使系统访问一个数据记录,如你只想验证实际上是否存在一个键,大多数情况下使用有相等指示器(75-76列)的SETLL比CHAIN要好,在个别情况下,对于较少键字的多格式逻辑文件,CHAIN可能比SETLL执行更快一些。
    在下面例子中,文件ORDFIL有定货记录,键字段是货号字段(ORDER),每个货号有多个记录,ORDFIL在计算规范表中是这样:

       *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*  在ORDFIL中所有101记录都打印出来。101是予先放在ORDER中的。
      C*  SETLL把文件定位在有键值101的第一个记录上,指示器55为ON。
      C
      C     ORDER         SETLL     ORDFIL                                 55
      C
      C*  下例中DO处理在相同键值的所有记录,用指示器55来做DO循环的条件。
      C
      C   55              DOU       *IN56
      C     ORDER         READE     ORDFIL                                 56
      C  N56              EXCEPT    DETAIL
      C                   ENDDO
      C*  READE在读完第一条101记录后,用同样方式读第2、3、4个101记录。
      C*  在第4个101记录读后,也试图再做READE。由于102记录不在同一组中,
      C*  指示器56为ON。绕过EXCEPT操作,DOU循环结束。
                                     ORDFIL
                             ORDER          Other Fields
                           
                             100         100的第一个记录

                             100         100的第二个记录
                           
                             100         100的第三个记录
                 (SETLL)
                             101         101的第一个记录
                           
                             101         101的第二个记录
                           
                             101         101的第三个记录
                           
                             101         101的第四个记录
                           
                             102         102的第一个记录

论坛徽章:
0
38 [报告]
发表于 2005-06-13 15:57 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

SUBST(子串)

                操作码                因子1                因子2                        结果字段                          指示器
                SUBST                要取的长度  基本串:起始位        目的串                        -  ER  -

    SUBST操作从因子2返回一个子串,起始于因子2中说明的位置,用在因子1中说明的长度,取到的串放在结果字段中。如未说明因子1,将用从起始位置开始的长度。对于图形字串,起始位置按双字节计算,基本串和目标串必须是相同类型,同是字符型或图形。      
    因子1是规定从因子2字串抽取字串的长度。必须是没有小数位的数字类型,可以是一个字段名、数组元素、表名、文字或命名常量。
    因子2必须是基本串,或基本串,然后写冒号,再写起始位置。基本串部分可以是一个字段名、数组元素、命名常量、数据结构名、表名或文字,起始位必须是没有小数位的数字,可以是一个字段名、数组元素、表名、文字或命名常量,如未说明,SUBST从基本串的第一位开始做,对图形字串,起始位置按双字节计算。
    要抽出子串的起始位置和长度必须是正整数、起始位置不能大于基本串长度,长度不能大于从起始位置算起的长度。如果其中一个或两个不满足,该操作不执行,如果在73-74列说明了指示器,将设为ON。如未说明错误指示器,异常/错误处理例程接收控制。
    结果字段必须是字符或图形类型,可以是一个字段名、数组元素、数据结构或表名,结果是左对齐的,结果字段的长度至少应该与因子1说明的长度一样大,如子串比结果字段中规定的长,子串将从右边截断。
    注意:在因子1、因子2和结果字段中不能用象征常量。因子1与结果字段或因子2与结果字段允许覆盖。如因子1比结果字段短,操作扩展列规定了P,指出在子串产生后,在右边填充空格。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* SUBST在因子2中从第3位起取2个长度的子串,值‘CD’放到结果
      C* 字段TARGET中。由于没有发生错误,指示器90为OFF。
      C*
      C
      C                   Z-ADD     3             T                 2 0
      C                   MOVEL     'ABCDEF'      String           10
      C     2             SUBST     String:T      Target                 90
      C*
      C* 在这个SUBST中,长度大于串长减去起始位置加1,结果是指示器90
      C* 为ON,且结果字段没改变。
      C*
      C
      C                   MOVE      'ABCDEF'      String            6
      C                   Z-ADD     4             T                 1 0
      C     5             SUBST     String:T      Result                 90
      C
      C* 在这个SUBST中,取到基串的第5位开始的3个字符,由于没规定P,
      C* TARGET中仅前3个字符改变了。TARGET中是‘123XXXXX’。
      C
      C                   Z-ADD     3             Length            2 0
      C                   Z-ADD     5             T                 2 0
      C                   MOVE      'TEST123'     String            8
      C                   MOVE      *ALL'X'       Target
      C     Length        SUBST     String:T      Target            8

      C*
      C* 这例除规定P以外,其它同前例。结果用空格填充,TARGET的值为'123bbbbb'。
      C*
      C
      C                   Z-ADD     3             Length            2 0
      C                   Z-ADD5                  T                 2 0
      C                   MOVE      'TEST123'     String            8
      C                   MOVE      *ALL'X'       Target
      C     Length        SUBST(P)  String:T      Target            8
      C
      C
      C* 下例中,CITY中有串‘Toronto,Ontario’SCAN找出第9位的空白
      C* 分隔符。
      C* 没有因子1的SUBST把从第10位开始后的串放到TCNTRE中。
      C* TCNTRE中的内容为‘Ontario’。
      C     ' '           SCAN      City          C
      C                   ADD       1             C
      C                   SUBST     City:C        TCntre
      C*
      C* 操作前STRING=‘bbbJohnbbbbbb’,RESULOT是10个字符的字段,内容为
      C* ‘ABCDEFGHIJ’。CHECK查找第一个非空格字符,如果有,指示器10为
      C* ON。如果*IN10为ON,SUBST在STRING中从第一个非空格字符开始到结
      C* 束取子串STRING。要做填充以保证结果字段原内容的左边没有其它东西。
      C* 即如果STRING的值为‘      HELLO’。在SUBST(P)后RESULT的内容为
      C* ‘HELLO      ’。操作后,RESULT=‘Johnbbbbbb’。
      C
      C     ' '           CHECK     STRING        ST                       10
      C   10              SUBST(P)  STRING:ST     RESULT
  
图177  SUBST操作
TAG(标号)

                操作码                因子1                因子2                结果字段                        指示器
                TAG                标号               
       
    TAG操作命名一个标号,给出“GOTO”或“CABxx”操作的目的地。
    它可以在计算中的任何地方说明,包括总计计算,控制级项可以是空格或L1-L9指示器、LR指示器、L0项来组成程序相应段的语句组。不允许说明条件指示器(9-11列)。
    因子1必须是GOTO或CABxx操作目的地的名字。这个名字必须是一个唯一的符号名,在GOTO操作的因子2中说明或在CABxx的结果字段中说明。这个名字可以用作多个GOTO或CABxx操作的公共点。
    从RPGIV逻辑周期的不同部分转到TAG,可能导致无限循环。例如,明细计算行说明一个GOTO到总计计算的TAG 操作,就可能产生一个无限循环。
    TAG操作的例子见4.4.41,图140。

论坛徽章:
0
39 [报告]
发表于 2005-06-13 15:58 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

UNLOCK(解锁数据区或释放一个记录)

                操作码                因子1                因子2                结果字段                           指示器
                UNLOCK                                数据区                                                -  ER  -
                                                                或文件名

    unlock操作用于解锁数据区和释放记录。

4.4.95.1 解锁数据区

    因子2必须是要解锁的数据区名,或是保留字*DTAARA。
    当因子2中说明*DTAARA,把这个程序中所有上锁数据区解锁。
    数据区名字必须已在定义规范中用DTAARA键字定义或在*DTAARA  DEFINE语句的结果字段说明。因子2不能是局部数据区或程序初始化参数数据区(PIP)。如果unlock操作用于一个已解锁的数据区,不产生错误。
    可以在73-74列说明一个结果指示器,当操作产生错误,指示器设为ON。71-72列、75-76列必须是空格。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  在系统中定义TOTAMT、TOTGRS、TOTNET为数据区。IN操作取所有程序定
      C*  义的数据区,程序执行计算,然后解锁数据区,这样,其它程序可使用这些
      C*  数据区。
      C*
      C     *LOCK         IN        *DTAARA
      C                   :
      C                   :
      C                   UNLOCK    *DTAARA
      C     *DTAARA       DEFINE                  TOTAMT             8 2
      C     *DTAARA       DEFINE                  TOTGRS            10 2
      C     *DTAARA       DEFINE                  TOTNET            10 2
  
图182  数据区解锁操作

4.4.95.2 释放记录锁

    unlock操作也可用于把磁盘更新文件最近上锁的记录解锁。
    因子2必须是UPDATE磁盘文件的名字。
    可以在73-74列说明一个指示器,当操作发生错误时,设置为ON。71-72列、75-76列必须为空格。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++++
      F*
      FUPDATA    UF   E             DISK
      F*
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  假定文件UPDATA包括记录格式Vendor。从UPDATA中读记录,由于文件是
      C*  更新文件,记录要加锁。*IN50在程序的其它地方设置来控制怎样做UPDATA。
      C*  另外,用UNLOCK解锁记录,UNLOCK的因子2是文件名UPDATA而不是记录
      C*  格式名VENDOR。
      C*
      C                   READ      VENDOR                                 12
      C                   :
      C     *IN50         IFEQ      *ON
      C                   UPDATE    VENDOR
      C                   ELSE
      C                   UNLOCK    UPDATA                               99
      C                   ENDIF
  
图183  记录解锁操作

4.4.96  UPDATE(修改已存在记录)

                操作码                因子1                因子2                        结果字段                             指示器
                UPDATE                                        文件名                        数据结构                        -  ER  -

    UPDATE操作用来修改磁盘更新文件或子文件最后一个锁定的记录。在取得记录的输入操作和UPDATE操作之间不能对文件进行其他操作。
    因子2必须是要修改的文件或记录格式名,对于外部描述文件,因子2中需要说明记录格式名,这个记录格式名必须是从文件中读的最后一个记录的名字,否则发生错误,对于程序描述文件,因子2上文件名是必须的。
    如果因子2是文件名,结果字段必须是数据结构名。更新的记录直接从数据结构写到文件中。如因子2是记录格式名,结果字段必须是空格。
    可以在73-74列说明结果指示器,如UPDATE操作没有成功的完成,则指示器设为ON。
    使用UPDATE操作请记住:
        ·当因子2中说明的是记录格式名,用记录定义中字段在程序内的当前值修改记录。
        ·如果要修改一个记录中的部分字段而不是全部字段,使用输出规范,而不是UPDATE                                                       
          操作。
        ·对一个记录或文件发生UPDATE前,必须对同一个文件或记录发出一个有效的加锁          输入操作(READ、READC、READE、READP、READPE、CHAIN主/次文          件)。如果读操作返回一个错误条件或读时没上锁,这个记录没锁定,UPDATE无          法操作。这个记录必须使用缺省的空格操作扩展,说明上锁请求再读一次。
        ·对同一个文件或记录的连续的UPDATE操作无效,必须发出成功的读操作来定位          和锁住要修改的记录。
        ·在总计计算期间,对主、次文件使用UPDATE操作要小心。在RPG Ⅳ周期的这个阶段,当前记录(要处理的记录)的字段可能未传送到处理区。因此,UPDATE选用先前记录的字段更新当前记录。同样,当前记录的字段传送到处理区时,它们是这些字段已被先前记录中已修改过的字段。
        ·对多设备文件,在因子2中说明一个子文件记录格式。对程序设备执行该操作,这个程序设备是在文件规范中用DEVID键字说明的字段名。如未说明程序设备,使用最后一次成功输入使用的设备。这个设备一定是在UPDATE操作前为输入操作规定的同一个设备。在输入和UPDATE操作之间,不能对其它设备进行输入、输出操作。如果这样做,UPDATE操作将失败。
        ·对有多个子文件记录格式的显示文件,不能在对显示文件中某个子文件输入和UPDATE操作之间对同一个显示文件的另一子文件做读及修改操作。如果这样做,UPDATE操作失败。

4.4.97  WHEN(当真时选择)

                操作码                因子1                因子2                        结果字段                        指示器
                WHEN                空格                表达式

    WHEN操作码与HWENxx操作码相似,控制处理SELECT操作中的哪一行。它们的区别是在扩展因子2上,条件是由逻辑表达式规定的,当扩展因子2字段中表达式为真时,执行由WHEN操作控制的操作。


      CL0N01Factor1+++++++OpcodeE+Extended-factor2+++++++++++++++++++++++++++++++
      C*
      C                   SELECT
      C                   WHEN    *INKA
      C                   :
      C                   :
      C                   :
      C                   WHEN    NOT(*IN01) AND (DAY = 'FRIDAY')
      C                   :
      C                   :
      C                   :
      C                   WHEN    %SUBST(AX+4):3) = 'ABC'
      C                   :
      C                   :
      C                   :
      C                   OTHER
      C                   :
      C                   :
      C                   :
      C                   ENDSL
  
图184  WHEN操作

4.4.98  WHENxx(当真时选择)

                操作码                因子1                因子2                        结果字段                        指示器
                WHENxx        比较数                比较数

    选择组中的WHENxx操作决定“SELECT”(选择组的开始)之后,控制转向何处。
    如因子1与因子2之间存在xx说明的关系。WHENxx条件操作为真,则执行WHENxx之后的操作直到下一个WHENxx、OTHEN、ENDSL或END操作为止。
    当执行WHENxx操作时记住:
        ·操作组执行后,控制转移到ENDSL操作之后的语句。
        ·可以用ANDxx、ORxx编写更复杂的WHENxx。当组合的WHEN的ANDxx和
          ORxx说明的条件为真时,执行计算。
        ·WHENxx组可以为空。
        ·总计计算中,控制级项(7-8列)可以为空格,也可以为L1-L9指示器、LR指示器或L0项来组成程序中相应段内的语句组。控制级项只是为文本编辑而用,不允许(9-11列)条件指示器,xx的允许值,请参考4.3.6的“比较操作”。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C* 下例给出嵌套的SELECT,雇员的类型可以是C(临时),T(退休),R(普通),
      C* S(学员),依据雇员类型(EmpTyp),每年的假期天数不同。

      C*
      C                   SELECT
      C     EmpTyp        WHENEQ    'C'
      C     EmpTyp        OREQ      'T'
      C                   Z-ADD     0             Days
      C     EmpTyp        WHENEQ    'R'
      C*
      C* 当雇员类型为R,假期天数也与工作年限有关,基本天数为14,对工作不
      C* 满2年的没有附加天数,在2-5年之间的加5天,在6-10年之间的加10天,
      C* 超过10年的加20天。
      C*
      C                   Z-ADD     14            Days
      C*
      C* Nested select group.
      C                   SELECT
      C     Years         WHENLT    2
      C     Years         WHENLE    5
      C                   ADD       5             Days
      C     Years         WHENLE    10
      C                   ADD       10            Days
      C                   OTHER
      C                   ADD       20            Days
      C                   ENDSL
      C* End of nested select group.
      C*
      C     EmpTyp        WHENEQ    'S'
      C                   Z-ADD     5             Days
      C                   ENDSL

      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C* 下面是带有复杂WHENxx表达式的SELECT操作,假定用户输入一条记录
      C* 和操作码,选择下列其一:
      C*   *当按F3时,做子例程QUIT。
      C*   *当输入操作码A(加),且记录不存在(*IN50=1)时,写这个记录。
      C*   *当输入操作码A(加),且记录存在,且AcRec中是D,用操作码为A
      C*    的记录来更新它。当输入D(删除)操作码时,记录存在,且AcRec
      C*    中是A,把记录做删除记号。
      C*   *当操作码是C(修改),记录存在,且AcRec中是A,修改这条记录。
      C*   *其它情况做错误处理。
      C*
      C     RSCDE         CHAIN     FILE                               50
      C                   SELECT
      C     *INKC         WHENEQ    *ON
      C                   EXSR      QUIT
      C     Acode         WHENEQ    'A'
      C     *IN50         ANDEQ     *ON
      C                   WRITE     REC
      C     Acode         WHENEQ    'A'
      C     *IN50         ANDEQ     *OFF
      C     AcRec         ANDEQ     'D'
      C     Acode         OREQ      'D'
      C     *IN50         ANDEQ     *OFF
      C     AcRec         ANDEQ     'A'
      C                   MOVE      Acode         AcRec
      C                   UPDATE    REC
      C     Acode         WHENEQ    'C'
      C     *IN50         ANDEQ     *OFF
      C     AcRec         ANDEQ     'A'
      C                   UPDATE    REC
      C                   OTHER
      C                   EXSR      ERROR
      C                   ENDSL
  
图185  WHENxx操作

4.4.99  WRITE(生成新记录)

                操作码                因子1                因子2                        结果字段                           指示器
                WRITE                                        文件名                        数据结构                        -  ER  -

    WRITE操作往一个文件中写一个新记录。
    因子2必须是一个名字,对外部分描述文件,因子2中需为记录格式名,对程序描述文件,因子2中需为文件名,同时结果字段必须是数据结构名,记录直接从数据结构写到文件中,如因子2是记录格式名,结果字段必须是空格。
    结果字段必须是数据结构名。
    73-74列可以是一个指示器,当WRITE没有成功完成时设为ON。如外部描述的打印文件产生溢出,而在文件描述规范表中未说明溢出指示器,则73-74列指示器将设为ON。对子文件记录名的WRITE操作,可在75-76列说明一个指示器,当子文件已满时指示器为ON。
    使用WRITE操作时记住:
        ·当因子2是记录格式名,用记录定义的所有字段在程序中的当前值来构成这个记录。
        ·当用相对记录号往文件中写记录时,必须修改文件描述规范中RECNO键字说明的          字段名。因为这样它才能包括要写记录的记录号。
        ·当用WRITE向磁盘文件增加记录时,必须在文件描述规范表中的20列说明A(见          3.3.1.7(文件增加))。
        ·限制设备相对功能,例如:对一个“PRINTER”设备发出“WRITE”,如在文件          规范上未说明“PRTCTL”键字,打印之后空行设置为1。(通常跳行或空行在输          出规范中41-51列说明)。如是外部描述文件,这些功能是外部描述的一部分。
        ·对多设备文件,数据写到程序设备上。这个程序设备是在文件描述规范中用          
        “DEVID”键字说明的字段名(见3.3.2.3)。如未说明DEVID键字,数据直接写到          最后一次成功输入的程序设备上。


      *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
      CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
      C*
      C*  WRITE把数据区DS1的字段写到文件FILE1中。
      C*
      C                   WRITE     FILE1         DS1
  
图186  WRITE操作

4.4.100  XFOOT(计算数组元素总和)

                操作码                因子1                因子2                        结果字段                          指示器
                XFOOT                                        数组名                        总和                        +  -  Z
         (H)

    XFOOT把一个数组的元素加到一起,并把结果放在结果字段说明的字段中,因子2中是数组的名字。
    如说明舍入,在累加完所有元素之后,把结果写入结果字段之前进行四舍五入。如果结果字段是因子2中说明的数组中的某个元素,用这个元素在XFOOT操作前的值做计算数组总和。
    XFOOT进一步规则,见4.3.1“算术操作”。
    XFOOT操作的例子,见4.3.1图100。

Z-ADD(零加)

                操作码                因子1                因子2                        结果字段                  指示器
                Z-ADD                                        被加数                        和                        +   -   Z

    因子2与零字段相加,和放在结果字段中,因子1不用,因子2必须是数字型,可以是:数组、数组元素、字段、象征常量、文字、命名常量、子字段或表名。
    结果字段必须是数字型,可以是一个数组、数组元素、子字段或表名。
    可以说明舍入。
        Z-ADD操作的规则,见4.3.1“算术操作”。
    Z-ADD使用的例子见4.3.1图100。

4.4.103  Z-SUB(零减)

                操作码                因子1                因子2                        结果字段                   指示器
                Z-SUB                                        被减数                                差                +   -   Z

    从零字段减去因子2,差,也就是因子2的负值,放在结果字段中,可以用这个操作改变一个字段的符号。因子1不用,因子2必须是数字型,可以是一个数组、数组元素、字段、象征常量、文字、命名常量、子字段或表名。
    结果字段必须是数字型,可以是一个数组、数组元素、子字段或表名。
    可以说明舍入。
    Z-SUB操作规则见4.3.1“算术操作”。
    Z-SUB操作的例子见4.3.1图100

论坛徽章:
0
40 [报告]
发表于 2005-06-13 16:00 |只看该作者

ILE RPG4 C表常用操作码学习笔记(按字母顺序发)

好了,这几天整理的到现在最常用的操作码帖完了,这些是最基本的,还有一些以后会在补充的,谢谢大家对我的支持!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP