New Log Viewer – Part III

Part I – Overview of the Improved UI
Part II – How to Find Your Way
Part IV – ClickOnce Installation Log
Part V – M3 Transaction Time Measurements

Two of the new features in the improved UI are the side-panels with categories to the left and facts to the right.

The Basic Facts

Every time the selected session changes, relevant support information are extracted and presented in the Fact area, e g Smart Office version, launch method, Windows related version, feature details, languages timeouts etc. The basic facts often needed in a support case.

ISOLogViewerFactsEnv

To compare fact value changes between sessions in the log file, you select the full log file in the session selector.  This will list duplicate facts one for each session.

A click on a listed fact will scroll the originating log line into view and select it. The context menu on a selected fact reveals more options that may help you further.

ISOLogViewerFactsMenu
Copy Value

Copy puts the presented value into the Windows Clipboard.

Copy Matches to Clipboard

Copy the log entries from where the fact was extracted into the Windows Clipboard.

View External

Show the log entries from where the fact was extracted in the Windows associated text viewer.

Browse

Browse is enabled if the fact value is an URL and the user is allowed to launch external applications in Windows according to the Smart Office settings. It will launch the URL in the Windows associated browser application.

Open file location

Open file location is enabled if the fact value is an existing file path and the user is allowed to launch external applications in Windows according to the Smart Office settings. It will launch the Windows File Explorer and show the folder.

 

I’ve got a recurring set of log entries I often look for

You can create a category in the category area that will collect the log entries that match any of the aspects defined. If you’re a feature or SDK application developer you can create a category that matches the origin i e the namespace of your assembly. Some entries may appear more than once in the result if many aspects matches.

ISOLogViewerCreateCategoryfrom

Select one or many log entries that is representative for the category you wish to create and click on Create Category from in the context menu, it will open the category definition dialog with the values from the selection added as options for the category definition.

Select a category Section from the list of existing ones or type a new section name. Name the category in the Header field. Minimize the number of matching values to get fewer more relevant matches. All log entries that contains ANY of the aspects defined will be part of the category.

ISOLogViewerCategoryEditor

Press Save button and you will have your category in the left side-panel for quick content selection.

ISOLogViewerMyCategory.PNG

Launch the Log Viewer targeting a specific feature or SDK application

You can create a Shortcut with a parameterized link on the Canvas to launch the Log Viewer on specific content, for debugging scenarios or targeting a specific feature or SDK application. The base launch link for the Log Viewer is:

internal://log

Add a free-text search parameter to start with all entries matching the search criteria, in this example all entries related to user idle detection.

internal://log?search=idledetect

This can be extended with a session parameter to specify the initial session to select in the log. It can be a value [1..n], last will select the current session, prev will select the previous session and full selects the whole log file. Previous is useful if you examine something that happens during shutdown and you examine the log after a restart.

internal://log?search=idledetect&session=2
internal://log?search=idledetect&session=last
internal://log?search=idledetect&session=prev

and you can of course specify a category as initial selection e g your custom category

internal://log?cat=service unavailable
internal://log?cat=service%20unavailable
internal://log?cat=service unavailable&session=full

Finally you have a sessiontime parameter that may be useful in some special cases. If the sessiontime parameter is present, the session parameter is ignored.

internal://log?search=idledetect&sessiontime=13:10

 

 

 

Moving Smart Office Links into H5

In case you’re thinking about moving from the Smart Office rich client to the browser based H5 client there’s a small tool that will help you bring along H5 applicable Smart Office Links v10.1.0 and onward. The tool is a local Smart Office application to be installed and run by a Smart Office administrator. It will create a zip file intended to be imported with the H5 administration tool.

You can find the tool named INFOR.ISOH5LETool.lawsonapp in the Smart Office delivery package under the Additional Files folder.

Preparing to do the export of the Smart Office links

H5 links are only global unlike Smart Office that also support private user links, so ensure that all users share the links to be part of the export before performing the operation. The H5 links also requires a specific source to be defined e g MMS001/MMS001BC. The links with ./. as source will be excluded from export.

Install the tool Smart Office

Launch Smart Office and select My Local Applications menu item on the Smart Office Canvas. Press the Install button, navigate and select the INFOR.ISOH5LETool.lawsonapp in the file browser dialog. Restart the Smart Office client.
Note that it’s also here you uninstall the tool when the export is finished.

ISOInstallLocalApp

Perform the export of the H5 compatible links

Launch Smart Office and launch any M3 transaction e g MMS001 to ensure everything is running and to get the MUA version number. Launch the tool by pressing CTRL+R on the keyboard and type in the focused Start field:

isoh5://linkexport

ISOLinkExport2H5

The tool will appear and show the links compatible with H5. Now you select the links to convert and export. Finish by pressing the Export button and select a location to store the created zip file. Close the tool and Smart Office.

Import the zip file with links into H5

Launch the H5 client and select Administration Tools and Import of Document Links. Press Upload and select the zip file containing the links. Press Import and then restart the server. Done!

H5ImportLinks

New Log Viewer – Part II

Part I – Overview of the Improved UI
Part III – Getting the Facts and Categories
Part IV – ClickOnce Installation Log
Part V – M3 Transaction Time Measurements

How can I become more efficient working with the new Log Viewer?

Assume that you encounter an issue running Smart Office or have a log file sent to you. To view the content of the log file you can open it in any text reader and perform a free-text search, but even if you know what to look for it’s time consuming.

Open the improved Smart Office log viewer instead and it will show the log entries related to the current session of the running Smart Office. In the session selector you will see when you started this Smart Office session, number of issues found and the time for the latest log entry. The content in the viewer is only refreshed when you launch the viewer, press the Current button or import a previously saved log file.

ISOLogViewerStart

In the right side-panel, the Smart Office version and Windows related versions are extracted and presented among other interesting facts.

Start the investigation by expanding the left side-panel and under the General header, click and go through in order; Fatal, Errors, Exceptions and Warnings to make a quick examination and see if there are any relevant log entries in each category.

If you encounter a log entry of interest, select it, open the context menu and click the View Selection in Session Context. The full session will now be visible and you can see what has occurred before and after the selected log entry.

Highlight and mark lines in the log

To keep track of log entries you can mark lines with a color or do a strikeout to make them stand out when scrolling through the content. Select the lines to mark and use the context Mark menu to perform the action. To retrieve the marked lines click on the categories under Markers in the left side-panel. The markers will disappear when the log viewer is closed and restarted.

Errors and exception log entries can automatically be marked in the left margin with a colored line, if the Enable Color Markers option is set in the context menu.

ISOLogViewerMarkers

Yesterday I encountered an issue that’s no longer in the current log

The Smart Office log file is renewed every calendar day and the previous one is renamed with the date added as a suffix on the filename. The log files from the last week are stored beside the current log in the client data area.

Open a previous log file by pressing the Import button while holding down the SHIFT- or CTRL- key to add the necessary filter option and set the target directory to the client data area. In the dialog that appears you select the Old Log Files filter and the existing logs from the last week appears.

ISOLogViewerOpenOldLogFile

Where do I Find the S3 Excel Add-in log file?

The S3 Excel add-in has a separate log file that is also located in the client data area. Perform the same operation as when looking for older log files but look for files whose name starts with S3.ExcelAddin.log.

