0

我的显示文件“EMPID”中有一个字段。

该字段必须自动生成并受到保护。

如果我要使用数据区,我该如何将它包含在我的 rpg(不是 rpgle)中。在 rpg 中自动生成数字的其他可能方法是什么。请指导。

重新编辑:使用了数据区域,它就像一个魅力:

请注意以下代码:

           C*** ARATWO IS NAME OF DATA AREA OBJECT           
C           *NAMVAR   DEFN           ARATWO  40   
C           *LOCK     IN   ARATWO                 
C                     Z-ADDARATWO    EMP     40   
C                     ADD  1         EMP          
C                     Z-ADDEMP       ARATWO       
C                     OUT  ARATWO                 

感谢所有的帮助。

4

3 回答 3

3

您可以在 RPG 中使用 SQL。两种可能:第一个 SEQUENCE SQL CREATE SEQUENCE my_lib/my_sequence .....

看看这里http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.sqlref%2Fsrc%2Ftpc%2Fdb2z_sql_createsequence.htm

第二种:PF(表)中的自动增量字段 在 DB2 SQL 中,您可以创建一个表(物理文件),其中定义的字段类似于始终生成为标识 示例:

create table MY_LIB/MY_FILE (                                        
    Id_Auto     int             not null generated always as identity,
    Filed2     int             not null with default,                
    Field3        char(10)        not null with default,                
    PRIMARY KEY (Id_Auto)  
);                         

这样,对该文件的每个 INSERT 操作都会自动增加字段 Id_Auto 的值。

insert into MY_LIB/MY_FILE (Field2, Field3) values(10, 'Paolo');
set My_Var = IDENTITY_VAL_LOCAL()

IDENTITY_VAL_LOCAL()在这两个操作之后,Id_Auto 字段会自动递增,您可以使用函数在 My_Var 中获取他的值

再见

于 2012-09-14T07:31:23.723 回答
1

RPG 用户指南的第 11 章提供了在RPG中使用数据区的示例。

于 2012-09-13T13:27:17.753 回答
0

如果您愿意在您的 RPG 程序中使用 SQL,那么我建议您使用 DB2 Sequence 对象(实际上是一个隐藏的数据区域)来分配您的 EMPID。

要进行设置,您可以使用以下内容:

CREATE SEQUENCE GenEmpID as numeric (6,0) start with 10000;  -- pick your own start point

然后在您的 RPG 中,您可以使用如下语句:

VALUES next value for GenEmpID 
  INTO :newkey

newkey 中的值可以显示在您的屏幕上,并且可以在您执行 INSERT 时用作记录中的 EMPID 值。

这种方法避免了仅仅为了让 DB2 生成下一个键值而执行空 INSERT,然后执行单独的 UPDATE 以实际填充空记录。当您只能执行一项时,为什么还要执行两项数据库操作?相反,我们只读取和修改一个数据区域,我们这样做的方式是调用一次 SQL,而不是使用一个 RPG 语句到操作系统去读取数据区域,增加值,然后再执行另一个 RPG 语句来再次进入操作系统并更新值。一般来说,在所有其他条件相同的情况下,调用操作系统的次数越少越好。这允许 DB2 和操作系统为您优化操作,有时低于 MI 级别。

于 2012-09-15T05:25:39.333 回答