Posts

IBMi (AS400) fans only ‘ Recursion in RPGfree

Image
To my friend. I want to dedicate this short post to a dear friend of mine, a developer who uses the C language and other modern programming tools, who repeatedly asked me: "Is the RPG language recursive?". Until some time ago I had to answer: "unfortunately not". I defended myself by explaining that the RPG language is a programming language primarily used for developing business applications for the IBM i and there is no need for advanced features. Bullshit! Actually the RPG language was not recursive, STOP! But now, finally and with great satisfaction, I can answer yes, it is! What does "Recursion" mean? Recursion is a programming technique or approach where a function or a subroutine calls itself directly or indirectly to solve a problem. It involves breaking down a complex problem into simpler subproblems that can be solved easily, and then using the same function to solve those subproblems repeatedly until the base case is reached. Recursion can be a

IBM i (AS400) fans only ' Realtime exchange rate for any pair of physical and digital currency reading JSON data from a webservice with RPG, SQL and HTTPGETCLOB function

Image
Realtime exchange rate for any pair of digital or physical currency using HTTP GET and JSON_TABLE reading with SQL HTTPGETCLOB. This CLP is intended to test the FREX00.SQLRPGLE utility.

IBM i (AS400) fans only ' How to read a TXT file in the IFS with SQL

Image
In this post, I'm going to show how you can easily read a TXT file in IFS using SQL. I create a file named divina.txt  and copy it to IFS. Here we can see the file divina.txt into IFS. I use ACS to show it. Here we can see the file divina.txt into IFS. I use WRKLNK to show it. Here we can see the file divina.txt into IFS. I use option  5=Display into  WRKLNK ( Work with Object Links ). I read it through SQL and write it to QTEMP/OUTFILE: Execute this SQL command: CREATE TABLE QTEMP.OUTFILE (RECORD) AS                                          (SELECT CAST(LINE AS CHAR(50)) FROM TABLE                           (QSYS2.IFS_READ('/home/VDOTEST/WSF/DIVINA.txt')))               WITH DATA To display the QTEMP/OUTFILE file, type from the command line: DSPPFM FILE(QTEMP/OUTFILE) That's it. I appreciate all the comments made on this blog.

IBMi (AS400) fans only ' How to copy a library to a Windows PC folder

Image
Step 1. On your IBMi create a Save File in any library (A Save File is a special type of file that is used to store a backup of data or objects). I use the MYSELF1 library in this example. CRTSAVF FILE(MYSELF1/YourSavF) Step 2. Save Your library to Your Save File. SAVLIB LIB(LibraryToSave) DEV(*SAVF) SAVF(MYSELF1/YourSavF) Now go to your Windows Personal Computer 1. Open a command prompt window ( CMD ). 2. Type the following: CD C:\TEMP Press the Enter key. 3. FTP SYSTEMNAME or FTP xxx.xxx.xxx.xxx where SYSTEMNAME is the IBM i system name and xxx.xxx.xxx.xxx is the IP address. Press the Enter key. 4. Type the user ID and password. 5. To change to binary mode, type the following: BIN Press the Enter key. 6. To change the host and client to naming convention type 1, type the following: QUOTE SITE NAMEFMT 1 Press the Enter key. 7. Get the SAVF and put it into C:\TEMP GET /QSYS.LIB/MYSELF1.LIB/YOURSAVF.SAVF YourSavF.SAVF Press the Enter key. Now YourSavF.SAVF is in PC folder C:\TEMP

IBMi (AS400) fans only ' Journaling database physical files (tables)

Image
Journaling database physical files is a powerful, built-in OS feature. It allows you to audit data file changes. Tracks additions, updates, deletions of a physical file. Let's see how it works. Scenario: I have a phisical file (Tabel) called CLANA00F, I wont tracks additions, updates and deletions about CLANA00F. Step 1: CRTJRNRCV create a journal receiver in your library CRTJRNRCV JRNRCV(VDOTEST1/JRCV) THRESHOLD(1500000) TEXT('My Journal Receiver') Step 2: CRTJRN create a journal into the journal receiver CRTJRN JRN(VDOTEST1/JRNL) JRNRCV(VDOTEST1/JRCV) Here is the just created journal receiver and the journal.  Step 3: STRJRNPF start auditing STRJRNPF FILE(VDOTEST1/CLANA00F) JRN(VDOTEST1/JRNL) IMAGES(*BOTH) OMTJRNE(*OPNCLO) // the option OMTJRNE(*OPNCLO) omit open and close entries. // Open and close operations on the specified file members do not create open and close journal entries. It saves some storage space in the attached receivers.                                