I need help to resolve the issue

There are a couple of ways for you to share the log content with support or another helpful person.

ISOLogViewerButtons

Copy Image

Takes a snapshot of the Log Viewer window and put it in the Clipboard. This is intended for documentation and communication, but not useful to send in a support request.

Copy Session

Copy the full log of the selected session into the Windows Clipboard.

View External

Open the log file in the Windows associated text viewer.

Mail Support Zip

Create a new mail in Microsoft Outlook with Smart Office support related files zipped in an attachment.

Mail Log

Create a new mail in Microsoft Outlook with the full log file as an attachment.

I’m the recipient of a log file

If you received a help request or a support ticket with a log file attached, you can view it in the Log Viewer to make a quick review of the content and get the basic facts extracted about versions and runtime environment. You can open the log from the Windows Clipboard or the filesystem. Press the Current button to reload the active Smart Office log file.

ISOLogViewerButtons2

Current

Reload and show the current Smart Office log file.

Paste

Show the log file found in the Windows Clipboard.

Import

Open a log file stored in the file system. Press SHIFT- or CTRL- when the button is pressed to set the client data area as initial directory.

 

Canvas Theme Emulator

Smart Office enables the user to adjust the overall appearance of its canvas and windows in terms of theme color, wallpaper and color saturation from a pre-defined set of options.
The boundaries for what the user is allowed to adjust is set by the Smart Office administrator in the system profile, application- and user- settings. The final appearance is the combined result of the settings and internal rules.

Once in a while  it happens that the appearance is not matching the expectation after an upgrade or settings change. It can be difficult to pin-point and determine what is causing the new appearance.

The Theme Emulator tool will assisst you to sort things out. It will hook into the theme service and regard it as a black box, apply your settings and visualize the result unaware of the internal rules.

The Theme Emulator is launched with the Smart Office link internal://themeulator or via the improved Log Viewer content-area context-menu under Tools.

themeulator

When the Theme Emulator tool is launched it will show the current applied Smart Office settings in the Preview Settings- and Preview- area. The current values in the system profile, application- and user- settings are listed under Theme Setting Sources.

Changing the Preview Settings is harmless and will only affect the look of the Preview area. Click on the ‘Reset’ button to return to the current settings. The padlock icon next to each user setting show if the setting can be changed by the user or has been locked by the administrator.

A click on a preview icon (document/looking-glass) beside the theme source header will apply the current settings for that source on the Preview.

The Settings… and Profile… button will launch the corresponding administration tool if the current user is a Smart Office administrator.

The Clipboard button captures a snapshot image of the tool window and puts it in the Windows Clipboard. It can be useful for documentation and communication purposes.

The User Theme Disabled checkbox is always read-only in the ‘Preview Settings’ area. It’s not intended to be changed, just show the current property value.

Elaborate with the preview values and compare with the setting sources and you will soon figure out the source and what setting to change to get the wanted appearance.

Smart Office User Id is not always the same as User Name – information to SDK developers

If you have implemented a feature or SDK application that retrieves the user id from the user context, you should ensure that you use:

 ApplicationServices.UserContext.UserId

and NOT the property

ApplicationServices.UserContext.UserName

The UserId and UserName property returned the same value in many system configurations until a few years ago when additional security configuration options were introduced. To be on the safe side and be future proof, the UserName property should be used for display purposes in the user interface and the UserId property used for REST calls and business functions.

New Log Viewer – Part I

Part II – How to Find Your Way
Part III – Getting the Facts and Categories
Part IV – ClickOnce Installation Log
Part V – M3 Transaction Time Measurements

Overview of the Improved UI

An improved user interface for Smart Office Log Viewer was introduced in 10.2.1.0.189 (HF18) to make it easier and more efficient to resolve issues and find relevant information. The benefits and features of the improved user interface will be covered in a series of blog posts.

The main new features are:

  • Smart Office log session selector
  • Extraction of relevant facts from the log
  • User customizable content categories
  • Improved sharing of log content

ISOLogViewerAreas

The improved user interface consists of:

  1. Session Selector where you choose whether to see the entire log, a specific session or a time span. By default the latest session is selected.
  2. Category selector where you choose the category related log entries.
  3. Content area where you see the log entries based on the current session- or category- selection.
  4. Extracted facts that is often relevant for support issues. The area can be expanded or collapsed.

At the bottom you have the quick access buttons to import- and share- the log file.

On the very first launch after installation the (2) Category- and (4) Facts- areas will be collapsed. You can expand/collapse the areas by dragging the window splitters or click the Verbose toggle button.

Where do I find the Log Viewer?

• Open the Smart Office About dialog and click on the link.
• Open the Administration Tools folder in the Navigator Widget and launch Log Viewer.
• Launch the Smart Office link internal://log using a Canvas Shortcut or using the Canvas Start field (CTRL+R).
• As a Standalone Windows Application found in LogViewer.zip under Additional Files in the Smart Office installation package.

What if I prefer the original user interface?

You can switch to the original user interface by clicking on the Classic button, create a Canvas Shortcut or Navigator Widget Favorites link with the URL internal://log/classic.

What’s in it for me as a SDK Developer?

You can create one or more categories specific for your feature and define a launch link that will open the Log Viewer with your category selected. How to do this will be covered in an upcoming blog post.

Ming.le Homepages

It’s been quite some time since I published on this Blog. I’ll see if I can get the Smart Office Developers to write some more posts. Don’t forget to check out the Infor Technology blog where you can find Lawson Smart Office related posts.

There are a few new features in Smart Office related to the Ming.le feature and the Ming.le integration.

I currently work on Ming.le Homepages so there is not that much time to write posts but we all help out trying to answer your comments and questions. If you like to know more about Homepages, please read Infor Homepages: Your hub across Infor OS.

Homepages-Slide-Master-1024x621

 

Smart Office Improved support for ADFS 3.0 – information to SDK developers

If you have implemented a feature or SDK application that requests the credentials from the user context when calling services the include-domain-with-user parameter must be true in order to function properly with an environment using ADFS 3.0.

If the user logs in to Smart Office as user@domain or domain\user setting the parameter true ensures that the domain is included in the user name.

If you’re using the MangoHttpClient class for doing REST calls it’s already handled for you so no changes are necessary. The ADFS 3.0 support was introduced in Smart Office 10.2.10.88 (HF12) released in March 4th 2016.

It may be necessary for a ISO feature/application to change one argument when requesting credentials from the Smart Office user context in order to support ADFS 3.0. The parameter includeDomainWithUser should be set to true. This will return the user name including the domain, if the user logged on to Smart Office with a domain, otherwise it will only return the user name.

Existing code that looks like this:

ApplicationServices.UserContext.RequestCredentials(out username, out password);
ApplicationServices.UserContext.RequestCredentials(out username, out password, false);

Should be changed to set includeDomainWithUser argument to true:
ApplicationServices.UserContext.RequestCredentials(out username, out password, true);

There is also a new LDAP Setting described in the Administration Guide (p. 267) ”Add domain after authentication” that you should be aware of.

This setting is used in scenarios where some applications such as IDM requires a domain but the Smart Office server does not require one. When the setting is enabled, a user may log-on without a domain to Smart Office and still be authenticated with domain for the application.

