Official Blog with How-To Articles, Tips, Tricks, and Latest News

Tag Archives: Calibration Management Software

Version 9 SP2 License Pooling

License Pooling – 9.2 Standout Feature

With the release of 9.2, IndySoft now allows for license pooling scenarios. Our long-standing and popular concurrent licensing model per database is still in place, this only extends the functionality slightly by allowing customers to enforce some rules on exactly how the licenses in a database environment are distributed within their organization.

Rewind: Concurrent Licensing Explained

Let’s take a step back and review the existing license structure and how it works. Concurrent licensing is based on the idea that there is a peak number of simultaneous users your system will likely support at any given point in time during the business day. With concurrent licensing, you can install your software on as many networked computers pointing to your licensed database as you desire. You can also add as many users as you want. Users come and go throughout the day but once all allocated licenses are in use, additional users attempting to access the system are told to try again later after licenses are freed up in the system.

Timezones, Management, and Divisions

One of the largest benefits to concurrent licensing is that in multi-shift, multi-timezone, or multi-country operations, you experience a great deal of license re-use. If your operations are not 24/7 and are national/international, licenses are freed up as countries, shifts, etc change, and get repurposed by those coming on-shift.

On the other side of concurrent licensing, three common side effects of concurrent licensing exist. They are license-squatting, divisional quantity needs, and emergent issue access.

License Squatters

IndySoft combats license-squatting by incorporating session timeout controls as part of the deployment scheme. System administrators can set a maximum idle time for the system before the user is considered absent, and they will be logged out of the software, freeing their license for use by others.

The Need to Own Fixed Licenses

In some rollouts there is simply no way to calculate or plan for your maximum license usage. Imagine a rollout where you have 25 licenses and expect no more than 20 operators on a manufacturing floor and 5 users in the lab using the system at the same time. If more than 20 operators happen to access the system at once, those additional users will consume any unused licenses in your pool of 25 licenses. So if there is a boost in usage, some of those 5 lab users may find themselves without access to the system. If you consider your 5 lab users as more crucial than your 20 shop floor operators, this causes problems.

The other issue in divisional quantity needs comes in with multi-facility rollouts. If you expect 5 max users at Facility A and 5 at Facility B, you purchase 10 concurrent licenses. Facility A starts to discover more features in the software and usage/access rises. Now Facility A is robbing Facility B of licensing and Facility B productivity is affected because less staff are not able to log in and work.

Emergent Issue Access

The final potential problem with concurrent usage licensing deals with critical needs. If all of your 10 concurrent licenses are in use and a manager, or system admin, needs access to address a dire need you can only boot someone through a system-level utility, or search out users independently and ask them to log out while you gain access to use the system. In either case, you are affecting productivity in one way or another.

License Pooling

The answer to all of these scenarios comes with the 9.2 License Pooling features and it addresses all of the previously mentioned scenarios. With pooling you can:

  • Setup exclusive access for licenses
  • Assign rights for users to one or more pool groups
  • Leave spare licenses in a global pool for others not in the pool

Let’s walk through the new features for an overview on the functionality.

Adding License Pools

License pool allocation begins within the IndySoft Registration Utility, the same application used for adding your licensed products. Open IndySoftReg.exe and you will find an interface similar to the one below.

Clicking the plus icon next to IndySoft Calibration Management, for which we have 8 concurrent licenses, we can see that we currently have no license pools created for the product. This means that up to 8 of our total users have access to the system with no pool restrictions whatsoever.

The registration utility with no license pools created

The registration utility with no license pools created


Clicking the Edit Pool Details button will launch the following dialog.

The license pool window with no allocated pools

The license pool window with no allocated pools

From this screen we can begin to setup the pools for users. In the top right corner you will see your Total License count and as pools are constructed, the total number of licenses allocated to pools.

Clicking new allows us to create a pool. Let’s call this pool ADMIN, set the allocated licenses to 1, set Exclusive to checked, and then click OK. This pool will allow us to setup a dedicated ADMIN level account which keeps system owners from being locked out of the system due to max concurrent usage limits.

Creating the ADMIN license pool

Creating the ADMIN license pool

We now create a set of alternate pools based on our requirements. In this example we are effectively locking down two licenses for exclusive access to department 123 then creating a non-exclusive pools for our Cal and Maintenance Techs, leaving 1 license with no assignment to any pool. We leave one license “free” which simply allows any user not in a pool to gain access to a license.

Our final list of license pools

Our final list of license pools

After completing the pool allocation we click ok and our licensing pools are shown with the associated product.

Registered licenses with license pooling in place

Registered licenses with license pooling in place

Now we exit the registration utility.

Assigning Users to Pools

Now we launch into IndySoft and click the link to enter Profile Manager so we can assign our users to our pools. Our first pool was called ADMIN and was set for exclusive access. Double clicking one of our System Admins from the users list will load the edit user interface.

A user with no licensing pools assigned

A user with no licensing pools assigned

In the lower portion of the screen we find the Registration Pools tab. Clicking the New icon will prompt us to associate this user with a license pool. For now we’ll select ADMIN, click OK, and return to the Registration Pools tab.

Adding the user to the admin pool

Adding the user to the admin pool

