Author Archives: Karin Portillo

About Karin Portillo

Principal Software Architect, User Platform, Infor Sweden AB

Lawson Global and Role Defaults

A long-requested feature, the ability to set global default values for Infor Lawson applications within Smart Office, was recently made available with HF 47, version 10.2.1.0.408. As an added feature, default values can also be set at the Role level, which would take precedence over global values.

Users with Portal admin access can define global values by launching the ‘Lawson Global Values’ link in the Navigator widget under Infor Lawson => Lawson Administration. Role level defaults are set in the Role Manager, accessed from a new ‘Defaults’ button on the General tab.

GlobalDefaultsLawson Global Defaults window

Default values depend on associating values with Lawson key numbers, which are in fact 2 or 3-character alphanumeric values. Key numbers are associated with form fields, with the most common key number being “01” which is generally associated with company fields. If a field has a key number, it can be seen in the field info popup (Ctrl+Alt+O) as ‘Knb’.

Due to the large number of applications developed over many years, key numbers are not guaranteed to be unique across all screens and special handling may be defined. While testing new defaults, it may be necessary to list one or more tokens to be excluded or included when evaluating a form’s default values. If no tokens are listed, the value will be applied where ever the key number is encountered.

When defining defaults, a few of the more common key numbers are listed and can be selected from a popup menu by clicking the ‘…’ button to the right of the key number field.

KeyValueNumber
Key number value displayed in field info popup

CommonKeyNumber
Common Key number popup

One additional consideration when defining defaults is whether to allow role overrides. For example, if your organization has setup different roles to handle different groups of customers or vendors, this may be desirable. However, if a override is not allowed for a key number, you will see the message below when entering it in Role maintenance.

NotAllowed
An attempt to override a key number not allowed

 

Thanks Vince for this information.

Recent enhancements to Infor Smart Office for Lawson applications

With each 10.2.1.x hotfix for Smart Office, in addition to fixes of reported issues, many enhancements have also been included.  And with each release, we update the Knowledgebase article that summarizes those changes (KB-1626878). This post will provide some more detail about the enhancements included over the second half of 2018 and those so far in 2019.

10.2.1.0.329 (HF31)

1) A new user setting (Toolbox width on the Advanced tab) allows for a wider presentation of the forms and lists toolbox area.

2) In addition to the width setting, there is now also a setting to allow the toolbox to be locked in the open or displayed position.

Toolbox

3) Alpha filter fields on lists have always defaulted to a ‘Starts with’ comparison, but a new application setting (Default alpha search type – set in the Settings Editor for S3.Client) allows an administrator to change the default to ‘Contains’.

AlphaFilter

10.2.1.0.333 (HF32)

1) On the Actions menu of standard forms, there is now a menu item to launch the list view for forms that support it.

LaunchVendorList

2) Three enhancements were made to the Script tool: a) the help menu links to the Microsoft .NET reference; b) some common .NET event handler helpers were added; and c) the search providers were added to the context menu.

 

10.2.1.0.341 (HF33)

1)  Three new methods were added to the supported scripting model (as documented in the Object Browser): IForm GetFieldByNumer and IField Get/SetAttribute.

2) Before publishing a script file to the server, it is now scanned for non-ASCII characters which might cause subsequent compilations to fail. These characters might be introduced by writing script in another editor and pasting to the Script tool.

ScriptTool

3) A search feature was added to the Personalization Manager which allows an administrator the ability to find form and list personalizations by token as well as finding references to Jscript files.

LawsonPersonalizationManager

 

10.2.1.0.351 (HF34)

1) In addition to several minor enhancements, two major personalization enhancements for standard forms were introduced: the ability to display hidden fields and the ability to move standard elements. These are both described in greater details in this post: New Personalization features for Infor Smart Office for Lawson.

10.2.1.0.353 (HF35)

1)  A search feature was added to the Object Browser for help in locating property and method documentation and sample code.

SearchObjectBrowser

10.2.1.0.359 (HF36)

Note: this hot fix has been pulled due to the introduction of a serious regression in the M3 client. Since hotfixes are cumulative, the enhancements listed here are included in hot fix 37

