Office Hours: ImageNow Application Plans

Perceptive Content Application Plans, occasionally referred to by the legacy name LearnMore, are powerful applets within ImageNow that allow you to interact with other business applications – local and web-based. Application Plans most commonly allow you to automate searches based on an open record in another window, or retrieve and index documents with keywords from the open application. To accomplish this, Application Plans sometimes need to be manipulated with VB Scripting and/or AppGetData for shifting values in third-party applications. These customizations are typically completed by your consultant, but can be learned and used by system administrators, as well.


Michael Madsen:

All right. So, I’m going to go ahead and let’s just jump into my little PowerPoint here. Welcome everybody to RPI Office Hours. If you haven’t done this with us before, it’s just something where we’re trying to show you some functionality with stuff that we’ve worked with in the past, to hopefully help you out with things that you need for your business.

See if I can close that, there we go. Okay, so we only have a few slides to go through. Essentially, what I’ll do is just kind of talk to you about some upcoming stuff that we’ve got going on, kind of give you an idea of what Office Hours is, and then we’ll just jump straight into our Application Plans presentation.

So, first of all, hello, I’m Michael Madsen, I’m a lead consultant at RPI Consultants. I’ve worked with Perceptive Content software for around six years, specializing in Back Office and Higher Education solutions, but we also kind of run the gamut on all the other types of businesses as well, so not just focused on those.

We have some upcoming webinars. We generally do webinars every month. The next one coming up are going to be just a what’s new in Kofax, and what’s new in Kofax ReadSoft Online and those are both going to be on November 6th, so if those interest you at all, please hop over to our website and sign up for those, and then the next Office Hours presentation is going to be on November 15th to talk a little bit about Perceptive Experience, what you can do with that and how it works.

To give you some background around RPI Consultants. We have over 100 full-time consultants scattered throughout the country. We have offices in Tampa, Baltimore, and here in Kansas City where we’re located. Most of our Content and Process Automation consultants are in the Kansas City office. We specialize in a lot of different things. We can cover any consulting needs you need. We have project managers, we have technical architects, we can kind of do essentially your one stop shop for consulting around your imaging software.

And then what is RPI Office Hours? I’ve mentioned it a little bit before, but really what we’re going to do today is go through the AppGet tree functionality around your LearnModes and how we can work those in. A lot of people had issues after the ImageNow upgrade using the older functionality that caused some things to slow down with their application plans, and this is a way to fix that to get around those issues. I’m going to give you a live demonstration on what we’ve built in our test environment and I have some VB script code that I’ve put together to make it work. Feel free, if you want the code, you can request it from us, we’re happy to give it over to you so that you can play with it yourself in your environment. And kind of teach yourself some things.

We have kind of a basic presentation, so just keep in mind there’s a lot of stuff you can do with this functionality, so don’t feel like what we have set up is your only option. There’s a lot of stuff online, you can go to the community portal website where you can find a lot of knowledge-based articles around how to do accomplish specific functionality and then I’ll also show you on how you can get to the original setup guide for what we’re going to be using.

And then after I go through my presentation feel free, or even while I’m giving my presentation, feel free to throw questions into Go-To-Webinar, and we’ll try to hit those.

One thing to keep in mind though is that any recommendations and advice we provide aren’t guaranteed. I’m kind of just working through this with you, and I’ll give you as much information as I have. I’m not going to know the answer to every single question right here, and we aren’t going to have enough time to cover every single thing, so just keep that in mind. This is really just supposed to be a jumping off point for you, so that you have a better idea of what you need to do to get this done. And then obviously if you do do this, be sure to test in your test environment, not in your production environment, but that should be pretty obvious.

Today for application plans, we’re going to be talking about the AppGetData functionality and we’ll be going through VB scripts. It’s not a huge presentation, we’re just talking about AppGetData, to try to show you how we can get around using the old AppGet tree, but that’s essentially what we’re covering.