Now at this point we have set one system admin to be able to have a license gaining him access at any time. If we add a second user to that pool using their user Registration Pools screen what we have essentially done is created a concurrent ADMIN licensing pool of 2 users. If we want exclusive access to the pool, we should only add the one user and select the “Only Allow Login Using the Pool(s) Below” option.

Using the same method we can now select other users from Profile Manager and add them to one or more license pools. Adding a user to more than one pool, then setting the pool priority is essentially creating a cascading approach to pool assignment. For instance as a user logs in if his 1st priority pool is in the Cal Tech group but those are all in use and he also has 2nd priority access to the Maintenance group, his license will be pulled from the maintenance pool.

Adding a user to more than one pool with priorities

Adding a user to more than one pool with priorities

We continue this process, adding users to pools as required based on our needs. Based on our pool example after additionally configuring some users, the following best explains the pool operations.


License Pool Usage Example

License Pool Usage Example

As you can see, License pooling provides an extremely flexible way to still gain all the benefits of concurrent licensing while still offering a practical approach to locking licenses for specific business needs. Please feel free to explore this new feature and contact your sales representative if you would like additional information on IndySoft’s training programs or consultation/services related to making the most out of your IndySoft system.



Security Profile Comparison Reports

The IndySoft product line has one of the most in-depth security and profile management systems available for an asset management system. Out of the box there are over 2750 security checkpoints that can be defined per profile and that number rises as you grow the product through your custom configuration efforts. Security checkpoints can range from allowing or preventing access to various utilities in the software all the way down to defining required fields to be completed within the asset event model.

As you might imagine with such a robust security system reviews of security roles can be a daunting task. Sometimes reviewing each profile one at a time just doesn’t cut it. What you need is a way to compare all of your security settings side by side, across all profiles. That brings us to our latest post… the security profile comparison report.

Example Preview of the Security Profile Comparison Report

Example Preview of the Security Profile Comparison Report

What the Security Profile Comparison Reports allow you to do is view every setting for every profile side by side within each security group allowing for instantaneous visual confirmation of all/none or mixed deny/allow settings in your security rules. This isn’t a very advanced report but it has a lot of components so we’re providing you with a download link to the report and only an explanation of the report construction.

Keep in mind the provided example report has only been written for and tested on a SQL Server platform. Firebird and Oracle users may need to retool the SQL aliases and joins to meet their target platforms.

Because there are so many settings we have opted to split the report up into three logical reports. The base report will give us all security settings short of events and schedules, while the latter two are dedicated to schedule and event related actions. This post will focus on contents the base report. The difference between the construction of the three reports is nothing more than filtering the SQL results.

Navigating to the Data tab you’ll find the data pipeline we have constructed. This is a custom SQL query which cannot be generated with the built-in query tools provided in PrintBuilder. The code is below:

B.PROFILE = 'Power User' AND
C.PROFILE = 'Standard User' AND
D.PROFILE = 'Reports Only' AND
E.PROFILE = 'AddYourProfile' AND
F.PROFILE = 'AddYourProfile' AND
G.PROFILE = 'AddYourProfile' AND
H.PROFILE = 'AddYourProfile' AND
A2.DESCRIPTION NOT LIKE 'Schedule Settings%'

Each profile (this example report has placeholders 8) is setup as an alias and retrieves all the settings per profile in order of category and security item. Additional items in the WHERE clause rule out any settings related to events or schedules. The latter part of the WHERE clause is the only deviation between the three individual reports. Removing those last two WHERE clause items in the base report will create one master report for all security settings.

The Report Header with Legend

The Report Header with Legend

The main report window in the design view shows a legend for how to interpret the resulting data in the report. All green on a row means every profile has that option enabled. All grey means every profile has that option disabled. A mix of red and green reflects enabled/disabled options across the profiles.

Subreport Layout with Header

Subreport Layout with Header

The subreport for the PROFILE pipeline shows a series of rotated labels for each profile in the report along with a security item legend/indicator and a series of colored squares.

Stacked Squares Used to Visualize Settings

Stacked Squares Used to Visualize Settings

The colored squares are actually stacked on top of each other and shown/hidden based on the data provided. We could have gotten fancy with a simpler design setting the colors dynamically but this method works just as easily for this simple report. The code to show or hide the colored squares along with altering the icon to reflect the type of security item you are viewing is located in the detailbeforeprint event for the Profile detail band and is shown below:

procedure detailbeforeprint;
p1checked.visible := false;
p1unchecked.visible := false;
p1unmatched.visible := false;
p2checked.visible := false;
p2unchecked.visible := false;
p2unmatched.visible := false;
p3checked.visible := false;
p3unchecked.visible := false;
p3unmatched.visible := false;
p4checked.visible := false;
p4unchecked.visible := false;
p4unmatched.visible := false;
p5checked.visible := false;
p5unchecked.visible := false;
p5unmatched.visible := false;
p6checked.visible := false;
p6unchecked.visible := false;
p6unmatched.visible := false;
p7checked.visible := false;
p7unchecked.visible := false;
p7unmatched.visible := false;
p8checked.visible := false;
p8unchecked.visible := false;
p8unmatched.visible := false;
icoAllow.visible := false;
icoBlock.visible := false;
icoUnknown.visible := false;
icoRequire.visible := false;
if (Copy(PROFILE['DESCRIPTION'],1,5) = 'Allow') then
  icoAllow.visible := true;
