Sidebar

TechTip: Suggestions for DB2 for i Code Quality Testing

DB2
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

Prepare to put your DB2 SQL code "through the ringer" to ensure it's ready for prime time.

 

Typically, developers love writing new code. And while an application is new and business rules are fresh in the mind, it's generally pleasurable to enhance code as change requests meander in. But after the years roll on, and business requirements are forgotten, and complex code looks unfamiliar, then maintaining the code can get downright ugly. How does one know an obscure business rule wasn't violated when changing code?   It's usually not until code has been moved into production that the misery starts after a bug rears its ugly head.

 

Writing unit tests against code is one way to help safeguard from the inherent dangers of changing an application. What is unit testing? Wikipedia defines unit testing as follows:

 

"…unit testing is a method by which individual units of source code, sets of one or more computer program modules together with associated control data, usage procedures, and operating procedures are tested to determine if they are fit for use. Intuitively, one can view a unit as the smallest testable part of an application. In procedural programming, a unit could be an entire module, but it is more commonly an individual function or procedure. In object-oriented programming, a unit is often an entire interface, such as a class, but could be an individual method. Unit tests are short code fragments created by programmers…during the development process."

 

The goal of unit tests are to make sure that pieces of code perform as expected. In addition to unit tests, another type of database test is what I call a "quality" test. In other words, even if the logic functions correctly, is the code ready for prime time? A quality test ensures that, for example, the DB2 object is defined optimally for performance (for example, a function that should have determinism defined) and that it is properly secured (can user TOM run a procedure even though he shouldn't be allowed?).

 

Microsoft .NET and Java developers have the benefit of many available tools and frameworks that assist with unit testing. However, I'm not familiar with unit test tools for traditional IBM I, so I'm going to lay out some ideas on how to approach writing unit tests for DB2 for i code. By extension, these concepts can be applied to HLL code such as RPG, COBOL, and C.

 

If you're already using a Java unit test framework, you can possibly integrate tests against HLL and database code using PCML calls and external Java wrappers for procedures and functions, although it's up to you to determine if the effort is worthwhile.

Unit and Quality Test Examples

It's probably best to start out with how a unit test may be written against DB2 for i code. In these examples, I'll use dynamic compound statements (available in IBM i 7.1 PTF level 26), although you can also create stored procedures or write embedded SQL programs to accomplish the same result.

 

With these few examples, I'll provide some ideas about how to test DB2 for i user-defined functions, views, triggers, database object attributes, and security. Generally, when a test fails, an error is signaled, and when it succeeds, the code simply ends.

Sample 1: Deterministic User-Defined Function Unit Tests

The easiest code to test is deterministic code that doesn't depend on database data. Consider a DB2 user-defined scalar function called FMTDATE that is supposed to convert a numeric date in CYYMMDD format to a string formatted according to a secondary parameter. The function definition looks like this:

 

CREATE OR REPLACE FUNCTION QGPL.FMTDATE(

CYMD_DATE INT,

DATE_FMT VARCHAR(5))

RETURNS VARCHAR(10)

 

A dynamic compound statement to test this script may look something like this (with possibly more test conditions):

 

-- Sample 1 - test scalar UDF FMTDATE

BEGIN

   IF (VALUES (QGPL.FMTDATE(1100101,'*ISO')))<>'2010-01-01' THEN

       SIGNAL SQLSTATE '38005'

           SET MESSAGE_TEXT='Function FMTDATE failed the *ISO format test';

   END IF;

   IF (VALUES (QGPL.FMTDATE(1100101,'*MDY')))<>'01/01/10' THEN

       SIGNAL SQLSTATE '38005'

           SET MESSAGE_TEXT='Function FMTDATE failed the *MDY format test';

   END IF;

   IF (VALUES (QGPL.FMTDATE(1100101,'*YMD')))<>'10/01/01' THEN

       SIGNAL SQLSTATE '38005'

           SET MESSAGE_TEXT='Function FMTDATE failed the *YMD format test';

   END IF;

   IF (VALUES (QGPL.FMTDATE(CAST(NULL AS INT),'*YMD'))) IS NOT NULL THEN

       SIGNAL SQLSTATE '38005'

           SET MESSAGE_TEXT='Function FMTDATE is expected to return a NULL when Parameter 1 is NULL';

   END IF;

   IF (VALUES (QGPL.FMTDATE(1100101,CAST(NULL AS CHAR(1))))) IS NOT NULL THEN

       SIGNAL SQLSTATE '38005'

           SET MESSAGE_TEXT='Function FMTDATE is expected to return a NULL when Parameter 2 is NULL';

   END IF;

END;

 

So the idea of a unit test is to make sure that the code logic behaves as expected under many conditions. With the above date function, a developer would ideally write statements to test…

  • various possibilities for the acceptable format values
  • unexpected values such as a NULL or a negative numeric date

 

Since the number of possibilities can grow quite large, the goal is just to test within reason and include any special values. If a developer changes the function in such a way that causes the test script to fail, the failure will indicate the code change should be reviewed.

Sample 2: Verifying a Stored Procedure Result Set Unit Test

Many applications return result sets from queries or stored procedures. When a procedure is run against a known set of data, the result set can be interrogated and verified to be accurate. Consider the following simple procedure that returns one result set:

 

CREATE OR REPLACE PROCEDURE ADVWORKS.GET_CURRENT_SHIPMENTS

(IN @SHIPDATE DATE)

LANGUAGE SQL

RESULT SETS 1

SET OPTION COMMIT=*NONE,USRPRF=*OWNER,DATFMT=*ISO

BEGIN

   DECLARE SHIPMENTS CURSOR FOR

   SELECT SalesOrderId,SubTotal

     FROM AdvWorks.SalesOrderHeader

     WHERE CAST(SHIPDATE AS DATE)=@SHIPDATE>

   FOR READ ONLY;

 

   OPEN SHIPMENTS;

END;

 

The following dynamic compound statement illustrates how the result set can be interrogated for expected results:

 

BEGIN

   DECLARE @SHIPMENT_COUNT INT DEFAULT 0;

   DECLARE @SALES_ORDER_ID INT;

   DECLARE @SUBTOTAL DEC(17,4);

   DECLARE @SHIPMENT_VALUE DEC(17,4) DEFAULT 0;

   DECLARE @MESSAGE VARCHAR(70);

   DECLARE @SHIPMENT_DATA RESULT_SET_LOCATOR VARYING;

   DECLARE @END_OF_DATA   SMALLINT NOT NULL DEFAULT 0;

 

   DECLARE CONTINUE HANDLER FOR NOT FOUND

       SET @END_OF_DATA=1;

 

   CALL ADVWORKS.GET_CURRENT_SHIPMENTS ('2002-05-01');

 

   ASSOCIATE RESULT SET LOCATOR(@SHIPMENT_DATA)

   WITH PROCEDURE ADVWORKS.GET_CURRENT_SHIPMENTS;

 

   ALLOCATE SHIPMENT_TEST CURSOR FOR RESULT SET @SHIPMENT_DATA;

 

   FETCH SHIPMENT_TEST INTO @SALES_ORDER_ID,@SUBTOTAL;

  

   Read_Data:

   LOOP

       IF @END_OF_DATA=1 THEN

           LEAVE Read_Data;

       END IF;

       SET @SHIPMENT_COUNT=@SHIPMENT_COUNT+1;

       SET @SHIPMENT_VALUE=@SHIPMENT_VALUE+COALESCE(@SUBTOTAL,0);

       FETCH SHIPMENT_TEST INTO @SALES_ORDER_ID,@SUBTOTAL;

   END LOOP Read_Data;

   CLOSE SHIPMENT_TEST;

 

   -- Check Results

   IF @SUBTOTAL<>3374.9900 THEN

       SET @MESSAGE='Shipment subtotal '

           || CAST(@SHIPMENT_VALUE AS VARCHAR(15))

           || ' does not match expected value of $3374.9900';

       SIGNAL SQLSTATE '38002'

           SET MESSAGE_TEXT=@MESSAGE;

   END IF;

   IF @SHIPMENT_COUNT<>4 THEN

       SET @MESSAGE='Shipment count '

          || CAST(@SHIPMENT_COUNT AS VARCHAR(10))

           || ' does not match expected value of 4';

       SIGNAL SQLSTATE '38003'

           SET MESSAGE_TEXT=@MESSAGE;

   END IF;

END;

 

Two tests are done here: verifying that only four rows are returned and verifying that the subtotal of the shipments equals a specific amount.

 

In case you're unfamiliar with reading a result set as a cursor, starting in IBM i 7.1 the ASSOCIATE RESULT SET LOCATOR and ALLOCATE CURSOR statements are available to crack open the result sets of another procedure. For more info on processing result sets, see this article. If you're not on IBM i 7.1 yet, result set based tests can be written in other languages, such as VBScript, JavaScript, Java, or C#.

 

A more thorough test would be to validate every row and column in the result set. To do this, an expected result set would be persisted as XML (or some other format) and then a more intricate test harness would actually compare each value in every row and column.

 

For this type of row/column test to work, the result sets have to be ordered and columns containing special registers such as CURRENT_TIMESTAMP, CURRENT_SERVER, and USER should be ignored (because they can vary among runs, IBM i partitions, etc.). The new XMLTABLE table function (requires IBM i 7.1 TR4) can assist with the chore of incorporating XML into a database query. For more details, see the developerWorks XMLTABLE document and this Technology Refresh 4 article.

In this example, the test was more complicated than the procedure itself! Exactly what kind of testing is implemented will depend on perceived code vulnerability, time to write and review the test(s), etc.

Food for Thought: Applying the Above Technique to User-Defined Table Functions, Views

Because table functions return a result set, both table functions and views can be tested in similar fashion to the above stored procedure demonstration. The generic test steps are 1) write a cursor for a test query (based on the view or table function) and 2) read the results. Various kinds of tests can be done, such as comparing aggregates (as shown above) or comparing against a persisted XML or other type of result set. Varying the query filters and focusing on specific complex column expressions that may be prone to error are additional items that can be tested.