Settings values:
No = Not enabled
Yes (user@domain) = Enabled with the username format “User Principal Name”.
Yes (domain\user) = Enabled with the user nameformat “Down-Level Logon Name”.

M3 Search Examples

M3 has created a Knowledge base article on the search syntax for Search in M3 13.3 and 13.4. M3 Infor Enterprise Search is a great tool which can greatly improve your workflow when used in the way it has been designed to work.

Depending on how you are using Enterprise Search (IES) today, you might have encountered a few instances where it has not retrieved the desired result.

This can in many cases be addressed by altering your search query to be better suited for the Lucene Search Engine which IES is built upon.

In this blog post I’ll do a quick overview of some of the queries from the examples in the Knowledge based article as a introduction but I recommend you to read the full article as it contains even more examples. I just wanted to take some of the material and the references so that it is easier to find if you search for tips on this blog, which I know a lot of our readers do.

Please note that if you are new to Enterprise Search there are  available courses and How-to videos at the Sales Portal and the Infor Campus.

Simple search

This is the simplest form of search with entry of full words. Note that search is always case insensitive. Searching for cheese would give you the following result:
cheese

You can enter multiple words in the search field but those values have to be displayed in the list. The default behaviour when using multiple words in search is applying AND for all words. This means that they have to exist in one or more columns. Using OR means one of them must exist in one of the columns which will result on more hits. Use parentheses to combine blocks of AND and OR. Use wild card to enter the first part of a word. Or a ‘?’ to replace a single character. Note that you can’t replace blank space.

cheese2

Examples:
cheese OR juice
cheese OR (juice 011215) - Combine with ()
chee* - starts with chee
chee*jui?e - ? replace a single character

To limit the search to a specific column, right click on the column and select ‘Add to search’. It will add a column prefix to the search.

addtosearch


ITDS:Cheese

Dates and numeric values are entered in the same date format as the user has in MNS150, the user master. Dates can be entered with 6 or 8 digits.

Advanced search

Intervals
Intervals are done using the following two formats [ x TO y] or { x TO y } or any combination of them. Usage of [] means that the range should be included in the search where as {} means that the range should be excluded.

Examples

STQT:[100 TO 480]
STQT:[* to 0} - find all items with negative quantity

Not conditions and use of ?
Not conditions are a bit special since they must start with another query and then the NOT condition can be introduced. The tip if there is no such natural condition is to start with the company number and then add the NOT search. The company number will search the entire table. An example query in MMS002 of all items that have not been part of a stock take in this year will look like this:

CONO:790 NOT INDT:YEAR(0)

Note the YEAR(0) function that will translate to an interval covering the to and from dates of the current year. There are a number of functions that can be used to create useful Macros that can be saved to favorites, canvas, as menu option or in toolbox area.

Creative usage of the ? allows for a simple search for all records with supplier number. This since ? only finds records with a character in the position. Blanks are omitted. Query SUNO:?* gives you all records with a supplier number in this case. For numeric fields you use the NOT statement like CONO:780 NOT STQT :0.
SUNO:?*
CONO:780 NOT STQT :0

Fuzzy search
The ~ is used for a fuzzy search that is useful for finding spelling errors and similar texts. An example would be a query like ‘min*~’ which would produce hits even if there is no exact match on anything starting with min, for example mild would also be a hit in this case. Not that it cannot be used for numeric values.

The full article covers more examples!

M3 IES reserved word and functions

SortBy:x,y,!z Sorts search result in x, y z hierarchy. The ! Prior field name perform a descending sorting (NCR 6670 and 6671)
SearchFields:x;y Limits search to listed fields x, y etc. Increases performance and can eliminate false hits
YEAR(x) Replaces with date range of year relative to current year x=-1 equals last year etc
MONTH(x) Same as YEAR but for month
WEEK(x) Same as YEAR but for week
DATE(x) Similar to YEAR but replaces with specific date
<xxxx> List & list header based replacements to query string. (NCR 6813)

All below are described in NCR 6220
Using the value within you can use the following replacement variables.

<USID>   Replaced by logged on user id
<CONO> Replaced by logged on company number
<DIVI>     Replaced by logged on Division. Note – same as <CurrentDivison>
<FACI>    Replaced by default facility from user master (MNS150)
<CUNO> Replaced by customer no from user master
<LNCD>  Replaced by language code from user master
<TIZO>    Replaced by time zone from user master
<WHLO> Replaced by warehouse from user master
<DEPT>   Replaced by department from user master
<MNVR> Replaced by menu version from user master
<DFMN> Replaced by menu name from user master
<CurrentLanguage> Replaced by currently used language in M3 (in case of switched language during logged in session)
<CurrentDivision> Current division. Note that this is the same as DIVI.

