2012-07-18 61 views
1

一个棘手的问题围绕在SQLite中使用触发器来执行自动更新...如何使用触发器在SQLite中自动输入重复数量?

我有一个情况,在这里我需要在一个特定的日期开始的特定时间间隔在表中的条目。 “类别”表中的每个类别都有一个“RecurAmount”,其设置为以4个固定时间间隔(7天,14天,1个月,1年)之一重现。 (我用整数1,2,3,4代表)每个类别都有一个RecurDate,它最初由用户选择。一旦这个日期通过我需要有应用程序做以下(假设例如应用程序处理不当被打开了几个月的,需要刷新):

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

2)将变成 “成本” 表RecurAmountRecurDateCatKey岑参取自值 “分类” 表为以下成本列:金额CostDate,* CatFK *,AutoExp

3)我需要则能够有SQLite的以规则的间隔插入的日期入量在由“岑参”值所确定的时间间隔自动费用表。因此,如果其值为“1”,我需要以7天的时间间隔从RecurDate开始进入成本表的序列,并且直到今天的日期但不再进一步。

4)一旦所有类别有他们的经常性成本enties应用到当前的日期...我需要被添加到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,当我启动经过长时间的应用,但不这样做......我需要的费用表更新到这样的事情:

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”并将其插入到Categories表中。我几乎想着我在SQLIte之外使用AS3和循环来构建日期的自定义语句,然后插入我需要的SQLite。

我想知道,如果有人可以请给我一些指点,因为这是非常棘手的,我不是很好:)

感谢

马尔科

回答

1

我认为主要的问题是如何根据CostDate和当天日期之间每行的RecurDate值生成必要的CostDate值。

我对SQLlite一无所知,但我可以在SQL服务器上解决这个问题,所以我会尝试解释所需的逻辑。

我建议这样做4次,每次刷新一次。因此,我将在后面的叙述中假设,我们正在创建新的行,每隔7天重复出现一次。您应该能够根据需要复制其他周期的逻辑。

您需要一个从0(=最早的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 

本表中的数据必须是跨接(即创建一个caretesian产品,其中在第一所有行表匹配另一个表中的所有行)与插入语句中的类别创建新行:

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

+0

嗨约翰 感谢您详细的答复,这似乎是一个有趣的方法来尝试似乎并不过于复杂。我会看看我是否可以在SQLite中使用它。 – 2012-07-19 07:27:14

+1

我得到这个与SQLite几个调整:我改变了getdate()为julianday('现在','本地时间')和d.interval> 0到d.interval> = 0为了得到第一个日期也进入了。谢谢你的帮助约翰。 M – 2012-07-19 12:38:12

+0

不用担心,很高兴我能帮上忙 – 2012-08-09 04:08:24

相关问题