Screen Flows | Clone Records using Flows
In this blog I am going to demonstrate how to Clone Records with all the field values using Screen Flows and Auto-Launched Flows in Salesforce. By the end you will get good idea about some of the features of Screen flows, Auto-launched flows and how to join flows.
Main takeaways from this Article:
1. How to Clone Records using Flows?
Note in the video, how I found/selected the Opportunities to show in Radio Button options. I used the criteria-" Select those opportunities where AccountId of opportunities equals the AccountId of the record which we will get from Page in the variable recordId.Id.
2nd Flow Design: Autolaunched Flow
OppDate Input Variable
OppName Input Variable
OppStage Input Variable:
2.Assignment Element: From Parent Flow we will be getting 4 input values into these 4 variables.
Phewwwwww!!! We are done. Just activate this and use this flow on Record Page of Account.
While adding the Flow to Lightning Record Page, just check the checkbox where it shows the variable we created to Get the Account Data from the page by the name recordId in the starting. Remember?
Demo Video Below:
So we have seen how to Use Screen Flows to Clone Records and how to use Autolaunched Flows.
If you like this please do Share! #Learn and Share!
Main takeaways from this Article:
1. How to Clone Records using Flows?
2. How to use Subflow?
3. How to use Radio Buttons in Screen Flow to show object records as picklist/select options. Also, how to use Picklist with picklist options directly from an object's Picklist values in Screen Flow.
4. How to get RecordId and Record details directly from Lightning Record Page into Flows?
Sample Use Case:
On Account Record Page in Lightning, we need a custom Screen from where a user can quickly create new opportunity by cloning any existing opportunity for that Account. All the fields from the previous Opportunity have to be cloned except for Name,Stage,Close Date which user should be able to provide values for while Cloning.
Also, user should be able to select which Opportunity to clone.
Solution:
To achieve this, we will need to use two Flows.
Firstly, we will Use a Screen Flow to capture user data including which opportunity to clone and also the values of fields mentioned in use case.
Secondly, we will fire a Subflow from the Screen Flow which will just clone this opportunity record.
Note: We will put this Screen Flow on a Lightning Record Page of Account Record.
The overall design will work like as described below (This is the most important piece of this article) :
1st Screen Flow will have a screen where we will provide users with all the Opportunity records(name) for a particular Account Record as Radio Button Options.
User will select one of the opportunity records (using Radio Button) which needs to be cloned.
This opportunity record selected by the user will be stored in a variable with all the field values including Id.
After this we will provide the user with another screen. In this screen user will Input three values. These will be Name,Close Date and Stage.
So by now we have the full opportunity record selected by user to clone and three input values.
We will pass these four values (Opportunity Record selected by user with all fields values, New Name Close Date and New Stage Value to a subflow which will just use these values to create a new opportunity for the same Account.
Basically, the idea is we will replace the values of Name,Close Date and Stage in the opportunity record that user selected. Also, we will make this selected record's Id as blank and then create it as a new opportunity record. All other fields will be cloned as we are not changing/overriding their values.
Why we are using Subflow when we can do this in Same flow?
At first,I also tried to do so. But Basically it doesn't work like that. If we have to use all the values(fields) from a record variable to clone (Opportunity record in our case), we need to pass it to another flow because in the same flow it only copies the value we change not the other ones. This is a thing to remember and note.
Now before moving forward please ensure you understood what we are trying to do so that below stuff makes more sense and can be easily understood.
Please Note: In order to try and showcase a Specific Use Case, I may have overlooked some of the best practises related to Flow Development in this article. Please make sure to follow these in real world scenarios and projects. Check some really important ones below.
Let's dive right into the action and design the Screen flow.
Note: We will put this Screen Flow on a Lightning Record Page of Account Record.
The overall design will work like as described below (This is the most important piece of this article) :
1st Screen Flow will have a screen where we will provide users with all the Opportunity records(name) for a particular Account Record as Radio Button Options.
User will select one of the opportunity records (using Radio Button) which needs to be cloned.
This opportunity record selected by the user will be stored in a variable with all the field values including Id.
After this we will provide the user with another screen. In this screen user will Input three values. These will be Name,Close Date and Stage.
So by now we have the full opportunity record selected by user to clone and three input values.
We will pass these four values (Opportunity Record selected by user with all fields values, New Name Close Date and New Stage Value to a subflow which will just use these values to create a new opportunity for the same Account.
Basically, the idea is we will replace the values of Name,Close Date and Stage in the opportunity record that user selected. Also, we will make this selected record's Id as blank and then create it as a new opportunity record. All other fields will be cloned as we are not changing/overriding their values.
Why we are using Subflow when we can do this in Same flow?
At first,I also tried to do so. But Basically it doesn't work like that. If we have to use all the values(fields) from a record variable to clone (Opportunity record in our case), we need to pass it to another flow because in the same flow it only copies the value we change not the other ones. This is a thing to remember and note.
Now before moving forward please ensure you understood what we are trying to do so that below stuff makes more sense and can be easily understood.
Please Note: In order to try and showcase a Specific Use Case, I may have overlooked some of the best practises related to Flow Development in this article. Please make sure to follow these in real world scenarios and projects. Check some really important ones below.
Let's dive right into the action and design the Screen flow.
Design of Screen Flow (1st Flow) : This flow will be used to get the Opportunity record to clone from user and user will also provide values of new Name,Stage and Close Date which we need to override in the cloned record. Once we have these values we will just pass them to second subflow, which will create the new opportunity from this data.
Screen Flow will look like this:
This flow has 4 Elements:
2. Screen Element: Select Opportunity: In this element we are going to present user with the options to Select the Opportunity to Clone for the Account Record that it is on.
Before doing this, we need to know which Account is this screen flow Opened on. Basically, we need to fetch the AccountId and all its field Values to use within our flow from the Lightning Record Page directly. Cool Stuff!!
How to get Record Id from Lightning Record Pages/Quick Actions directly into the Flow?
Starting in Summer ’20, if you’re configuring a flow on a Record page in Lightning App Builder, you automatically see all record variables available for input in the properties pane. With one tick, you can pass all the record’s values into that record variable in your flow. No more messing with text variable.
So basically we just need to create an Input Variable on this Flow of type(Record) and whenever we will use this flow on any Record page, all the record details and field values will be passed automatically to this input variable. In our case, we will get all the Account field data including Account Id which we can fetch like recordId.Id.
To create this Input Variable just click on Resource Manager, Click on New Resource and then Select Type as Variable and Data Type as Record. Select object as Account since this is going to be on Account Page. Name this variable as recordId.
Please note: This variable, "recordId" will have all the account details and fields including Id.
Don't forget to mark this variable as "Available for Input" as this will accept values from Page.
Important Note: This feature is available from Summer'20 release only. In old orgs, you need to first create a text type variable and mark it as input to get the recordId in flow and then use GET Element to get all field values.If you want to try in Summer'20 org directly here is a link to create one https://www.salesforce.com/form/signup/prerelease-summer20/
Important Note: This feature is available from Summer'20 release only. In old orgs, you need to first create a text type variable and mark it as input to get the recordId in flow and then use GET Element to get all field values.If you want to try in Summer'20 org directly here is a link to create one https://www.salesforce.com/form/signup/prerelease-summer20/
Checkout the video:
Once we have created this Input Variable, now we can start creating our Screen Element to show all the opportunities for the particular Account so that the user can select one to Clone from.
Using Radio Buttons in Screen: I will be using Radio Button Input option in Screen
Element to show the Opportunities on Account as Options. For showing options with Radio Buttons, we can directly use a Salesforce Object's records as the Radio Button Options. Also, once user select any radio button using this screen, we can get the selected value/option directly in the variable which we will define for Radio Button Options.
Element to show the Opportunities on Account as Options. For showing options with Radio Buttons, we can directly use a Salesforce Object's records as the Radio Button Options. Also, once user select any radio button using this screen, we can get the selected value/option directly in the variable which we will define for Radio Button Options.
Note in the video, how I found/selected the Opportunities to show in Radio Button options. I used the criteria-" Select those opportunities where AccountId of opportunities equals the AccountId of the record which we will get from Page in the variable recordId.Id.
Please note: the variable we defined earlier recordId to get Account details from page into flow will have all the account details and fields including Id. To get Id from that we need to use recordID.Id as I did in video
Checkout the video:
Before we move ahead, please note that in the video, the name of my Radio button choice is "{!SelectOpp}". This is very important as we will now use this variable to get the Selected value (Opportunity in our case) as the value selected by user will be stored in this variable automatically.
And if you note, in the Record Choice set,I assigned values as Id so basically, the {!SelectOpp} will return to us the Id of the Selected Opportunity. Pretty Cool Right? We will then use Get Element to get all details and field values of this opportunity.
Please Watch the video again if this step is not clear.
3. Get Records Element: In this step, we will just fetch the details of the Opportunity selected by user in previous step.
As I mentioned, the user selected value will be automatically stored in the variable "{!SelectOpp}". Also, {!SelectOpp} stores the Id of the opportunity and we will use this ID to find all the details of this opportunity.
Also, at the end we will select the option to store all the values of all the fields for this Opportunity. This is important because now we basically will have access to all the fields of this opportunity.
Please note: The name of my Get Record element was "Opps" . So all the opportunity values will be stored in this variable which we can use later.
4. Screen Element: To Capture User values for New opportunity: This is a new Screen.In this screen we will just ask user to provide some key values like Name for the new Opportunity which will be cloned, also its stage and its close data values as these values we don't want to clone from old record. Apart from these three values all other fields will be cloned as it is.
In the screen just add one text input for name, one date input for Close Date and one Picklist Input for Stage Field. Use Picklist values of Opportunity directly here which will come automatically if we create new picklist value set by using Picklist choice set. All these input values will be stored automatically in the names that we will define for the input field/box in the screen and these will be used later to assign values to the cloned record.
Check video to see how to create this:
Now we are done with the First Flow. After this we will use the Subflow element to call another flow to pass all the values from the user and also the user selected opportunity. These two values are necessary to clone this opportunity.
So let's quickly first create our second flow.
2nd Flow Design: Autolaunched Flow
It will look like this:
Create Variables to accept Input Values from Parent Flow:
1. We will create 4 variable which will be available for Input as they will be taking input from external Flow.
One Text type variable for Name :{!OppName} This will receive the name entered by the user.
One Text type for Picklist Value of Stage :{!OppStage} This will receive the stage selected by user.
One Date Type for User Selected Date : {!OppDate} User's submitted date will be received
One Record Type (object = Opportunity):{OppRecord}: for the Opportunity data of the opportunity selected by the user using radio button choice : This will receive the full opportunity data which user selected using radio button.
Please remember we are just creating these variables here but values in these will actually be passed from Screen flow which we will see later. For now assume these variables have values in them.
Please remember we are just creating these variables here but values in these will actually be passed from Screen flow which we will see later. For now assume these variables have values in them.
Just click on Manager on the left hand side tab, and click new resources to create these 4 input type variables. Don't forget to mark them as "Available for Input".
OppName Input Variable
OppStage Input Variable:
2.Assignment Element: From Parent Flow we will be getting 4 input values into these 4 variables.
We are passing one Record Type variable with all the opportunity fields. In that variable we now just need to replace the value of name, stage and close date. These three values are available in other three input variables which we just defined.
So we will just use one assignment element to basically replace the values of three fields(Name,Close Date and Stage) in opportunity record variable {OppRecord} with the values that were submitted by the user .
Check above section to recall the variable names.
Very Important: In the end we will assign the Id of this Opportunity record variable as blank. Since Id is always blank/null before a record is created in Salesforce. So basically we have now created a new instance of an Opportunity record that we need to create/insert.
ScreenShot Below:
3. Create Record Element: We will just use this element to create new Opportunity record from OppRecord variable.
Please note this opportunity record variable will already have the AccountId since we had fetched this using get all fields data in first flow and it has all other fields value same as that Opportunity except for the ones which we did override on.
We can simply use this variable of Opportunity of data Type Record({!OppRecord}) to create a new Opportunity record with all the same values as old ones except for the fields which we did override on in the last step.
Screenshot below:
This is done. Just save this Autolaunched flow and don't forget to Activate it. Remember the name of this flow as this same needs to be selected when connecting from Screen Flow as below
Connecting the two flows :
We just need to go back to our first flow and link it with this flow as a SubFlow.
We will pass the four variable we just created in the Subflow to pass from Screen Flows.
This is how the Screen flow looks like till now:
To pass the variables we don't need to do anything as when we try to use the subflow they will be recognised and we just need to map them with values from our Screen Flow.
We will Map the Opportunity Record{Opps} from the Get Record element to the {!OppRecord} variable of the subflow which accept the data type of Record.
Similarly, from the input screen we got three Name and Close Date, which we will map to the three variables of the subflow which we just above.
Checkout the video:
So we will just use one assignment element to basically replace the values of three fields(Name,Close Date and Stage) in opportunity record variable {OppRecord} with the values that were submitted by the user .
Check above section to recall the variable names.
Very Important: In the end we will assign the Id of this Opportunity record variable as blank. Since Id is always blank/null before a record is created in Salesforce. So basically we have now created a new instance of an Opportunity record that we need to create/insert.
ScreenShot Below:
3. Create Record Element: We will just use this element to create new Opportunity record from OppRecord variable.
Please note this opportunity record variable will already have the AccountId since we had fetched this using get all fields data in first flow and it has all other fields value same as that Opportunity except for the ones which we did override on.
We can simply use this variable of Opportunity of data Type Record({!OppRecord}) to create a new Opportunity record with all the same values as old ones except for the fields which we did override on in the last step.
Screenshot below:
This is done. Just save this Autolaunched flow and don't forget to Activate it. Remember the name of this flow as this same needs to be selected when connecting from Screen Flow as below
Connecting the two flows :
We just need to go back to our first flow and link it with this flow as a SubFlow.
We will pass the four variable we just created in the Subflow to pass from Screen Flows.
This is how the Screen flow looks like till now:
To pass the variables we don't need to do anything as when we try to use the subflow they will be recognised and we just need to map them with values from our Screen Flow.
We will Map the Opportunity Record{Opps} from the Get Record element to the {!OppRecord} variable of the subflow which accept the data type of Record.
Similarly, from the input screen we got three Name and Close Date, which we will map to the three variables of the subflow which we just above.
Checkout the video:
While adding the Flow to Lightning Record Page, just check the checkbox where it shows the variable we created to Get the Account Data from the page by the name recordId in the starting. Remember?
Demo Video Below:
So we have seen how to Use Screen Flows to Clone Records and how to use Autolaunched Flows.
Don't Miss Latest Posts : CLICK HERE TO SUBSCRIBE TO THIS BLOG
Checkout this Article for all Flow Related Scenarios : All Flow Examples
See you next time!
Amazing! You covered everything in detail. Great Blog
ReplyDeleteThanks Rajat
DeleteGreat Work!
ReplyDeleteGood!
ReplyDeleteHi Vibhor, great tutorial. Really easy to follow along and awesome feature. Can you explain the reasoning behind needing the subflow in more depth? Is it because when we try to create the Opportunity we can only bring over the values from the Opp screen (Name, Stage, Close Date) and it won't bring over the other fields(Amount, Discount, Currency etc...)?
ReplyDeleteHi , Thanks , Yes you are right, We need all the fields not only the screen ones, so it's a weird thing but yes it requires a subflow so that we get all field values. Let me know if you have further questions.
DeleteThis is great. Thank you so much
ReplyDeleteThank you for putting so much effort into sharing this feature.
ReplyDeleteI am trying to replicate this, but I don't see how to pass my New values from the Screen Element into the SubFlow
I am trying to clone a record via a subflow, but since i am using all the values and not manually assigning variables, I can't figure out how to access the newly created record id later in the flow.
ReplyDeleteNewly created Id can be used either by using a get element after the get record element or by using the .id after the variable used in create element. For example newrecord.id
ReplyDeleteEDITED: Newly created Id can be used either by using a get element after the Create record element or by using the .id after the variable used in create element. For example newrecord.id
ReplyDeleteThis is the error when I tried adding .id or .Id to the record create element name, "The "Clone_Trip.id" resource can't be used as a merge field."
ReplyDeleteThe flow seems to look at it as a boolena or something, since I stored all values without any assignment (which I need to do to easily clone all values)
What is the name of variable which is used in create element to insert. U don't need to use .id after the name of the create element but rather after the variable used in the create element. Check if this helps https://jenwlee.com/2020/08/17/lets-get-with-the-flow-referencing-newly-created-records-in-a-flow/
DeleteThis is a very Nice blog for flows to learn .... Thanks for your contribution... WISH YOU ALL THE SUCCESS......
ReplyDeleteHas something changed with Flow to make the subflow unnecessary? I am creating a Clone flow to clone both the record the user is on plus all the child records. I created a single flow and created both the object and its child records and it seems to have copied all the fields for both objects over correctly. Wondering if I am missing something and the results will be flaky (sometimes work, sometimes not).
ReplyDeleteNever mind. Although it worked in the sandbox I set it up in, it didn't copy all fields in the next sandbox in our development cycle so I changed it to use a sub-flow. Thanks!
DeleteYou're so Amazing! I'm glad I found this blog. Subscribed!
ReplyDeleteScreenFlow Crack Mac I am a good web blogger and this software will take the best feats for you and create your easy.
ReplyDeleteI was trying to do yours and I found I only get those opportunities which don't have any parent account attached to it .
ReplyDeletewhen just running the flow gives me opportunity without parent and adding it account page gives me the account opportunity.
DeleteIndeed a great example. I tried to clone opportunity with main flow only and it worked after some changes.
ReplyDeleteThank you! So good explanation!
ReplyDelete
ReplyDeleteVery good article! We will be linking to this particularly great post on our website. Keep up the good writing.
However, stopping by with great quality writing, it's hard to see any good blog today.
wincracker.com
ScreenFlow Crack
IPVanish VPN Crack
Rhinoceros Crack
Avocode Crack
I tried implementing the scenario, and resulted in the below error post selecting an opportunity and then entering values in the three input variables i.e. Name, Stage and Close Date.
ReplyDeleteError: Subflow "CreateClonedOpps" is invalid: In the input assignment, OppRecord and null have incompatible data types. Validated against version 4 of the flow Cloned_Opportunities.
I need to update an *existing* record with the copied values, instead of creating a new record. Any idea how to do this? I tried assigning the copied values to a record variable, and then assigning the variable values to the original record, and then updating the original record, but it's not working :(
ReplyDeleteHi Vibhor,
ReplyDeleteThanks for the awesome work you're doing. I am following your exact steps but on Get Record element, I tried doing Field(AccountId) Operator(Equals) Value(I can't see the already created/existing record choice set variable (SelectOpp) to pick from the list of values. I'll appreciate any help from you (or anyone in this thread)
This comment has been removed by the author.
ReplyDeleteGreat insights! This blog concisely provides valuable information. A must-read for anyone interested in the topic!
ReplyDeleteVisit: Cyber Security Course in Pune