Reserved word for key search only

  • <QRY> Replaced by entered query in the search string
  • MAXJOIN:x Used to change number of records used in the key search join (default set in IES local management pages) (NCR 4351)
  • NOOPT Used when multiple key searches done to same table (like find items with attribute x, y but NOT z or items existing in warehouse a, b and c (NCR 4349)

M3 IES Stop words

Stop words in IES has the meaning of words that are not indexed and are automatically removed from the search query. Examples of stop words are “and”, “or” “etc” and other similar types. IES, by default has a set of English based stop words which apart from above examples also includes “a”, “by”, “is”, “as” plus about 20 other words. Unfortunately in many cases when searching ERP type of data you might want to search for “factor a”, the Swedish word for ice “is” etc.

The work around for this is to add a new stop word in the IES admin pages. Make sure it is something never search for like “lksdhja7789”. By doing that the default stop words are not used anymore. Please note that affected tables like MITMAS, MITLAD, OCUSMA, CIDMAS etc need to be re-indexed after this has been done.

Read more examples in the KB.

Background server calls for Lawson Applications

Infor Smart Office for Lawson applications provides many custom features which are made possible by meta-data retrieved from the Lawson application server in the background. But these features come at a cost of increased network traffic and additional server utilization which could impact performance.

In a post on the Infor Technology Blog, Vince McGowan explains what meta data services are used for and how to disable them. He identifies the background activity and describe the purpose of each so clients can decide whether or not the feature is useful enough to incur the cost. If not, there are settings provided to disable them.

Head over to the Infor Technology blog to read the full article.
See more at: http://blogs.infor.com/technology/2017/01/background-server-calls-made-by-infor-smart-office-for-lawson-applications/

 

Downloading a CCSS fix with Life Cycle Manager

In this blog post I’ll show you some screenshots how you can download a feature fix for Smart Office. In this case it is the fix for Process Server. I’ll show you the steps to download the fix and get the contained ZIP to be able to extract all the content that is in the zip. The zip might contain a feature to be installed or the full zip that contains extra tools for Smart Office.

Download the fix

  1. Login to LCM.
  2. Click Window menu > Preferences sub-menu.
  3. Specify the correct CCSS server url, https://ccss1.infor.com.
  4. Click Apply then OK button.lcm_1
  5. Click Actions menu > Retrieve Fixes sub-menu.
  6. Select the correct CCSS Channel ex. InforSmartOffice_10.2.0 (Infor Smart Office 10.2.1).
  7. Log on to CCSS Server using the same userid and password that you use for Infor Extreme Support.
    lcm_2
  8. Select the fix from the list of Available Fixes.
  9. Click Retrieve button.
  10. Click Yes button in Verifying package window.lcm_3
  11. Click OK on the notification that Upload is successful.
  12. Open IE, go to CCSS Fixes Available for Download page of the LCM server ex. http://<LCMserver&gt;:<port>/ccss. For us the port is 4062.
  13. Double-click on the fix.
  14. Save the zip file.lcm_4
  15. Go to the location where the zip file is saved and extract the zip file.
  16. The extracted file contains the lawsonapp.

Upload the fix

  1. Go back to LCM.
  2. Click Admin menu > Upload Products sub-menu.
  3. Click Upload button.
  4. Locate the downloaded lawsonapp and proceed with upload.lcm_5
  5. Click OK on the notification that Operation and Registration is successful.

The new version of the application is available and you can uninstall the previous version and install this new one. In most cases you need to do an upgrade (as described below) but after HF18 and with ProcessServerAndLandmarkAdapters you would want to make a new install at this time. But for HF 19 and later you can go ahead and upgrade.

How to upgrade using the fix

  1. Right-click on the previously installed feature, for example ProcessServerAndLandmarkAdapters,
  2. Select Upgrade.lcm_6
  3. Select the correct version.
  4. Click Next button.lcm_7
  5. Click Finish button.

Special thanks to Noreen for providing all these steps!

Important Process Server installation changes in 10.2.1 HF18

If you have Process Server installed running on Landmark we would recommend that you skip HF18 (HF= Hot-Fix), HF19 and wait for HF20 that will be delivered at the end of January 2017 or apply Post Patch for Infor Smart Office 10.2.1 Core HF19 – IPA Update Only available as a CCSS fix (ef_ISO1021_HF19_LPA.zip)

Another important message is that installations done before Smart Office 10.2.1 HF18 must uninstall existing earlier version of Process Server component before applying HF 18 or later. Read more in the Installation Guide section – Configuring Infor Process Automation or ProcessFlow for use with Infor Smart Office.

That means that if you have Process Server feature installed in a pre-HF18 version of Smart Office, version 10.2.1.0.169 or previous versions, then you must uninstall the Process Server application in LCM and install it again. The reason is that the features included have changed. As of HF18 you should only have one Process Server related feature called Infor.PF in the Manage Installation Point tool.

Previously we had Infor.PF10, Infor.LMRK10, Infor.LMRKA10, se below:
installationpointmanager

Make sure you uninstall en re-install and that you don’t have these old features in the Installation Point Manager. There is also an Manage Application view within the Grid Management pages for MangoServer administration where you can see which applications, features and mashups are installed by accessing the Grid Management UI on the server where the server component for Smart Office (MangoServer) is installed.

But as of HF18 there should only be one new Infor.PF feature and the previous should not be used. There is no need to reconfigure anything but you must uninstall the previous version and install the new version. You get the new .lawsonapp from the hotfix that is downloaded in LCM. In my next post I’ll show you how.

Inforum in New York

We built our headquarters in the center of New York’s Silicon Alley —to let the city shape us, just like we help shape the companies that do business not just here but everywhere. Come see for yourself at Inforum 2016 on July 10-13 in New York City. http://www.inforum2016.com/

Inforum

Wow… New York. Sweden and Stockholm can’t compare. I know a few colleagues that are traveling and I hope that you all can enjoy this great event. If you like me are unable to go to New York you can still follow online:

The Infor Blog

youtube

Smart Office SDK unable to run project

The last week I’ve got two questions from Smart Office Developers in the partner network desperately trying to run the Smart Office SDK but as soon as they log in to Smart Office they are presented with “Infor Smart Office has encountered a problem”, “We are sorry for the inconvenience. Please tell Infor about this problem and provide the log file and information of the steps leading up to it. Press the Support button to save the log file at a location of your choice.”.

restartdialog

What to do?

When you are having an issue always check the log file. when developing the log file is located in a location similar to this example from Windows 10:

C:\Users\username\AppData\Local\Infor\Mango Client

This generic “catch-all” is only shown when there is an unhandled exception on a background thread. When developing always make sure that you have try-catch on code that is executed on a background thread. If you are developing and get this error the issue is probably in your code. But not in this case.

The log

In this case the log file had the following log at the bottom:

2016-06-30 16:07:25,519 [20] FATAL Mango.UI.Client.MangoApplication.OnUnhandledExceptionCurrentDomain – Fatal shutdown caused by unhandled exception on background thread.
2016-06-30 16:07:25,520 [9] FATAL Mango.UI.Client.MangoApplication.OnUnhandledExceptionCurrentDomain – [MUI0040] Unhandled exception from AppDomain. IsTerminating=True.
System.IO.FileNotFoundException: Could not load file or assembly ‘System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’ or one of its dependencies. The system cannot find the file specified.
File name: ‘System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91’

Server stack trace:
at Mango.Core.Persistance.Statistics.GetRecentlyUsed(Int32 returnCount)
at Mango.UI.Services.ApplicationUsageService.RecentlyUsed(Int32 returnCount)
at Mango.UI.Services.HistoryDS.LoadRecent()
at Mango.UI.Services.HistoryDS.Execute()
at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Object[]& outArgs)
at System.Runtime.Remoting.Messaging.StackBuilderSink.AsyncProcessMessage(IMessage msg, IMessageSink replySink)

Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.EndInvokeHelper(Message reqMsg, Boolean bProxyCase)

The solution

SQL Server Compact Edition is a requirement for SDK development. Usually you don’t need to install it – it just works. But if you have any issues then please download Microsoft SQL Server Compact 3.5 Service Pack 2 for Windows Desktop from Microsoft and install it. On a 64-bit computer install both 32-bit and 64-bit versions.

I hope that this post will find it’s way to any SDK developer that encounter this issue.

Field validation using JScript in OIS100/A

In this post I’ll give an example of how you can validate a field in OIS100 using JScript. The scenario is as follows: All orders with order type “E50” has to be from faclity “FC5”. How can you validate input in OIS100/A? This was the question from one of our readers. The script is pretty straightforward as you have all the data that you need to check on the panel so I created a small example to illustrate the use of OnRequesting. Please note that you could make this script better by using script arguments.

The scripts illustrates the following:

  • Cancelling navigation to the next panel
  • How to set a field value
  • How to read a field value
  • How to show a message (in the status bar or dialog depending on setting)
  • How to log to the client log file
  • How do disconnect the event handler

If the order type and the facility does not match the required condition the facility is updated and a message is displayed.

OIS100A

Below is the script:

import System;
import System.Windows;
import System.Windows.Controls;
import MForms;
import Mango.UI.Services;
import Mango.Core.Util;

