 Hello everyone, I am Sanjay Gupta. I welcome you on Sanjay Gupta Tech School. So today we are having day eight of Salesforce Omni Studio Bootcamp. And I have Abhishek with me. Welcome Abhishek on the platform. So far, like we discussed data rector, then in last session we started IP, integration procedure. So in last session, Abhishek gave you an overview like how integration looks like, what you can do through integration procedures and what are the advantages of it. And we told you like, this is just an introduction. In next session, we'll give you a proper demonstration like how you can create integration procedure and how you can connect it with data rector, right? So Abhishek will be doing a couple of demonstrations in front of you so that you can understand both clearly. But before starting this session, I just want Abhishek to introduce himself because I know in every session, lots of new folks are joining in. So if you can briefly introduce about yourself, so it would be good. Yeah. Thank you Sanjay. So hi everyone, myself Abhishek and I'm working as a Salesforce and Velocity Developer. And I have around five plus years of experience and I'm a double-starred railed ranger. And I have done some few certifications on Salesforce like OmniStudio developers, CPQ specialists, Service Cloud PD-1 and administrator. And I have done several projects around Salesforce and Velocity and on Velocity, I have worked upon majorly on industries like health insurance, telecommunication and the OmniStudio, code OmniStudio projects as well. So yeah, that's it about me. Okay, thank you Abhishek. So moving forward, if you want to become part of a community where lots of freshers and experienced professionals are connected and they're helping each other learning Salesforce, so you can connect and lots of job opportunities people are sharing in this group. So if you join this, it would be helpful for you. And if you want to receive all the timely notifications so you can follow Sanjay Gupta Tech School on YouTube, LinkedIn, Instagram and Telegram. And the session tracker link is available in the description of this video. And please provide reviews and feedback about the sessions so that we can get some motivation. Okay, so with this note, I pass it on to Abhishek so that he can do some demonstrations for you. So I think Abhishek, we can showcase scenarios first. Yeah, go ahead. Yeah, after this, we have this slide. Yeah, over to you. Yeah, thank you Sanjay. So in previous session, we have seen what is integration procedure and why we use integration procedure and how integration procedure designer looks like. I mean, what are the sections available in integration procedure and what each and every section, we have gone through the description of each and every integration procedure designer. Now if I go next slide, so in today's session, we're gonna execute some scenarios where we will be fetching some data from account and with the help of integration procedure and data adapter. And we will be saving some data to the database also with the help of integration procedure and the data adapter. So without wasting time, let's go to the org and we'll do some practical implementation. Let me delete these all so that we'll start on scratch again. So in previous session, I have created this integration procedure, fetch account records, and I'll just give you a brief recap what all things we have covered in the last session. So whenever you will be creating an integration procedure, you will be giving three parameters. First is label, second is type and subtype, third is subtype. So this label is just a UI field or we just want to give the name to this integration procedure, but when it comes to uniquely identifying an integration procedure, the combination of type and subtype combinedly will identify the integration procedure. So you can refer it to the Salesforce API name. So whenever we're creating object or field, we give an API name to it. So the combination of type and subtype and build as a retaining, it will identify this integration procedure as a unique one. Then again in the properties section of this procedure configuration, we have few more things like create version, activate version, and this export we'll be seeing when we'll be learning about the deployments. So we have an integration procedure, and if I want to use this integration procedure into some omniscript or flex card, I have to activate it. If I haven't activated it, I cannot use this integration procedure, and let's say if a team of five developers is working on the same integration procedure, and so what they can do is they can just create versions for themselves, right? So that there will be no dependency of developers on each other. So I mean, when you are working on a Apex class, multiple developers cannot work on the same Apex class at the same time, but this is not the case with the integration procedure. They can create a version for themselves, and they can do whatever they want to take first, okay? And last but not least, we have three sections in integration procedure. First is available components. Second is structure and packets, address properties and preview section. So in the available components, we can use multiple things like cache block, conditional block, loop block, and if I want to call some data adapter, if I want to call some chatter action, these sort of actions available into the available components that we have seen in the last section. In the structure section, what are the elements that we have used in the integration procedure? Those will be available over here, okay? And in the properties and preview section, so let's say if I want to use some one data extract, so as soon as I have dragged and dropped the data extract action into this integration procedure structure section, on the properties panel, I can give the data rector name. And from here, basically what configuration needs to be done for calling this data rector that we can define into the properties section. And if I go to preview, preview is the similar as data rector, we just need to give some test data and click execute, and we can just get the result, okay? Now, this is the brief of whatever we have covered into the last session. Now, in today's session, what we're gonna do is, we're gonna call a data rector extract from this integration procedure, and whatever output we are getting from the data rector, that output we will be having into the integration procedure output, okay? If I go to data rectors again, let's use this DRE account records that we have created. And we have said that give me all account records where active is equals to this parameter, so whatever we will be passing in this, yes or no. And all the account should be in the ascending order with the name. And if I, okay, we have some account list. And then we are receiving active, country, and name. And as well as we are receiving the account list size. And if I go to preview and click execute, we are getting 25 records of account, okay? So now, we're gonna call this data rector from our integration procedure, and this output we will be having into our I2, okay? So let me go here, and in this data rector interface, you will be seeing all the data rector extract. And if I paste my data rector name, I'll be having my data rector. I'll select this one, right? And this is as simple as that. As soon as I have selected my data rector, I can get all the results into my I2. So like if I go to my preview and click execute, so right now we will not receive any sort of results. And I will tell you why also, just let it get there. So as you can see, there is no output. The reason, this data rector is expecting a parameter, right? So when we executed this data rector from the previous screen, we have provided this active parameter as no. But when I have called this data rector from the IP, I haven't passed anything, right? There is no value that is getting passed to this data rector. So for passing some parameters to the data rector, we have to click this add input parameter, okay? And in the data source, what we have to do is, we have to pass what value you want to pass to that data rector. Right now I want to pass no. And in the filter value, I have to give the parameter name that I have in my data rector. So in my data rector, the parameter name is active parameter, right? So I have to give the exact same. This is a case sensitive parameter. So whatever I'm using into the data rector, I have to pass the exact same, okay? And now if I go to preview and click execute. So as you can see, this data rector is giving me all the output, account name, all the records, right? So whenever, okay, there is one more thing. Whenever we are creating some Apex class, right? There are some debug logs that Apex class generates, correct? So whenever you are creating an IP and whatever elements you are using into your IP, those all will be available in your debug response. So as you can see, my IP started its execution and the element which I have used is data rector extract action. And what, there are two debug logs created for this element. First is data rector extract action two and second is data rector extract action two debug, right? So the first one will always give you the output. And what do I mean by output? So you have created, you have called your data rector from your IP and that data rector is passing some output to your IP again, correct? So whatever output you are receiving from your data rector that you will be getting into the first one. And if I go to the next one, which has this debug keyword added, and if I click on this one, this will tell you how much time this data rector call took. So it says 183 milliseconds. What is the type of this call? Data rector extract action. What input I am passing through this data rector, which is this active param known and status is true, that means this element call is true. I mean this element call will be executed. Right? As you can see, this is the output, which is this output, whatever we are receiving in the data rector output, we are receiving into the data rector extract action into our IP, right? Now, we can identify why we have used this, why we have used this active parameter into the data rector, right? Because if I would have hard coded this value as yes or no, right? Then there was no way that I can pass some sort of parameter to the data rector dynamically, correct? Now, let's say if I'm passing yes now, okay? So it will give me the output for yes account, active as yes accounts. And if I click execute, and go to this DBIS again, as you can see we have the complete of five accounts now. Whose active is equal to yes? So this is the benefit of using the parameters into the data rector. So this is, I think one way, like getting whatever data rector is producing so that we are having an IP, right? Yeah. And what is this middle response will be getting anything here as well? Yeah. I mean, I'll go to this part. Okay. Now what we will be doing is, so basically there is one more thing that I want to explain before I'll be explaining this response section. So let's say I want to call this IP from an omniscript, okay? But this parameter is hard coded right now into our omniscript. Right. Let's say I want to call this IP from two omniscripts, from one omniscript I want to pass yes, and from one omniscript I want to pass no. But this omniscript will give me always the output whose accounts is equals to yes. Right. Right? So for creating this integration procedure dynamically as we did for data reactors, right? What we can do is, we will give there one more parameter, let's say active param IP, okay? And this active param IP, we're gonna pass it from here. And if I click execute, all the accounts with yes are coming. If I do no, and all the accounts with no are coming. Okay. So whenever you are creating whether it is IP or whether it is data reactor, you should always use dynamic values when we are using the param. Now we will see what is this response section. So if I am using this integration procedure into an omniscript, right? What will happen? I will get no results from this IP. The reason is you can think of it as a parameter, as a method of APS, right? And this whole IP is a method and the written type of IP is you can say void. Okay. So whenever you will be calling this IP from whether from flex card or from omniscript, this IP will execute all the elements that we have included, right? But it will not return anything to us. Similar way, similarly we do into the Apex. We are calling some method, we are performing some SQLs, we are performing some DMLs, but we are not returning any value from that method. The written type is void right now. So it's similar to that method only. So for adding a written type to this integration procedure, we use one element which is called as response action. And so whenever we are adding a written type to our method into the Apex, right? We have to give the data type to it, whether it can be a object data type, it can be a string data type, it can be list of string data type, right? So integration procedure will give you that flexibility that whatever you want to get it from your IP, you can get it in the written. There is no defined parameter that you have to return only the string, that you have to return only the number or you have to return only the list. Whatever you want in your output, you can receive it from your IP. So right now what is happening from this data rector action to, we are receiving a list of objects. So this is one object, this is one object. So we are receiving a list of objects. So there is only one constraint when we have added this response action into our IP that this response action always should return a JSON format. And in that JSON format, you can have anything, string number, another object, a list of object, anything. So if I will do this, right? So in the response JSON, we have a few parameters, but I will just, we will be seeing this send JSON path and send JSON mode right now. So whatever data we are receiving into the data rector extract action to element, right? I want that output as my written written from the integration procedure. So I will copy the element name of this data rector extract and I will paste it into the send JSON path, right? And if I want to change the, okay, I'll go to preview and click execute once. So as you can see, now in the response action we are receiving all the output that we have received from the data rector, right? So another parameter is send JSON mode, right? So let's say you want to add a parent node name before this whole JSON. So let, we can do, we can say like account records, okay? And now if I go to preview and click execute. Just one will be in under this account records. Correct, right? So you can think of it as like whatever data we have received from the above elements, but now at the end of the IP what do you want from this IP as a written data, right? And like if you want to trim the data down also you can do that as well. So let's say I just want the account list size. I don't need the records or it's either way around. I don't need this account list size. I just want this account array. So what I can do is I'll go here and after that I'll add one colon and paste the account, account node. And if I go to preview, now I will receive only the accounts. Okay, so we just need to type the name of that particular node. Node, exactly. And one more thing like this response of IP can be used in Omniscript and Flexcards, right? Yeah, so basically this is the data that can be used into any Omniscript or into any Flexcard. Yeah, so at the bottom we have data raptor. Data raptor is giving data to IP and the IP data that we are like filtering or doing some logic that can go to Omniscript and Flexcard, yeah, totally understandable. Yeah, so this is one way of receiving the data into the IP. What can be the other way? There is one more section called additional output response into this response action, right? So for example, I don't want to receive the data from here, I'll just remove it from here and I'll click add key value pair and I will say again the account records, okay? And in this, I will paste the same, I will paste the same JSON path, whatever we have pasted over in, right? But it will, now it will not give me the output. See, this is giving me that string value, whatever I have pasted. And why is that? Because it's an expression editor. So whenever you are using any expression editor, you have to add percent percent so that it can read as a merge field. The similar way in the formulas, we always use like percent percent, right? So in this expression editor, you have, I mean, whatever formulas you have in your data after, the same formulas you will be having in this expression editor. So for example, you will be having the split method, right? You will be having the, let's say, if condition, you will be having size, I think, serialized plate substring. I mean, whatever formula reference that we have seen in the data after, all the parameters will be available in here, right? So I'll be pasting again this one and I'll click OK. And now if I'll go to preview and click execute, I'll get the results. So Abhishek, I think we can use either one, right? Above, if you go to properties once again. So earlier we used sent JSON path and right now we are using additional output. So anyone we need to use, right? Correct. I mean, the scenarios where we'll be using whether the sent JSON path or the additional output. So let's say if I want to use some sort of formula, right? If I want to use some sort, whatever data I'm receiving from the data after, now I want to use some sort of formula in here. Formula for filtering the data, right? Filtering or if condition or anything. Okay, okay. Then we will be using this additional outputs. Okay, okay, got it. Right? And, okay, yeah. So these are the two methods by which we can receive the data from the data reactors into an IP. Yep. Now what we will be seeing one more example for saving the data to the database. Okay. Yeah, DML operation. Exactly. So for that, we will be creating one more integration procedure. Again, click new. We will give the name of the integration procedure. So let's say IP, create, we'll say it again account and create, we will hit the save button. And similar to data rector extract, if I want to call some data rector load, I have to use this data rector post action. Okay. I'll go to the integration procedure. Sorry, the data request. And I look for, I mean, I have created some data rector post action, I believe. Yeah. So this DRP and in this one, what we are doing is we are inserting an account and we are inserting a contact beneath that account. And if I go to fields, we are passing the account name, right? And we are passing the, right now we'll just insert the account. Then later on, we'll be inserting the contact as well. So in this data rector, I'm inserting an account. Okay. What we're gonna do is, we're gonna call this data rector into our IP. So similarly, I'll select this account data rector. And again, we are using this account colon name, account colon name input parameter, right? So I'll again go to the integration procedure from where we are calling this data rector post action, data rector load. And now we have to pass the account name, right? So for simply calling it, I'm just gonna call it name. Okay. And into our IP. Now, as you can see, when we use the data rector extract for passing the input parameters, we had this column input parameters, right? But when we are calling the data rector post, we don't have something like that, right? The reason is, I mean, this section will always be available into the data rector extract because we are passing some parameter, parameter which will be used into the filter criteria. But from here, we can send some sort of input to this data rector. And this data rector will handle all the insertion or the updation part. So this name parameter from where we can pass it. So again, there are two options. We can pass it from San Jason Park or from this additional input. So first we will pass the data from this San Jason Park. We gonna call it as, okay, we'll hard code it first. So let's say, press as gts. And we're gonna, the same just Jason node name is, it should be matched to be this input Jason Park. And if I go to preview and click execute, yeah. In the parameter, as you can see, the value is getting passed as null, right? I think what we have to do is we have to use the input parameter. Well, let's say name param and this name param, we will be passing it from here. So press as gts and if I click execute, as you can see, if I go to the debug logs, it shows that account has been inserted successfully with this ID. Yeah. I think you need to do a recap. Yeah, it is a little bit tricky. I think it is simple, but if you can walk us through. Yeah. So whenever I'm calling a data rector post action and in the data rector post action, what I'm doing is in the input, I am expecting a value called as name or the parameter I'm expecting, which is called as name, right? So from our IP, where we have called the data rector post action, right? This is the Jason node, which we will be having an input. So from the preview, we will be having this name param and what account name you want. And in the right side of the same Jason node, we will be giving the parameter name and parameter name is nothing, but the input Jason path, right? So this is one way of passing the values to your data rector load. Another way of doing is, I will go to this additional input and now whatever we have passed in the, I mean, whatever input Jason, we are expecting into our data rector. If I'm passing it from the same Jason path and same Jason node, then the parameter name will be coming on to the right side. But if I'm passing it from the same only additional input, then parameter name will be coming on the left side. So whatever value I want to pass will come at the right side. The parameter is like from data rector, whatever we used in data rector, it should be same, right? Yeah, I mean, whatever parameter we have used in the data rector, which also can be called as input Jason. If I am passing it from the same Jason path and same Jason node, then that input Jason or parameter from the data rector will be coming on the right side. Okay, and in this same Jason path, do we need to write something? Value? Yeah, I mean, previously we were, Okay, okay. Previously we were passing this parameter. Got it, got it. Yeah. So anyone we need to use? Yeah, anyone we can use, yeah. And if I'm passing the value from the send additional input, right? Then the parameter which is in our data rector, we will be passing it from the left side. And whatever value I want to pass, we will be passing it from the right side with the merge fields. And again, the difference between them is, if I want to use some sort of formula, then we will be using this additional input. And now if I go to preview and let's say test SGTS1, click execute. And I'm receiving the output is successful, right? Okay, and what if we need to pass two values, like name and phone? Yeah, so in that case, in that case, if you want to pass two values, you cannot use the same Jason path. You always, you have to use additional input. Okay, okay, yeah. So this is another advantage of this thing. Yeah, all right. And this phone will be passing from input parameter of IP. I'll be adding one more parameter. And that's it. This is how we can pass. And do we need to change something in DR as well, data rector? Yeah. We need to create one mapping. I have to create one more mapping for phone. And I think, do we have phone feed? Yes, we have. And if I go and click execute, and if I'll see this account, we'll open this account. Actually, it got upset because we didn't modify the name. So yeah, I think we can open so that we can see the phone number. Yeah, definitely. So if I go to this test SGTS1. Yeah, I think it is already having. In this view, yeah, it is having phone number. Yeah. So yeah, that is there. I go back to. So now what will happen? Again, similarly, the way we have called the IP for the data rector extract. All the things have been done, but we are not receiving anything until and unless we have added this response action. The same way, if we have called in data rector post action, and if I haven't added any response, right? Then I don't know whether an account has been created or not. Right? Right. So for getting, so this data rector post action is giving us this output. Name, absurd success, ID, phone, and absurd object type. So if I want to receive this information as a result of my IP, simply what we can do is just go here and in the response action, put it into the json-json part and come to preview, click execute. Now you will receive all the information here. I think Sanjay, now if you want to do some sort of Q&A sessions around this, so that viewers can get more clarity, then we can go with that. So you want me to ask a few questions related to this? Yeah, so that I mean, because all the demo, I have, all the demo is been done from my side Okay, so first I want to request those who are live, if you have any question. So Abhishek demo, two scenarios. If you have any question, so I think in live stream also you can go back and you can see something. And like if you have any question, you can ask. Otherwise, I think in between the session I already asked, one question I have, can we combine both like that get action and post action together and do some sort of calculation? So is it possible? Yeah, we can do that and we'll be seeing that example. I mean, do you want me to explain in this session or in the next session? Yeah, maybe I think we can cover it in the next session because otherwise it will be too complicated for the audience. So I just want like they can do some demonstration because it is very much important. And I think now viewers will be getting more interest because DRV explained, now we are connecting data adapter with IP. So it is getting more interesting like how these things are connected. And guys, make sure like do regular practice because now onwards if you don't practice, so things will be very much complicated. Exactly. Yeah, so I think in next session, so we'll be having next session next week. So we'll be having a few more demonstrations. So right now you can see it like we created a class and in that class we created two methods. Class means Apex class and we had two methods. One is like get accounts. One is like insert accounts, right? So this we did through configuration without writing any single line of code. Now what we will do, we'll be having some business logic implemented. So Abhishek, if you go to top left, like I think we have some group in this available components. Yeah, so I just want you to demo like conditional block, loop block, try catch block, cache block. So because I think these are very much important for building some business logic. So we'll be having some scenarios around these so that more clarity will be there. Yeah, and we'll be having a dedicated session for this group available components only. Okay, yeah, so I think two, three sessions, more we'll be having on IP. Yep. Detailed sessions and I think it will help people. Okay, and then after completion of this, we'll move to Flexcard and Omniscript. So I think in next month we'll be able to complete this so that anyone can like follow all the sessions. So Subram is saying session needs to be more clear. So Subram, can you like say a little bit more specific because we know if you are learning Omnis Studio for the first time, it will be difficult to understand things because there are lots of things you need to understand, right? So in my opinion, just watch the recording again, do some practice, then ask specific questions as well, right, because I don't think in the easiest way, Abhishek is explaining, we can go to any other easy way. So he's explaining each and everything, whatever is required. So it is for you now to do more practice. And if you still have any doubt, ask questions, right? So that's why we are doing these sessions live. We could have recorded and uploaded, but we are doing live so that you can ask questions. Okay. And me and Sanjay, another thing for Subram can be like, I can understand like these options and Jason path response, additional output, these will be very confusing in the very beginning. But once you will be practicing it for the IP and the data reactors by yourself, then you will be getting more clarity. You will be familiar to all these options. I mean, in a good manner. After you will be doing the practice. Right, exactly. Totally agree. So practice is very much important. And yeah, so maybe we can have one Q and A, specific Q and A session, once we complete all the IP related session. So we can have one session where we will discuss some important key aspects of data rector and IP. So kind of revision session. We can pick any random question from audience. Yeah. Okay. And one more thing like guys, we are planning to do one separate session on Salesforce developer versus velocity developer. So that you can have clear cut understanding. And accordingly, you can write things in your CV. And if interviewer is asking like, what is the difference between these two? So you should be able to explain that. I know Abhishek already explained these things in the different sessions, but I would invite Abhishek separately for that career talk, so that you can plan your future accordingly, whether to go for Salesforce developer or like this velocity developer. Okay. Yeah, I think we can wrap the session here. Thank you Abhishek for sharing the insights. And the guys will be having more sessions next week. And please share your reviews and feedback, because with the help of reviews or feedback, we'll be able to improve ourself. Okay. Thank you Abhishek once again. Thank you everyone who joined live and watching the recording. See you next week. Yeah.