• Asif Ali M
  • NEWBIE
  • 492 Points
  • Member since 2012
  • Asif Ali M


  • Chatter
    Feed
  • 15
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 0
    Questions
  • 105
    Replies
I have a class that will update a field, Last_Changed_Date, on Contacts if certain fields on the Account are changed. This class worked but was touching so many records it timed out. My solution was to pass all the changes that needed to be made to Contact and pass a list to a Batch Method. Unfortunately, since adding the batch method it doesn't seem to be working. Any thoughts would be really appreciated!

Below is the main class
public with sharing class CCIProviderChangeAccountTracking {

    public static void resaveContact(Account oldAcct, Account newAcct) {

        if (oldAcct.Phone != newAcct.Phone ||
                oldAcct.ShippingAddress != newAcct.ShippingAddress ||
                oldAcct.V12C__PR_Practice_Tax_ID_Number__c != newAcct.V12C__PR_Practice_Tax_ID_Number__c ||
                oldAcct.BillingAddress != newAcct.BillingAddress) {
            system.debug('------Conditions Met!!!!!!!!!------');
            List<Contact> toSave = new List <Contact>();
            for (Contact con : [SELECT Id, Last_Changed_Date__c, AccountId FROM Contact WHERE AccountId = :newAcct.Id]) {
                //con.Last_Changed_Date__c = Datetime.NOW();
                toSave.add(con);
            }
            system.debug('jacob-------------' + toSave.size());

            try {
                Id batchInstanceId = Database.executeBatch(new CCIAllegianceUpdates(toSave), 200);
            } catch (exception e) {
                system.debug(e.getMessage());
            }
        }
    }
}

Here is the batch method that is being passed the list toSave.
 
global class CCIAllegianceUpdates implements Database.Batchable<sObject> {

    List<Contact> toSave = new List <Contact>();
    public CCIAllegianceUpdates(List<Contact> toSave) {
        toSave = toSave;
    }

    global Database.QueryLocator start(Database.BatchableContext BC) {
        system.debug('------Starting Batch!!!!!!!!!------');
        return null;
    }
    global void execute(Database.BatchableContext BC, List<Contact> scope) {
           
        
        update toSave;

    }
    global void finish(Database.BatchableContext BC) {
        system.debug('------Finish Batch!!!!!!!!!------');
    }

}

And finally this is where everything is being called
 
public void afterUpdate(SObject oldSo, SObject so) {
          Account oldAcct = (Account) oldSo;
          Account acct = (Account) so;
          CCIProviderChangeAccountTracking.resaveContact(oldAcct,acct);

    }

 
i write code to search a contact ----- wnat to debug this code in developer consol , but not able to do the same 
Public Class ContactSearch{
List <Contact> Con = New List<Contact>();
Public List<Contact> searchForContacts (String A, String B){
Con = [ Select Id , FirstName,LastName from Contact where lastname='A' and MailingPostalCode='B'];
return (Con);}
}
in developer consol i write one apex class and called a method of contact search class but getting error Line: 1, Column: 1
Unexpected token 'Public'.

Public Class NewContactSerach {
    
    ContactSearch Contc = New ContactSearch ();
    Contc.searchForContacts(Deshpande.abcde);
}

plz suggest me how to overcome from this 
Hi Fiends,

                 I am using batch apex for inserting the 100000 records but, the following exception throws while executing the batch. System.LimitException: "Too many DML rows:10001". I have tried giving batch size  as low and maximum but in both the cases the it throws the same exception.

global class InsertionOfOneLakhRecords implements database.Batchable<Sobject>,database.stateful{
   public integer count = 0;
  global database.QueryLocator start(database.BatchableContext bc){
    return database.getQueryLocator('select id, Name FROM Contact');
}
global void execute(database.BatchableContext bc, List<Contact> sobj){
    List<Contact> cons = new List<Contact>();
   for(integer i=0; i<100000; i++){
    Contact c = new Contact(LastName = 'test'+i, Email='test@salesforce.com', Phone = '123456');
    count++;
    cons.add(c);
}
    try{
    Database.SaveResult[] result =database.insert(cons);
 }
    catch(exception e){
     system.debug('Exception:'+e.getMessage());
    }
}
global void finish(database.BatchableContext bc){
 system.debug('total:'+count);   
  }
}

Thanks & Regards
Javascript: I am getting Unexpected token error for below code can you please help:

{!REQUIRESCRIPT("/soap/ajax/29.0/connection.js")} 

var obj;
var task5;
var recordtypeid;
var followup;
var recordtypefol;
if("{!$Profile.Name}" == "TX1" || 
"{!$Profile.Name}"== "TX2"||
"{!$Profile.Name}"== "WX1"||
"{!$Profile.Name}"== "WX2"||
"{!$Profile.Name}"== "WX3"||
"{!$Profile.Name}"== "WX4"|| 
"{!$Profile.Name}" == "CC"){

obj='a1r';
}
else{
obj='00T';
}
alert(obj);

var url='/'+obj+'/e?CF00N50000002CzJi={!Account.Name}&CF00N50000002CzJi_lkid={!Account.Id}&retURL=/{!Contact.Id}&title=Call&who_id={!Contact.Id}&00N50000002D0zP={!User.Primary_Product__c}'
if(obj=="a1r")
{
url+='&followup=1&tsk5=call'
}

if(obj=="00T"){
if("{!$Profile.Name}" == "WI" && ("{!$UserRole.Name}"=="AS - E"||"{!$UserRole.Name}"=="AS - M"||"{!$UserRole.Name}"=="AS - T")){
task5="Meeting";
recordtypeid="0123B0000008tqK";
followup='';
recordtypefol="0123B0000008tqK";
}elseif("{!$Profile.Name}" == "WI Corporate Sales") {
task5="call";
recordtypeid="01250000000HiDD";
followup ="1";
recordtypefol="01250000000HiDD"; 
}else{
url+='&tsk5='+task5+'$tsk12=Completed'+'&RecordType='+recordtypeid+'&RecordType_fu='+recordtypefol+'&followup='+followup+'&tsk4={!TODAY()}'
}
}
else{
url+='&followup=1&tsk5=call'
}

window.parent.open(url, "_self");
Hi,

can anyone give me the soql query to fetch records genrated on 1st of every month.

Regards
Pavan.
Hi All,
I'm trying optimize my code, so I need help.
Let me explain first how works my code.

