Answers - Salesforce Trailblazer Community
Trailblazer Community
Ask Search:
Alex FischerAlex Fischer 
I'm continuously getting this error when running a dataflow, I've repeated the steps in Trailhead several times and I'm sure I'm following the steps to a T. 

Any advice would be greatly appreciated!
Best Answer chosen by Alex Fischer
Rahul DeshmaneRahul Deshmane
Hi Alex,

Ensure that the specified object is included in Data Sync and that Data Sync has run successfully.
 
Check Data Sync Contents
1. In Data Manager, access the Connect page.
2. Ensure the object exists in the Connected Datasets list.
 
Run Data Sync
1. After confirming the object exists, click Run Data Sync.
2. Confirm that Data Sync completes successfully.
 
Retry Dataflow
After Data Sync (including the specified object) has completed, manually run the Dataflow

Thanks,
RD
Brad HoldenBrad Holden 
Ok I am sorry for being a complete newbie... I have spent the last year grappling with some very minor Salesforce development (on a part-time basis) for a small non-profit. I have learned a lot, but still have only placed a very tiny scratch on the surface! 
So now our Self-Signed Certificate is apparently expiring and I have NO IDEA what that means. Any googling of this quickly gets into going-over-my-head territory. Can someone please explain what I have to do and what is in danger of happening if I don't do it? Here's the message:

You have one or more certificates in your Salesforce org Tin Roof Global 00D6100000084nr that will expire soon. Review the list below and visit Certificate and Key Management from Setup to make an update.

I have gone to Certificate and Key Management and have downloaded the .crt file but am really unsure what I am supposed to do with it!

Thanks in adavance
Best Answer chosen by Brad Holden
LBK MuthukrishnanLBK Muthukrishnan
Hey Brad,

There are few places where a sefl-signed certificate could be used.

1. Identify Provider - If you are using SFDC as IDP for Single Sign On. You can find it under Setup >> Administer >> Security Controls >> Identity Provider.

2. Single Sign-On Settings - If you are using SFDC as Consumer for Single Sign On. You can find it under Setup >> Administer >> Security Controls >> Single Sign-On Settings.

If your certificate is used in one of the above places, it is quite intuitive to edit this screen and replace the certificate.

3. Installed Packages / Connected Apps.
Some of the third party apps could use your Self-Signed Certificates (Environment Hub is an example).
You can look at them in Setup >> Build >> Installed Packages
I suggest you go through them one at time and find out if they use your certificate.

Connected Apps will be same procedure as above. But you will find the connected apps under Setup >> Manage Apps >> Connected Apps.

Hope this helps.
 
Arpita BoseArpita Bose 
Hi
Can anyone please explain the use of VLOOKUP() function in salesforce with a good example, other than the common ZIP_CODE_c ?
As I am new to salesforce, this function is very confusing for me.

Thanks
Best Answer chosen by Moderator (salesforce.com) 
Deepak AnandDeepak Anand
Hey Arpita,

Forget about the Zip Code example. Lets take an another one for now.

Suppose that you are creating Employee(a custom object) records in the SF org. Now since Employees are very important records, you do not want the users to create duplicate Employee again and again. For example, say one User already created an Employee Record with name - Arpita Bose. Now, an another User who does not know about this tries to create an another Employee record with the same name - Arpita Bose. and hence there is a potential duplication. This should not be allowed. 

So you have two options now:
  1. Add a Validation Rule on the Employee which checks whether there are any existing Employee records with the same name if so stop the User from saving it. Here comes the role of VLOOKUP.
  2. Create an Apex Trigger(before Insert, before Update) which runs a SOQL query to get all the Employee records in the Org with same name as of the one thats getting created now. If the number of records is 1 then stop the User from creating the Employee using an addError method. This will require considerable development effort.
Now, since we are interested in VLOOKUP lets see as of how we can do the same. Create a Validation Rule as below:

(4) Name = VLOOKUP(
(1) $ObjectType.Employee__c.Fields.Name ,  
(2) $ObjectType.Employee__c.Fields.Name ,  
(3) Name)
 