package MForms.JScript {
  class FieldValidation {
    var logger : log4net.ILog = Mango.Core.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
      var controller,
    debug,
    content;
    var checkOrderType = "E50"; // Should be a parameter
    var mandatoryFacility = "FC5" // Should be a parameter

      public function Init(element : Object, args : Object, controller : Object, debug : Object) {
      debug.WriteLine("Script Initializing.");
      this.controller = controller;
      this.debug = debug;
      this.content = controller.RenderEngine.Content;

      // Attach event handlers to be able to detach event handlers and list to page down requests.
      controller.add_Requesting(OnRequesting);
    }

    public function OnRequesting(sender : Object, e : CancelRequestEventArgs) {
      try {
        LogDebug("onrequesting " + e.CommandType + " " + e.CommandValue);
        if (e.CommandType == "KEY" && e.CommandValue == "ENTER") {
          // Do not disconnect events on page down.
          var orderType = GetValue("OAORTP");
          LogDebug("Order type: " + orderType);

          if (orderType != null && orderType == checkOrderType) {
            var facilityElement = ScriptUtil.FindChild(content, "OAFACI");
            if (facilityElement != null) {
              var value = MFormsUtil.GetControlValue(facilityElement);
              LogDebug("Facility " + value);
              if (value != mandatoryFacility) {
                LogDebug("Set facilty to " + mandatoryFacility);
                facilityElement.Text = mandatoryFacility;
                e.Cancel = true;
                // Here we could show a dialog as well
                var message = "When using order type " + checkOrderType + " you must use facility " + mandatoryFacility;
                controller.RenderEngine.ShowMessage(message);
                // Return so we don't disconnect since we cancelled the request
                return
              }

            }
          }
          
        }
      } catch (ex) {
        LogDebug(ex);
      }
      controller.remove_Requesting(OnRequesting);
    }

    private function GetValue(fieldName) {
      var element = ScriptUtil.FindChild(content, fieldName);
      if (element != null) {
        var value = MFormsUtil.GetControlValue(element);
        return value;
      }
      debug.WriteLine("Could not find a field named " + fieldName + " on the current panel");
      return null;
    }

    private function LogDebug(message : String) {
      if (message != null) {
        logger.Debug(message);
        if (debug) {
          debug.WriteLine(message);
        }
      }
    }
  }
}

MIPanel enhancements for the Mashup Designer

Smart Office Hot Fix 12 was just released (10.2.0.88). We have some new features and in this post I’ll cover a changes to the MIPanel that will make it easier to chain calls together. The new features for the MIPanel are:

  • New events: CompletedSuccessfully and CompletedWithError
  • New properties: ShowMessagesInDialog and ShowMessagesInStatusBar
  • New result property that you can bind to: MIPanel.ErrorInfo. This property will contain error information from the first failed transaction. It has ErrorMessage, ErrorCode, ErrorField, Transaction and Program.

Properties

For those of you who have use conditions on events you can now consider using the new events. An example scenario would be updating item information and if that transaction is successful you would like to run another transaction. In that case you can trigger the second update based on CompletedSuccessfully instead of UpdateCompleted.

Item update

Please note that I have some hard coded values in the example. I did have to configure MandatoryInputFields since I’m not changing the item number as the behavior of the MIPanel is to only send updated data to an MITransaction. The use of the event is pretty straight forward. For numeric input I used the NumericTextBox. You will not find it in the Designer UI but it is part of Smart Office so you can use it if you edit the XAML. Here is the XAML:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="clr-namespace:Mango.UI.Controls;assembly=Mango.UI" xmlns:mashup="clr-namespace:Mango.UI.Services.Mashup;assembly=Mango.UI" xmlns:m3="clr-namespace:MForms.Mashup;assembly=MForms">
	<Grid.ColumnDefinitions>
		<ColumnDefinition Width="1*" />
	</Grid.ColumnDefinitions>
	<Grid.RowDefinitions>
		<RowDefinition Height="Auto" />
		<RowDefinition Height="1*" />
		<RowDefinition Height="Auto" />
		<RowDefinition Height="Auto" />
	</Grid.RowDefinitions>
	<m3:MIPanel Name="ItemDetail" Grid.Row="0" Margin="0,15,0,0">
		<m3:MIPanel.Events>
			<mashup:Events>
				<mashup:Event SourceEventName="Startup" TargetEventName="Get">
					<mashup:Parameter TargetKey="ITNO" Value="AC-001" />
					<mashup:Parameter TargetKey="FACI" Value="010" />
				</mashup:Event>
			</mashup:Events>
		</m3:MIPanel.Events>
		<Grid>
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="Auto" />
				<ColumnDefinition Width="10" />
				<ColumnDefinition Width="200" />
				<ColumnDefinition Width="15" />
				<ColumnDefinition Width="*" />
			</Grid.ColumnDefinitions>
			<Grid.RowDefinitions>
				<RowDefinition Height="Auto" />
				<RowDefinition Height="5" />
				<RowDefinition Height="Auto" />
				<RowDefinition Height="5" />
				<RowDefinition Height="Auto" />
				<RowDefinition Height="5" />
				<RowDefinition Height="Auto" />
				<RowDefinition Height="10" />
				<RowDefinition Height="Auto" />
			</Grid.RowDefinitions>
			<Label Content="Item number:" Grid.Row="0" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0" Padding="0" />
			<TextBox MaxLength="15" Text="{Binding [ITNO]}" IsEnabled="false" Grid.Row="0" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
			<Label Content="Name:" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0" Padding="0" />
			<TextBox MaxLength="30" Text="{Binding [ITDS]}" Grid.Row="2" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
			<Label Content="Description 2:" Grid.Row="4" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0" Padding="0" />
			<TextBox MaxLength="60" Text="{Binding [FUDS]}" Grid.Row="4" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
			<Label Content="Avergage cost:" Grid.Row="6" Grid.Column="0" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0" Padding="0" />
			<ui:NumericTextBox MaxLength="10" Name="inputAPPR" Text="{Binding [APPR]}" Grid.Row="6" Grid.Column="2" HorizontalAlignment="Stretch" VerticalAlignment="Center" />
			<Button Name="SaveButton" Content="Update" Grid.Row="8" Grid.Column="2" HorizontalAlignment="Right">
				<Button.CommandParameter>
					<mashup:Events>
						<mashup:Event TargetName="ItemDetail" SourceEventName="Click" TargetEventName="Update" Debug="True">
							<mashup:Parameter TargetKey="ITNO" Value="{Binding [ITNO]}" />
							<mashup:Parameter TargetKey="FUDS" Value="{Binding [FUDS]}" />
							<mashup:Parameter TargetKey="ITDS" Value="{Binding [ITDS]}" />
						</mashup:Event>
					</mashup:Events>
				</Button.CommandParameter>
			</Button>
		</Grid>
		<m3:MIPanel.DataSources>
			<m3:MIDataSourceList>
				<m3:MIDataSource Program="MMS200MI" Transaction="Get" Type="Get" InputFields="ITNO" OutputFields="ITNO,ITDS,FUDS" />
				<m3:MIDataSource Program="MMS200MI" Transaction="GetItmFac" Type="Get" InputFields="FACI,ITNO" OutputFields="APPR" />
				<m3:MIDataSource Program="MMS200MI" Transaction="UpdItmBasic" Type="Update" InputFields="ITNO,ITDS,FUDS" MandatoryInputFields="ITNO" />
			</m3:MIDataSourceList>
		</m3:MIPanel.DataSources>
	</m3:MIPanel>
	<m3:MIPanel Name="SecondUpdatePanel">
		<m3:MIPanel.Events>
			<mashup:Events>
				<mashup:Event SourceName="ItemDetail" SourceEventName="CompletedSuccessfully" TargetEventName="Update" Debug="True">
					<mashup:Event.Conditions>
						<mashup:Conditions>
							<mashup:Condition SourceValue="{Binding ElementName=inputAPPR, Path=Text}" TargetValue="{Binding ElementName=ItemDetail, Path=[MMS200MI.GetItemFac.APPR]}" Operator="NotEqual" />
						</mashup:Conditions>
					</mashup:Event.Conditions>
					<mashup:Parameter SourceKey="ITNO" />
					<mashup:Parameter TargetKey="FACI" Value="010" />
					<mashup:Parameter SourceKey="APPR" />
				</mashup:Event>
			</mashup:Events>
		</m3:MIPanel.Events>
		<m3:MIPanel.DataSource>
			<m3:MIDataSource Program="MMS200MI" Transaction="UpdItmFac" Type="Update" InputFields="FACI,ITNO,APPR" />
		</m3:MIPanel.DataSource>
	</m3:MIPanel>

	<ui:StatusBar Name="StatusBar" Grid.Row="3" Grid.Column="0" />
</Grid>

Unfortunately the Documentation in the Mashup Designer is not updated with the new properties etc as there has been no update to the Mashup Designer. You can always find the latest API documentation in the Smart Office SDK.

Please note that these events applies to update transactions. You set the type of the transaction on the MIDataSource. We will automatically try and determine the type based on the transaction name.

For a full listing of changes made on this release, refer to Lawson KB 1626878 / M3 KB 1623430.

Creating your own windows with JScript

When working with JScript you might want to open a new window. There are a few different ways that this can be done and today I’ll share how to create a new window that is visible in the taskbar and how to open a modal window. Modal means that you cannot access any other Smart Office functionality such as the QuickNote widget or data in a form as the modal window is the only currently active window placed above all other windows. A modal window is a graphical control element subordinate to an application’s main window which creates a mode where the main window can’t be used. The modal window is a child window that requires users to interact with it before it can return to operating the parent application, thus preventing the workflow on the application main window. This is great for some cases but can also be frustrating.

Background

Some of the concepts when working with windows in Smart Office is IInstanceHost – which represents the contract to an application host window. Then if a window is visible in the TaskBar it has to have a Runner – a handle to a task running on the Canvas. A Task is an item that can be launched on the Canvas. A task can only be launched if there is a registered application that supports the task. The scheme part of the task URI is used to locate an application that can launch a specific task, form example mforms://mms001. All these interfaces and classes can be found in the Smart Office SDK API and some of them in the API Documentation under Help in the Mashup Designer. When writing JScripts you should be familiar with the Smart Office core programming concepts.

There are new overloads of LaunchTask that can open a window in different ways. If the code does not work on your version of Smart Office it is possible that the method used does not exist in your version.

Opening a new window

Below is an example from Norpe on how to create a non modal and a modal window with JScript. Enjoy.

If you don’t want to have modality to the new window you can create a window that shows up in the task bar using an overload of the LaunchTask method. The script below shows examples of how to launch a modal window and a non-modal window.

DialogWindow

import System;
import System.Windows;
import System.Windows.Controls;
import MForms;
import Mango.UI.Core;
import Mango.Services;
import Mango.UI.Services;

package MForms.JScript {
   class NewWindowTest {
      var controller, content, debug, host;
      var buttonOpen, buttomOpenModal, buttonClose;
        
      public function Init(element: Object, args: Object, controller : Object, debug : Object) {         
         this.controller = controller;
         this.debug = debug;
         var content : Object = controller.RenderEngine.Content;

         var stackPanel = new StackPanel();
         stackPanel.VerticalAlignment = VerticalAlignment.Center;
         stackPanel.HorizontalAlignment = HorizontalAlignment.Center;

         buttonOpen = new Button();
         buttonOpen.Content = "Open New Window";
         buttonOpen.Width = "160";
         stackPanel.Children.Add(buttonOpen);
         
         buttomOpenModal = new Button();
         buttomOpenModal.Content = "Open New Modal Window";
         buttomOpenModal.Width = "160";
         buttomOpenModal.Margin = new Thickness(0,8,0,0);
         stackPanel.Children.Add(buttomOpenModal);
         
         Grid.SetRowSpan(stackPanel, 100);         
         Grid.SetColumnSpan(stackPanel, 100);
         content.Children.Add(stackPanel);

         buttonOpen.add_Click(OnClickOpen);
         buttomOpenModal.add_Click(OnClickOpenModal);
         controller.add_Requested(OnRequested);                  
      }
      
      public function OnClickOpen(sender: Object, e: RoutedEventArgs) {         
         try {
            var title = "New Window Test";
            var task = new Task(new Uri("notused://")); // The uri is not important (but must be valid) when shortcut are not allowed
            task.AllowAsShortcut = false;
            task.VisibleName = title;
            task.ToolTipInfo = title;
            task.UseVisibleShortName = false;
            
            var runner = DashboardTaskService.Current.LaunchTask(task, HostType.Default);
            host = runner.Host;
            
            host.HostContent = CreateWindowContent("Window Content");  
            
            host.HostTitle = title;
            host.Width = 640;
            host.Height = 480;
            runner.Status = RunnerStatus.Running;
            host.Show();
         } catch(ex) {
            Log(ex);         
         }
      }
      
      public function OnClickOpenModal(sender: Object, e: RoutedEventArgs) {         
         try {
            var content = CreateWindowContent("Modal Window Content");  
            content.Width = 640;
            content.Height = 480;
            
            var title = "New Modal Window Test";
            host = new HostWindow(true);
            host.HostContent = content;
            host.HostTitle = title;
            DashboardService.Current.ShowDialog(host); // Use DashboardService to get modal "shake".
         } catch(ex) {
            Log(ex);         
         }
      }
      
      public function CreateWindowContent(text : String)
      {
         var grid = new Grid();
         var textBlock = new TextBlock();
         textBlock.Text = text;
         textBlock.VerticalAlignment = VerticalAlignment.Center;
         textBlock.HorizontalAlignment = HorizontalAlignment.Center;
         textBlock.FontSize = 48;
         grid.Children.Add(textBlock);
         
         buttonClose = new Button();
         buttonClose.Content = "Close";
         buttonClose.Width = "120";
         buttonClose.VerticalAlignment = VerticalAlignment.Bottom;
         buttonClose.HorizontalAlignment = HorizontalAlignment.Right;
         buttonClose.Margin = new Thickness(0,0,8,8);
         buttonClose.add_Click(OnClickClose);
         grid.Children.Add(buttonClose);
         
         return grid;
      }
      
      public function OnClickClose(sender: Object, e: RoutedEventArgs) {         
         if(host != null) {
            host.Close();
            host = null;
         }
      }
      
      public function OnRequested(sender: Object, e: RequestEventArgs) {
         buttonOpen.remove_Click(OnClickOpen);
         buttomOpenModal.remove_Click(OnClickOpenModal);
         controller.remove_Requested(OnRequested);
         if(buttonClose != null) {
            buttonClose.remove_Click(OnClickClose);
         }
      }
      
      function Log(text : String)
      {
         debug.WriteLine(text);
      }
   }
}

Smart Office 10.2.1 Hot Fix 6 is released

Last week we released update 6 for Smart Office Build 10.2.1.0.54. It has some nice new features that you should know about, especially for Lawson customers but also general performance improvements. You will notice performance improvements if you are running large Mashups but also in both Lawson and M3 Forms.

I’ve also added a new link to a new blog from iStone that you might find interesting, M3 Usability Blog.

Special thanks to Vince for the Lawson update below. For more Smart Office and Lawson related information be sure to follow the Infor Lawson Technology blog.

For additional information regarding Infor Smart Office Hot Fix 6 (Build 10.2.1.0.54) and a list of bug fixes and enhancements see KB article 1626878 on Infor Xtreme.

Lawson Import / Export tool

There are a few different tools for exporting and importing. There is a stand alone tool called Mango Admin that we have written about before – but it has it’s limitation as for example M3 and Lawson has other user related data as well and the Mango Admin only exports data on the Smart Office server. There is the export / import manager in Smart Office for settings and predefined widgets (with meta-data for Lawson widgets). But there are also other types of user data such as scripts and personlization files and for M3 and Lawson those files are located on the MUA / Lawson application server. M3 has the Personalizations tool and a Files tool that can export scripts and personlization files separately.  As of 10.2.1.0.54 Lawson has a new great  tool that allows administrators or anyone granted access via their Role to export to a zip file of the various personalization files stored on the Lawson application server. Once exported, this file can then be used to import the files to another server.

ImportExportLawson

Because many personalization files are associated with a Data Area and often the Data Area on the target server will be named differently than the Data Area on the source server, a dialog for ‘mapping’ the names and specifying which Data Areas to process is also provided.

DataArea

Smart Office LSF Administration Tools

Beginning with HF 6 of 10.2.1 Smart Office, a number of LSF Administration tools are made available.  These are the same tools available in Lawson/Ming.le.  The tools available are dependent on the version of LSF.

LSF 9.0.1.14

  • Language Definition
  • Printer Definition
  • Printer Group Definition

LSF 10.0.6

  • Job Queue Definition
  • Language Definition
  • Locale Definition
  • Printer Definition
  • Printer Group Definition

LSF 10.0.7

  • Distribution Group Definition
  • Job Queue Definition
  • Job Queue Group Definition
  • Language Definition
  • Locale Definition
  • Printer Definition
  • Printer Group Definition

LSF 10.0.8

  • Distribution Group Definition
  • Distribution List Group Definition
  • Job Queue Definition
  • Job Queue Group Definition
  • Language Definition
  • Locale Definition
  • Printer Definition
  • Printer Group Definition

Controlling Access

Users with PortalAdmin access will be able to access any of the tools that are available without any need for additional configuration.  Navigator widget links will be available under a new branch of Infor Lawson, LSF Administration Tools, for any user with access to one or more tools.

Navigator

For non-Admin users, access to the tools can be granted on the Administration tab in Role Manager.

RoleXml

Distribution Group Definition

DistributionGroup

Distribution List Group Definition

ListGroup

Job Queue Definition

QueueDef

Job Queue Group Definition

QueueGroupDef

Language Definition

LangDef

Locale Definition

LocaleDefinition

Printer Definition

printerDef

Printer Group Definition

printerGroupDef

Language Translation

For Languages other than English, a Translation Maintenance screen with several tabs is available to translate various phrases and messages defined in the system.  A page size can be selected to set the number of records returned. And columns with a filter field can be filtered much like filters work elsewhere within Lawson screens.

translation

To edit a phrase or message simply click on the Edit icon or the text under Translation:

editTranslation

When done editing on a particular tab, click the Save toolbar button to save changes for that tab. No reminder to save changes will be presented, but the Save button is only enabled if there are pending changes and each line with a pending change will be highlighted with a yellow icon on the left edge.

Phrases Translation

Phrases

Column Phrases Translation

ColumnPhrases

Titles Translation

titles

Value Lists Translation

values

Universe Message Translation

message

Application Messages Translation

appMessage

Scaling out Smart Office server

Scaling out the Smart Office server can be done for different reasons. Being able to serve more users or creating a more robust environment.

When talking scaling out an environment it is not only Smart Office server that needs to be considered, it is also the Grid Registry, Grid Session Provider and the connection points into Grid (Grid Routers) that must be included.

This article will describe one way of creating an environment with Smart Office that can handle a larger amount of users and also be more resilient for malfunction hardware using Infor Smart Office 10.2.1 and Infor ION Grid 11.1.13.

As a starting point Grid, LDAP Session Provider and Smart Office have already been installed.

Adding a host to Grid

The first thing needed is to add another host in the Grid and to be able to do that the host must first be added in Lifecycle Manager (LCM). The process of adding a host in LCM is described in the LCM install guide. The steps are shortly described below.

  1. On the new host go to the LCM portal page, normally http://server:4062 and download the Service Installation.
    1_LCMService
  2. Install the service with java.exe –jar installLcmService.jar
  3. After the installation the new host will be visible in the LCM client.
    2_LCMAddedHost

Now when LCM knows about the new host, Grid needs to span to the new host as well.

To add a host to the Grid:

  1. Find your Grid in the LCM client, right click on Grid Hosts and select Add Host.
    2_HostAdded
  2. In the Add Host dialog, select the host previously added to LCM and press Next followed by Finish. Change ports, name etc if needed.
    4_LCMAddHostDialog
  3. In the Grid Topology View the new host should be visible.
    5_GridViewHostAdded

Grid Registry

The Grid Registry cannot run simultaneously on several hosts, it can only run on one host at a time. But there is a failover mechanism. The failover mechanism will make sure the Grid Registry starts on another host if the primary host malfunctions.

To enable failover for Grid Registry do the following.

  1. In the LCM client find the Grid Hosts, right click on the ones that is tagged with registry and select Configure Registry Failover.
    6_FindRegistry
  2. In the Configure Registry Failover dialog, select the new host and press Next followed by Finished. (The Grid needs to re-start when changing the Grid Registry failover settings).
    7_ConfigureRegistryFailoverDlg
  3. Wait for the configuration task to finish and Grid to start again. On the failover host should now be tagged with failover.
    8_VerigyRegistryFailover

Grid Routers and Load balancer

A load balancer must always be placed in front of Grid to be the single entry into the Grid to ensure that even if a host where a Router exists on dies it is still possible to connect to the Grid. A client will not know if a Grid host is failing or another host is added since it always connects to the load-balancer. But what if the load-balancer dies? There are techniques for having clustered load-balancers as well, but that is out of scope for this article.

In order for the load balancer to balance the calls to different servers there must be a Grid Router on each host. The load-balancer is configured with the hosts and https ports to the Grid Router on each host.

The load-balancer should also have a health mechanism so it automatically removes a hosts if it malfunctions.

Where to put the SSL certificate? In the load balancer, in the Grid Routers or in both can be debated. There are pros and cons with all solutions. The solution that works best with all Grid Session Providers and has less security flaws is to put the SSL certificate in the Grid Routers and configure the load-balancer for TCP pass-through.

9_SSL_Loadbalancer

Note that the SSL certificate used in each Grid Router must be issued with the load balancer address and it is recommended to use the same certificate in all routers.

Grid Routers

Either create a new Grid Router on each host that should be included by the load balancer or configure one router to be on started on <all hosts>.

10_Router

