blog for Dynamics Axapta

Hi,

Recently, I had a issue with my D365 VM Network. The internet connection from my laptop, is not passed to the VM. The network adapter has configured correctly. Then I got the below steps to solve the problem.

  1. Launch Hyper-V Manager from your App Menu
  2. In the Actions area in right-hand navigation, click “Virtual Switch Manager”
  3. When the Virtual Switch Manager window opens, select “New virtual network switch” on the left, select “Internal” on the right, and then click the “Create Virtual Switch” button
  4. Give the new switch a name like “Virtual WLAN” [user specified] and click “OK”
  5. In Windows 8 sys tray, right-click on the wireless icon and click on “Open Network and Sharing Center.” You will see the new Unidentified Network connected to the vEthernet (Virtual WLAN) [user specified] adapter.
  6. Back in Hyper-V Manager, select your VM (make sure it is turned off) and on the lower left side, click “Settings”
  7. The Settings window will default to Add New Hardware, select “Legacy Network Adapter” and click “Add”
  8. In the Legacy Adapter details, select the “Virtual WLAN” [user specified]  adapter we configured earlier and click “OK”
  9. Go back to Windows ’s Network and Sharing Center and click on the “Wi-Fi”/ “Ethernet”[LAN] link (or the name of your laptop’s wireless/LAN adapter) listed in the Connections In the adapter status window, click “Properties”
  10. In the Properties window, click the Sharing tab, check the “Allow other network users…” box, select “vEthernet (Virtual WLAN)” (or the name of your wireless/LAN adapter), and click “OK” to close the window
  11. Click Close to exit the Wi-Fi/LAN status window

Then restart the VM, now it got connected with your Host network.

// Vasanth Arivali

Hi,

Here I have posted a job to export all our newly created projects / jobs / any AOT objects as XPO automatically.

static void VAS_ExportXPO(Args _args)
{
#AOT

FileIoPermission perm;
ProjectListNode projectListNode;
ProjectNode projectTreeNode;
TreeNode treeNode, jobTreeNode;
TreeNodeIterator iterator, jobIterator;
str projName;
str exportProjName = ‘VAS_’;
str jobName;
str exportJobName = ‘VAS_’;
int noOfProjects;
int noOfJobs;
str folderpathProj, folderpathJobs;

#define.ExportMode(“w”)

;
folderpathProj = strfmt(@’C:\Vasanth Arivali\XPO Backup\%1\SharedProject’, date2str(today(), 321, 2, 3, 2, 3, 4));
folderpathJobs = strfmt(@’C:\Vasanth Arivali\XPO Backup\%1\Jobs’, date2str(today(), 321, 2, 3, 2, 3, 4));
WINAPI::createDirectoryPath(folderpathProj);
WINAPI::createDirectoryPath(folderpathJobs);

perm = new FileIoPermission(folderpathProj, #ExportMode);
if (perm == null)
{
return;
}
perm.assert();

projectListNode = SysTreeNode::getSharedProject();
iterator = projectListNode.AOTiterator();

treeNode = iterator.next();
while (treeNode)
{
projName = treeNode.AOTname();
if ( exportProjName == substr(projName, 1, 8))
{
// BP deviation documented.
treeNode.treeNodeExport(folderpathProj + ‘\\SharedProject_’ + projName + “.xpo”);
noOfProjects++;
}
treeNode = iterator.next();

}

jobIterator = TreeNode::findNode(@’\Jobs’).AOTiterator();
jobTreeNode = jobIterator.next();
while (jobTreeNode)
{
jobName = jobTreeNode.AOTname();
if ( exportJobName == substr(jobName, 1, 8))
{
// BP deviation documented.
jobTreeNode.treeNodeExport(folderpathJobs + ‘\\Job_’ + jobName + “.xpo”);
noOfJobs++;
}
jobTreeNode = jobIterator.next();

}

CodeAccessPermission::revertAssert();

if (noOfProjects > 0)
info(strfmt(‘%1 Projects exported sucessfully’, noOfProjects));
if (noOfJobs > 0)
info(strfmt(‘%1 Jobs exported sucessfully’, noOfJobs));
}

Hope this will help you guys.

// Vasanth Arivali

Hi Friends,

Here I have posted the code for auto comments by amending Editor Scripts class.

Adding auto script CODE comments
// Changes: XYZ to your intial name
public void addCommentsCODE(Editor _e)
{
int startLine = _e.selectionStartLine();
int endLine = _e.selectionEndLine();
str prefixCompany = “CONTOSO”;
str developerID;
str tagStart;
str tagEnd;
;

switch (curUserId())
{
case “vasan”: developerID = “Vasanth”;
break;
case “steve”: developerID = “Steven”;
break;
default:
developerID = “XYZ”;
}

tagStart = strFmt(“//–> %1 modified on %2 %3 by %4: %5 ~ mod description\n”,
enum2str(currentAOLayer()),
date2str(today(), 321, 2, 3, 3, 3, 4), time2str(timeNow(), 1, 1),
prefixCompany,
developerID
);
tagEnd = strfmt(“//<– by %1\n”, prefixCompany);

_e.gotoCol(1);
_e.unmark();

_e.gotoLine(startLine);
_e.insertLines(tagStart);

_e.gotoLine(endLine+2);
_e.insertLines(tagEnd);
}

Once done, got to code window, right click -> scripts -> you find the method created. Hope it will help you.

// Vasanth Arivali

Hi Folks,

Please find the link below to download the project for Enhanced Table Browser in Ax 2012. No need to scroll left / right any more on big table, just select and view only the fields you want.

You can download the project from this blog

systablebrowser

You no need to do deploy the changes in form getRadioControl() from the project.

Hope it will help you well.

//Vasanth Arivali

Hi Folks,

I got one requirement to get invoices of a customer on the particular month range in SSRS Report Dialog. I have achieved that and want share. Here we go…..

Create a Contract Class with 4 parameter methods for Customer account, Month, Year, InvoiceId and follow the below code

1) Create a class for UI Builder

class SampleReportUIBuilder extends SrsReportDataContractUIBuilder
{
    DialogField                         dialogCustomer;
    DialogField                         dialogMonth;
    DialogField                         dialogYear;
    DialogField                         dialogInvoiceId;

    SampleDataContract                  dataContract;
}

2) override the build method