else if (Copy(PROFILE['DESCRIPTION'],1,5) = 'Block') then
  icoBlock.visible := true;
else if (Pos('Require',PROFILE['DESCRIPTION']) <> 0) then
  icoRequire.visible := true;
  icoUnknown.visible := true;
if ((PROFILE['VALUE1'] = 1) AND
) then
  p1checked.visible := true;
  p2checked.visible := true;
  p3checked.visible := true;
  p4checked.visible := true;
  p5checked.visible := true;
  p6checked.visible := true;
  p7checked.visible := true;
  p8checked.visible := true;
else if ((PROFILE['VALUE1'] = 0) AND
) then
  p1unchecked.visible := true;
  p2unchecked.visible := true;
  p3unchecked.visible := true;
  p4unchecked.visible := true;
  p5unchecked.visible := true;
  p6unchecked.visible := true;
  p7unchecked.visible := true;
  p8unchecked.visible := true;
if (PROFILE['VALUE1'] = 0) then p1unmatched.visible := true else p1checked.visible := true;
if (PROFILE['VALUE2'] = 0) then p2unmatched.visible := true else p2checked.visible := true;
if (PROFILE['VALUE3'] = 0) then p3unmatched.visible := true else p3checked.visible := true;
if (PROFILE['VALUE4'] = 0) then p4unmatched.visible := true else p4checked.visible := true;
if (PROFILE['VALUE5'] = 0) then p5unmatched.visible := true else p5checked.visible := true;
if (PROFILE['VALUE6'] = 0) then p6unmatched.visible := true else p6checked.visible := true;
if (PROFILE['VALUE7'] = 0) then p7unmatched.visible := true else p7checked.visible := true;
if (PROFILE['VALUE8'] = 0) then p8unmatched.visible := true else p8checked.visible := true;

This report is setup with 8 default security profiles. You may have more or less. To modify the report to suit your needs you will need to:

  1. add your profile names in the SQL, adding or removing related aliases and joins depending on your profile count
  2. modify the rotated labels to reflect the profile names you use in order of your aliases in the SQL
  3. add or remove additional squares in the report results and modify the code accordingly

Clicking the preview tab results in a very easy to read and understand report which can be used in verification/validation efforts of your IndySoft profiles.


The following link provides access to the IndySoft version 9.1.12 custom reports for SQL Server. Unzip and import into your Printbuilder custom reports group to modify as required.



End Of Month (EOM) and Alternate Due Date Calculations

We often are asked by our users “Can our software support End of the Month scheduling for only certain companies within the database?” The answer is yes and it can be easily be set up in a just a few clicks.

Accomplishing this task only takes a few modifications to the configuration of your calibration event (or other events that update your schedules) along with setting up a systemwide company custom checkbox. You will be modifying this within the event configuration system because completion of an event is what drives a schedule update.

The Company Setup

The first thing we will do is a setup a field at the company level so we can identify who should get End of the Month Scheduling and who should not. To accomplish this, open up Systemwide Preferences and proceed to the User Defined Labels tab. You will actually see a handful of fields that can be customized in any number of ways. We generally suggest you use a Company User Defined Status Box for this scenario. Once you are on the Company User Defined Labels tab, find an unused custom status box and give it a label. In our example we have simply called it EOM Scheduling.

SystemWide Preferences and the Checkbox Labels

SystemWide Preferences and the Checkbox Labels

Now that you have set up the checkbox at the company level check the box for the companies in your database that require End of the Month Scheduling. This is done by going to Add/Edit Companies, selecting a company, and then proceeding to the Custom Info tab. From there you will see your new EOM Scheduling checkbox. Go ahead and check that box for any customers who desire this type of scheduling.

Setting the EOM Checkbox

Setting the EOM Checkbox

Modifying Your Calibration Event

Next, we need to modify your Calibration event. So for part 2 of setting this up you will need to open up Workflow Configuration and proceed to Step 7 (schedule updates) in your Calibration event. Once you have that open you should see an existing rule for updating your calibration schedules upon completion of the calibration event. Leave that one as-is for the moment as we are now going to create an additional calibration schedule update rule. Click the new icon on Step 7. That will bring up a new window where you can create an additional schedule update rule.

Creating a New Schedule Update Rule

Creating a New Schedule Update Rule

From here, go ahead and select the Calibration schedule type in the dropdown list. Then uncheck the ‘Use System-Wide Due Date Options’ checkbox. Once you uncheck that, go ahead and select ‘ok’ at the bottom.

Creating The Calibration Schedule Update Rule

Creating The Calibration Schedule Update Rule

Now that you have done that, immediately open up your newly created schedule update rule by double-clicking it. This time it will allow you to click on the calendar right beside the Use System-Wide Due Date Options checkbox. That will bring up a new window and in the dropdown field called ‘Date Adjustment.’

Selecting the Event Schedule Option

Selecting the Event Schedule Option

Go ahead and select End of Month and click ok.

