Cross-Company Data Modification Using X++
Applies To: Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Microsoft Dynamics AX 2012
You can use a while select crossCompany statement for cross-company data modification. You may need to use this statement because you cannot use the crossCompany keyword in X++ SQL statements that modify data nor can you use sub-select commands embedded in data modification statements. You can issue a while select crossCompany statement first, and then use the populated table buffer to drive data modification commands. The changeCompany keyword is a central part of this technique.
Data Modification Options
In X++, you can modify data with either SQL statements or with methods on a table buffer. The SQL statements are best for modifying a set of rows with one command. The methods are used to modify one row per call.
The SQL data modification statements are:
delete_from
insert_recordset
update_recordset
The data modification methods on a table buffer variable are inherited from the xRecord class. These methods are:
delete
insert
update
All of these options can be used in cross-company data modification processing.
delete_from Command
In X++ code, you can delete data on a cross-company basis, even though you cannot use the crossCompany keyword on the delete_from statement. The following code example shows one way you can do this.
static void JobCCDel( Args _args )
{
Table21 tab21a , tab21b;
;
ttsBegin;
while select
crossCompany
minof( ratingNum )
, dataAreaId
from
tab21a
group by
dataAreaId
{
changeCompany( tab21a .dataAreaId )
{
tab21b = null;
delete_from tab21b
where tab21b .ratingNum == tab21a .ratingNum;
}
}
ttsCommit;
}
insert Method
The following X++ code example shows how to use the cross-company feature for inserting data, even though the crossCompany keyword cannot be used on the insert_recordset command.
static void JobCCIns( Args _args )
{
Table21 tab21;
Table22 tab22;
;
ttsBegin;
while select
crossCompany
actionDate , name , dataAreaId
from
tab21
where
tab21 .actionDate > str2Date( '1998-01-22' , 321 )
{
changeCompany( tab21 .dataAreaId )
{
tab22 = null;
tab22 .actionDate = tab21 .actionDate;
tab22 .name = tab21 .name;
tab22 .insert();
}
}
ttsCommit;
}
update_recordset with forUpdate on select
This X++ example uses the forUpdate keyword on the while select crossCompany statement. Only one table buffer variable is declared. This example also uses the update method on the table buffer.
static void JobCCForUpdMethod( Args _args )
{
Table21 tab21;
;
ttsBegin;
while select
forUpdate crossCompany
countOfReviews
from
tab21
{
changeCompany( tab21 .dataAreaId )
{
tab21 .countOfReviews = tab21 .countOfReviews + 2;
tab21 .update();
}
}
ttsCommit;
}
Announcements: New book: "Inside Microsoft Dynamics AX 2012 R3" now available. Get your copy at the MS Press Store.