Sample 3: Evaluating the Work of a Trigger

Triggers can be tested by updating the base table or view and then checking to make sure the trigger did its work. In this simple example, a row is inserted into the ADVWORKS.STORE table, causing an INSERT trigger to fire. The insert trigger is expected to insert a new row into audit table STORE_MAINT_LOG. The test's logic simply compares the row count of the log table before and after the INSERT is done against table ADVWORKS.STORE. Of course, the trigger test may often need to be much more complicated than a simple row count check.

 

BEGIN

   DECLARE @BEFORE_COUNT INT NOT NULL DEFAULT 0;

   DECLARE @AFTER_COUNT INT NOT NULL DEFAULT 0;

 

   -- Find out how many rows are in the log table

   SET @BEFORE_COUNT=

   (SELECT COUNT(*) FROM ADVWORKS.STORE_MAINT_LOG);

 

   -- Cause the trigger to fire by simulating a new store creation

   INSERT INTO ADVWORKS.STORE (CUSTOMERID, NAME,

   SALESPERSONID,DEMOGRAPHICS, MODIFIEDDATE,ROWGUID)

   VALUES(1002, 'Bed, Bath, Bicycles & Beyond',

         2,4,CURRENT_DATE,GENERATE_UNIQUE());

 

   -- Find out how many rows are in the log table after the trigger

   SET @AFTER_COUNT=(SELECT COUNT(*) FROM ADVWORKS.STORE_MAINT_LOG);

 

   IF @BEFORE_COUNT <> @AFTER_COUNT - 1 THEN

       SIGNAL SQLSTATE '38006'

           SET MESSAGE_TEXT='Trigger TRG_STORE_INSERT did not process correctly';

   END IF;