I have a table in my page that brings a list of accounts with your fields.
Each of these fields is a field of type Choice List, and when I select an option the account are updated.
Here is the image of my table:
User-added image

The only way I could update the field is creating for each column a function in Javascript and a Method in APEX.
Javascrit:
function gravar(id, status){
     var id_conta = id;
     var nome = document.getElementById(status).value;
     executar(id_conta, nome);
    }

Apex:
        public pageReference Save(){
            System.debug('Executou ');
            id_conta = System.currentPageReference().getParameters().get('id_contas');
            status_conta = System.currentPageReference().getParameters().get('suporte_status');
            
            for(Account conta : [SELECT Id, Name, ServiceNow_Status__c, Suporte_Status__c, Adm_Status__c, BS_BH_Status__c FROM Account                                             WHERE Id =: id_conta]){
                conta.Suporte_Status__c = status_conta;
                update conta;
            }

           return null;
        }

The problems is, if I have 45 columns I must create 45 funcions and Apex Methods.
I want create only 1 Function and only 1 Method that Allow to me update the field.
The process will update each field at a time.

Can someone help me to optimize my code?

Thanks
Rafael.
 
Hello, I seem to have caused a GACK on my batchable apex class. When compliling I got this message:

An unexpected error occurred. Please include this ErrorId if you contact support: 756300814-61854 (704773059)

This batch class is designed to identify a set of leads based on a record type and then delete them on a schedulded basis. I'm using Mavensmate + Sublime 3 (if that helps). 
I have created a Task Trigger to count the number of Calls related to an Account from all of the related record (Contacts, Opportunities) and used 2 fields on the Account (Activity Count, AS Activity Count) to store the count in depending on the Rep who was making the call. The issue I am having though is that the Account part is working great but the Contact and Opportunity is recieving an error stating that the Account Id was recieved without querying the requested field. Listed below is my trigger. What am I doing wrong?
trigger Activity_Count on Task (before insert, before update){

    Set<Id> accIds = new Set<Id>();
   Map<Id,Account> accMap = new Map<Id,Account>();
    Map<Id,Task> conMap = new Map<Id,Task>();
    Map<Id,Task> oppMap = new Map<Id, Task>();
     List<Account> updateAccountList = new List<Account>();  
   List<Contact> udpateContactList = new List<Contact>();
    List<Opportunity> updateOppList = new List<Opportunity>();
    String accPrefix = Account.sObjectType.getDescribe().getKeyPrefix();
    String contactPrefix = Contact.sObjectType.getDescribe().getKeyPrefix();
    String oppPrefix= Opportunity.sObjectType.getDescribe().getKeyPrefix();
 
        
    for (Task t :  Trigger.new) {
     
     String str = t.whatId;
       String contactstr = t.WhoId;
        
          if(t.WhoId!=null && t.Subject.contains('Call') && contactstr.startsWith(contactPrefix) && t.status =='Completed'  && t.Counted__c != True)      //Task belongs to the Contact
          {
                        conMap.put(t.whoId, t);
              			   t.Counted__c=true;
            }
        if(t.WhatId!=null && t.Subject.contains('Call') && str.startsWith(accPrefix) && t.status =='Completed' && t.Counted__c !=True)     // Task belongs to Account with AS Rep Owner
          {
            accIds.add(t.whatId);
           t.Counted__c=true;
          }
         if(t.WhatId != null && t.Subject.contains('Call') && str.startsWith(oppPrefix) && t.status =='Completed' && t.Counted__c != True)     //Task belongs to Opportunity
        {
            
                  oppMap.put(t.whatId, t);
            		   t.Counted__c=true;
   		 } 
    
    }
    try{
String ProfileId = userinfo.getProfileId();
if(accIds.size() > 0){ 
              accMap = new Map<Id, Account> ([SELECT Id, 
                                              Activity_Count__c,
                                              AS_Activity_Count__c
                                           FROM Account WHERE Id in :accIds]);
           updateAccountList = accMap.values();
         
               for(Account acc : updateAccountList){
                     if(acc.AS_Activity_Count__c != null){
                           acc.AS_Activity_Count__c =  acc.AS_Activity_Count__c +1;
                        }
                   If(ProfileId =='00e30000001wVmqAAE'){
                          acc.AS_Activity_Count__c =1; 
                     }
                   if(acc.Activity_Count__c != null && ProfileId =='00e30000001wWXJAA2'){
                        acc.Activity_Count__c =  acc.Activity_Count__c +1;
                   }
                  If(ProfileId=='00e30000001wWXJ'){
                         acc.Activity_Count__c =1;
                   }
               }
         update updateAccountList;
        }
If(conMap.size()>0){ //Updating Accounts when Task is logged on Contact
                
          udpateContactList = [Select Id, AccountId from Contact where Id IN: conMap.keySet()];
          
          for(Contact con : udpateContactList){
				  If(con.Account.AS_Activity_Count__c!=null && ProfileId =='00e30000001wVmq'){
                          con.Account.AS_Activity_Count__c = con.Account.AS_Activity_Count__c+1; 
                     }
                If(ProfileId =='00e30000001wVmq'){
                         con.Account.AS_Activity_Count__c =1; 
                     }
                   if(con.Account.Activity_Count__c != null && ProfileId =='00e30000001wWXJ'){
                        con.Account.Activity_Count__c = con.Account.Activity_Count__c +1;
                   }
                  If(ProfileId=='00e30000001wWXJ'){
                         con.Account.Activity_Count__c =1;
                   }
             }
         update udpateContactList;
        }
      
    If(oppMap.size() >0){ //Updating Accounts when call is logged on Opportunity
      updateOppList = [Select Id, AccountId from Opportunity where Id IN: oppMap.keySet()];
         for(Opportunity opps : updateOppList){  
                   If(opps.Account.AS_Activity_Count__c!=null && ProfileId =='00e30000001wVmq'){
                         opps.Account.AS_Activity_Count__c =  opps.Account.AS_Activity_Count__c +1; 
                     }
                 If(ProfileId =='00e30000001wVmq'){
                         opps.Account.AS_Activity_Count__c =1; 
                     }
                   if( ProfileId =='00e30000001wWXJ' && opps.Account.Activity_Count__c != null ){
                        opps.Account.Activity_Count__c =  opps.Account.Activity_Count__c +1;
                   }
                  If(ProfileId=='00e30000001wWXJ'){
                         opps.Account.Activity_Count__c =1;
                   }
             }
         update updateOppList;
    
             }
    }
  catch(Exception e){
        System.debug('Exception in Trigger:Activity_Count'  + e.getMessage());
    }
    
}
About trigger :There are two objects student_details__c and department__c. department__c - contains name and no_of_students__c; student_details__c contains name, department(lookup to department object).
when a student is inserted in a department, that respective department needs to increment the no_of_students__field,similarly when department is changed of a student from one dept to other then no_of_students__c needs to be incremented in the new department and decremented from the old department field. no_of_student__c is the total count of students in respect to the department the belong to in each department object.