Let me flip out of my PowerPoint here, and I’m going to jump into our test environment where I’ve got this started. Actually, I’m sorry, I’m going to go first to the documentation. When it comes to the functionality that we’re talking about, technically Hyland does not have documentation around how to build this out generically. They have it only the documentation specifically around Ellucian. We’re just going to use that, because it is functional with other systems, so I’m just going to show you how to get the documentation to give you the jumping off point, and then we’ll kind of edit that code, or I’ll show you what I’ve done to edit the code for us to make it work with Lawson, because I’m going to be using it with Lawson for the example. will bring you to this page where we have a whole bunch of different documentation for different Hyland products. Generally, if I’m working on something and I need to find documentation around something, this is going to be the first post that I come to. You can try to find exactly what you’re looking through, through the huge list, but I know what I’m looking for, so I’m just going to search for it from the search bar. AppGet tree. And just putting in my AppGet tree in search, pulls up my search results for this Ellucian form mode that we’re going to open up. And again, even though it says Ellucian, we’re just going to pull what we need from this so that we can edit it.

This documents pretty big, go through a lot of different stuff here, but in the table of contents I see this AppGet tree option, so I’m just going to jump straight down to that. Get through some of the fluff here. And you can see on this page, I have my script template. This is what I start out with. If I am doing this from scratch and I want to create an application plan that’s going to utilize this new functionality, I’m going to take this script template that they have and copy it directly out of this document so that I can build off of this.

Now, one thing to note is there’s a lot of stuff set up in here that’s going to point to stuff that we are not actually using, like for example these highlighted search values are things that I can trim out. I’m not necessarily wanting to link to this parent node or anything like that. So, this does take a little bit of effort on your end to try to get to work the way that you need it to, so don’t just drop this in expecting it to work right away.

You can also see down at the bottom, they’re assigning specific fields, specific values to these different fields, and these fields aren’t necessarily what we’re going to be using in the application plan. Just use this as your starting point, and then edit it from there.

I just to speed this up a little bit, I’ve taken all of this code out already, and kind of put together my own set up. This is my script that I put together to work with my application plan that I have in the test environment. I guess I’ll jump in, before I get too deep into this code, I’ll jump into the management console where I actually have that.

So just like any other application plan, like a traditional one that you might set up, you’re just going to create your normal learn mode application plan I have one here called AppGet tree invoice linking. I’m just using the viewpoint type. And inside of here just like you’re used to, you can set up your screen. This is the Lawson screen that I’ll be pulling from. You can see that I already have some data in here that I plan on using for my script.

I have my identifier in here with my wild card, just like you normally would. I can capture it if I just want to make sure that it’s pulling it in, which it looks like it’s not displaying correctly here, but it’s working. The nice thing about using this functionality is that a lot of the time when you guys are setting these up, you’re going to have to do some kind of pinning or if you have specific scripting that you want to add to each item, you would need to add them to your dictionary values individually.

With the VB script I can take my whole script for every single value, and just tie it to one, because when it runs for one, it will run for all of them. I have already set up my mapping, so if I had a true document that I was wanting to link this to I set up my vendor number, vendor name, invoice number, invoice amount, all based on my dictionary values on the left side here. For the script, all I did was I just tied it to invoice number. If I open up any of these, you’re going to see I don’t have any kind of processing script tied to any of my other values here. It’s only on invoice number right now.

There’s my AppGet tree script. If you needed add a new one, or you needed to create it from scratch, you can just click add script, and then click create and it will open up a new script for you to type in, then you can modify that to create your new script, but we don’t need to do that. Double click on this, open up AppGet tree.

Here is my code for that AppGet tree functionality. Everything that’s in here is essentially what I have built out inside of my Notepad++ here. And I wanted to put it in here, just because I know that this is kind of hard to read. It’s really kind of hard to read anyway, but it’s a little bit easier to see some of the stuff that I’m doing here.

So, one of the things that you’ll notice in the documentation if after we grabbed our script logic and everything we can go to the apply script section inside of that document. The apply script section is going to be what walks you through how to get this set up, because before we can grab our values, we need to grab the tree so that we see where our values are located. The tree, once we build that out is going to look a little bit like it used to using the older style. If anybody remember using ACC Explorer and having to map out every single node, and putting in your number, pipe, number, pipe, number, pipe over and over again just to get to your one field, this is essentially replacing that. You still sometimes have to do some counting, but it’s not near as complicated as having to use ACC Explorer.

