13
Thu, Jun
4 New Articles

TechTip: Date Arithmetic in CL Programs

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

Date arithmetic in CL programs is limited and lacks the simplicity and scope found in RPG. This article provides a command that brings RPG date capabilities to CL programs.

Date handling and arithmetic in RPG is superb, capable, and straightforward. (I've written about it before in Calculate Begin and End Dates for Any Month and here in RPG IV Legacy Dates Cheat Sheet). But when it comes to dates in a CL program, there are limited capabilities, and you need more coding.

If you search the web for "date arithmetic in CL programs," you will find numerous hints and approaches. Even IBM provides an example program. But none are as simple or robust as what RPG provides. To reduce the complexity, I offer the DATEADJ command to add the functionality of RPG date handling to CL programs.

The DATEADJ Command

DATEADJ adjusts a date forward or backward by days, months, or years and returns an adjusted date. Input and output dates can be in almost any format that RPG recognizes.

A prompted command looks like this:

TechTip: Date Arithmetic in CL Programs - Figure 1 

Figure 1: The prompted DATEADJ command.

Input Date can be *JOBDATE to use the job date, or *SYSTEM to use the system date, or a character date value, e.g., 12/31/21.

Output Date is where the adjusted date is returned.

Amount to adjust by is the adjustment amount: positive to add to the date or negative to subtract from the date. Zero is also allowed, which allows you to simply reformat a date.

Adjustment type defines the type of the adjustment amount: *DAYS, *MONTHS, or *YEARS.

Input Date Format specifies the format of the input date. It allows nearly all the date formats that RPG allows: *YMD, *MDY, *DMY, *ISO, *JUL, etc., with or without delimiters. It also allows *JOBFMT for an input date in job format and *SYSTEM for an input date in system format. (Input date format does not apply if Input Date is *JOBDATE or *SYSTEM, since these are predefined by the operating system.)

Output Date Format defines the format of the returned date. It allows all the input formats, plus it defaults to *INFMT to specify the same format as the input date.

Simple DATEADJ Usage Examples

/* Tomorrow */

    DATEADJ    INDATE(*SYSTEM) OUTDATE(&NEWDTE)

/* Yesterday*/

    DATEADJ    INDATE(*JOBDATE) OUTDATE(&NEWDTE) ADJAMT(-1)

/* Day before arbitrary date & reformat */

    DATEADJ    INDATE('2019-03-21') OUTDATE(&NEWDTE) +

                ADJAMT(-1) INFMT(*ISO) OUTFMT(*JOBFMT)

                          OUTFMT(*INFMT)

Complex DATEADJ Usage Example

/* Calculate last month beginning and ending dates */

    DCL        VAR(&THISDAY) TYPE(*CHAR) LEN(2)

    DCL        VAR(&ADJ) TYPE(*CHAR) LEN(3)

    DCL        VAR(&WKDATE) TYPE(*CHAR) LEN(10)

    DCL        VAR(&EOML) TYPE(*CHAR) LEN(10)

    DCL        VAR(&BOML) TYPE(*CHAR) LEN(10)

/* Adjustment is minus day value of today in system date*/

    RTVSYSVAL  SYSVAL(QDAY) RTNVAR(&THISDAY)

    CHGVAR     VAR(&ADJ) VALUE('-' *TCAT &THISDAY)

/* Last day of last month */

    DATEADJ    INDATE(*SYSTEM) OUTDATE(&EOML) ADJAMT(&ADJ)

/* 1st day of this month */

    DATEADJ    INDATE(&EOML) OUTDATE(&WKDATE) ADJAMT(1)

/* 1st day of last month */

    DATEADJ    INDATE(&WKDATE) OUTDATE(&BOML) ADJAMT(-1) +

                ADJTYPE(*MONTHS) INFMT('*SYSTEM')

    SNDMSG     MSG('Last month is' *BCAT &BOML *BCAT +

                'through' *BCAT &EOML) TOUSR(*REQUESTER)

How It Works

The Command processing program (CPP) for DATEADJ is an RPG program, DATEADJR, that leverages the RPG date handling capabilities.

DATEADJR does some setup code to take care of the default special values, converts the input date to a date data type, does the arithmetic, and finally converts the adjusted date to the desired output format.

The input date conversion is a long SELECT statement that starts like this:

  select;

    when (inFmt = '*YMD');

      outDate = %date(inChar : *YMD);

    when (inFmt = '*MDY');

      outDate = %date(inChar : *MDY);

    when (inFmt = '*DMY');

      outDate = %date(inChar : *DMY);

The output date conversion is the inverse, and it starts like this:

  select;

    when (inFmt = '*YMD');

      outDate = %date(inChar : *YMD);

    when (inFmt = '*MDY');

      outDate = %date(inChar : *MDY);

    when (inFmt = '*DMY');

      outDate = %date(inChar : *DMY);

All the date conversions are wrapped in MONITOR groups. Invalid dates or adjustments resulting in overflow or underflow return a CPF9898 *ESCAPE message.

Coding Comments

DATEADJR is not a complex RPG program, and adding additional custom date formats should be easy. Probably the most complex part was ensuring that all the input and output formats were covered and each had a test case.

For completeness, I created a help panel group (DATEADJP.PNLGRP). If you want to add help to your own commands, I recommend starting with IBM's GENCMDDOC command to give you a basic outline. (If you want additional background on the UIM markup language used in help panels, it is hard to find. IBM pointed me to the Application Display Programming PDF.) While SEU will edit panel groups, it is vastly simpler to use a GUI editor. My current editor of choice is the free Code for IBM i extension to VS Code.

I doubt if execution speed is a consideration, because I see DATEADJ generally being executed only at the start of a job. That being said, my test program runs the command over 70 times, and on PUB400.COM it completed in under 1 second and used 0.041 processing units.

Source

All the code can be downloaded from MCPressOnline.com. Alternatively, you can inspect or download the complete code at my GITHUB repository. If you find any bugs, or have any comments, or know any better way to provide this functionality to a CL program, I'd like to hear about it.

Sam Lennon

Sam Lennon is an analyst, developer, consultant and IBM i geek. He started his programming career in 360 assembly language on IBM mainframes, but moved to the AS400 platform in 1991 and has been an AS400/iSeries/i5/IBM i advocate ever since.

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$0.00 Raised:
$

Book Reviews

Resource Center

  • SB Profound WC 5536 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. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • 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 company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY 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. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) 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:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. 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:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot 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:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business 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.

  • 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:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic 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.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? 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: