对于RPG时间戳验证,这是最佳做法吗?似乎应该有一种方法来测试使用TEST操作码?
d DateTimeST S Z
d Value S 26A
d*---------------------------------------------------------------------------
c Eval Value = '2017-11-16-09.54.40.840586'
c Eval DateTimeST = %timestamp(Value)
c If %Error
c EXSR DoSometing
c ENDIF
c*-------------------------------------------------------------------
c DoSometing BEGSR
c ENDSR
c*-------------------------------------------------------------------
c Eval *inlr = *on
c return
答案 0 :(得分:2)
这些天的最佳做法看起来更像是这样:
**free
dcl-s DateTimeSt Timestamp;
dcl-s Value Char(26);
Value = '2017-11-16-09.54.40.840586';
test(ze) Value;
if %error;
DoSomething();
else;
DateTimeSt = %timestamp(value);
endif;
return;
// Error Proc
dcl-proc DoSomething;
end-proc;
我对MONITOR
组的问题是,即使您处理错误,他们也会使用错误消息丢弃您的作业日志,因此您需要额外的代码才能从作业日志中删除该消息。
答案 1 :(得分:1)
穆斯塔法,
您可以使用TEST(ZE)操作码测试时间戳。 Z扩展器指定您正在测试时间戳,如果测试失败,E扩展器会设置%Error。
正如Mike所说,你也可以将它包装在一个监视器组中,并使用On-Error操作码来运行你的子程序。
以下两种方法的示例代码。
d DateTimeST S Z
d Value S 26A
d*---------------------------------------------------------------------------
c Eval Value = '2017-11-16-09.54.40.840586'
c
c* Method #1 - use monitor group
c Monitor
c Eval DateTimeST = %timestamp(Value:*ISO)
c On-Error
c EXSR DoSometing
c Endmon
c
c* Method #2 - use Test(ZE)
c *ISO Test(ZE) Value
c If %Error
c EXSR DoSometing
c Else
c Eval DateTimeST = %timestamp(Value:*ISO)
c Endif
c
c Eval *inlr = *on
c return
c*-------------------------------------------------------------------
c DoSometing BEGSR
c ENDSR
c*-------------------------------------------------------------------
答案 2 :(得分:0)
您在运行时会收到RNX0112错误。使用Monitor / On-Error * All / EndMon