2012-07-18 21 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

相關問題