Invocablemethod не создает записи в классе Apex

Я новичок в написании Apex, но, похоже, все работает плавно отдельно в исполняемом окне, когда я разделяю класс, который создал ниже, но когда я запускаю его из потока, кажется, что он не создает записи вообще. Кажется, что методы удаления записей работают, но ни один из методов создания записей не работает.

Любая помощь или руководство приветствуются!

public without sharing class CreateQuoteProducts_NewOrRenewal{
    @invocableMethod
    public static void DeleteQuoteProductsMRF(List<Id> OrderId){
        List<Quote_Product_MRF__c> QuoteProductsMRF = [SELECT id from Quote_Product_MRF__c WHERE Order__c in : OrderId];
        if(!QuoteProductsMRF.isEmpty()){
            delete QuoteProductsMRF;
        }
    }
    public static void DeleteQuoteProductsOTF(List<Id> OrderId){
        List<Quote_Product__c> QuoteProductsOTF = [SELECT id from Quote_Product__c WHERE Order__c in : OrderId];
        if(!QuoteProductsOTF.isEmpty()){
            delete QuoteProductsOTF;
        }
    }

/* ---START--- Create Quote Products MRF ---START--- */

    public static void CreateQuoteProductsMRF(List<Id> OrderId){
        List<AggregateResult> nrqpmrfOP = [
        SELECT 

        count(Id) ct,
        Order__c ord,
        sum(Total_Monthly_Recurring_Fees__c) stmr,
        sum(Monthly_Recurring_Fees__c) mr,
        sum(Discount_MRF__c) dmr

        FROM Order_Location_Package__c 
        WHERE Order__c in : OrderId AND Package__r.Monthly_Recurring_Price__c != null
        GROUP BY Package__c, Order__c];


        List<Quote_Product_MRF__c> nrqpmrf = New List<Quote_Product_MRF__c>();
        for(AggregateResult ar : nrqpmrfOP){


        Quote_Product_MRF__c QuoteProductMRF = New Quote_Product_MRF__c();
        QuoteProductMRF.Quantity__c = (Decimal)ar.get('ct');
        QuoteProductMRF.Order__c = (String)ar.get('ord');
        QuoteProductMRF.Total_Monthly_Recurring_Fees__c = (Decimal)ar.get('stmr');
        QuoteProductMRF.Monthly_Recurring_Fees__c = (Decimal)ar.get('mr');
        QuoteProductMRF.Discount_MRF__c = (Decimal)ar.get('dmr');
        QuoteProductMRF.Product_Type__c = 'Package';

        nrqpmrf.add(QuoteProductMRF);
        } 

        Insert nrqpmrf;
    }
/* ---END--- Create Quote Products MRF ---END--- */

/* ---START--- Create Quote Products OTF ---START--- */

    public static void CreateQuoteProductsOTF(List<Id> OrderId){
        List<AggregateResult> nrqpmrfOP = [
        SELECT 

        count(Id) ct,
        Order__c ord,
        sum(Total_One_Time_Fees__c) stmr,
        sum(One_Time_Fees__c) mr,
        sum(Discount_OTF__c) dmr

        FROM Order_Location_Package__c 
        WHERE Order__c in : OrderId AND Package__r.One_Time_Price__c != null
        GROUP BY Package__c, Order__c];


        List<Quote_Product__c> nrqpotf = New List<Quote_Product__c>();
        for(AggregateResult ar : nrqpmrfOP){


        Quote_Product__c QuoteProductOTF = New Quote_Product__c();
        QuoteProductOTF.Quantity__c = (Decimal)ar.get('ct');
        QuoteProductOTF.Order__c = (String)ar.get('ord');
        QuoteProductOTF.Total_One_Time_Fees__c = (Decimal)ar.get('stmr');
        QuoteProductOTF.One_Time_Fees__c = (Decimal)ar.get('mr');
        QuoteProductOTF.Discount_OTF__c = (Decimal)ar.get('dmr');
        QuoteProductOTF.Product_Type__c = 'Package';

        nrqpotf.add(QuoteProductOTF);
        } 

        Insert nrqpotf;
    }
/* ---END--- Create Quote Products ORD ---END--- */

}

