oracle 6i表格日期比较触发器

时间:2018-04-20 07:27:33

标签: oracle

所以我试图找出如何设置oracle 6i表单中的触发器,强制用户不输入日期,如果它像02.15.2018意味着如果我设置此表单只接受2016年至2017年之间的日期条目,如果用户尝试要输入2018日期或月份,则应弹出错误  我已经设置了日历,这是我用于日历工作的代码

DECLARE
    XP NUMBER;
    YP NUMBER;
BEGIN
    XP:=GET_ITEM_PROPERTY('DATE_',X_POS);
    YP:=GET_ITEM_PROPERTY('DATE_',Y_POS);
    date_lov.get_date(sysdate,'DATE_',xp,yp,'From Date','OK','Cancel',TRUE,FALSE,FALSE);
end;    

检查此图片 form expiry

你可以看到我试图实现就像软件到期系统一样,用户可以使用1年,而不是他得到你的软件即将到期的消息所以购买许可证或30天试用版等,到目前为止我做了什么研究我找到了这个 oracle software expiry

但是我的表单没有登录用户系统所以我不能应用这个,因为你可以在这里看到我的主要表格 main form

这就是为什么我希望在日期入门级别实现此目的,以便如果用户尝试更改系统日期,他仍然无法输入日期,因为我希望我们的触发器不会使用sysdate coz使用sysdate他可以manuplate,让我知道是否你需要更多的信息,并感谢早期rply它是有帮助的

1 个答案:

答案 0 :(得分:0)

我认为你不想每年重新编写你的代码。与明年一样,您将需要不到2020年的数据等...首先,查看Oracle文档(SQL Reference)中的EXTRACT或书籍。网上和这里有很多例子。

第一步是设置你的触发年份"动态地代码中的某个地方。您希望代码中的所有行都只有我理解的那么小于或等于当前年份。您可以在表单或后端执行此操作 - 取决于您的要求和规则:

SELECT EXTRACT(YEAR FROM (trunc(SYSDATE))) 
  INTO trigger_year
  FROM dual
/

EXTRACT将返回号码。所以,你的'trigger_year'必须是数字。上面的代码将为您提供当年的年份部分。所以,明年你会睡得好。 ))

接下来,在您的表单触发器中,您可以执行此操作 - 所有这些都取决于您的要求:

  1. 使用相同的EXTRACT示例限制您的LOV数据更改LOV查询。

  2. 或使用类似代码在您的日历项上写入验证触发器 - 将EXTRACT应用于:block.clndr_date,两侧的数据类型必须相同才能进行比较:

    IF:block.clndr_date< = trigger_date那么  引发错误并向用户显示消息; END IF;

  3. 或完成以上所有操作。

  4. 一般示例 - 将dt1的年份部分更改为2019将不返回任何行:

    WITH test_data AS
    (
    SELECT EXTRACT(YEAR  FROM (to_date('19-APR-2018', 'DD-MON-YYYY'))) dt1
     , EXTRACT(YEAR  FROM (trunc(SYSDATE))) trigger_date
      FROM dual
    )
    SELECT dt1 FROM test_data
    WHERE dt1 <= trigger_date
    /