Testclass
@istest

private class StudentupdatehandlerTestClass {

    static testMethod void validateupdatechange() {

       Department__c  newdept = new department__c();   
       newdept.name='CSE';
       insert newdept;

       student_details__c newstudent = new Student_details__c();

       newstudent.Name='From TestClass';   
       newstudent.department__c = newdept.id;    



       System.debug('before@@trigger: ' + newdept.no_of_students__c);

       insert newstudent;

       newstudent = [SELECT department__c FROM student_details__c WHERE Id =:newstudent.Id];
       System.debug('after@@trigger: ' + newdept.no_of_students__c);


       System.assertEquals(1 , newdept.no_of_students__c);
    }
}

error is in the insert newstudent line

Trigger
trigger Test on Student_Details__c (after insert, after update,after delete) {

        studentupdatehandler studobj = new studentupdatehandler();

        if(trigger.isinsert)
        {
        studobj.afterinsert(trigger.new);
        }

        if(trigger.isdelete)
        {
        studobj.afterdelete(trigger.old);
        }

       if(trigger.isupdate)
       {
       studobj.afterupdate(trigger.new,trigger.old);
       }    
}

Triggerhandler
 
public class studentupdatehandler{

     set<id> deptid = new set<id>();  

public void afterinsert(student_details__c[] newstudentslist) {

        list<department__c> newdeptlist = [select id,name,no_of_students__c,(select id from student_details__r) from department__c where id in:forids(newstudentslist)];

        toinsert(newdeptlist);
 } 

     public void afterdelete(student_details__c[] oldstudentslist) {
        list<department__c> olddeptlist = [select id,name,no_of_students__c,(select id from student_details__r) from department__c where id in:forids(oldstudentslist)];

        toupdate(olddeptlist);
 }

    public void afterupdate(student_details__c[] newstudentslist,student_details__c[] oldstudentslist) {

        list<department__c> newdeptlist = [select id,name,no_of_students__c,(select id from student_details__r) from department__c where id in:forids(newstudentslist)];
        toinsert(newdeptlist);


        list<department__c> odeptlist= [select id,name,no_of_students__c,(select id from student_details__r) from department__c where id in:forids(oldstudentslist)];
        toupdate(odeptlist);  

}

Public set<id> forids(student_details__c[] deptlist ){
        set<id> ids = new set<id>();

         for(student_Details__c record: deptlist){

             ids.add(record.Department__c);

            }
return ids;}

Public void toinsert(department__c[] deptlist ){

        for(department__c dept : deptlist){

                   dept.no_of_students__c = dept.no_of_students__c +1;
        }                 
   update deptlist;      
        } 

Public void toupdate(department__c[] odeptlist ){


        for(department__c dept : odeptlist){
                 dept.no_of_students__c = dept.no_of_students__c -1;
             } 
         update odeptlist; 
}


}


I need to create test case for insert, update and delete.

The problem is I am not bale to input data for the student object for the lookup field in it,Department is another object which is lookup in the student object with field department__c,

I feel i am not populating that field in correct manner in test class.

I need to build a soql condtion dynamically, 
E.g. if datatype is EMAIL then all same datatypes should be in OR condtion and other datatypes in AND condtion
 WHERE (email='test@gmail.com' OR email='test_1@gmail.com') AND (name='test' OR name='test_1')
and return it to a string 
I have a trigger and when running hit the below error. not sure how to fix this, requesting expert help.

Error:Apex trigger updateReliefTeacheronTeacherClassSession caused an unexpected exception, contact your administrator: updateReliefTeacheronTeacherClassSession: execution of AfterUpdate caused by: System.QueryException: Non-selective query against large object type (more than 200000 rows). Consider an indexed filter or contact salesforce.com about custom indexing. Even if a field is indexed a filter might still not be selective when: 1. The filter value includes null (for instance binding with a list that contains null) 2. Data skew exists whereby the number of matching rows is very large (for instance, filtering for a particular foreign key value that occurs many times): Trigger.updateReliefTeacheronTeacherClassSession: line 14, column 1

trigger updateReliefTeacheronTeacherClassSession on Staff_Leave__c (after insert, after update)
    {
        map<string, Staff_Leave__c> ObjMap = new map<string, Staff_Leave__c>();
        DateTime myDateTime;
        String dayOfWeek;
        
  
        for(Staff_Leave__c obj: Trigger.new)
        {   List<Class__c> classList = [SELECT Id,Day__c from Class__c where id =: obj.Active_Class__c];
            
            if (obj.Relief_Teacher__c != Null)
            {   myDateTime = (DateTime)obj.date_of_leave__c;
                dayOfWeek = myDateTime.format('E');
                
                for(Class__c classRec:classList)
                {
                    if(dayOfWeek != classRec.day__c)
                    {
                       obj.addError('Please check leave dates.'); 
                    }
                    else
                    {
                        ObjMap.put(obj.Teacher__c, obj);
                    }
                }
                System.debug('-----Teacher is = '+ obj.Teacher__c + ' ------');
            }
        }
         
        List<Teacher_Class_Session__c> T = [SELECT Id,Teacher__c, Staff_Leave__c ,Assigned_Teacher__c,Relief_Type__c , Class__c,Class__r.teacher__c, Session_Date__c, Attendant_Status__c FROM Teacher_Class_Session__c WHERE Class__r.teacher__c IN :ObjMap.KeySet()];
        List<Teacher_Class_Session__c> TUpdateList = new List<Teacher_Class_Session__c>();
         
        for(Teacher_Class_Session__c c: T)
        {   System.debug('----------- Iterating through all class sessions-----');
            
            Staff_Leave__c obj = ObjMap.get(c.class__r.teacher__c);
            System.debug('Class session id = '+ c.id);
            System.debug('c.teacher= ' + c.class__r.teacher__c);
            System.debug('obj teacher= ' +obj.teacher__c);
            System.debug('c.class= ' + c.class__c + ' ' + 'obj class= ' +obj.Active_Class__c );
            System.debug('c.date= ' + c.session_date__c + ' ' + 'obj class= ' +obj.date_of_leave__c);
                        
            if(obj.Teacher__c == c.Class__r.teacher__c && obj.Active_Class__c == c.Class__c && c.session_date__c == obj.date_of_leave__c)
            { System.debug('Match found');
             c.Teacher__c = obj.Relief_Teacher__c;
             c.Relief_Type__c = obj.Leave_Type__c;
             c.Attendant_Status__c= 'Relief';
             c.Staff_Leave__c = obj.id;
             tUpdateList.add(c);
             }
         
           
        }
     
        if(tUpdateList.size() > 0)
        {
            update tUpdateList;
        }
        
    }
  • July 18, 2017
  • Like
  • 0
