Leader Board

Manage batch jobs AX 2012

After you create and schedule a batch job, you might want to check its status, review its history, or cancel it. The following sections describe some of the most common management tasks associated with batch jobs.

View and change the batch job status
The Batch Job list form provides a snapshot view of the current state of batch jobs. The list displays the progress and the status of running and completed jobs. It also displays any jobs that are scheduled to start soon.
You can change the status of a batch job by selecting the batch job in the list and then following these steps:
1. Click Functions, and then click Change Status.
2. In the Select New Status dialog box, select a new status for the job. For example, if the status is Waiting, you can temporarily remove the batch job from the waiting list by changing the status to Withhold.

Tip If a job exits with a status of Error/Ended and you want to rerun the job, change its status to Waiting. The job will automatically be picked up by the server for execution.

You can cancel a batch job by changing its status to Canceling. Tasks in the Waiting or Ready state are changed to Not Run; currently executing tasks are interrupted, and their status is changed to Canceled.

Control the maximum retries
If an AOS fails because of an infrastructure failure or a power outage while a batch task is executing, the batch framework has the built-in capability to retry tasks after the AOS is restarted. Any tasks that were left in an executing state, and that have not reached the maximum retry limit, are changed to the Ready state and will run shortly after the failure.

Tip If you create custom tasks and want to enable retries, design the task so that it is idempotent—that is, it can be executed multiple times without unexpected consequences.

You can modify the Maximum Retries attribute for each batch task on the General tab. By default, the value is set to 1; when the Actual Retries field on the Update tab exceeds the maximum number of retries, the batch task fails. When this happens, the recurrence that is set for the batch job is not honored, and the status of the batch job is set to either Success or Error.

Review the batch job history
You can view a history of all batch jobs that have finished running in the Batch Job History form at System Administration > Inquiries > Batch Job History. This form displays detailed information about the status of the jobs, including any messages encountered while the batch job was running.

You can also view the logs for each batch job as follows:
■ To view log information for an entire batch, select a batch job, and then click Log.
■ To view log information for individual tasks, select a batch job, and then click View Tasks. In the Batch History list form, select a task, and then click Log.

Tip In the batch job settings, you can specify when log information is written to the history tables: Always (the default), On Error, or Never. Use On Error or Never to save disk space for batch jobs that run constantly. This option is located on the General tab of the
Batch Job form.

Inside Dynamics AX 2012 Book

Manage batch execution AX 2012

The final step in implementing a batch job is to manage the execution process. Before a batch job can be executed on an AOS instance, you must configure the AOS instance as a batch server and set up the batch groups that tell the system which AOS instance should execute the job.
In addition to these initial configuration tasks, you’ll likely need to manage the batch tasks and jobs: checking status, reviewing history, and sometimes canceling a batch job. You’ll probably also need to debug a batch task at some point.

The following sections describe how to configure an AOS instance as a batch server and set up batch groups, and the next 2 posts will describe manage batch jobs and debug a batch task.

Configure the batch server
You can configure an AOS instance to be a batch server, including specifying when the batch server is available for processing and how many tasks it can run, by using the Server Configuration form.
The Server Configuration form is located at System Administration > Setup > System > Server Configuration.
Note that the first AOS instance is automatically designated as a batch server, but you can configure additional AOS instances manually as batch servers.

Tip Use multiple batch servers to enable parallel processing and increase processing throughput.

1. In the Server Configuration form, select a server in the left pane.
2. Select the Is Batch Server check box to enable batch processing on the server, as shown in Figure below.

image

3. On the Batch Server Schedule FastTab, click Add to enter a new schedule. Enter the maximum number of batch tasks that can be run on the AOS instance at one time. The server continues to pick up tasks from the queue until it reaches its maximum.
4. Enter a starting time in Start Time and an ending time in End Time to specify the time window in which the server processes batch jobs. Press Ctrl+N to enter an additional time window.

