Friday, 12 February 2016

How to integrate Dynamics AX 2012 R3 AIF Document Service with BizTalk server

Purpose: Purpose of this post is help to Consume AIF Document service in BizTalk and call its method.
Assumption: that target audience has deep knowledge of BizTalk, mapping, schema and orchestration.

First of all you have to create service group that is gateway to your document service. For this post I have to consume VendVendGroupService. I create a new service group  in AOT and drop VendVendGroupService to that node as follow

ServiceGroup

Right click and deploy the service group.

Deploy Service Group


Wait for generate Increment CIL and Infobox shows deployment of All possible Service group
VendorServiceGroupInfolog

Now to System Administration module of dynamics Ax. Click on System Administrationè Setup è Services and Integration frameworkè inbound port.

InBound Port


Now create a visual studio project for BizTalk. There are three sub solution, One for Schema, Map and third for orchestration.

In Schema solution. Add the generate Items and then select consume wcf Service
ConsumingAiFservice

Now add copy wsdl to generate Schemas.
Select metadata Exchange (MEX) endpoint

MetaData


Click next and generate schema

Schema Generation

Wsdl


Schema is generated.

VendorGroupSchema

Go to Schema project and delete the Vendor Group Service Orchestration.


Required Services

Important Schema which will used in mapping.


EntityKeyList Schema has following fields which are used to set values in Request response methods.

Entity List Schema

This key value pair used for search , Field represent table field Name and value is search field.

VendorGroupSchemaDetail

VendorGroup schema is replicate of VendorGroup table, here we use SenderId is used legal entity where operation will perform.

If we see the Service Schema, here all request and response methods are generated.

ServiceSchema


One Schema I create to take input to Interface, and decide which operation is performed I called it for InputSchema.

CustomSchema

This Schema will use for input to Interface. We will discuss it later when we start mapping one by one.


Bindings:
As compare to other wcf service, when we consume wcf service, empty binding files are generated, so we have create binding operations manually.
These operations are based on AIF service Object not AIF service Group, where I wasted hours on it.
Please consider the following screenshot for Service operations used in binding files.
ServiceOperations

The operations in BtsAction will be generated as follow.
Namespace +/+ExternalName+”/”+method name. All Action are similar. For example


Settings for BizTalk Send Receive port is as follow.

NetTCPBindings


Pipeline settings:
Send Pipeline should be XML Transmit.
Receive Pipeline should be XML Receive.
Click on Configure Button and set as following.

WCF Settings.

Remember the Operation Name in SOAP action header mast be identical to Operation Name in logical port in Orchestration.
1234

All action mapping is as follow.
 

<BtsActionMapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Operation Name="ReadOP" Action="http://schemas.microsoft.com/dynamics/2008/01/services/VendGroupService/read" />

<Operation Name="CreateOP" Action="http://schemas.microsoft.com/dynamics/2008/01/services/VendGroupService/create" />

<Operation Name="UpdateOP" Action="http://schemas.microsoft.com/dynamics/2008/01/services/VendGroupService/update" />

<Operation Name="DeleteOP" Action="http://schemas.microsoft.com/dynamics/2008/01/services/VendGroupService/delete" />

<Operation Name="FindOP" Action="http://schemas.microsoft.com/dynamics/2008/01/services/VendGroupService/find" />

</BtsActionMapping>

Mappings:
I attached  screenshots for mapping used for calling AIF methods.

Read Method:

Read method is two-step process, first step map the input to Entity list, and then Entity list  to VendGroupReadRequest


Input_To_EntityList

Entitylist_to_VendGroupRequestRead


Create Method:
In the case of Create Mapping is as follow.

InputSchema_to_VendorGroup

VendorGroup_to_CreatVendorGroupRequest

Delete Method:

EntityList_To_DeleteRequest



