Category Archives: Lansa

The Social Enterprise

In the office, the word social will often lead to thoughts of the bubbling water cooler, the well-used coffee maker, and employees being unproductive. Step outside the office and the word social is a beautifully fresh way to describe connecting and communicating.

When you as a person are online, how social are you? Do you keep current on email correspondence? Do you interact with others on Twitter, LinkedIn, and Facebook?

When you as an organization are online, how social are you? Do you keep current on email correspondence? Do you interact with others on Twitter, LinkedIn, and Facebook?

In reference to the online presence of their employer, many people respond saying, “You are kidding, right? We barely have a web site let alone a Twitter account.” That is a sad state of affairs because you will be discussed.

Interacting With Your Customers

The online conversation is constant and it is growing. If your organization is not being discussed, it will be soon.

Make sure you are in a position to give instant feedback and awe-inspiring customer service. Engage your customers and talk to them. Build apps that build your reputation. Make it easy and fun for your customers to interact with you.

They will keep coming back.

Empowered Employees

Managers enable and constrain their people in order for them to be as effective and productive as possible. Enabling services like Twitter and LinkedIn often seem like the opposite of being effective and productive.

Convincing a decision-maker to block access to these communication mechanisms is as easy as pointing out some awful communication. Admittedly, there is bad with the good. For better or for worse, though, the bad exists in the news, it exists in search results, in fact it exists in every corner of our online world.

So we filter.

Interacting With Your Peers

As an IT professional, there is a significant amount of information that comes across my Twitter feed and through the LinkedIn groups I subscribe to that affects both my clients and my career. I use the relevant information and leave the rest. More than consuming, though, I am also a writer, a mentor, a developer, and a community builder. The more you contribute, the more help you will receive so become a wise investor of your limited time.

Imagine asking a technical question and getting a couple dozen answers and options. Imagine interacting with your peers in other organizations or with peers using the same tools or with peers dealing with similar issues. As long as you are a good citizen and are contributing to the conversation, people will help.

You are now more productive and more connected.

The Social Enterprise

In order for your enterprise to stay relevant with your customers, it will need to interact; to be social. If you want loyal customers, give them a view into your organization. Engage them in conversation. Be brave and ask them what they hate about you. Let them vent, respond with compassion, then ask them what they love. Social can bring goodwill.

In order for employees to have access to their peers and to this timely and relevant information, they will need to interact; to be social. I’ll bet you end up surprised at how useful being social is to you.

I care deeply about the enterprise, the customer, and the employee as well as about software architecture and mobile enterprise development. Guess what? You can find me on Twitter!

The Art and Science of Software Development

Software development is a science while you learn the ins and outs of creating the building blocks. Once you start putting those building blocks together, it becomes an art.

Magic System Variables

If you have an iSeries application and want to debug it using the Visual LANSA debugger, you know that the client to iSeries connection is a life saver.  Visual LANSA will use your iSeries data while executing your code locally.

Aside #1: Executing your code locally works within Visual LANSA unless your database is under commitment control.  If it is, functions that update the database will crash.  I will write about that work-around another day.

Aside #2: Yes, I know that Visual LANSA calls it a “System i Server” and not an iSeries.  I refuse to type a lowercase letter by itself as part of a proper noun.  iPhone and iOS are hard enough.

What were we talking about?  Oh yeah.  Executing code using the client to iSeries connection.  Did you know that when you use that connection some system variables pull from the iSeries without you writing a line of code?  I didn’t realize it until we were testing Visual LANSA debug and one of the *AUTONUM system variables returned the correct next number from the iSeries.  Magic System Variables?  That led down a rabbit hole to discover which system variables were magic.  Spoiler: very few.

It took a week with LANSA Support to determine that *AUTONUM, *AUTOALP, and *DTA are the only system variables that pull from the iSeries.  It is also important to note that the magic only happened when using the RDMLX version of the connection.  The RDML version of the client to iSeries connection determined the value of every system variable from the local Windows box.

The partitions were not RDMLX-enabled but the RDMLX connection worked just fine.

I walked away from that experience determined to not make any assumptions as we continue our move to  the Visual LANSA programming environment.  Testing everything is important to make sure we understand how each piece of the puzzle works.

The attached image shows a function (on the left) executing within Visual LANSA using a “magic” system which is derived on the iSeries.  This image is part of a larger diagram showing how Visual LANSA interacts with LANSA on the iSeries.

Magic System Variables