Tip It’s a good idea to exclude a server from batch processing when it is busy processing regular transactions. You can set server schedules so that each AOS instance is available for user traffic during the day and batch traffic overnight. Keep in mind that if the server
is running a task when its batch processing availability ends, the task continues running to completion. However, the server doesn’t pick up any more tasks from the queue.

Create a batch group
A batch group is a logical categorization of batch tasks that lets a user (typically a system administrator) determine which AOS instance runs the batch task. This section describes how to create a batch group so that it can be assigned to a specific server for execution. The first step is to create batch groups by using the Batch Group form at System Administration > Setup > Batch Group.

To create a batch group, press Ctrl+N in the Batch Group form, and then type a name and description for the batch group. The Batch Group form is shown in below

image

Note By default, the system contains an empty batch group that can’t be removed. This is a default batch group for tasks that are not explicitly assigned to a group.

After you create batch groups, assign each group to a server as follows:
1. In the Server Configuration form (shown in Figure below), click the Batch Server Groups FastTab.
The Selected Groups list shows the batch groups specified to run on the selected server.
2. In the Remaining Groups list, select a group, and then click the left arrow button to add this group to run on the selected server.

image

Note  you can assign each group to a server using Batch Servers in Batch Group form

Imparted from Inside Dynamics AX 2012 Book

Create and execute a batch job AX 2012

Microsoft Dynamics AX 2012 includes numerous batch jobs that perform operations such as generating reports, creating sales invoices, and processing journals. However, in several situations, organizations need to create their own batch jobs. The batch framework provides full flexibility in the types of jobs that you can create. This section walks you through the following steps, which are required for creating, executing, and managing a batch job:
1. Create a batch-executable class.
2. Create a batch job and define the execution schedule.

3. Configure a batch server and create a batch group. (It be will explained in another post)
4. Manage the batch job. (It be will explained in another post)

Create a batch-executable class

The first step in developing a batch job is to define a class that can be executed as a batch task. Many classes included with Microsoft Dynamics AX 2012 are already enabled for batch processing. You can also design a batch-executable class, as shown in the following example:

public class ExampleBatchTask extends RunBaseBatch


To run as a batch task, a class must implement the Batchable interface. The best way to implement the interface contract is to extend the RunBaseBatch abstract class, which provides much of the necessary
infrastructure for creating a batch-executable class. An alternative is to use the SysOperation framework, which provides additional advantages compared to extending the RunBaseBatch class. Will post more information about the SysOperation framework Later.

Table below describes the methods that must be implemented when you extend the RunBaseBatch class. The following sections describe these methods in more detail.

Method Description
run Contains the core logic for your batch task
pack Serializes the list of variables used in the class
unpack Deserializes the list of variables used in the class
canGoBatchJournal Determines whether the class appears in the Batch Task form


 

run method
You implement the core logic of your batch class in the run method. The run method is called by the batch framework for executing the task defined within it. You can run most of the X++ code in this method; however, there are some limitations on the operations that you can implement. For example, you can’t call any client logic or dialog boxes. However, you can still use the Infolog class. All Infolog and exception messages are captured when the batch class executes, and they are stored in the batch table. You can view these later in the Batch Job form or the Batch Job History form, both of which are located under System Administration > Inquiries > Batch Jobs.


Note If an error message is written to the Infolog, it does not mean that the task has failed; instead, an exception must be thrown to indicate the failure

pack and unpack methods

