在单个作业中同步数据库文件更改
落实控制 是将文件操作分组为单个单元的一种方法,以便您可以将更改同步到单个作业中的数据库文件。
在可以启动落实控制之前,必须确保要作为一个单元处理的所有数据库文件都位于单一设备控制环境中。 此环境中的所有文件都必须记录到同一日志中。 使用 CL 命令 "创建日志接收器" (CRTJRNRCV) , "创建日志" (CRTJRN) 和 "启动日志物理文件" (STRJRNPF) 来准备日志记录环境。
建立日志记录环境后,可以使用以下命令:
- 启动落实控制 (STRCMTCTL)
- CALL 程序名
- 结束落实控制 (ENDCMTCTL)
您可以使用落实控制将数据库文件的若干更改定义为单个事务并进行处理。
示例:
以下示例使用落实控制。 将输入采购单并将其记录在两个文件中: T1520DD5 (用于日常事务) 和 T1520DD6 (用于每月事务)。 反映对 T1520DD5 和 T1520DD6 所作的更改的日志项保留在日志 JRN 中。
- 准备日志记录环境:
- 在命令行上,输入:
这将使用如下所示的 DDS 源创建物理文件 T1520DD5 :CRTPF FILE(QTEMP/T1520DD5) SRCFILE(QCPPLE/QADDSSRC)图 1。 T1520DD5 -用于日常事务的 DDS 源 A R PURCHASE A ITEMNAME 30 A SERIALNUM 10 - 在命令行上输入:
这将使用如下所示的 DDS 源创建物理文件 T1520DD6 :CRTPF FILE(QTEMP/T1520DD6) SRCFILE(QCPPLE/QADDSSRC)图 2。 T1520DD6 -每月事务的 DDS 源 A R PURCHASE A ITEMNAME 30 A SERIALNUM 10 - 在命令行上,输入:
这将为通知文本创建物理文件 NFTOBJ。CRTPF FILE(MYLIB/NFTOBJ) RCDLEN(19)注: 当运行使用落实控制的 ILE C 程序 T1520COM 时,会将通知文本发送到文件 NFTOBJ。 - 在命令行上,输入:
这将使用如下所示的 DDS 源创建显示文件 T1520DD7 :CRTDSPF FILE(QTEMP/T1520DD7) SRCFILE(QCPPLE/QADDSSRC)图 3。 T1520DD7 -采购订单显示的 DDS 源 A DSPSIZ(24 80 *DS3) A REF(QTEMP/T1520DD5) A INDARA A CF03(03 'EXIT ORDER ENTRY') A R PURCHASE A 3 32'PURCHASE ORDER FORM' A DSPATR(UL) A DSPATR(HI) A 10 20'ITEM NAME :' A DSPATR(HI) A 12 20'SERIAL NUMBER :' A DSPATR(HI) A ITEMNAME R I 10 37 A SERIALNUM R I 12 37 A 23 34'F3 - Exit' A DSPATR(HI) A R ERROR A 6 28'ERROR: Write failed' A DSPATR(BL) A DSPATR(UL) A DSPATR(HI) A 10 26'Purchase order entry ended' - 在命令行上,输入:
这将创建日志接收器 JRNRCV。CRTJRNRCV JRNRCV(MYLIB/JRNRCV)注: 当应用程序运行时,日志项将放在 JRNRCV 中。 - 在命令行上,输入:
这将创建日志 JRN 并将日志接收器 JRNRCV 连接到该日志接收器。CRTJRN JRN(MYLIB/JRN) JRNRCV(MYLIB/JRNRCV) - 在命令行上,输入:
这将开始记录对日志 JRN 中的 T1520DD5 和 T1520DD6 所作的更改。STRJRNPF FILE(QTEMP/T1520DD5 QTEMP/T1520DD6) JRN(MYLIB/JRN) IMAGES(*BOTH) - 在命令行上,输入:
这将使用下面显示的程序源创建程序 T1520COM :CRTBNDC PGM(MYLIB/T1520COM) SRCFILE(QCPPLE/QACSRC)/* This program illustrates how to use commitment control using the */ /* _Rcommit() function and to rollback a transaction using the */ /* _Rollbck() function. */ #include <stdio.h> #include <recio.h> #include <stdlib.h> #include <string.h> #define PF03 2 #define IND_OFF '0' #define IND_ON '1' int main(void) { char buf[40]; int rc = 1; _SYSindara ind_area; _RFILE *purf; _RFILE *dailyf; _RFILE *monthlyf; /* Open purchase display file, daily transaction file and monthly */ /* transaction file. */ if ( ( purf = _Ropen ( "*LIBL/T1520DD7", "ar+,indicators=y" )) == NULL ) { printf ( "Display file did not open.\n" ); exit ( 1 ); } if ( ( dailyf = _Ropen ( "*LIBL/T1520DD5", "wr,commit=y") ) == NULL ) { printf ( "Daily transaction file did not open.\n" ); exit ( 2 ); } if ( ( monthlyf = _Ropen ( "*LIBL/T1520DD6","ar,commit=y") ) == NULL ) { printf ( "Monthly transaction file did not open.\n" ); exit ( 3 ); } /* The associate separate indicator area with the purchase file. */ _Rindara ( purf, ind_area ); /* Select the purchase record format. */ _Rformat ( purf, "PURCHASE" ); /* Invite the user to enter a purchase transaction. */ /* The _Rwrite function writes the purchase display. */ _Rwrite ( purf, "", 0 ); _Rreadn ( purf, buf, sizeof(buf), __DFT ); /* While the user is entering transactions, update daily and */ /* monthly transaction files. */ while ( rc && ind_area[PF03] == IND_OFF ) { rc = (( _Rwrite ( dailyf, buf, sizeof(buf) ))->num_bytes ); rc = rc && ( _Rwrite ( monthlyf, buf, sizeof(buf) ))->num_bytes; /* If the databases were updated, then commit transaction. */ /* Otherwise, rollback the transaction and indicate to the */ /* user that an error has occurred and end the application. */ if ( rc ) { _Rcommit ( "Transaction complete" ); } else { _Rrollbck ( ); _Rformat ( purf, "ERROR" ); } _Rwrite ( purf, "", 0 ); _Rreadn ( purf, buf, sizeof(buf), __DFT ); } }_Ropen()函数将打开购买显示文件,每日交易文件和每月交易文件。_Rindara()函数标识购买文件的单独指示符区域。_Rformat()函数选择 T1520DD7中定义的采购记录格式。_Rwrite()函数将写入采购单显示。 输入的数据将更新每日和每月事务文件 T1520DD5 和 T1520DD6。 这些事务将落实到使用_Rcommit()函数的这些数据库文件。
- 在命令行上,输入:
- 在落实控制下运行程序 T1520COM 。 在命令行上,输入:
STRCMTCTL LCKLVL(*CHG) NFYOBJ(MYLIB/NFTOBJ (*FILE)) CMTSCOPE(*JOB)
显示如下所示:CALL PGM(MYLIB/T1520COM)PURCHASE ORDER FORM ITEM NAME : SERIAL NUMBER : F3 - Exit - 使用以下样本数据填写在线采购订单表单:
TABLE 12345 BENCH 43623 CHAIR 62513输入项目和序列号后,将更新 T1520DD5 和 T1520DD6 文件。 每日事务文件 T1520DD5 文件包含输入所有三个采购单项后的样本数据。
- 结束落实控制。 在命令行上,输入:
ENDCMTCTL日志 JRN 包含对应于对 T1520DD5 和 T1520DD6所作的更改的条目。