September 27, 2012

How to Restore deleted sales order or purchase order

How to Restore deleted sales order or purchase order in AX 2009






Hi Frnds,

Some times fortunately or unfortunately user delete a record from Purchase Order OR Sales Order Forms,
and it can be drag you in a big problems, Here I am sharing a trick to restore these deleted Order records.
When ever a record is deleted from a Form, it sits in the void tables. These orders can be viewed from

AR -> Inquiries -> History -> Voided sales order or AP -> Inquiries -> History -> Voided Sales order.

AP -> Inquiries -> History -> Voided sales order or AP -> Inquiries -> History -> Voided Purchase order.

Now from this form you can only view the deleted orders but there is not option of restoring them.
Below are some sample code, you can use this to restore the voided orders.

Sales order restoration:
static void restoreDeletedSO(Args _args)
{
    SalesTableDelete    salesTableDelete;
    SalesLineDelete     salesLineDelete;
    SalesTable          salesTable;
    SalesLine           salesLine;
    ;

    SalesTableDelete = SalesTableDelete::find('00450_036', true);
    ttsbegin;
    switch (salesTableDelete.Cancelled)
    {
        case Voided::Voided :
            salesTable  = conpeek(salesTableDelete.SalesTable, 1);
            salesTable.insert();

            while select forupdate salesLineDelete where salesLineDelete.SalesId == salesTableDelete.SalesId
            {
                salesLine = conpeek(salesLineDelete.SalesLine, 1);
                salesLine.insert();
            }
            salesTableDelete.delete();
            break;

        case Voided::linesVoided :
            while select forupdate salesLineDelete where salesLineDelete.SalesId == salesTableDelete.SalesId
            {
                salesLine = conpeek(salesLineDelete.SalesLine, 1);
                salesLine.insert();
                salesLineDelete.delete();
            }
            salesTableDelete.delete();
            break;
   }

   ttscommit;
}


Purchase order restoration:





static void restoreDeletedPO(Args _args)
{
    PurchTableDelete    purchTableDelete;
    PurchLineDelete     purchLineDelete;
    PurchTable          purchTable;
    PurchLine           purchLine;
    ;

    purchTableDelete = PurchTableDelete::find('00242_049', true);
    ttsbegin;
    switch (purchTableDelete.Cancelled)
    {
        case Voided::Voided :
            purchTable  = conpeek(purchTableDelete.PurchTable, 1);
            purchTable.insert();

            while select forupdate purchLineDelete where purchLineDelete.PurchId == purchTableDelete.PurchId
            {
                purchLine = conpeek(purchLineDelete.PurchLine, 1);
                purchLine.insert();
            }
            purchTableDelete.delete();
            break;

        case Voided::linesVoided :
            while select forupdate purchLineDelete where purchLineDelete.PurchId == purchTableDelete.PurchId
            {
                purchLine = conpeek(purchLineDelete.PurchLine, 1);
                purchLine.insert();
                purchLineDelete.delete();
            }
            purchTableDelete.delete();
            break;
   }

   ttscommit;
}



If you have any query for the same feel free to ask.  
-Harry

September 22, 2012

AX 2012 – Data Migration Framework


AX 2012 – Data Migration Framework: Step-by-step setup

Recently i found a great blog on Data Migration Framework,
follow this link

AX 2012 – Data Migration Framework: Step-by-step setup

Its really help full for the step by step process of Data migration in AX 2009 to Ax 2012.

- Hary

September 10, 2012

How to send E-Mail In Microsoft Dynamics AX

How to send E-mail In  AX

There are more than one way to send emails through Microsoft Dynamics AX system, using X++ code.
The most recommended way is to use the standard mail mechanism built in the system.
That way copies of any email you send will be save in the Email sending status form (based on tableSysOutgoingEmailTable) and you will be able to monitor and see status of sent emails:

http://theaxapta.blogspot.in/

(Administration -> Periodic -> E-mail processing -> Email sending status; Form: SysOutgoingEmailTable)





This mechanism based on a system table that contain the emails, and a batch job that scan that table and send the emails, one by one (with retries and status controlling).
This technique is very simple to use and therefore it has some disadvantages; you cannot add attachments or use advanced email properties (cc, bcc, priority flag, etc).
To use this mechanism, first you have to make sure you a SMTP server configured and running.
Go to
  Administration -> Setup -> E-mail parameters 
and fill the required settings:



(Form: SysEmailParameters)

Next step is to make sure the E-mail distributor batch is up and running.
Go to
  Basic -> Inquiries -> Batch Job and check if the batch job exists with status Executing orWaiting.