A class that extends RunBaseBatch must also implement the pack and unpack methods to enable the class to be serialized. When a batch task is created, its member variables are serialized by using the pack method and stored in the batch table. Later, when the batch server picks up the task for execution, it deserializes class member variables by using the unpack method. So it’s important to provide a correct list of the  variables that are necessary for class execution. If any member variable isn’t packable, then the class can’t be serialized and deserialized to the same state.
The following example shows the implementation of the pack and unpack methods:
public container pack()
{
                         return [#CurrentVersion,#CurrentList];
}
public boolean unpack(container _packedClass)
{
                        Version version = RunBase::getVersion(_packedClass);
                        switch (version)
                       {
                                  case #CurrentVersion:
                                                         [version,#CurrentList] = _packedClass;
                                                         break;
                                 default:
                                                        return false;
                     }
                     return true;
}


The #CurrentList and #CurrentVersion macros that are referenced in the preceding code must be defined in the class declaration. Using a macro simplifies the management of variables in the class. If you add or remove variables later, you can manage the list by modifying the macro. The #CurrentList macro holds a list of the class member variables to pack, as shown here:

#define.CurrentVersion(1)
#localmacro.CurrentList
               methodVariable1,
               methodVariable2
#endmacro

canGoBatchJournal method

When a system administrator creates a new batch task by using the Batch Task form, the canGoBatchJournal method determines whether the batch task class appears in the list of available classes. For an example of how to use canGoBatchJournal.


 

Create a batch job
The second step in developing a batch job is to create the batch job and add batch tasks. You can create a batch job in three ways:
■ By using the dialog box of a batch-enabled class
■ By using the Batch Job Designer form
■ By using the Batch API (It be will explained in another post)

The method you use depends on the degree of flexibility that you need and the complexity of the batch job. To create a simple batch job, consisting of a single task with no dependencies, you typically use the dialog box of a batch-executable class; to create a more complex batch job, consisting of several tasks that might have dependencies, use the Batch Job form; to create a highly complex or very large batch job, or one that needs to be integrated with other business logic, use the Batch API.
The following sections provide an example of using each method.

Create a batch job from the dialog box of a batch-executable class
The simplest way to run a batch-executable class as a batch job is to invoke the class by using a menu item. A menu item that points to a batch-executable class automatically opens a dialog box that lets
the user create a batch job. On the Batch tab of the dialog box, select the Batch Processing check box, as shown for the Change based alerts class in Figure below. When you select Batch Processing and click
OK, a new batch job with the task that represents the batch-executable class is created. The batch job then runs asynchronously at the date and time you specify. You can also set up recurrences or alerts
for the job by clicking the appropriate button on the right side of the dialog box. You can also specify the batch group for the task by using the drop-down list.


image

Create a batch job by using the Batch Job form
You can open the Batch Job form from several places. For example, you can open it by clicking Batch Jobs from System Administration > Inquiries > Batch Jobs or by selecting My Batch Jobs (for users) from Home > Inquiries > My Batch Jobs. Both menu items open the same form, but the information that is presented in the form differs, depending on the menu item that you use to open it. Depending on how you open the form and your level of access, you can view either the batch jobs that you have created or all batch jobs that are scheduled in the system.

Press Ctrl+N to create a new batch job, and then enter the details for the job in the grid or on the General tab: a description, and the date and time at which you want the job to start. You can also set up recurrence for the batch job by clicking Recurrence on the menu bar, and then entering a range and pattern for the recurrence.

Note If you don’t enter a date and time, the current date and time are entered automatically.

figure below show Batch Job Form

image

Batch tasks form

image

To create a task, do the following:
1. Press Ctrl+N to create the task.
2. In Task Description, enter a description of the task.
3. In Company Accounts, select the company in which the task runs.
4. In Class Name, select the process that you want the task to run. Classes appear in a lookup list containing all available batch-enabled classes. The lookup list appears only if the CanGoBatchJournal property is enabled.
5. In Batch Group, select a batch group for the task if necessary.
6. Save the task by pressing Ctrl+S.
7. Specify class parameters if necessary. As mentioned in previous sections, each batch task represents
a batch-executable class. Sometimes you need to set up parameters for that class.
For example, you might need to specify posting parameters for invoice posting. To do that, click Parameters on the menu bar in the Batch Tasks form. A dialog box specific to the selected class is displayed.

Note If you are creating a custom batch class, you must design the parameters form manually. If you implement a batch based on the SysOperation framework, this process is highly simplified. After you specify the necessary parameters and click OK, the class parameters are packed and saved in the Batch table and then are restored when the class executes.

8. Set up dependencies or advanced sequencing between tasks, if necessary.


After you create the batch job and add tasks to it, you can use the Batch Tasks form to define dependencies between the tasks. If no dependencies or conditions are defined within a job, the batch server automatically executes the tasks in parallel. (To configure the maximum number of parallel tasks, use the Maximum Batch Threads parameter in the Server Configuration form.)
If you need to use advanced sequencing to accommodate your business process flow, you can use either the Batch Tasks form or the Batch API. You can use these tools to construct complex dependency
trees that let you schedule batch jobs tasks in parallel, add multiple dependencies between batch tasks, choose different execution paths based on the results of the previous batch task, and so on.

For example, suppose that the job, JOB1, has seven tasks: TASK1, TASK2, TASK3, TASK4, TASK5, TASK6, and TASK7, and you want to set up the following sequence and dependencies for it:
■ TASK1 runs first.
■ TASK2 runs on completion (Ended or Error) of TASK1 (regardless of the success or failure of TASK1).
■ TASK3 runs on success (Ended) of TASK2.
■ TASK4 runs on success (Ended) of TASK2.
■ TASK5 runs on failure (Error) of TASK2.
■ TASK6 runs on failure (Error) of TASK3.
■ TASK7 runs on success (Ended) of both TASK3 and TASK4.

dependency tree for JOB

image

To define these task dependencies and to tell the system how to handle them, select a child task—for example, TASK2—from the preceding list, and then do the following:
1. In the Batch Tasks form, click in the Has Conditions grid, and then press Ctrl+N to create a new condition.
2. Select the task ID of the parent task, such as TASK1.
3. Select the status that the parent task must reach before the dependent task can run. For example, TASK2 starts when the status of TASK1 becomes Ended or Error.
4. Press Ctrl+S to save the condition.
5. If you enter more than one condition, and if all conditions must be met before the dependent task can run, select a condition type of All.

Alternatively, if the dependent task can run after any of the conditions are met, select a condition type of Any.
You can use the Batch Tasks form to define how the system handles task failures. To ignore the failure of a specific task, select Ignore Task Failure for that task on the General tab. If you select this option, the failure of the task doesn’t cause the job to fail. You can also use Maximum Retries to specify the number of times a task should be retried before it fails.

Imparted from Inside Dynamics AX 2012 Book.

Batch processing in Microsoft Dynamics AX 2012

Batch processing is a non interactive task-processing technique where users create batch jobs to organize appropriate types of tasks to be processed as a unit. Batch processing has some important advantages: it lets users schedule batch tasks and define the conditions under which they execute, add the tasks to a queue, and set them to run automatically on a batch server.

After execution is complete, the batch server logs any errors and sends alerts.

A batch job might involve printing reports, closing inventory, or performing periodic maintenance. By scheduling a batch job to process these types of resource-intensive tasks in off-peak hours, users can avoid slowing down the system during working hours.
Table below describes how standard batch processing concepts are represented in Microsoft Dynamics AX.

Concept Description
Batch task

The smallest unit of work that can be executed using the batch framework. It is a
batch-executable class that contains business logic to perform a certain action.
The Microsoft Dynamics AX classes that are used for batch tasks are designated
to run on the server. These tasks can run automatically as part of a batch job on
the AOS. This version of the product has limited support for client batch jobs; it
is recommended that you use server-side batch jobs to take full advantage of
the new features in Microsoft Dynamics AX 2012.

Batch job

A complete process that achieves a goal, such as printing a report or performing
the inventory closing process. A batch job is made up of one or more batch tasks.

Batch group

A logical categorization for batch tasks that lets administrators specify which AOS
instance runs a particular task. Tasks that are not explicitly assigned to a batch
group are, by default, assigned to an empty (default) group.

Batch server

An AOS instance that processes batch jobs.

 

Common uses of the batch framework
Organizations can use the batch framework to perform asynchronous operations in a variety of scenarios. Typically, organizations create batch jobs to address the following kinds of needs:
■ Enable scheduling flexibility The batch framework can perform periodic tasks on a regular schedule, such as data cleanup or invoice processing. For example, to run invoice processing at the end of every month, you can set up a recurring batch job that runs at midnight on the last working day of each month. The batch framework automatically picks up the job and processes pending invoices according to the specified schedule.
■ Control the order in which tasks execute With the batch framework, you can develop a workflow or perform a complex data upgrade in a sequence that you specify. You can also set up dependencies between the tasks and create a dependency tree that ensures that certain tasks run in sequence while others run in parallel.
■ Enable conditional processing Decision trees can help you implement a reliable way of processing data. Developers or system administrators can set up dependencies between tasks in such a way that different tasks are executed, depending on whether a particular task succeeds or fails. System administrators can also set up alerts so that they are notified if a job fails.

■ Improve performance by using parallelization The batch framework lets you take advantage of multithreading, which ensures that your processor’s capabilities are used fully. This is particularly important for long-running processes, such as inventory closing. You can improve performance further by breaking a process into tasks and executing them against different AOS instances, thus increasing the throughput and reducing overall execution time.
■ Implement advanced logging and profiling The batch framework lets you see what errors or exceptions were thrown the last time the batch ran, and it also shows you how long a process takes to execute. Advanced logging and the new profiling capabilities are also useful for performance benchmarking and security auditing.

Performance
The new capability to run larger and more complex batch jobs has required performance enhancements to the batch framework. In Microsoft Dynamics AX 2012, the batch framework is designed to be a server-side component. This lets you design multithreaded server processes in a controlled manner. By configuring the number of parallel execution threads and servers, defining the set and order of tasks for processing, and setting the execution schedule, you can achieve greater scalability across your hardware.

As mentioned earlier, the batch framework is now designed to run X++ that has been compiled as .NET CIL code for batch jobs. This significantly improves performance compared to Microsoft Dynamics
AX 2009, which ran interpreted X++ code. Compared to the interpreted code, garbage collection is much better, and because of session pooling, scheduling new batch jobs is less resource intensive. You can also profile the performance of jobs by using Microsoft Visual Studio Performance Profiler.


Microsoft developers use the batch framework as a foundation for many performance-critical processes, such as maximizing hardware scalability during a data upgrade and maximizing throughput during journal posting. For more information about how Microsoft uses the batch framework for performance-critical processes, see the white paper “Journal Batch Posting,” available at http://www.microsoft.com/en-us/download/details.aspx?id=13379.

 

Imparted from Inside Dynamics AX 2012 book

Troubleshoot the reporting framework [AX 2012]

The report server cannot be validated
If you cannot validate the report server, do the following:
■ Click the Create button in the Reporting Servers form, which is located at Tools > Business Intelligence Tools > Reporting Servers, and make sure that a report folder and data source have been created on the report server. Click the Validate button.
■ Ensure that firewall settings are configured appropriately on the computer that is running the
report server.
■ Ensure that both the report manager and report server URLs are correct.
■ Ensure that the Microsoft Dynamics AX user has permissions on the computer that is running
the report server.

A report cannot be generated
If you are connecting to the Microsoft Dynamics AX SQL Server database and the system will not generate a report, do the following:
■ Ensure that the report server account configured in the report data source on the report
server has read permissions on the Microsoft Dynamics AX SQL Server database.
■ Ensure that firewall settings are configured appropriately on the computer on which the
database is installed.
If you are connecting to an external or custom data source, make sure that the user name and
password provided for the report server account in the data source on the report server are correct.


A chart cannot be debugged because of SharePoint sandbox issues
If you cannot debug a chart because of problems with the SharePoint sandbox, do the following:
■ Add a reference to the Microsoft.SharePoint.dll assembly to the project.
■ Establish the default web control to run in debug mode.
■ Edit the file named Default.aspx in the EP Chart project.
■ Add the ManagedContentItem property to the <dynamics:AxUserControlWebPart> element
and set the value to the name of the web control.

Create a new number sequence in ax 2012

Number Sequence Creation:

Here I want to design a form named FirstForm with DataSource FirstTable

I want to create sequence  like "AX00001---------AX99999".

Step 1

Create an EDT - String Type

So, I created an EDT named "AXSeqEDT" with label "AX Seq"

Drag into Table(FirstTable)àFields

Step 2

Now create a new Number Sequence

Path for creating num Sequence is

"Module:: Organization administration.......Common.........Number sequences......Number sequences"

Click on New(Number Sequence)

Now number Sequence form will be opened----That contains 4 sections.

Section 1.Identification.....Specify the NumberSeqCode and Name

Section 2.Scope Parameters... Select the Scope from the Dropdown

Section 3.Segments.... Add the constant and alphanumeric (by clicking the add button and selecting from drop down)

Section 4 .General.....Checkmark for continous and Specify the "smallest and largest and Next" Fields

Now Save Ur Settings

Step 3

Now add the Respective manual-code to class - NumberSeqModuleURMODULE

And Table - URMODULEParameters.

So I am creating number sequence based on HRM Module.....So iam using classNumberSeqModuleHRM and Table HRMParameters

Now go to AOT---Classes-NumberSeqModuleHRM---loadModule()

Add the code here...

Note::Here we can add the code seeing the existing implementation

The Added Code is::

/* setup discussion number sequence - it is global */

    datatype.parmDatatypeId(extendedtypenum(AXSeqEDT));

    datatype.parmReferenceHelp(literalstr("@SYS32633"));

    datatype.parmWizardIsContinuous(true);

    datatype.parmWizardIsManual(NoYes::No);

    datatype.parmWizardIsChangeDownAllowed(NoYes::No);

    datatype.parmWizardIsChangeUpAllowed(NoYes::No);

    datatype.parmWizardHighest(99999);

    datatype.parmSortField(12);

    this.create(datatype);

Now Goto AOT---Tables---HRMParameters---methods-----click on new method


Add the code In the New method

Note::Here we can add the code seeing the existing implementation

The Added Code is

static client server NumberSequenceReference numRefAXSeqEDT()

{

return NumberSeqReference::findReference(extendedTypeNum(AXSeqEDT));

}

Step 4

In order to add our newly created number sequence reference to our Module write the following Job and Execute it

Below job is important to run because without it your new number sequence will not be available to number sequence form under Parameters. This is the change in behavior from AX 2009 where all new number sequence loads while restarting the Dynamic AX. In AX 2012 all the number sequence created to system while installation, so restarting the AOS wont effect in loading the new number sequence, that is why it is important to run the job to load new number sequences.

The Code added in The Job is

static void jobName(Args _args)

{

    NumberSeqModuleHRM  NumberSeqModuleHRM = new NumberSeqModuleHRM();

    ;

    NumberSeqModuleHRm.load();

}

Step 5

After executing the Above Job, our newly created number Sequence reference "AX Seq" will be added to HRM Module----Number sequence setup form

Lets Check it

Now click on Number Sequence and Identify the newly created Number Seq Reference

After Identifying the Number Sequence Reference ----Allot the Number Sequence Code to the Number Sequence Reference.....By selecting from the drop down list

Step 6

Now add the Code in Create method of Forms Datasource methods

Goto-AOT-Forms-FirstForm-Datasources-FirstTable-Methods-Override method(Create)

public void create(boolean _append = false)

{

    ;

super(_append);

    FirstTable.AXSeqEDT = NumberSeq::newGetNum(HRMParameters::numRefAXSeqEDT(),true).num();

}

Step 7

Now save all ur settings.....Now Open our form-FirstForm

Imparted

Microsoft Dynamics AX 2012 Development Cookbook

Overview

  • Develop powerful, successful Dynamics AX projects with efficient X++ code with this book and eBook
  • Proven recipes that can be reused in numerous successful Dynamics AX projects
  • Covers general ledger, accounts payable, accounts receivable, project modules and general functionality of Dynamics AX
  • Step-by-step instructions and useful screenshots for easy learning
  • Numerous development tips and tricks for daily usage
  • This book is an update to Microsoft Dynamics AX 2009 Development Cookbook

Table of Contents

Preface
Chapter 1: Processing Data
Chapter 2: Working with Forms
Chapter 3: Working with Data in Forms
Chapter 4: Building Lookups
Chapter 5: Processing Business Tasks
Chapter 6: Integration with Microsoft Office
Chapter 7: Using Services
Chapter 8: Improving Development Efficiency
Chapter 9: Improving Dynamics AX Performance
Index

Up

  • Chapter 1: Processing Data
    • Introduction
    • Creating a new number sequence
    • Renaming the primary key
    • Merging two records
    • Adding a document handling note
    • Using a normal table as a temporary table
    • Copying a record
    • Building a query object
    • Using a macro in an SQL statement
    • Executing a direct SQL statement
    • Enhancing the data consistency check
    • Exporting data to an XML file
    • Importing data from an XML file
    • Creating a comma-separated value file
    • Reading a comma-separated value file
    • Using the date effectiveness feature

    Up

    • Chapter 2: Working with Forms
      • Introduction
      • Creating a dialog
      • Handling a dialog event
      • Building a dynamic form
      • Adding a form splitter
      • Creating a modal form
      • Modifying multiple forms dynamically
      • Storing last form values
      • Using a tree control
      • Building a checklist
      • Adding the View details link

      Up

      • Chapter 3: Working with Data in Forms
        • Introduction
        • Using a number sequence handler
        • Creating a custom filter
        • Creating a custom instant search filter
        • Building a selected/available list
        • Preloading images
        • Creating a wizard
        • Processing multiple records
        • Coloring records
        • Adding an image to records

        Up

        • Chapter 4: Building Lookups
          • Introduction
          • Creating an automatic lookup
          • Creating a lookup dynamically
          • Using a form for building a lookup
          • Building a tree lookup
          • Displaying a list of custom options
          • Another way of displaying custom options
          • Building a lookup based on record description
          • Building the Browse for Folder lookup
          • Building a lookup for selecting a file
          • Creating a color picker lookup

          Up

          • Chapter 5: Processing Business Tasks
            • Introduction
            • Using a segmented entry control
            • Creating a general journal
            • Posting a general journal
            • Processing a project journal
            • Creating and posting a ledger voucher
            • Changing an automatic transaction text
            • Creating a purchase order
            • Posting a purchase order
            • Creating a sales order
            • Posting a sales order
            • Creating an electronic payment format

            Up

            • Chapter 6: Integration with Microsoft Office
              • Introduction
              • Creating an Excel file
              • Reading an Excel file
              • Creating a Word document from a template
              • Creating a Word document with repeating elements
              • Creating a Microsoft Project file
              • Sending an e-mail using Outlook

              Up

              • Chapter 7: Using Services
                • Introduction
                • Consuming the system query service
                • Consuming the system metadata service
                • Consuming an existing document service
                • Creating a document service
                • Consuming a document service
                • Using an enhanced document service
                • Creating a custom service
                • Consuming a custom service
                • Consuming an external service

                Up

                • Chapter 8: Improving Development Efficiency
                  • Introduction
                  • Creating an editor template
                  • Modifying the Tools menu
                  • Modifying the right-click context menu
                  • Searching for an object in a development project
                  • Modifying the Personalization form
                  • Modifying the application version

                  Up

                  • Chapter 9: Improving Dynamics AX Performance
                    • Introduction
                    • Calculating code execution time
                    • Writing efficient SQL statements
                    • Caching a display method
                    • Using Dynamics AX Trace Parser
                    • Using SQL Server Database Engine Tuning Advisor

                    Up

                    What makes a good Dynamics AX Project Manager?

                    The success and failure of Dynamics AX project is directly related to the quality of the project manager leading it. A recent survey of PWC showed that over 85% of dynamics ax project failed to achieve their core objectives – poor project management was one of the root causes.

                    to complete the post kindly click this link