END

Sample 4: Testing Database Object Attributes

Besides unit testing, other quality tests can be done to make sure the code will behave as expected. Say, for instance, there's a C library of advanced math functions you want to make available for DB2 to use as external functions. You know these external functions will perform best when they're defined with DETERMINISTIC and NO EXTERNAL ACTION.

 

Assuming the following test is to be run after a developer creates or changes a C external function, it's job is to verify that all of the external C functions in a particular library have been defined with DETERMINISTIC and NO EXTERNAL ACTION:

 

-- Verify that external C functions in test lib

-- are all DETERMINISTIC with NO EXTERNAL ACTION.

BEGIN

   IF EXISTS (

   SELECT *

     FROM QSYS2.SYSFUNCS

     WHERE EXTERNAL_LANGUAGE='C'

       AND SPECIFIC_SCHEMA='MY_TEST_LIB' -- should be a variable!

       AND (IS_DETERMINISTIC='NO'

       OR EXTERNAL_ACTION='E')) THEN

       SIGNAL SQLSTATE '38001'

           SET MESSAGE_TEXT='Inspect all C functions to make sure DETERMINISTIC and NO EXTERNAL ACTION are defined.';

   END IF;

END

 

Similar tests can be written against the many DB2 catalog views to ensure that other DB2 objects are defined optimally. For example, procedures can also be checked for specific attributes, views can be verified to depend only on objects in the same schema, etc.

