Monday, 28 December 2015

Filtering drop down list based on another drop down Ax 2012

Filtering drop down list based on another drop down

Hello All,
I've come across a scenario where I have to select a value from a drop down and based on that value I have to fill another drop down. After I did it, I though it will be usefull for others as well. So, I am posting it here.
So, Here is what we need to do.
First create a contract class as (I am hoping) we already know. Here I am using an example of Customer which will be filtered by Customer group. The code of class declaration will be:

[
DataContractAttribute
]
public class custReportContract

{
    CustGroupId custGroup;
    AccountNum cust;

}

Now creating 2 new methods for getting and setting these parameters. 1 for cust group
[
DataMemberAttribute('CustGroup'),
SysOperationLabelAttribute(literalstr("@SYS11904"))
]
public CustGroupId parmCustGroup(CustGroupId _custGroup= custGroup)
{
    custGroup = _custGroup;
    return custGroup;
}
And the other one for customer
[
DataMemberAttribute('Cust'),
SysOperationLabelAttribute(literalstr("@SYS313797"))
]
public AccountNum parmCust(AccountNum _cust= cust)
{
    cust = _cust;
    return cust;
}

Your screen will look like this:



Nothing new in it. We all know it (I guess). Moving forward and now we are creating another class for UI builder.
Create this new class and on the class declaration method, type the following code
public class custReportUIBuilder extends SysOperationAutomaticUIBuilder
{
}

your screen will look like this
Now we have to create 2 dialog boxes. 1 for customer group and customer each. To do this type the following code.
    DialogField dialogCustGroup;
    DialogField dialogCust;

We also have to define our contract class here, so declare the contract class
    custReportContract contract;

so, the class declaration method will look like this:
public class custReportUIBuilder extends SysOperationAutomaticUIBuilder
{
    DialogField dialogCustGroup;
    DialogField dialogCust;

    custReportContract contract;
}
Now, we have to draw the dialog boxes. For this reason, we will create another method of build and type the following code In it.
public void build()
{
    Dialog      dialogLocal = this.dialog();
    custReportContract contract = this.dataContractObject();
   
    dialogLocal.addGroup("Customer");
    this.addDialogField(methodStr(custReportContract,parmCustGroup), contract);
    this.addDialogField(methodStr(custReportContract,parmCust), contract);

}

Now that we created the build method, let’s move into filling the cust group drop down with the table CustGroup. We’ll create another method for lookup and type the following code in it.
public void lookupCustGroup(FormStringControl _control)
{
    Query query = new Query();
    SysTableLookup sysTablelookup;

    sysTablelookup =SysTableLookup::newParameters(tableNum(CustGroup),_control);
    sysTablelookup.addLookupfield(fieldNum(CustGroup,CustGroup));
    sysTablelookup.addLookupfield(fieldnum(CustGroup,Name));

    query.addDataSource(tableNum(CustGroup));

    sysTablelookup.parmQuery(query);
    sysTablelookup.performFormLookup();
}
We need to create another method so that when user selects any record from cust group drop down, the customer drop down will be filtered with that value, for this reason we will select the modified event of cust group and then type the code:
public boolean custGroupModified(FormStringControl _control)
{
    dialogCustGroup.value(_control.valueStr());
    dialogCust.value('');
    return true
}

Ok now we will create the lookup method for customer. Here is the code
public void lookupCust(FormStringControl _control)
{
    Query query = new Query();
    SysTableLookup sysTablelookup;

    sysTablelookup =SysTableLookup::newParameters(tableNum(CustTable),_control);
    sysTablelookup.addLookupfield(fieldNum(CustTable,AccountNum));
    sysTablelookup.addLookupfield(fieldnum(CustTable,Party));

    query.addDataSource(tableNum(CustTable));
    query.dataSourceTable(tableNum(CustTable)).addRange(fieldNum(CustTable, CustGroup)).value(dialogCustGroup.value());
   
    sysTablelookup.parmQuery(query);
    sysTablelookup.performFormLookup();
}

Note that I filtered the cust query with the value selected in cust group drop down
    query.dataSourceTable(tableNum(CustTable)).addRange(fieldNum(CustTable, CustGroup)).value(dialogCustGroup.value());

