function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Dman100Dman100 

database savepoint

I'm working with the following trigger that uses a Database savepoint.

 

trigger ServiceDeliveryBeforeInsertBeforeUpdate on Service_Delivery__c (before insert, before update) { Savepoint sp = Database.setSavePoint(); List<Service_Booking__c> bookingsToUpdate = new List<Service_Booking__c>(); try { if (Trigger.isUpdate) { // this is an update trigger; "zero out" all the records being updated List<Service_Delivery__c> tempRecords = new List<Service_Delivery__c>(); for (Service_Delivery__c delv : Trigger.old) { // try to insert a delivery that charges this same number of days if (delv.Days_Charged__c > 0) { // don't execute this logic for negative days Service_Delivery__c tempDelivery = new Service_Delivery__c(); tempDelivery.Days_Charged__c = -1 * delv.Days_Charged__c; // to "zero out" tempDelivery.Services_Engagement__c = delv.Services_Engagement__c; tempDelivery.Start__c = delv.Start__c; tempDelivery.End__c = delv.End__c; tempDelivery.Description__c = delv.Description__c; tempDelivery.Delivery_Type__c = delv.Delivery_Type__c; tempDelivery.Delivery_Sub_type__c = delv.Delivery_Sub_type__c; tempRecords.add(tempDelivery); } } insert tempRecords; } for (Service_Delivery__c delv : Trigger.new) { if (delv.Service_Booking__c != null) { Service_Booking__c bk = [SELECT Delivery_Type__c FROM Service_Booking__c WHERE Id = :delv.Service_Booking__c]; if (delv.Days_Charged__c > 0) { // don't execute this logic for negative charges (which are most likely from this trigger) Services_Engagement__c engagement = [Select Id, Name, Days_Available__c from Services_Engagement__c where Id = :delv.Services_Engagement__c]; if (engagement.Days_Available__c < delv.Days_Charged__c) { delv.adderror('You have attempted to bill ' + delv.Days_Charged__c + ' days against service obligation ' + engagement.Name + ', but only ' + engagement.Days_Available__c + ' days are available'); } else { // everything is fine; proceed with making booking inactive if (delv.Service_Booking__c != null) { Service_Booking__c booking = null; //Find the Service Booking associated with the Service Delivery booking = [SELECT Id, Active__c, Services_Engagement__c FROM Service_Booking__c WHERE Id = :delv.Service_Booking__c]; booking.Active__c = false; bookingsToUpdate.add(booking); } } } } } } finally { Database.rollback(sp); } update bookingsToUpdate; }

 

 

The problem is deliveries are still getting created if the booking is null on the delivery.  The following line checks this condition:

 

if (delv.Service_Booking__c != null)

My expectation is the code would exit this block and go to the finally statement and rollback (not create the delivery).  But, the delivery is still getting created.

 

Why?

 

Thanks for any help.