Hey guys, I am running into an issue with too many SOQL queries when I try a bulk test of my code. The weird part is I run into the issue when I have 25 or more pricebook entries. I'd imagine it is something little.

 
trigger ProductsCreatedonOpp on Opportunity (after insert) {
            
    		//Initiate a list of strings for the SOQL to pull all the products we need
   			List<String> oppsStringList = new List<String>();
    		//Initiate a list that will hold all of the line items we will need to insert
    		List<OpportunityLineitem> lines = new List<OpportunityLineItem>();
    
    		//Fill the oppsStringList with the base quote template we want to filter the SOQL with
    		for (Opportunity opps : Trigger.New){
        		oppsStringList.add(opps.Base_Quote_Tempalte__c);
    		}
    
    		System.debug('1');
    
    		//Build an array with all of the products we want to add to our opportunity
    		List<PriceBookEntry> priceBookList = [SELECT Name,Id,unitPrice FROM PricebookEntry WHERE Quote_Template_Type__c IN:oppsStringList];
    
    		System.debug('2');
    
    		System.debug(priceBookList.size());
    
    		for(PricebookEntry priceBookEntries : priceBookList) {
        		System.debug(priceBookEntries.Id);
    		}
    
     		System.debug('3');
    
    		//Run through each opportunity and then add each product to the lines list to insert
    		for(Opportunity opps: Trigger.new){
    				for (PricebookEntry productsToAdd : priceBookList){
        				lines.add(new OpportunityLineItem(PriceBookEntryID=productsToAdd.Id, OpportunityID=opps.Id,
                	                             		 UnitPrice=productsToAdd.UnitPrice, Quantity=opps.of_Screens_per_Month__c));       	
    				}
       		 	}     
   		 	System.debug(lines);
    		//Insert all of the products into the Opportunities
    		insert lines;
}

 
All,
I'm trying to refactor my trigger code to a batch. How can I execute my class to fire within the batch?

Class
public class Account_RollupProductInterest {
    protected final Account[] accountNewList;
    protected final Account[] accountOldList;
    Set<Id> acctIds = new Set<Id>();
    Decimal RXRsum = 0;
    Decimal A40Actsum = 0;
    Decimal DSTsum = 0;
    Decimal PPsum = 0;
    Decimal ITSum = 0;
    Decimal ActiveRepsSum = 0;
    Decimal NSTickets = 0;

    public Account_RollupProductInterest(Account[] accountOldList, Account[] accountNewList) {
        this.accountNewList = accountNewList;
        this.accountOldList = accountOldList;
    }

    public Account_RollupProductInterest(){
        new Account_RollupProductInterest().executeTableRollup();
    }

    //Update Numbers Table
    public void executeTableRollup(){
        for(Account a : accountNewList){
            if(a.ParentId != null){
                acctIds.add(a.ParentId);
            }
        }

        List<Account> updAcc = new List<Account>();
        List<Account> childAccts = new List<Account>([Select Id, Number_of_NS_RXR_Propects__c,
                                                        Number_of_40_Act_Fund_Prospects__c,
                                                        Number_of_DST_Prospects__c,
                                                        Number_of_Private_Placement_Prospects__c,
                                                        Number_of_Investor_Tickets__c,
                                                        Number_Of_Active_Reps__c,
                                                        Number_of_NorthStar_Tickets__c,
                                                   (Select Id, Number_of_NS_RXR_Propects__c,
                                                        Number_of_40_Act_Fund_Prospects__c,
                                                        Number_of_DST_Prospects__c,
                                                        Number_of_Private_Placement_Prospects__c,
                                                        Number_of_Investor_Tickets__c,
                                                        Number_Of_Active_Reps__c,
                                                        Number_of_NorthStar_Tickets__c
                                                From ChildAccounts)
                                                  From Account
                                                  Where Id in :acctIds]);
        for(Account acc : childAccts){
            for(Account child : acc.ChildAccounts){
                    RXRsum += (child.Number_of_NS_RXR_Propects__c != null ? RXRsum + child.Number_of_NS_RXR_Propects__c : 0);
                    acc.Number_of_NS_RXR_Propects__c = RXRsum;

                    A40Actsum += (child.Number_of_40_Act_Fund_Prospects__c != null ? A40Actsum + child.Number_of_40_Act_Fund_Prospects__c : 0);
                    acc.Number_of_40_Act_Fund_Prospects__c = A40Actsum;

                    DSTsum += (child.Number_of_DST_Prospects__c != null ? DSTsum + child.Number_of_DST_Prospects__c : 0);
                    acc.Number_of_DST_Prospects__c = DSTsum;

                    PPsum += (child.Number_of_Private_Placement_Prospects__c != null ? PPsum + child.Number_of_Private_Placement_Prospects__c : 0);
                    acc.Number_of_Private_Placement_Prospects__c = PPsum;

                    ITSum += (child.Number_of_Investor_Tickets__c != null ? ITSum + child.Number_of_Investor_Tickets__c : 0);
                    acc.Number_of_Investor_Tickets__c = ITSum;

                    ActiveRepsSum += (child.Number_Of_Active_Reps__c != null ? ActiveRepsSum + child.Number_Of_Active_Reps__c : 0);
                    acc.Number_Of_Active_Reps__c = ActiveRepsSum;

                    NSTickets += (child.Number_Of_NorthStar_Tickets__c != null ? NSTickets + child.Number_Of_NorthStar_Tickets__c : 0);
                    acc.Number_Of_NorthStar_Tickets__c = NSTickets;
            }
            
            updAcc.add(acc);
        }

        try {
            update updAcc;
        }
        Catch (Exception e) {
            System.debug('Exception : '+e.getMessage());
        }
    }
}

