SQLiteでトリガーを使用して自動更新を行うことに関するトリッキーな質問...
ここでは、特定の日付から一定の間隔でテーブルにエントリを作成する必要がある状況があります。「 Category」テーブルの各カテゴリには、「 RecurAmount」があり、7日、14日、1か月、1年の4つの固定間隔のいずれかで繰り返されるように設定されています。(私はこれらを整数1、2、3、4で表します)各カテゴリには、ユーザーが最初に選択したRecurDateがあります。この日付が過ぎたら、アプリケーションに次のことを実行させる必要があります(たとえば、アプリケーションが2か月間開かれておらず、更新する必要があるとします)。
1)RecurDateが<= date('now')であるカテゴリからすべてのカテゴリを選択します...これらは更新される予定のカテゴリです。
2)「Costs」テーブルにRecurAmount、RecurDate、CatKey、 「 Categories」テーブルから取得したRecur値を次のCosts列に挿入します: Amount、CostDate、* CatFK *、AutoExp
3)次に、SQLiteに、「 Recur 」値で決定された間隔で、一定の間隔の日付の金額をコストテーブルに自動的に挿入できるようにする必要があります。したがって、Recur値が「1」の場合、 RecurDateから今日の日付まで7日間隔でCostsテーブルに入力する一連のエントリが必要ですが、それ以上は必要ありません。
4)すべてのカテゴリの経常費用が現在の日付まで適用されたら...カテゴリテーブルのRecurDateフィールドに将来の日付を1つ追加する必要があります。これは、次の自動入力が発生する前に一致または通過する必要がある次の日付として機能します。
使用しているテーブルは次のとおりです。"カテゴリ"テーブル:
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」を識別してカテゴリテーブルに挿入し直します。AS3とループを使用してSQLIteの外部でカスタムステートメントを作成し、日付を計算してから、必要なものをSQLiteに挿入し直すことをほぼ考えています。
これはかなりトリッキーで、私はあまり上手ではないので、誰かが私にいくつかのポインタを教えてくれないかと思います:)
ありがとう
マルコ