25
Thu, Apr
1 New Articles

The Indent RPG IV Source Utility

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

Most modern programming languages include structured operations that allow you to control the flow of a program's execution. These types of operations generally fall into two categories: decision operations such as if...then...else and iteration operations such as do while. RPG has had these types of operations for many years; however, RPG differs from most programming languages in that it doesn't allow you to arrange your source code in a way that lets you easily see these structures. One of the biggest complaints I hear about RPG is that it forces you to code in a rather unnatural columnar fashion rather than giving you the freedom to indent your source code based on the flow of the structured operations.

IBM's answer to this problem is the INDENT parameter on the Create RPG Program (CRTRPGPGM), Create Bound RPG Program (CRTBNDRPG), and Create RPG Module (CRTRPGMOD) commands. This parameter controls whether structured operations will be indented in the compile listing. Though I often use this feature, it does have limitations. First, it requires you to submit a compile and wait for it to complete. Then, you have to locate the spooled file and select an option to display or print it. Furthermore, if you only want to look at one small section of code, you have to produce an entire compile listing of the program and then find the section of code you want to look at.

I've always thought there should be a better way to view RPG source code. My original solution to this problem is the utility presented in "Indenting RPG Source" (MC, December 1991). This utility solves a number of these problems for RPG III source code. It lets you display indented source code without having to create a compile listing, and you can optionally view just a portion of a source member. However, when IBM came out with RPG IV (ILE RPG), the original utility I wrote couldn't handle the new format of the language. In this article, I'll introduce you to a new version of the utility, the Indent ILE RPG Source (INDILERPG) command, that accomplishes a similar task for RPG IV source code.

When you prompt the INDILERPG command, you'll find six parameters. The first parameter, SRCMBR, is the only one required. This is where you specify the name of the source member you want to view. The second parameter, SRCFILE, is where you specify the name of the source file that contains the member. This parameter defaults to the first occurrence of QRPGLESRC in your library list. The third and fourth parameters, LOWSEQ and HISEQ, allow you to specify the range of statement numbers you want to look at. The default values on these parameters will display all statements in the source member. The fifth parameter lets you select the indention symbol you want to use. The default is a vertical bar. Since some printers can't print the vertical bar symbol (or print it very slowly), the utility lets you change it if you want. The sixth parameter, OUTPUT, lets you select whether to display the source code on the screen (the default) or create a spooled file.

When you run the INDILERPG command and send the output to the display, you're presented with a screen similar to the one shown in 1. Here, you see an example of how RPG IV source code looks when it's indented. The screen is designed to look similar to SEU in full-screen browse mode; however, there are a few slight differences. The most notable are the two input fields in the upper left corner of the screen. The first field lets you control the number of lines to scroll when you press the Page Up or Page Down keys. The default value causes the display to scroll 20 lines at a time, which is the size of one page. Enter a larger value when you want to scroll through the code more quickly. Enter a lower value when you want to fine-tune the position of the code on the screen. The second field allows you to shift the display left or right by entering a starting column number. The default value starts the display in column 6, just as SEU does with an RPG IV source member. You can also use F19 to shift left and F20 to shift right, just as you can in SDA.

When you run the INDILERPG command and send the output to the display, you're presented with a screen similar to the one shown in Figure 1. Here, you see an example of how RPG IV source code looks when it's indented. The screen is designed to look similar to SEU in full-screen browse mode; however, there are a few slight differences. The most notable are the two input fields in the upper left corner of the screen. The first field lets you control the number of lines to scroll when you press the Page Up or Page Down keys. The default value causes the display to scroll 20 lines at a time, which is the size of one page. Enter a larger value when you want to scroll through the code more quickly. Enter a lower value when you want to fine-tune the position of the code on the screen. The second field allows you to shift the display left or right by entering a starting column number. The default value starts the display in column 6, just as SEU does with an RPG IV source member. You can also use F19 to shift left and F20 to shift right, just as you can in SDA.

