1

SQLiteでトリガーを使用して自動更新を行うことに関するトリッキーな質問...

ここでは、特定の日付から一定の間隔でテーブルにエントリを作成する必要がある状況があります。「 Category」テーブルの各カテゴリには、「 RecurAmount」があり、7日、14日、1か月、1年の4つの固定間隔のいずれかで繰り返されるように設定されています。(私はこれらを整数1、2、3、4で表します)各カテゴリには、ユーザーが最初に選択したRecurDateがあります。この日付が過ぎたら、アプリケーションに次のことを実行させる必要があります(たとえば、アプリケーションが2か月間開かれておらず、更新する必要があるとします)。

1)RecurDateが<= date('now')であるカテゴリからすべてのカテゴリを選択します...これらは更新される予定のカテゴリです。

2)「Costs」テーブルにRecurAmountRecurDateCatKey、 「 Categories」テーブルから取得したRecur値を次のCosts列に挿入します: AmountCostDate、* 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に挿入し直すことをほぼ考えています。

これはかなりトリッキーで、私はあまり上手ではないので、誰かが私にいくつかのポインタを教えてくれないかと思います:)

ありがとう

マルコ

4

1 に答える 1

1

主な問題は、CostDateと今日の日付の間の各行のRecurDate値を指定して、必要なCostDate値をどのように生成するかであると思います。

SQLliteについては何も知りませんが、SQL Serverの問題は解決できたので、必要なロジックについて説明します。

リフレッシュサイクルごとに1回ずつ、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

このテーブルのデータは、新しい行を作成する挿入ステートメントのカテゴリと相互結合する必要があります(つまり、最初のテーブルのすべての行が他のテーブルのすべての行と一致するカレテシアン製品を作成します)。

    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 に答える