Selecting the End of Month Option

Selecting the End of Month Option

You only have one more thing to do which is tell the software when to apply this new rule. That is where the right side of the schedule update comes in handy. On the right side of all schedule update rules we allow you to create an Equipment Filter to identify when this particular rule should be applied. So in the equipment rule section, select to add a condition and look for your new Company custom field. In our example case, it is called Company (Eom Scheduling) and we configure the rule to require that field is checked.

Setting the Schedule Update Filter Rule

Setting the Schedule Update Filter Rule

Now click OK to close the new schedule update rule. Using the same knowledge you just gained about editing schedule rules, open the original update rule that was found in your calibration event and simply set the equipment rule to Company (EOM Scheduling) is Unchecked then click OK. Performing this step ensures the first rule is ignored if EOM is unchecked while the second rule will pick up the EOM checkbox for companies preferring EOM scheduling.

That’s it. The only thing remaining is going to be a save the event then refresh your new event settings (right click in the IndySoft header area and choose reload all settings). And of course going back and selecting any additional companies that want EOM Scheduling. Once you start performing calibrations for equipment that belongs to companies where the systemwide checkbox is checked the due dates will automatically be adjusted to the last day of the calendar month. Since schedule update rules are filter based and rely upon company, equipment, or schedule data, you can easily expand upon the rules to apply EOM scheduling to companies, locations, types of assets, and much more.


Hopefully this explained some of the flexible configuration options of how your events can manipulate your schedules in a number of different ways when the rules are used in combination with a targeted equipment filter.

There are also several other rules within the Workflow Configuration wizard that can be combined with Equipment Filters to execute other functionality like conditional based updates, reminder messages for certain types of equipment or customers and much more. Please feel free to explore and contact your sales representative if you would like additional information on IndySoft’s training programs that can help optimize your efficiency and reduce errors.

Optimizing Calibration Certificate Templates

a.k.a: One Incredibly Obsessive Post about Certificate Quality and File Sizes

The digital world offers us countless ways to improve efficiency and communication while also gaining valuable real estate in the form of office space. The ability to store and transfer digital certificates brings an end to the decades-old practice of maintaining walls of filing cabinets while providing almost instant access to nearly any certificate from the past with just a few clicks of a mouse. One common concern about digital storage is hard drive space. The next is making the certificate look just as good as the days when we printed them off on the laser printer on our high-end certificate paper.

If your calibration certificate templates are not optimized in the design phase you may eventually find your filing cabinets replaced by an ever growing hard drive on your server. To be clear, growth of a database can be a positive sign. Uncontrolled growth however is what we need to keep an eye on. Today’s post is an in-depth tutorial for ensuring your calibration certificate template sizes don’t get out of hand. This post is intended to educate you on what you can do to have a great looking calibration certificate templates without a lot of storage space.

Rendered Documents vs. Merged Views

IndySoft standardizes on creation of a fixed PDF certificate which is then stored in the database alongside the historical calibration record and associated data. IndySoft chose to store final certificates as fixed PDFs in the database for the reason of nearly-absolute risk avoidance. Short of a catastrophic event against your database (you do back up your database including rotation and offsite copies right?) creation and direct storage offers protection against manipulation, data loss and file corruption while maintaining maximum portability options.

I will occasionally see queries regarding concerns about database file size… sometimes in relation to database speed. To quickly put this to rest, database size has little to nothing to do with speed on a properly constructed and indexed database. To be even more specific, certificate size has no bearing on the database speed either. Why you should care about file size though is simply to minimize download times for email and web based delivery while keeping your drive growth at a reasonable rate parallel to your ongoing business needs.

Before We Begin…

Pick any asset and a related calibration from your database that best represents your most common certificate. Right mouse click that certificate and choose to save to file.

Saving a Certificate To File

Saving a Certificate To File


Right mouse click the file from the OS then select properties.

Selecting File Properties

Selecting File Properties


Note the size of the file on disc.

Viewing The File Size of The Certificate of Calibration

Viewing The File Size of The Certificate of Calibration


Is it 30k? 100k? 500k? Is it over a Megabyte (egads!)? There is no absolute on what an appropriate size for a certificate should be but generally speaking a one-page certificate with a company logo and no additional images falls within the 22-50k file size range. If it’s 100k or more, or you are within the limits but your images look “rough” you can probably benefit from this post.

A Quick Lesson in Image Formats

Let’s start by taking a look at the all-important company logo that appears on every certificate. Here is the one I knocked out for this tutorial.

We Do Good Work... Give Us A Ring

We Do Good Work… Give Us A Ring


The biggest things I see done incorrectly when it comes to logos and certificates are either (a) importing an inappropriately huge image then stretching it down to the desired print size or (b) importing some random logo snagged off the corporate website. Most often the logo either comes from a graphic designer who has provided letterhead or business cards and has given you a resolution generally reserved for production level print jobs or you just snagged your image from a Google Image search.

A Quick Lesson on Image Resolution

Generally speaking, a fairly good image will be between 150 and 600 dpi (dots per inch) and be the exact printed size as required for the document. The choice between 150 and 600 dpi is strictly a matter of clarity in the final printed result. Take a look at these image samples:

Examples of How Resolution Influences Clarity

Examples of How Resolution Influences Clarity


These logos are three inches in width. As you can see, each time we increase the dpi (or resolution as it is also called) of the image, the clarity increases. What you are looking to accomplish is the usage of a logo at a dpi that strikes a balance between clarity on screen, clarity in print, and acceptable file size given your volume of calibrations.

Image Format Selection

Another factor that affects clarity of the logo, or other images in our digital documents, is the file format. IndySoft Printbuilder supports all the common file formats such as GIF, PNG, JPG, BMP, TIF and a few vector formats as well.

There are many layers to this discussion we’ll skip but here are the basics you really need to know about the various formats. GIF will limit your color ranges while providing smaller files via a “lossless” compression routine, BMP and TIF will generally be your largest file types, and JPG can offer a great balance but if overly compressed will show glitches in your final document.

The Overly Compressed Image On Right Is Blurry

The Overly Compressed Image On Right Is Blurry


That leaves us with PNG and my choice for this article. If I didn’t have a PNG option I would use a JPG with little to no compression. PNG offers the range and clarity of a TIF or BMP while having the “lossless” compression of a GIF. In other words, it offers the best options between clarity and size.

What about Color Depth or Bits?

Color Depth or Bits on BMP, PNG, TIF and JPG really only effect image size as it pertains to certs. You don’t gain much by using higher bit images. Generally speaking a 16 or 24 bit image is typical and probably what most editing software is going to give you by default so you shouldn’t have to think about that too much. 8 bit images will probably look granular, while 32 bit images are overkill.

Selecting the Starting Image

Our 300 dpi 3 inch Wide PNG Logo

Our 300 dpi 3 inch Wide PNG Logo


I believe a 300 dpi PNG is a great middle ground for images and what I’m using for this tutorial. It will not be too large, compress well, and will also look great on screen and a laser print. You may find 150 dpi works just as well but the final choice is up to you. I know this image was designed at 300 dpi and is 3 inches by 0.84 inches. That measurement will be important later.

Adding Your Logo to the Certificate

Before we go into the editor let’s setup the environment so we can have a live preview in our document design. Select an asset record with some calibration history then right mouse click a calibration event. Select the option to “Use This Event When Designing In Printbuilder.”

Selecting an Existing Event To Use In Printbuilder Design Mode

Selecting an Existing Event To Use In Printbuilder Design Mode


Now open Printbuilder from the IndySoft Home view and navigate to the certificate templates. Launch the editor for the certificate template by double-clicking it.

Launching The Certificate Template Editor

Launching The Certificate Template Editor


We’ll want to place the image in the certificate header so start by pulling down the Header band at the top of the template until it opens enough space for the height of your intended logo.

Sizing The Header Region For The Logo

Sizing The Header Region For The Logo


Now click the image control on the design tab followed by a single click in the header section of the certificate to add the image control to the document.

Adding The Image Control

Adding The Image Control


Right mouse click the image control and make sure Auto Size, Maintain Aspect Ratio, and Stretch are enabled then click the Picture … option. A dialog will appear for you to browse and select your image for import. Browse to select the picture then click Open to load the image.

Setting The Image Control Options

Setting The Image Control Options


You’ll notice the image is huge. This is because we are bringing a 300 dpi image into a 96 dpi environment. It has just scaled to meet the screen dpi. Not to worry. With the image selected look at the properties for the Layout Height and Width items. Set the width to 3 inches and height to 0.84 inches (or whatever your image happens to be.)

Manually Resizing The Image

Manually Resizing The Image


You should now be looking at the image at the appropriate size.

Properly Sized Image In The Header

Properly Sized Image In The Header


Click the preview tab to take a look at your newly branded certificate. At this point I need to state that you should not trust what you see on screen… especially in the PrintBuilder preview window. Right now this image looks jagged. Things will be better when we print, or “render” the final certificate to file, but only after we optimize the output.

Setting the Output Options

Now we are going to look at some of the settings that let us control the final quality and file size of the PDF. If your report tree is not visible in PrintBuilder, enable it by selecting View ->Toolbars -> Report Tree from the top menu.

Viewing The Report Tree

Viewing The Report Tree


Now select the topmost item in the tree labeled Report. The properties window we used when setting the image dimensions will now show the properties for our certificate design. Scroll down to the Output – File group and open the PDFSettings properties by clicking the plus sign.

Selecting The Report Node and PDF Properties

Selecting The Report Node and PDF Properties


The primary settings we are interested in here are CompressionLevel, ImageCompressionLevel, and ScaleImages. You will want to turn ScaleImages off by unchecking it. Leaving this option on will default all images to the display resolution of 96 dpi and just make things look awful.

Turning Off The Scale Images Option

Turning Off The Scale Images Option


CompressionLevel primarily concerns compression of the text and various objects (shapes, etc) in the document. Most of my experiments have left me believing that setting this to clMax is a safe bet. It may add a slight overhead to the time spent generating the document (we’re talking milliseconds) compared to clDefault or clFastest but it will be the right call if you are looking for the smallest filesize possible. As a gut check, my experiments for a certificate using clNone, clFastest, clDefault, and clMax left me with file sizes of 62.9KB, 46.5KB, 46.0KB, and 45.9KB.