Below is the Default Router set to be started on all hosts and they will all be using the same HTTPS port.

11_Router_AllHosts

SSL Certificate

SSL certificates are managed per host, not per Grid Router, and must therefore be added for each host. It is recommended to use the exact same certificate on all hosts, clients may be confused if getting a different SSL certificate depending on which host is being called through the load balancer.

Before creating any SSL certificates decide the address of the load balancer.

To create a SSL certificate from an internal Certificate Authority (CA) and add it to all hosts do the following.

  1. In Grid Management Pages go to Configuration Manager -> Security->Certificates and click Manage Certificate on one of the hosts.
    12_Certificates1
  2. Click the Create Certificate Signing Request (CSR).
    13_Certificates2
  3. In the Create Certificate Signing Request (CSR) dialog make sure to change the Host FQDN (CN) value to the load balancer address. In this example I have also added the two host names as alternative names to remove certificate error if accessing them directly without going through the load balancer. It is not necessary to do so. Click the Create Request Overwrite Keys.
    13_Certificates3
  4. Send the certificate request to your Certificate Authority and receive a certificate chain back, usually a .p7b file.
  5. Now import the certificate chain by clicking Import Signed SSL Certificate and select the file received from the certificate authority, followed by  Import Certificate, followed by Import.
    14_Certificates4
  6. The SSL certificate is now located on one of the hosts, to be able to import it on the second host export the SSL certificate by clicking Export SSL Certificate with private key. Use Oracles Java key-store and give the key-store a password.
    15_Certificates5
  7. Go back to Configuration Manager->Security->Certificates and select the other host.
  8. Click Import SSL Certificate with private key. Select the file previously exported.
    16_Certificates6
  9. Now both of the Grid Routers will use the same SSL certificate.

Load balancer

In a production environment a load-balancer is most often a piece of hardware, for more information contact your hardware vendor. In a test environment a software load-balancer can be used. For this blog post I used http://nginx.org/ which has a community edition that is free and works on several operating systems including Windows. In my example I have configured nginx with TCP pass-through to two servers. The configuration file is similar to this.

stream {
  server {
    listen 3443;
    proxy_pass grids;
  }
  upstream grids {
    server server1.infor.com:55151;
    server server2.infor.com:55151;
  }
}

For more details see the nginx documentation.

Grid Applications

Some Grid Applications can be scaled out to several machines, other cannot. Some can run several instances at the same time and some cannot. Both Smart Office and the different Grid Session Providers are Grid Applications and have some different characteristics. The details are listed below.

Even if a Grid Application cannot run two instances at the same time most Grid Applications can be started on another host if the original host dies. Within minutes a fully working environment is up and running without human interaction.

There are a couple of things that needs to be prepared and considered when implementing a complex environment when it comes to Grid Applications.

  • Deploy Grid Applications to hosts
  • Configure Grid Bindings
  • Make sure there is enough memory

Deploy Grid Applications

Deploying a Grid Application to a host is a matter of distributing the binaries, nothing will run just by deploying a Grid Application to one or more hosts.

To deploy a Grid Application to a host, in the LCM client find the installed Grid Application, right click and select Application Maintenance->Deploy Application on Hosts

17_DeployApplication

In the Deploy Application on Hosts dialog, select the hosts where the application should be able to run and press Next. Press Finish.

The Grid Application is now possible to start on all hosts it is deployed to.

Grid Bindings

The Bindings for a Grid application is found on the application page in Grid Configuration Manager.

18_Bindings

Click the pencil to edit the Binding.

19_Binding1

For a robust scenario you would like to have the Grid Application run on a minimum of two hosts always to ensure having at least one instance running even if a host dies. Mark the hosts where this binding should be enforced and select Constraint Type to be Per Host. This configuration will result in one instance of the application running on each of the selected hosts.

If having Constraint Type set to Global and Min to 2 would result in almost the same behavior. There will still be two instances of the application but it is not defined if the running instances will be started on the same host or not.

When having an application that only can run in a single instance the following configuration would result as a failover behavior. Constraint Type = Global and Min = 1.

20_Binding2

If the host where the application run on dies, Grid will make sure that the application is started on another host that has been marked in the Binding. By using the Preferred Host property it is possible to hint where the application should run if all hosts are working fine. Within minutes a new instance has started if the first host dies.

Resources

When having Grid Applications that cannot run several instances at the same time but have deployed the application to several hosts Grid will start the application on another host if the preferred host dies. Verify that there is enough memory left on the host where the application is supposed to start before a failover will occur.

Note that memory consumptions from other application will not be taken into account.

Grid Session Provider

There are several Session Providers that can be used in Grid (LDAP, Windows, SAML and DSSO). In practice it is only the SAML Session Provider that supports both failover and can run on multiple hosts and there fore . For these reasons it is recommended to always use SAML Session Provider in environments that requires high stability.

Use the methods describes above to deploy the session provider to additional hosts and configure the bindings. The table below describes what each Session Provider supports.

Session Provider Can be deployed to several hosts Can run multiple instances
LDAP SP 1.10.14 Yes* Yes*
Windows SP 1.10.7 Yes No
SAML SP 1.13.12 Yes Yes
DSSO SP 2.0.7 No No

* LDAP SP can only be deployed to several hosts if configuring the connection to the LDAP with the LDAP protocol. If using LDAPS or Start TLS protocol the LDAP SP will not function properly if deployed to another host. Note! The LDAP protocol should never be used since it sends userid and password in clear text over the network.

Configure Smart Office when using a load-balancer

The Smart Office server must be configured to execute on more than one host and the installation point must be configured to use the load-balancer.

Server

Configuring Smart Office server when using a load-balancer is done with a few steps.

  1. Deploy Smart Office Server to more than one host by following the steps above.
  2. Configure the Smart Office binding to use more than one host, set Constraint Type to Per Host and set Min to 1. After saving the Binding the Smart Office will immediately start on the new host.

Installation Point

When installing the Smart Office client Microsoft Click Once verifies that the installation point URL stated in the installation matches how the installation is accessed. When accessing the installation point through a load balancer, it is the load balancer address that must be put in the Click Once installation. The Smart Office client must also know the URL to the Smart Office server, which also goes through the load balancer.

To change these URLs open the management pages for Smart Office in Grid Management Pages and click Installation Point Configuration.

21_InstallPointConfiguration1

Change the Installation URL and HTTPS URL to the Grid to point to the load balancer. I am using the https port only but if the load-balancer is configured to pass through both http and https, http can of course still be used for the installation point. Do not forget to save (some versions of Smart Office has a bug that wrongly shows the old values after saving).

22_InstallPointConfiguration2

Now use the normal procedure described in the installation guide on how to export/sign/import the installation point.

To install Smart Office client open an Internet Explorer and navigate to https://<load_balancer_address>:port/mango

Smart Office limitations when using a load-balancer

Collaborations does not work properly when using a load-balancer and should be turned off.

Turn off collaborations by setting the property Enable collaboration server to false.

23_Collaboration

M3

Both M3 UI Adapter and M3 H5 Client Enterprise can be configured as Smart Office server, both be deployed to several hosts and run multiple instances at the same time. The process of deploying the application to another host and configuring the Grid Bindings are exactly the same for both M3 UI Adapter and M3 H5 Client Enterprise.