• Streepie24
  • NEWBIE
  • 0 Points
  • Member since 2009

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 5
    Questions
  • 2
    Replies

Is this done at the time of the actual insert

or

Is this done when a user/program tries to use the data

or

.... please tell me !

 

 

Message Edited by Streepie24 on 11-10-2009 06:07 AM

Hi,

 

I just changed my update code from a trigger to a future class to avoid governor limits.

The trigger calls the Future Class.

Now i am getting the following error: Future method cannot be called from a future method: sluiten(LIST:Id)

I don't call a future method from a future method ... or am i ??

The trigger is not FUTURE....!?

 

TRIGGER:

trigger Sluiten_AF_Taken on Achterstallige_factuur__c (before update) { //haal Id van SYSTEM op User sys = [SELECT Id FROM User WHERE Alias =: 'SYSTE']; //Hulplijst List<Id> afact=new List<Id>(); for(Achterstallige_factuur__c af: Trigger.new){ if(af.status__c == 'Afgehandeld'){ afact.add(af.Id); } } Sluiten_AF_Taken_Handler.Sluiten(afact); }

 

FUTURE CLASS:

 

public class Sluiten_AF_Taken_Handler{ //Trigger Sluiten_AF_Taken kan niet worden gebruikt voor de bulkupdate // vandaar dat we vanuit de trigger naar deze @Future Class springen // alwaar we wel bulkupdates kunnen uitvoeren ! @Future(callout=false) public static void sluiten(List<Id> AFIDS){ //haal Id van SYSTEM op User sys = [SELECT Id FROM User WHERE Alias =: 'SYSTE']; //Hulplijst List<Task> toUpdate = new List<Task>(); List<Task> t=new List<Task>([SELECT Id, WhatId FROM Task WHERE CreatedById =: sys.Id and status != 'Afgesloten' ]); for(Id aft: AFIDS){ for(Task tk: t){ if(tk.WhatId==aft){ tk.status = 'Afgesloten'; tk.IsReminderSet = false; toUpdate.add(tk); } } } update toUpdate; } }

 

Hi All,

 

I know this issue is common... but i really am out of ideas of how to fix this error/limit

I tried numerous variants of code to solve this but nothing works...

 

!! PLEASE HELP   !!

 

Run Failures:
  TestClass2.GenericTestMethod3 System.DmlException: Update failed. First exception on row 0 with id a0R20000000XsgSEAS; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, Sluiten_AF_Taken: execution of BeforeUpdate

caused by: System.Exception: Too many query rows: 516

Trigger.Sluiten_AF_Taken: line 9, column 30: []

 

trigger Sluiten_AF_Taken on Achterstallige_factuur__c (before update) { //haal Id van SYSTEM op User sys = [SELECT Id FROM User WHERE Alias =: 'SYSTE']; //Hulplijst List<Achterstallige_factuur__c> afact=new List<Achterstallige_factuur__c>(); List<Task> toUpdate = new List<Task>(); List<Task> t=new List<Task>([SELECT Id, WhatId FROM Task WHERE CreatedById =: sys.Id and status != 'Afgesloten' ]); for(Achterstallige_factuur__c af: Trigger.new){ if(af.status__c == 'Afgehandeld'){ afact.add(af); } } for(Achterstallige_factuur__c aft: afact){ for(Task tk: t){ if(tk.WhatId==aft.Id){ tk.status = 'Afgesloten'; tk.IsReminderSet = false; toUpdate.add(tk); } } } update toUpdate; }

  

 

 

 

Message Edited by Streepie24 on 11-05-2009 01:28 AM

Hi there,

 

I keep getting the "Too many SOQL queries" error when trying to deploy my apex class.

I tried a lot of constructions but can't figure out how to construct this class so that i don't get those errors...!?

 

I get the errors when i unmark the /* ---->>>*/ marked rows...

 

Is there somebody who could help me to get my class deployed?

 

 

public class Taak_tbv_Factuur { public static integer TESTVAR = 0; //Lijsten tbv opslaan gevonden Achterstallige facturen; om later te verwerken en geen bulk limits tegen te komen public static List<Achterstallige_factuur__c> Dag8Facturen = new List<Achterstallige_factuur__c>(); public static List<Account> Dag8Accounts = new List<Account>(); public static List<Integer> Dag8Taken = new List<Integer>(); public static List<Achterstallige_factuur__c> Dag22Facturen = new List<Achterstallige_factuur__c>(); public static List<Account> Dag22Accounts = new List<Account>(); public static List<Achterstallige_factuur__c> Dag42Facturen = new List<Achterstallige_factuur__c>(); public static List<Achterstallige_factuur__c> Dag50Facturen = new List<Achterstallige_factuur__c>(); //haal Id van SYSTEM op public static User sys = [SELECT Id FROM User WHERE Alias =: 'SYSTE']; //haal MKP van SYSTEM op public static User mkp = [SELECT Id FROM User WHERE Alias =: 'MKP']; @Future public static void Check_Achterstallig(){ // zoek naar de nog niet afgehandelde achterstallige facturen Achterstallige_factuur__c[] Af = [SELECT Id, Relatie__c, CreatedDate, Status__c FROM Achterstallige_factuur__c WHERE Status__c != 'Afgehandeld']; for(Achterstallige_factuur__c f: Af){ // bereken leeftijd van de achterstallige factuur entry Date OPVOERDATUM = date.valueof(string.valueof(f.CreatedDate)); Date VANDAAG = Date.today(); integer leeftijd = OPVOERDATUM.daysbetween(VANDAAG); if(leeftijd >= 50 || TESTVAR == 4){ // bestaande taak mkp op afgesloten zetten en nieuwe taak voor mkp aanmaken en zet achterstallige factuur op "Loopt bij Incasso" Dag50Facturen.Add(f); } else if(leeftijd >= 42 || TESTVAR == 3){ // bestaande taak mkp op afgesloten zetten en nieuwe taak voor mkp aanmaken en zet achterstallige factuur op "Laatste sommatie versturen..." Dag42Facturen.Add(f); } else if(leeftijd >= 22 || TESTVAR == 2){ // Als het nabellen van de AM niet heeft geholpen laten we F&A terugbellen, 22 dagen na invoeren achterstallige factuur Account a = [SELECT OwnerId, Id FROM Account WHERE Id =: f.Relatie__c limit 1]; Dag22Facturen.Add(f); Dag22Accounts.Add(a); } else if(leeftijd >= 8 || TESTVAR == 1){ // 8 dagen nadat de achterstallige factuur is ingevoerd maken we de eerste taak aan om te laten bellen door AM van de betreffende relatie Account a = [SELECT OwnerId, Id FROM Account WHERE Id =: f.Relatie__c limit 1]; integer i = [SELECT Count() FROM Task WHERE WhatId =: f.Id and CreatedById =: sys.Id limit 1]; Dag8Facturen.Add(f); Dag8Accounts.Add(a); Dag8Taken.Add(i); } } for (integer afactuur = 0; afactuur < Dag50Facturen.size(); afactuur++){ Achterstallige_factuur__c ach=Dag50Facturen[afactuur]; /* ---->>> */ //MaakTaakDag50(ach); } for (integer afactuur = 0; afactuur < Dag42Facturen.size(); afactuur++){ Achterstallige_factuur__c ach=Dag42Facturen[afactuur]; /* ---->>> */ //MaakTaakDag42(ach); } for (integer afactuur = 0; afactuur < Dag22Facturen.size(); afactuur++){ Achterstallige_factuur__c ach=Dag22Facturen[afactuur]; account a = Dag22Accounts[afactuur]; /* ---->>> */ //MaakTaakDag22(ach, a); } for (integer afactuur = 0; afactuur < Dag8Facturen.size(); afactuur++){ Achterstallige_factuur__c ach=Dag8Facturen[afactuur]; account a = Dag8Accounts[afactuur]; integer i = Dag8Taken[afactuur]; //taak mag nog niet bestaan if(i==0){ MaakTaakDag8(ach, a); } } } private static void MaakTaakDag8(Achterstallige_factuur__c ach, account a){ // 8 dagen nadat de achterstallige factuur is ingevoerd maken we de eerste taak aan om te laten bellen door AM van de betreffende relatie //Maak de taak aan Task[] newTask = new Task[0]; newTask.add(new Task(Description = 'Relatie nabellen tbv achterstallige betaling factuur (FASE 1 van 4)', Priority = 'Normal', Status = 'Nog te Starten', Subject = 'Achterstallige factuur', IsReminderSet = true, ReminderDateTime = System.now(), OwnerId = a.OwnerId, WhatId = ach.Id) ); insert newTask; } private static void MaakTaakDag22(Achterstallige_factuur__c ach, account a){ // Als het nabellen van de AM niet heeft geholpen laten we F&A terugbellen, 22 dagen na invoeren achterstallige factuur // update bestaande taak naar afgesloten en maak een nieuwe aan Task[] Tsk = [SELECT Id FROM Task WHERE WhatId =: ach.Id and CreatedById =: sys.Id and OwnerId =: a.OwnerId and status != 'Afgesloten']; for(Task T: Tsk){ T.status = 'Afgesloten'; T.IsReminderSet = false; Update T; } // Als de taak voor MKP nog niet bestaat dan aanmaken integer i = [SELECT count() FROM Task WHERE WhatId =: ach.Id and CreatedById =: sys.Id and OwnerId =: mkp.Id and status != 'Afgesloten' limit 1]; if(i == 0){ // Maak taak aan Task[] newTask = new Task[0]; newTask.add(new Task(Description = 'Relatie nabellen tbv achterstallige betaling factuur (FASE 2 van 4)', Priority = 'Normal', Status = 'Nog te Starten', Subject = 'Achterstallige factuur', IsReminderSet = true, ReminderDateTime = System.now(), OwnerId = mkp.Id, WhatId = ach.Id) ); insert newTask; } } private static void MaakTaakDag42(Achterstallige_factuur__c ach){ // bestaande taak mkp op afgesloten zetten en nieuwe taak voor mkp aanmaken en zet achterstallige factuur op "Laatste sommatie versturen..." Task[] Tsk = [SELECT Id, Description FROM Task WHERE WhatId =: ach.Id and CreatedById =: sys.Id and OwnerId =: mkp.Id and status != 'Afgesloten' ]; for(Task T: Tsk){ if(T.Description == 'Relatie nabellen tbv achterstallige betaling factuur (FASE 2 van 4)'){ T.status = 'Afgesloten'; T.IsReminderSet = false; Update T; // nieuwe taak aanmaken voor MKP tbv laatste sommatie Task[] newTask = new Task[0]; newTask.add(new Task(Description = 'Laatste sommatie versturen (FASE 3 van 4)', Priority = 'Normal', Status = 'Nog te Starten', Subject = 'Achterstallige factuur', IsReminderSet = true, ReminderDateTime = System.now(), OwnerId = mkp.Id, WhatId = ach.Id) ); insert newTask; // status van de achterstallige factuur bijwerken ach.Status__c = 'Laatste sommatie is verstuurd'; update ach; } } } private static void MaakTaakDag50(Achterstallige_factuur__c ach){ // bestaande taak mkp op afgesloten zetten en nieuwe taak voor mkp aanmaken en zet achterstallige factuur op "Loopt bij Incasso" Task[] Tsk = [SELECT Id, Description FROM Task WHERE WhatId =: ach.Id and CreatedById =: sys.Id and OwnerId =: mkp.Id and status != 'Afgesloten' ]; for(Task T: Tsk){ if(T.Description == 'Laatste sommatie versturen (FASE 3 van 4)'){ T.status = 'Afgesloten'; T.IsReminderSet = false; Update T; // nieuwe taak aanmaken voor MKP tbv laatste sommatie Task[] newTask = new Task[0]; newTask.add(new Task(Description = 'Factuur aanbieden ter incasso (FASE 4 van 4)', Priority = 'Normal', Status = 'Nog te Starten', Subject = 'Achterstallige factuur', IsReminderSet = true, ReminderDateTime = System.now(), OwnerId = mkp.Id, WhatId = ach.Id) ); insert newTask; // status van de achterstallige factuur bijwerken ach.Status__c = 'Loopt bij incasso'; update ach; } } } }

 

 

if(a==1){ ... } else if(a==2){ ... } else if(a==3){ ... }

 

 

 

How to test such a construction in a testmethod ?

Message Edited by Streepie24 on 09-18-2009 06:36 AM
Message Edited by Streepie24 on 09-18-2009 06:37 AM

Hi All,

 

I know this issue is common... but i really am out of ideas of how to fix this error/limit

I tried numerous variants of code to solve this but nothing works...

 

!! PLEASE HELP   !!

 

Run Failures:
  TestClass2.GenericTestMethod3 System.DmlException: Update failed. First exception on row 0 with id a0R20000000XsgSEAS; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, Sluiten_AF_Taken: execution of BeforeUpdate

caused by: System.Exception: Too many query rows: 516

Trigger.Sluiten_AF_Taken: line 9, column 30: []

 

trigger Sluiten_AF_Taken on Achterstallige_factuur__c (before update) { //haal Id van SYSTEM op User sys = [SELECT Id FROM User WHERE Alias =: 'SYSTE']; //Hulplijst List<Achterstallige_factuur__c> afact=new List<Achterstallige_factuur__c>(); List<Task> toUpdate = new List<Task>(); List<Task> t=new List<Task>([SELECT Id, WhatId FROM Task WHERE CreatedById =: sys.Id and status != 'Afgesloten' ]); for(Achterstallige_factuur__c af: Trigger.new){ if(af.status__c == 'Afgehandeld'){ afact.add(af); } } for(Achterstallige_factuur__c aft: afact){ for(Task tk: t){ if(tk.WhatId==aft.Id){ tk.status = 'Afgesloten'; tk.IsReminderSet = false; toUpdate.add(tk); } } } update toUpdate; }

  

 

 

 

Message Edited by Streepie24 on 11-05-2009 01:28 AM