2012-02-10 49 views
1

我的應用程序有很多聚合字段,需要更新任何相關記錄被更改,添加或刪除時。關係和計算有些牽扯,所以我創建了一個類來處理所有相關表的所有計算。計算中涉及到一些SOQL和DML開銷,所以該類可以批量處理所有內容。如何在APEX中創建一個解構器(或類似的),在對象被銷燬之前運行?

我想在這個類上的updateAll()方法對已經添加到其隊列的所有記錄的每個請求運行不超過一次。但是,APEX中並沒有出現像「類似解構器」的功能,在這個計算器對象被銷燬之前它會自動調用。

在APEX中實現這種模式的最佳方式是什麼?

回答

1

這就是我所做的。我創建了一個Calculator類,以〜10表/對象關係重新計算每個相關的聚合/計算字段。我在每個對象上使用觸發器,以使計算器類在相關對象系列集上運行到已更改的對象。我在計算器類中使用了一個靜態變量來檢查計算器是否在每個觸發器中運行,以便它們只在目前沒有運行時才調用計算器。它工作得很好。效率不高,但低於省長限制,並且工作量很大。而且,我可以與它一起成長......

+0

以下省長的限制是什麼?堆大小? – 2016-01-25 17:22:26

1

是的,沒有辦法檢測或預測對象的破壞,因爲它基本上是JSP在後臺(噓,他們不想讓你知道,這是「沒有軟件」的事情)機制,但你不能依賴那個。

我們實際上在觸發器或報告中處理我們的聚合(取決於聚合是否需要存儲)。觸發器也可以將批次作爲列表而不是逐行進行批量聚合,並允許我們滿足討厭的管理者。不幸的是,如果你有多表彙總,你需要觸發所有這些觸發器,併爲每批次重新運行它們。

+0

在聚合計算中存在一個循環,使其依賴於對象觸發器成爲真正的痛苦。當表A改變時,表B聚合得到重新計算,並且當表B聚合改變時,表A得到重新計算。我可以通過其他方式檢測變化或跳出循環,但感覺很脆弱。我寧願只是使用析構函數... GRR – barelyknown 2012-02-10 16:11:43

+0

你可以用一個SOQL檢測到突破點,並且使用集合SOQL和where子句來限制這個集合嗎?並將其封裝成觸發器。我只是拋出想法,我不知道你的聚合過程是什麼樣子。 – mmix 2012-02-11 09:47:33

相關問題