TXSeries入门系列文章6

<FD entry name> :          将在文件APIs命令中使用

<fileName> :                   在服务器中被”cicssdt“创建的文件名称

<fieldName> :                 指定FD使用哪个域作为索引

<serverName>:               管理指定文件的服务器名称。

此处使用第一节中创建的file1作为例子,命令如下:

#cicsadd -c fd -r RGN1 myFile RSLKey=public BaseName=file1 IndexName=id

FileServer=”/.:/cics/sfs/OceanLinux64″

需要冷启动region或者”-B“选项来更新运行时数据库。

 
 

参阅:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_file_defns.html?lang=en

b.定义用于装载数据的结构体

记录类似于表中的行一样存储在文件中。我们最好为文件准备一个相同结构的结构体。例如,file1包含有id、名称和年龄三个不同的域,所以结构体也应该以相同的大小包含这三种域/变量。

例如:      

struct FileRecord {

char id[3];

char name[10]

char age[3]

} record;

还记得我们之前创建的域的类型吗?是byteArray。为了确保域的大小是相同的并且可以灵活编程,我们使用字符集合来存储数据。如果域的数量、大小或类型不同,相应地改变结构体进行匹配。

我们推荐在将数据存入前,把所有域的值通过”memset“函数设定为‘\0’。例如:memset(record.name,’\0′,10)

现在可以在结构体实例中存储记录了。

2)读取记录

通过使用READ命令,用户可以将文件中的指定记录向一个地址中存储(实际上它逐字节地复制了所有域的数据到这个地址,包括所有的‘\0’,所有我们需要一个域大小相同的结构体来将记录分割到几个域,域的值可以通过使用点号(.)来直接读取)。

用户可以通过两种方式读取记录,一种是直接读取,另一种是顺序浏览。

a.直接读取

直接读取允许用户读取一个被RIDFLD指定的记录,例如通过索引(int value=array[2])获取一个数组中的值。

语法

READ FILE(“<FD entry >”) INTO(<targetAddress>) RIDFLD(<recordIndex>)

选项

<FD entry> :                    想要读取的文件的FD名称

<targetAddress> :           指定存储记录数据的地址。大多数情况下,使用之前为文件准备的结构体的地址。

<recordIndexx> :                         它应该是一个指定你想要读取的记录的索引值的变量。注意这个变量的类型和大小应该和你在FD中指定的索引相同。

感觉有些复杂么?我们来看一个关于之前步骤的例子:

#cicsadd -c fd -r RGN1 myFile RSLKey=public BaseName=file1 IndexName=id

FileServer=”/.:/cics/sfs/OceanLinux64″ //添加一个FDid被索引域所指定

 
 

源代码

struct FileRecord {

char id[3];

char name[10]

char age[3]

} record; //声明一个结构体来存储记录

memset(record.id,’\0′,3); //将所有字节设置为 ‘\0’

memset(record.name,’\0′,10);

memset(record.age,’\0′,3);

char index[3]=”3″; //指定id=3的记录将被读取,注意大小和类型

EXEC CICS READ FILE(“myFile”) INTO(&record) RIDFLD(index);

fprintf(stderr,”Read result:\n”); //数据将会写入console.nnnnnn文件中,只适用于测试,实际编程中不推荐

fprintf(stderr,”ID:%s\n”,record.id);

fprintf(stderr,”NAME:%s\n”,record.name);

fprintf(stderr,”AGE:%s\n”,record.age);

EXEC CICS SEND FROM(&record) LENGTH(16) ERASE; //将内容发送到终端

当使用”cicstcl“生成测试程序时,强烈推荐添加”-e -d“选项,这样稍后用户可以在cicslterm中使用CEDF来调试程序(见二单元)。

 
 

参阅:

关于READ命令:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_read.html?lang=en

关于直接读取:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/tasks/t_dirct_rdng.html?lang=en

b.顺序读取

除了通过指定索引读取记录,TXSeries还允许我们只需指定一次RIDFLD就能重复地浏览记录。

在开始读取记录之前,首先应该通过STARTBY设置一个开始点。

语法

STARTBR FILE(“<FD entry>”) RIDFLD(<recordIndex>)

之后就可以使用READNEXT来一个接一个地从指定的/当前的索引读取记录。

语法

READNEXT FILE(“<FD entry>”) INTO(<targetAddress>) RIDFLD(<recordIndex>)

READNEXT可以从目标地址读取下一条记录,recordIndex的值将会更新为当前记录的索引。如果读操作到达文件结尾,这条命令将会返回”ENDFILE“。

也可以使用READPREV从指定的/当前的索引向后读取记录。

语法

READPREV FILE(“<FD entry>”) INTO(<targetAddress>)

RIDFLD(<recordIndex>)

READNEXT相似,READPREV也可以将targetAddress更新为新记录的数据,并使用当前的索引更新recordIndex的值。如果读操作到达文件开头,这条命令会返回”ENDFILE“。

如果READNEXT首先执行,然后READPREV再执行,一条记录会被读取两次,反之亦然。

有时用户可能想要通过RESETBR重设开始点。

语法

RESETBR FILE(“<FD entry>”) RIDFLD(<recordIndex>)

之后开始点就会被重设为recordIndex的值。

在所有浏览操作完成后,用户应该通过ENDBR来结束文件的浏览从而避免意外错误。

语法

ENDBR FILE(“<FD entry>”)

这是关于文件浏览用户所需要知道的所有命令。下面将展示一个顺序浏览的例子。

示例数据:


浏览操作:


 
 

参阅:

关于顺序读取:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/tasks/t_sqntial_rdng_brwsng.html?lang=en

关于STARTBR

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_set_startbr.html?lang=en

关于READNEXT

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_readnext.html?lang=en

关于READPREV

以下文章点击率最高

Loading…


发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注