Setting The Compression Level To Max

Setting The Compression Level To Max


Now we come to the ImageCompressionLevel option. This is likely defaulted to 10 and changing it depends on a few things. First, if you recall I mentioned earlier that if I was using JPG images that I would use uncompressed or lightly compressed JPGs. Here is why: Printbuilder converts and compresses your images when embedding them into the PDF and much like making a copy of a copy leads to degradation, compressing a compressed image format does the exact same thing. With JPG images you are going to want to play with this setting and test a few PDF results.

Setting The Image Compression Level

Setting The Image Compression Level


For all other image formats the rule of thumb is that the more complicated the image and/or the more colors in the image, the less compression you can use. For example with my very simple logo I can apply an image compression level of 75 before I start to see any of the edge blurriness or image artifacts appear. Every image is going to be different so from here your process is to set an ImageCompressionLevel, save the template, then go to File->Print To File -> Print To PDF.

You will be prompted for a filename. I usually save the file as CertMax10, CertFastest50, etc where I am stating the compression level and image compression levels so I can easily compare results and recall what the settings were for  the clear winners in the tests. You will also want to take the resulting doc and print it to a printer for comparison in your selection process. Somewhere in between these tests you’ll hit on that perfect combination of screen and print quality with a file size you can accept for years to come. Once you find that combo simply click save and exit printbuilder.


This post was all about getting the most out of your digital cert generation. You learned how to pick an appropriate file size and format for your images, how to load the images and size them in your document, and finally how to optimize the output of your final PDF. We hope this post was beneficial and look forward to your feedback or questions through support or our service channels.

Generation of a Levey-Jennings Chart


Editor’s Note: It’s been awhile since our last post. IndySoft has seen a huge surge in activity since the release of Version 9 and there is no sign of it letting up in the near future. We have a backlog of blog posts to finish up and tons more requests from our user base on future story ideas. If you think you have a great idea for an upcoming blog post please feel free to send it along to me via and we’ll see what we can do to put in it in the timeline.

So on to today’s post. You had to wait but this one should deliver. Let’s talk about custom report parameters, charting, and the new dataset features in custom reports. If you have ever created a custom report that is intended to be used to display data for one specifically selected asset you may have tangled with the AutoSearch options in the data pipelines and some light coding in the Calc tab. In addition, you probably also had to launch the report then manually enter the company and ID of the asset to execute the search. We have a better way to address this in 9.

Today’s post is going to be a triple play. We’re going to show you how to:

  1. launch an event that autosearches based on the currently selected asset… right from the equipment view screen
  2. execute SQL commands within the report structure to create reusable looping datasets
  3. chart data points for historical calibrations along in a point-by-point control chart report

So today we’re going to create the classic Levey-Jennings chart with two standard deviations. A special thanks goes out to William Twentyman and Rhett Price at IndySoft who offered some best practices and additional information on query setups leading to the final solution.


Example of a Levey-Jennings Chart


You’re going to need at least version 9.1 to create everything short of linking the report from within the equipment view. Version 9.1.8 and later will let you link to the report in the equipment view instead of just selecting the report from the reports menu.

In addition to the version requirements you should have an asset with the same number of test points over the asset history for a few years (no spec changes is also good but minor deviations may be ok).

Step 1 Creating an Auto-Search Report

Our first step is to open Printbuilder and after selecting the Custom reports option click the new button.


Creating a New Report


Enter Levey Jennings Report as the template name and select the Create New Report options followed by clicking OK. Double click the report entry and you’ll be at the default blank screen of a custom report.


The Default PrintBuilder Screen


Go to the View -> Toolbars Menu and make sure Report Tree is enabled.


Enabling the Report Tree


Now we are going to add two search parameters to be added to this report.

Select the Parameters node under Report in the Report Tree then right mouse click it and select New. A parameter will be created ready for naming. Change the name to company and press enter.


Creating and Renaming Report Parameters


Right mouse click the parameters node once again and select New to create a second parameter called id then press enter.


View of the Completed Parameters


Now click the Data tab.

Click select File->New from the top menu followed by Query Wizard and OK.


Starting the Query Wizard


You may notice that Version 9 has a much more organized query wizard with user-friendly table names and sub-tables when major related information is available.

Scroll down in the list and double-click  Equipment – Test Points to add it to the selected tables. Click Next.


Selecting the Database Table


Select to choose fields then add Equipment – Test Points.Company, Equipment – Test Points.I.D., and Equipment – Test Points.# followed by clicking next until you arrive at the Order step.


Selecting the Table Fields


Select to Set Order and add the Equipment – Test Points.# (sequence) field.


Setting the Sort Order


Now click Finish. It will be easier to modify our additional steps from a different screen. From the resulting data pipeline that was created, select the Search function to load Query Designer.


Launching the Search Parameters Option


Double click the Company and ID fields to load them in the lower criteria screen. From the criteria section set the Parameter for each field to the matching parameter name and set the AutoSearch field to yes. This will take values we will soon place in the parameters and automatically pass them to the query to execute our search for the test points associated with the asset.


Linking the Search Fields to the Parameters