we have almost completed our code for lookups and their filters. Now we will bind our dialog boxes with the contract class params and also override the modified method of cust group with the method we just wrote. To do this we will create another method for postBuild. Here we go
public void postBuild()
{
    super();
    // From binding info, get the dialog field for racecode attribute and add button
    dialogCustGroup = this.bindInfo().getDialogField(
                         this.dataContractObject(),
                         methodStr(custReportContract,parmCustGroup));
    if (dialogCustGroup)
    {
     dialogCustGroup.lookupButton(2);
    }

    // register override method for lookup cust Group
    dialogCustGroup.registerOverrideMethod(methodStr(FormStringControl, lookup),methodStr(custReportUIBuilder, lookupCustGroup), this);
    // register override method for modified
    dialogCustGroup.registerOverrideMethod(methodStr(FormStringControl, modified),methodStr(custReportUIBuilder, custGroupModified), this);
   
    //binding info for customer drop down
    dialogCust = this.bindInfo().getDialogField(
                         this.dataContractObject(),
                         methodStr(custReportContract,parmCust));
   
    // register override method for lookup customer
    dialogCust.registerOverrideMethod(methodStr(FormStringControl, lookup),methodStr(custReportUIBuilder, lookupCust), this);
   
    if (dialogCust)
    {
        dialogCust.lookupButton(2);
    }

}

We may have to create some other methods as well in order to functioning your code properly. They are getFromDialog, initializeFields and postRun. Create three new methods each for getFromDialog, initializeFields and postRun and copy the following code to them
public void getFromDialog()
{
    contract = this.dataContractObject();
    super();
}

public void initializeFields()
{
    contract = this.dataContractObject();
}

public void postRun()
{
    super();
}

We are done. But wait one last thing, open your contract class and in the class declaration method, reference your UI builder class just below the DataContractAttribute. Your code will become:
[
    DataContractAttribute,
    SysOperationContractProcessingAttribute(classStr(custReportUIBuilder))
]
public class custReportContract

{
    CustGroupId custGroup;
    AccountNum cust;

}



query.dataSourceTable(tableNum(HRMPayElements)).addRange(fieldNum(HRMPayElements, type)).value(queryValue(HRMPay_Type::Deduction))

 We are now done. In this post we have tried to filter our single value drop down based on another drop down. In the next post we will try to repeat the same process for multi value drop down list.
Thank you all
Here is the screen shot of what we just did


Thursday, 17 December 2015

How to enable debugging on Server

How to enable debugging on Server



In most of the cases, our X++ classes have to be executing within the server (AOS). In a default deployment we're not able to debug server code.


To have this Dynamics AX feature, we must enable it in ‘Microsoft Dynamics AX Server Configuration Utility’ tool (within 'Administrative Tools' menu).

You may need to use the Manage button to Create a new Configuration. Then, on the first tab, Application Object Server, make sure that the check box option "Enable breakpoints to debug X++ code running on this server" is checked.

There is a direct registry key to do it, too. (but this way may be not supported):


REGEDIT4



[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dynamics Server\4.0\01\ Original (installed configuration)]

"xppdebug"="1"

Tuesday, 8 December 2015

Configure Workflows to Include PDF Attachments in Microsoft Dynamics AX 2012

Configure Workflows to Include PDF Attachments in Microsoft Dynamics AX 2012

Written By: Ivan ColeDate: 01 May 2015
UXC Eclipse Chief Technology Officer, Ivan Cole, explains how to configure PDF Attachments in Email messages in Microsoft Dynamics AX 2012.
​In my previous blog explaining in detail how to configure eMail approvals via workflow messages we referenced a parameter to include email attachments in workflow email messages. 

Using this feature you can configure your workflows to include PDF attachments from SSRS reports that exist in Dynamics AX.  This blog entry will walk through the steps to configure PDF attachments to workflow messages.
The good news is that once you have email approvals configured and working there are only a few additional things you need to configure in order to set what reports get attached to your workflow messages. The challenge however is making sure a report is available to print PRIOR to the document approval.  The best example is the Purchase Order workflow. 
When change tracking is turned on, purchase order documents cannot be printed until approved and confirmed. The report actually prints from the confirmation detail tables.  This is a control mechanism to prevent sending a printed PO to a vendor prior to appropriate approvals.  This means that in order for a PDF attachment report to be included in a workflow email a custom AX SSRS report must be developed first that is not restricted by workflow status. 
In this type of document example you would need to create a custom PO Workflow SSRS report so that details can be included in the attachments that are not available directly within the workflow message.  Following are the steps to configure attachments in workflow email messages.
In our first example we will use the Expense Report SSRS Report.  This example works out of the box since the Expense report can be printed from In-Review documents.

Workflow Parameters

In our previous blog we identified all of the steps to configure workflow emails for approvals using the Azure Service bus.  Although they are not directly related if you want the ability to include embedded Approve/Reject hyperlinks within the emails enter the Service bus base URL that will relay the Approval or Rejection from the workflow message.
 
The message should be in the following format:
 
[Your Service Bus Name].servicebus.windows.net/[eMail Relay Name]
 
 
From the System Administration, Setup, workflow, Workflow parameters menu enter the service bus URL and check the box to Add Attachments.
blog-ax-pdf-attachments-1.jpg

