Apr 1, 2018

Control Properties in MEC

When we want to keep some parameters in the MEC we often use “.properties” file.  But alternatively we also can use Control properties in the Partner Administrator.

image


The control properties can be accessed from the MEC mapper using the following code.


String strVariable = getManifestInfo("agr:outputFolderPath");


Hint:

You can add control properties to the individual “Agreement” or to the “Group”.


Depending on the situation, we can choose the suitable method to use. Below comparison will help to choose appropriate method.


Comparison:


Control PropertiesProperties File
FormatKey,Value formatKey, Value format
DeploymentWill be ported to the environment with import/export function.

Possibility to miss the file to copy unless it is documented properly.

Code

Very easy. No explicit initiation of objects.

One line required to access the variable. 

Not very easy. Need to read the file and initiate property object. Require few extra coding to access first variable.
Usage Properties to be used in agreement or group level.

Properties to be used as common to share across all the agreements.

E.g. data base connections,

Sep 4, 2017

Infor M3 TechEd 2017

InforTechEd2017_M3_Stockholm_RegOnline_3250x521
It is so exciting to be here in Sweden & to participate 2nd Infor M3 TechEd event. In the keynote session today (by Ole Ramsussen – Infor M3 Product Global Director) following key points were mentioned.
  1. Infor Xi platform  
    1. There are 3 extensibility levels for end users (HomePages), consultants(App Builder) & developers(Mongoose).
  2. 13.4 highlights
    1. Full support of Xi platform
    2. Available both on-prem & cloud
    3. Extensibility improvements
    4. 288 performance improvements
    5. Factory Track as warehouse mobility solution
    6. Soho design
  3. Cloud strategy 
    1. Multi tenant ColudSuites 11.1 M3 CE planned to release in 2018 for F&B , Distribution enterprise, Fashion, Equipment & chemicals
    2. M3 Cloud Edition 19.1 panned to release in 2019.
  4. Infor M3 roadmap
    1. Utilize the power of Xi platform
    2. Remove tech legacy
    3. Cloud strategy as above point #3
    4. Strategically below components are going away.
      1. IPA –> ION Workflow
      2. LBI –> InforBI/Birst
      3. ISO –> M3 H5 client/Mingle
      4. Mashup Designer –> Infor App Builder
  5. Infor OS : Infor Operating Services
    1. A solution to fully integrate industry specific solutions with mobile first design  & science driven analytics.
    2. Components incudes: UX, Collaboration, Extensibility, Security, Process integration, API gateway , Analytics, documents & reporting.
  6. M3 Core Extensibility Framework
  7. In Future, What will happen to the OutFile, & MEC
    1. OutFile will completely be replaced with configurable XML file.
    2. MEC will only becomes connector to M3. ION will take over all the integrations, including EDI, integration with other systems etc.
  8. M3 Solution stack.
    Below diagram depicts it.
    IMG_0580

Aug 17, 2017

Access APIs , When you don’t have MI Test

When you want to run an API, MITest (external tool or inside ISO Client ) is a handy tool. But if you have them, for an example in H5 client you cannot call MITEST, still, there is a way to an API. You need to have LCM access or server view access.

Steps:

Following steps were captured in LCM.
  1. Go to the Topology View in Infor ION Grid Management pages and find M3ApiWS.  The expand it.
    image
  2. Then Click on MI-WS. Then click on Global Management Pages (M3-API-WS). In the next
    image
  3. You will get the page where you can select Program, Transaction & run.
    image

Jun 15, 2017

A New Beginning