Тестовый класс ниже

@isTest
private class CreateQuoteProducts_NewOrRenewalTest {

    private static testMethod void doTest() {
        
        Account testAcc  = new Account ();          
                testAcc.Name = 'Test Account';
                testAcc.Primary_Vertical__c = 'Multifamily Housing';
                testAcc.Total_Locations_Owned_Managed__c = 1;
                
                insert testAcc;


        Opportunity testOpp  = new Opportunity ();
                testOpp.Name = 'Test Opportunity';
                testOpp.AccountId = testAcc.Id;
                testOpp.Opportunity_Source__c = 'Sales Generated';
                testOpp.Type = 'New';
                testOpp.StageName = 'Contract';
                testOpp.Number_of_locations_for_opportunity__c = 1;
                testOpp.Amount = 0;
                testOpp.Implementation__c = 0;
                testOpp.CloseDate = System.today() + 5;
                testOpp.Deal_Confidence__c = 100;
                
                insert testOpp;

        Package__c testPackage  = new Package__c ();
                testPackage.Name = 'Test Package';
                testPackage.Package_Type__c = 'Website Package';
                testPackage.Status__c = 'Active';
                testPackage.One_Time_Price__c = String.ValueOf(200);
                testPackage.Monthly_Recurring_Price__c = String.ValueOf(100);
                
                insert testPackage;


        Order_Sheet__c testOrder  = new Order_Sheet__c ();
                testOrder.Opportunity__c = testOpp.id;
                
                insert testOrder;


        Order_New_Location__c testOrderLocation  = new Order_New_Location__c ();
                testOrderLocation.Order_Sheet__c = testOrder.id;
                testOrderLocation.Name = 'Test Location';
                
                insert testOrderLocation;


        Order_Location_Package__c testOrderPackage  = new Order_Location_Package__c ();
                testOrderPackage.Order__c = testOrder.Id;
                testOrderPackage.New_Location_Name__c = testOrderLocation.Id;
                testOrderPackage.Package__c = testPackage.Id;
                
                insert testOrderPackage;


/* --- Delete Quote Product MRF Test --- */

        Test.startTest();
        /* --- Create Quote Product MRF--- */
        Quote_Product_MRF__c testQPMRF  = new Quote_Product_MRF__c ();
                testQPMRF.Order__c = testOrder.id;
                
                insert testQPMRF;

        /* --- Run Delete Method--- */
        CreateQuoteProducts_NewOrRenewal.DeleteQuoteProductsMRF(new List<Id>{testOrder.id});
        
        /* --- Query for QP OTF--- */
        list<Quote_Product_MRF__c>queriedQPMRF = [Select Id FROM Quote_Product_MRF__c WHERE Order__c = :testOrder.id];
        
        /* --- Checks for 0 records --- */
        system.assertEquals(0, queriedQPMRF.size());



/* --- Delete Quote Product OTF Test --- */

        /* --- Create Quote Product OTF--- */
        Quote_Product__c testQPOTF  = new Quote_Product__c ();
                testQPOTF.Order__c = testOrder.id;
                
                insert testQPOTF;

        /* --- Run Delete Method--- */
        CreateQuoteProducts_NewOrRenewal.DeleteQuoteProductsOTF(new List<Id>{testOrder.id});
        
        /* --- Query for QP OTF--- */
        list<Quote_Product__c>queriedQPOTF = [Select Id FROM Quote_Product__c WHERE Order__c = :testOrder.id];
        
        /* --- Checks for 0 records --- */
        system.assertEquals(0, queriedQPOTF.size());


 /* --- Create Quote Product MRF Test --- */


        /* --- Run Create Method--- */
        CreateQuoteProducts_NewOrRenewal.CreateQuoteProductsMRF(new List<Id>{testOrder.id});
        
        /* --- Query for QP OTF--- */
        list<Quote_Product_MRF__c>queriedQPMRFCreated = [Select Id FROM Quote_Product_MRF__c WHERE Order__c = :testOrder.id];
        
        /* --- Checks for 1 record --- */
        system.assertEquals(1, queriedQPMRFCreated.size());



 /* --- Create Quote Product OTF Test --- */


        /* --- Run Create Method--- */
        CreateQuoteProducts_NewOrRenewal.CreateQuoteProductsOTF(new List<Id>{testOrder.id});
        
        /* --- Query for QP OTF--- */
        list<Quote_Product__c>queriedQPOTFCreated = [Select Id FROM Quote_Product__c WHERE Order__c = :testOrder.id];
        
        /* --- Checks for 1 record --- */
        system.assertEquals(1, queriedQPOTFCreated.size());

        Test.stopTest();


    }
}

