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

Tag Archives: Calibration Management Software

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:

SELECT
A2.DESCRIPTION AS 'GROUP',
A3.SECURITY_DESCRIPTION AS 'DESCRIPTION',
A.PROFILE AS 'PROFILE1',
A3.SECURITY_VALUE AS 'VALUE1',
B.PROFILE AS 'PROFILE2',
B3.SECURITY_VALUE AS 'VALUE2',
C.PROFILE AS 'PROFILE3',
C3.SECURITY_VALUE AS 'VALUE3',
D.PROFILE AS 'PROFILE4',
D3.SECURITY_VALUE AS 'VALUE4',
E.PROFILE AS 'PROFILE5',
E3.SECURITY_VALUE AS 'VALUE5',
F.PROFILE AS 'PROFILE6',
F3.SECURITY_VALUE AS 'VALUE6',
G.PROFILE AS 'PROFILE7',
G3.SECURITY_VALUE AS 'VALUE7',
H.PROFILE AS 'PROFILE8',
H3.SECURITY_VALUE AS 'VALUE8'
FROM
PROFILE A
LEFT OUTER JOIN SECCAT A2 ON A2.PROFILE = A.PROFILE
LEFT OUTER JOIN SECITEM A3 ON A3.PROFILE = A2.PROFILE AND A3.SECURITY_CATEGORY=A2.SECURITY_CATEGORY,
PROFILE B
LEFT OUTER JOIN SECCAT B2 ON B2.PROFILE = B.PROFILE
LEFT OUTER JOIN SECITEM B3 ON B3.PROFILE = B2.PROFILE AND B3.SECURITY_CATEGORY=B2.SECURITY_CATEGORY,
PROFILE C
LEFT OUTER JOIN SECCAT C2 ON C2.PROFILE = C.PROFILE
LEFT OUTER JOIN SECITEM C3 ON C3.PROFILE = C2.PROFILE AND C3.SECURITY_CATEGORY=C2.SECURITY_CATEGORY,
PROFILE D
LEFT OUTER JOIN SECCAT D2 ON D2.PROFILE = D.PROFILE
LEFT OUTER JOIN SECITEM D3 ON D3.PROFILE = D2.PROFILE AND D3.SECURITY_CATEGORY=D2.SECURITY_CATEGORY,
PROFILE E
LEFT OUTER JOIN SECCAT E2 ON E2.PROFILE = E.PROFILE
LEFT OUTER JOIN SECITEM E3 ON E3.PROFILE = E2.PROFILE AND E3.SECURITY_CATEGORY=E2.SECURITY_CATEGORY,
PROFILE F
LEFT OUTER JOIN SECCAT F2 ON F2.PROFILE = F.PROFILE
LEFT OUTER JOIN SECITEM F3 ON F3.PROFILE = F2.PROFILE AND F3.SECURITY_CATEGORY=F2.SECURITY_CATEGORY,
PROFILE G
LEFT OUTER JOIN SECCAT G2 ON G2.PROFILE = G.PROFILE
LEFT OUTER JOIN SECITEM G3 ON G3.PROFILE = G2.PROFILE AND G3.SECURITY_CATEGORY=G2.SECURITY_CATEGORY,
PROFILE H
LEFT OUTER JOIN SECCAT H2 ON H2.PROFILE = H.PROFILE
LEFT OUTER JOIN SECITEM H3 ON H3.PROFILE = H2.PROFILE AND H3.SECURITY_CATEGORY=H2.SECURITY_CATEGORY
WHERE
A.PROFILE = 'SYSTEM ADMINISTRATOR' AND
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
B2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
B3.SECURITY_ITEM = A3.SECURITY_ITEM AND
C2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
C3.SECURITY_ITEM = A3.SECURITY_ITEM AND
D2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
D3.SECURITY_ITEM = A3.SECURITY_ITEM AND
E2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
E3.SECURITY_ITEM = A3.SECURITY_ITEM AND
F2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
F3.SECURITY_ITEM = A3.SECURITY_ITEM AND
G2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
G3.SECURITY_ITEM = A3.SECURITY_ITEM AND
H2.SECURITY_CATEGORY = A2.SECURITY_CATEGORY AND
H3.SECURITY_ITEM = A3.SECURITY_ITEM AND
A2.DESCRIPTION NOT LIKE 'Event Settings%' AND
A2.DESCRIPTION NOT LIKE 'Schedule Settings%'
ORDER BY
A2.SECURITY_CATEGORY, A3.SECURITY_ITEM;

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;
begin
 
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
begin
  icoAllow.visible := true;
end
else if (Copy(PROFILE['DESCRIPTION'],1,5) = 'Block') then
begin
  icoBlock.visible := true;
end
else if (Pos('Require',PROFILE['DESCRIPTION']) <> 0) then
begin
  icoRequire.visible := true;
end
else
begin
  icoUnknown.visible := true;
end;
 
if ((PROFILE['VALUE1'] = 1) AND
(PROFILE['VALUE2'] = 1) AND
(PROFILE['VALUE3'] = 1) AND
(PROFILE['VALUE4'] = 1) AND
(PROFILE['VALUE5'] = 1) AND
(PROFILE['VALUE6'] = 1) AND
(PROFILE['VALUE7'] = 1) AND
(PROFILE['VALUE8'] = 1)
) then
begin
  p1checked.visible := true;
  p2checked.visible := true;
  p3checked.visible := true;
  p4checked.visible := true;
  p5checked.visible := true;
  p6checked.visible := true;
  p7checked.visible := true;
  p8checked.visible := true;
end
else if ((PROFILE['VALUE1'] = 0) AND
(PROFILE['VALUE2'] = 0) AND
(PROFILE['VALUE3'] = 0) AND
(PROFILE['VALUE4'] = 0) AND
(PROFILE['VALUE5'] = 0) AND
(PROFILE['VALUE6'] = 0) AND
(PROFILE['VALUE7'] = 0) AND
(PROFILE['VALUE8'] = 0)
) then
begin
  p1unchecked.visible := true;
  p2unchecked.visible := true;
  p3unchecked.visible := true;
  p4unchecked.visible := true;
  p5unchecked.visible := true;
  p6unchecked.visible := true;
  p7unchecked.visible := true;
  p8unchecked.visible := true;
end
else
begin
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;
 
end;
end;

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.

Downloads

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.

IndySoft-9.1.12-SecurityProfileComparisonReportsSQL

 

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.

Conclusion

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.

Conclusion

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

report-tree

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 charles.thompson@indysoft.com 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.

final-chart

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.

create-new-report

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.

printbuilder

The Default PrintBuilder Screen

 

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

report-tree

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.

create-parameter

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.

final-parameter

View of the Completed Parameters

 

Now click the Data tab.

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

file-new-query-wizard

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.

query-equipment-test-points

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.

choose-fields

Selecting the Table Fields

 

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

set-order

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.

search-function

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.

search-options

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.

calc-view-events

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.

code-initialize

Testing Code with the Compile Function

 

Explanation

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.

one-pass

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:

data-preview

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.

header-fields

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.

report-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.

group-settings

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.

group-header-fields

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.

placing-the-chart

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.

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.

turn-off-3D

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.

build-the-series

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.

setting-series-point

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.

invisible-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.

triple-dot-properties

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.

variable-timing

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:

var
  iTotalPoints, iSEQ : Integer;
  dPointsTotal, dPointsAverage: Double;
  dRunningAvg, dStdDev: Double;
begin
  if Report.FirstPass = True then
  begin
    iSEQ := Equipment_Test_Points['#'];
    dPointsTotal := 0.0;
    dPointsAverage := 0.0;
    iTotalPoints := 0;
    tdDoSQLRecords(1,'SELECT GAGES.COMPANY, GAGES.GAGE_SN, EVENTS.EVENT_DATE, EVENTS.EVENT_TIME, EVENTS.EVENT_NUM, CALPNTS.SEQ, CALPNTS.LINE_STANDARD, CALPNTS.TOLERANCE1, CALPNTS.TOLERANCE2, CALPNTS.RESULT1, CALPNTS.RESULT2 FROM GAGES GAGES LEFT OUTER JOIN EVENTS EVENTS ON (EVENTS.COMPANY = GAGES.COMPANY) AND (EVENTS.GAGE_SN = GAGES.GAGE_SN) LEFT OUTER JOIN CALPNTS CALPNTS ON (CALPNTS.EVENT_NUM = EVENTS.EVENT_NUM) WHERE ( GAGES.COMPANY = '''+Report.Parameters['company']+''' ) AND ( GAGES.GAGE_SN = '''+Report.Parameters['id']+''' ) AND ( EVENTS.EVENT_TYPE = ''CALIBRATION'' ) AND (CALPNTS.SEQ = ' + IntToStr(iSEQ) + ')  ORDER BY GAGES.COMPANY, GAGES.GAGE_SN, CALPNTS.SEQ, EVENTS.EVENT_DATE, EVENTS.EVENT_TIME');   
    tdFirst(1);
    while tdEOF(1)='0' do
    begin
      Findings.Chart.Series[1].Add(tdFieldByNameAsFloat(1,'TOLERANCE2'),tdFieldByNameAsString(1,'EVENT_DATE'),clRed);
      Findings.Chart.Series[0].Add(tdFieldByNameAsFloat(1,'RESULT1'),tdFieldByNameAsString(1,'EVENT_DATE'),clBlue);
      Findings.Chart.Series[4].Add(tdFieldByNameAsFloat(1,'LINE_STANDARD'),tdFieldByNameAsString(1,'EVENT_DATE'),clGreen);
      Findings.Chart.Series[7].Add(tdFieldByNameAsFloat(1,'TOLERANCE1'),tdFieldByNameAsString(1,'EVENT_DATE'),clRed);
      iTotalPoints := iTotalPoints + 1;
      dPointsTotal := dPointsTotal + tdFieldByNameAsFloat(1,'RESULT1');
      tdNext(1);
    end;
    dPointsAverage := dPointsTotal / iTotalPoints;
    dRunningAvg := 0.0;
    dStdDev := 0.0;
    tdFirst(1);
    while tdEOF(1)='0' do
    begin
      dRunningAvg := dRunningAvg + Sqr(tdFieldByNameAsFloat(1,'LINE_STANDARD') - dPointsAverage);
      tdNext(1);
    end;
    dStdDev := Sqrt(dRunningAvg/iTotalPoints);
    tdFirst(1);
    while tdEOF(1)='0' do
    begin 
      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);
      tdNext(1);
    end;
  end;
end;

Explanation

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.

view-module

Switching to the Report Module View

 

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

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
  begin
   Findings.Chart.Series[0].Clear;
   Findings.Chart.Series[1].Clear;
   Findings.Chart.Series[2].Clear;
   Findings.Chart.Series[3].Clear;
   Findings.Chart.Series[4].Clear;
   Findings.Chart.Series[5].Clear;
   Findings.Chart.Series[6].Clear;
   Findings.Chart.Series[7].Clear;
  end;
reset-chart-data

Creation of the Reset Chart Procedure

 

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

ResetChartData;

to the resulting code view.

reset-chart-data-group

Calling ResetChartData on the Group Break

 

Explanation

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.

preview

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-report

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.

Conclusion

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.

Generating Internal Work Orders

Book Into Lab Event

One aspect of Indysoft Calibration Management that some people overlook is the internal order system. Users of the Commercial Lab Management system are used to the work order system being part of their daily lives but when it comes to calibration for internal manufacturing, it’s a rarely used tool that would otherwise be great for centralizing your lab workload. Version 9 did a lot to increase the visibility of the order system by making it one of the four primary views in the interface instead of a secondary window. Now that it’s practically front-and-center, customers are looking to use this great tool to increase their productivity.

In this post we’re going to give you a quick rundown on how to create a booking event for your internal lab then schedule work order line items to employees on a shared calendar which then populates the pending work tab to keep technicians on task. Keep in mind that if you have IndySoft Commercial Lab Management this process already exists in the base Receive event. For those viewers you can use this post to learn a little more about some of the basic features in the order system, especially as it pertains to the drag and drop scheduling features in the Work Scheduling module.

An Overview of the Order System and Tools

First off, let’s take a look at the interface options and management tools that support the order system. Our first stop is the Order System tab itself. Within the order system tab you can get an immediate view of a selected work order and all scheduled tasks  and statuses. Searching and filtering of work orders and work order details makes quick work of finding specific work orders in the system.

The Order System View

A view of the order system tab

 

Next up is the Pending Work Tab. As work orders are created and tasks are assigned dates and resources, the pending work tab will fill with work to be performed for each employee, or employee group. Features exist that allow visibility of all work order tasks for managers who want to get the bigger picture when it comes to their group workload.

The Pending Work Tab

A view of the pending work tab

 

Tasks make their way to the pending work tab via the work scheduling module. As tasks populate the work order system, unassigned work fills the lower left grid of this intuitive calendar view. To assign a task to a resource and data all you need to do is drag a resource from the right grid to the task on the left, then drag the task onto any one of the 3 views offered by the calendar.

The Work Scheduling Module

A view of the calendar based work scheduling module

 

Flipping the grid view for available resources reveals quick charts that show either the number of jobs (tasks) or amount of time that you have allocated to resources.

Load Graph

View of jobs assigned per resource

Load Graph

View of hours assigned per resource for the current calendar view

 

When tasks have been dragged onto the calendar views they can easily be reassigned to any date or time via drag and drop. Start/end times can even be altered by simply grabbing the edges of the task and dragging them along the timeline.

Drag and Drop Scheduling

Calendars in the work scheduling module support drag and drop functions

 

Multiple employees and groups can be shown in the same calendar view making it simple to visualize the tasks and resource assignments right down to the immediate day view.

Multiple Resource View

Calendars support multiple resource views for easy overview of all work scheduled

 

Creating A Simple Booking Event

Now that we have the basic lay of the land, let’s look at creating a very simple event which will automatically generate a work order and log assets that need to be calibrated as tasks on the workorder. From there we can easily use the work scheduling system to assign the task to a resource. In a real world scenario you might think of this process occurring when an individual drops off assets at the lab for calibration where they are scanned in then later an operations manager assigns the tasks to staff depending on workload. As with many of our process-oriented blog posts, we are skipping many of the low level details that relate to selection rules, field enforcement, document generation, etc. Our intent is to build up your base knowledge of the event model then encourage exploration into some of the more powerful features of the system.

We start by creating a new event in the workflow system. Unless an existing event is really close to what you want to do, it is almost always easiest to clone the Miscellaneous event as a starting point as it has the least amount of features to remove and leaves the most room for extension.

Creating a New Event

Cloning the miscellaneous event often gives us the cleanest starting point for new events.

 

On step 2 of the event we’ll enable the Work Order field then set label to Job Number along with the option of storing the number in the Current Work Order number field (in case we want to push the WO number along to other events. If you’d like more information about Current fields you might pop over to the Where in the World is My Asset? post when you have some time.

Event Fields

Adding the work order field to the event.

 

Over on step 5 all we need to do is check the box to Auto-Generate W.O. Number which will provide us with a unique work order number right in the event. On that note, let’s jump over to the options in Profile Manager that allow us some flexibility in the creation of our WO Numbers.

 

Auto Generate Work Order Number

Setting the option to automatically generate a work order number in the event.

 

From Profile Manager launch the Numbering And Certificate Settings to reveal the following dialog.

Launching the Numbering System

The work order numbering options can be found in the Profile Manager menu options

 

Within this dialog you can create a custom Work Order Prefix and designate the seed number for the work orders. The latter field is most often used when you are transitioning from an existing WO system and want to continue your current numbering sequence.

Numbering Options

Work orders can contain custom prefixes and a seed number.

 

Ok now back in Workflow Management we go to step 16 which is usually used to daisy chain events (i.e. conditionally launch the user into a secondary event based on conditions from the first event. We create a new Auto-Launch rule and set the default event to launch to CALIBRATION. Next we select to “Create W.O.” which only creates a work order and assigns a default event type of calibration to each asset in the event. The last dropdown should use the Add Equipment option to add the assets to those tasks automatically. You might notice an option back on step 16 at the top stating “Bypass Auto-Launch Confirmation Dialog”. By default we can prompt the user to confirm the Event type to be used on the work order task. A good example might be that we want to designate a CALIBRATION or a REPAIR event depending on what the user requires. In this example we want that check box ticked as we want to force all work order tasks to be setup as calibrations.

Creating The AutoLaunch Rule

Creating a rule to generate a work order and assign assets and tasks automatically.

 

A WalkThrough of the Completed Event

Ok so let’s see what this configuration looks like on the front end of the application. After completing the event it becomes available on our Events menu.

Customized Event on the Menu

Our custom event appears on the events menu

 

After scanning in or searching and selecting one or more assets, the Job Number field will auto-populate with our next available WO number.

Executing the Event

Selecting an asset in the Book Into Lab event automatically generates a work order.

 

When the event is completed, a historical record will be logged showing the user has booked the equipment into the lab. We can also see the associated Job Number in the history view.

Creation of History

Bookings are logged as historical events.

 

Moving to the Work Order view we can see the resulting work order and pending calibration task.

Work Order

An example work order created from an event.

 

The operations manager can open the Work Scheduling module where they see unscheduled or unassigned work.

Unscheduled Work

Unscheduled tasks from work orders show in the Work Scheduling module.

 

The manager simply drags an employee to the task…

Assigning a Resource to a Task

Tasks are assigned to resources simply by dragging and dropping the resource on the task.

 

Then drags the job on to a calendar day and/or time.

Scheduling the Task

Tasks are scheduled by simply dragging them into a calendar view.

 

The task is then scheduled on a day and time for a specific resource. The task can be rescheduled by dragging a different name onto the task or moving and resizing it within the calendar views.

View of a Scheduled Task

Tasks appear logically in a calendar/agenda view and can be modified by drag and drop actions.

 

The resulting Pending Work tab shows Roy Platt that he has some work to do.

Scheduled Work for an Employee

Employees are presented with a singular list of assigned tasks in the main interface.

 

In this article we showed the basic order system management tools and introduced you to a simple event which allowed automatic creation of work orders for equipment booked into the lab. From there a lab resource was able to take the work order tasks and effectively schedule time and resources for execution. Finally, the end techs were presented with a singular view of all scheduled and pending work.

We hope you found this article of interest. More information about the workflow management and order system features can be found in the expansive Version 9 documentation. Keep in mind that IndySoft also offers customized training programs to educate you on the system relative to your business goals. More information on training can be obtained by contacting your IndySoft Sales Representative.

 

Facebook Twitter LinkedIn

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

copyright © 2013 IndySoft Corporation
privacy policy / terms of use