Again, one thing to mention is this is written around using Banner 9, but the basic principles are the same. So, the first thing you’re going to hit when you’re working through this documentation is they’re going to be talking about this dev app tree here. The dev app tree inside of the script, which you can see in there. Let me just pull up Notepad++. Inside of my script I have my dev app tree, it’s commented out right now, because I don’t want to build the tree every single time.

But essentially what this is doing is if I uncomment this and run that application plan, it’s going to run this dev app function where it’s going to create my tree in a text file in a directory that I specify inside of that function so that I have something to look at to see where my values are actually located within the tree. The first thing that I’ll do is come in here to my code that’s actually running, and I’m going to uncomment that out. I don’t need to save this and run it or anything like that, I can just click test right here, and what it’s going to do it, it will pop up a notepad file that contains my entire tree.

I just click test, and it popped this up for me, which is the entire tree of my Lawson screen here. If you close out of this by accident or lose it, that’s fine, because it’s still saving that file to whichever directory you set it to, so if I wanted to open it in Notepad++ or something to make it a little bit easier for me to look at I can do that. And you can always re run it. If you lose it for some reason, just rerun it and it will [inaudible 00:14:09].

In my application plan, I’m wanting to pull invoice number, vendor number, vendor name and invoice amount. So, if I look on the Lawson screen you can see I have my invoice number, my vendor number, my vendor name, and my invoice amount here. So, these are going to be the values that I’m looking for inside of that tree. The easiest thing to do, is if I already know what it is, do I know my vendor number, or I know my invoice number is invoice 123456. Just going to copy that out, take a look inside of here for invoice number 123456. When I search, I can see that number inside of the tree here.

Now it’s just a matter of how do I actually get to this number. Inside of my code I have these split functions where I’m basically splitting out all of my nodes into an array. Inside of this logic right here, I’m just looping one by one through each node trying to find an identifier an anchor that I’m connecting to. This is going to be different for every single system that you’re trying to apply this to.

For me, when I was taking a look at my output, let me just get it over here so I don’t have to keep jumping back and forth. What would be nice is if Lawson made it so that inside of the tree I had an easy identifier like invoice number right here. That would make it a lot easier to just anchor off specifically this field to know that’s exactly where I need to be, but it’s not like that.

So, we’ve got to figure out how to actually get down here. I can’t just do the text brackets, because I have text brackets all over the place. So, if I tried to do that, I’m not going to pull a value at all, or pull the wrong value. What I want to do is try to find something that’s unique that I can anchor off of to count down from. If I move backwards in this list, I hit this labor buyer code. Labor buyer code is what I’m using pretty much for all of these, because you can see I’ve got my invoice number, my vendor number, pretty much everything that I’m looking for is underneath buyer code in this same kind of area. When I’m setting up my code, let me move this over. If I am trying to get vendor number, which is this 100004 number, I’m saying let’s anchor off of label buyer code. Label buyer code, and I’m moving down two lines, so one, two.

Just putting in the line plus two inside of this logic right here is going to automatically move it down to pull this information. The problem is that we can’t just do that. See this get name two function that I have here? If I didn’t have this, and I was just trying to pull that node, I’m going to pull more information than I need, because it’s going to pull that whole line. I basically have to create a function that trims that up for me.

The original script that’s in the documentation, they use this get name function. If you look in my script, I’m still using that original get name function for vendor name, but I’ll explain the differences here in just a second. If I look at get name, the original get name function that was in the banner software, you can see what they’re trying to do is pull the value in between brackets. So, my value is not in between brackets here, so it’s not going to find the right value if I try to use this get name function.

I do have other values that are, which is kind of what I was getting at a minute ago. If I’m looking at, find my vendor name here. Right here. Inside of Lawson, my vendor name is A-H-C-A and I can see that in my tree here as bracket A-H-C-A. The reason it’s doing that is because it’s technically a label, it’s not a text field or anything like that.