IBMi (AS400) fans only ' How to access multimember physical file using SQL alias

Image
#IBMiSample Each IBMi user knows they run the most efficient system. All others just have too much money. SQL has no direct access to IBM i multiple-member physical file but OS/400 support an SQL alias statement . Therefore, I need to create an alias for the member I want to access with SQL. I give an example using the IBM i PUB400 public server. In library VDOTEST1, file QDDSLF I have 8 members. CLANA01L CLANA02L CLANA03L CLANA04L CLANA05L CLANA06L CNCON01L OTORD01L I want to access member CLANA03L via SQL. I type STRSQL (Enter) then I create the ALIAS: create alias A_CLANA03L for VDOTEST1.QDDSLF(CLANA03L) The alias is a persistent object.  The ALIAS object has attribute DDMF. Now I can access the member with SQL: Display data from CLANA03L Don't forget to remove the ALIAS with a "DROP" command: DROP ALIAS myLibrary/myAlias That’s it. Thanks to the suggestion of my friend Don Anderson I add this way: SELECT CAST(LINE AS CHAR(120))                      FROM TABLE (   

IBMi (AS400) fans only ' From Query to SQL with one command

Image
#IBMiSample Each IBMi user knows they run the most efficient system. All others just have too much money. In most of IBMi we have a large number of QUERIES. Often these QUERIES are provided to end users, with all limitations of this practice. I think this practice is deplorable. How about turning these queries into SQL and then writing an RPG with embedded SQL? The QUERY to SQL translation process is really simple, it only takes one command: RTVQMQRY QMQRY(MyQueryLib/MyQuery) SRCFILE(MyLib/MySrcFile) ALWQRYDFN(*YES) That's it! Below an example of a cursor declaration in an SQLRPGLE program (Sql embedded) // preapre the data recordset exec sql declare C1 cursor for select OTORD00F.OTANN0, OTORD00F.OTCOR0, CLANA00F.CLNOM0 from OTORD00F inner join CLANA00F on OTCCL0 = CLCCL0 where OTANN0 like :F1ANN0lke and OTCOR0 between :F1COR0str and :F1COR0end and CLNOM0 like :F1NOM0lke order by OTCOR0 for read only; Here is a complete SQLRPGLE sample program with SQL embedded . #IBMiSam

IBMi (AS400) fans only ‘ Another way to manage spooled files

Image
New feature:  F18=Search string into listed files WSF utility, works like WRKSPLF but... New feature: Searching a string into  spooled files New feature: Generate a PDF from a spooled file #IBMiSample Each IBMi user knows they run the most efficient system. All others just have too much money. If you are interested in this program  Download WSF *SAVF  (New version with Create PDF option) Need some help loading the *savf?  HOW TO GET *SAVF FROM YOUR DESKTOP TO YOUR IBM I SYSTEM Users often have many spool-file rows. How to  quickly   find the last done? how to quickly find the one produced on October 15th? These and other options are just a click away. The WRKSPLF command does not show spool-file rows sorted by Creation-Date/Creation-Time, so the last one is not the first one in the list. I thought a different way of looking at spooled-file rows might be useful. In this program (WSF) the spool-file rows appears in order of Creation-Date/Creation-Time, with the last one at the top of the

IBMi (AS400) fans only ' How to pass parameters to a Query

Image
#IBMiSample Each IBMi user knows they run the most efficient system. All others just have too much money. First of all look at  this post  and compile and populate OTORD00F file to use this example. Let's create a query called Q01A : ccm   represents our parameter to pass to the query. Type F3 Now let's write the CL to pass the ccm parameter to the query: Q01ACL CL ****************** Inizio dati *******************************              PGM        PARM(&CCM)                                          DCL        VAR(&CCM) TYPE(*CHAR) LEN(5)                        STRQMQRY   QMQRY(Q01A) OUTPUT(*) QMFORM(*QMQRY) +                           ALWQRYDFN(*YES) SETVAR((CCM &CCM))               ENDPGM                                             ******************** Fine dati ******************************* We save and compile the CL. Now let's try. Type: CALL PGM(Q01ACL) PARM(('103')) I have two records into OTORD00F with  OTCCM0  = ' 103 '. This is the r