Batch:
Batch:
global class Contact_RollupProductInterestBatchable implements Database.Batchable<sObject> {
     global Database.QueryLocator start(Database.BatchableContext batchableContext){
	 	        return Database.getQueryLocator('Select Id From Account');

         /**String query = 'Select Id, Number_of_NS_RXR_Propects__c,'
                                 + 'Number_of_40_Act_Fund_Prospects__c,'
                                 + 'Number_of_DST_Prospects__c,'
                                 + 'Number_of_Private_Placement_Prospects__c,'
                                 + 'Number_of_Investor_Tickets__c,'
                                 + 'Number_Of_Active_Reps__c,'
                                 + 'Number_of_NorthStar_Tickets__c,'
                                 + '(Select Id, Number_of_NS_RXR_Propects__c,'
                                             + 'Number_of_40_Act_Fund_Prospects__c,'
                                             + 'Number_of_DST_Prospects__c,'
                                             + 'Number_of_Private_Placement_Prospects__c,'
                                             + 'Number_of_Investor_Tickets__c,'
                                             + 'Number_Of_Active_Reps__c,'
                                             + 'Number_of_NorthStar_Tickets__c'
                                             + 'From ChildAccounts)'
                                  + 'From Account';
         return Database.getQueryLocator(query);**/

    }

    global void execute(Database.BatchableContext batchableContext, Account[] accountNewList) {
        // Execute the rollup. It will auto-update the branch accounts once complete
        for(Account a : accountNewList){
        	a.Number_of_NS_RXR_Propects__c = a.ChildAccounts.Number_of_NS_RXR_Propects__c;
        	a.Number_of_40_Act_Fund_Prospects__c = a.ChildAccounts.Number_of_40_Act_Fund_Prospects__c;
        	a.Number_of_DST_Prospects__c = a.ChildAccounts.Number_of_DST_Prospects__c;
        	a.Number_of_Private_Placement_Prospects__c = a.ChildAccounts.Number_of_Private_Placement_Prospects__c;
        	a.Number_of_Investor_Tickets__c = a.ChildAccounts.Number_of_Investor_Tickets__c;
        	a.Number_Of_Active_Reps__c = a.ChildAccounts.Number_Of_Active_Reps__c;
        	a.Number_of_NorthStar_Tickets__c = a.ChildAccounts.Number_of_NorthStar_Tickets__c;
        }

        update accountNewList
    }

    global void finish(Database.BatchableContext batchableContext) {

    }
}

 
Hi All,

I need a help regarding Custom Settings.In Contact we have fields like Firstname,lastname,Email,City etc.So i will store this specified fields in a custom settings (because in future these fields may be change so storing in custom setting )So whenever only this specified field values are updated in contact then only i need to create a record into another object .If other fields are updated it shouldnot trigger.I am not sure how to compare these field changes through Custom Settings and object Contact.

Anyone can give me some idea to get this scenario done.

Thanks in advance
How to create custom object dynamically?

I have one method in Apex controller which takes two arguement like below -

insertIntoCustomObjectDynamic(customObjectName, Map<String, String> fieldvalues){
//customObjectName can be any customobject name inside the org, its not static or predefined value
//if customObjectName is like MyObject__c then it will insert all the field values into MyObject__c customobject.

}
I'm trying to delete new Lightning Web Component without any luck.
I've tried to find it in Dev Console, but as you know it doesn't support Lightning Web Components yet. Another way I've tried to delete my lwc in VS Code and just deploy source to sandbox, but it still there in my sandbox org and I can see it in Lightning App Builder and when I try to retrieve source I see this error
ERROR: Cannot read property 'fileName' of undefined.

But as mentioned here this should be fixed tomorrow https://github.com/forcedotcom/cli/issues/33

So for now I have it in org but don't have in VS Code.

Thanks!
hi All,
 my batch is given below:-
public class BatchZendeskToSalesforce implements Database.Batchable<sObject>{
     public Database.querylocator start(Database.BatchableContext BC){
          string query;
         
         query = 'SELECT Id, Name,url__c,External_Id__c,'+
             'Group_Id__c,Shared_Tickets__c,'+
             'Shared_Comments__c,phone,Domain_Name__c,Notes__c,'+
             'Payroll_Vault__c,Zendesk_Id__c,Details__c ' +
             'FROM Account ';
         return Database.getQueryLocator(query);
    }
     public void execute(Database.BatchableContext BC, List<Account> Accounts){
        
        Set<Id> accountIds = new Set<Id>();
        for( Account acc : Accounts ){
           accountIds.add( acc.Id );   
        }
        getAccounts();
    }
    
    public static List<Account> getAccounts(){

        HttpRequest req = new HttpRequest();
        req.setMethod( 'GET' );
        String username = 'kevin@sfdcconsultants.com';
        String password = '45j2JpHB^qy*';
        Blob headerValue = Blob.valueOf( username + ':' + password );
        String authorizationHeader = 'BASIC ' + EncodingUtil.base64Encode( headerValue );
        req.setHeader( 'Authorization', authorizationHeader );
        req.setHeader( 'Content-Type', 'application/json' );
        req.setEndpoint( 'https://timerack.zendesk.com/api/v2/organizations.json' );
        Http binding = new Http();
        HttpResponse res = binding.send( req );
        
        Map<String, Object> results = ( Map<String, Object> )JSON.deserializeUntyped( res.getBody() );
        List<Object> lstOrganizations = ( List<Object> )results.get( 'organizations' );
        List<Map<String, Object>> customerAtt = new List< Map< String, Object >>();
        for ( Object customer : lstOrganizations ) {
            Map<String, Object> customerAttributes = ( Map< String, Object >)customer;
            customerAtt.add( customerAttributes );
        }
        List< Account > listAccountToUpsert = new List< Account >();
        for( Map< String, Object> attMap : customerAtt ){
            Account acc = new Account();
            String fullName = String.valueOf( attMap.get( 'name' ));
           /* if( fullName.split(' ').size() > 1 ){
                ct.FirstName = fullName.substring( 0, fullName.indexOf(' ') );
                ct.LastName = fullName.substring( fullName.indexOf(' ') + 1 );
            }else{
                ct.LastName = fullName;
            }*/
            //ct.email = String.valueOf( attMap.get( 'email' ));
            acc.url__c =  String.valueOf( attMap.get( 'url' ));
            acc.External_Id__c = String.valueOf( attMap.get( 'external_id' ));
            acc.Group_Id__c = String.valueOf( attMap.get( 'group_id' ));
            acc.Shared_Tickets__c = Boolean.valueOf( attMap.get( 'shared_tickets' ));
            acc.Shared_Comments__c = Boolean.valueOf( attMap.get( 'shared_comments' ));
            acc.phone = String.valueOf( attMap.get( 'phone' ));
            acc.Domain_Name__c = String.valueOf( attMap.get( 'domain_names' ));
            acc.Notes__c = String.valueOf( attMap.get( 'notes' ));
            acc.Payroll_Vault__c = String.valueOf(attMap.get('payroll_vault'));
            acc.Zendesk_Id__c = String.valueOf( attMap.get( 'id' ));
            acc.Details__c = String.valueOf(attMap.get('details'));
            
            //ct.Zendesk_Parent_Organisation_Id__c = String.valueOf( attMap.get( 'organization_id' ));
            listAccountToUpsert.add(acc);
            /*if(ct.Name == 'testBC'){
                System.assert(false, listAccountToUpsert);
            }*/
        }
        return listAccountToUpsert;
 }
     public void finish(Database.BatchableContext BC){
        
    }
}
when i run the batch its showing me error:- too many callouts
how to solve this error?
Any suggestions?
 