1)  Infor Browser calculated fields can now be used as an operand for another calculated field.

2) A Lawson System Check utility is available to administrators to examine various settings and provide recommended changes, if any.

3) Three new scripting enhancements were added: two methods added to ControlsUtil (AddCustomTextBlock and AddCustomGroupLine); and constant for setting element foreground colors to the selected theme color (ScriptConstants.ThemeBrush).

4) The net://auth protocol is intended only to support Lawson web content and since the only version of Internet Explorer now supported by Lawson is IE 11, if the user’s browser emulation is not set to IE 11 with the net application is launched, a warning will be displayed. Administrators should consider locking the browser emulation application setting in the Settings Editor.

WebBrowserEmulation

10.2.1.0.361 (HF37)

1)  Two scripting enhancement were added to the supported scripting model (as documented in the Object Browser): an IField event, FieldValueChanged and the static class, HotkeyActions, which documents hotkey action names.

2) A new Profile setting in the SmartClient section of the Profile Editor (LogonBannerUrl) allows administrators to specify the URL of custom content to display in a browser control as users logon.

LogonBannerUrl

Smart Office commands cheat sheet

Smart Office has a number of commands, or in fact they are all links that will perform an action like opening a tool or clearing a cache. A special thanks to Jarda Dedek at EYELEVEL for sending me the original list. I took it and added a few tips of my own. In Smart Office every application is launched by an Uri. The Uri consists of a schema, like http and https, but we use mforms, sforms etc to identify different applications. As it turns out the short form links: is also a valid Uri, it’s just that it has no path, just the schema.

Download PDF version

Command Description
mforms://cmp600 Company switch
mforms://cmp100200 Division switch
mforms://lngcz Language switch
mforms://mitest MI Test
mforms://_command?value=clear cache Clear language and view definition cache. (No other caches) The reply from the command will show what caches have been cleared.
mforms://_command?value=clear view Clear view
mforms://_command?value=clear view all Clear all views
mforms://_command?value=clear lngcache Clear language cache
mforms://_command/?value=clear custcache Clear customization cashes in UI Adapter
mforms://jscript Script Tool
mforms://jscript/clear Clearing jScript cache with confirmation
mforms://jscript/clear&silent Clearing jScript cache without confirmation
mforms://_automation?template=<TEMPLATE NAME>&<NAME1>=<VALUE2>&<NAMEn>=<VALUEn> Automation links crated in Automation builder
mforms://_automation/?data=<AUTOMATION XML>  Automation link with automation file uploaded to server
admin://file/category Category File Administration
admin://importexportmanager Import/Export Manger
admin://installpointmnanager Install Point Manager
admin://predefinedwidgets Predefined Widgets
admin://profileeditor Profile Editor
admin://settingseditor Settings Editor
admin://userhistory User Logon History
admin://videosmanager Videos Manager
startpad://manager StartPad Manager
admin://file/category?category=StartPad StartPad File Administration – Start pad
admin://file/category?category=Mashup StartPad File Administration – Mashup
links: Link Manager
dev:help List of development commands
dev:icons Show icons
dev:local Show local folder
dev:localscriptpath Show local script path
dev:log Shows log
dev:supportzip Creates a zip with the log file and some other files like settings
dev:roaming Shows roaming folder
dev:root Shows root folder
dev:bin Shows bin folder
dev:user Shows local folder with user profile. All U** in S0 folder then can be deleted to refresh views/starting_values/user_data.
C:\Users\jarded\AppData\Local\Apps\2.0\
dev:server Show server folder
dev:shared Shows share folder
dev:resetlang Resets language
internal://log Smart office Log viewer
internal://log?search=idledetect 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&session=2

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

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

This can be extended with the 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?cat=service unavailable
internal://log?cat=service%20unavailable
internal://log?cat=service unavailable&session=full
You can specify the category you defined as initial selection.

 

internal://log?search=idledetect&sessiontime=13:10 The session time parameter that may be useful in some special cases and if the session time parameter is present the session parameter is ignored.
internal://themeulator Canvas theme Emulator
tool://wstest Web services test tool
widget: Opens the widget library
widget://add/?scheme=Mango.Widgets.MenuWidget Adds a widget to the canvas, use the widget ID to specify which widget to add.

 

 

 