Once the workflow parameters are setup there is only one more step in order to include the PDF report attachment.  You can find the setup under System Administration, Windows Store, Windows Application Store Setup.

blog-ax-pdf-attachments-2.jpg

The windows application store setup window currently has only one menu on the left side windows pane for Approvals.  To associate the workflow find the applicable table in the list.  In our example we are navigating to and select the TrvDocumentApproval which is the Expense Report full document approval. 

blog-ax-pdf-attachments-3.jpg
 
Next select the report association tab.  This will allow the selection of an existing SSRS report available against that main table.  Click the drop down list to select the TrvExpense report.
 
blog-ax-pdf-attachments-4.jpg
 
Once the report is selected we are ready to test the expense report workflow.  We are using the standard workflow in the demo data setup, however we updated our Placeholders to include the Approve and Reject hyperlinks.
 
blog-ax-pdf-attachments-5.jpg
 

Batch Job Setup 

In order to initiate the workflow, attach the related PDF if configured and send the email notification we need to setup three batch jobs. The first one is for workflow.  For the purpose of this test we will simulate this using the Tutorial_WorkflowProcessor demo form.  On the demo image you can navigate to Tools, Options, and Workflow Processor. Click start to begin the process.
 
blog-ax-pdf-attachments-6.jpg

Next you need to run the eMail Attachments batch job. This job searches for workflow that have attachments required and runs the report and links it to the workflow table pending the send.  You must also run the eMail processing batch job so that the emails are sent from the workflows and alerts that are configured and ready to be processed.
 
blog-ax-pdf-attachments-7.jpg

Make sure to map your batch job to the email template that is configured for your workflow.
 
blog-ax-pdf-attachments-8.jpg

blog-ax-pdf-attachments-9.jpg

blog-ax-pdf-attachments-10.jpg

Once the Workflow Processor is running as well as the two batch jobs for eMail attachments and mail notifications are running we can submit an expense report to test this configuration.

Expense Report Submit and Test

You create and submit expense reports from Enterprise Portal Employee Services.
 
blog-ax-pdf-attachments-11.jpg
 
Create a new timesheet with a few lines for our test.
 
blog-ax-pdf-attachments-12.jpg
blog-ax-pdf-attachments-13.jpg

You will start to see notifications as the batch jobs pick up new workflow items to send.

blog-ax-pdf-attachments-14.jpg

You will then receive the email notification with the PDF Report as an attachment.
 
blog-ax-pdf-attachments-15.jpg

blog-ax-pdf-attachments-16.jpg

This is a standard email message and can be opened across multiple devices including iPhone, Android and Windows phones.  And of course any email client.

blog-ax-pdf-attachments-17.jpg
blog-ax-pdf-attachments-18.jpg
 
Having the attachment available on the mobile device gives the reviewer more visibility into the details of the transaction without the need to login to the Dynamics AX rich client 

Purchase Order Attachment Example

As mentioned in the beginning of this article in order to attach a PDF report to a Purchase Order workflow email a custom report must be developed.  This is because the PO report cannot be printed until the PO is approved and confirmed, not before.  There are specific customizations that must be made for a PO draft report to work.  First we had to allow a PO draft report to print, independent of the workflow status. 
 
Also, by default, the AX PDF workflow attachment feature only allows you to include a standard SSRS report based on a query.  The purchase order printed form has a lot of advanced functionality such as charges and totals that are best calculated on the fly which makes using a query as the source impossible or highly impractical.  To make this work a custom data provider was developed.  We also needed to make a change to the system class the called the report attachment that would support launching the report using a custom data provider rather than a standard report based on a query.
 
The technical details behind how to make these modifications are not in scope for this article.  However, anyone interested in this type of functionality should email us atinfo@uxceclipse.com.
 
To make using the report for testing simple we added a menu and button on the Purchase Orders list page for the draft report.  You can see from this example it can print even though there is a Draft approval status. 
 
blog-ax-pdf-attachments-19.jpg

The actual Purchase Order Print functions are grayed out since the PO is not yet approved and confirmed.
 
blog-ax-pdf-attachments-20.jpg
 
Once we submit the Purchase Order for approval, the same batch jobs are run to attach the Purchase Order to the email. 

Conclusion

Implementing eMail approvals for workflow in Dynamics AX is now a native feature that is available to implement in an easy and low cost way without the need for third party additional add-on products.  Understanding the functionality and installation steps will help make the implementation of this feature painless with the maximum benefit to AX users.  Having up-front knowledge about the scenarios that require customized reports will empower Dynamics AX 2012 users with a broader scope of practical usage that greatly improves the Dynamics AX workflow user experience.

