Ibm midrange AS400物理文件记录上次更新的时间戳
我正在尝试向AS400上的旧物理文件添加最后更新的时间戳。这个物理文件是用DDS编写的。我已经在时间戳字段中添加了时间戳,但是当记录被修改时,我无法让它自动更新为当前时间戳 我已经尝试创建一个rpgletrigger程序,它在触发器缓冲区的后映像中设置字段的时间戳。然而,这个变化并没有反映在实际的文件中,因为我相信触发器缓冲区是一个只用于输入的引用 有没有人知道如何在每条记录上获得一个时间戳,当对该记录进行更改时,该时间戳会自动更新 谢谢大家! 编辑:我已经发布了应该在触发器程序中处理时间戳更新的代码。我是否没有正确设置触发器缓冲区Ibm midrange AS400物理文件记录上次更新的时间戳,ibm-midrange,database-trigger,rpgle,Ibm Midrange,Database Trigger,Rpgle,我正在尝试向AS400上的旧物理文件添加最后更新的时间戳。这个物理文件是用DDS编写的。我已经在时间戳字段中添加了时间戳,但是当记录被修改时,我无法让它自动更新为当前时间戳 我已经尝试创建一个rpgletrigger程序,它在触发器缓冲区的后映像中设置字段的时间戳。然而,这个变化并没有反映在实际的文件中,因为我相信触发器缓冲区是一个只用于输入的引用 有没有人知道如何在每条记录上获得一个时间戳,当对该记录进行更改时,该时间戳会自动更新 谢谢大家! 编辑:我已经发布了应该在触发器程序中处理时间戳更新
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;
您不必坚持使用DDS 您可以使用iNav或更新的ACS模式工具为最初使用DDS定义的PF生成SQL DDL 那么,这是一个简单的补充问题
LAST_UPDATED for column LSTUPD
timestamp not null
generated always
for each row on update
as row change timestamp
为此,可以使用SQLALTERTABLE
语句将列添加到现有PF中
在操作系统对象级别,DDS PF和SQL表之间几乎没有什么区别。它们之间的区别是内部的,而不是外部的。在“插入到更新”触发器上,您必须更新后映像才能进行更改。触发器缓冲区不是只读引用。如果您正在为触发器程序使用ILE语言,还有其他注意事项。您可以发布您创建的触发器程序吗?您可以将物理文件转换为DDL吗?我已经为触发器程序添加了代码。我是否正确重置了缓冲区?当我调试时,更改显示在缓冲区中,但实际文件在程序运行后保持不变。在这种情况下,不能将其切换为DDL。我似乎不能只向现有表中添加行更改列。@danny117抱歉,在更新时忘记了
,答案已被更正。我没有写入原始文件,将其转换为DDL不是此特定文件的选项。我已经为我的触发器程序添加了代码。我是否正确重置后映像?您需要一个前触发器来更改写入文件的内容。一点也不迟。