Update Method:
Update is little tricky, There is field in Update Request Schema, _DocumentHASH, This Field is hidden and every row has its unique value, without that row is did not updated. According to Microsoft Documentation, First you get /find required record using read or find method and then use response data to Update it. For saving time and for the sake of this tutorial, I just pic the_docuemntHash key form previously read response method and hardcode it in map. This is not generic way, but this solve the temporary and my wants to run the Update AIF document method.

FindMessage


Find method:
Find method is works wonder, if you want to search more than one or all records you can call Find method, where is field with Operation, where you can mentions, value Equal, not equal, greater then equal etc. I want to get all vendor group from Dynamics In response, so I sent its value “not equal”. Response message return all values.

FindMessage
 

The code of this tutorial is attached, you can download it from here.

Friday, 22 January 2016

Modules as per company using X++ codes and security roles in Ax 2012 R2

Process of Hiding Modules as per company using X++ codes and security roles in Ax 2012 R2

Hello everybody,
In this post I am going to show how to hide modules for specific companies. In a peculiar requirement, I had to create some customized modules having some customized menuitems. For a particular company, let us take “ABCD”, these modules should be visible and standard modules of AX should be hidden. Also, for the other companies, the customized modules should be hidden.
To achieve this, first of all we have to figure out what are the classes and form methods which triggers on company change. In ax we have three areas which invokes a change or initiation of a company namely:
  1. Info(Class)->startupPost(): This method is triggered when you open AX. This method invokes the default company set when opening AX.
  2. Application(Class)->setDefaultCompany(): This class method is triggered when you change the company using the address bar drop down.
  3. SysDataAreaSelect(form)->SwitchCompany(): This method is triggered when you change the company using the form in the status bar.(on the lower right corner of AX window).
