1

关于在 SQLite 中使用触发器进行自动更新的一个棘手问题......

我在这里遇到一种情况,我需要从特定日期开始以特定间隔在表格中输入条目。“ Category ”表中的每个类别都有一个“ RecurAmount ”,设置为以 4 个固定间隔之一重复:7 天、14 天、1 个月、1 年。(我用整数 1、2、3、4 表示这些)每个类别都有一个RecurDate,它最初是由用户选择的。一旦这个日期过去,我需要让应用程序执行以下操作(例如假设应用程序几个月没有打开并且需要刷新):

1) 从类别中选择所有类别,其中RecurDate为 <= date('now') ... 这些是要刷新的类别。

2) 插入“ Costs ”表RecurAmount , RecurDate , CatKey , Recur取自“ Categories ”表的值到以下Costs列中: Amount , CostDate ,* CatFK *, AutoExp

3)然后我需要能够让 SQLite以“ Recur ”值确定的间隔自动将定期间隔日期的金额插入到Costs表中。因此,如果它的Recur值为“1”,我需要从RecurDate开始每隔 7 天在Costs表中输入一系列条目,直到今天的日期,但不再赘述。

4) 一旦所有类别都将其经常性成本实体应用到当前日期...我需要将一个未来日期添加到类别表中的RecurDate字段中。这将作为下一个自动输入发生之前需要匹配或传递的下一个日期。

以下是我正在使用的表格:“类别”表格:

RecurDate       Key      RecurAmount    Recur   RecurInterval
2012-06-26      20       100            1            Weekly
2012-07-18       21        200          1            Weekly
2012-07-10       22        250          3            Monthly
2012-08-10       22        300          3            Monthly
2012-07-16       23        200          2            Fortnightly
2012-06-20       24       100           4             Yearly

成本”表。这是以固定日期间隔接收插入金额的表格。假设今天的日期是 2012-07-18,当我在很长一段时间后启动应用程序时没有这样做......我需要将 Costs 表更新为如下内容:

CostDate    CatFK       Amount      AutoExp

2012-06-26    20          100       1       
2012-07-03    20          100       1
2012-07-10    20          100       1
2012-07-17    20          100       1
2012-07-18    21          200       1
2012-07-10    22          250       3
2012-07-16    23          200       2
2012-06-20    24          100       4

到目前为止,这是我的代码的开始,它试图完成每周的经常性费用。它显然不起作用...

PRAGMA recursive_triggers = on
CREATE TEMPORARY TRIGGER MyTrigger
BEFORE INSERT ON Costs
WHEN new.RecurDate < (select date('now','localtime')) BEGIN
INSERT INTO Costs (CostDate, Amount, CatFK, AutoExp)
VALUES (date(new.RecurDate,'+'||7||' days'), Category.RecurAmount, Category.Key,    Category.Recur;
END

INSERT INTO Costs (CostDate, Amount, CatFK, AutoExp)
SELECT RecurDate, RecurAmount,Key, Recur from Category
WHERE
Recur =1 ;

正如你所看到的,我正在以某种方式使用触发器来实现这一点,但我距离完成这件事还有很长的路要走。复杂性来自我正在处理的不同的重复间隔,并根据这些不同的间隔识别和插入未来的“RecurDate”回到类别表中。我几乎在想我在 SQLite 之外使用 AS3 和一个循环来构建一个自定义语句来锻炼日期,然后将我需要的内容插入到 SQLite 中。

我想知道是否有人可以给我一些指示,因为这很棘手而且我不是很好:)

谢谢

马可

4

1 回答 1

1

我认为主要问题是如何在 CostDate 和今天的日期之间给定每行的 RecurDate 值生成必要的 CostDate 值。

我对 SQLlite 一无所知,但我可以在 SQL Server 中解决问题,所以我将尝试解释所需的逻辑。

我建议在 4 遍中执行此操作,每个刷新周期一次。因此,我将在下面的叙述中假设,我们正在创建重复周期为每 7 天的新行。您应该能够根据需要复制其他周期的逻辑。

您需要一个从 0(=earliest RecurDate)到今天(包括今天)的整数值(天数)的临时表。因此,例如,如果最早的日期是 142 天前,则该表将需要包含 0 到 142 的值;或者,如果我们可以假设最早可能的 RecurDate 是 1000 天前或更短时间(即接近 3 年前),我们可以说该表将始终需要包含 0 到 1000 的值。

要创建它,我不确定您需要什么语法,但我会这样做:

    create table Days (interval int);
    insert Days values (0);
    insert Days values (1);

    declare @offset int, @max int;
    select @offset = 2, @max = 1000  /*(1000 per the assumption of a maximum value)*/
    while @offset < @max begin
      insert Days 
      select interval + @offset 
      from Days 
      where interval + @offset <= @max
    end

此表中的数据需要与插入语句中的类别交叉连接(即创建一个笛卡尔积,其中第一个表中的所有行都匹配另一个表中的所有行)以创建新行:

    insert costs (Amount, CostDate, CatFK, AutoExp)
    select c.RecurAmount, c.RecurDate + d.interval, c.Catkey, c.Recur
    from Categories c cross join Days d
    where c.RecurDate < getdate()      /*'now'*/
      and c.Recur = 1
      and c.RecurDate + d.interval <= getdate()
      and d.interval > 0
      and d.interval mod 7 = 0;

因此,我们在成本表中插入类别表列 + 期间,对于 RecurDate 在今天之前的所有类别,并且重复间隔为 1(每周),并且 RecurDate + 使用期间小于或等于今天日期,并且期间不是 0(因此您不会创建记录日期 = RecurDate),并且用于每个插入的期间可以被 7 整除。

我假设(或者我读错了)在此过程运行后,RecurDate 将根据每个类别的成本中最近的 CostDate 进行更新。

希望这会有所帮助:-) JB

于 2012-07-19T03:46:40.363 回答