在单个作业中同步数据库文件更改

落实控制 是将文件操作分组为单个单元的一种方法,以便您可以将更改同步到单个作业中的数据库文件。

在可以启动落实控制之前,必须确保要作为一个单元处理的所有数据库文件都位于单一设备控制环境中。 此环境中的所有文件都必须记录到同一日志中。 使用 CL 命令 "创建日志接收器" (CRTJRNRCV) , "创建日志" (CRTJRN) 和 "启动日志物理文件" (STRJRNPF) 来准备日志记录环境。

建立日志记录环境后,可以使用以下命令:
  • 启动落实控制 (STRCMTCTL)
  • CALL 程序名
  • 结束落实控制 (ENDCMTCTL)

您可以使用落实控制将数据库文件的若干更改定义为单个事务并进行处理。

示例:

以下示例使用落实控制。 将输入采购单并将其记录在两个文件中: T1520DD5 (用于日常事务) 和 T1520DD6 (用于每月事务)。 反映对 T1520DD5 和 T1520DD6 所作的更改的日志项保留在日志 JRN 中。
  1. 准备日志记录环境:
    1. 在命令行上,输入:
      CRTPF FILE(QTEMP/T1520DD5) SRCFILE(QCPPLE/QADDSSRC)
      这将使用如下所示的 DDS 源创建物理文件 T1520DD5 :
      图 1。 T1520DD5 -用于日常事务的 DDS 源
           A          R PURCHASE
           A            ITEMNAME      30
           A            SERIALNUM     10
    2. 在命令行上输入:
      CRTPF FILE(QTEMP/T1520DD6) SRCFILE(QCPPLE/QADDSSRC)
      这将使用如下所示的 DDS 源创建物理文件 T1520DD6 :
      图 2。 T1520DD6 -每月事务的 DDS 源
           A          R PURCHASE
           A            ITEMNAME      30
           A            SERIALNUM     10
    3. 在命令行上,输入:
      
      CRTPF FILE(MYLIB/NFTOBJ) RCDLEN(19)
      这将为通知文本创建物理文件 NFTOBJ。
      注: 当运行使用落实控制的 ILE C 程序 T1520COM 时,会将通知文本发送到文件 NFTOBJ。
    4. 在命令行上,输入:
      CRTDSPF FILE(QTEMP/T1520DD7) SRCFILE(QCPPLE/QADDSSRC)
      这将使用如下所示的 DDS 源创建显示文件 T1520DD7 :
      图 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'
    5. 在命令行上,输入:
      CRTJRNRCV JRNRCV(MYLIB/JRNRCV)
      这将创建日志接收器 JRNRCV。
      注: 当应用程序运行时,日志项将放在 JRNRCV 中。
    6. 在命令行上,输入:
      CRTJRN JRN(MYLIB/JRN) JRNRCV(MYLIB/JRNRCV)
      这将创建日志 JRN 并将日志接收器 JRNRCV 连接到该日志接收器。
    7. 在命令行上,输入:
      STRJRNPF FILE(QTEMP/T1520DD5 QTEMP/T1520DD6) JRN(MYLIB/JRN)
      IMAGES(*BOTH)
      这将开始记录对日志 JRN 中的 T1520DD5 和 T1520DD6 所作的更改。
    8. 在命令行上,输入:
      CRTBNDC PGM(MYLIB/T1520COM) SRCFILE(QCPPLE/QACSRC)
      这将使用下面显示的程序源创建程序 T1520COM :
      /* 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() 函数的这些数据库文件。

  2. 在落实控制下运行程序 T1520COM 。 在命令行上,输入:
    STRCMTCTL LCKLVL(*CHG) NFYOBJ(MYLIB/NFTOBJ (*FILE)) CMTSCOPE(*JOB)
    CALL PGM(MYLIB/T1520COM)
    显示如下所示:
                                   PURCHASE ORDER FORM
    
    
    
    
    
    
                       ITEM NAME     :
    
                       SERIAL NUMBER :
    
    
    
    
    
    
    
    
    
    
                                     F3 - Exit
    
  3. 使用以下样本数据填写在线采购订单表单:
    TABLE                         12345
    BENCH                         43623
    CHAIR                         62513

    输入项目和序列号后,将更新 T1520DD5 和 T1520DD6 文件。 每日事务文件 T1520DD5 文件包含输入所有三个采购单项后的样本数据。

  4. 结束落实控制。 在命令行上,输入:
    ENDCMTCTL

    日志 JRN 包含对应于对 T1520DD5 和 T1520DD6所作的更改的条目。