ServiceNow GRC/IRM: Full Flow FINALE (Quebec)
okay good evening well good morning i guess if you're upside down uh welcome to phil goes deep this is the long-awaited grand finale or the not so grand finale of the full flow series so i just need to have a quick sip of my cuppa so it's been about four months i think since i did my last stream and i started this series to try and evaluate and stress test flow designer and since then quite a lot has happened and some things haven't happened so i haven't had my hair cut because the hairdressers have been locked down twice and quebec is now out so i've upgraded my pdi to quebec i haven't done anything in the instance since upgrading and i started to think about trying to close out this series that i started i originally said i would try and convert the whole of grc to flow designer in 24 hours um and i've done i think around nine nine episodes of this about one hour 20 each so i was heading for maybe if this takes an hour and 20 minutes i'll be done in 12 hours and i won't have converted the whole of grc so but i have learned a lot so i want to try and share those learnings and then probably move on to do something else because i think those findings will be useful they've certainly been useful to me i'll try and wrap them up and maybe other people will be tempted to test out flow designer for their own reasons so i did put a little powerpoint together which is not what i normally do let me just switch my screens okay until i am a little bit behind the times on this so let's just try yes here we go okay so the not so grand finale i there's a link in the description as well for the article i posted on the community to kind of get this thing started but it really came from a conversation probably more internally but also i saw some stuff on the community about what we should be using flow designer for and obviously if you know that i work mostly in grc i figured that that was a prime candidate and would be a good opportunity to stress test flow designer because if if we can move the whole of grc over then surely this would help answer some of these questions so how much of glc can be converted and should everything be built in flow designer so maybe if you're building your own app or you're looking to extend an application or you're going to build a business rule or whatever it may be you know where does flow designer fit into that design decision so then i started also with some assumptions and i think you know firstly what i was saying to a lot of my team is that if you've got a script include which i'll just refer to generally as an api whether it's it's not an external api but i think of it as a kind of programming interface so when you've got a public method in one of your script includes then that is that should be an action in flow designer and it soon became clear that once i started trying to convert grc into flow designer that that assumption um probably cost me a bit of time actually because i just started looking at a script include looking for the public actions the public methods converting them into actions and then realized that nothing is really calling that method from outside um you know from a business rule from a trigger point or an end point i suppose so um although public methods are you know you shouldn't be calling private methods i don't think from us from a flow action the apis within grc for instance um issue utils will get called from other apis so those public methods don't really need to be actions at all so like i say i wasted a bit of time doing that um maybe maybe something's changed now but before business rules cannot be converted although i've found a bit of a workaround for this so maybe if you really wanted to do it you could trigger the flow from a before business rule um actually you lose a bit of access to the object and i think probably unless something's changing in flow design and maybe we'll find that out in a bit but i don't think you should be converting before business rules um yeah you can pass the object in but also you don't have access to the previous as well so that could be um even in some scenarios even if it's an after or it's a before you might want access to the before uh sorry the previous and you can't seem to do that so there's no previous and current and and then some general findings here and something i'm guilty of myself um i don't think i read the manual much at all but there is some great resources available i'll share the link in the description as well for anyone that doesn't know where docs.servicenow.com is this is talking about paris actually but yeah read the manual there are some learning paths as well and you can get yourself a badge you can get yourself a microser you can post that on linkedin if you like you will probably learn a lot and that's probably a stronger starting point but i like to just drill in and just see what i need to know but i do remember getting stuck on trying to get the output of an action and luckily james foote was connected to the chat and he helped me out with that so i don't know if he was reading the manual or if he'd read the manual if he just figured it out um i'll just check in the chat sorry thanks jace i thought you were saying i was going at two speed or something that uh yeah maybe maybe i'll see you for talking too fast or the stream was screwed up so yeah i don't think before and delete options are um are available as triggers the previous object already talked about that one thing i found in you know it's different if you're building your own application of course you can design it from from the baseline of you know i'm going to use flow designer and you don't you don't need to kind of be pained with some of the things i've been going through but certainly some of the apis and some of the methods don't have return values in there and i think that's a pretty poor approach to functional programming so then when you convert the action convert the method into an action you can't then access the results of it so from a debugging perspective it doesn't give you all the things you need so i think that's a general premise even if you don't think you'll need the value i don't think there's ever any harm in returning a value in a function i didn't find a way to unpublish an action so once i kind of built it i can't consume it till it's published i've published it and then it's it's left there maybe maybe that's to protect it from some of the dependencies if you've built a flow or a subflow that's calling the action but maybe maybe i'm missing something uh the arrays and objects getting handled i haven't read the manual so it could well be my problem but i like to use objects a lot to um be a bit more dynamic it's not i found something i think it's called json schema i don't want to share the link so i'll probably get it wrong but yeah the json schema i think if you're following that then it fits perfectly and slots in very nicely but if you're trying to just pass an object and then digest it in a script or within an action i was a little bit out of my depth trying to do that in flow designer especially live so yeah sometimes if you've got a before business rule it's calling a script include and that script include knows it's going to get called from before business rule so it won't have the update in there and that creates a problem for converting and yeah this is a really positive thing actually and the reason i really like flow designer is that you can just go in and debug the execution although i don't know if i i wrote it down here about the logs what i figured out and i don't know exactly how this works but it's kind of my interpretation of it if i call an action directly for instance from a ui action maybe i'll just call that action i can go and look at that action and see the executions but if that action gets called by a subflow or a flow i can't see the execution of that action i only see the execution or the results of that action from the flow or the subflow that actually executed so it's almost like the whole object including the flow the sub flows all of those components get compiled and sometimes you do lose a bit of visibility there return values can be evaluated in the execution yeah so this is you know key point i think to the bit about returning values but i've certainly seen some stuff i've done for customers where we've put some fairly simple flows in place using flow designer and they actually had access to the flow designer in their production environment they weren't able to make changes but they could see the execution so it was able to support them in their kind of what's happened here question so next steps yeah i'm going to basically i've got an update set that i've been using for the full flow i think i'll stick that on share i don't know if it's going to be of any use to anyone uh but it might be interesting any feedback and then i'm just going to dig in a little bit to to quebec but if i also take a view on my drawing file i should probably i'll just checking that obs is up and running uh upside down andrew yes async makes all that hard so when you're dealing with async obviously you don't have access to the previous object but there's a lot of asynchronous um processes business rules from grc there's a lot of processing that takes place that you wouldn't want to wait for the system to respond and be hanging around for instance if you're mapping there's a lot of m2m relationships and those m2m relationships trigger other processes and you can get into a whole world of pain if you're not careful those asynchronous jobs i thought were actually prime candidates for flow designer i don't think i ever got to it so if i'm just looking here what i what i went through i tried to document as i went along this was my approach to convert so looking for those api calls as i say initially i just identified it identified the public methods and created action so i was over over here and then found out they were never really getting called they were getting called in kind of internally within another method so yeah identify them and review them and then the public methods turn them into actions create flows i think it's kind of de facto standard that anytime you're creating a an action you should create a sub flow for consuming an action which can then be consumed by a flow the flow contains the trigger and can even be used it says you're getting some buffering i don't know if i've got network issues but yeah the uh the subflow can be consumed from a flow uh the flow can be triggered from you know like your typical triggers of updated records based on conditions but you can also set up scheduled jobs or replace scheduled jobs one of the things i've found and been using a little bit is to convert the action or create an action and call that from a ui action and you can call the ui uh call the action or the sub flow asynchronously which allows your ui action to kind of trigger it and rather than throwing an event and using a script action you can actually process that in flow designer as well but yeah the subflow can be called without having to define a trigger i think sometimes you if you just create the flow you end up defining a trigger that you try and condition out and never gets called so that's um that's completely unnecessary so create the action create the sub flow and then if you need to create the flow as well and then go back and obviously replace those calls or deactivate the business rule make sure it's working there might be some embedded code so sometimes you know not everything's in a public method or in script include so you can take that code and turn that into an action and then call the action accordingly so some stuff's buried in or embedded within a business rule for example i didn't mention anything on the kind of learnings that i've got here but i haven't seen anything that suggests flow designer should be used for any client-side logic obviously yeah ajax could potentially make a call to flow design i haven't really thought about whether that's a valid use case but yeah if you've got a flow your business rule would get would be replaced with a flow and called a subflow your ui action can call the sub flow and these call the actions but you can call the action directly as well i think it depends on the complexity and start mapping out your flows to begin with and talk about how you might um you know create kind of modular components so i started off looking at the different scopes that i was going to work in if anyone's looked at grc you'll know that there's a lot of scopes there grc profiles is essential to to most of it um you don't really apart from vrm there's no grc application you can have without having profiles and that's where a lot of the kind of integral components uh get processed so things like entities indicators issues all of those sit central and are used across compliance used across risk and then we start getting into advanced risk audit etc so i started with profiles i did some stuff with indicators and yeah this is where i had a script action that was previously getting triggered so the execute ui action on an indicator will call i will throw an event and get triggered by a script action so i replace that with a ui action there's a scheduled job that runs for indicators the generation of indicators for templates i think i used the color you can tell it's four months ago but i used the color color code in to say that blue was kind of in development under in progress and the green was stuff i'd actually done i think the orange stuff was kind of done but not tested and then the reds is where i found some problems along the way so um yeah there's some business rules here that are before and it can't handle the before execution can't handle the delete uh create indicator when associated to script action again it's all about the previous object basically that started coming out in the first kind of first episode or two dealing with issues there's some ajax stuff which i didn't touch yeah update or create issues create issue when result fails not sure why that was read and then this was failing close or update when result passed i'm just trying to get myself back up to speed here a little bit as well so i at the time i was fairly i was doing one or two of these a week and then other things happened so issue grouping you know see not public this is where i started assessing things first mapping out what's in there and saying do i really want to try and convert this so i think the red in this occasion was like don't bother this script action i think was converted but the ui action is what calls it so you can do a client-side um you know group issues using your tick box on the list action and that pops up and then that throws an event so i think i converted that but i don't know if i've consumed it from the ajax assessment utils i've done nothing with glc utils i thought was going to be the main the main process so there's a ui action that calls a script action to generate profiles uh script actions can be replaced and the subfloor called directly from a ui action ah yeah so i think i learned that afterwards so i did the conversion and i got my my action to um i used the script action to call the flow and i didn't need to do that i could have just called it from the ui action and i'm doing that um on what have i done that on just recently yeah an import process that i'm working on so um i actually import in excel from an attachment so i've built the transform maps and all the scripts but i trigger it from the record and rather than sitting there waiting for it to load i throw the asynchronous call to the action yeah lots of things going on on the business rules this is about profile types relating profile types relating profiles generating profiles but this is not dealing with the mapping okay and generate links so this is where i got got stuck into last time oh what's going on in the chat so yeah shout out to jace and andrew upside down andrew um flows are different it's like they want to be business rules or workflow but still different yeah i mean obviously workflow we know it we know how it works we trust it and up until quebec i think there was no kind of scratch pad so from one action to another you had no scope really it was kind of executing actions and only you had scope but only on the records that are getting passed in there was no way to create some kind of objects to handle through the flow and i think i saw andrew post about this on linkedin that there is one of those now so like i say i've i've logged into my quebec instance i upgraded it as soon as it was announced and then i've had a busy weekend doing something completely different which was was refreshing but i'm very happy to get back into some service now stuff and try and finish off this full flow series so um i've got my update set here like i say i'll publish that and stick it on share i've got flow designer i also use categories i think categories are great when you start to see inflow designer the the flows actions uh subflows organized by scope and by when you're in a this is new connections i'm not seeing that it looks nice you can see a bit of a ui change so if you're in a flow let's just filter here on grc relate entity types yeah this is me find existing open issue indicators was runner indicators okay i've got to say the ui is looking nice what's happened what have they done with it just feels fresh right now i haven't looked at quebec at all so i really don't know what this is going to be like i've looked at the release notes but says it's inactive i wonder why that is did i not activate it let me check if my scheduled job is deactivated if i was to add an action in here and if i picked on grc profiles yeah these are the categories here so i've kind of organized copy response i don't remember setting these up post message these look new i wonder if they're out of the box yeah this reskin i mean is it built is it is it using the ui experience definitely feels modern i can't wait to see how it reacts yeah so these are categories that was my point um i'm also curious why i've got an inactive scheduled job so if i just go into scheduled jobs and go grc i mean look at all of those some of these are data collections okay let's filter those out look at all those uh grc related scheduled jobs this is prime stuff for pushing into flow designer if you think of flow designer as being you know very at home with asynchronous oh james is here hey james how you doing sorry for lurking on your flow the other on your stream the other day and uh there's an incognito uh so my indicator nightly run yeah so i've deactivated it so i've deactivated that but i haven't activated this i doubt i've got any indicators to run but let's just check if it runs to be honest if i just say test and run it it's all part of the upgrade right completed and i've got green green signs there but does it tell me doesn't tell me anything so i haven't got any real return values in there cheers andrew take care mate okay so what was i going to do next i think what i'll do is just try and convert some of the remaining bits that i've done and whatever i've done tonight i hope that the learnings that i've shared at the beginning of this will be useful maybe i can go back and update some of them uh if if anything else comes out but really i just want to put this kind of uh idea to bed so if i go to let's think about it a control objective what's this i've seen this a couple of times natural language filter okay some neat stuff popping up so we check if explore works so we see if explores working in quebec i'm on 4.7 i probably need to upgrade it it's been tested let's just do it for some gigs look at that it's beautiful explore 4.8 is now available i haven't checked the release notes of that so i'm looking forward to getting this on here as well so in a control objective basically these controls can get generated in two ways i can go in here and add an entity i can say this actually belongs to something acme or whatever my entity is and when i click add relationship that triggers a flow through ajax okay and you can see i've got two additional entities i've got a control down here so this isn't something that's i'm looking to really convert because that's coming from the client side i've really not explored that stuff with flow designer maybe you could get the action in there i think what i found was in my kind of opening question of can i convert or how much a grc can be converted to flow designer i did feel that it got a little bit monotonous and although i can be stubborn and just think keep going there was kind of diminishing returns on that investment so i kind of stopped but i just want to wrap it up now when i click edit here if i'm mapping an entity type um which one business services probably got loads in there let's just check yeah you can see up here controls are being generated for this control objective click here to see progress let's just take a look how many entities we're talking about okay only 44. so if i did convert this this controls are being generated for this control objective and this message up here that's stopping me now from processing this because all that stuff's happening in the background i click here to see progress all of this item generation progress is handled through the item generation table if you ever get stuck in grc and you think what's going on why does this message not go away there's a little table i'll call it a little table item generation i think that's it yeah go and check this table out okay this is what's stopping things kind of handling the locking if something's got stuck you'll see it on here and maybe you'll see a record with like track if you see the track retiring or track running but it doesn't have the actual running or the retiring elements it's got a little bit caught up in itself so it was kind of that was the reason i wanted to start looking at flow designer for grc because that would maybe give us a bit better visibility of what's really happening there and if things get stuck let me just refresh this list yeah 46 is what we expect so how did that happen there's a business rule on this m2m table and from a design perspective if you look at what grc has done they've got m2m tables but they're not really m2m tables as in sys m2m tables they are just an m2m table right and if you know much about database modeling any table that's got a many-to-many relationship is an m2m table it doesn't have to be a sysm2m so if you can create a table that has a relationship to you know just basically holds the relationship by not using sys m2m what we've actually got here is an extended functionality so if i go to if i just go to list on this table when i go to dot config i can't go to can't get to the table very easily so i have to go to the list right click and then configure table to get to this view i don't know if there's a quicker way to just get to the table i just want to get to this bit so look at this table and by the way this is in grc scope and it's talking very generically about our content profile got renamed to entities so if you see me talking about entity type and looking at profile type that's just because the name got changed content is completely agnostic control objective extends content risk statement extends content so what we've got is an extension model in here which allows grc to leverage common functionality through the table structure is that a new link no added by sn utils this is not a ui action okay never noticed that before but thanks thanks arnold uh okay so show schema map yeah what you've got is this content to entity type that's a relationship so don't show the reference tables yeah content to entity type is extended to compliance for control objective to entity type and extended to risk for the risk statement to entity type you've got to love the naming convention as well just switching up so that means you can apply some logic here and get the same logic in both of these and then execute it based on the class it's really nice it definitely increases kind of reusability and i'll really like the kind of architecture side of grc so what happens if we um this is the one generate links what happens when we click edit when we're in that control objective i'm just going to close some of this down when we're in the control objective we click edit that edit button is going to either insert or delete okay so they're the two operations that are actually happening on the m2m table but because this is not a cis m2m record a true sysm2m record there's another table that hides in the background called sys collection so if you've got a table that is acting as an m2m table and you want it to act as an mtm table by taking advantage of things like edit buttons and when you click edit where does it go afterwards and all of those kind of journeys through and you want that slash bucket sys collection if i just go in here s sngrc m2m you can see okay i think i think i'm back uh so i just can't find the cable my mic power is cut so if you just let me know that the audio is okay uh try and remember where i was just chatting one off then yeah sweet thanks james yeah so the that table i was looking at was going off into i've gone well done a rabbit hole here but um loud and clear sweet hopefully you tell me that my audio now is not as good as it was otherwise that mic was not a great investment uh that table here configure this table m2m statement to profile yes that's in compliance actually so if we find that table here you can see that this is how it knows so when you do sys m2m it's kind of baked in but because this m2m is not a proper m2m you're actually kind of free from all of the restrictions of an m2m table you can extend it but you can still get all of the m2m behavior by mapping out the relevant fields and the tables and telling it you know so when you look at the edit button itself too many tabs open if you look at that edit button configure ui actions it's a custom edit button in fact it's not the global one but it's using the cis verb okay and it's got like pretty standard pretty standard stuff on here um it's this m2m syspalm stack and if you look at if you ever create a custom edit button you'll see syspalm collection and all of that stuff so that's kind of where it comes from i don't know a huge amount about it but um i've built some customer interims in the past and then had to build custom edit buttons but a lot of that is kind of can be made easier so that business rule right when we use the edit button it creates an insert or delete on the m2m table generate link sits at the central it's on the grc m2m but it just receives the class it says oh your compliance process this way your risk process that way but we've just so we've got two m2m tables both using the same central logic that's async look only triggers on insert an update because that's coming from edit so grc item generator engine did why not item generator engine yes so this is where i left off in when was it october i'm going to convert that generate links method to a flow designer action that is so i started this on orlando then i upgraded to paris maybe did a couple of bits on there and like i say i can make it all the excuses in the world but everyone's busy i just haven't done anything since so all we need to do really for this to work is pass in a glide record generate links i haven't done this for a while so let's see how easy is it so i'll go in here new action and i'm going to call this generate links application of course category oh i did do the assessment youtubers i got excited that moore had come out straight from quebec so i just wanted i can grab that this whole form is like the behavior is the same exactly like we expect it but it just feels different so i'm going to use that naming convention but i'm going to create my own action category item generator engine category there so flow designer i've got a category generate items item is a is a kind of bit of terminology within grc which comes from that extension model so an i sngrc item table is extended into the control and the risk table so when you see item it means it's a control or a risk but i don't really care what which one of those it is you get specific stuff within compliance so this is generate links my input is going to be a glide record so it's actually an m2m isn't it that's coming in the record is the m2m record so and this is the you know maybe should put this in the learnings but you when you're building the action because you specify it's a reference and you say what it's a reference to it's going to be smgrc m2m content profile type yes content entity type so actually the the other logic about additional entities i think triggers generate links but is processed through the client ajax by me specifying that reference and what table it is if i want to consume this action i can only pass in a rect a record of that class okay so it stops me just throwing anything at it that's my input so what would be my output i don't think there's a return in here it does return it returns this.getmethod and this.getmethod is what handles it so i'm going to worry about the output in a bit i want to create a script action we've lost a bit of real estate here so the ui is beautiful but now i've got to scroll down a little bit more to be just there this is going to be generate links my variable can create a little bit of duplication because i've already done this okay but your inputs here or what's coming into the action there's nothing to say that all of those inputs are going to go straight into the generate links okay but the naming process and stuff like that feels like it's a little bit of duplication but i could easily have another script sitting right next to that that is going to take one of the one of the variables one of the inputs sorry and process it and the next script is going to take the others okay and then i can process both of those scripts separately so um the sometimes with anything when you've got additional flexibility it does create additional complexity i'm just going to grab that gr record okay it looks like it's not forcing before it used to force um don't forget the name of the case where you've got i underscores that happens here maybe if you've got a space yeah it puts it there which obviously makes sense but yeah this one doesn't allow you to have uppercase not sure why why that is so because i'm in sng i see scope right now all i need to do is put i just put outputs type outputs dots i don't know what's coming back so let me just do this equals new and send grc item dot generate links inputs.grm2m and create a variable i feel like values a little bit let's go find that this is where you can really get lost in the detail generate links another tip james don't know if you're still watching but i know we were talking about streaming and stuff so um what i have done is made sure that i log into my machine on a different account so because last thing you want to see is anything you shouldn't be seeing because you're logged into the machine so i've got my own account here local account that says it's run in let's just see open it says it's connected let's basically don't want to click around in that just pull down here why is that item generator engine okay so here get method go to definition so the record comes in and it knows at this point generate links is passing in it's hardcoded generate so table name um gives me the class name it knows it's extended okay so obviously you can't call get record class name if it's not an extended table does it try catch i probably don't do enough of them trying to be probably more defensive in my functions not sure which is is better to be honest uh so set strategy is where it really gets it's so look at our what our table is it's sm sngrc m2m content in fact it's not because we're coming from now we were in control objective so the control objective table is just so this is how it knows so it's coming through the logic is triggered kind of centrally on the base table no results maybe it starts with the instance of okay sngrc content no instance of so it doesn't need the full name oh but it's an instance of content profile type okay so it's dealing with the base one here set strategy again let's go and look at that we're on line 68 set strategy so it just doesn't match it doesn't care about the thing so it's gonna call compliance generator strategy okay i do love this kind of strategy pattern and indicators as well and when you've got that kind of central functionality and then very much i think they called it in the design principle something like scion applications the strategy patterns work very well actually and indicators use it based on the type of indicator you're executing a lot of core functionality in the kind of base apis and then you've got the specifics out in the relevant yeah strategy classes obviously from from this perspective it's classifying it based on the um based on the application so this just gets the strategy which means that we can call probably a run or execute file but line 68 is where we were set strategy operation is generate so let's go and look at this but notice now still not returning anything so although we do return in that first instance generate items to content type there's nothing getting returned so my action can never really pass anything back yeah it doesn't return anything okay so i won't bother with my output in my flow designer i'm just going to say here new and what that means is i just lack a bit of visibility when it comes to debugging it okay so if i want to know what's happened with it it's great i can see it's called it i can't see you know how many or you know what did it actually do at each stage so generate links and it's literally that's it's that simple if i save this so one of my findings before quebec was no option to unpublish an action once published so if you get a record in explore you can run it and see the output exactly okay uh you start going down the road that i was talking to you about of um when i start clicking into the object you know that's this is you know i've already generated the links and i could have generated thousands of links right i could have depending how many entities are in my entity type and how many content control objectives i've linked it to there's a whole heap of processing going on there and yeah i don't once it's run it shouldn't run again basically it should have already checked itself i'm going to look and come back to that point james and c so if i click publish so i'll publish my action that means i can then consume it and i can also get my code snippet now i couldn't get my code snippet before i can't unpublish it i haven't called it from anywhere can't make it inactive action preferences is that new school toggle show inline script toggle i don't know what that means i can't unpublish so that's for me a little bit of well if i made this by mistaking so i don't need that which i did do a lot of data pill picker for value just meaning the run yeah do you know what actually um i'll do that a hell of a lot right so and if anyone's watching this and we've ever been in a technical interview or anything this might be a little cheap i'll know sure so [Music] let's say i ask you how do you debug an asynchronous business rule that's a beautiful question because there's no really right or wrong answer and some people go down the road of i'll put loads of logs in i don't need to do that right i'll just look and it might not be an asynchronous business where i might be asked the same question and say what about scheduled job it doesn't matter what that is i can and this is not the best scenario because once the record's inserted the process is run um unless i go in false and insert the record onto the m2m table i need that current but this is what i love explore for this exact purpose if i go and look at my m2m record here and go open and explore i've just shown this to someone earlier actually i'll just change gr there right i'm not going to get into the conversation about using gr i know that's a sensitive subject so the other thing i do is i've got a stopper on it already i'll then fire up too many windows open as usual for a script debugger i wonder how this looks in quebec script tracer i've not looked at that yet i've not even read the notes properly on it so yeah if i run this um and this is another another reason why i love explore because some apis are locked down i'd love to know jace actually i know gr's fine and i i'm stubborn right so i say if i write a function called um do something pass in a value let's be anal right rgr now equals so that is my you know new glide record new glide record right and this will be my let's call this table name so if this is okay let's take an exact example because otherwise i'm trying to be too abstract so this is the control table for example and i'll call this activate control something like that and this will be id and then gr dot set value active true i'll tell you what i love to do i should use brackets i'll just put a one-liner in here return fault like so then i failed but otherwise i don't need to worry about trying to keep inside curly braces and messing up all my indents yeah i set value and then gr.update for me gr now belongs to the scope of this function and i don't need to name it control okay because like i've named my function nicely as well so i spent a bit of time arguing the case on this but ultimately yes gr's protected exactly you could but it's gonna fail in a code scan it's going to fail in the code scan and i'm going to get black mark against my name and have to rework it so i think there's still a scenario i was talking to some some of the old guard maybe people have been around active tree you can see you can see them see them a mile off um if you think if you call something that rewrites gr like a business you want yeah there's not there's something where it doesn't matter how kind of encapsulated it is it could break it's a very rare scenario but it could happen um and for that reason and for the reason of not wanting to show up in any especially i'll actually look at instant scans as well i just call it that right and i've given up the argument and i'll take it if someone gives me a convention i can follow it and depending what happens you know maybe it's even more readable it takes me a few moments longer it's not a problem anyway we got distracted so i'm going to call this api method and i've got script debugger fired up nothing should happen because the m2m already exists but i can catch that so how'd you debug an asynchronous business rule take the asynchronous piece out of it the fact that it was triggered asynchronously um if i want to know what it's doing or why it's not working or what it should be doing sometimes debugging isn't about fixing something that's broken um it's just about checking your code works and does what's expected so i'll just fire it in here say right okay yeah some service now stuff that runs inside your session can still break so somebody uh who i work with showed me that and they we recreated it and it was that at that moment that i gave up uh gave up arguing i thought what okay so it shows up in code scans that's enough really but the fact that it could break on this one scenario but i couldn't remember what it was and he can't remember and it's broken anyway um i am going through a function which i didn't mean to click into don't really want to go through a utils yes so is instance up it's a nice feature that checks the glide table hierarchy okay because we use a lot of extensions in grc is instanceof just takes the base table name the current table name and good to go but you can step over these functions problem is if you step over too much you do miss out but it should go down to not this one i think it's this one so it should go into here ah did it wrong let's avoid the glow just get away from it i want to go into set strategy and i don't want to go into the control generator strategy so this doesn't work anyone know how to do this on a mac option f9 does this going to work now i do let's go what's the other one option f10 ah it doesn't work he wants to tell him to turn my sound up i'd love it actually that was a keyboard shortcut if i've got to do function option f9 oh beautiful does rely on two hands max is almost quicker i am not getting into that conversation james uh yeah just avoid just avoid it don't do gr save yourself some hassle and no further comments what a business rule for assessment so there's loads of them in grc and uh they hard code systems in there but same with um state flows actually anyone got an opinion on state flows good or bad are they they don't see much talk about them but you know what all i was trying to show here going through real detail that i don't need to go through i just wanted to show how i would use explore to be able to access an api that might be locked down i can change my scope and then i can catch it in script debugger and then i don't need to worry about the fact that this is asynchronous okay but what i'm going to do i'm going to deactivate that business rule ah i've done it too early actually so luckily no one's on my instance i've got the action set up i now need to create a subflow generate links and hopefully my category is there now yes we can reuse generate links okay so again it feels a little bit like duplication at times and actually accessing there's no output coming from my action anyway so let's create an input this is going to be my sn grc content m2m content content entity type that is mandatory can't do anything without it that's my input defined my action is my action which i've pub and it's under item generator generate links pass in my input here that's done publish i've got generate links on there to generate links just thinking if i removed it get method generate links my business rule is getting called when insert update ah i missed this earlier i was talking about the edit button to actively a bit too excited so insert an update but not delete so there's another one called delete links delete links it's basically going to be the same thing that runs on delete this throws an event cue okay it's gonna get a bit more complicated stick let's stick to this generate links now i need a flow because i'm replacing a business rule a category on this run as the user who initiates the session you don't get that option in the business rule it's the first time i'm opening the new flow create a flow welcome to let's take a tour is this the new tour designer uh the guided tour was this only in flow designer what's the purpose of the subflow i think yeah and when you're doing a one-to-one kind of action to supply don't feel like it's necessary but let's say that i did want to start building it out later i know for this case it is a little bit trivial um i don't really need the subflow here if i'm if i want to call what's the difference between calling an action and calling the subfloor i guess a subflow can do a bit more with it so maybe what i would do is like the scenario i just showed you in this case we've got a business rule that does delete links and a business rule that does generate links guess this is behaving slightly differently we can probably if i planned any of this stuff and actually thought about it we could probably call the subflow something like manage links or handle links or something like that and the subflow could then make the decision on the operation or take a condition in here right so you input could be operation and the flow can handle pass the operation in but then again you could do that in the action you could you could take it in here and take your inputs in there so i don't know i know we had a chat on um the live coding session recently and wrapping things in sub flows i think the main point is you don't need to have a flow you can call a sub flow by copying the code snippet but then you can call the action by copying the code snippet create code my action's not i changed it you can't unpublish an action i did i mentioned that now i can create a code snippet even though i could call it so in the flow add a trigger it's going to be created or updated and the table is going to be smgrc content no smgrc m2m content type xd type and the filter no don't need a filter there's no condition on there and to run just after asynchronously so i want to make sure this bit always always gets me you don't have this option in the business rule your run trigger once is for that record but then it wouldn't be created or updated i guess you could say yeah created or updated i only care about running this the only time but it's got to get created somehow for each unique change i just go for every update because i'm not sure i guess there's a performance benefit yeah so definitely two actions that would be cleaner but maybe the subflow maybe we can consolidate with the subflow the one thing i did start when i did this was to try and um do a like for like okay so because i was looking along the way going oh that could be better that could be better and i'll be refactoring and really what i was trying to do is just test out flow designer and see about you know where it fits in run for both interactive and non-interactive sessions i can't think where you would have a non-interactive session because it's the user that's doing a map in run for any user yeah and run only on yeah we want to make this is important okay so we want to run this on extended tables okay so that wasn't an option that i remember before but looking at grc extension that's very important here not all things should be run again yeah i'm just struggling to think of a scenario where where that would apply right now so if i talk about a like for like then the business rules not going to have that consideration but i like the fact that this exists and run the flow in the background okay so this is our asynchronous then we're going to call our subflow and send a profile says undo and now we've got capitals generate links and we pass in our record which is our guide record of the m2m wait for completion what does that mean oh i guess no it's not i don't know if that was there before but i guess if you won't be able to access the output i don't have any output so i don't really need to wait for completion might not feel things in general it's not used frequently especially dealing with integrations yeah i think i can think of some scenarios where it would be beneficial to to make that decision and certainly the fact that he's considering it but probably in this current scenario i can't think of anything that that would apply to so i'm going to save this i'm going to activate it i'm going to map an entity type so let's go and see what happens let's go and just check entity types i did business services before business applications got anything yeah 86 in there lovely i should be testing the performance out so that's in here i can do it the other way around i can attach a control objective i just need to make sure active is true and create controls automatically it's true run that filter let's throw a load now i've got the messages that's good so i've got 86 times 4 what's that 160 320 [Music] 344 controls we should get so all of this is handled by the api itself by writing to the item generation table and you can see it happens sometimes when you install an application it tells you it's 100 and then it drops back this is not a huge volume for grc but the benefit i'm hoping for here is when i look at the executions we can see generated links how long it took and this is for each record so there's four of them i wonder if that wait for completion it won't queue things up i don't think they'll all be running asynchronous and they queue up on the kind of um on the workers it's been triggered four times and it certainly looks like it's generating some stuff now let's drop right back down again just going to dismiss that let's just go and look should have 86 controls on there so you can see that entity type is visible from here a little bit of a performance issue but i think it's local because at the same time i've got a youtube error i've got 86 controls okay so what's different about accounting as a success what do before is generate links okay that's done but generate links is actually triggered from multiple places so if we look at it maybe which one to use for tables but this is sn grc m2m content to profile type there's other places it's linked right you've you've got you know what if a new entity arrives okay that meets the condition of the entity type filter so the trigger point there would be well i've got a new business application it would map the entity the profile to the profile type table and because that profile type is already mapped to four control objectives um it's then got to go and create four more controls for each of those control objectives okay so there's various trigger points for generate links and this is the one that i've i've done there'll be another one for something like i don't know if it's profile to profile it's high for profile profile as i say that's been renamed so in the application it's called entity type which certainly lands a lot nicer just to see if that's completed yeah that's all done and then the messages go away and now i can actually work with this record now so a little bit slower than we'd like but i don't think that's anyone's fault i think it's just my network life is anyone's fault my isp this looks a bit more interesting how long have we been going for we've actually been live from now on 15. i try and keep used to an hour and 20 because i've divided 24 hours by that amount and it meant that i was gonna be doing around 18 shows but then i haven't done one for four months and figured i really want to wrap this stuff up so i did the learnings at the front i don't think so far i haven't learned anything additional this is actually putting the item processing into the business rule itself add processing content why is that okay so that puts that puts the record into the item processing this is asynchronous ah this is after of course it's a delete so maybe that's why that's why they've broken the business rule out you because want the delete to have a card before you start triggering all this logic you did it as asynchronous that cascading effect could be problematic and and it is problematic at times depending on your volumes so i wonder if that becomes an action event q is not necessary because you can okay i'm just trying to think why why this is handled differently so we definitely want to make sure that that happens before that gets triggered there a way i created an action before in flow designer to call an act because that doesn't exist out of the box from what i've seen so i kind of had a recursive flow designer thing going on that was saying well i need to call myself i can't remember the exact use case there was no action for that i couldn't say caller call of flow yeah i got the flow to call another flow it sounds like trouble but i'm wondering if you could have an action so although the flow might be triggered synchronously it would call an action that so this bit would happen synchronously but then this bit could be handled as call and action asynchronously because that's effectively what's happening in the event queue and therefore you're not going to be stuck with performance but then within the existing api for generate links generate links generate links there's a get method we jump down to m2m here it's in the strategy i think generate items else if operation delete i wonder if that event queue what's it called smg see delete links yeah record decode so i've got something in here about objects i'm struggling with using objects not just previous objects here still not sure how to handle object of arrays and objects properly so it might be a place to explore that because what's getting passed in why does that need to so event dot palm one event palm one is this coded json wrong to call it a it's just actually an object this is my life explore again so if we go in here let's see what that actually looks like this would be my event there this a is bit of syntax highlighting would be amazing if i could just click that and know where my end bracket is but it keeps us alive so let's just see here is record really a record cannot reach this id from now oh sorry said a bad word fill that out um so looking at control objective that's an mtm record there so let's open that in explore it's an object not record i suppose it could be handled like a record maybe it's acting as a record yeah because when we get into the api then go through the script action where did we go with the script i think you can see all my tabs try to hide my address bar where's my scripture i am going right down a rabbit hole i don't know how many people are still following this it's great to have you tuned in now if you asked it around good turnout best turnout of the year delete links is my script action so this is what captures it right okay so then that passes in delete links there so delete links comes in as record and because of that get method record so look yes so that's what the choice for okay so the try doesn't crash out so the try is not it's just i mentioned this earlier if it's not an extended table and get record class names not available but because it says that's not good then it doesn't throw complete wobbly catches it but we're not actually handling catchy normally that's where the script ends but actually it's hand so you've got another one um try is it until what happens or try catch final is it now james that's what i'm saying so record is not glide record it is when it comes in via the generate links okay so the generate links business rule it comes in and it passes current which is a glide record okay of that same of that same record but when we go to so generate links basically hard codes the the operation let's generate delete links because i guess generate operation could be insert or update but this been consolidated they said it doesn't matter if it's insert or update it's a generate links situation but here it's definitely a delete but both of them reuse the get method passing records so up here it's a glide record down here it's not a glide record but we want to have common functionality so it handles table name if it is a glide record which we try then it gets record class name and it knows it'll be extended however if it's not a glide record or if it's not an extended guide record i think in that case that would fail if you passed in the wrong record it catches it and that encoding of the json via the event is acting as a record so what gets encoded all the things that we would action all the things we would access from it table name what's the word when you're acting or something so we've got all the options in here posing as no so here we go of course delete links so the only difference between that business rule it runs after on the generate links how's it handling the instance processing i don't understand why it needs to be different if you trigger something deleting and it throws the actual process in asynchronously anyway it's just pushing that at the top i'm going to create an action i'm going to keep you open some flow make better use of this so this is going to be you see the screen switching item processing utils flow designer processing utils add processing content ad processing content item processing details it's going to be my category got naming conventions consistent there processing content that's my action that's my input my d it's my d state okay so i'll pull that down if you change it to a reference you could force it so my input is going to be is there a type cis id oh there is wow didn't know that so that's going to be entity type id and the other thing is the type of that so item processing utils and processing content i think that's called an action this is how i end up with so many tabs open it's read only i was thinking it's going to be protected then add processing content to your profile type id content process so wow i'm gonna emulate the whole action now and i can reuse it differently if i need to so document id it's not mandatory profile but that doesn't actually matter in here i don't think i think the ordinance although you can move them around don't do a document profile yet so add processing content it's going to return it so we don't know if it's actually occurred get glid record another good record processing content so i think that's what i need create app from payload just saw that sounds interesting this is going to be let's see now i've got to recreate why can't i just you can see why i stopped doing these episodes system i haven't been have i against process that's all we need there and then i'll just grab the top bit it's item processing utils new item processing until we've got processing content what does anyone think about not varying each line you've got an opinion on using the comma my i do love this especially when the format is applied right now obviously it can look a little bit illegible but script debugger processes that as one single execution we need a formatter in this script thing here i just need to not just for formatting but just needs to be a little bit more a little bit more in there let's do this and change to javascript i think this is where you said there's no shortcut for that but there is a shortcut for this no why don't you perform that i've got to be on a new line do that myself process yeah if you're debugging and maybe even your variable assignment you call a function and that goes off and that goes off script debugger executes that in one line so that is an argument for doing it in you know var var because you can actually see the results of that where it might be failing that's what i wanted don't found any other situation where i wouldn't want to use a comma yeah when assignment goes wrong yeah exactly that's the only time that i've found i'll interesting if there's any other cases i think it depends assignment can only go wrong or not can only go wrong with the temp fate but um assignment usually if it's going to go wrong it's where you're assigning the results of another function so if for some reason that function fails you forgot to include the namespace or whatever then that might throw a wobbly and you don't know if it was that one that one that one or that one so there i think definitely separate vars um in this case yeah it's just passing this pass through right sweet so that's going to create ad processing content item processing utils doesn't return anything there's no outputs i've got my things assigned so you see that it doesn't care what order stuff's coming in on it just has access to them but let me show you examples when i'm handling an object maybe that's applicable for the next one but ah variable doesn't care okay so you decline you define the data type here let's cover on the next bit because this is just for item processing utils the next one we're going to actually pass an object in so that's add processing content i look at my business rule it's going to add those things so maybe i'll combine these in the sub flow the subflow will combine the two bits of logic oh yeah that's why i kept that other subflow open let's see how that plays out event queue i'm going to encode so what's going to trigger it current's going to trigger it which will be the m2m it's only cue in the event because it's asynchronous let's look at my existing generate links i have to go here to open action generate links could also be null pointer not sure what you mean there james so at this point generate links receives the m2m and just fires that m2m in as the record for the generate links yeah do you know what i didn't even notice that i didn't even notice but i think this is using in code isn't it yeah i didn't even notice new global.json.encode json.stringify was there ever any benefit or was it that jason was just not available was the native one just not available why would you why would it not have been available so it's this id table name so if i'm just thinking i don't need to encode that but delete links i can bypass a whole load of that i don't need to pass an object in it's only passing the object here because it needed to stringify it okay to pass it to the event queue to then decode it or pass it parse it in the script action i don't need to do any of that stuff do i because i can just look and i'll copy action i'll call this deletes yeah it was sorry james it was not available but was there any reason for it to not be available was there any benefit yeah just sometimes just decisions are made i guess so here i've got an action called delete links i'm going to rename this called and generate things to delete links i'm going to pass in the gr m2m and here delete links i think if i look at the script links record okay so it's expecting it's expecting to be sent and handled here as a as an object i'm going to pass it in as a glide record so it's going to get here anyway there's no difference i don't need to do i don't need to do any of that json stuff either it was only being encoded to have to go on to the event queue so that it could be picked up asynchronously and the business rule was running after but then it wanted to throw the event so that it didn't get hung oh ps5 going back some right okay okay so i've got delete links got an action but can i handle this now in my subfloor so i've got an action for add processing content generate links in my subflow let's add an input which will be called method operation let's call it operation that's a string that's mandatory you can set a default value now just checking if you can you can set max length okay so i need some flow logic down here flow logic is going to be i'll just do a switch what do i have to do if because it makes too much difference if operation no sorry that is the name okay so generate or delete it's the name of my condition so when i collapse it i think it looks a bit nicer so here guessing that it's a string unless otherwise then i'll drag you to there if generate ah okay so that name's wrong generate if generate generate links whoops if generate else add action will be drc profiles add processing content and then delete links and add processing content i'm going to take the content id which will be and actually that was expecting a good process it's going to be was it retiring i think where are you delete links retiring process is retiring that's where the order might be nicer profile type id is are you not available on the m2m let me just save that i'm either being blind am i being blind my m2m record my input is an m2m yeah do you know what james i don't like to if i see that happening in the script then i want to see it getting strong that's the right word so even when people do gre calls whatever um i haven't set my default on this i think that's the only problem with using a different login so gr if i would said like my id equals gr dot sys id that to me stands out a mile and i get a bit upset about it i don't know if i should spend my energy on different things but i always make sure i string something if especially if i'm not walking it there's no harm in doing that and in that case you know you're dealing with a string it will save your aggro later if you're doing an array push and all that stuff but if you just do this then it's actually a glide element glide objects element glide something if you are doing a dot walk to a field so let's say you send out that content content on its own is a glide record but if i do that is the id of the record right in the flow designer we specified our action input actually our inputs add processing in here we call it content id and it's a sys id guide so i wonder there yeah it's always a glide element object okay what let's see what let's do this so i've got gr here you can see the top can you see you should be able to see up to flow design flow design yeah you don't need to see my address bar basically i know i switch tabs you can't see how many tabs i've got open so gr gr dot sn you can see a scoped glide element grc content if i just return that i can see it's a scoped glide element if i do that it's a string if i did i don't need to you know what i don't need to do half of this in xbox it tells you what the type is anyway it's not doing type of without type anyway that's my point if people do that in a in a script if it might be fine like most of the time but if you start getting some funny behavior you then got to question it is it that whereas if you just string it each time if you know you're dealing with the id you want the id just string it or get unique value but then i've been told that won't always be the cis id if it won't be the cis id what what could it be when could it not be a cis id under what scenario because i do love that but then i use it with a little bit of kind of hesitation you know i'm not sure if i should be using it all the time so i'm curious when we shouldn't use that get unique value i do get value set value and again i'll mention travis's king of the string post which gives you a lot of pros and cons things maybe you haven't considered when when you're working with glide glide records get values and strings so what was it doing passing in our legacy tables that use a different uniquely we've got any examples of some james i know you've been around the block mate but when i'd love a scenario of when it's not just you know for academic purposes more than anything so what was i struggling with oh yeah grm2m where's my profile type what's going on here what operation is an input the glide record never seen it yeah the it's a myth so my reference i can't see what my reference to i can't debug it let's say check that what are you pointing at ah there we are pick up content to entity type so just send grc m2m content entity type dot start with list let's add another tab don't tell me don't tell me that the base table doesn't have entity type on it and it's in the extended table i've seen this on a couple of tables but not i didn't realize it was on here so if i go to compliance that's going to be called statement profile type list configure this table control objective here i understand control objective because you want to have a reference and i know that backfills itself so when you set the content checks the type and it populates the compliance statement therefore you've got access to that and you don't walk it accordingly etc etc that's an sngrc field why is it not on the sngrc base table what does it need to be oh that's frustrating so now something like that would never matter because you can always just go you can just kind of i think dot walking can be brute force sometimes even if it's not on the base table smgrc m2m content profile type there but if i do a gr dot sn grc profile type ah hopefully he just goes to sleep if he starts snoring then i have to kick him out he's a good boy he's just loud yeah that current.sngrc profile type it's undefined i always felt like why actually got gl here yeah maybe it's in a different script so we're saying in script you'd end up doing another glide record look up on the child but i thought you could still access that even if you're querying it from the base table it doesn't exist maybe not why is that why has that why does that follow me so interesting then from a i can't access it can i add processing content yeah because you can do a get class name on the gr that's coming in and do a get against the actual class and end up on the right white table oh that's from me that has so why am i doing this at the i'm doing this at the supply level then you have another wave what i did get the record look up record the table the class and paste that here short description let's try this i don't know i never mess with fd object to be honest script must return a value dot oh that's nice that's a new feature isn't it dot okay get class name what is it i'll get class name get record class name so is that populated now okay okay excellent so that's kind of saved it so it's turned on if i do that i've turned the script off if i do that and then collapse it then it's set so i've got the class name lookup record conditions well sis id select the table class okay query no this idea so return seems like a lot of faffing about wouldn't they just put the profile type on the post table uh don't fail on error look up record still doesn't know what class it is i have to be agnostic maybe a scripted variable i'm getting a bit lost here bit too deep okay profile type id still doesn't know what it is can i do something else get rid of that one down here that i need it flow is set flow variables this is what we're talking about so select a flow variable variable how do i get flow off do i have one here no select the flow variable variables no data available let's just save this if i can knock this one on the head here we are data no data flow variables no data available change defaults i've not invaded the docks on that i saw that and i thought that it was a flow variable or something that was going to be available to me throughout the scope of the flow cheers james thanks for tuning in mate um i think i'm on my own with this one i can see the the viewer numbers drop in uh it's getting late um but yeah thanks for tuning in man uh give me a shout let me know what you think take it easy um what am i going to do so can i just get if statement here if let's check condition one if gr this logic the docs so it's my own fault so if class check says right using flow variables two hours i think no this is not the same thing this is not the same thing this is paris yes i'm just reading the blog here from flow designer future in this one andrew barnes yeah talking about legacy legacy kind of scratch pad how do you set the action picker the visuals are lovely i'm really loving that embedded at all okay here's the link set flow variables flow designer yes it helps me to store some data with the flow that isn't directly tight one of the records the concept game changer it's not even that complex the logic i'm doing here you create the variables from the more actions menu in the top right of the flow should be simple four actions i'm missing something well fly variables i am missing something right this is beautiful this is what i wanted so i want to get profile type id so if your compliance then get the record it says lookup record get record would be lovely if you just had an action you probably create one just return how easy is that to do i'm going right off track here get record profiles input will be name mandatory script sorry my dog thanks for tuning in mate yeah cool take care mate i'm going to finish this off i'm going uh going deep now i've forgotten where i was equals great variable won't be mandatory because i might not have got one okay so can i save that save that publish get record does that save me any time in my sub flows i don't want to look up a record id is you where are okay well i know at least in this case and then assign a setflow variable profile type id equals get record okay let me save this computed the whole thing simplify variables can i get access to get record how can you not have a guide what type could it be reference so i wonder what you can't look at the actions that exist because the lookup record a documentary it's an interesting variable what's in there okay let's do an object let's see we need from here but then it doesn't know it's class so get record even though i've told it what his table name is i can't access it i can access it it just doesn't show in the picture get record no data available interesting i'm glad that i didn't break the action i hope so my profile type id is set there if it's compliance else here helps must be yes [Music] risk variables that's flight variables i've set itself to itself ah [Music] get backward can i access the data halfway sold it then yeah lookup record all of this because the table wasn't built correctly in the first place and now i was at the start of this saying how i loved the table architecture i'm in a subflow so that generates links else and processing content so in here is there any see what i'll do i'm gonna go and modify my get record just call it get profiles get profile id to the name i can change reference which is two script here um um record okay h even if you're going to put it on one line use your curly braces this needs a formatter in this code section that's going to get me then the profile type id excellent save them so i think it's letting me use actions before they're published so in my generate links flow i'm going to get profile type id and my m2m records will come in here my output have you seen their data available my get record probably would have worked i've not mapped my output so i've got an output but i've not mapped my output i'm just going to do this second brevity oh that's why there's no available so that probably get record probably would have worked might come back to that it's getting like yeah it's getting very get profile type id now just change something this will have profile type we're still saying no data available save it and close it and reopen it i've definitely mapped it now available it's because i'm not published yet ah amateur amateur hour now i can access it all right i want to know if my get record would have worked in the first place that's very frustrating just to get a profile type idea that should have existed in the table oh well so that's going to throw that retiring content id here continuous id delete links parsley i don't know if there's any benefit the fact that so this is from recap for anyone that's skipped along a little recap video thing so yeah delete links is that's the script action deep links script action delete links business rule triggers after but then it just does this and it throws an event i need to throw an event oh we're not passing in i don't need to pass it my dog's getting noisier i think so let's wrap it up i think we want to test this save it outputs yeah operation so if generate there save that we go back to our main flow publish and make this delete and close these close is called generate links generate deletings properties oh excuse me that's my chair um ah wow before and delete options this is even in my findings wow that's a whole lot of pain but it's a whole lot of pain generate links okay save this actions is cooling subflow generate links if i copy this software and i'm going to call it delete links it's not lost not all lost delete links okay i'm going to get rid of the branch in this is delete links so i can't move tabs tabs it's not going to be generate okay and whoa delete the whole thing no leave get the profile id don't need operation save publish i don't know if the camera's a bit low or am i sitting a bit low for the camera maybe delete links generate links i don't need the operation anymore at least that's what the doctor said so delete that generate links i'm not trying to pass it anything am i yes probably got a flow variable that i don't need so that should be back to what it was calling from generate links yeah subflow is activated activate that subfloor delete links um so what i then want to do is copy create code snippet in here i'm just going to throw in inputs grm2m equals current in there outputs spaces and tabs very minor issue after delete okay you know what you have to learn your lessons i've even written that down there's no delete so definitely got some lessons on here yeah findings see before delete that one needs to be up folded once a bit into one shot i guess designer it's active updated flow designers active published no executions on here some executions from earlier let's go to our table control objective and i'm going to take you away that should retire those 86 controls 36 entities in here that's a delete see maybe because it threw that asynchronously it's not telling me about tracking these wires been triggered error ah what's the error open an operation for you undefined value has no properties okay action what's he saying execution operation the undefined value has no properties input.grm2m so sapphire that's done flow variables don't mean something comes in okay so let's get rid of you just get rid of fact the profile type is not available on the base table you ruined my evening it's really upset me nice let me copy that i don't think there's anything wrong with it got triggered although there shouldn't be a problem copy that i'm going to revert it back to out of the box and i don't need to send you thank you supply next control objection the problem is the delete operation was successful so my m2m's gone but my script failed so i've got 86 controls they're all there but lost their what's their heritage so i have to add you back in watchful designer for the operation generate links executions that's one just now is it yeah just now complete successful not an issue there wasn't much to do with that one because all the records were already there but then i want to take you away which is the delete i'm not seeing a message on the screen it's complete it didn't error so i avoided the error let's go and check those controls should be retired basically well that's another one thing it's kind of being generated sng stuck see track retiring just try one more time oops generate links complete just now just now so that's showing me the action okay so that's actually changed it's the operation if i go back to flow design and look at executions which was the lowercase one that's the actual subflow says it's run successfully on my findings this is i've got the i've basically seen two records there because of the flow's been triggered and what the sub flows now the flow is called the sub flow okay but we don't see the actions so maybe you do see flow subflow let's take that away now see if we can get this working let's just check the item generation table take you away delete things this is completed oh something's not working on there not sure what it is and it's getting very late we've gone well over time try and do these things everyone's dropped off trying to do these things in about an hour and 20 minutes learned quite a bit tonight had a really good turnout i appreciate everyone pitching in getting involved um yeah i'm not sure i'm going to do any more of these so what i'll do is try and just going to export the update set basically you can now publish customizations the application repository okay i don't know if that's possible on a pdi customizations to the application repository go to the application record and use related links you know if that if that is accurate it could be a bit of a game changer for customer implementations rather than update sets i need to look into what that means i'm going to export that to xml i'm going to go to connect and share ah while we're here let's download 4.8 like that and what's happened here you know anyone who downloads this please don't put it into a customer instance just play it with okay this is what is it app extensions product grc um the explain more okay uh flight design conversion conversion gfc okay whatever one it's going to put in here this is uh this is just a areas limited support will be available isn't it this is basically this is not something i've built for anyone to actually use i just want to share it okay it's not it's not for it's not really for production consumption and i'd hate for someone to feel like it was in any way test it if you want to see some of the testing that's been done check out the last 12 plus hours of uh youtube youtube streams version 0.01 it's actually version number three it's public compatible up to quebec started in orlando paris police exploration of the teacher how do you say that without sounding what's the point of sharing it then but just think if someone wants to stick on their pdi and play around with it don't i'm a bit worried that people might feel yeah delete links is not working it's a pain lost a lot of time on that tonight let's save as export as pdf all pages a different account let's see if it's gonna let me export it yes this one do that see maybe someone's tuned in this late hour i'm just finishing up tell us what files yeah have a bit of fun with that so we had an audio issue tonight what else what do we do we had an audio issue mic cut off so i need to make sure i've got the power cord for that i hope the audio situation hasn't been too bad i'm running straight off of the laptop i've got a dog in the background that's snoring he's obviously very tired i've got pink hair still which i died in october for you can see the the pink that way the pink ribbon for breast cancer awareness and then the hairdressers wanted to lock down what else yeah last session was in october november maybe so a few months ago and this is the wrap up the lessons learned i think have been reiterated but you've got to learn your lessons i knew that delete option wasn't an option i spent about an hour trying to handle it took a quick look at flow variables in quebec the new ui for flow designer but yeah there's basically limited benefit of continuing to try and convert the whole of grc into flow designer but i think it proves the flow designer definitely can solve a lot of problems glc is a very complex piece of application suite so for me flow design is just the the way to go for a lot of things the ability to debug it etc obviously there's a little bit of ground work to do if i'm building an application from scratch or even an extension you know then that's going to be where i look to put my triggers and even just actions and so on there's so much configuration there unfortunately we still can't do before and delete in quebec but um i've got lots more things to try and dig into on the platform script tracer instant scans play around a bit more with flow variables what else is coming she's out there lots of stuff check out quebec thanks everyone who tuned in tonight it's been an absolute pleasure i've gone way over time and yeah just really enjoyed really enjoyed uh getting back into it tonight but yeah take care stay tuned on the community and yeah stay safe i guess thank you so much you
https://www.youtube.com/watch?v=KKfFTWmEIJs