The code for the INDILERPG command is shown in 2. This command calls program RPG005CL, shown in 3, as its command processing program. RPG005CL performs some basic validation on the command parameters. First, it checks to make sure that the file, library, and member actually exist. Then, it checks to be sure that the file is a source file. Finally, it checks that the member type is RPGLE. If the command parameters pass all of these validations, the program performs an override to the requested file and member and calls an RPG IV program to perform the actual indenting of the source code.

The code for the INDILERPG command is shown in Figure 2. This command calls program RPG005CL, shown in Figure 3, as its command processing program. RPG005CL performs some basic validation on the command parameters. First, it checks to make sure that the file, library, and member actually exist. Then, it checks to be sure that the file is a source file. Finally, it checks that the member type is RPGLE. If the command parameters pass all of these validations, the program performs an override to the requested file and member and calls an RPG IV program to perform the actual indenting of the source code.

4 shows the display file RPG005DF that is used to present the indented source code to the screen. In 5, you can see the printer file code that is used to create a spooled file when the user requests the OUTPUT(*PRINT) option.

Figure 4 shows the display file RPG005DF that is used to present the indented source code to the screen. In Figure 5, you can see the printer file code that is used to create a spooled file when the user requests the OUTPUT(*PRINT) option.

6 shows the RPG005RG program. This is where most of the processing for the utility takes place. The program begins by executing the WrtHeader subroutine to write a heading record to the printer file or display file. The program then drops into a loop where it reads through the source member that the user requested. For each record, the program executes four subroutines: CvtSource, CalcLevel, FormatLine, and WrtDetail. (I'll discuss each of these subroutines in a moment.) After the program drops out of the loop, it executes the WrtFooter subroutine to write a footing to the printer file or display the screen. If the information is presented to the screen, WrtFooter also processes any requests to shift the code to the left or right.

Figure 6 shows the RPG005RG program. This is where most of the processing for the utility takes place. The program begins by executing the WrtHeader subroutine to write a heading record to the printer file or display file. The program then drops into a loop where it reads through the source member that the user requested. For each record, the program executes four subroutines: CvtSource, CalcLevel, FormatLine, and WrtDetail. (I'll discuss each of these subroutines in a moment.) After the program drops out of the loop, it executes the WrtFooter subroutine to write a footing to the printer file or display the screen. If the information is presented to the screen, WrtFooter also processes any requests to shift the code to the left or right.

The CvtSource subroutine converts the source records to uppercase. It uses the QDCXLATE API, which uses the QSYSTRNTBL translation table to perform the conversion. Because RPG IV source code can be entered in either upper- or lowercase and because the program needs to perform comparisons on the code, the subroutine converts each statement to uppercase.

The CalcLevel subroutine calculates the indention level of the statements, based on the structured operation codes used in the source member. When the program encounters a calculation specification containing an IF, DO, or SELECT operation, it increments the indention level. When it encounters an END statement, it decrements the indention level.

The FormatLine subroutine reformats the statement, if necessary, based on the indention level. If the indention level is zero, the original statement is used. If the indention level is greater than zero, the subroutine reformats the statement. The subroutine formats the statement slightly differently depending on whether the statement is a C-spec or a comment. For C-specs, it starts by using the first 25 bytes of the statement, which is everything up to but not including the operation code. For comment lines, it uses only the first 7 bytes, which is everything up to and including the asterisk in position 7. For both C-specs and comments, the subroutine then performs a loop for the number of indention levels calculated. Within this loop, it places as many indention symbols as are necessary (depending on the level), at three-byte increments starting in position 26. These indention symbols become the lines between the structured operations and their associated END statements. The subroutine completes the line by adding the rest of the statement: for C-specs, everything from position 26 to the end of the statement; for comments, everything from position 8 to the end of the statement.

The WrtDetail subroutine writes the statement to either the printer file or the display file. Before writing to the printer file, it checks to see if a new heading needs to be printed. Before writing to the display file, it shifts the statement to column 6, which is the default value.

The INDILERPG utility offers many improvements over the method of indenting RPG IV code provided by the INDENT parameter of OS/400's RPG "create" commands. The INDILERPG utility lets you display the code on your screen without having to create a compile listing and gives you the option to view just a portion of a source member. In my opinion, one other improvement over OS/400 is in the way this utility handles comments. If you have a comment in the middle of an indention group, the INDILERPG utility shifts the comment to the right of the indention symbols. By moving the comment to the right, the program can create solid lines connecting the structured operations with their associated END statements. OS/400's method is to simply not print an indention symbol on a comment line. This method causes broken lines wherever a comment appears in the middle of an indented structure, which is not a very desirable result.

Here's something else to consider. If you use PDM to edit and compile source code, you might find it useful to create a user-defined option to run the INDILERPG command. For example, you could create one called IN (for indent) and associate it with the following command:

 INDILERPG SRCMBR(&N) SRCFILE(&L/&F) 

Then, when you work with members using PDM, you can use option IN next to an RPG IV source member to quickly view it in indented mode.

Although this utility offers many improvements over the OS/400 method of indenting RPG IV source code, there is still room for other enhancements. I would have liked to put some additional features into this utility, but, because of space constraints, I wasn't able to include them. If you feel inspired to make some of these changes, I can offer you some ideas. For example, a simple enhancement would be to add a parameter to the command to pass in the number of columns to indent. This would allow you to control how far the code shifts to the right with each indention level. This should be easy, since the value is already stored in a variable called Columns in the D-specs of the RPG005RG program.

If you want a slightly greater challenge, here's another idea. Currently, I allow the user to specify in the LOWSEQ and HISEQ parameters the range of statement numbers he wants to look at. This is a useful feature, but you could improve on it by alternatively allowing the users to pass in the name of subroutines he wants to view. The program would have to read through the source member until it finds the BEGSR statement that contains the name of the subroutine the user requested. It would need to process all statements until it reaches an ENDSR statement. You could even further improve this enhancement by writing a Prompt Override program for the command that would show the user the names of all of the subroutines in the source member by pressing F4 on the subroutine parameter.

There are probably other ways you could enhance this utility, but I'll leave that up to your imagination. Even if you don't make any enhancements, the version of the INDILERPG utility I've presented in this article is a big improvement over what you'll find using native OS/400 commands. By viewing your RPG IV source code with the INDILERPG utility, you'll be able to quickly view the structure of the operations that control the flow of your program's execution.

Robin Klima is a senior technical editor for Midrange Computing. He can be reached by E-mail at This email address is being protected from spambots. You need JavaScript enabled to view it..

The Indent RPG IV Source Utility

Figure 1: Example Output



The Indent RPG IV Source Utility

Figure 2: The INDILERPG Command

 /*===============================================================*/ /* To compile: */ /* */ /* CRTCMD CMD(XXX/INDILERPG) PGM(XXX/RPG005CL) + */ /* SRCFILE(XXX/QCMDSRC) */ /* */ /*===============================================================*/ CMD PROMPT('Indent ILE RPG Source') PARM KWD(SRCMBR) TYPE(*NAME) MIN(1) + PROMPT('Source member') PARM KWD(SRCFILE) TYPE(QUAL) PROMPT('Source file') PARM KWD(LOWSEQ) TYPE(*DEC) LEN(6 2) DFT(0000.00) + RANGE(0000.00 9999.99) PROMPT('Lowest + sequence number') PARM KWD(HISEQ) TYPE(*DEC) LEN(6 2) DFT(9999.99) + RANGE(0000.00 9999.99) PROMPT('Highest + sequence number') PARM KWD(SYMBOL) TYPE(*CHAR) LEN(1) DFT(|) + PROMPT('Indent symbol') PARM KWD(OUTPUT) TYPE(*CHAR) LEN(6) RSTD(*YES) + DFT(*) VALUES(* *PRINT) PROMPT('Output') QUAL: QUAL TYPE(*NAME) DFT(QRPGLESRC) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + PROMPT('Library') 
The Indent RPG IV Source Utility

Figure 3: The RPG005CL Program

 /*===============================================================*/ /* To compile: */ /* */ /* CRTCLPGM PGM(XXX/RPG005CL) SRCFILE(XXX/QCLSRC) */ /* */ /*===============================================================*/ PGM PARM(&SRCMBR &FILE &LOWSEQ &HISEQ &SYMBOL &OUTPUT) DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) DCL VAR(&FILE) TYPE(*CHAR) LEN(20) DCL VAR(&LOWSEQ) TYPE(*DEC) LEN(6 2) DCL VAR(&HISEQ) TYPE(*DEC) LEN(6 2) DCL VAR(&SYMBOL) TYPE(*CHAR) LEN(1) DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(6) DCL VAR(&FILETYPE) TYPE(*CHAR) LEN(5) DCL VAR(&SRCTYPE) TYPE(*CHAR) LEN(10) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) /* Send all errors to error handling routine */ MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) /* Validate source file and member */ RTVMBRD FILE(%SST(&FILE 11 10)/%SST(&FILE 1 10)) MBR(&SRCMBR) + FILETYPE(&FILETYPE) SRCTYPE(&SRCTYPE) IF COND(&FILETYPE *NE '*SRC') THEN(SNDPGMMSG MSGID(CPF0781) + MSGF(QCPFMSG) MSGDTA(%SST(&FILE 1 10) *CAT %SST(&FILE 11 10)) + MSGTYPE(*ESCAPE)) IF COND(&SRCTYPE *NE 'RPGLE') THEN(SNDPGMMSG MSGID(EDT1511) + MSGF(QPDA/QEDTMSG) MSGTYPE(*ESCAPE)) /* Perform file overrides */ OVRDBF FILE(QRPGLESRC) TOFILE(%SST(&FILE 11 10)/%SST(&FILE 1 10)) + MBR(&SRCMBR) OVRSCOPE(*CALLLVL) OVRPRTF FILE(RPG005PR) USRDTA('') SPLFNAME(&SRCMBR) + OVRSCOPE(*CALLLVL) /* Call program to display source code */ CALL PGM(RPG005RG) PARM(&LOWSEQ &HISEQ &SYMBOL &OUTPUT) /* Branch around error handling routine */ GOTO CMDLBL(ENDPGM) /* Error handling routine */ ERROR: + RCVMSG MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGFLIB) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) MSGDTA(&MSGDTA) + MSGTYPE(*ESCAPE) ENDPGM: + ENDPGM 
The Indent RPG IV Source Utility

Figure 4: The RPG005DF Display File

 *=============================================================== * To compile: * * CRTDSPF FILE(XXX/RPG005DF) SRCFILE(XXX/QDDSSRC) * *=============================================================== *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 A DSPSIZ(24 80 *DS3) A PRINT A CA03(03) CA12(12) A CA19(19) CA20(20) A R SFLREC SFL A SEQNBR 7A O 3 2 A DSPLIN 71A O 3 10 A HDNLIN 115A H A R CTLREC SFLCTL(SFLREC) A SFLSIZ(22) SFLPAG(21) A SFLDSP SFLDSPCTL A DSPREC 4S 0H SFLRCDNBR(*TOP) A 1 2'Lines to scroll:' A ROLVAL 4S 0B 1 19SFLROLVAL A 1 30'Indent ILE RPG Source' A DSPATR(HI) A SRCF 21A O 1 60 A 2 2'Shift to column:' A SHFCOL 4S 0B 2 19RANGE(1 100) A CHANGE(60) A MEMBER 10A O 2 60 
The Indent RPG IV Source Utility

Figure 5: The RPG005PR Printer File

 *=============================================================== * To compile: * * CRTPRTF FILE(XXX/RPG005PR) SRCFILE(XXX/QDDSSRC) * *=============================================================== *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 A R HEADER A 1 1DATE EDTCDE(Y) A 1 12TIME A 1 48'INDENT ILE RPG SOURCE' A 1125'PAGE' A 1129PAGNBR EDTCDE(3) A 3 1'SOURCE FILE . . . . . . .' A SRCF 21 3 28 A 4 1'MEMBER . . . . . . . . .' A MEMBER 10 4 28 A 6 1'SEQ NBR' A 6 9'*...+... 1 ...+... 2 ...+... - A 3 ...+... 4 ...+... 5 ...+... - A 6 ...+... 7 ...+... 8 ...+... - A 9 ...+... 0 ...+... 1' A 6125'CHG DATE' A R DETAIL SPACEB(1) A SEQNBR 7A 1 A PRTLIN 115 9 A SRCDAT 6 0 125EDTCDE(Y) A R FOOTER SPACEB(2) A 38'* * * * E N D O F ' A 59'S O U R C E * * * *' 
The Indent RPG IV Source Utility

Figure 6: The RPG005RG Program

 *========================================================================= * To compile: * * CRTBNDRPG PGM(XXX/RPG005RG) SRCFILE(XXX/QRPGLESRC) * *========================================================================= *. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 FQRPGLESRC IF F 112 Disk Infds(SrcfInfo) FRPG005DF CF E Workstn Usropn Sfile(SflRec:SflRrn) F Infds(DspfInfo) FRPG005PR O E Printer Usropn Oflind(*In90) D SrcfInfo DS D File 83 92 D Library 93 102 D Member 129 138 D DspfInfo DS D CurRec 378 379B 0 D TotRec 380 381B 0 D Columns S 1 0 Inz(3) D Bar S 71 DIM(2) CTDATA PERRCD(1) D Shift S 1 Inz(*Off) D Case S 1 Inz(*Off) D Else S 1 Inz(*Off) D Data S 1 Inz(*Off) D Calc S 1 Inz(*Off) D Lin S 115 D Level S 3 0 D MaxLevels S 2 0 D LevelNum S 3 0 D SflRrn S 4 0 D X S 4 0 D Y S 4 0 IQRPGLESRC NS I 1 6 2SrcSeq I 1 6 ChrSeq I 7 12 0SrcDat I 13 112 SrcDta *========================================================================= C *Entry Plist C Parm LowSeq 6 2 C Parm HighSeq 6 2 C Parm Symbol 1 C Parm Output 6 C Exsr WrtHeader C Read QRPGLESRC 99 C Dow Not *In99 And SrcSeq <= HighSeq C If SrcSeq >= LowSeq C Exsr CvtSource C Exsr CalcLevel C Exsr FormatLine C Exsr WrtDetail C Endif C Read QRPGLESRC 99 C Enddo C Exsr WrtFooter C Eval *InLR = *On *========================================================================= * Write a heading record to the printer file or subfile *========================================================================= C WrtHeader Begsr C If Output = '*PRINT' C Write Header C Else C Eval ShfCol = 6 C Eval RolVal = 20 C Eval DspRec = 1 C Movel Bar(1) DspLin C Eval SflRrn = 1 C Write SflRec C Endif C Endsr *========================================================================= * Convert the current source code statement to upper case *========================================================================= C CvtSource Begsr C Call 'QDCXLATE' C Parm 100 Length 5 0 C Parm SrcDta Source 100 C Parm 'QSYSTRNTBL' Trntbl 10 C Endsr *========================================================================= * Calculate indention level *========================================================================= C CalcLevel Begsr C Eval Calc = *Off C If Shift = *On And C %Subst(Source:26:3) <> 'AND' And C %Subst(Source:26:2) <> 'OR' C Eval Level = Level + 1 C Eval Shift = *Off C Endif C If %Subst(Source:6:1) = 'C' And C %Subst(Source:7:1) <> '*' C Eval Calc = *On C If %Subst(Source:26:2) = 'IF' Or C %Subst(Source:26:2) = 'DO' Or C %Subst(Source:26:6) = 'SELECT' C Eval Shift = *On C Else C If %Subst(Source:26:3) = 'CAS' C Eval Case = *On C Else C If %Subst(Source:26:3) = 'END' C If Case = *Off C If Level > 0 C Eval Level = Level - 1 C Else C Eval Level = 0 C End C Else C Eval Case = *Off C Endif C Endif C Endif C Endif C Endif C Endsr *========================================================================= * Format a detail line based on the indention level *========================================================================= C FormatLine Begsr C Eval Lin = *Blanks C Eval SeqNbr = %Subst(ChrSeq:1:4) + '.' + C %Subst(ChrSeq:5:2) C If Level = 0 Or Data = *On C Eval Lin = SrcDta C Else C Eval Else = *Off C If Calc = *On C Eval Lin = %Subst(SrcDta:1:25) C If %Subst(Source:26:4) = 'ELSE' Or C %Subst(Source:26:4) = 'WHEN' Or C %Subst(Source:26:5) = 'OTHER' C Eval Else = *On C Endif C Else C Eval %Subst(Lin:1:7) = %Subst(SrcDta:1:7) C Endif C Eval X = 26 C Do Level LevelNum C If %Subst(Source:7:1) = '*' Or C Else = *Off Or LevelNum <> Level C If LevelNum <= MaxLevels C Eval %Subst(Lin:X:1) = Symbol C Eval X = X + Columns C Else C Eval %Subst(Lin:X-1:1) = '+' C Endif C Endif C Enddo C If Calc = *On C Eval %Subst(Lin:X:115-X) = %Subst(SrcDta:26:75) C Else C Eval %Subst(Lin:X:115-X) = %Subst(SrcDta:8:93) C Endif C Endif C If %Subst(Source:1:3) = '** ' C Eval Data = *On C Endif C Endsr *========================================================================= * Write a detail record to the printer or display file *========================================================================= C WrtDetail Begsr C If Output = '*PRINT' C If *In90 C Write Header C Eval *In90 = *Off C Endif C Eval PrtLin = Lin C Write Detail C Else C Eval DspLin = %Subst(Lin:ShfCol:115-ShfCol) C Eval HdnLin = Lin C Eval SflRrn = SflRrn + 1 C Write SflRec C Endif C Endsr *========================================================================= * Write the footing record to the printer file or display the screen *========================================================================= C WrtFooter Begsr C If Output = '*PRINT' C Write Footer C Else C Eval SeqNbr = *Blanks C Movel Bar(2) DspLin C Eval SflRrn = SflRrn + 1 C Write SflRec C Dow Not *In03 And Not *In12 C Exfmt CtlRec C Eval DspRec = CurRec C If Not *In03 And *In60 Or *In19 Or *In20 C Select C When *In19 C Eval Shfcol = 1 C When *In20 C Eval Shfcol = 21 C Endsl C Eval X = TotRec - 1 C 2 Do X Y C Y Chain SflRec 99 C If Not *In99 C Eval DspLin = %Subst(HdnLin:ShfCol:115-ShfCol) C Update SflRec C Endif C Enddo C Endif C Enddo C Endif C Endsr *========================================================================= * Initialization routine *========================================================================= C *Inzsr Begsr C If Output = '*PRINT' C Open RPG005PR C Else C Open RPG005DF C Endif C Eval MaxLevels = 60 / Columns C Eval Srcf = %Trimr(Library) + '/' + File C Endsr ** *************** Beginning of data ************************************* ****************** End of data **************************************** 
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: