08
Fri, Nov
10 New Articles

Serving Spooled Files to the Web

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

Some people in this world are gifted with tools, and some people are not. I are not. This became abundantly clear one recent Saturday afternoon when the lawnmower stopped lawn mowing. I took the lawnmower apart. I put it together. I did it again. For the life of me, I couldn't figure out what was wrong with the thing. I decided that since it was 107 degrees Fahrenheit, the problem was nothing that a good repair shop couldn't handle, so I took the stupid lawnmower to the shop, gave the kid down the street 10 bucks to mow the lawn, and drank a beer.

To some folks, transporting things across computer systems is kind of like fixing the lawnmower is to me. Some can do it themselves; some would rather hire it out. Fortunately, where putting spooled files into Web pages is concerned, both are reasonable and viable options, and I'll show you both ways. For the purposes of this article, I will assume that your iSeries/400 is not your Web server and that to publish spooled files you need to copy them into an HTML document on another machine. If your iSeries/400 is your Web server, I refer you to Chapter 10 of the excellent book iSeries and AS/400 APIs at Work by Doug Pence and Ron Hawkins (MC Press, 2001).

Stocking Your Toolbox

Since the goal here is to take a spooled output file from an AS/400 and put it on a Web page, you will find yourself faced with a process that consists of essentially two steps: Make a Web page out of a spooled file, and put it someplace where you can get to it so that you can copy it from your AS/400 to your Web server. This will not only save you paper, it will make your printout accessible to anyone with an Internet connection and a browser.

To create an HTML document from a spooled file, you must first copy the spooled file to a database file, then copy the database file to a document library file. From there, you can edit the file, move it to your Web server, and publish it on the Web.

If you do this a lot, it would be useful to have a toolbox of standard-issue components to build your HTML document. There will be some items that always go into your HTML documents, so it would help to create a database of those items. It would also help to be able to add some entries, such as a title, as you create the document. With a simple CL and RPG program, you can make creating HTML documents from spooled files relatively painless.

However, there is a caveat: In the example, I assume that the spooled file you wish to serve to the Web was created by your current interactive job. Adapting the example so that it works with any spooled file is left as an exercise for the reader. Evolving the example so that it does more is also left as an exercise for the reader.

Baby Steps

The first step in moving a spooled file to a Web page is to copy the spooled file to a database file. The database file must exist, but it can exist in QTEMP, so the job can clean up after itself.

If you break that step down, it becomes clear that you need to create a standard file containing some HTML lines. These are entries that will always go into the result, no matter what the result is. Create a database file with a record length of 136, and call it STDHTM. The command to create the file is CRTPF FILE(MYLIB/STDHTM) RCDLEN(136). Using DFU, add the following three records:



You may want to modify the above HTML to provide different colors or perhaps a background image. I've found that the courier font works best with reports. You might also want to add META tags to your file as appropriate. Having standard entries that you can combine with a spooled file to create an HTML document saves you from having to edit that document to add the same entries every time you create a Web page from a spooled file.

Now that you have set up your repetitive entries, you can put them into a database and append your spooled file to that database. The result will be a database that contains standard HTML entries and the entries from your spooled file. When you've done this, you'll almost be ready to move the file to the document library system.

Take a look at the CL in Figure 1 (the CL presents a prompt screen, whose DDS is in Figure 2, with a sample in Figure 3).


/*********************************************************************/
/*********************************************************************/
/* */
/* PROGRAM ID - SPOOLTOHTM */
/* AUTHOR - Christopher J. Devous */
/* MODIFIED - 3/13/00 */
/* */
/*********************************************************************/
PGM

DCLF FILE(MYLIB/SPLTOHTMPM)
VAR(&XTITLE) VALUE('' *CAT &TITLE +<BR> *CAT '')
CHGVAR VAR(&PGMSGQ) VALUE('SPLTOHTM')

CHKOBJ OBJ(QTEMP/SPLFDB) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801) EXEC(GOTO CMDLBL(NODEL))
DLTF FILE(QTEMP/SPLFDB)
NODEL:
CRTPF FILE(QTEMP/SPLFDB) SRCFILE(MYLIB/QDDSSRC) +
OPTION(*NOSRC *NOLIST) LVLCHK(*NO)
CPYF FROMFILE(MYLIB/STDHTM) +
TOFILE(QTEMP/SPLFDB) MBROPT(*ADD) +
FMTOPT(*NOCHK)

RDSPLY: SNDF RCDFMT(MSGCTL)
SNDRCVF RCDFMT(SPLTOHTMPM)
RMVMSG PGMQ(*SAME) CLEAR(*ALL)

IF COND(&IN03 *EQ '1') THEN(DO)
GOTO CMDLBL(DONE)
ENDDO

IF COND(&FLDNAM *EQ ' ') THEN(DO)
RMVMSG CLEAR(*NEW)
SNDPGMMSG MSG('Folder name is blank') TOPGMQ(*SAME)
GOTO CMDLBL(RDSPLY)
ENDDO

IF COND(&TITLE *EQ ' ') THEN(DO)
RMVMSG CLEAR(*NEW)
SNDPGMMSG MSG('Title is blank') TOPGMQ(*SAME)
GOTO CMDLBL(RDSPLY)
ENDDO

IF COND(&DOCNAM *EQ ' ') THEN(DO)
RMVMSG CLEAR(*NEW)
SNDPGMMSG MSG('Document name is blank') TOPGMQ(*SAME)
GOTO CMDLBL(RDSPLY)
ENDDO

IF COND(&SPLFILE *EQ ' ') THEN(DO)
RMVMSG CLEAR(*NEW)
SNDPGMMSG MSG('Spooled file name is blank') TOPGMQ(*SAME)
GOTO CMDLBL(RDSPLY)
ENDDO

OVRDBF FILE(SPLFDB) FRCRATIO(1)

CHGVAR VAR(&XTITLE) VALUE('')

CALL PGM(MYLIB/HADTITLE) PARM(&XTITLE)

CPYSPLF FILE(&SPLFILE) TOFILE(QTEMP/SPLFDB) +
MBROPT(*ADD)

CHGVAR     VAR(&TITLE) VALUE(''
CALL PGM(MYLIB/HADTITLE) PARM(&TITLE)

DLTOVR FILE(*ALL)

CPYTOPCD FROMFILE(QTEMP/SPLFDB) TOFLR(&FLDNAM) +
TODOC(&DOCNAM) REPLACE(*YES)

DLTF FILE(QTEMP/SPLFDB)

DONE:
RETURN

ENDPGM
Figure 1: This CL program forms the cornerstone of your building block.
A*****************************************************************
A*
A* FILE ID - SPLTOHTMPM
A* FILE NAME - Prompt Screen for Spooled Files to HTML conversion
A*
A*****************************************************************
A DSPSIZ(24 80 *DS3)
A PRINT
A R SPLTOHTMPM
A CF03(03 'EXIT')
A BLINK
A OVERLAY
A PUTOVR
A 1 73DATE
A EDTCDE(Y)
A 2 2SYSNAME
A 2 73TIME
A 23 5'Enter=Accept F3=Exit'
A DSPATR(HI)
A COLOR(BLU)
A 1 2'SPLToHTM'
A 1 23'Copy Spooled Files to Document Lib-
A rary'
A 9 18'Spooled File. . . . '
A SPLFILE 10A B 9 40
A 11 17'Document Name. . . .'
A DOCNAM 12A B 11 40
A 15 7'Title:'
A TITLE 50A B 15 16CHECK(LC)
A 13 17'Folder Name. . . . .'
A FLDNAM 10A B 13 40
A*
A R MSGRCD TEXT('MSG SFL RECORD')
A SFL SFLMSGRCD(24)
A MSGKEY SFLMSGKEY
A PGMSGQ SFLPGMQ
A*
A R MSGCTL TEXT('MSG SFL CONTROL')
A OVERLAY SFLCTL(MSGRCD) SFLSIZ(10)
A SFLPAG(1) SFLDSPCTL SFLDSP SFLINZ
Figure 2: This DDS gives a prompt screen asking the user for the values you need.

Figure 3: This prompt screen appears as your user sees it.

After first checking to be sure the database file isn't already there, create a new database file called SPLFDB in QTEMP by issuing the command CRTPF FILE(QTEMP/SPLFDB) SRCFILE(MYLIB/QDDSSRC) OPTION(*NOSRC *NOLIST) LVLCHK(*NO). (Figure 4 shows the DDS for SPLFDB).

A*****************************************************************
A*
A* FILE ID - SPLFDB
A* FILE NAME - Container for Spooled File Records
A*
A*
A*****************************************************************
A R SPREC
A SPFLD 136A TEXT('Spool Records')
Figure 4: This shows the SPLFDB DDS source.

This command creates the physical file you'll use as a container for the records from which you want to create a Web page. Note that the command prevents a source listing and specifies no level checking. Now that you've got your file, you'll copy in the standard HTML lines that you put in the STDHTM file. The CL program issues the following command:

CPYF FROMFILE(MYLIB/STDHTM) TOFILE(QTEMP/SPLFDB) MBROPT(*ADD) FMTOPT(*NOCHK) 

This will copy your standard HTML lines into your SPLFDB file in QTEMP.Next, a prompt screen (see Figure 2 for DDS and Figure 3 for screen shot) asks for the spooled file name (&SPLFILE), the name of the document you wish to create (&DOCNAM), the folder in which you want the document to land (&FLDNAM), and a title for the document (&TITLE). These are all stored in variables within the CL program.

After doing some error checking to make sure you have all your values, add HTML tags to the document title keyed into the prompt screen, and put the result in a variable called (&XTITLE). This will save you from having to enter the tags yourself in the prompt screen. Your next step is to add the title line to the HTML already stored in SPLFDB. To accomplish this, I've written the simple RPG program HADTITLE shown in <B>Figure 5</B>. </p><!------ callout box begin ---><TABLE cellspacing="0" border="0" align="center"><TR><TD align="middle" bgcolor="blue"><TABLE cellspacing="0" cellpadding="2" border="0" width="100%"><TR><TD align="lrft" bgcolor="#ebebeb" ><!----- callout content begin ---><pre><br>HDebug <br> *---------------------------------------------------------* <br> * * <br> * Program - HAdTitle * <br> * Add record to SPLFDB * <br> * Add <BR> tag to end of existing untagged *<br> * Lines *<br> * * <br> *---------------------------------------------------------* <br>FSPLFDB UF A E K Disk <br> * <br> * --------------------------------------------------------------- <br> * M a i n l i n e P r o c e s s i n g <br> * --------------------------------------------------------------- <br> * <br>C Read SPREC 99<br>C DoW *IN99 = *OFF <br>C If %subst(SPFLD:1:1) <>'<' <br>C and %subst(SPFLD:133:1) <>'<' <br>C Eval %subst(SPFLD:133:4) = '<BR>' <br>C Update SPREC <br>C EndIf <br>C Read SPREC 99<br>C EndDo <br>C Eval SPFLD = HTMLine <br>C Write SPREC <br> * <br>C Move *ON *INLR <br> *---------------------------------------------------------------* <br> * End of MainLine Processing <br> *---------------------------------------------------------------* <br>C *InzSR BegSr <br> *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -* <br> * <br> * Parameter List <br>C *ENTRY PList <br>C Parm HTMLine 65 <br> * <br> *- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*<br>C EndSr <br> *---------------------------------------------------------------*</pre><!----- callout content end ---></TD></TR></TABLE></TD></TR></TABLE><!------ callout box end ---><h5 align="center">Figure 5: This RPG program lets you add HTML tags to your document and sets line breaks over spooled file records. </h5><p> HADTITLE is very simple, indeed. Here's what it does: It looks for any record that doesn't begin with a tag marker(<) or end with a line break marker (<BR>). If it finds a record meeting those criteria, it adds a line break marker to the end of the record. HADTITLE then writes whatever was passed to it at the end of the file. </p> <p>Why would you do it this way? What you've done so far gives you a database file with one type of record: lines that consist of HTML tags wrapped around corresponding text. You can reasonably assume that all of those lines begin with a less than symbol (<).You don't want to change those lines, so the program looks for that symbol and ignores all lines that have < as their first character.</p> <p>You want to add a title, but because your title will change from report to report, you can't really make that part of your standard HTML, so you create a program to add the title for you. </p><p>What you haven't done yet is to copy your spooled file records into your database file. These records will contain no HTML. I've found, by experimenting, that they need to end with a line break--<BR>--or they all run together and look funny on the screen. After you've added the spooled file records, call HADTITLE once again to add those line breaks and append the </HTML> tag to end the document.</p> <p>To compile HADTITLE, you'll need to create an SPLFDB somewhere in your library list. On this first call of HADTITLE, it will ignore your STDHTM records (for the reasons described above) and add whatever title you keyed into your prompt screen.</p><p>Now that you've built the foundation of your HTML document, it's time to add the spooled file's records. The CL will issue the command CPYSPLF FILE(&SPLFILE) TOFILE(QTEMP/SPLFDB) MBROPT(*ADD). Note that the command as issued assumes that the spooled file was produced by the current interactive job. If you want to use any spooled file, you'll need to modify the code shown here to accommodate job name and number in addition to spooled file name.</p> <p>With your spooled file records now in place in your database file, you'll want to close your document with the </HTML> tag. Set that up as a parameter and, once again, call HADTITLE. This time, HADTITLE will add line break tags (<BR>) to the spooled file records and add the </HTML> tag at the end of the file before returning.</p> <p>Now that you've built a database file containing your HTML document as you want it to appear, you can take the final step and copy the database file to a folder in the document library. The CL does this by issuing the command CPYTOPCD FROMFILE(QTEMP/SPLFDB) TOFLR(&FLDNAM) TODOC(&DOCNAM) REPLACE(*YES). Then, clean up after yourself with DLTF FILE(QTEMP/SPLFDB).</p> <p>The Copy to PC Document (CPYTOPCD) command creates a document in the specified folder of the document library system. The document can be copied from the OS/400 IFS to your Web server and presented to the world. Please remember that the example was created for the purpose of showing the steps necessary to get a spooled file into an HTML document. You might want to add some error checking, like looking for the existence of a document name and warning of an overwrite, or checking to make sure the folder specified really exists, and perhaps tuning things up a bit. You might want to add some scripting code to the start of your document.</p><h3>I Don't Like Making My Own Stuff! </h3><p>Sometimes its easier (and safer!) to hire the kid down the street. A number of folks have produced spooled file utilities designed to help you publish reports to the Web. See the sidebar ("Tools to Help You Serve Spooled Files") for details.</p><p>If you've gotten to this point, you now have the basic tools necessary to create HTML documents from spooled files. I encourage you to play around with the code presented here and enhance it for your own environment. </p><p><B>Christopher J. Devous</B> is director of systems development for The Antigua Group, a manufacturer of fine casual apparel based in Scottsdale, Arizona. Chris has nearly 20 years of experience writing programs and designing and managing various types of computer systems. He can be reached by email at <A href="mailto: cdevous@antigua.com"><joomla-hidden-mail is-link="1" is-email="1" first="Y2Rldm91cw==" last="YW50aWd1YS5jb20=" text="Y2Rldm91c0BhbnRpZ3VhLmNvbQ==" base="" >This email address is being protected from spambots. You need JavaScript enabled to view it.</joomla-hidden-mail></A>.</p><!------ callout box begin ---><TABLE cellspacing="0" border="0" width="50%" align="center"><TR><td class="post" align="middle" bgcolor="#3366cc"><TABLE cellspacing="0" cellpadding="2" border="0" width="100%"><TR><td class="post" align="left" bgcolor="#ebebeb"><!----- callout content begin ---><h3>Tools to Help You Serve Spooled Files</h3><p>Want to serve spooled files to the Web? No time to build the programs to do it? Here are some options, along with where you can find them on the Web:</p><ul> <li><B>BVS/Tools</B>' Spooled File Tools (SPLTOOL) is a shareware program that will help copy spooled files to folder documents, FTP, and email. Go to <A href="http://www.bvstools.com/">www.bvstools.com</A> for more information. <li><B>Kisco Information Systems</B>' WebReport/400 converts reports to HTML and sends them as email. Find it at <A href="http://www.kisco.com/">www.kisco.com</A>. <li><B>Business Computer Design Int'l</B>'s Spool-Explorer/400 pushes or pulls spooled files to PCs and the Web. Look for it at <A href="http://www.bcdsoftware.com/">www.bcdsoftware.com</A>. <li><B>Gumbo Software</B>'s Spool-a-Matic archives spooled files and sends them to the Web. Go to <A href="http://www.gumbo.com/">www.gumbo.com</A> for further information. <li><B>Evergreen Interactive Systems</B>'s AS/400 and iSeries Report Downloader sends report data to a variety of formats, including Microsoft Word, Excel, and HTML. Look for it at <A href="http://www.evergreeninteractive.com/">www.evergreeninteractive.com</A>. <li><B>Chouinard & Myhre</B>'s Spoolfile EMail'r distributes spooled files by email using Client Access/400 and ActiveX technology. Download an evaluation copy at <A href="http://www.cm-inc.com/what/index.html">www.cm-inc.com/what/index.html</A>. <li><B>Net400</B>'s NetMail400 lets you integrate your iSeries applications to email anything you can print. Find it at <A href="http://www.net400.com/">www.net400.com</A>. <li><B>RJS Software Systems</B>' WinSpool/400 supports Web integration, email integration, and electronic forms integration. For more information, visit <A href="http://www.rjssoftware.com/">www.rjssoft.com</A>. <li><B>DataTrade</B>'s SpoolView suite of report management products manages a variety of storage, archival, and retrieval options, including Internet-based PCs. Order a demo at <A href="http://www.datatrade.com/">www.datatrade.com</A>. <li><B>Broderick Data Systems</B>' SpoolOrganizer/400 supports email bundling of reports, as well as Internet access and many other features. Check it out at <A href="http://www.broderickdata.com/">www.broderickdata.com</A>.</li> </ul><!----- callout content end ---></td></TR></TABLE></td></TR></TABLE><!------ callout box end ---><p align="center">-Christopher J. Devous</p><link rel="stylesheet" href="/components/com_archive/css/publisher-bootstrap.css"> <link rel="stylesheet" href="/components/com_archive/css/publisher_author.css"><div class='author-description'></div> <div class='ruxin_related_articles_items'> <div id="ruxin_related_articles_heading99999" class="ruxin_related_articles_heading1"> <h4 class="news_module_title"><span>Also Read</span></h4> </div> <div class="ruxin_related_articles news-block-1" id="ruxin_related_articles_99999"> <div class="news-leading"> <div class="news-row"> <div class="ruxin-related-col-3"> <div class="news-item"> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-language-basics" class="title" itemprop="url"> <div class="news_hover_effect_off"> <img class="leading_news_image" src="https://mcpressonline.com/images/cache/thumbs/00eb7f6d2b0988699ed82ce946663596.jpg" alt="Open Source Starter Guide for IBM i Developers: Language Basics" style="height: 200px;"/> </div> </a> <!-- Show Category --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-language-basics"><div class="link_on_image"></div></a> <div class="item_description news_on_image"> <!-- Show Category --> <!-- Show Extra Field Before Title --> <!-- Show Title --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-language-basics" class="lead_title" itemprop="url" style="font-size: 18px; font-weight: 400;">Open Source Starter Guide for IBM i Developers: Language Basics</a> <!-- Show Extra Field After Title --> <!-- Show Text --> <div class="lead_date_hits_author"> <!-- Show Date --> <!-- Show Hits --> <!-- Show Joomla Author --> <!-- Show K2 Author --> </div> </div> </div> </div> <div class="ruxin-related-col-3"> <div class="news-item"> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-ruby-and-ibm-i-an-introduction" class="title" itemprop="url"> <div class="news_hover_effect_off"> <img class="leading_news_image" src="https://mcpressonline.com/images/cache/thumbs/00eb7f6d2b0988699ed82ce946663596.jpg" alt="Open Source Starter Guide for IBM i Developers: Ruby and IBM i, An Introduction" style="height: 200px;"/> </div> </a> <!-- Show Category --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-ruby-and-ibm-i-an-introduction"><div class="link_on_image"></div></a> <div class="item_description news_on_image"> <!-- Show Category --> <!-- Show Extra Field Before Title --> <!-- Show Title --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-ruby-and-ibm-i-an-introduction" class="lead_title" itemprop="url" style="font-size: 18px; font-weight: 400;">Open Source Starter Guide for IBM i Developers: Ruby and IBM i, An Introduction</a> <!-- Show Extra Field After Title --> <!-- Show Text --> <div class="lead_date_hits_author"> <!-- Show Date --> <!-- Show Hits --> <!-- Show Joomla Author --> <!-- Show K2 Author --> </div> </div> </div> </div> <div class="ruxin-related-col-3"> <div class="news-item"> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-i-object" class="title" itemprop="url"> <div class="news_hover_effect_off"> <img class="leading_news_image" src="https://mcpressonline.com/images/cache/thumbs/00eb7f6d2b0988699ed82ce946663596.jpg" alt="Open Source Starter Guide for IBM i Developers: i Object!" style="height: 200px;"/> </div> </a> <!-- Show Category --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-i-object"><div class="link_on_image"></div></a> <div class="item_description news_on_image"> <!-- Show Category --> <!-- Show Extra Field Before Title --> <!-- Show Title --> <a href="/programming/web-languages/open-source-starter-guide-for-ibm-i-developers-i-object" class="lead_title" itemprop="url" style="font-size: 18px; font-weight: 400;">Open Source Starter Guide for IBM i Developers: i Object!</a> <!-- Show Extra Field After Title --> <!-- Show Text --> <div class="lead_date_hits_author"> <!-- Show Date --> <!-- Show Hits --> <!-- Show Joomla Author --> <!-- Show K2 Author --> </div> </div> </div> </div> </div> </div> <style> #ruxin_related_articles_99999 .news-leading { width: 100%; } </style> </div> </div> <style> #ruxin_related_articles_99999 { margin: 0 -3px; } #ruxin_related_articles_99999 .ruxin-related-col-1, #ruxin_related_articles_99999 .ruxin-related-col-2, #ruxin_related_articles_99999 .ruxin-related-col-3, #ruxin_related_articles_99999 .ruxin-related-col-4, #ruxin_related_articles_99999 .ruxin-related-col-5, #ruxin_related_articles_99999 .ruxin-related-col-6, #ruxin_related_articles_99999 .ruxin-related-col-7, #ruxin_related_articles_99999 .ruxin-related-col-8 { padding: 3px; } #ruxin_related_articles_heading99999 .news_module_title a, #ruxin_related_articles_heading99999 .news_module_title span { color: #ffffff; background-color: #000000; font-size: 14px; } #ruxin_related_articles_heading99999 .news_module_title { border-color: #000000; } #ruxin_related_articles_heading99999.ruxin_related_articles_heading2 .news_module_title > ::before { left: 10px; border-color: #000000 transparent transparent transparent; } #ruxin_related_articles_heading99999.ruxin_related_articles_heading3 .news_module_title, #ruxin_related_articles_heading99999.ruxin_related_articles_heading4 .news_module_title { border-color: #000000; } #ruxin_related_articles_heading99999.ruxin_related_articles_heading4 .news_module_title a, #ruxin_related_articles_heading99999.ruxin_related_articles_heading4 .news_module_title span { border-color: #ffffff; } #ruxin_related_articles_heading99999.ruxin_related_articles_heading6 .news_module_title { border-color: #ffffff; } #ruxin_related_articles_heading99999.ruxin_related_articles_heading6 .news_module_title::before { border-color: #000000; background-color: #000000; } .ruxin_related_articles_heading6 .news_module_title::after { border-color: #000000 transparent transparent transparent; } #ruxin_related_articles_heading99999 .news_module_title { margin-bottom: 15px; } #ruxin_related_articles_99999 .lead_category_top { background: #ec0000; } #ruxin_related_articles_99999 .lead_category_top::before { border-top: 5px solid #ec0000; } #ruxin_related_articles_99999 .lead_category_top a { color: #ffffff; } #ruxin_related_articles_99999 .lead_category a { color: #ffffff; background: #ec0000; } #ruxin_related_articles_99999 .intro_category_top { background: #ec0000; } #ruxin_related_articles_99999 .intro_category_top::before { border-top: 5px solid #ec0000; } #ruxin_related_articles_99999 .intro_category_top a { color: #ffffff; } #ruxin_related_articles_99999 .intro_category a { color: #ffffff; background: #ec0000; } #ruxin_related_articles_99999 .link_category_top { background: #ec0000; } #ruxin_related_articles_99999 .link_category_top::before { border-top: 5px solid #ec0000; } #ruxin_related_articles_99999 .link_category_top a { color: #ffffff; } #ruxin_related_articles_99999 .link_category a { color: #ffffff; background: #ec0000; } </style> </section> <div id="disqus_thread"></div> <script id="disqus_identifier_js" type="text/javascript"> disqus_identifier = "com_content:article:3949"; </script> <script id="disqus_js" type="text/javascript"> /** * var disqus_identifier; [Optional but recommended: Define a unique identifier (e.g. post id or slug) for this thread] */ disqus_shortname = 'mcpressonline'; var disqus_config = function(){ this.language = 'en'; }; (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//mcpressonline.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })(); </script> <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript=mcpressonline">comments powered by Disqus.</a></noscript> <a href="http://disqus.com" class="dq-powered">BLOG COMMENTS POWERED BY DISQUS</a> </div> </section> <section class="row article-navigation bottom"> <ul class="pager pagenav"> <li class="previous"> <a href="/programming/web-languages/porting-perl-and-python-to-iseries" rel="prev"> <i class="fa fa-caret-left"></i> <span>Previous Article</span> <strong>Porting Perl and Python to iSeries</strong> </a> </li> <li class="next"> <a href="/programming/web-languages/techtip-spruce-up-html-email-links" rel="next"> <i class="fa fa-caret-right"></i> <span>Next Article</span> <strong>TechTip: Spruce Up HTML Email Links</strong> </a> </li> </ul> </section> </article> </div> </div> </div> <!-- //MAIN CONTENT --> <!-- SIDEBAR RIGHT --> <div class="t3-sidebar t3-sidebar-right col-md-3 "> <div class="t3-module module " id="Mod1334"><div class="module-inner"><div class="module-ct"> <div id="mod-custom1334" class="mod-custom custom"> <center><!-- Cat Ad 1 MR [async] --> <script type="text/javascript">// <![CDATA[ if (!window.AdButler) { (function() { var s = document.createElement("script"); s.async = true; s.type = "text/javascript"; s.src = 'https://servedbyadbutler.com/app.js'; var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(s, n); }()); } // ]]></script> <script type="text/javascript">// <![CDATA[ var AdButler = AdButler || {}; AdButler.ads = AdButler.ads || []; var abkw = window.abkw || ''; var plc261596 = window.plc261596 || 0; document.write('<' + 'div id="placement_261596_' + plc261596 + '"></' + 'div>'); AdButler.ads.push({ handler: function(opt) { AdButler.register(168268, 261596, [300, 250], 'placement_261596_' + opt.place, opt); }, opt: { place: plc261596++, keywords: abkw, domain: 'servedbyadbutler.com', click: 'CLICK_MACRO_PLACEHOLDER' } }); // ]]></script> </center></div> </div></div></div><div class="t3-module modulecommentscss2 " id="Mod1158"><div class="module-inner"><h3 class="module-title commentscss2"><span>LATEST COMMENTS</span></h3><div class="module-ct"> <div id="mod-custom1158" class="mod-custom custom"> <div class="section-expanded sidebar-fixed"> <div class="cover cover-forum" data-role="cover-area"> <div> <div class="section-contained"> <div class="cover-body"> <div class="cover-body-left"> <div class="cover-profile-content" dir="auto"> <div class="cover-profile-name-wrapper"><a href="https://disqus.com/home/forums/mcpressonline/" id="community-tab" class="publisher-nav-color" data-action="community-sidebar" data-forum="mcpressonline" data-tid="102"><img src="//a.disquscdn.com/uploads/forums/270/7761/favicon.png" alt="MC Press Online" class="cover-favicon" /></a> <h1 class="cover-profile-name truncate-line">MC Press Online</h1> <div class="cover-profile-action"><button class="btn-follow" data-action="toggle-follow"><span class="text-default">Follow</span><span class="symbol-following"></span> </button></div> </div> </div> </div> </div> </div> </div> </div> </div> <div class="section-contained"><nav class="cover-nav cover-nav-profile-user"> <ul class="cover-nav-options"> <li class="cover-nav-option" data-action="switch-tab" data-tab="recent"><a href="https://www.disqus.com/home/forum/mcpressonline/" class="truncate-line" title="Latest Discussions" target="_blank" rel="noopener"> <span class="hidden-md">Latest Discussions</span> </a></li> <li class="cover-nav-option" data-action="switch-tab" data-tab="commenters"><a href="https://www.disqus.com/home/forum/mcpressonline/commenters/" class="truncate-line" title="Top Commenters" target="_blank" rel="noopener"> <span class="hidden-md">Top Commenters</span> </a></li> </ul> </nav></div></div> </div></div></div><div class="t3-module modulecommentscss1 " id="Mod1157"><div class="module-inner"><div class="module-ct"><div id="recentcomments" class="dsq-widget"> <script type="text/javascript" src="https://mcpressonline.disqus.com/recent_comments_widget.js?num_items=4&hide_avatars=0&avatar_size=32&excerpt_length=85"></script> </div> </div></div></div><div class="t3-module module " id="Mod1340"><div class="module-inner"><div class="module-ct"> <div id="mod-custom1340" class="mod-custom custom"> <center><!-- Feature Ad 3 HP [async] --> <script type="text/javascript">// <![CDATA[ if (!window.AdButler){(function(){var s = document.createElement("script"); s.async = true; s.type = "text/javascript";s.src = 'https://servedbyadbutler.com/app.js';var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(s, n);}());} // ]]></script> <script type="text/javascript">// <![CDATA[ var AdButler = AdButler || {}; AdButler.ads = AdButler.ads || []; var abkw = window.abkw || ''; var plc261602 = window.plc261602 || 0; document.write('<'+'div id="placement_261602_'+plc261602+'"></'+'div>'); AdButler.ads.push({handler: function(opt){ AdButler.register(168268, 261602, [300,600], 'placement_261602_'+opt.place, opt); }, opt: { place: plc261602++, keywords: abkw, domain: 'servedbyadbutler.com', click:'CLICK_MACRO_PLACEHOLDER' }}); // ]]></script> </center></div> </div></div></div><div class="t3-module moduledonate-sidebar " id="Mod1815"><div class="module-inner"><h3 class="module-title "><span>Support MC Press Online</span></h3><div class="module-ct"><style> td.mod_jdonation_amount .mod_jd_switch_amounts input:checked + label { color:#3283b6; background-color:#f8f8f8; border:1px solid #f8f8f8; } td.mod_jdonation_amount .mod_jd_switch_amounts label { width:120px; } #give-donation-level-button-wrap .give-btn:hover, .give-default-level { background-color: #f8f8f8 !important; color: #3283b6 !important; } .give-total-wrap .give-currency-symbol { background: #f8f8f8; } .elementor-give-totals { background: #f8f8f8; color: #FFFFFF; } .give-goal-progress .progress .bar { background-color: #f8f8f8; } </style> <form name="campaign_form" id="campaign_form" method="post" action="https://mcpressonline.com/component/jdonation/donation-form?Itemid=0"> <div class="elementor-give-totals"> <div class="campaign_title"> </div> <div class="give-totals-shortcode-wrap"> <div class="give-card__progress give-card__progress-custom" data-type="line" data-strokewidth="1" data-easing="linear" data-duration="800" data-color="#FFEA82" data-trailcolor="#EEEEEE" data-trailwidth="1" data-tocolor="#ED6A5A" data-width="100%" data-height="15px"> <div class="give-goal-progress"> <div class="raised"> </div> </div> </div> </div> <div class="donation-module-general-div"> <div class="give-total-wrap"> <div class="give-donation-amount form-row-wide"> <span class="give-currency-symbol give-currency-position-before"> $ </span> <input class="give-text-input give-amount-top form-control" id="rd_amount1" name="rd_amount1" type="text" inputmode="decimal" placeholder="" value="" autocomplete="off" disabled /> <input type="hidden" name="rd_amount" id="rd_amount" value="" /> </div> </div> <ul id="give-donation-level-button-wrap" class="give-donation-levels-wrap give-list-inline"> <li> <button type="button" data-price-id="0" class="give-donation-level-btn give-btn give-btn-level-1 " value="12" id="amount0">$12.00</button> </li> <script type="text/javascript"> jQuery( "#amount0" ).click(function() { jQuery(".give-btn").removeClass("give-default-level"); jQuery( "#amount0" ).addClass("give-default-level"); jQuery("#rd_amount1").val('12'); jQuery("#rd_amount").val('12'); }); </script> <li> <button type="button" data-price-id="1" class="give-donation-level-btn give-btn give-btn-level-1 " value="24" id="amount1">$24.00</button> </li> <script type="text/javascript"> jQuery( "#amount1" ).click(function() { jQuery(".give-btn").removeClass("give-default-level"); jQuery( "#amount1" ).addClass("give-default-level"); jQuery("#rd_amount1").val('24'); jQuery("#rd_amount").val('24'); }); </script> <li> <button type="button" data-price-id="2" class="give-donation-level-btn give-btn give-btn-level-1 " value="36" id="amount2">$36.00</button> </li> <script type="text/javascript"> jQuery( "#amount2" ).click(function() { jQuery(".give-btn").removeClass("give-default-level"); jQuery( "#amount2" ).addClass("give-default-level"); jQuery("#rd_amount1").val('36'); jQuery("#rd_amount").val('36'); }); </script> <li> <button type="button" data-price-id="3" class="give-donation-level-btn give-btn give-btn-level-1 " value="48" id="amount3">$48.00</button> </li> <script type="text/javascript"> jQuery( "#amount3" ).click(function() { jQuery(".give-btn").removeClass("give-default-level"); jQuery( "#amount3" ).addClass("give-default-level"); jQuery("#rd_amount1").val('48'); jQuery("#rd_amount").val('48'); }); </script> </ul> <div class="give-payment-wrap"> </div> <div class="give-donate-button-wrap"> <button type="button" class="button btn btn-warning" name="btnDonate" id="btnDonate" onclick="checkDonation(this.form);">Contribute Now!</button> </div> </div> </div> <input type="hidden" name="payment_method" value="os_paypal" /> <input type="hidden" name="option" value="com_jdonation" /> <input type="hidden" name="task" value="" /> <input type="hidden" name="Itemid" value="0" /> </form> <script type="text/javascript"> var donationType = 1; var minimumAmount = 10 ; var maximumAmount = 1000 ; function checkDonation(form) { var amount = 0 ; if (!parseFloat(form.rd_amount.value) && parseFloat(form.rd_amount1.value) > 0) { form.rd_amount.value = form.rd_amount1.value; } if (!parseFloat(form.rd_amount.value) && !parseFloat(form.rd_amount1.value)) { alert("Please enter a valid donation amount"); form.rd_amount.focus(); return; } if (parseFloat(form.rd_amount.value) < minimumAmount) { alert("Minimum donation amount allowed is : $" + minimumAmount); form.rd_amount.focus(); return; } if ((maximumAmount > 0) && (parseFloat(form.rd_amount.value) > maximumAmount)) { alert("Maximum donation amount allowed is : $" + maximumAmount); form.rd_amount.focus(); return; } if (form.payment_method.value == '') { alert("Please choose a payment method"); form.payment_method.focus(); return; } //All data is valid, submit form for processing form.submit(); } </script> </form></div></div></div><div class="t3-module module " id="Mod1339"><div class="module-inner"><div class="module-ct"> <div id="mod-custom1339" class="mod-custom custom"> <center><!-- Feature Ad 2 MR [async] --> <script type="text/javascript">// <![CDATA[ if (!window.AdButler){(function(){var s = document.createElement("script"); s.async = true; s.type = "text/javascript";s.src = 'https://servedbyadbutler.com/app.js';var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(s, n);}());} // ]]></script> <script type="text/javascript">// <![CDATA[ var AdButler = AdButler || {}; AdButler.ads = AdButler.ads || []; var abkw = window.abkw || ''; var plc267600 = window.plc267600 || 0; document.write('<'+'div id="placement_267600_'+plc267600+'"></'+'div>'); AdButler.ads.push({handler: function(opt){ AdButler.register(168268, 267600, [300,250], 'placement_267600_'+opt.place, opt); }, opt: { place: plc267600++, keywords: abkw, domain: 'servedbyadbutler.com', click:'CLICK_MACRO_PLACEHOLDER' }}); // ]]></script> </center></div> </div></div></div><div class="t3-module module " id="Mod2376"><div class="module-inner"><h3 class="module-title module-title"><span>Book Reviews</span></h3><div class="module-ct"><script src="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/js/splide.min.js"></script> <link href="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/css/splide.min.css" rel="stylesheet"> <style> #book-reviews .splide__arrow { top: auto; transform: none; bottom: 0; width: 2em; z-index: 1; } #book-reviews.splide { margin-bottom: 40px; padding: 0 20px; } #book-reviews.splide .splide__slide img { max-width: 100px; width: 100%; height: auto; margin-right: 10px !important; } </style> <section class="splide" id="book-reviews"> <div class="splide__track"> <ul class="splide__list"> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-extract-transform-and-load-with-ssis" itemprop="url"><h4 itemprop="name">Book Review: Extract, Transform, and Load with SSIS</h4></a> <p>Do your business apps access different data sources? This book shows you how to make that task easier</p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-21st-century-rpg-free-ile-and-mvc" itemprop="url"><h4 itemprop="name">Book Review: 21st Century RPG: /Free, ILE, and MVC</h4></a> <p>David Shirey’s first book is an educational and entertaining read for “modern” and “old” RPG programmers alike</p> </li> <li class="splide__slide"> <a href="/programming/book-review-developing-business-applications-for-the-web-with-html-css-jsp-php-asp-net-and-javascript" itemprop="url"><h4 itemprop="name">Book Review: Developing Business Applications for the Web--With HTML, CSS, JSP, PHP, ASP.NET, and JavaScript</h4></a> <p>If you are ready to get into Web application development, take this book along as your guide</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-105-fundamentals-for-luw-certification-study-guide-exam-615" itemprop="url"><h4 itemprop="name">Book Review: DB2 10.5 Fundamentals for LUW: Certification Study Guide (Exam 615)</h4></a> <p>DBAs who use the book will find it very helpful first in their test study and later as a reference book.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-11-for-zos-database-administrationcertification-study-guide" itemprop="url"><h4 itemprop="name">Book Review: DB2 11 for z/OS Database Administration—Certification Study Guide</h4></a> <p>This is a well-written DB2 11 book that could easily stand on its own as a reference manual, not just a certification guide.</p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-free-format-rpg-iv-third-edition" itemprop="url"><h4 itemprop="name">Book Review: Free-Format RPG IV, Third Edition</h4></a> <p>Jim Martin comes through for us again.</p> </li> <li class="splide__slide"> <a href="/security/ibm-i-os400-i5os/book-review-ibm-i-security-administration-and-compliance-second-edition" itemprop="url"><h4 itemprop="name">Book Review: IBM i Security Administration and Compliance, Second Edition</h4></a> <p></p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-programming-in-ile-rpg-fifth-edition" itemprop="url"><h4 itemprop="name">Book Review: Programming in ILE RPG, Fifth Edition</h4></a> <p>This book really hits the mark and is a must-read for all RPG developers.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-101105-for-linux-unix-and-windows-database-administration-certification-guide" itemprop="url"><h4 itemprop="name">Book Review: DB2 10.1/10.5 for Linux, UNIX, and Windows Database Administration: Certification Guide</h4></a> <p></p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-subfiles-in-free-format-rpg" itemprop="url"><h4 itemprop="name">Book Review: Subfiles in Free-Format RPG </h4></a> <p>Whether you're a newbie or a seasoned pro, this book has something for you.</p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-evolve-your-rpg-coding-move-from-opm-to-ile-and-beyond" itemprop="url"><h4 itemprop="name">Book Review: Evolve Your RPG Coding: Move from OPM to ILE ... and Beyond</h4></a> <p>This book provides an amazingly comprehensive introduction to the concepts while at the same time delivering enough technical detail to make you productive very quickly.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-database-design-and-sql-for-db2" itemprop="url"><h4 itemprop="name">Book Review: Database Design and SQL for DB2</h4></a> <p></p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-the-chief-data-officer-handbook-for-data-governance" itemprop="url"><h4 itemprop="name">Book Review: The Chief Data Officer Handbook for Data Governance </h4></a> <p>When implemented appropriately, data governance is a powerful framework.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-10-for-zos-the-smarter-faster-way-to-upgrade" itemprop="url"><h4 itemprop="name">Book Review: DB2 10 for z/OS: The Smarter, Faster Way to Upgrade</h4></a> <p>Trying to figure out whether to upgrade? Read on.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-5-keys-to-business-analytics-program-success" itemprop="url"><h4 itemprop="name">Book Review: 5 Keys to Business Analytics Program Success</h4></a> <p></p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-11-the-ultimate-database-for-cloud-analytics-and-mobile" itemprop="url"><h4 itemprop="name">Book Review: DB2 11: The Ultimate Database for Cloud, Analytics, and Mobile</h4></a> <p></p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-flexible-input-dazzling-output-with-ibm-i" itemprop="url"><h4 itemprop="name">Book Review: Flexible Input, Dazzling Output with IBM i</h4></a> <p>Today, it's all about input and output. Getting data into the IBM i from non-traditional sources and then displaying it back out again in varied formats. But where can you go to learn all that you need to know about this critical skill?</p> </li> <li class="splide__slide"> <a href="/programming/web-languages/book-review-advanced-guide-to-php-on-ibm-i" itemprop="url"><h4 itemprop="name">Book Review: Advanced Guide to PHP on IBM i</h4></a> <p>Enterprise-level PHP skills and techniques have been adapted for IBM i developers in Kevin Schroeder's new book. </p> </li> <li class="splide__slide"> <a href="/programming-other/java/book-review-java-for-rpg-programmers" itemprop="url"><h4 itemprop="name">Book Review: Java for RPG Programmers</h4></a> <p>If you've been putting off learning Java, you have no excuse anymore!</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-101-fundamentals-certification-study-guide" itemprop="url"><h4 itemprop="name">Book Review: DB2 10.1 Fundamentals: Certification Study Guide</h4></a> <p>Too valuable to be classified as merely excellent certification material, this book should also rightly take its place on DB2 DBA bookshelves as a solid day-to-day DB2 reference.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-10-for-zos-database-administration-certification-study-guide" itemprop="url"><h4 itemprop="name">Book Review: DB2 10 for Z/OS Database Administration: Certification Study Guide </h4></a> <p>Whether you're trying to get certified or you just need a great reference book, this is the book for you.</p> </li> <li class="splide__slide"> <a href="/programming/web-languages/book-review-developing-web-20-applications-with-egl-for-ibm-i" itemprop="url"><h4 itemprop="name">Book Review: Developing Web 2.0 Applications with EGL for IBM i</h4></a> <p>It's everything you need to know, from the bottom up.</p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-advanced-integrated-rpg" itemprop="url"><h4 itemprop="name">Book Review: Advanced Integrated RPG</h4></a> <p>Isn't it about time somebody told us how to integrate RPG and Java?</p> </li> <li class="splide__slide"> <a href="/career/general/book-review-managing-without-walls" itemprop="url"><h4 itemprop="name">Book Review: Managing Without Walls</h4></a> <p>If you manage remote or satellite teams, this book is a must-read!</p> </li> <li class="splide__slide"> <a href="/current-events-commentary/commentary/book-review-managing-without-walls" itemprop="url"><h4 itemprop="name">Book Review: Managing Without Walls</h4></a> <p>If you manage remote or satellite teams, this book is a must-read!</p> </li> <li class="splide__slide"> <a href="/programming-other/development-tools/book-review-the-remote-system-explorer" itemprop="url"><h4 itemprop="name">Book Review: The Remote System Explorer</h4></a> <p>This book speaks directly to the thousands of IBM i programmers who develop in RPG, COBOL, CL, and DDS every day.</p> </li> <li class="splide__slide"> <a href="/programming/apis/book-review-ibm-system-i-apis-at-work-second-edition" itemprop="url"><h4 itemprop="name">Book Review: IBM System i APIs at Work, Second Edition</h4></a> <p>API expert Bruce Vining delivers the only comprehensive guide to APIs.</p> </li> <li class="splide__slide"> <a href="/programming/rpg/book-review-functions-in-free-format-rpg-iv" itemprop="url"><h4 itemprop="name">Book Review: Functions in Free-Format RPG IV</h4></a> <p>This one short volume manages to essentially be both a general introduction and a detailed reference.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-11-the-database-for-big-data-and-analytics" itemprop="url"><h4 itemprop="name">Book Review: DB2 11: The Database for Big Data and Analytics </h4></a> <p></p> </li> <li class="splide__slide"> <a href="/security/general/book-review-ibm-mainframe-security-beyond-the-basics" itemprop="url"><h4 itemprop="name">Book Review: IBM Mainframe Security: Beyond the Basics</h4></a> <p>Beginners will have a strong foundation after reading this book. Experienced professionals will reference it frequently.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-ibm-infosphere-a-platform-for-big-data-governance-and-process-data-governance" itemprop="url"><h4 itemprop="name">Book Review: IBM InfoSphere: A Platform for Big Data Governance and Process Data Governance </h4></a> <p>Find out how IBM is addressing the challenges of big data.</p> </li> <li class="splide__slide"> <a href="/career/general/book-review-fundamentals-of-technology-project-management" itemprop="url"><h4 itemprop="name">Book Review: Fundamentals of Technology Project Management</h4></a> <p>Projects can be overwhelming, but taken in small, deliberate steps, all projects are achievable.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-customer-experience-analytics" itemprop="url"><h4 itemprop="name">Book Review: Customer Experience Analytics </h4></a> <p>Use CEA as a strategic weapon to stay ahead of your competitors.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-big-data-analytics-disruptive-technologies-for-changing-the-game" itemprop="url"><h4 itemprop="name">Book Review: Big Data Analytics: Disruptive Technologies for Changing the Game </h4></a> <p>The disciplines of data analytics are evolving to meet the new challenges of big data. </p> </li> <li class="splide__slide"> <a href="/security/ibm-i-os400-i5os/book-review-ibm-i-security-administration-and-compliance" itemprop="url"><h4 itemprop="name">Book Review: IBM i Security: Administration and Compliance</h4></a> <p>If you have any interest in IBM i security, whether as an administrator, a programmer, or an auditor, then this book is the perfect resource.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-97-for-linux-unix-and-windows-database-administration-exam-541" itemprop="url"><h4 itemprop="name">Book Review: DB2 9.7 for Linux, UNIX, and Windows Database Administration (Exam 541)</h4></a> <p>This book, written by the creator of the certification exam, reveals exactly what you'll need to know to prep for the test.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/business-intelligence/book-review-selling-information-governance-to-the-business-best-practices-by-industry-and-job-function" itemprop="url"><h4 itemprop="name">Book Review: Selling Information Governance to the Business</h4></a> <p>Who governs the information that runs your company?</p> </li> <li class="splide__slide"> <a href="/programming/web-languages/book-review-you-want-to-do-what-with-php" itemprop="url"><h4 itemprop="name">Book Review: You Want to Do WHAT with PHP?</h4></a> <p>If you're serious about programming in PHP, get a book that treats you that way.</p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-the-ibm-i-programmers-guide-to-php" itemprop="url"><h4 itemprop="name">Book Review: The IBM i Programmer's Guide to PHP</h4></a> <p>Both a primer and a reference, this book is a must-have for anyone who wants to program in PHP.</p> </li> <li class="splide__slide"> <a href="/programming/web-languages/book-review-javascript-for-the-business-developer" itemprop="url"><h4 itemprop="name">Book Review: JavaScript for the Business Developer</h4></a> <p> There's no faster, easier way to become proficient in JavaScript. </p> </li> <li class="splide__slide"> <a href="/career/general/book-review-soa-for-the-business-developer" itemprop="url"><h4 itemprop="name">Book Review: SOA for the Business Developer</h4></a> <p> If you want to know how SOA works in the real world, this is your book. </p> </li> <li class="splide__slide"> <a href="/analytics-cognitive/db2/book-review-db2-9-fundamentals" itemprop="url"><h4 itemprop="name">Book Review: DB2 9 Fundamentals</h4></a> <p> Whether you want to obtain an IBM certified DB2 professional certification or simply become well-rounded in the fundamental concepts of DB2 and general database theory, this is your book. </p> </li> <li class="splide__slide"> <a href="/career/general/book-review-the-modern-rpg-iv-language-fourth-edition" itemprop="url"><h4 itemprop="name">Book Review: The Modern RPG IV Language, Fourth Edition</h4></a> <p> This book isn't a training manual; it's a reference book. </p> </li> </ul> </div> </section> <script> document.addEventListener( 'DOMContentLoaded', function() { var splide1 = new Splide( '#book-reviews', { type : 'loop', pauseOnHover: true, autoplay: true, interval: 10000, pagination: false } ); splide1.mount(); }); </script></div></div></div><div class="t3-module module " id="Mod2399"><div class="module-inner"><div class="module-ct"> <div id="mod-custom2399" class="mod-custom custom"> <script async="async" src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6907546339095191" crossorigin="anonymous"></script> <!-- Right column square ad --> <p><ins class="adsbygoogle" style="display: inline-block; width: 300px; height: 250px;" data-ad-client="ca-pub-6907546339095191" data-ad-slot="7058067327"></ins></p> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div> </div></div></div><div class="t3-module module " id="Mod2403"><div class="module-inner"><h3 class="module-title "><span>Resource Center</span></h3><div class="module-ct"><style> #resources-center-slides .splide__arrow { top: auto; transform: none; bottom: 0; width: 2em; z-index: 1; } #resources-center-slides { margin-bottom: 40px; padding: 0 20px; } resources-center-slides .splide__slide img { max-width: 100px; width: 100%; height: auto; margin-right: 10px !important; } </style> <section class="splide" id="resources-center-slides"> <div class="splide__track"> <ul class="splide__list"> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/node-js-on-ibm-i-webinar-series-pt-2-setting-up-your-development-tools" itemprop="url"><h4 itemprop="name">Node.js on IBM i Webinar Series Pt. 2: Setting Up Your Development Tools</h4></a> <p><img src="/images/ppl/SB_Profound_WC_5536.jpg" alt="SB Profound WC 5536" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-white-papers/profound-logic-solution-guide" itemprop="url"><h4 itemprop="name">Profound Logic Solution Guide</h4></a> <p><img src="/images/ppl/SB_Profound_WP_Generic.gif" alt="SB Profound WP 5539" style="margin: 5px; float: left;" width="125" height="125" />More 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.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/power10-power-hour" itemprop="url"><h4 itemprop="name">Power10 Power Hour</h4></a> <p><img src="/images/ppl/SB_Fortra_WC_Generic.gif#joomlaImage://local-images/ppl/SB_Fortra_WC_Generic.gif?width=125&height=125" alt="SB HelpSystems ROBOT Generic" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-trial-software/comply-in-5-well-actually-under-5-minutes" itemprop="url"><h4 itemprop="name">Comply in 5! Well, actually UNDER 5 minutes!!</h4></a> <p><img src="/images/ppl/SB_CYBRA_PPL_5382.gif" alt="Magic Mark" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />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. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/combating-ransomware-building-a-strategy-to-prevent-and-detect-attacks" itemprop="url"><h4 itemprop="name">Combating Ransomware: Building a Strategy to Prevent and Detect Attacks</h4></a> <p><img src="/images/ppl/SB_Fortra_WC_Generic.gif" alt="SB HelpSystems ROBOT Generic" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125">Forms 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.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/top-ibm-i-security-vulnerabilities-and-how-to-address-them" itemprop="url"><h4 itemprop="name">Top IBM I Security Vulnerabilities and How to Address Them</h4></a> <p><img src="/images/ppl/SB_Fortra_WC_Generic.gif#joomlaImage://local-images/ppl/SB_Fortra_WC_Generic.gif?width=125&height=125" alt="SB HelpSystems ROBOT Generic" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />IT 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.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/what-most-ibm-i-shops-get-wrong-about-the-ifs" itemprop="url"><h4 itemprop="name">What Most IBM i Shops Get Wrong About the IFS</h4></a> <p><img src="/images/ppl/SB_Fortra_WC_Generic.gif#joomlaImage://local-images/ppl/SB_Fortra_WC_Generic.gif?width=125&height=125" alt="SB HelpSystems ROBOT Generic" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />Can 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-trial-software/backup-and-recovery-on-ibm-i-your-strategy-for-the-unexpected" itemprop="url"><h4 itemprop="name">Backup and Recovery on IBM i: Your Strategy for the Unexpected</h4></a> <p><img src="/images/ppl/SB_Fortra_TS_Generic.gif" alt="FORTRA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-trial-software/manage-ibm-i-messages-by-exception-with-robot" itemprop="url"><h4 itemprop="name">Manage IBM i Messages by Exception with Robot</h4></a> <p><img src="/images/ppl/SB_Fortra_TS_Generic.gif" alt="FORTRA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />Managing 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-trial-software/easiest-way-to-save-money-stop-printing-ibm-i-reports" itemprop="url"><h4 itemprop="name">Easiest Way to Save Money? Stop Printing IBM i Reports</h4></a> <p><img src="/images/ppl/SB_Fortra_TS_Generic.gif" alt="FORTRA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />The 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-trial-software/hassle-free-ibm-i-operations-around-the-clock" itemprop="url"><h4 itemprop="name">Hassle-Free IBM i Operations around the Clock</h4></a> <p><img src="/images/ppl/SB_Fortra_TS_Generic.gif" alt="FORTRA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />For 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-white-papers/why-migrate-when-you-can-modernize" itemprop="url"><h4 itemprop="name">Why Migrate When You Can Modernize?</h4></a> <p><img src="/images/ppl/SB_LANSA_PPL_5650-125x125.jpg" alt="LANSA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-white-papers/the-power-of-coding-in-a-low-code-solution" itemprop="url"><h4 itemprop="name">The Power of Coding in a Low-Code Solution </h4></a> <p><img src="/images/ppl/SB_LANSA_PPL_5650-125x125.jpg" alt="LANSA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />When 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/low-code-a-digital-transformation-of-supply-chain-and-logistics" itemprop="url"><h4 itemprop="name">Low Code: A Digital Transformation of Supply Chain and Logistics</h4></a> <p><img src="/images/ppl/SB_LANSA_PPL_5650-125x125.jpg" alt="LANSA" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />Supply 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:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-white-papers/resource-center-mc-white-paper-center" itemprop="url"><h4 itemprop="name">Resource Center</h4></a> <p>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</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/node-webinar-series-pt-1-the-world-of-node-js-on-ibm-i" itemprop="url"><h4 itemprop="name">Node Webinar Series Pt. 1: The World of Node.js on IBM i</h4></a> <p><img src="/images/ppl/SB_Profound_WC_5536.jpg" alt="Profound Logic" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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.</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-on-demand-webcast/ibm-i-transformation-risks-every-business-leader-should-know" itemprop="url"><h4 itemprop="name">IBM i Transformation Risks Every Business Leader Should Know</h4></a> <p><img src="/images/ppl/SB_Profound_WC_5536.jpg" alt="SB Profound WC 5536" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" />Join us for this hour-long webcast that will explore:</p> </li> <li class="splide__slide"> <a href="/advertisements/resource-center-white-papers/what-to-do-when-your-as-400-talent-retires" itemprop="url"><h4 itemprop="name">What to Do When Your AS/400 Talent Retires</h4></a> <p><img src="/images/ppl/SB-Fortra-PPL-Generic.jpg" alt="Fortra" style="margin: 5px 20px 5px 5px; float: left;" width="125" height="125" /> 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:</p> </li> </ul> </div> </section> <script> document.addEventListener( 'DOMContentLoaded', function() { var splide2 = new Splide( '#resources-center-slides', { type: 'loop', pauseOnHover: true, autoplay: true, interval: 10000, pagination: false }); splide2.mount(); }); </script></div></div></div> </div> <!-- //SIDEBAR RIGHT --> </div> </div> </div> <!-- FOOTER --> <footer id="t3-footer" class="wrap t3-footer"> <div class="container"> <section class="t3-footer-links"> <div class="row"> <div class="col-md-4"> <!-- LOGO --> <div class="logo"> <div class="logo-image"> <a href="/" title="MC Press Online"> <img class="logo-img" src="/images/stories/logos/MC-WEB-HEADER-290x96-overlay-dots-fade-l-r.gif" alt="MC Press Online" /> <span>MC Press Online</span> </a> <small class="site-slogan"></small> </div> </div> <!-- //LOGO --> <!-- NEWSLETTER --> <div class="acy-email-footer"> <div id="mod-custom1120" class="mod-custom custom"> <div class="signup">Sign up via our free email subscription services to receive our publications, bookstore offer and industry vendor notifications.</div> <p class="acysubbuttons"> </p> <p class="acysubbuttons"><a class="button subbutton btn btn-primary" href="/component/comprofiler/registers">Subscribe</a></p></div> </div> <!-- //NEWSLETTER --> </div> <div class="col-md-8"> <!-- FOOT NAVIGATION --> <!-- SPOTLIGHT --> <div class="t3-spotlight t3-footnav row"> <div class=" col-lg-3 col-md-3 col-sm-3 col-xs-6"> <div class="t3-module module " id="Mod1097"><div class="module-inner"><h3 class="module-title "><span>MC Press Users</span></h3><div class="module-ct"> <div id="mod-custom1097" class="mod-custom custom"> <div class="joomla_user"> <div><a href="/log-in/">Login</a> <div> <div><a href="/component/comprofiler/registers">Registration</a></div> </div> </div> </div></div> </div></div></div><div class="t3-module module " id="Mod1091"><div class="module-inner"><h3 class="module-title "><span>Explore</span></h3><div class="module-ct"> <div id="mod-custom1091" class="mod-custom custom"> <div class="explore"> <div><a href="/index.php?option=com_osmap&view=html&id=1&Itemid=4002&lang=en">Site Map</a></div> <div><a href="/general-content/privacy-policy">Privacy Policy</a></div> </div></div> </div></div></div> </div> <div class=" col-lg-3 col-md-3 col-sm-3 col-xs-6"> <div class="t3-module module " id="Mod1092"><div class="module-inner"><h3 class="module-title "><span> Advertise</span></h3><div class="module-ct"> <div id="mod-custom1092" class="mod-custom custom"> <div class="advertise"> <div><a href="/general-content/media-kit-2025">Advertise</a></div> <div><a href="/general-content/write-for-mc-press">Write For Us</a></div> </div></div> </div></div></div><div class="t3-module module " id="Mod1098"><div class="module-inner"><h3 class="module-title "><span>Help</span></h3><div class="module-ct"> <div id="mod-custom1098" class="mod-custom custom"> <div class="help"> <div><a href="/general-content/contact-us">Contact Us</a></div> <div><a href="/search">Search</a></div> <div><a href="/faq">FAQs</a></div> </div></div> </div></div></div> </div> <div class=" col-lg-3 col-md-3 col-sm-3 col-xs-6"> <div class="t3-module module " id="Mod1099"><div class="module-inner"><h3 class="module-title "><span>Articles</span></h3><div class="module-ct"> <div id="mod-custom1099" class="mod-custom custom"> <div class="custom_feature"> <div><a href="/general-content/feature-articles">Feature</a></div> <div><a href="/news">Industry News</a></div> </div></div> </div></div></div><div class="t3-module module " id="Mod1100"><div class="module-inner"><h3 class="module-title "><span>Resources</span></h3><div class="module-ct"> <div id="mod-custom1100" class="mod-custom custom"> <div class="custom_resources"> <div><a target="_blank" href="https://mc-store.com/collections/mc-on-demand-webcast">On-Demand Webcast</a></div> <div><a target="_blank" href="https://mc-store.com/collections/mc-trial-software">Trial Software</a></div> <div><a target="_blank" href="https://mc-store.com/collections/mc-white-paper">White Papers</a></div> </div></div> </div></div></div> </div> <div class=" col-lg-3 col-md-3 col-sm-3 col-xs-6"> <div class="t3-module module " id="Mod1093"><div class="module-inner"><h3 class="module-title "><span>Social</span></h3><div class="module-ct"> <div id="mod-custom1093" class="mod-custom custom"> <div class="socailmedia"> <div><a href="https://twitter.com/mcpressonline" target="_blank"><i class="fa-brands fa-twitter"></i> Twitter</a></div> <div><a href="https://www.facebook.com/mcpressonline/" target="_blank"><i class="fa-brands fa-facebook-f"> </i> Facebook</a></div> <div><a href="https://www.linkedin.com/company/mc-press-online-llc" target="_blank"><i class="fa-brands fa-linkedin-in"></i> Linked</a></div> <div><a href="/general-content/rssfeed"><i class="fa fa-rss"> </i> RSS</a></div> </div></div> </div></div></div> </div> </div> <!-- SPOTLIGHT --> <!-- //FOOT NAVIGATION --> <div class="footer-banner"> <div id="mod-custom1101" class="mod-custom custom"> <script async="async" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" type="text/javascript"></script> <!-- Footer Banner --> <p><ins class="adsbygoogle" style="display: block;" data-ad-client="ca-pub-6907546339095191" data-ad-slot="6374680746" data-ad-format="auto" data-full-width-responsive="true"></ins></p> <script type="text/javascript"> (adsbygoogle = window.adsbygoogle || []).push({}); </script></div> </div> </div> </div> </section> <section class="t3-copyright"> <div class="row"> <div class="col-md-12 copyright "> <div id="mod-custom1104" class="mod-custom custom"> <div class="copyright">© Copyright 2024 MC Press Online, LLC</div></div> </div> </div> </section> </div> </footer> <!-- //FOOTER --> <!-- BACK TOP TOP BUTTON --> <div id="back-to-top" data-spy="affix" data-offset-top="200" class="back-to-top hidden-xs hidden-sm affix-top"> <button class="btn btn-primary" title="Back to Top"><span class="fa fa-angle-up"></span></button> </div> <script type="text/javascript"> (function($) { // Back to top $('#back-to-top').on('click', function(){ $("html, body").animate({scrollTop: 0}, 500); return false; }); })(jQuery); </script> <!-- BACK TO TOP BUTTON --> </div> <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-5c63616521cd1952"></script> </body> </html>