Sample 5: Security Test

Another aspect of assuring quality database code is to make sure security works correctly. There's nothing worse than finding out an unauthorized user was able to access sensitive data. In this sample, the test checks whether stored procedure PAYROLL_INFO can be run by user PEASANT. If the execution of the procedure fails with a "not authorized" error, the test will pass. However, if the execution succeeds, then the test fails:

 

-- This test will use profile PEASANT

CALL dev.ChangeCurrentUser('PEASANT','serf');

BEGIN

   DECLARE @AUTH_FAILED SMALLINT NOT NULL DEFAULT 0;

   DECLARE CONTINUE HANDLER FOR SQLSTATE '42501'

       SET @AUTH_FAILED=1;

 

   CALL ADVWORKS.PAYROLL_INFO (1,'2010-01-01','2010-01-07');

 

   IF @AUTH_FAILED = 0 THEN

       SIGNAL SQLSTATE '38004'

           SET MESSAGE_TEXT='User PEASANT was allowed to run the payroll report';

   END IF;

END;

-- Change the profile back to NOBLE

CALL dev.ChangeCurrentUser('NOBLE','password');

 

Security is one of those areas that's often overlooked when deploying code, especially during a hot bug fix. Having security-related test scripts can help catch whether a GRANT or REVOKE statement that should've been executed was forgotten.

 

Also, the above example uses the custom stored procedure ChangeCurrentUser to impersonate another user profile. This procedure is an alternative to SET SESSION AUTHORIZATION. For more info on impersonating another user in DB2, see these articles:


TechTip: Impersonate Your Neighbor Using DB2 for i

 

TechTip: DB2 for i Impersonation Take 2: External Routines

I Know What You're Thinking

If you're like me, because of the amount of work involved, the concept of testing in this manner garners an immediate "NO WAY!" response. However, I've since changed my tune, and I think that testing with these methods is very important. In a future tip, I'll share ideas on how testing can be accomplished on a regular basis, how to setup test data, and why it's worth the effort.

 

Michael Sansoterra is a DBA for Broadway Systems in Grand Rapids, Michigan. He can be contacted at sqlsleuth@gmail.com.


BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