This get name function, looking for the value in between the brackets will work for my vendor name, but for my invoice number it’s not going to work, because my invoice number is behind that arrow. So, I basically just copied this out. I copied this function, recreated it, gave it get name two instead of get name, and then I updated it so that it’s looking for whatever value is behind the arrow and then I’m ending my sub string at the length of what’s behind the arrow. So, this should get me this entire value right here.

I also added in some trims, and the only reason I did that was that I noticed on I believe it was vendor number here. Especially with Lawson, if anybody works with Lawson, Lawson likes to add in a lot of blanks spaces in the values. For my vendor number here, when I pulled it in using this get name function without this left trim right trim it would pull it in including these white spaces, which is not what I want to pull into the document. I just want the vendor number period.

So, I added in the left trim and the right trim just to clear out any additional spaces in front of or behind the number value that I’m wanting to capture.

After creating this second get name function so I can actually hit all of my values here, I essentially just go through and anything that isn’t in a bracket, which is essentially everything except for vendor name, I give it that function and I count out from my buyer code.

My vendor number is two behind buyer code, my invoice number is 15 behind buyer code and so on and forth, 2, 15, 31, 23. So that’s how I come to those numbers.

So, I already went through why we’re using the brackets on this guy, so that’s why I have the get name instead of get name two. Once I have all of this in, now it’s just a matter of testing it against what I have in Lawson to make sure that it’s actually pulling back in my fields in the application plan.

I’m going to jump back to the application plan here. I’m going to comment dev out, out so that we don’t generate that text file again. Going to click okay. Okay. And then I’m going to go ahead and hit test dictionary. So, if I hit this blue button, it’s just going to test the script that I have. And you can see in my columns for invoice number, I’m pulling back the correct invoice number, I’m pulling back the correct vendor number, vendor name, invoice amount. You can see that it only took .8 seconds to run that look up. It fixed a lot of our speed issues with the older version, because some of those were taking 15 seconds or more to pull back and it just got ridiculous with linking…so this definitely fixes those problems.

To give you another example, if we wanted to add in a new item, so let’s say that I wanted to pull in my vendor address here. To pull in vendor address, I’m going to do the exact same thing. I’m going to take this logic that I have where I’m looping through all of my notes here, I’ll take this logic, copy that out, put another one in, and the reason that I’m using…actually, let me show you it here. So yeah, it actually shows up right here. This is the same vendor address that was showing up inside of Lawson. The reason that I’m copying my vendor name functionality, instead of my invoice amount functionality, is because my vendor address is in between these brackets. So, this is another example of wanting to use get names instead of get names two.

So, for here, I’m still checking off of buyer code, because buyer code is still the anchor element that I’m taking a look at here. I’m going to update my value that I’m applying it to, because if I do this I need to add one more idem down here. My fields I guess one thing to mention too, is that my fields here, if I’m saying my field of invoice amount, this is linking back to those dictionary values that I’ve mapped out inside of the application plan. I still have my test window open. So, these values here inside of my dictionary.

So, the first thing I want to do is just add a new dictionary item called vendor address. Now I have that, I’ll take this guy right here, copy that and say vendor address here instead of invoice amount. And you can see that for each field I’m making it equal an item that I found inside of my loop here. I don’t want to do invoice amount, I’ve got to update this guy to match vendor address. So, I’ll just type vendor address.

So now that I’ve created this, my vendor address is going to equal my get name value for this node, and I’m tying it back to vendor address. However, I haven’t updated my count yet, so it’s still going to just pull back vendor name for vendor address. The easiest thing to do here is just fine one that’s close so the vendor name is on this 23, so this is where I’m pulling vendor name right here. So, I can just countdown from here. So, one, two, three, four, five, six.

This is what I had before I think. Okay, I updated some of these numbers. Yes, I did. Two, 15, 31, 23. 23, that is working, okay, 2, 15, 31, 23 so then 29 should be vendor address. Take my code here, drop that in. Click okay on it, okay. I did not…my global app. And you can see that I’ve now pulled in vendor address into that vendor address field.