Now, our basic requirement is to check if an another Employee with the same Name exists or not. So its obvious we are looking into the Name field. The logic is quite simple compare the Name (4) on the Current Record and the Name on that Employee record that matched with the same Name as of the one that we are creating now. Hence we use the equality operator (=). 

Lets look into the VLOOKUP side. You could express the VLOOKUP formula as below: "Look into the Name(2) field on all the Employee Records and return value in it's Name (1) field if the it happens to be same as the Name (3) on the Current Record." 

The SFDC Document define VLOOKUP as follows:

VLOOKUP(field_to_return, field_on_lookup_object, lookup_value)
 
Searches an object for a record where the specified field matches the specified lookup_value. If a match is found, returns another specified field value.

Points to Remember:
  1. VLOOKUP only available on Custom Objects. Vote for this idea: https://success.salesforce.com/ideaView?id=08730000000BqPs
  2. VLOOKUP only available in Validation Rules.
  3. VLOOKUP can only be done on the Name fields.
  4. The field_to_return must be an auto number, roll-up summary, lookup relationship, master-detail relationship, checkbox, date, date/time, email, number, percent, phone, picklist, text, text area, or URL field type.
  5. The field_on_lookup_object must be the Record Name field on a custom object.
  6. The field_on_lookup_object and lookup_value must be the same data type.

Hope this helps!

Best Wishes,
Deepak
 




Sara ConnorSara Connor 
Hello,

I am working on the challenge "Get Hands-On with Group Permission Sets" for "Administrator Certification Maintenance (Spring '20)"

Here is the challenge: 

Bundle the permissions for your Sales Ops Team.
Create a permission set for Cases
Permission Set Name: Case Read Only
Case Object Permission: Read Only
Fields (Read Only):
Account Name
Case Reason
Description
Create a permission set for Leads
Permission Set Name: Manage Leads
Lead Object Permission: Edit
App Permissions:
Convert Leads
Transfer Leads
Create a permission set group: Sales Ops
Group the following permission sets:
Case Read Only
Manage Leads

It's an easy challenge; however, I am getting the error message over and over even after I deleted it and recreataed. I also tried created it in a different playgraond. I believe there is a bug and setup incorrect at the back end. Do anyone have the same issue? How could I get this fix? 

"Challenge not yet complete in My Trailhead Playground 32
We can't find a permission set named Case Read Only."

Attached my screen page here.
User-added image
User-added image
Best Answer chosen by Bhavin (salesforce.com) 
Hesham AlbordiniHesham Albordini
First, you need to create a new trailhead playground to pass. Don't waste your time by using a playground built before the Spring 20 release.  Will not work.  Create a new one. 

Get Hands-On with Group Permission Sets.

Quick find box 
  • permission set ==>New ==>Label:Case Read Only ==> Save
  • Object Settings==>click on Cases==>Edit==>ObjectPermissions:check Readonly
  • Field Permissions: Account Name,Case Reason,Description ==> ckeck readonly

Quick find box
  • permission set ==> New ==> Label:Manage Leads--Save
  • Object Settings=>click on Leads=> Edit ==>ObjectPermissions:check Edit ==> save
  • App Permissions ==>Edit ==>sales ==>Convert leads,Transfer leads ==>Save

Quick find box
  • Permission Set Groups ==>New Permission Set Group ==>Sales Ops
  • Permission Sets in Group ==> Add Permission Set ==>Case Read Only,Manage Leads ==>add ==>done
Janine VermeulenJanine Vermeulen 
Hi everybody!
 
I may have a very simple question. We are a small organisation, but we want to use Salesforce and Pardot more and more. Now I've asked my co-workers to complete some trails from Trailhead. How can I see which they have completed en how many points they have? Is there a admin for Trailhead where I can follow their progress?
 
Thanks in advance!
Best Answer chosen by Janine Vermeulen
Narender SinghNarender Singh
Hi Janine!,
One way, as Naveen suggested is to check their profiles.
But if your co-workers, are a part of a same org. Then you should definitely try Trail Tracker is an app, especially designed for this purpose provided by Salesforce.
https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000EFpAtUAL
 
Carlos BCarlos B 
Hi,

I am trying to exclude a picklist value of RP.Referral Partner Type = "Investment Firm - VC" in this action group in a process builder.

Keeps saying I am missing a ) when I try to add a parenthesis it gives me the same error. What am I doing wrong?User-added image
Best Answer chosen by Carlos B
Steve MolisSteve Molis
Try something like this 
 
AND(
ISNEW(),
NOT(ISBLANK([Lead].FieldName)),
TEXT([Lead].PicklistField) <> "Investment Firm - VC"
)

 
Shannon MooneyShannon Mooney 
I know that Salesforce has a history of haphazardly adding partially thought-out functionality, but I'm having trouble figuring out how they expect us to use these Consent objects.  I understand how the objects are connected and their basic usage.  What I don't get is implementation: once I've configured Data Use Legal Bases and Data Use Purposes, and I've added Contact Point Type Consent records linked to Individuals, how am I supposed to see that data?

There are no report types, and I can't create any with those objects.  I can't add any related lists to Individuals despite the existence of a link between Individuals and Contact Point Type Consents.  All I've got is views.  

I feel like I'm missing something.  I know that I could probably code a page that would display these, but why are these objects lacking the basic functionality that I could get by just creating similar objects myself?  Would I be better off just doing that?
Best Answer chosen by Shannon Mooney
Guy KeshetGuy Keshet
I agree Shannon, adding the individual object does very little to answer the many requirements of GDPR, and you will have to build the fucntionlity yourself - that's what I did for several customers
At minimum, You'll need to custom build:
- collection/validation of consent during customer interactions
- regular checks for consent for customers who've not been in touch
- syncing consent to your marketing channels
- define and impement a data retntion policy, including annonisation of PII and deletion of data
 
Ruth KunakhovichRuth Kunakhovich 
We have web-to-lead set up. We have lead assignment rules, and the owner gets an email notification. When the owner goes to assign this lead to their sales team, they tick the "Send Notification Email" box, and nothing happens. I've checked workflow rules, verification rules, email settings and I am at my wit's end trying to figure this out. Anyone have a similar experience?
Best Answer chosen by Ruth Kunakhovich
Ahilesh RagavanAhilesh Ragavan
Hello Ruth,
This is a very common issue which most users have faced. Salesforce has fixed it and it has always recurred again.

I would recommend you to Create a simple workflow rule and add an email alert to it. This should fix the problem and you need not rely on the "Send Notification Email" checkbox.

Workflow Criteria:
ISCHANGED(OwnedID)

Try to install this critical update,as it mentions it fixes the problem:

Stop Automated Field Updates from Suppressing Email Notifications (Critical Update)
https://releasenotes.docs.salesforce.com/en-us/summer17/release-notes/rn_forcecom_process_emails.htm
Steve MolisSteve Molis 
User-added image

Opportunity History Reports are f*cking awesome, they allow you to see the complete lifecycle of the Opportunity tracking changes to the "core" Opportunity Metrics: Amount, Stage, Close Date, Probability%, Forecast Category. And unlike Field History Reports they're available right out of the box and immediately have access to historical data from "Day 1" of your SFDC org.  In other words: they work retroactively.  They also have more robust Field Filtering, and access to Cross-Filters (they also don't look like they fell out of the top of the Ugly Tree and hit every branch on the way down).
 
However Opportunity History Reports do have an Achilles’ Heel:  You can’t easily see or filter by the current Stage, Amount, Probability%, Close Date, Forecast Category.  But you can do this (and whole lot more!) just by adding a few simple Formula Fields to the Opportunity Object.  Now some folks are probably saying: 

“I don’t want to add more formula fields, I don’t want my Opportunity to look like a Race Car at the Daytona 500!”. 

Here’s the thing; you don’t need to add the new fields to the Opportunity Page Layout, you just need to give the Users/Profiles “Read” access to the Data in the fields.  So you can keep your precious Opportunity Page layouts as pure as the driven snow in an Ansel Adams landscape.
 
