InventBatch
table what exactly is added and why.Problem description
Analyse how an unique index influences T-SQL statement.
Steps to reproduce
Run a test job:
static void Test_UniqueIndex_SQL(Args _args) { InventBatch inventBatch; select generateonly description from inventBatch; info (inventBatch.getSQLStatement()); } |
Hints
Change index properties on the table and re-run test job.
Solution
1.
CreateRecIdIndex
property of InventBatch
table is set to No, itemBatchIdx
index is unique and consists of itemId
and inventBatchId
fields.Select statement in T-SQL is:
SELECT T1.INVENTBATCHID, T1.ITEMID, T1.PARTITION, 101090, T1.DESCRIPTION FROM INVENTBATCH T1 WHERE ((PARTITION=?) AND (DATAAREAID=?)) |
itemBatchIdx
index in SQL database consists of PARTITION, DATAAREAID, ITEMID and INVENTBATCHID fields. It is not clear why DataAreaId
field is not selected in T-SQL.Conclusion1: if fields of an unique index are not selected in X++ statement, they are added into a field list of T-SQL statement.
2. Let's make
itemBatchIdx
index non-unique by setting index's AllowDuplicates
property to Yes. After synchronisation batchIdx
index is changed in SQL database only - RecId
field is added and index is made unique. The reason is described in msdn.T-SQL statement is:
SELECT T1.INVENTBATCHID, T1.PARTITION, T1.RECID, T1.DESCRIPTION FROM INVENTBATCH T1 WHERE ((PARTITION=?) AND (DATAAREAID=?)) |
Conclusion2: if a table has no unique index then an index with shortest definition is made unique by adding
RecId
field in SQL database, fields of such index are added into a field list of T-SQL statement.3. Let's disable all table indexes in AX by setting
Enabled
property to No. After synchronisation unique index on RecId
field is created in SQL database only. The reason is the same:"If a table is not given a unique index (because there is no key in the application), the system will create a unique index to get a key".
T-SQL statement is:
SELECT T1.RECID, T1.DESCRIPTION FROM INVENTBATCH T1 WHERE ((PARTITION=?) AND (DATAAREAID=?)) |
Conclusion3: if a table has no index then an unique index on
RecId
field is created in SQL database and RecId
field is added into a field list of T-SQL statement.4. Let's restore standard AX properties and make
batchIdx
index unique by setting AllowDuplicates
property on index to No.T-SQL statement is:
SELECT T1.INVENTBATCHID, T1.PARTITION, 101090, T1.DESCRIPTION FROM INVENTBATCH T1 WHERE ((PARTITION=?) AND (DATAAREAID=?)) |
Conclusion4: if there are several unique indexes then fields from an unique index with the shortest definition are added into field list of T-SQL statement.
5. Let's create
RecId
index by setting CreateRecIdIndex
property to Yes.T-SQL statement is:
SELECT T1.RECID, T1.DESCRIPTION FROM INVENTBATCH T1 WHERE ((PARTITION=?) AND (DATAAREAID=?)) |
RecId
usually has the shortest definition.Conclusion5: if
RecId
index is enabled then RecId
field is added into a field list of T-SQL statement.
No comments:
Post a Comment