RESOURCE CENTER

  • WHITE PAPERS

  • WEBCAST

  • TRIAL SOFTWARE

  • White Paper: Node.js for Enterprise IBM i Modernization

    SB Profound WP 5539

    If your business is thinking about modernizing your legacy IBM i (also known as AS/400 or iSeries) applications, you will want to read this white paper first!

    Download this paper and learn how Node.js can ensure that you:
    - Modernize on-time and budget - no more lengthy, costly, disruptive app rewrites!
    - Retain your IBM i systems of record
    - Find and hire new development talent
    - Integrate new Node.js applications with your existing RPG, Java, .Net, and PHP apps
    - Extend your IBM i capabilties to include Watson API, Cloud, and Internet of Things


    Read Node.js for Enterprise IBM i Modernization Now!

     

  • Profound Logic Solution Guide

    SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation.
    Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects.
    The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the companyare not aligned with the current IT environment.

    Get your copy of this important guide today!

     

  • 2022 IBM i Marketplace Survey Results

    Fortra2022 marks the eighth edition of the IBM i Marketplace Survey Results. Each year, Fortra captures data on how businesses use the IBM i platform and the IT and cybersecurity initiatives it supports.

    Over the years, this survey has become a true industry benchmark, revealing to readers the trends that are shaping and driving the market and providing insight into what the future may bring for this technology.

  • Brunswick bowls a perfect 300 with LANSA!

    FortraBrunswick is the leader in bowling products, services, and industry expertise for the development and renovation of new and existing bowling centers and mixed-use recreation facilities across the entertainment industry. However, the lifeblood of Brunswick’s capital equipment business was running on a 15-year-old software application written in Visual Basic 6 (VB6) with a SQL Server back-end. The application was at the end of its life and needed to be replaced.
    With the help of Visual LANSA, they found an easy-to-use, long-term platform that enabled their team to collaborate, innovate, and integrate with existing systems and databases within a single platform.
    Read the case study to learn how they achieved success and increased the speed of development by 30% with Visual LANSA.

     

  • The Power of Coding in a Low-Code Solution

    LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed.
    Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

    • Discover the benefits of Low-code's quick application creation
    • Understand the differences in model-based and language-based Low-Code platforms
    • Explore the strengths of LANSA's Low-Code Solution to Low-Code’s biggest drawbacks

     

     

  • Why Migrate When You Can Modernize?

    LANSABusiness users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.
    In this white paper, you’ll learn how to think of these issues as opportunities rather than problems. We’ll explore motivations to migrate or modernize, their risks and considerations you should be aware of before embarking on a (migration or modernization) project.
    Lastly, we’ll discuss how modernizing IBM i applications with optimized business workflows, integration with other technologies and new mobile and web user interfaces will enable IT – and the business – to experience time-added value and much more.

     

  • UPDATED: Developer Kit: Making a Business Case for Modernization and Beyond

    Profound Logic Software, Inc.Having trouble getting management approval for modernization projects? The problem may be you're not speaking enough "business" to them.

    This Developer Kit provides you study-backed data and a ready-to-use business case template to help get your very next development project approved!

  • What to Do When Your AS/400 Talent Retires

    FortraIT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators is small.

    This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn:

    • Why IBM i skills depletion is a top concern
    • How leading organizations are coping
    • Where automation will make the biggest impact

     

  • Node.js on IBM i Webinar Series Pt. 2: Setting Up Your Development Tools

    Profound Logic Software, Inc.Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. In Part 2, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Attend this webinar to learn:

    • Different tools to develop Node.js applications on IBM i
    • Debugging Node.js
    • The basics of Git and tools to help those new to it
    • Using NodeRun.com as a pre-built development environment

     

     

  • Expert Tips for IBM i Security: Beyond the Basics

    SB PowerTech WC GenericIn this session, IBM i security expert Robin Tatam provides a quick recap of IBM i security basics and guides you through some advanced cybersecurity techniques that can help you take data protection to the next level. Robin will cover:

    • Reducing the risk posed by special authorities
    • Establishing object-level security
    • Overseeing user actions and data access

    Don't miss this chance to take your knowledge of IBM i security beyond the basics.

     

     

  • 5 IBM i Security Quick Wins

    SB PowerTech WC GenericIn today’s threat landscape, upper management is laser-focused on cybersecurity. You need to make progress in securing your systems—and make it fast.
    There’s no shortage of actions you could take, but what tactics will actually deliver the results you need? And how can you find a security strategy that fits your budget and time constraints?
    Join top IBM i security expert Robin Tatam as he outlines the five fastest and most impactful changes you can make to strengthen IBM i security this year.
    Your system didn’t become unsecure overnight and you won’t be able to turn it around overnight either. But quick wins are possible with IBM i security, and Robin Tatam will show you how to achieve them.

  • Security Bulletin: Malware Infection Discovered on IBM i Server!

    SB PowerTech WC GenericMalicious programs can bring entire businesses to their knees—and IBM i shops are not immune. It’s critical to grasp the true impact malware can have on IBM i and the network that connects to it. Attend this webinar to gain a thorough understanding of the relationships between:

    • Viruses, native objects, and the integrated file system (IFS)
    • Power Systems and Windows-based viruses and malware
    • PC-based anti-virus scanning versus native IBM i scanning

    There are a number of ways you can minimize your exposure to viruses. IBM i security expert Sandi Moore explains the facts, including how to ensure you're fully protected and compliant with regulations such as PCI.

     

     

  • Encryption on IBM i Simplified

    SB PowerTech WC GenericDB2 Field Procedures (FieldProcs) were introduced in IBM i 7.1 and have greatly simplified encryption, often without requiring any application changes. Now you can quickly encrypt sensitive data on the IBM i including PII, PCI, PHI data in your physical files and tables.
    Watch this webinar to learn how you can quickly implement encryption on the IBM i. During the webinar, security expert Robin Tatam will show you how to:

    • Use Field Procedures to automate encryption and decryption
    • Restrict and mask field level access by user or group
    • Meet compliance requirements with effective key management and audit trails

     

  • Lessons Learned from IBM i Cyber Attacks

    SB PowerTech WC GenericDespite the many options IBM has provided to protect your systems and data, many organizations still struggle to apply appropriate security controls.
    In this webinar, you'll get insight into how the criminals accessed these systems, the fallout from these attacks, and how the incidents could have been avoided by following security best practices.

    • Learn which security gaps cyber criminals love most
    • Find out how other IBM i organizations have fallen victim
    • Get the details on policies and processes you can implement to protect your organization, even when staff works from home

    You will learn the steps you can take to avoid the mistakes made in these examples, as well as other inadequate and misconfigured settings that put businesses at risk.

     

     

  • The Power of Coding in a Low-Code Solution

    SB PowerTech WC GenericWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed.
    Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

    • Discover the benefits of Low-code's quick application creation
    • Understand the differences in model-based and language-based Low-Code platforms
    • Explore the strengths of LANSA's Low-Code Solution to Low-Code’s biggest drawbacks

     

     

  • The Biggest Mistakes in IBM i Security

    SB Profound WC Generic The Biggest Mistakes in IBM i Security
    Here’s the harsh reality: cybersecurity pros have to get their jobs right every single day, while an attacker only has to succeed once to do incredible damage.
    Whether that’s thousands of exposed records, millions of dollars in fines and legal fees, or diminished share value, it’s easy to judge organizations that fall victim. IBM i enjoys an enviable reputation for security, but no system is impervious to mistakes.
    Join this webinar to learn about the biggest errors made when securing a Power Systems server.
    This knowledge is critical for ensuring integrity of your application data and preventing you from becoming the next Equifax. It’s also essential for complying with all formal regulations, including SOX, PCI, GDPR, and HIPAA
    Watch Now.

  • Comply in 5! Well, actually UNDER 5 minutes!!

    SB CYBRA PPL 5382

    TRY the one package that solves all your document design and printing challenges on all your platforms.

    Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product.

    Request your trial now!

  • Backup and Recovery on IBM i: Your Strategy for the Unexpected

    FortraRobot automates the routine tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:
    - Simplified backup procedures
    - Easy data encryption
    - Save media management
    - Guided restoration
    - Seamless product integration
    Make sure your data survives when catastrophe hits. Try the Robot Backup and Recovery Solution FREE for 30 days.

  • Manage IBM i Messages by Exception with Robot

    SB HelpSystems SC 5413Managing messages on your IBM i can be more than a full-time job if you have to do it manually. How can you be sure you won’t miss important system events?
    Automate your message center with the Robot Message Management Solution. Key features include:
    - Automated message management
    - Tailored notifications and automatic escalation
    - System-wide control of your IBM i partitions
    - Two-way system notifications from your mobile device
    - Seamless product integration
    Try the Robot Message Management Solution FREE for 30 days.

  • Easiest Way to Save Money? Stop Printing IBM i Reports

    FortraRobot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing.
    Manage your reports with the Robot Report Management Solution. Key features include:

    - Automated report distribution
    - View online without delay
    - Browser interface to make notes
    - Custom retention capabilities
    - Seamless product integration
    Rerun another report? Never again. Try the Robot Report Management Solution FREE for 30 days.

  • Hassle-Free IBM i Operations around the Clock

    SB HelpSystems SC 5413For over 30 years, Robot has been a leader in systems management for IBM i.
    Manage your job schedule with the Robot Job Scheduling Solution. Key features include:
    - Automated batch, interactive, and cross-platform scheduling
    - Event-driven dependency processing
    - Centralized monitoring and reporting
    - Audit log and ready-to-use reports
    - Seamless product integration
    Scale your software, not your staff. Try the Robot Job Scheduling Solution FREE for 30 days.