M3 TechEd – Reporting capabilities

I took the opportunity to leave the hands-on lab and watched Mike Fletcher’s session on Reporting capabilities within Infor M3. He started off showing Homepages, and how to use it to present operational metrics, analyzing current data from M3. The session presented a number of other techniques as well.

F4DC1C6C-3C17-4C94-9622-9FC8E14252E5

An example is to show a monitor, with the count of stopped orders, and then being able to go to the list from the Monitor Widget.

Another example was to show items under development without prices by using search. The query was built by selecting “add to search” from the context menu on the column header. The search query can then be added to a menu in Homepages so that you have a link to the tasks that you work with on a regular basis.

In business context and context applications are also a form of reporting that can provide context information to M3 data, including Birst reports, Infor Document Management documents, as well as H5 Mashup applications as Context Applications.

A great session that give business context to the development that I’ve been working on. It is always nice to see how powerful the different widgets, SDKs and H5 are from a business perspective.

I also got some good feedback from customers and partners which is really what TechEd is all about, learning from each other.

M3 TechEd – Day 2

Today is day 2 at M3 TechEd. We started with Infor OS and Heath on the main stage. Infor OS is great and will give you a lot of value. If you want to learn all about Infor OS don’t miss the coming TechEd in Las Vegas in February.

C772F287-2EB2-44A9-839C-1A6FE11CDED1

Heath started with Infor OS and a quick overview.

CE542FE8-0EE1-4B96-A396-219DB68E5E1D

Infor Document Management is a living repository for collaborating around documents.

Next on stage was Torbjörn on User Experience starting with Homepages the application that is built for role based, highly configurable widgets presenting a process based view, highlighting those items you need to take action on.

94DA5E14-864C-41D2-9475-CF5658E83FF7.jpeg

Then there was a great session on organization change management by Carol Tyler and how we at Infor is transforming the industry and cultivating our culture of innovation.

Yesterday I arrived early, in the dark, and I left, in the dark. That’s just how it is in December in Stockholm. Today I was half an hour later, just in time to catch the sunrise.

 

Beautiful sunrise facing Gröna Lund and Djurgården, on the other side.

Moving to H5 and Infor OS from Smart Office

My last session of the day was  Smart Office compared to H5 and how to move from Smart Office to H5 and Infor OS. I was assisting Magnus as a subject expert. Not that he needed my help.

B06ED645-9BBD-4AC2-98A6-84E59A9AFD75

This session will be held tomorrow as well, so if you missed it, there is another chance.

There are a few tools that will help you make the move. For example moving links and favorites. But please note that not all links will work. H5 will handle mforms:// links, but there might be some links that will not work, for example anything that is accessing the file system or other schemas than mforms and https.

The clients are of course different but the M3 UI Adapter is still the same and both client talk to the MUA server when it runs M3 programs. With H5 comes Infor Ming.le and the complete Infor OS. Below is a comparison between the featureset in H5 and Smart Office.

SmartOfficevsH5

We spent some time on Ming.le Homepages which is the product I’ve been working on lately. It is a great starting point for all types of users and with the M3 widgets you can monitor and take actions and have standard pages for different roles.

The M3 Implementation Accelerator (IA) solutions from July 2018 incorporate a small number of role-based Ming.le homepages designed to complement the preconfigured solutions. Depending on the industry, there are typically six roles containing these templates:

  • General Ledger Controller
  • Accounts Payable Controller
  • Accounts Receivable Controller
  • Customer Services
  • Production Manager
  • Purchase Manager

They are all available for download, fee, in KB 2008101.

M3 TechEd

I’m at M3 TechEd in Stockholm. If you are attending don’t miss checking out the hands-on open lab. There are a lot of experts available to help you and show you what we are working on and how we can help you be successful.

50D4E859-514E-4A66-A44B-D7676036A32B

Ole Rasmussen presenting M3 product strategy.

Great location at Elite Hotel at Nacka stand. I came in early.

 

I’ll be on two tracks, Extensibility and User Experience, see you there 😀.

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