AS400物理文件记录上次更新时间戳

时间:2018-05-30 19:11:51

标签: ibm-midrange database-trigger rpgle

我正在尝试将最后更新的时间戳添加到AS400上的旧物理文件中。此物理文件是用DDS编写的。我已经在timestamp字段中添加了但是当记录被修改时我无法自动更新到当前时间戳。

我尝试创建一个RPGLE触发程序,该程序在触发缓冲区的后映像中设置字段的时间戳。但是这个更改没有反映在实际文件中,因为我认为触发缓冲区是一个仅输入引用。

是否有人对如何在每条记录上获取时间戳有任何想法,这些记录会在对该记录进行更改时自动更新?

谢谢!

编辑:我已经发布了应该在触发器程序中处理时间戳更新的代码。我没有正确设置触发缓冲区吗?

 d PGMNAME         pr
 d  TrgBuffer_                         like(TrgBuffer)
 d  TrgBufLen_                         like(TrgBufLen)

 d BefImg        e ds                  extname(FILENAME) prefix(b_)
 d AftImg        e ds                  extname(FILENAME) prefix(a_)

 d FILENAMER       pi
 d  p$TrgBuffer                        like(TrgBuffer)
 d  p$TrgBufLen                        like(TrgBufLen)

    TrgBuffer = p$TrgBuffer;
    TrgBufLen = p$TrgBufLen;

    NRO = NewRecOff + 1;
    NRL = NewRecLen;
    ORO = OrgRecOff + 1;
    ORL = OrgRecLen;

    // Set Before / After Images
    BefImg = %subst(TrgBuffer:ORO:ORL);
    AftImg = %subst(TrgBuffer:NRO:NRL);

    select;

    // Update
     when TrgEvent = '3';

     // Set last updated timestamp on record.
     a_lstupd = %timestamp();
     %subst(TrgBuffer:NRO:NRL) = AftImg;
     p$TrgBuffer = TrgBuffer;      

1 个答案:

答案 0 :(得分:3)

您不必坚持使用DDS。

您可以使用iNav或较新的ACS Schema工具为最初使用DDS定义的PF生成SQL DDL。

然后添加

是一件简单的事情
LAST_UPDATED for column LSTUPD
  timestamp not null
  generated always 
  for each row on update 
  as row change timestamp

就此而言,您可以使用SQL ALTER TABLE语句将列添加到现有PF。

在操作系统对象级别,DDS PF和SQL表之间的差别很小。它存在的差异是内部的,而不是任何使用它的外部因素。