I have a class that will update a field, Last_Changed_Date, on Contacts if certain fields on the Account are changed. This class worked but was touching so many records it timed out. My solution was to pass all the changes that needed to be made to Contact and pass a list to a Batch Method. Unfortunately, since adding the batch method it doesn't seem to be working. Any thoughts would be really appreciated!

Below is the main class
public with sharing class CCIProviderChangeAccountTracking {

    public static void resaveContact(Account oldAcct, Account newAcct) {

        if (oldAcct.Phone != newAcct.Phone ||
                oldAcct.ShippingAddress != newAcct.ShippingAddress ||
                oldAcct.V12C__PR_Practice_Tax_ID_Number__c != newAcct.V12C__PR_Practice_Tax_ID_Number__c ||
                oldAcct.BillingAddress != newAcct.BillingAddress) {
            system.debug('------Conditions Met!!!!!!!!!------');
            List<Contact> toSave = new List <Contact>();
            for (Contact con : [SELECT Id, Last_Changed_Date__c, AccountId FROM Contact WHERE AccountId = :newAcct.Id]) {
                //con.Last_Changed_Date__c = Datetime.NOW();
                toSave.add(con);
            }
            system.debug('jacob-------------' + toSave.size());

            try {
                Id batchInstanceId = Database.executeBatch(new CCIAllegianceUpdates(toSave), 200);
            } catch (exception e) {
                system.debug(e.getMessage());
            }
        }
    }
}

Here is the batch method that is being passed the list toSave.
 
global class CCIAllegianceUpdates implements Database.Batchable<sObject> {

    List<Contact> toSave = new List <Contact>();
    public CCIAllegianceUpdates(List<Contact> toSave) {
        toSave = toSave;
    }

    global Database.QueryLocator start(Database.BatchableContext BC) {
        system.debug('------Starting Batch!!!!!!!!!------');
        return null;
    }
    global void execute(Database.BatchableContext BC, List<Contact> scope) {
           
        
        update toSave;

    }
    global void finish(Database.BatchableContext BC) {
        system.debug('------Finish Batch!!!!!!!!!------');
    }

}

And finally this is where everything is being called
 
public void afterUpdate(SObject oldSo, SObject so) {
          Account oldAcct = (Account) oldSo;
          Account acct = (Account) so;
          CCIProviderChangeAccountTracking.resaveContact(oldAcct,acct);

    }

 
Hi All,

We are using the User-Agent OAuth Authentication Flow so that vendors can insert the data from thier internal/exteranal sites  buy using simple insert rest api endpoint call using javascript/ajax calls. 

we have shared the sample endpoint for authorization like 
https://login.salesforce.com/services/oauth2/authorize?response_type=token&
client_id=3MVG9lKcPoNINVBIPJjdw1J9LLJbP_pqwoJYyuisjQhr_LLurNDv7AgQvDTZwCoZuD
ZrXcPCmBv4o.8ds.5iE&redirect_uri=https%3A%2F%2Fwww.mysite.com%2Fuser_callback.jsp&
state=mystate 
 
so vendors would call the above endpoint and grant authorization like accept/reject pop getting displayed in thier front end screens for first time call,On sucessfully redirection. the screen gets redirect to redirect url mentioned in connected app. 
we have mentioned that redirect url as www.vendordoamin.page/sfdc.jsp. where sfdc.jsp is the page where user submited the date from. so when user authorizes via pop, the sfdc authorization servers should respond back with access token.  
Once the access token is received vendor should store the access through out the request and should use the same to insert the custom lead data via standard rest url generated via workbench. 

If incase the access token is expired , the request should be made to below url to get new token

POST /services/oauth2/token HTTP/1.1
Host: https://test.salesforce.com/
grant_type=refresh_token&client_id=3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0
QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE&client_secret=111111111121111
&refresh_token=your token here

We have used this apporach so that we can share authorize endpoint and code, simple authorization inputs from front end user when submitting data, and then system inserting data to sfdc.
(we want this simple approach so that many other vendor can simple insert our rest api code and can insert data)

Since the vendors are unable to test or help us with sfdc support I am bangging my head to replicate this cors issue in sfdc side. like 


Now for the problems
-- for the first time vendors were able to authorize
-- they got access token, however the second time for refreshing acess tokens they are getting CORS errors and unable to proceed further.
-- how do  i actually replicate the issue ? i had minimum expeirence in java web apps, but developing java based web app like using jsp, 
tomcat and rest webservice is only the way to replicate the cors issue? 
-- there are many sample codes but using maven/jaxb/some other rest api in eclipse /configuring buildpath is all hell for me.
-- Is there any other way to test  User-Agent OAuth Authentication Flow ??
-- if testing only via creation java project etc can anyone share any sample code/ eclipse configurtaion.