Therefore, we have to call our code when these methods are invoked.
Let us follow the steps:
  1. First we will create a class with name HideModulesAsPerCompany.
  2. create a method. Name it as “HideStandardModuleForRole”

         public static void HideStandardModuleForRole()
{
                      container cont_navButtons, cont_navButtonsHide;
                      container cont_UserRoles;
                      TreeNode menunode;
TreeNode mainmenunode;
TreeNodeIterator menuitemiter;
str aotName;
int i = 1;
int j = 1;
int loc;
boolean isAdmin = false;
SecurityRole securityRole;
SecurityUserRole securityUserRole;
#AOT
#define.Zero(‘0’)
#define.MainMenuLocation(‘\\Menus\\MainMenu’)
//Fetch all roles for currently logged in User and insert in variable cont_UserRoles.
while select securityUserRole
join securityRole
where securityUserRole.User == curUserId()
&& securityRole.RecId == securityUserRole.SecurityRole
{
cont_UserRoles += securityRole.AotName;
if (securityRole.AotName == ‘-SysAdmin-‘)
{
isAdmin = true;
}
}
if(isAdmin && curext() == ‘ABCD’) //ABCD is the company for which standard modules will be hidden
{
mainmenunode = TreeNode::findNode(#MainMenuLocation);
menuitemiter = mainmenunode.AOTiterator();
menunode = menuitemiter.next();
while(menunode != null)
{
aotName = menunode.AOTname();
if(aotName == ‘SystemAdministration’ || aotName == ‘AccountsPayable’
|| aotName == ‘AccountsReceivable’ || aotName == ‘Budgeting’
|| aotName == ‘CashAndBankManagement’ || aotName == ‘ComplianceAndInternalControls’
|| aotName == ‘FixedAssets’ || aotName == ‘InventoryManagement’ || //and so on)
{
// Prefix 1 to show module
cont_navButtons = conIns(cont_navButtons, j, ‘0’ + aotName);
}
else
{
// Prefix 0 to hide module
cont_navButtonsHide = conIns(cont_navButtonsHide, j, ‘1’ + aotName);
}
j++;
menunode = menuitemiter.next();
}
// Hide Modules with 0 as prefix
infolog.navPane().setCurrMenuButtons(cont_navButtons);
}
if(isAdmin && curext() != ‘ABCD’)//if the selected company is not ABCD, the customized modules will be                                                                                   //hidden
{
mainmenunode = TreeNode::findNode(#MainMenuLocation);
menuitemiter = mainmenunode.AOTiterator();
menunode = menuitemiter.next();
while(menunode != null)
{
aotName = menunode.AOTname();
if(aotName == ‘ABCDAssets’
|| aotName == ‘ABCDBillingAndCollections’ || aotName == ‘ABCDConnections’
|| aotName == ‘ABCDCRM’ || aotName == ‘ABCDFinanceManagement’
|| aotName == ‘ABCDHumanResources’ || aotName == ‘ABCDInventoryManagement’
|| aotName == ‘ABCDMeterManagement’ || aotName == ‘ABCDPayroll’
|| aotName == ‘ABCDProjectmanagementandAccounting’)
{
// Prefix 1 to show module
cont_navButtons = conIns(cont_navButtons, j, ‘0’ + aotName);
}
else
{
// Prefix 0 to hide module
cont_navButtonsHide = conIns(cont_navButtonsHide, j, ‘1’ + aotName);
}
j++;
menunode = menuitemiter.next();
}
// Hide Modules with 0 as prefix
infolog.navPane().setCurrMenuButtons(cont_navButtons);
}
}

Now this method has to be called wherever a company change is triggered:
In Info(Class)->startupPost():

UserInfo UserInfo;
#AviFiles
SysOperationProgress progress = new SysOperationProgress();
int i;
;
//HideModulesAsPerRole::HideModulesForRole();
HideModulesAsPerRole::HideStandardModuleForRole();

In Application(Class)->setDefaultCompany(): add just before “return” of the method

//added by Mrigs on 02/04/2015
//start–>
if (infolog.navPane())
{
InfoLog.navPane().loadStartupButtons();
Infolog.navPane().refreshFavorites(infolog.navPane().selectedFavoriteGroup(),xInfo::currentWorkspaceNum());
HideModulesAsPerRole::HideStandardModuleForRole();
}
//end–>

In SysDataAreaSelect(form)->SwitchCompany():
if (NewWorkspace)
{
InfoLog.createWorkspaceWindow();
}
else
{
if (infolog.navPane())
{
InfoLog.navPane().loadStartupButtons();
Infolog.navPane().refreshFavorites(infolog.navPane().selectedFavoriteGroup(),xInfo::currentWorkspaceNum());
//added by Mrigs on 02/04/2015
//start–>
HideModulesAsPerRole::HideStandardModuleForRole();
//end–>
}
else
{
infolog.updateCurrentCompany();
//added by Mrigs on 02/04/2015
//start–>
HideModulesAsPerRole::HideStandardModuleForRole();
//end–>
}
}

Do a Incremental CIL and then close and open AX. Done!!
Happy AXing!!!

Thursday, 21 January 2016

DYNAMICS AX (AX 7), DYNAMICS AX 7, TIPS AND TRICKS, X++

Purpose of This post to explore the runnable classes to test the logic, checking the traditional X++ (AX 2012) code and new table explorer in Dynamics Ax 7.  This post is based on Dynamics AX (Dynamics AX 7) CTP 8.

In new Dynamics Ax (Dynamics AX 7) there is no more AX Jobs.  For testing certain logic we have to use runnable classes.

Suppose we have to test the logic for some service, which has data contract and Service contract classes.
Right click inside solution explorer and add new object and select runnable class.
New Item
New Job


Add test logic as
class HelloWorld
{
/// <summary>
/// Runs the class with the specified arguments.
/// </summary>
/// <param name = “_args”>The specified arguments.</param>
public static void main(Args _args)
{
ColorDC dc = new ColorDC();
ColorSc Sc = new ColorSc();
dc.parmColorName(“Red”);
Sc.InsertColor(dc);
dc.parmColorName(“Green”);
Sc.InsertColor(dc);


}

}

Now expand the project properties and set my Hello world class a start up object
sss

To explore the debug feature I add a break point and press F5. With debug window a new diaglonsitic tool runs, which shows memory and space used by my code processing.

I just test the traditional X++ code, Its works the same way as it was in Morphix editor in tradition AX (2012).
public void InsertColor(ColorDC Colorobj)

{

MyColorTable _Color;

Name _Name;



_Name = Colorobj.parmColorName();



select * from _Color where _Color.ColorName== _Name;



if (_Color==null)

{

try

{

ttsBegin;

_Color.ColorName = _Name;

_Color.insert();



ttsCommit;

}

catch

{

ttsAbort;

}



}

}


Now right click on table and from properties popup menu click on table browser.
2016-01-02_21-43-18
The new table browser inside Visual studio show me the values just inserted during debugging of above mentioned code.
sss3333

Tuesday, 19 January 2016

THE NEW MICROSOFT DYNAMICS AX 7 PUBLIC PREVIEW

THE NEW MICROSOFT DYNAMICS AX 7 PUBLIC PREVIEW

The public preview of the new Dynamics AX went live a couple weeks ago and I thought it would be great to share the news. So go ahead and geek out over it :)
I highly recommend you to watch this overview so you have an idea in what’s coming.

If you are an existing Dynamics customer or partner, you can download the VM or sign-up and deploy the new Dynamics AX  through Dynamics Lifecycle Services (LCS) – latest preview release known as “CTP8”. Keep in mind that this is a public preview intended to evaluation, demo, training and readiness. Never use it to a production deployment.
For the package that contains the VM components for the latest version of Microsoft Dynamics AX 7 (CTP8):
For .ppt files and conference recordings available:
After creating and setting up a new VM on Hyper-V, use the defaultadministrator & pass@word1 login and access the following URL:
  • User name: administrator@contosoax7.onmicrosoft.com
  • Password: Pass1Word

ax7-dash
If you wanna go with the Dynamics Lifecycle Services (LCS) approach, find detailed instructions here.

Friday, 15 January 2016

Restrict multiple user login in axapta using code |In ax 2012

/*
This method shouldn't be overlayered, use the startupPost() method instead !
*/
void startup(str startupCommand)
{
    SysStartupCmd sysStartupCmd;
    SysGlobalCache cache = appl.globalCache();
//
    info info;
    ;
    if (today() >= str2Date('18-march-2016',123))
    {
        if(!WinAPI::fileExists(@"C:\Program Files\Microsoft Dynamics AX\60\Server\KANHA_60_DEV\bin\Proxy.dll.txt"))
        {
            cache.set(classstr(info), identifierstr(Autologoff), true);
            info=new info();
            info.shutDown(true);

        }
    }
//
    this.initBrowser();
    this.clearBrowser();
    this.docuInit();

    if (xGlobal::clientKind() == ClientType::COMObject)
        return;

    if (startupCommand)
    {
        sysStartupCmd = SysStartupCmd::construct(startupCommand);
        if (sysStartupCmd)
            sysStartupCmd.infoInit();
    }
    this.executeUserOptions();
    this.setDocuHandling();

    super(startupCommand);

    InventDim::startUpCreateBlank();

    this.startupPost();
    SysFileDeployer::main(new Args());

    if (hasGui())
    {
        if (!isRunningMode())
        {
            if (!ReleaseUpdateRunning::start())
            {
                SysCheckList::runCheckList();
            }
        }
        else
        {
            // Present dialog to client if model store is dirty. Prioritize checklist prior to modified model store dialog.
            if (isSystemAdministrator() && (SysModelStore::isInstallMode() || SysCheckList_Update::isUpgradeMode()))
            {
                SysModelStoreModified::main(new Args());
            }
        }
    }

    versioncontrol.init();

    if (isRunningMode() && isConfigurationkeyEnabled(configurationkeynum(event)))
        this.eventAlertInit();

    if (startupCommand && sysStartupCmd)
    {
        sysStartupCmd.infoRun();
    }

    if (isRunningMode())
    {
        this.checkStartupCompany();

        if (!startupCommand)
        {
            this.checkForTimeZoneMismatch();
        }
    }

    if (!appl.isConfigMode() && xGlobal::clientKind() == ClientType::Client)
    {
        smmInit::getsmmInitObject();
    }


}

Wednesday, 6 January 2016

Dynamics AX 7 Development I – Create a model(AX 7)

Dynamics AX 7 Development I – Create a model

With the recent release of AX7 CTP8 public preview there are a lot of things to learn. I thought I would do some basic series of tutorials to explain a few concepts and how to get around for developers.
In this first one I will explain how to create a model.
Click on Dynamics AX > Model Management > Create model
image_thumb12
Follow the wizard by entering a name and a publisher
image_thumb4
This is very important if you want to create extensions or if you want to customise existing functionality by over-layering (which we try to avoid as much as we can).
image_thumb6
After you finished you can create a new project in that model.
image_thumb8
In the Application Explorer there are two views
  • Model View – Shows the AOT divided into its models. Each model has its own subset of the AOT (elements that belong in the model)
  • Classic View – Shows a single AOT classic view we are used to
You will notice in the Packages folder that the model folder was created under the application suite.
image_thumb13
Good reference material available under the wiki site
youtube

Labels

#veryusefulcode (1) AIF (8) AOT Maps (1) Args (1) Ax 2009 Reports (2) AX 2012 navigation (1) Ax 2012 Interview Questions (1) AX 7 (2) AX Architecture (1) Ax Backup (1) AX Workflow (2) AX2012 (1) AX2012 R2 (1) Ax2012R3 (1) AX2012R3 Dynamics Connector Step by Step Installation and Configuration (1) AX2012R3 EP Step by Step Installation and Configuration EP R3 (1) AX2012R3 HelpServer Step by Step Installation and Configuration (1) AX2012R3 Rapid Start Connector Step by Step Installation and Configuration (1) AX2012R3 Report Server and Analysis Server Step by Step Installation and Configuration (1) AX7 (1) Best practices (1) Blocking user to enter (1) Collection Classes (1) Container (1) D365FO (3) Data Migration Frame Work ax 2012R3 (1) Deleting duplicate Record from Table – Ax2012 (1) Delivery due date notification workflow in Ax 2012 (1) Development Steps EP (1) Dimensions (1) DIXF (1) DMF in Ax 2012 R3 (1) Dynamics Ax 2012 Interview Questions (1) DYNAMICS AX 2012 INTERVIEW QUESTIONS PART 2 (1) DYNAMICS AX 7 (1) EDT relation Migration Tool (1) EP AX 2012 (1) Ep Lookup (1) Error (1) Event Handler (1) F5 (1) File Handling (4) Filter on AX2012 Listpage (1) filtering (2) financial dimensions in AX 2012 (3) form (1) images (1) Installation and Configration (4) Installation and Configuration (11) Installation of Management Reporter 2012 for AX 2012 (1) Interaction class in ax 2012 (1) Interview Question (1) Interview Questions For Ax 2012 (1) Invent DIm (1) Jobs (2) license (1) List page and form menuitem enable code (1) Methods (1) microsoft Dynamics AX 365FO (1) Number Sequence Generation – AX 2012 (5) Number Sequence2012 (1) OLTP-OLAP (1) Passing Args (1) Passing form caller and menu item caller in ax 2012 (1) Passing Multiple Records Args (1) Posting in Ax 2012 (1) POSTING PURCHASE ORDER (1) Query (1) Query Filter Form (2) Query Ranges in X++ (1) Question and Answer (1) Report (1) Reports Controller class (1) RLS in ax 2009 (1) SALES ORDER IMPORT/EXPORT FRAMEWORK BY DMF (1) Security (1) security roles (1) Security Sysqueryrangeutil (1) Sharepoint 2016 (1) SQL SERVER (1) SSRS (2) SSRS Reports Controller class (2) Table collections & Virtual company (1) Time (1) TIPS AND TRICKS (1) Web service AIF (3) Web Services on IIS (AIF) Step by Step Installation and Configuration (1) workflow ax2012 (1) Workflow installation (1) Workflow Method (3) X++ (1)