Anyway, it's just an idea that I came up with.  I’m like Leonardo DaVinci, my mind is full of ideas...  although most of them are about as useless as a Wooden Helicopter powered by ropes and pulleys. 
 
And now without further ado here are the fields:
 
Current Stage
Datatype = Formula
Result = Text
Formula = TEXT(StageName)
 
Current Close Date
Datatype = Formula
Result = Date
Formula = CloseDate
 
Current Probability%
Datatype = Formula
Result = Percent 0 decimals
Formula = Probability
 
Current Amount
Datatype = Formula
Result = Currency
Formula = Amount
 
Current Forecast Category
Datatype = Formula
Result = Text
Formula = TEXT(ForecastCategoryName)  

User-added image
Best Answer chosen by Miglena (Salesforce.com) 
Steve MolisSteve Molis
Hi Nate,
If you need a report that shows the current Stage, Close Date, $Amount, Probability% and the historical changes to those fields in 1 Report.    

For eaxmple:  Yuo need a Report of all Opportunities that are currently in the Negotiation/Review Stage with the complete History of Stages, $Amount, Probability, Close Date, etc.  

With a standard Opportunity History Report if you Filter the Report by "To Stage" [equals] Negotiation/Review you'll get any Opportunity that was ever in the Negotiation/Review stage regardless of what Stage they are currently in. 
Emilien GuichardEmilien Guichard 
Hello,

I am trying to complete the third step of the Data Integration Specialist superbadge by performing an authenticated REST callout using a Name Credential.

I have found in the documentation the following :
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:My_Named_Credential/some_path');
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
What does "some_path" represents ?
How do I pass my JSON payload with this code ?

Also when performing the http.send(req), the following error is returned :
FLOW_ELEMENT_ERROR An Apex error occurred: System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
Could you please help me move forward with this ?

Thanks a lot.



 
Best Answer chosen by Emilien Guichard
Ashish KeshariAshish Keshari
Hi Emilien, 
Not sure if this is still needed - I completed successfully and below is my code.
ProjectCalloutService
public class ProjectCalloutService {
    
    //method to be invoked by ProcessBuilder apex
    @InvocableMethod
    public static void postOpportunityToPMS(List<Id> oppoIds){
        Opportunity opportunity = [SELECT Id,Name,Account.Name,CloseDate,Amount FROM Opportunity WHERE Id = :oppoIds[0]];
        String serviceToken = ServiceTokens__c.getValues('ProjectServiceToken').Token__c;
        String jsonInput = '{\n' +
        	' "opportunityId" : "'+opportunity.Id+'",\n'+
        	' "opportunityName" : "'+opportunity.Name+'",\n'+
        	' "accountName" : "'+opportunity.Account.Name+'",\n'+
        	' "closeDate" : "'+String.ValueOf(opportunity.CloseDate).mid(0,10)+'",\n'+   
            ' "amoun" : "'+opportunity.Amount+'"\n}';
		System.enqueueJob(new QueueablePMSCall(serviceToken, jsonInput, opportunity.Id));
    }
    
    // future method to make apex callout
    @Future(callout=true)
    private static void postToPMS(String serviceToken, String jsonInput, Id oppoId) {
            HTTPRequest req = new HTTPRequest();
            req.setEndPoint('callout:ProjectService');
            req.setMethod('POST');
            req.setHeader('token',serviceToken);
            req.setHeader('Content-Type', 'application/json;charset=UTF-8');        
            req.setBody(jsonInput);
            HTTP http = new HTTP();
            HTTPResponse res = http.send(req);
            Opportunity opp = new Opportunity(Id=oppoId);
        	if(res.getStatusCode() != 201){
                opp.StageName = 'Resubmit Project';
                System.debug('Failure: ' + res.getStatusCode() + ' ' + res.getStatus());
            } else {
                opp.StageName = 'Submitted Project';                
                System.debug('Success: ' + res.getStatus());
            }
            update opp;
    }
    