Как упоминалось выше, если я запускаю нижнюю вершину в исполняемом окне и заменяю идентификатор на фактический идентификатор заказа, он успешно создает записи, но не тогда, когда я запускаю полный класс из потока.

    List<AggregateResult> nrqpmrfOP = [
    SELECT 

    count(Id) ct,
    Order__c ord,
    sum(Total_Monthly_Recurring_Fees__c) stmr,
    sum(Monthly_Recurring_Fees__c) mr,
    sum(Discount_MRF__c) dmr

    FROM Order_Location_Package__c 
    WHERE Order__c in : OrderId AND Package__r.Monthly_Recurring_Price__c != null
    GROUP BY Package__c, Order__c];


    List<Quote_Product_MRF__c> nrqpmrf = New List<Quote_Product_MRF__c>();
    for(AggregateResult ar : nrqpmrfOP){


    Quote_Product_MRF__c QuoteProductMRF = New Quote_Product_MRF__c();
    QuoteProductMRF.Quantity__c = (Decimal)ar.get('ct');
    QuoteProductMRF.Order__c = (String)ar.get('ord');
    QuoteProductMRF.Total_Monthly_Recurring_Fees__c = (Decimal)ar.get('stmr');
    QuoteProductMRF.Monthly_Recurring_Fees__c = (Decimal)ar.get('mr');
    QuoteProductMRF.Discount_MRF__c = (Decimal)ar.get('dmr');
    QuoteProductMRF.Product_Type__c = 'Package';

    nrqpmrf.add(QuoteProductMRF);
    } 

    Insert nrqpmrf;

person Scott    schedule 11.09.2020    source источник
comment
Не могли бы вы рассказать нам, каковы настройки совместного использования Order_Location_Package__c ? Вы должны указать, запускается ли ваш класс в with sharing или without sharing, чтобы также избежать путаницы.   -  person Bartheleway    schedule 11.09.2020
comment
Спасибо, Бартелуэй! Сделал обновление выше - должно быть without sharing   -  person Scott    schedule 11.09.2020
comment
Как указано в документации (developer.salesforce.com /docs/atlas.en-us.apexcode.meta/), для каждого класса может быть только 1 InvocableMethod. Это означает, что ваш поток вызывает только первый метод удаления, а не остальные. Если вам нужно вызвать каждый метод, вам нужно создать класс для каждого. Может быть, поможет скриншот потока.   -  person Bartheleway    schedule 11.09.2020
comment
Ах! В этом есть смысл, спасибо, что указали на это. Я разделю их на разные классы. Цените вашу помощь, Бартелуэй!   -  person Scott    schedule 11.09.2020


Ответы (1)


Как указано в документации (developer.salesforce.com/docs/atlas.en-us.apexcode.meta/…), для каждого класса может быть только 1 InvocableMethod. Это означает, что ваш поток вызывает только первый метод удаления, а не остальные. Если вам нужно вызвать каждый метод, вам нужно создать класс для каждого. Может быть, поможет скриншот потока. - Бартелуэй

person Scott    schedule 11.09.2020