(Form: BatchJob)
If it doesn’t, you can activate it from Administration -> Periodic -> E-mail processing -> Batch.
Now we are ready to implement our X++ code:
void SendMail()
{
    SysMailer mail;
    SysOutgoingEmailTable outgoingEmailTable;
    SysEmailItemId nextEmailItemId;
    Map map;
    str SenderName, SenderEmail, To, Subject, Body;
;

SenderName = "X++.info";
SenderEmail = "Sender@xplusplus.info";
To = "recipient@xplusplus.info";
Subject = "Subject line for the email";
Body = "<B>Body of the email</B>";

nextEmailItemId = EventInbox::nextEventId();
outgoingEmailTable.EmailItemId = nextEmailItemId;
outgoingEmailTable.IsSystemEmail = NoYes::No;
outgoingEmailTable.Sender = SenderEmail;
outgoingEmailTable.SenderName = SenderName;
outgoingEmailTable.Recipient = To;
outgoingEmailTable.Subject = SysEmailMessage::stringExpand(Subject, map);
outgoingEmailTable.Priority = eMailPriority::Normal ;
outgoingEmailTable.WithRetries = false;
outgoingEmailTable.RetryNum = 0;
outgoingEmailTable.UserId = curUserId();
outgoingEmailTable.Status = SysEmailStatus::Unsent;
outgoingEmailTable.Message = Body;
outgoingEmailTable.LatestStatusChangeDateTime = DateTimeUtil::getSystemDateTime();
outgoingEmailTable.insert();
}

The result of the example above will shown in the Email sending status form as mentioned above.



(Administration -> Periodic -> E-mail processing -> Email sending status; Form: SysOutgoingEmailTable)

- I Hope it will  usefull for all of you...
-Harry


















September 08, 2012

Security Keys in Ax

Security Keys in Ax

Dynamics Ax provides following keys to provide the security for your application

1.License Keys :

It is the First Level Security , specifies what all featues/modules/developemnt tools we can access in the standard product. License Keys will be used after installation to unlock the product. License Keys will be issued by the microsoft for partners/vendors to develop vertical/generic solutions.


2.Configuration Keys :

It is Second Level Security , To Enable/Disable the object/feature for all the users.


3.Security Keys :

These keys used for enable/disable any object/features to group of users.


4. Record Level security :

Basically it deals with the data , if you want to restrict the viewing of records per user group than we setup record level security.

-Harry

September 06, 2012

How to Enable X++ debugging for Dynamics Ax 4.0 Enterprise Portal

How to Enable X++ debugging For Enterprise Portal

To enable X++ debugging in the current user session in Microsoft Dynamics AX 4.0, follow these steps:

1. On the server that is running Internet Information Services (IIS), open a console session (also known as session 0). To use Terminal Server to do this, click Start, click Run, type mstsc /console in the Open box, and then click OK. Then, start Microsoft Dynamics AX 4.0 in the Terminal Server session.

2. Set the .NET Business Connector configuration and the client configuration to enable breakpoints when you run the Business Connector. To do this, follow these steps:

 a. Click Start, click Run, type Control admintools, and then click OK.
 b. Double-click Microsoft Dynamics AX Configuration Utility.
 c. In the Configuration target list, click Business Connector (Non-interactive use only).
 d. On the Developer tab, click to select the Enable user breakpoints to debug code running in the business      connector check box and the Enable global breakpoints to debug code running in the business connector check box.
 e. Click Apply. Then, click OK.Repeat step a through step e for the local client configuration in the Configuration target list.

3.Enable debug mode. To do this, follow these steps:

 a.On the Tools menu, click Options.
 b.Click the Development tab.
 c. In the Debug mode box, click When Breakpoint.
 d. Click Apply, and then close the Options dialog box.

4.Locate the code that you want to debug. Before the code that you want to debug, type the keyword breakpoint.

5.Manually start the debugger. To do this, click Tools, point to Development tools, and then click Debugger.

6.Enable desktop interaction for the World Wide Web Publishing Service. To do this, follow these steps:
 a. Click Start, point to All Programs, point to Administrative Tools, and then click Services.
 b. Right-click World Wide Web Publishing Service, and then click Properties.
 c. Click the Log On tab.
 d. Click to select the Allow service to interact with desktop check box.
 e. Click OK to close the World Wide Web Publishing Service (Local Service) dialog box.

7. Make sure that the user who is logged on to the computer is one of the following users:

•The user who is running the Web application pool
•The user who starts a session in Microsoft Dynamics AX 4.0
•The user who set up breakpoints in Microsoft Dynamics AX 4.0


-Harry