Click OK to close the query designer.

Now click the Calc tab and from the View menu select Events to load the report objects view.


Enabling the Report Events View


Select Report from Report Objects on the left then from the right side select OnInitializeParameters from the Events window. Click in the lower left window and code formatting will appear.

Enter the following code between the begin and end; code lines

Report.Parameters['company'] := ReplaceSpecialFields('!COMPANY!');
Report.Parameters['id'] := ReplaceSpecialFields('!GAGE_SN!');
aCancel :=  False;

Right mouse click the OnInitializeParameters and select compile. The icon next to the Event should turn green meaning no syntax errors.


Testing Code with the Compile Function



ReplaceSpecialFields, and the !FIELD! syntax is special to IndySoft. It basically tells PrintBuilder to return the value of the currently selected !COMPANY! and !GAGE_SN! and place them into the two report parameters we created. From there they are available to the query and automatically execute a search for that company and asset when launching the report.

Step 2 Basic Report Layout and Adding Our Chart

Now flip to the Design tab and let’s build up some fields and a chart for our report. Start by selecting Report->Pass Settings and ensure this option is set to One Pass. We want this report to run everything top-down with no need to do an additional pass on the data for further calculations, etc.


Altering the Pass Settings for the Report


Our original query for the report simply searches for a given asset and returns the sequence of unique test points for that asset. For instance if we only have three test points for an asset we would get data similar to this:


Example of Data Results from the Main Pipeline


Our intent with this report is to create one chart per test point that reflects the findings for that test point across all history. In the Design tab expand the Header group and drop two data labels setting them to Equipment Company, and Equipment ID.


Adding Company and ID Fields to the Report


To create a chart per test point we need to use grouping. Again from the Report menu select Groups.


Launching the Group Options for the Report


Select to Break on Data Field and set the dropdown below that option to Equipment_Test_Points.# and click Add. This is telling the report that each new instance of a sequence number defines a group and where the data “starts over” so to speak. Uncheck the Keep group together and Reprint group options as this can sometimes lead to duplicate data if a section of a report carries over to a second page. Finally click OK to close this dialog.


Setting the Group Breaking Options


Expand the Group header and add a label with the caption of Sequence. This will show us the test point number each time we navigate to the next row of data. Now add a data aware label in the header and set it to the Equipment_Test_Points # field.


Adding the Test Point Number to the Report


Now close up the Detail band and expand the Group Footer to drop a Chart control in the footer area. Resize it to effectively fill the area. Now either hold and release the mouse on the Chart name in the Report Tree to invoke the rename option or simply change the Identity name in the properties window to Findings.


Adding the Chart to the Group Footer


Building the Chart

If you’ve never used the Chart component before you may find the wealth of features a little overwhelming at first. The best way to understand all the various settings is to simply get used to actually filling a chart, then work with the various settings and changing to preview mode to view the results. For our post we are going to perform minimal work just to get a chart on screen. Right mouse click the chart and select Edit Chart.


Accessing the Chart Editor


Our first goal is to alter the basic look and feel of the chart itself followed by adding what are called Data Series which we will populate with our test point data to draw the chart lines. Navigate to Chart->3D in the Chart options and turn off the 3 Dimensions options because 3D will just add visual clutter to the chart layout by causing overlaps.


Turning off the 3D Reporting Option


Now select the Series option in the top left. From the right side click Add followed by double clicking the Line option in the Standard tab. This will create a series in the view. Perform this same step seven more times. Then selecting each in order click the Title button and change the titles to As Found, Upper Limit, +2, +1, Nominal, -1, -2, and Lower Limit.


Creation of the Report Series


Now from the left side you can expand the Series group and select each series to edit the line options, etc. You can set each line color, option, etc but for now set the As Found series Point to visible and Square then click Close.


Enabling Point Markers for the As Found Data


Step 3 Adding Code to Generate Chart Data

Now all that is left is to add some code to query the database for our historical test points then using that data fill the chart and calculate our standard deviation lines. Add a non-data-aware variable to the group header and set the visible property to false (unchecked). We are going to add our code to the OnCalc event for this variable.


Adding a Variable Component to the Group Header


Variables vs OnPrint Events

If you are a seasoned PrintBuilder user you be wondering why we are using a hidden variable instead of an OnPrint event for coding. Every report has a best-fit way of handling things but generally speaking variables are far more predictable and easier to control than OnPrint events because the timing can be set manually. In the case of OnPrint, it can fire multiple times for regions, on page navigation, on File-Print vs Preview, etc. Once you get used to the variable approach, you will likely find more predictable report behavior and settle on it as your working standard.

While in the properties for the variable look for a setting under Calculations called ResetComponent and click the triple dot [...] button in the right side of that entry.


Launching the Group Timing Options


This will open the variable timing window which lets us tell the report exactly when to execute our chart code. By using calculate on Traversal and  Reset On DataPipelineTraversal we are telling the report to run the code when it makes a data pass and reset itself each time it makes a pass of the data.


Setting the Group Timing Options