Friday, 20 November 2015

Form Development from scratch Dynamics Ax 2012 R3 part 1

Consider a scenario where we are going to build small Hospital Admission System in Dynamics Ax 2012.  This Add-on is based on small database design based on


db


We divide this task into two posts
For this post, we are cover following points to develop this small add-on
  • Ax Project
  • Patient, Diagnostic and admission table.
  • Simple list page for diagnostic table.
  • Entry form for Patient table (Detail form).
  • Parent Master detail form based on Patient ,Diagnostic table and patient.
  • List page for Patient table.
  • Integrate Patient List page with Patient Detail form.



AX Project:

AX Project for collecting Ax artifacts in single location.
When we create any Ax object they have to create under certain node. For example tables, forms, Classes, menu all stored in their respected node.
In Dynamics Ax we can create a Project which is not more the logical grouping of all Ax artifacts.
In these project, we create object groups and then placed our required object either drag and drop from AOT or create them here.
Advantages of Projects are
  • Logical grouping, it’s easier to locate required artifacts one location.
  • When we export project as Xpo, All objects are exported as single XPO.
  • We can export whole project into model, all object in project moved from one model to other model in single steps.


Lets make a new project

From top menu Click on View=> tools=> Project
Ax Project
Following Screen will open
Shared and Private Project
Right click on Shared folder and create a Project and renamed it to HospitalManagementSystem.

Hospital Management System Menu

New Project Managment

Click on Project and open it. Right click on it new => Group to create new groups

Details
For example we create Form group and set it Name and Project Group type to forms
Project name

Now Project is look like
Project Details

Similarly create other groups.
menu


Table structure design.


db
So our table structure look like
Diagnostic table
ColumnExtended data TypePrimitive Data Type
DiagNoDiagnosticNumberStr10
DescDescription
CostAmountCurReal


Patient table
ColumnExtended Data Type
PatNoPatientNumberStr 20
FnameName
LNameName
BirthDateBirthDate
AddressT_AddressStr 20
CityT_CityStr20
StateT_StateStr20
ZipT_ZipStr20
GenderT_Gender


AdmissionsTable

ColumnExtended Data TypePrimitive Data TypeForeign Key
AdmitNoAdmissionNumberStr20
PatNOPatient NumberPatient table
Diag_codeDiagnosticnumber

Diagnostic table

AdminationdateFromDatedate
DischargeDateToDatedate
CoPayNotesNotes

First we create a extended data type required in three tables.
First one is DiagonisticNumber extended Data Type
Extended Data Type
Rename it and set its name as “DiagnosticNumber” and its string set its size to 10
ExtendedDataTypeSize
Similarly create all extended data type
List of Extended Data Type
Rest of we use out of the box extended Data Type
When you save any Extended Data Type, Ax ask for Synchronize database cancel it when all extended data Types created let it complete
DataBase Schyrni





In current example only gender is enum type, we create new base enum T_Gender instead of using out of box Gender enum.

Base enum menu
Create a new Enum and name it “T_Gender” t stands for training.

Right click on it and create a new element
Base Enum new Element


Set its name and label

SubType
Base Create one more element and it will look like
Base enum look like


Now create a click on tables group and right click and create a new table


Rename it to “DiagnosticTable”.
TableProperties

Now create a new field with Name “DiagNo” of string type and set its extended data type to “DiagnosticNumber”

FieldName
eeee

Similarly create all other fields in table
Diagnonstic

Now expand field Groups node in Table and Create a new Field group with Name “OverView”.
Overview
Drag all fields in it.
DiagnonsticDetial

Now want to make the Diagonistic and unique and make it primary key. For this right click and create unique index on it
DiagnonsticIndex
Rename it to DiagNoIx and set its AllowDuplicate Property to No and Alternate key to Yes
IndexDetails
Now drag DiagNo from fields node to DiagosticIdx.
Diagonisticss


Now right click on DiagnosticTable and set following Properties with newly created Index

DiagnonsticProperties

Perform same steps to create PaitentTable, create Index on “PatNo” similar way.
PatientTab

Create a new field group with overview and arrange field in a way that you want to see them in form
FieldsDetails

Create unique index on PatientNumber
PatientDetails
Similarly create AdmissionTable,
AdmissionTable


Now right click on Relation node in AdmissionTable and create a new relation and rename it to “PatientRelation” and sets its table property to “PatientTable”
PatientRelationDetails
Now Right click on relation click on new =>ForeignKey=>Single field AlternateKey based
AlterNativeField


A new field added against  relation, rename it to PatientNumber
PatientKey

Similarly create another key based DiagnosticTable
AdmissionTableWithRelation


Save and compile all table and synchronize each table.

Form development will be on next post

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)