Skip to main content

Write into the System Event Viewer from Dynamics AX

This is a very short article which shows how to write any information into the system event viewer. This is something that can be very useful when trying to debug processes such as batches that are difficult to debug. One thing to note is that if the code is running on the AOS the information will be written to the EventViewer on the AOS, just something to keep in mind if you don’t see your message in the EventViewer.


static void writeEventLogEntry(Args _args)
{
System.Diagnostics.EventLog eventlog;
#Define.LogSource("Dynamics AX")
#Define.LogName("Application")
;
// check if the log already exists
if(!System.Diagnostics.EventLog::SourceExists(#LogSource))
{
// create new log
System.Diagnostics.EventLog::CreateEventSource(#LogSource, #LogName);
}
eventlog = new System.Diagnostics.EventLog();
eventlog.set_Source(#LogSource);
// write info entry
eventlog.WriteEntry(": Just writing in the event viewer.");
// write error entry
eventlog.WriteEntry(": Please check the stack trace below. \n\n" + 
con2str(xSession::xppCallStack()), System.Diagnostics.EventLogEntryType::Error);
// write warning entry
eventlog.WriteEntry("Job finished." , System.Diagnostics.EventLogEntryType::Warning);
}

Popular posts from this blog

Dynamics Axapta: Sales Orders & Business Connector

Well, again folllowing my same idea of writting close to nothing and pasting code, I'll paste in some code to create a sales order from some basic data and the invoice it. I'll try to explain more in the future. AxaptaObject axSalesTable = ax.CreateAxaptaObject("AxSalesTable"); AxaptaRecord rcInventDim = ax.CreateAxaptaRecord("InventDim"); AxaptaRecord rcCustTable = ax.CreateAxaptaRecord("CustTable"); rcCustTable.ExecuteStmt("select * from %1 where %1.AccountNum == '" + MySalesOrderObject.CustAccount + "'"); if (MySalesOrderObject.CurrencyCode.Trim().Length == 0) MySalesOrderObject.CurrencyCode = rcCustTable.get_Field("Currency").ToString().Trim(); string sTaxGroup = rcCustTable.get_Field("taxgroup").ToString().Trim(); //set header level fields axSalesTable.Call("parmSalesName", MySalesOrderObject.SalesName.Trim()); axSalesTable.Call("parmCustAccount", M

Passing values between form and class

Class name is EmplDuplication and Form is EmplTable . void clicked() {    MenuFunction mf;    args args = new Args();    ;     args.record(EmplTable);     mf = new menufunction(identifierstr(EmplDuplication), MenuItemType::Action); mf.run(args); } Meanwhile, in the main() method of the EmplDuplication class, we need to put this Axapta x++ code to get the datasource: static void main(Args args) {     EmplDuplication EmplDuplication; EmplTable localEmplTable; ;     if(args.record().TableId == tablenum(EmplTable)) localEmplTable = args.record();     ... }