Visual Studio Code, RPG and IBM i
Visual Studio Code is an IDE and platform for developers to write backend, progressive web apps, frontend, and everything on the spectrum of development. I have created an extension for VS Code, called Code for IBM i, that allows users to work on and maintain their IBM i code. VS Code is the best IDE for extensibility, which is why I wanted to take on such a task.
While Visual Studio Code was built to work with all languages, in my opinion it didn’t have much support for RPGLE or COBOL on IBM i until this point. We’re streamlining RPGLE development in terms of tools and speed for our users. We want to make developing RPGLE and COBOL easy for everyone in the most efficient way possible.
Since 2017, I have been building extensions and standalone IDEs, like IBMiCmd, ILEditor 1, and ILEditor 2. I firmly believe that Code for IBM i is the best iteration of my work, and it makes me so happy that I can share it with everyone.
As of 2021, Code for IBM i has been available for free on the Visual Studio Code Marketplace. It is also open source and relies heavily on user feedback and input (as well as the occasional PR.) Code for IBM i has a ton of functionality… too much for a single article. This post will run you through the setup of VS Code and Code for IBM i.
Installation
Visual Studio Code is available for most operating systems, including Windows and Mac. The very first thing is to download it from the VS Code website. Following that, you can install the extension from the Marketplace.
- Open the extensions view
- Search ‘ibmi’ and find Code for IBM i
- Hit install
Connecting to your IBM i
Now it’s time to connect to your IBM i server. Note that your IBM i will need its SSH daemon started. Usually a simple STRTCPSVR *SSHD
will get that started for you, but you can check out Getting Started with SSH on IBM i if you need more assistance.
After Code for IBM i is installed, you will see a new icon appear on the left. That is the Code for IBM i extension! You can click that, select ‘Connect to an IBM i’, fill out the information, and then hit connect. Code for IBM i will store that connection info for later so you don’t have to type all that in again.
You’ll see a nice info message appear when you are connected successfully.
Editing members
You can find members by using the Object Browser. Start by creating a new filter, which will show a new window.
You can provide a filter name, library, types, source file filters and more. You can see in the image, I am specifying a library and using ‘*srcpf’ as the type, which will then only show source files.
Clicking save and then opening the filter will show the source files in the chosen library and expanding them will show the members inside. You can click on a source member to open it to edit/view.
Compiling code
Of course, the second most important thing other than editing is compiling your source code. In this case, we have an SQLRPGLE program called DEPTS_WEB
. Code for IBM i adds a new shortcut to compile the source code you’re currently working with. To show what compile options you have, you can use the Control + E
shortcut (or Command + E
on Mac). This will show a dropdown with the available Actions (another topic worth its own blog post). Each Action has a different command that it will run.
In our case, we want to run CRTSQLRPGI
to compile our program and there is a default action for that.
After the compile runs, Code for IBM i will display the errors from the compile in line with the source code (as you would expect). It looks like, in this case, the pre-compiler couldn’t find a file definition. That usually indicates that there is a library list issue / the library with that table is missing from the library list.
Editing the library list
The connection to Code for IBM i has its own library list. That means any time a command is sent to the server, it uses the library list from the settings rather than the library list from the user. It’s very easy to change this library list. In the Code for IBM i extension there is a User Library List view. In that view you can:
- Change your current library
- Edit your user library list for any future commands
- Re-order your user library list
For our DEPTS_WEB
program to compile, we need to add the missing library with the DEPARTMENT
table. That just so happens to be in the SAMPLE
library/schema. You can click the add button in the User Library List view to add a library.
Now that SAMPLE
has been added, the next time we try to compile our program there should be no issues. Code for IBM i will tell you that the command ran successfully with an informational message.
Closing
These are just the very basics of Code for IBM i. There is so much to it. For example, some of the other functionality in Code for IBM i includes:
- Editing and compiling sources from the IFS (RPG, PHP, Python, JavaScript, etc.)
- Searching through the contents of source files and IFS directories
- Browsing and maintaining objects in libraries
- Running SQL statements and viewing results visually
- Content assist for free-format RPGLE and fixed-format RPGLE
There are also extensions to Code for IBM i which add:
- Source date support
- Integrated unit testing for RPGLE
- Code Coverage for IBM i
Check out the:
For additional information on Code for i, see Visual Studio Code for IBM i: A Resource Guide.
For training on this or any other IBM i development technology—including APIs or open source on IBM i—contact us.
Hello, I am new to the world of IBM i and still a beginner. I see that this community is amazing and very supportive. May I ask how to integrate my VSCode with Remote-SSH and Mocha TN5250? I have already set up VSCode correctly, and I am able to create, edit, compile, and call programs properly, but when the output is displayed, it only shows that the operation was successful, and no display output appears.
Hi, I am able to access source files in the libraries on *SYSBAS but having some issues on adding libraries/source files located on the iASP. I have added the ASP name on the “Source ASP” settings entry, but it still not working. Any help is appreciated. Thanks.
How can I compile ILE C++ program using this extension. I read the doc and it says hit Ctrl+E. I did it and nothing happened. Can someone please help me?
Thanks
Anuradha
IBM native code editor limits to 80 characters per line. But in the VS code, you don’t have that. How this extension handles it?
Thanks
The number of characters per line is determined by the record length of the source file, whether it is 80 or another length. Prompt on CRTSRCPF to define a different length. Then, VS Code will warn if you edit longer than the record length, and truncate if you save longer than the record length.
Thanks Alan. Its a great tool
The record length for my source file creation is set to 92 but when I run my script it looks the line is getting truncated at 80 chars.. how do I fix this?
RUNSQLSTM SRCFILE(JKUMAR/QSQLSRC) SRCMBR(xxxxxxx) COMMIT(*NONE) NAMING(*SQL)
IBM i reserves the first 12 bytes of a source physical file for the line number of source statement and the date that it was changed. Therefore, for a record length of 92, there are only 80 characters available for the source line itself.
Therefore, you would need to create your source file with a longer record length. I recommend at least 112, since that would also be compatible for newer RPG source members with ILE functionality.
After creating the object filter, I am not able to see the members. The filter tab is not expanding. I noticed that I dont have authority for command strtcpsvr. I am not sure if that is the reason behind this ? If anyone is aware of this issue, please help me. I am trying all possible ways to bring the code from green screen to VS code. Any help is appreciated.
We spoke offline and determined that the issue was most likely related to how SSHD was started. Covered in this issue: https://github.com/halcyon-tech/vscode-ibmi/issues/1222
Attempting to open source code in VS Code, nothing happens. Click, double-click, the code does not open in the editor.
Thoughts?
Thanks,
Matt
Hi, Matt, looks like you posted an issue at https://github.com/halcyon-tech/vscode-ibmi/issues/532 and Liam made a suggestion there.
When try to -> connect to an IBM i
it gives me below error. can anyone give me an answer for this
”Cannot activate the ‘Code for IBM i’ extension because it depends on an unknown ‘barrettotte.ibmi-languages’ extension.”
Gayan, I see that Liam replied to your question in a Github issue you created: https://github.com/halcyon-tech/vscode-ibmi/issues/519
Liam/Alan this is great! I’ve been watching Liam’s YouTube video on using VSC + Github and it is amazing.
Alan, I met you when I was working at American First Finance, you were working with Jeff C.
I’d love to continue learning from you and your updates to make use of newer technologies that interact with the iseries. To me using VSC + Github is way better, faster learning curve and easier than MDCMS and RDi.
Ramon S.
Thanks, Ramon!
i was using this and it was fine but now i dont have a member browser any more.
David, the member browser changed to the object browser due to user requests. We will update this blog post. See documentation here: https://halcyon-tech.github.io/vscode-ibmi/#/?id=browseedit-source-members And look at “Browse/Edit source members.” Let us know how it goes for you.
Each time I connect to our IBM i and open a src-pf (ccsid=37) I sooner or later see all my members as undefined.undefined. These members can not be opened. CPFA0A9: OJBECT NOT FOUND. I can’t get rid of this problem.
Hi, Frank, thanks for writing. Please post your question on the Code for i issues page: https://github.com/halcyon-tech/vscode-ibmi/issues
Hi –
I don’t know what happened to my last post, but I asked if CCSID 64K would be supported. Nearly all of out many source files are CCSID 65535.
Thanks!
Mike W.
Mike, CCSID 65535 means you have to manually say what kind of encoding to use. You could specify a CCSID in the Code for i plugin settings. Could you try that? Maybe 37, unless you need to use another one?
Alan –
When I try to open a source member, I get:
CPD0085: Range of parameter DBFCCSID does not include 65535. CPF0006: Errors occurred in command.
Alan –
I just tried to open a CCSID 37 source file and I got the same error – I don’t see a setting for CCSID – could you let me know where that is?
Thanks!
Hi, Michael, the settings link is at the bottom of the editor. (Settings: hostname)
Hi Liam –
Our source files are all CCSID 64K – I think this is due to I18N requirements. Can Code for IBM i. be made to work CCSID 64K?
Thanks!
Hi, Michael, I checked with Liam on this. What’s the encoding of your source file content? e.g. UTF8, 37, 273? Or a mix?
Hi Alan –
They are all CCSID 64K – 65535 and there are MANY – changing them is not possible – and we have a couple at CCSID 37
And nice to talk to you again – you and I talked several years ago about PHP – I was working for Mayors Jewelers.
Hi, Michael, look at configuring it here:
Additional settings
Source file CCSID
The CCSID of source files on your system. You should only change this setting from *FILE if you have a source file that is 65535 – otherwise use *FILE. Note that this config is used to fetch all members.
Been looking for something like this for quite some time! Will be watching this repo closely, cheers!
Love it. Best thing since sliced bread.
Nice! We’ve been exploring possibly going the GitHub route with all of our RPGLE, etc. code and were planning on going the RDi route along with EGit. Any thoughts on how approach like that would work in relation to this? Thanks.
Hey Richard.
There is also another extension that adds a Git client within VS Code to work with sources on the remote server: https://marketplace.visualstudio.com/items?itemName=HalcyonTechLtd.git-client-ibmi
This could likely help with some of that progress. It’s also another good topic that should get another post I think.