Magic System Variables

Server System Variables

At times within a Visual LANSA application, we require information such as system date and time to come from an iSeries server instead of from the local Windows machine. There have been a number of questions recently from the LANSA community on how to make this happen.

Over the course of the last year, I spent a great deal of time thinking through this issue and testing alternatives.  Here are all of the pieces of the cross-machine calling architecture that I built for system variables.  There is a similar architecture for executing business logic on the server.

There is  overhead having a system variable invoking a deriver that calls a BIF that calls a function that returns the value.  This is required, however, due to a severe limitation on system variable derivation functions.  They are not allowed to call other functions. But they are allowed to invoke BIFs.

If you need clarification or have issues, feel free to contact me.

System Variable

The system variable is defined in the data dictionary.  All system variables that must run on the iSeries are prefixed by I# so *I#YYYYMMDD returns the iSeries value of *YYYYMMDD.  As shown below, there are two derivation functions: one for numeric and one for alpha.  Since this date is numeric, we use the numeric deriver.

System Variable Derivation Function

Both the numeric and alphanumeric derivation functions are shown below. Each function uses a user-defined BIF to perform the cross-machine function call.  We do this because functions defined as system variable derivers have severe limitations on what they can call.  BIF deriver functions do not have those limitations.

[codesyntax title=”Numeric System Variable Deriver”]

