Skip to main content

Cross Company Query

Sometimes we need to fetch data from several companies.


Straight forward way is to use a crossCompany keyword in a
select statement:
container
conCompanies = ['cee', 'cec', 'ceu'];


while select crossCompany : conCompanies * from CustTable
{
...
}


More elegant and flexible method to select cross company would be to use a query with a parameter AllowCrossCompany set to Yes.





This parameter enables additional tab in a query selection dialog which allows user to select companies.

In the same manner cross-company fetch of data can be done in X++:

static void crossCompanyQuery(Args _args)

{
Query q = new Query();
QueryBuildDataSource qbds;

QueryRun qr;

CustTable ct;

Container con;

;

qbds = q.addDataSource(tableNum(CustTable));


qbds.addSortField(fieldNum(CustTable, dataAreaId));

// by default adds all companies to which current user has access rights

q.allowCrossCompany(NoYes::Yes);


//q.addCompanyRange("cec");
// <- in case if you need to add more companies


con = q.getCompanyRange();
// <- check which companies are in the range


qr = new QueryRun(q);


while (qr.next())

{

if (qr.changed(tableNum(CustTable)))

{

ct = qr.get(tableNum(CustTable));

info(strFmt("%1 %2", ct.dataAreaId, ct.AccountNum));
}
}
}

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();     ... }