Author Archives: Karin Portillo

About Karin Portillo

Principal Software Architect, User Platform, Infor Sweden AB

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);
        }
      }
    }
  }
}