public void build()
{
    Dialog  dialogLocal;

    dialogLocal             = this.dialog();

    dataContract = this.dataContractObject();

    this.addDialogField(methodStr(SampleDataContract, parmCustAccount), dataContract);
    this.addDialogField(methodStr(SampleDataContract, parmMonth), dataContract );
    this.addDialogField(methodStr(SampleDataContract, parmYear), dataContract );
    this.addDialogField(methodStr(SampleDataContract, parmInvoiceId), dataContract );
}

3) override the initializeFields method

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

4) override the getFromDialog Method

public void getFromDialog()
{
    comparisionDataContract = this.dataContractObject();

    super();
}

5) add new method for CustomerAccount Lookup

public void lookupCustomerAcc(FormStringControl _control)
{
    Query                   query = new Query();
    QueryBuildDataSource    qbdsCustomer;

    QueryBuildFieldList     qbfsCustomerFieldList;

    SysTableLookup          sysTableLookup;
    ;

    sysTableLookup  = SysTableLookup::newParameters(tableNum(CustTable), _control);
    
    qbdsCustomer  = query.addDataSource(tableNum(CustTable));

    qbfsCustomerFieldList= qbdsCustomer  .fields();
    qbfsCustomerFieldList.dynamic(false);
    qbfsCustomerFieldList.clearFieldList();
    qbfsCustomerFieldList.addField(fieldNum(CustTable, AccountNum));
    qbfsCustomerFieldList.addField(fieldNum(CustTable, Party));        

    // Perform Lookup
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldnum(CustTable, Id));
    sysTableLookup.addLookupfield(fieldnum(CustTable, Party));
    sysTableLookup.performFormLookup();
}

6) add Modified method for CustomerAcc

public boolean customerAccModified(FormStringControl _control)
{
    dialogCustomer.value(_control.valueStr());

    return true;
}

7) add new method for Year Lookup

//BP deviated
public void lookupYear(FormStringControl _control)
{
    Query                       query                       = new Query();

    YearBase                    maxYear;
    YearBase                    minYear;
    YearBase                    currentYear;

    // new own tmp table to hold year
    MyOwnYearTmp                yearTmp;
    SysTableLookup              sysTablelookup;

    sysTablelookup  = SysTableLookup::newParameters(tableNum(KepYearTmp),_control);

    minYear         = 1965;
    maxYear         = year(systemDateGet());

    yearTmp.recordLevelSecurity(true);
    for(currentYear = maxYear; currentYear >= minYear; currentYear--)
    {
        yearTmp.YearBase = currentYear;
        yearTmp.insert();
    }

    sysTablelookup.addLookupfield(fieldNum(KepYearTmp,YearBase));
    sysTableLookup.parmTmpBuffer(yearTmp);
    sysTableLookup.performFormLookup();


}

8) add new Modified method for Year

public boolean yearModified(FormStringControl _control)
{
    dialogYear.value(_control.valueStr());

    return true;
}

9) add InvoiceId lookup, this lookup will get data based on the selected customer, month and year

public void lookupInvoiceId(FormStringControl _control)
{
    Query                   query = new Query();

    QueryBuildDataSource    qbdsCustInvoiceTable;
    QueryBuildRange         qbrCustInvoiceTable;
    QueryBuildFieldList     qbfsCustInvoiceTableFieldList;

    SysTableLookup          sysTableLookup;

    TransDate               invStDate, invEndDate;
    container                 conDates;
    ;

    sysTableLookup  = SysTableLookup::newParameters(tableNum(CustInvoiceTable), _control);

    // my own class to get month startdate and enddate from dialog
    conDates= MyDateClass::getDateRange(dialogMonth.value() , dialogYear.value() , false, true);

    invStDate   = conPeek(conDates, 1);
    invEndDate  = conPeek(conDates, 2);

    // CustInvoiceTable DataSource
    qbdsCustInvoiceTable    = query.addDataSource(tableNum(CustInvoiceTable));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceAccount)).value(queryValue(dialogCustomer.value()));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceDate)).value(queryValue(invStDate));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceDate)).value(queryValue(invEndDate));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceStatus)).value(queryValue(InvoiceStatuses::Posted));
    qbdsCustInvoiceTable.addRange(fieldNum(CustInvoiceTable, InvoiceType)).value(queryValue(InvoiceTypes::Invoice));

    // CustInvoiceTable FieldList
    qbfsCustInvoiceTableFieldList = qbdsCustInvoiceTable.fields();
    qbfsCustInvoiceTableFieldList.dynamic(false);
    qbfsCustInvoiceTableFieldList.clearFieldList();
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, InvoiceAccount));
    qbfsCustInvoiceTableFieldList.addField(fieldnum(CustInvoiceTable, InvoiceId));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilStartDate));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilEndDate));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilInvoiceStatus));
    qbfsCustInvoiceTableFieldList.addField(fieldNum(CustInvoiceTable, McsCmBilInvoiceType));

    // Perform Lookup
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldnum(CustInvoiceTable, InvoiceId));
    sysTableLookup.addLookupfield(fieldnum(CustInvoiceTable, McsConnectionId));
    sysTableLookup.performFormLookup();
}

10) add new Modified method for InvoiceId

public boolean InvoiceIdModified(FormStringControl _control)
{
    dialogInvoiceId.value(_control.valueStr());

    return true;
}

11) override the PostBuild method

public void postBuild()
{
    super();

    dialogCustomer = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmCustomer));
    if (dialogCustomer)
    {
        dialogCustomer.lookupButton(2);
    }

    // register override method for lookup
    dialogCustomer.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupCustomerAcc), this);

    // register override method for modified
    dialogCustomer.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , customerAccModified), this);

    // From binding info, get the dialog field for racecode attribute
    dialogMonth = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmMonth));

    // From binding info, get the dialog field for racecode attribute and add button
    dialogYear = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract,parmYear));
    if (dialogYear)
    {
        dialogYear.lookupButton(2);
    }

    // register override method for lookup
    dialogYear.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupYear), this);
    // register override method for modified
    dialogYear.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , yearModified), this);


    dialogInvoiceId = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SampleDataContract, parmInvoiceId));
    if (dialogInvoiceId)
    {
        dialogInvoiceId.lookupButton(2);
    }

    // register override method for lookup
    dialogInvoiceId.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(SampleReportUIBuilder , lookupInvoiceId), this);
    // register override method for modified
    dialogInvoiceId.registerOverrideMethod(methodStr(FormStringControl, modified), methodStr(SampleReportUIBuilder , InvoiceIdModified), this);
}

11) Use the UI Builder class in Contract Calss as below

[
    DataContractAttribute,
    SysOperationContractProcessingAttribute(classstr(SampleReportUIBuilder)),
    SysOperationGroupAttribute('Criteria', "@SYS13128", "1")
]
class SampleDataContract implements SysOperationInitializable, SysOperationValidatable
{
    CustomerAcc         CustomerAcc;
    TransDate           invoiceDate;
    MonthsOfYear        invoiceMonth;
    Year                invoiceYear;
    InvoiceId           invoiceId;

}

Hope it will help……

// Vasanth Arivali

Read the rest of this entry »

Hi Friends,

Here I have posted the code(not entire job/program) for adding multiple ranges/relations with the same table using Query object

Code Starts Here:

QueryRun qr;

//1st DataSource

QueryBuildDataSource qbdTableSourcefromQuery; // get query from the AOT Query which used by System in SysQuery()
QueryBuildDataSource qbdTableSourcefromCode; // newly added Query for Account Number Range

qr = new QueryRun(“your Query”);

qbdCustTableSourcefromQuery = SysQuery::findOrCreateDataSource(qr.query(), tableNum(TableName1));

SysQuery::findOrCreateRange(qbdCustTableSourcefromQuery, fieldNum(TableName1, FieldName)).value(“QueryValue”);

//2nd DataSource

qbdCustTableSourcefromCode = qbdCustTableSourcefromQuery.addDataSource(tableNum(TableName1), “TableNameNew”);
qbdCustTableSourcefromCode.relations(true);
qbdCustTableSourcefromCode.joinMode(JoinMode::ExistsJoin);
qbdCustTableSourcefromCode.addRange(fieldNum(TableName1, FieldName)).value(queryValue(“QueryValue”));

 

// Vasanth Arivali

Hi All,

We all know about “Go To Main Table” Option in our Axapta Forms and Tables. Here I wrote one sample for how to get that functionality in our forms or table. This is done by three ways:

1) By EDT Relations

2) By using JumpRef method

3) By using FormRef property in Table

EDT Relations:

If you use an EDT in tables which have relation with some other table fileds, that time you can able to navigate the main table or main form.

FormRef Property:

Select the Table and go to properties and select the required form in the FormRef property.

JumpRef method:

If you are not having that option, simply write a override the JumpRef method in a field of DataSource or in a Form Control. Here i show you a sample jumpRef method code:

public void jumpRef()
{
Args            args;
MenuFunction    menuFunction;
;

args = new Args();
menuFunction = new MenuFunction(menuitemDisplayStr(“FormName”), MenuItemType::Display);
args = new Args(menuFunction.object());
args.caller(element);
args.record(“RecordName”); // to be a datasource which added in the current form
menuFunction.run(args);
}

In the form init() which we called here, we have to check the condition whether the form is called by any dataset or not.

Thanks & Regards

Vasanth Arivali

Hi Guys,

Here i posted a small job , to explain how we use regular expressin in Axapta. Try it.

static void RegularExpression_Test()

{

int nameLength,myStringLength;

str myname = “Vasanth”;

str myString = “1234″;

str formatString , formatString1;

System.Text.RegularExpressions.Regex regEx;

System.Text.RegularExpressions.Regex regEx1;

System.Text.RegularExpressions.Match regMatch;

InteropPermission permission = new InteropPermission(InteropKind::ClrInterop);

boolean retVal, retVal1;

;

nameLength = strLen(myname);

myStringLength = strLen(myString);

formatString   = strfmt(@”^[0-9]{%1}”, myStringLength);

formatString1   = strfmt(@”^[a-zA-Z ]{%1}”, nameLength);

permission.assert();

//BP Deviation documented

regEx = new System.Text.RegularExpression.Regex(formatString);

regEx1 = new System.Text.RegularExpression.Regex(formatString1);

regMatch = regEx.Match(myString);

retVal = regMatch.get_Success();

print retVal; // Returns True;

regMatch = regEx1.Match(myname);

retVal1 = regMatch.get_Success();

print retVal1 // Returns True;


}

Thanks & Regards,

Vasanth Arivali

Hi All,

Here i written the code to use the Aggregate functions and Joins inDynamic Query in spite of using normal Select statement in Ax 2009

Normal Select Statement:

while select sum(qty) from inventTrans where inventTrans.ItemId ==

“OL-2500” join inventDimgroup by inventBatchId where

inventDim.InventDimId == inventTrans.InventDimId

{

// Our Code Here

}

Dynamic Query:

static void Vasanth_Query_Eg1(Args _args)

{

Query                   query;

QueryBuildDataSource    queryBuildDataSource;

QueryBuildRange         queryBuildRange;

QueryRun                queryRun;

Qty                     total;

InventTrans             inventTrans;

;

query = new Query();    queryBuildDataSource    = query.addDataSource(tableNum(InventTrans));

queryBuildDataSource.addSelectionField(fieldNum(InventTrans,Qty),

SelectionField::Sum);

queryBuildDataSource.orderMode(OrderMode::GroupBy);

queryBuildRange         = queryBuildDataSource.addRange(fieldNum(InventTrans,ItemId));

queryBuildDataSource    = queryBuildDataSource.addDataSource(tableNum(InventDim));

queryBuildDataSource.orderMode(OrderMode::GroupBy);

queryBuildDataSource.addSortField(fieldNum(InventDim,InventBatchId));

queryBuildDataSource.relations(true);

queryRun = new QueryRun(query);

if (queryRun.prompt())

{

while (queryRun.next())

{

inventTrans = queryRun.get(tableNum(InventTrans));

total = inventTrans.Qty;

}

}

info(strFmt(“Quantity: %1″, total));
}

Hi,

Here i posted the code to use the AOT Query Object in our X++ code.

Steps:

1) Create a AOT Query Object as your requirement.

2) Create a Job and paste the below code to check the Query Object.

static void ExecuteAOTQuery(Args _args)

{

QueryRun queryRun;

Counter totalRecords;

;

queryRun = new QueryRun(queryStr(CreatedAOTQueryName));

if (queryRun.prompt())

{

while (queryRun.next())

{

totalRecords++;

}

}

info(strFmt(“Total Records : %1”, totalRecords));

}