    //queueable class to enque the post request
    class QueueablePMSCall implements System.Queueable, Database.AllowsCallouts {
        private String serviceToken;
        private String jsonInput;
        private String Id;
        public QueueablePMSCall(String serviceToken, String jsonInput, Id oppoId){
            this.serviceToken = serviceToken;
            this.jsonInput = jsonInput;
            this.Id = oppoId;
        }
        public void execute(QueueableContext context) {
            postToPMS(serviceToken, jsonInput, Id);
        }
    }
    
}

ProjectCalloutServiceMock
@isTest
global class ProjectCalloutServiceMock implements HttpCalloutMock {
   	//Implement http mock callout here
   	global HTTPResponse respond(HTTPRequest request) {
	// Create a fake response
        HttpResponse response = new HttpResponse();
        response.setStatusCode(201);
        response.setStatus('Created');
        return response; 
	}
}

ProjectCalloutServiceMockFailure
@isTest
global class ProjectCalloutServiceMockFailure implements HttpCalloutMock {
   	//Implement http mock callout here
   	global HTTPResponse respond(HTTPRequest request) {
	// Create a fake response
        HttpResponse response = new HttpResponse();
        response.setStatusCode(400);
        response.setStatus('Bad Request');
        return response; 
	}
}
ProjectCalloutServiceTest
@isTest
private class ProjectCalloutServiceTest {
    //Implement mock callout tests here

    @testSetup static void testSetupdata(){
		//create the opportunity record
        Opportunity opp1 = new Opportunity();
        opp1.Name = 'ABC Corp1';
        opp1.Type = 'New Project';
        opp1.Amount = 1000;
        opp1.CloseDate = Date.today();
        opp1.StageName = 'Submitted Project';
        insert opp1;
		//create the opportunity record
        Opportunity opp2 = new Opportunity();
        opp2.Name = 'ABC Corp2';
        opp2.Type = 'New Project';
        opp2.Amount = 1000;
        opp2.CloseDate = Date.today();
        opp2.StageName = 'Resubmit Project';
        insert opp2;
        //create the Custom Settings
        ServiceTokens__c servToken = new ServiceTokens__c();
        servToken.Name = 'ProjectServiceToken';
        servToken.Token__c = 'shgglskgblsbglbdsflgbldmfbgldb';
        insert servToken;
    }
    
    @isTest static void testPostCalloutSuccess() {
        Opportunity opp = [Select Id, Name FROM Opportunity WHERE Name = 'ABC Corp1' Limit 1];
        List<Id> oppList = new List<Id>();
        oppList.add(opp.Id);
        System.assertEquals('ABC Corp1', opp.Name);
        System.assertEquals(1,oppList.size());
        Test.startTest();
        // Set mock callout class 
        Test.setMock(HttpCalloutMock.class, new ProjectCalloutServiceMock()); 
        // This causes a fake response to be sent
        // from the class that implements HttpCalloutMock. 
        ProjectCalloutService.postOpportunityToPMS(oppList);
        // Verify that the response received contains fake values
        Test.stopTest();    
        opp = [select StageName from Opportunity where id =: opp.Id];
        System.assertEquals('Submitted Project',opp.StageName);
    }
    
    @isTest static void testPostCalloutFailure() {
        Opportunity opp = [Select Id, Name FROM Opportunity WHERE Name = 'ABC Corp2' Limit 1];
        List<Id> oppList = new List<Id>();
        oppList.add(opp.Id);
        System.assertEquals('ABC Corp2', opp.Name);
        System.assertEquals(1,oppList.size());
        Test.startTest();
        // Set mock callout class 
        Test.setMock(HttpCalloutMock.class, new ProjectCalloutServiceMockFailure()); 
        // This causes a fake response to be sent
        // from the class that implements HttpCalloutMock. 
        ProjectCalloutService.postOpportunityToPMS(oppList);
        // Verify that the response received contains fake values
        Test.stopTest();        
        opp = [select StageName from Opportunity where id =: opp.Id];
        System.assertEquals('Resubmit Project',opp.StageName);
    }
    
}