** already whitelisted  vendors domain in CORS option in saleforce.
i write code to search a contact ----- wnat to debug this code in developer consol , but not able to do the same 
Public Class ContactSearch{
List <Contact> Con = New List<Contact>();
Public List<Contact> searchForContacts (String A, String B){
Con = [ Select Id , FirstName,LastName from Contact where lastname='A' and MailingPostalCode='B'];
return (Con);}
}
in developer consol i write one apex class and called a method of contact search class but getting error Line: 1, Column: 1
Unexpected token 'Public'.

Public Class NewContactSerach {
    
    ContactSearch Contc = New ContactSearch ();
    Contc.searchForContacts(Deshpande.abcde);
}

plz suggest me how to overcome from this 

I am trying to write a batch job that will take values from one field (if another date field falls in the previous month) and populate a new field on the same object, account. However I am getting the error: Variable does not exist: lastRefreshedDate (it is probably something really simple - not the most confident person in Apex). Thanks

Class

global class BatchCreditSafeDelta implements Database.Batchable<SObject> {
    
    DateTime lastRefreshedDate = System.Today().addMonths(-1);

	public static void runBatch() {
        BatchCreditSafeDelta batch = new BatchCreditSafeDelta();
        Database.executeBatch(batch);
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        return Database.getQueryLocator(
            [SELECT Id, Name, bottomline__creditSafeScore__c, bottomline__creditSafeLastRefreshed__c, last_month_creditSafe_Score__c 
			FROM Account WHERE bottomline__creditSafeLastRefreshed__c = LAST_MONTH ]);
    }

    global void execute(Database.BatchableContext bc, List <Account> scope) {
        List <Account> populateLastMonthScores = new List <Account>();
        for (Account acc: scope) {
            populateLastMonthScores.add(new Account(
                id = acc.id,
                Last_Month_CreditSafe_Score__c = acc.bottomline__creditSafeScore__c));
        }
        update populateLastMonthScores;
    }
    global void finish(Database.BatchableContext bc) {}
}

TestClass

@isTest public class BatchCreditSafeDeltaTest {
    @isTest static void batchTest() {
        
        sObjectFactory f1 = new sObjectFactory();
        Map<Id, Account> Accounts = new Map<Id, Account>();

        for (Integer i=0; i<10; i++) {
            Account a = (Account) f1.get( new Account(
                name = 'Account ' + i,
                bottomline__creditSafeScore__c = i,
                Last_Month_CreditSafe_Score__c = null,
                // change to one month before today
                bottomline__creditSafeLastRefreshed__c = lastRefreshedDate
            ));
            Accounts.put(a.id, a);
        }

        Set<Id> ids = Accounts.keyset();

        Test.startTest();
            BatchCreditSafeDelta.runBatch();
        Test.stopTest();

        Map<Id, Account> Accounts2 = new Map<Id, Account>();
        for (Account a : [SELECT Id, Name, Last_Month_CreditSafe_Score__c, bottomline__creditSafeLastRefreshed__c, bottomline__creditSafeScore__c,
                            creditSafe_Score_delta__c FROM Account WHERE ID IN :ids])

        {
            System.assertEquals( a.Last_Month_CreditSafe_Score__c, a.bottomline__creditSafeScore__c);
            System.assertEquals( a.CreditSafe_Score_Delta__c != null,  a.CreditSafe_Score_Delta__c != null);
        }       
    }
}
Hello - I have a class that adds an account and contact to a new lead - if the account and contact exists. I'm trying to call this from an After Insert trigger. However, when I insert the lead, nothing happens. I'm wondering if it's something to do with the trigger parameter but just not sure. Any help would be greatly appreciated. 

This is the method I'm trying to call from the trigger.  AddExistingAccountAndContactToLead.findExistingAccountContact(Trigger.new);

Here is the trigger: 
trigger MasterLeadTrigger on Lead (
    before insert, after insert, 
    before update, after update, 
    before delete, after delete) {
        
        if (Trigger.isBefore) {
            if (Trigger.isInsert) {
                SetLeadRecordType.leadsToUpdate(Trigger.new); 
                DuplicateLead.potentialDupes(Trigger.new);
                CloseExpiredLeads.closingExpiredLeads(Trigger.new);
            } 
            if (Trigger.isUpdate) {
                
            }
            if (Trigger.isDelete) {
                
            }
            
         if (Trigger.IsAfter) {
             if (Trigger.isInsert) {
                 AddExistingAccountAndContactToLead.findExistingAccountContact(Trigger.new);
                 //AddAccountandContactToLead.addRecodrsToLead(Trigger.New);
                } 
                if (Trigger.isUpdate) {
                    
                }
                if (Trigger.isDelete) {
                }
            }
        }
    }

Here is the class:
public class AddExistingAccountAndContactToLead {
    