function options(*DIRECT *NOMESSAGES *HEAVYUSAGE *NUM_SYSTEM_VARIABLE)
define field(#@SVVALUE) reffld(#SYSVAR$NV)
use builtin(UD_I#SYSVARNUM) with_args(#SYSVAR$NM) to_get(#@SVVALUE #$RETCODE)
if cond(‘#$RETCODE *EQ OK’)
change field(#SYSVAR$NV) to(#@SVVALUE)
else
change field(#SYSVAR$NV) to(*NULL)
endif
return[/codesyntax]

[codesyntax title=”Alphanumeric System Variable Deriver”]

function options(*DIRECT *NOMESSAGES *HEAVYUSAGE *ALP_SYSTEM_VARIABLE)
define field(#@SVVALUE) reffld(#SYSVAR$AV)
use builtin(UD_I#SYSVARALP) with_args(#SYSVAR$NM) to_get(#@SVVALUE #$RETCODE)
if cond(‘#$RETCODE *EQ OK’)
change field(#SYSVAR$AV) to(#@SVVALUE)
else
change field(#SYSVAR$AV) to(*NULL)
endif
return[/codesyntax]

Director

This architecture uses BIFs and implements a Director/Worker model.  The BIF deriver function (the Director) determines whether it is running on the iSeries or not.  If it is, it executes the worker function via CALL.  If not, it executes the worker function via CALL_SERVER_FUNCTION.

You will need to change NBIFWRK to the name of your numeric worker function and ABIFWRK to the name of your alphanumeric worker function.  This version of call server function uses *SSERVER_SSN which assumes our app is running over a client to iSeries connection.  If your app is local Windows application, you can just as easily hard code the name of your server.
[codesyntax title=”Numeric Director”]
function options(*DIRECT *NOMESSAGES *HEAVYUSAGE *BUILTIN)

define field(#BIF_NAME) type(*CHAR) length(20) desc(‘iSeries Sys Var Derivation: Numeric’) default(UD_I#SYSVARNUM)
define field(#BIF_ARG01) type(*CHAR) length(20) desc(‘System variable name’)
define field(#BIF_RET01) type(*DEC) length(30) decimals(9) desc(‘Value of iSeries numeric system variable’)
define field(#BIF_RET02) type(*CHAR) length(2) desc(‘Return code’)
define field(#@SVNAME) type(*CHAR) length(20) desc(‘System variable name’)
define field(#@SVVALUE) type(*DEC) length(30) decimals(9) desc(‘Value of iSeries numeric system variable’)

change field(#@SVNAME) to(#BIF_ARG01)
change field(#BIF_RET02) to(OK)
change field(#@SVVALUE) to(*NULL)

if cond(‘#CPUTYPE *EQ AS400’)
execute subroutine(ONSERVER)
else
execute subroutine(ONCLIENT)
endif

change field(#BIF_RET01) to(#@SVVALUE)
return

subroutine name(ONSERVER)
exchange fields(#@SVNAME)
call process(*DIRECT) function(NBIFWRK) exit_used(ER1) menu_used(ER1) if_error(ER1)
change field(#BIF_RET02) to(#$RETCODE)
return
ER1: change field(#$RETCODE #BIF_RET02) to(ER)
endroutine

subroutine name(ONCLIENT)
exchange fields(#@SVNAME)
use builtin(CALL_SERVER_FUNCTION) with_args(*SSERVER_SSN NBIFWRK Y Y) to_get(#$CSFRTNCD)

if cond(‘(#$CSFRTNCD *NE OK) *OR (#$RETCODE *NE OK)’)
if cond(‘(#$RETCODE *NE OK)’)
change field(#BIF_RET02) to(#$RETCODE)
else
change field(#BIF_RET02) to(ER)
endif
endif
endroutine
[/codesyntax]

[codesyntax title=”Alphanumeric Director”]
function options(*DIRECT *NOMESSAGES *HEAVYUSAGE *BUILTIN)

define field(#BIF_NAME) type(*CHAR) length(20) desc(‘iSeries Sys Var Derivation: Alphanumeric’) default(UD_I#SYSVARALP)
define field(#BIF_ARG01) type(*CHAR) length(20) desc(‘System variable name’)
define field(#BIF_RET01) type(*CHAR) length(256) desc(‘Value of iSeries alpha system variable’)
define field(#BIF_RET02) type(*CHAR) length(2) desc(‘Return code’)
define field(#@SVNAME) type(*CHAR) length(20) desc(‘System variable name’)
define field(#@SVVALUE) type(*CHAR) length(256) desc(‘Value of iSeries alpha system variable’)

change field(#@SVNAME) to(#BIF_ARG01)
change field(#BIF_RET02) to(OK)
change field(#@SVVALUE) to(*NULL)

if cond(‘#CPUTYPE *EQ AS400’)
execute subroutine(ONSERVER)
else
execute subroutine(ONCLIENT)
endif
change field(#BIF_RET01) to(#@SVVALUE)
return

subroutine name(ONSERVER)
exchange fields(#@SVNAME)
call process(*DIRECT) function(ABIFW) exit_used(ER1) menu_used(ER1) if_error(ER1)
change field(#BIF_RET02) to(#$RETCODE)
return
ER1: change field(#$RETCODE #BIF_RET02) to(ER)
endroutine

subroutine name(ONCLIENT)
exchange fields(#@SVNAME)
use builtin(CALL_SERVER_FUNCTION) with_args(*SSERVER_SSN ABIFWRK Y Y) to_get(#$CSFRTNCD)

if cond(‘(#$CSFRTNCD *NE OK) *OR (#$RETCODE *NE OK)’)
if cond(‘(#$RETCODE *NE OK)’)
change field(#BIF_RET02) to(#$RETCODE)
else
change field(#BIF_RET02) to(ER)
endif
endif
endroutine
[/codesyntax]

Worker

The Worker function always executes on the iSeries but we still check to make sure.  Any field name starting with a dollar sign is defined in the data dictionary.  For instance #$PARENL is *CHAR 1 DEFAULT(‘(‘).
[codesyntax title=”Numeric Worker”]
* Passed Parms:
* #@SVNAME   *char 20  System variable name
* Returned Parms:
* #@SVVALUE  *dec 30,9 System variable return value
* #$RETCODE  *char 2
function options(*DIRECT *HEAVYUSAGE)
exchange fields(#$RETCODE) option(*ALWAYS)
define field(#@SVNAME) type(*CHAR) length(20) desc(‘System variable name’)
define field(#@SVVALUE) type(*DEC) length(30) decimals(9) desc(‘Value of iSeries numeric system variable’)

change field(#$RETCODE) to(OK)
change field(#@SVVALUE) to(*NULL)

if cond(‘#CPUTYPE *EQ AS400’)
execute subroutine(PROCESS)
else
execute subroutine(INVOKEERR)
endif

exchange fields(#@SVVALUE)
return

subroutine name(PROCESS)

* Which system variable are we processing?
case of_field(#@SVNAME)

when value_is(‘= ”*I#CPU_NUMBER”’)
change field(#@SVVALUE) to(*CPU_NUMBER)

when value_is(‘= ”*I#DATE”’)
change field(#@SVVALUE) to(*DATE)

when value_is(‘= ”*I#DATE8”’)
change field(#@SVVALUE) to(*DATE8)

when value_is(‘= ”*I#DATETIME”’)
change field(#@SVVALUE) to(*DATETIME)

when value_is(‘= ”*I#DAY”’)
change field(#@SVVALUE) to(*DAY)

when value_is(‘= ”*I#DDMMYY”’)
change field(#@SVVALUE) to(*DDMMYY)

when value_is(‘= ”*I#DDMMYYYY”’)
change field(#@SVVALUE) to(*DDMMYYYY)

when value_is(‘= ”*I#JULIAN”’)
change field(#@SVVALUE) to(*JULIAN)

when value_is(‘= ”*I#MMDDYY”’)
change field(#@SVVALUE) to(*MMDDYY)

when value_is(‘= ”*I#MMDDYYD”’)
change field(#@SVVALUE) to(*MMDDYYD)

when value_is(‘= ”*I#MMDDYYYY”’)
change field(#@SVVALUE) to(*MMDDYYYY)

when value_is(‘= ”*I#MMDDYYYYD”’)
change field(#@SVVALUE) to(*MMDDYYYYD)

when value_is(‘= ”*I#MONTH”’)
change field(#@SVVALUE) to(*MONTH)

when value_is(‘= ”*I#TIME”’)
change field(#@SVVALUE) to(*TIME)

when value_is(‘= ”*I#TIMEDATE”’)
change field(#@SVVALUE) to(*TIMEDATE)

when value_is(‘= ”*I#TIMEDATE8”’)
change field(#@SVVALUE) to(*TIMEDATE8)

when value_is(‘= ”*I#TOMORROW”’)
change field(#@SVVALUE) to(*TOMORROW)

when value_is(‘= ”*I#YEAR”’)
change field(#@SVVALUE) to(*YEAR)

when value_is(‘= ”*I#YESTERDAY”’)
change field(#@SVVALUE) to(*YESTERDAY)

when value_is(‘= ”*I#YYMMDD”’)
change field(#@SVVALUE) to(*YYMMDD)

when value_is(‘= ”*I#YYYY”’)
change field(#@SVVALUE) to(*YYYY)

when value_is(‘= ”*I#YYYYMMDD”’)
change field(#@SVVALUE) to(*YYYYMMDD)

when value_is(‘= ”*I#YYYYMMDDD”’)
change field(#@SVVALUE) to(*YYYYMMDDD)

endcase

return

ERR: change field(#$RETCODE) to(ER)
return

endroutine

subroutine name(INVOKEERR)

define field(#@TEXT) type(*CHAR) length(80)
change field(#@TEXT) to(”’must be invoked on the iSeries”’)
use builtin(BCONCAT) with_args(#FUNCDESC #$PARENL #FUNCTION #$PARENR #@TEXT) to_get(#@TEXT)
use builtin(MESSAGE_BOX_SHOW) with_args(*DFT *DFT *DFT *DFT #@TEXT)

change field(#$RETCODE) to(ER)

endroutine
[/codesyntax]

[codesyntax title=”Alphanumeric Worker”]
* Passed Parms:
* #@SVNAME *char 20 System variable name
* Returned Parms:
* #@SVVALUE *char 256 System variable return value
* #$RETCODE *char 2
function options(*DIRECT *HEAVYUSAGE)
exchange fields(#$RETCODE) option(*ALWAYS)
define field(#@SVNAME) type(*CHAR) length(20) desc(‘System variable name’)
define field(#@SVVALUE) type(*CHAR) length(256) desc(‘Value of iSeries alpha system variable’)

change field(#$RETCODE) to(OK)
change field(#@SVVALUE) to(*NULL)

if cond(‘#CPUTYPE *EQ AS400’)
execute subroutine(PROCESS)
else
execute subroutine(INVOKEERR)
endif

exchange fields(#@SVVALUE)
return

subroutine name(PROCESS)
use builtin(UPPERCASE) with_args(#@SVNAME) to_get(#@SVNAME)

* Which system variable are we processing?
case of_field(#@SVNAME)

when value_is(‘= ”*I#DATE8C”’)
change field(#@SVVALUE) to(*DATE8C)

when value_is(‘= ”*I#DATEC”’)
change field(#@SVVALUE) to(*DATEC)

when value_is(‘= ”*I#DATETIMEC”’)
change field(#@SVVALUE) to(*DATETIMEC)

when value_is(‘= ”*I#DAYC”’)
change field(#@SVVALUE) to(*DAYC)

when value_is(‘= ”*I#DDMMYYC”’)
change field(#@SVVALUE) to(*DDMMYYC)

when value_is(‘= ”*I#DDMMYYYYC”’)
change field(#@SVVALUE) to(*DDMMYYYYC)

* when value_is(‘= ”*I#ENVIRONMENT”’)
* change field(#@SVVALUE) to(*ENVIRONMENT)

when value_is(‘= ”*I#EXTENDEDDATETIME”’)
change field(#@SVVALUE) to(*EXTENDEDDATETIME)

when value_is(‘= ”*I#GROUP_AUTHORITY”’)
change field(#@SVVALUE) to(*GROUP_AUTHORITY)

when value_is(‘= ”*I#GROUP_OWNER”’)
change field(#@SVVALUE) to(*GROUP_OWNER)

when value_is(‘= ”*I#GROUP_PROFILE”’)
change field(#@SVVALUE) to(*GROUP_PROFILE)

when value_is(‘= ”*I#GUIDEVICE”’)
change field(#@SVVALUE) to(*GUIDEVICE)

when value_is(‘= ”*I#JOBMODE”’)
change field(#@SVVALUE) to(*JOBMODE)

when value_is(‘= ”*I#JOBNAME”’)
change field(#@SVVALUE) to(*JOBNAME)

when value_is(‘= ”*I#JOBNBR”’)
change field(#@SVVALUE) to(*JOBNBR)

when value_is(‘= ”*I#JULIANC”’)
change field(#@SVVALUE) to(*JULIANC)

when value_is(‘= ”*I#MMDDYYYYC”’)
change field(#@SVVALUE) to(*MMDDYYYYC)

when value_is(‘= ”*I#MONTHC”’)
change field(#@SVVALUE) to(*MONTHC)

when value_is(‘= ”*I#SHDN”’)
change field(#@SVVALUE) to(*SHDN)

when value_is(‘= ”*I#TIMEC”’)
change field(#@SVVALUE) to(*TIMEC)

when value_is(‘= ”*I#TIMEDATE8C”’)
change field(#@SVVALUE) to(*TIMEDATE8C)

when value_is(‘= ”*I#TIMEDATEC”’)
change field(#@SVVALUE) to(*TIMEDATEC)

when value_is(‘= ”*I#TIMESTAMP_DFT”’)
change field(#@SVVALUE) to(*TIMESTAMP_DFT)

when value_is(‘= ”*I#TIMESTAMP_HIVAL”’)
change field(#@SVVALUE) to(*TIMESTAMP_HIVAL)

when value_is(‘= ”*I#TIMESTAMP_LOVAL”’)
change field(#@SVVALUE) to(*TIMESTAMP_LOVAL)

when value_is(‘= ”*I#YEARC”’)
change field(#@SVVALUE) to(*YEARC)

when value_is(‘= ”*I#YYMMDDC”’)
change field(#@SVVALUE) to(*YYMMDDC)

when value_is(‘= ”*I#YYYYC”’)
change field(#@SVVALUE) to(*YYYYC)

when value_is(‘= ”*I#YYYYMMDDC”’)
change field(#@SVVALUE) to(*YYYYMMDDC)

endcase
return

ERR: change field(#$RETCODE) to(ER)
return
endroutine

subroutine name(INVOKEERR)
define field(#@TEXT) type(*CHAR) length(80)
change field(#@TEXT) to(”’must be invoked on the iSeries”’)
use builtin(BCONCAT) with_args(#FUNCDESC #$PARENL #FUNCTION #$PARENR #@TEXT) to_get(#@TEXT)
use builtin(MESSAGE_BOX_SHOW) with_args(*DFT *DFT *DFT *DFT #@TEXT)
change field(#$RETCODE) to(ER)
endroutine
[/codesyntax]

Hello Underflow

Underflow is the productivity tool for Visual LANSA developers.  It was born out of my deep desire to reduce friction and repetition when working with Visual LANSA.  Here are a couple of examples that I use many times every day.

  • Use a single keystroke to open Visual LANSA, to open LANSA Composer, to open a Lansa object in VL, to compile a function, to check in a function, or to reset the host monitor.
  • “vvll” expands into “Visual LANSA”.
  • LANSA, RDML, RDMLX, iSeries, IFS, HTML, and AutoHotkey are properly capitalized.

The Underflow page contains the download link and more examples.  The only requirement is that AutoHotkey (free) must be installed on your machine.

This is a tool created by me for me.  If you try it, I am honored. If you use it, I am overjoyed.  If you tell me, I am grateful.

2012 LANSA User Conference Survey

Sharpen those #2 pencils and fill out the 2012 LANSA User Conference Survey!

Update: I am learning as much about Business Objects as there is information to consume. Right now, that is very little. Business Objects are poised to take LANSA development to the next level.  It is exciting (to say the LEAST) to see the description for the Application Architecture track tell us that Business Objects and the ability to use Model, View, Controller will be available in LANSA v13.

Spaghetti Code Done Properly

If you don’t use GOTO while programming in Visual LANSA, you should be.

No, it’s not a command. It is a tab and you can get to it quickly with Control-G.  It shows you all of the current warnings and errors in your object.  It slices and dices your code in ways you care about.  Find the specific routine or the specific I/O command or display statement or definition or built-in function that you are looking for.  It’s your very own tool for data mining your code.

Jump Back

In Visual LANSA, you can jump around your code very quickly.  Right-click on a field defined in the code or a subroutine name and you can immediately go to the definition.

Have you ever wanted to jump back? Use Control-Z (undo) to return to where you were. The undo button in the toolbar will not be lit but it the key combination will work.

RDMLX Does Not Require Multilingual

Huh, what do you know.  I just assumed that RDMLX-enabling a partition would require the partition to be multilingual.  I was wrong.  It doesn’t.

This is a big deal because once the partitions are made multilingual, all file IOMs and all functions must be recompiled in order to bake in the multilingual goodness.  There is much hand-wringing when there are a couple thousand files and many thousands of functions to be compiled.  Not only will it take a fair amount of time but there is a high level of perceived risk when many of the objects were last compiled in 1998.  I know, right?  How many of those does your system have?

The risk doesn’t go away but the two issues are now decoupled.  Throwing the RDMLX switch in a partition can happen prior to making it multilingual.

Be the Plumber: Resolving Host Monitor Issues

The Problem

Your host monitor stopped working.  You’ve turned it off and on and the propagation tab only shows a “trying to connect” message.  Now what?

First of all, the Host Monitor is a bi-directional connection between Visual LANSA and LANSA on the iSeries.  I like to think of the host monitor as a communications pipe with a fitting on each end.  One fitting connects the pipe to your PC while the other connects it to the iSeries.

When you ask Visual LANSA to end the host monitor, it attempts to disconnect the pipe on both ends.  A failure here is almost always on the iSeries side.  When you turn on your host monitor, a new pipe is connected to the existing fittings.  If there is already a pipe connected to either end, starting the host monitor will fail.

Resolution Part 1 – End It For Real

Sometimes when you close Visual LANSA or turn off the host monitor, the pipe is not fully disconnected on the iSeries side.  To determine if this is your issue, log into the iSeries as yourself and execute the command below.  If you see one or more active jobs that start with MON_, the host monitor did not end even though you asked it to.  End them with option(*immed).

[code]WRKUSRJOB * *ACTIVE[/code]

Resolution Part 2 – Clearing the iSeries Clog

The host monitor holds data about the state of your connection in two iSeries libraries. When there are issues ending the host monitor, the pipe usually gets clogged here.  Setting aside the analogy for a moment, the problem is usually with a data area called XQUEUE.  An object lock that won’t release will be attached to it.

The two host monitor libraries need to be cleared so that the host monitor brain can be reset.  To figure out the library names, truncate your user profile at six characters.  (TJENSEN becomes TJENSE).  Perform the following commands using this truncated text to locate the correct libraries.  If you have multiple copies of Visual LANSA, you will have multiple versions of each of these libraries.  If so, make sure all copies of VL are closed (best option) or that all host monitors are ended (second-best option) and clear ’em all!

[code]WRKLIB IHQTJEN*

WRKLIB OHQTJEN*[/code]

You are about to clear these libraries. Prior to this, make sure you’ve ended all active host monitor jobs that are yours (from issue #1 above).  The clear commands will look similar to mine below.  Please note: if one of the clear commands fail the first time, Congratulations!, you found the problem. Perform the clear again and it should succeed the second time.

[code]CLRLIB IHQTJEN001
CLRLIB OHQTJEN001[/code]

And The Winner Is…

Launch Visual LANSA and try to start the host monitor.  It should start without issue.

If the host monitor fails to start, the pipe fitting on the Windows side may have crashed hard when it was ended. I’ll bet you can guess this one.  It is the typical Windows answer of reboot your PC and try it again.