Today we embarked a new journey. Brandix I3 became Fortude (http://fortude.co/) . I’m very proud that I WAS one of the first team at Brandix I3 & I’M now one of the first team at Fortude.

My Team & I, as M3 development team,  supported to grow Brandix I3, working with almost  all it’s customers. We are not going to stop. We are endeavouring as development HUB to grow Fortude exponentially. !

Dec 29, 2016

Browse Control for ISO SDK App–Part 1

Background

In a conventional M3 Program, data in some fields can be searched by pressing the F4 key or Browse function.

image

Using MAK (M3 Adaptation Kit – the framework to develop M3 programs), it is just mater of overriding  PxPMT() to enable this Browse feature. However, in SDK development, we don’t have that option. Neither a function to override nor control to re-use. 

Instead, using WPF & C# we have to create it from the scratch. I did this for my current SDK project and going to share with SDK development community.

There is an article in Potato IT blog (https://potatoit.kiwi/2013/09/19/smart-office-sdk-first-project-part-6-the-browse-control/).  This was a good starting point for me. However, since I have MAK background, I wanted to implement similar way, that PxPMT() method does (below is an excerpt of  M3 Browse )

if (IN62) {
   if (DSP.hasFocus("W1TOOL")) {
      this.PXFILE.moveLeft("CSYTAB00");
      this.PXMBR.clear();
      this.PXOPT = '1';
      this.PXKVA1.moveLeft(LDAZD.CONO, 3);
      this.PXKTY1.move("EQ");
      this.PXKTY2.move("EQ");
      this.PXKVA3.moveLeft("TOOT");
      this.PXKTY3.move("EQ");
      this.PXKVA4.moveLeft(DSP.W2TOOT);
      this.PXFLD1.moveLeftPad("CTSTKY");
      this.PXFLD2.moveLeftPad("CTTX15");
      this.PXF11 = '1';
      COMF04();
....

That is, the client (developer) should not worry about the data binding, extraction logic etc. Instead, only specify Logical file, it’s keys with values, columns to be displayed, etc.

Similar way, my SDK app should be called without any data extraction logic etc.  (like below code).

if (e.Key == Key.F4)
{
	IInstanceHost child = theHost.CreateDialog();

	BrowseControl bc = new BrowseControl(child);
	bc.Field = "BANO";
	bc.AlternativeField = "";
	bc.BrowseVariant = "";
	bc.KeyFields = new String[] { "LMCONO","LMITNO","LMBANO" };
	bc.KeyValues = new String[] { "0", "" };
	bc.SearchText = txtUser.Text;
	//child.HostContent = bc;
	if (bc.ShowDialog().Value)
	{
		txtUser.Text = bc.SearchText;
	}
	
	
}
        

 

Solution

imageIn my solution, I’ve used CRS990MI program and its transactions to encapsulate data extraction from the developer. This MI Program will works based on defined browse definitions in MNS185 program.

The Transactions InitBrowse & LstBrowse are actually doing the work. You will understand this when we talk about the C#/WPF code. But for now, for your quick information, I summarized it as below.

  1. InitBrowse – Returns the browse definition of the search field with the columns headings. As in the above code , if you are going to search BANO (lot number ) , first we want to know what are the keys , key positions in order to get the BANO value. That is CONO (company) & ITNO(Item Number).  Likewise, InitBrowse API provides us these metadata.
  2. LstBrowse – Gets data for the given search field (BANO) along with meta information from InitBrowse API.

In the next post (Part 2) I’m going to explain the C#/WPF Code.

Dec 6, 2016

Read Profile Settings from ISO SDK App

Background

Accessing  Web Services, external data sources from a SDK app is common like other technologies do. To store these access points, parameters etc. can be done in various ways. In a .net application common scenario is store then in the .config file or setting file. Why we want to do like this is, avoid hassles of deployment. When ISO SDK application is considered, we can achieve same thing by using .manifest file.

Problem

I need to get database connection string from the M3 profile.

Solution

  1. Using Profile Editor, add a setting to store database connection string. For this example, I’m going to use setting name as “DbConnection”.
    image
  2. Use the following code to extract above information.
    txtDBConStr.Text= ApplicationServices.SystemProfile.GetProperty("M3", "SDKApp", "DbConnection");
    

Sep 5, 2016

MEC: How to Set Message Counter for EDI Message


When you sending/creating EDI messages it is necessary to include unique message interchange number. This is to ensure each message that we are sending is unique.

In EANCOM/EDIFACT

Element 0020 of UNB segment:
UNB+UNOA:4+xxxxxxx:14+xxxxxx+20160905:0831+00000000000057+    +ORDERS++1'

In X12

Element ISA13 of ISA segment:
ISA*00* *00* *ZZ*167520391 *ZZ*39319445 *991201*1248*U*00200*000000001*0*P*>

This number need to be persistent. The middleware we are using for EDI transformation should cater this requirement. I used MS-BizTalk  Server for two EDI projects, which cater the same. (just by a configuration)

M3 e-Collaborator (MEC) does the same thing in a different way. In the MEC database (e.g. MEC_Storage_TST) has a table (UTIL_Message_Counters) for this purpose.

Table structure is like this:

image

Note 1: To be able to use this class you must first create this table (use the SQL script MeC_Utilities_db_script.sql).

You don’t have to enter a record or write code to save/get data. Instead, you have to write 2 lines of java code in your mapper to get the Value. ( Unique Message Interchange Number)

Note 2: Values in Key fields are case sensitive.

Steps:

  1. Initialize the message counter for the map.
    myMap is reference to the Map.
    MessageCounter mc = new MessageCounter(myMap);
    
  2. Get a new counter value using one of 3 overloads

    /*
    * getNewValue(String counterId)
    * counterID = Choose suitable name (max 20 chars)
    *
    * Returns new counter for the map
    */
     String newVal = mc.getNewValue("MsgCounter");
    

    Or
    /*
    * getNewValue(String counterId, int keyFields);
    * counterID = Choose suitable name (max 20 chars)
    *
    * Returns new counter for the map AND parnter ID
    */
     String newVal = mc.getNewValue("MsgCounter",mc.MAP_NAME + mc.PARTNER_ID);
    

    Or
    /*
    * getNewValue(String counterId, int keyFields, String cono, String divi, String date) 
    * counterID = Choose suitable name (max 20 chars)
    *
    * Returns new counter for the map AND parnter ID AND cono AND divi AND date.
    * you can omit cono and divi by setting null 
    * below code resets the counter for each day (format CCYYMMDD).
    */
     String newVal = mc.getNewValue("MsgCounter",mc.MAP_NAME + mc.PARTNER_ID, null, null, DATE);
    

If, everything OK, you will return the new counter other wise –1.

If you look at the table (UTIL_Message_Counters) , a record has been added and value will be incremented each time when getNewValue() is called.

image

MEC: How to Set Message Counter for EDI Message

When you sending/creating EDI messages it is necessary to include unique message interchange number. This is to ensure each message that we ...