    public static void findExistingAccountContact(List<Lead> nonDupe) {
        
        List<String> LastNameStreetAndZipCode = new List<String>();
        List<Account> existingAcctsList = new List<Account>();
        List<Contact> existingCtList = new List<Contact>();
        List<Lead_Submission__c> existingLSList = new List<Lead_Submission__c>();
        
        for(Lead newLead : nonDupe) {
                LastNameStreetAndZipCode.add(newLead.LastNameStreetAndZipCode__c);
        }
        
        System.debug('Addresses in LastNameStreetAndZipCode ' + LastNameStreetAndZipCode);
        
        Map<String, Account> mapOfAccounts = new Map<String, Account>();

        if(LastNameStreetAndZipCode.size() > 0) {
            Try{ 
        List<Account> exsistingAccount = [Select Id, LastNameStreetAndZipCode__c FROM Account
                                          WHERE LastNameStreetAndZipCode__c IN : LastNameStreetAndZipCode];
        
         System.debug('Matching account found ' + exsistingAccount);      
                
            existingAcctsList.addAll(exsistingAccount);
            } catch(Exception e) {
                System.debug('No existing accounts found ' + e);
            }
        }
        
        for(Account acct : existingAcctsList) {
            mapOfAccounts.put(acct.LastNameStreetAndZipCode__c, acct);
        }
        
        Map<String, Contact> mapOfContacts = new Map<String, Contact>();
        
        if(LastNameStreetAndZipCode.size() > 0) {
            Try{ 
        List<Contact> existingContact = [Select Id, LastNameStreetAndZipCode__c FROM Contact
                                         WHERE LastNameStreetAndZipCode__c IN :LastNameStreetAndZipCode];
                
        System.debug('Matching contact found ' + existingContact);        
        
        existingCtList.addAll(existingContact);
                } catch(Exception e) {
                System.debug('No existing contacts found ' + e);
            }
        }
        
        for(Contact ct : existingCtList) {
            mapOfContacts.put(ct.LastNameStreetAndZipCode__c, ct);
        }
        
        Map<String, Lead_Submission__c> mapOfLeadSubmission = new Map<String, Lead_Submission__c>();

        if(LastNameStreetAndZipCode.size() > 0) {
            Try{ 
        List<Lead_Submission__c> exsistingLeadSubmission = [Select Id, LastNameStreetAndZipCode__c FROM Lead_Submission__c
                                          WHERE LastNameStreetAndZipCode__c =: LastNameStreetAndZipCode];
        
         System.debug('Matching lead submission found ' + exsistingLeadSubmission);
                
            existingLSList.addAll(exsistingLeadSubmission);
            } catch(Exception e) {
                System.debug('No existing lead submissions found ' + e);
            }
        }
        
        System.debug('Lead Sbumission added to list ' + existingLSList);
        
        for(lead_submission__c leadSub : existingLSList) {
            mapOfLeadSubmission.put(leadSub.LastNameStreetAndZipCode__c, leadSub);
        }
        
        for(Lead newLead : nonDupe) {
            //if(newLead.Duplicate__c == false) {
                Account retrievedAcctId = mapOfAccounts.get(newLead.LastNameStreetAndZipCode__c);
                Contact retrievedCtId = mapOfContacts.get(newLead.LastNameStreetAndZipCode__c);
                Lead_Submission__c retrievedLsId = mapOfLeadSubmission.get(newLead.LastNameStreetAndZipCode__c);
                //System.debug('retrievedLsId = ' + retrievedLsId.Id);
                try {
                    newLead.Household__c = retrievedAcctId.Id;
                    newLead.Individual_Client__c = retrievedCtId.Id;
                    //newLead.Lead_Submission__c = retrievedLsId.Id;
                } catch(Exception e) {
                System.debug('No household id or contact id found ' + e);
                  }
            //}
        }
    }
}
Hi,
I tried doing this :
request.setHeader('Cache-Control','public,max-age=43200');
but still when I checked response in rest api. I can't see my value at max-age, it's still displaying like this :
Cache-Control: no-cache,must-revalidate,max-age=0,no-store,private

Please help me with this on how to proceed further on the same.

Thanks in advance..!!
Hello,
I am currently using SFDC's Developer Console (because it's on the cloud) but would like to know the opinion of Developers who have worked with (or may have tried) other IDEs for Force.com.
I have come across various alternative IDEs such as:
  1. MavensMate which is not supported any more (Dec-2017) and the owner suggest to look at "Visual Studio Code Extension";
  2. Visual Studio Code Extension;
  3. Welkin Suite (It looks like a paid option but cannot see the price on their website);
  4. Illuminated Cloud (hosted within JetBrains Intellij IDEA); price seem to be 65 USD for 1 or few licenses (and we never know if the vendor will charge new versions)
  5. The traditional Force.com IDE Eclips based (Free but a real pain to install in a Mac);
  6. Any other IDE?
Could you possible let us know your opinion and if you would advise using one or the other? Maybe you could comment on Pros/Cons for each IDE you know?

Thank you very much.
  • December 03, 2017
  • Like
  • 2
Hi Fiends,

                 I am using batch apex for inserting the 100000 records but, the following exception throws while executing the batch. System.LimitException: "Too many DML rows:10001". I have tried giving batch size  as low and maximum but in both the cases the it throws the same exception.

global class InsertionOfOneLakhRecords implements database.Batchable<Sobject>,database.stateful{
   public integer count = 0;
  global database.QueryLocator start(database.BatchableContext bc){
    return database.getQueryLocator('select id, Name FROM Contact');
}
global void execute(database.BatchableContext bc, List<Contact> sobj){
    List<Contact> cons = new List<Contact>();
   for(integer i=0; i<100000; i++){
    Contact c = new Contact(LastName = 'test'+i, Email='test@salesforce.com', Phone = '123456');
    count++;
    cons.add(c);
}
    try{
    Database.SaveResult[] result =database.insert(cons);
 }
    catch(exception e){
     system.debug('Exception:'+e.getMessage());
    }
}
global void finish(database.BatchableContext bc){
 system.debug('total:'+count);   
  }
}

Thanks & Regards
We have had hired outside consultant did the integration for us to upload files to dropbox using dropbox API.
It has been working great for 4 months. all the sudden yesterday afternoon, it stopped working. It returns an error v1_retired, with code 400.
I suspect that the consultant has changed the user credential that has the access to the dropbox folder. the folder is shared to one of their email addresses.

They refused they did that and insist that we did something which we really didn't.
Can anyone help me to figure out? Obviously the consultant is no help.

Thanks!
I'm trying to get debug logs when a non-browser (Twillio) access VF pages implemented on Sites (that are coded to deliver XML).  I'm not getting debug logs.  I did some searching and found release notes from Winter '17 that say for sites guest users, a cookie must be set in order to get debug logs.  That works fineina browser.  I tried setting a cookie the controller constructor (see below) that delivers the page but that didn't work.  Maybe because Twillio isn't sending the cookie back.  And even if that might work, the call that came in would not yet have the cookie so I wouldn't have a debug log.

  I haven't figured out a work around.  I'm wondering if anyone else has.
Cookie debugCookie = ApexPages.currentPage().getCookies().get('debug_logs');
        if (debugCookie == null) {
            debugCookie = new Cookie('debug_logs','debug_logs','.force.com',300,true);
        }
        ApexPages.currentPage().setCookies(new Cookie[]{debugCookie});

 
Hi there ... I'm trying to use the cancelURL parameter and I can't make it work.
 
I have a custom button that takes the user to emailauthor.jsp and specifies a retURL that points to my custom component, which works just fine. What I want to do now is also specify a cancelURL parameter, but when I put it in the URL and click Cancel, it just takes me to the retURL every time.
 
Has anyone done this successfully? Here's my URL:
 
Code:
https://na2.salesforce.com/email/author/emailauthor.jsp—p2_lkid=0014000000FDcPc&rtype=003&p3_lkid=00640000008LyLj&retURL=%2F00640000008LyLj&cancelURL=%2F00640000008Lmev

 
Thanks,
 
Glenn.
  • April 06, 2007
  • Like
  • 0