This gives kind of the basic functionality of how this works. Again, if anybody has any questions, let us know in the question section inside of Go-To-Webinar. One thing to point out too, while anybody’s asking any questions is there’s a lot of functionality that you can add into this that we didn’t just for this easy demonstration. You can do anything that you could originally do in VB script you can do here. Just because I’m pulling the values in directly from my tree doesn’t mean that I can’t get creative with how to create the value inside of the application plan. For instance, let’s say that for the address. Let’s say that maybe all of my vendor addresses have some address one number and then a dash with some additional information, and maybe I just want to grab anything before that hyphen. You can add in the VB script any kind of data massaging that you want to inside of that application script.

So, if you want to pull out the trailing characters from your address and only grab that first value, you can throw that in the script as well. You can do whatever you want inside of that. This is just a basic example of how to grab those fields.


So, we have a question. I wonder if you can do AppGet tree for more than screen. The person who asked that, could you clarify that question? Maybe walk through how we identify the screen in the script.

Michael Madsen:

Yeah. Okay. Just like if we’re looking at just the application plan where I’m doing my screen identifier for info, in for loss and basic invoice, I have to add that into the script as well. In this value, I’m doing my find window here, so it’s the exact same thing. I still have to send it to find the window that I’m trying to pull the data from. If you had multiple screens, I think you’d have to build additional application plans for those additional screens unless I suppose you could potentially put in VB script logic to loop through different windows, if you were trying to grab multiple values from different windows. Your script is going to get kind of complicated as you move forward with that. Again, anything you can do in VB script you can do inside of this.


Can we build a new screen two? Yeah, I think we’re still not quite clear on what the question is there. We can certainly reach out after this to discuss a little further. Another question is does this solution apply to IE 11?

Michael Madsen:

Yeah, I mean IE 11, I generally built these out in Chrome, just because we have fewer issues with it. But IE 11 would have a tree, so you could set it up with IE 11.


I think there’s something about…

Michael Madsen:

John’s taking a look. He thinks there something around 32-bit versus 64-bit that might be an issue. To kind of go back to that different screen item, what I was talking about is if we have in our visual codes here my find window for this specific window, you technically could create a new value H2 equals find window. Find window, and then add in whatever your next window is that you’re selecting from. The only thing is that you’d have to build your error handling around how it grabs it, because you can see right down under here, if your first window is built out, and it doesn’t return a value, it’s going to pop up this message box of window not found. So again, you could just clear that out. You just have to get creative with your code.


Does not work on 32-bit.

Michael Madsen:

Does not, okay so it does not work on…


In applications.

Michael Madsen:

…on 32-bit operating systems or applications.


So that means no 32-bit Windows 7, which I think is the last operating system that would apply to.

Michael Madsen:

Edge, I’m not sure about Edge.


It should work in Edge.

Michael Madsen:

Yeah, Edge would be…


It should theoretically work on anything, because it’s using a Windows API.

Michael Madsen:

As far as the PeopleSoft question goes, someone asked if we could share the AppGet tree script for PeopleSoft. My test environment, the only thing that I have access to is Blossom, so that’s why I built it out with Blossom. I imagine that we potentially have some PeopleSoft code around for pulling the information. If I find it, if you want to send us an email or something asking for it, then we can reply to try to send you what we have, if we have something from PeopleSoft. It should be the same idea, you just build out the tree and then find your mapping inside of that tree, but if we have anything PeopleSoft specific, then we’ll definitely get it over to you.


PeopleSoft suffers from the exact same problem as Lawson with that vendor name field where it’s a possibility that it’s a label, which is where we would typically [inaudible 00:33:41] scripts. So, script would be almost exactly the same, you would just change the mapping.

Michael Madsen:

Yeah, so what John’s talking about there is just where I had to add in these two different get name functions for the script inside of the label with brackets versus the actual text field value.


Another request for PeopleSoft. If anybody wants to share their screen, we could take a stab at walking through building a PeopleSoft script. No promises on whether we can get through it. Do you have the minimum requirements in front of you or in the documentation?

Michael Madsen:

Let’s see. I’m not sure if it’s there. Let me check here…it does not look like it. At least not in this, maybe in…I doubt introduction. Yeah, it doesn’t look like there’s any minimum requirements.


I think what about the top? Yeah, right there at the top, the very first page. You see how it says 7.1.5?

Michael Madsen:

Oh yeah, yeah.


So, you do