Click the Calc Tab and from the Report Objects tree select Groups->Variable1 then click the OnCalc event to create a code window. Enter the following code where var immediately follows the procedure opening line and end; completes all the code:

  iTotalPoints, iSEQ : Integer;
  dPointsTotal, dPointsAverage: Double;
  dRunningAvg, dStdDev: Double;
  if Report.FirstPass = True then
    iSEQ := Equipment_Test_Points['#'];
    dPointsTotal := 0.0;
    dPointsAverage := 0.0;
    iTotalPoints := 0;
    while tdEOF(1)='0' do
      iTotalPoints := iTotalPoints + 1;
      dPointsTotal := dPointsTotal + tdFieldByNameAsFloat(1,'RESULT1');
    dPointsAverage := dPointsTotal / iTotalPoints;
    dRunningAvg := 0.0;
    dStdDev := 0.0;
    while tdEOF(1)='0' do
      dRunningAvg := dRunningAvg + Sqr(tdFieldByNameAsFloat(1,'LINE_STANDARD') - dPointsAverage);
    dStdDev := Sqrt(dRunningAvg/iTotalPoints);
    while tdEOF(1)='0' do
      Findings.Chart.Series[2].Add((tdFieldByNameAsFloat(1,'LINE_STANDARD')+(dStdDev * 2)),tdFieldByNameAsString(1,'EVENT_DATE'),clGray);
      Findings.Chart.Series[3].Add((tdFieldByNameAsFloat(1,'LINE_STANDARD')+(dStdDev * 1)),tdFieldByNameAsString(1,'EVENT_DATE'),clGray);
      Findings.Chart.Series[5].Add((tdFieldByNameAsFloat(1,'LINE_STANDARD')-(dStdDev * 1)),tdFieldByNameAsString(1,'EVENT_DATE'),clGray);
      Findings.Chart.Series[6].Add((tdFieldByNameAsFloat(1,'LINE_STANDARD')-(dStdDev * 2)),tdFieldByNameAsString(1,'EVENT_DATE'),clGray);


A set of variables is created to store the total number of test points and sum the as found values (iTotalPoints, dPointsTotal). The tdDoSQLRecords, a new function in Version 9, allows us to create inline queries that return multiple records from the database (a dataset) which we can then loop starting from the first record (tdFirst, tdNext, while not tdEOF) as many times as required for various purposes.

The first time we loop the dataset we are plotting the nominal, as found, and tolerance information while also gathering the total points and summing the as found values in order to calculate our average finding.

The second loop of the data is summing the square of the difference between the nominal and average finding which is then divided by the total points and used in the square root function to derive our standard deviation.

The final loop of the data plots the standard deviation lines at one and two times the value from the nominal.

Now for two final snippets of code.

From the Calc tab select View->Module and select Programs from the Module View.


Switching to the Report Module View


Right mouse click the right view and select to add a new procedure.


Adding a New Procedure


Change the procedure name in the code view to ResetChartData and enter this code:

  if Report.FirstPass = True then

Creation of the Reset Chart Procedure


Now select View Events and select the Groups node in Report Objects. Click the AfterGroupBreak event and add


to the resulting code view.


Calling ResetChartData on the Group Break



As our chart is generated by the Variable1 OnCalc we must reset the chart data as the test point sequences changes. This occurs in the AfterGroupBreak event. If we did not execute the reset our first chart (in the case of three test points) would have data for test point one, the second chart would have the data for test point one and two, and the third chart would have test point data for all three test points.

Running the Report

Select the Preview tab and if you followed every step you should see a chart for each test point for the selected asset with automatically calculated upper and lower standard deviation levels.


Example of a Final Levey-Jennings Chart


Step 4 Linking the Report to the Reports Menu and Equipment View

Save and close the report and printbuilder. From Profile Manager select Management->Equipment Searching / Reports / Layouts from the top menu. Select New then create your report as a menu option as follows:


Linking the Report to the Reports Menu


Upon relaunch of IndySoft the report will appear in your Reports menu under the Analysis sub menu.

As an option you may wish to launch the report from the Equipment View. Simply go into LayoutBuilder for the desired equipment view, add a button or text, then highlight it and double click the Levey-Jennings Report option from the Custom Reports Hyperlink Group.

Where to Go From Here

We’ve only scratched the surface of the reporting and charting options in IndySoft. One of the first things you will likely want to do is tweak the chart lines, colors, etc. which is easily handled in both the editor and minor modification of the Variable1 code in regards to the color names at the end of each line plot command.


The latest release of Printbuilder in tandem with version 9 features offers tons of flexibility in generating asset-specific reports and advanced charting. In this tutorial you learned about:

  1. Passing parameters to reports
  2. Report timings and using Variables instead of OnPrint events
  3. Creating charts manually
  4. The new tdDataSet controls
  5. Adding reports to the reports menu and layout views

Want to learn more? Remember that along with our products IndySoft offers a wide array of services from Training to Advanced Reporting and Configuration. Feel free to contact your IndySoft Sales representative for assistance in selecting the right mix of services to maximize your investment in IndySoft solutions.


Facebook Twitter LinkedIn

IndySoft Corporation Address :: 212 Adley Way Greenville, SC 29607
email :: phone (864) 627-8858 option 1 or ask to speak to sales

copyright © 2013 IndySoft Corporation
privacy policy / terms of use