![]() |
#1 |
Участник
|
How to compare two records of the same table
Источник: http://alexvoy.blogspot.com/2013/09/...ame-table.html
============== Amongst other mundane chores, from time to time AX consultants and programmers need to check if two table records are indentical and what the difference is if they are not. Here is a small project for AX 2012 with tmxTableBufferOperation class that provides the following static methods:
There is also a batch demonstrating how to use them: The main idea is to use reflection DictTable class to enumerate all the fields of the given table buffer and then populate containers with its field ids, names and values. X++: static public List getTwoRecordsFieldList(Common _record1, Common _record2) { Common buffer1; Common buffer2; List list = new List(Types::Container); //list of all the fields, field names and values List bufferList = new List(Types::Container); //final list of all the fields, field names and values of these two records ListEnumerator le; int i; fieldId fieldId; DictTable dictTable; DictField dictField; container c; if(_record1.TableId != _record2.TableId) { error(strFmt('Both records are supposed to be of the same table type!')); } dictTable = new DictTable(_record1.TableId); if (dictTable) { // create the list of all the fields in the table for (i = dictTable.fieldCnt(); i; i--) { fieldId = dictTable.fieldCnt2Id(i); dictField = new DictField(dictTable.id(), fieldId); list.addEnd([fieldId, fieldId2name(dictTable.id(), fieldId)]); } buffer1 = dictTable.makeRecord(); buffer2 = dictTable.makeRecord(); select buffer1 where buffer1.RecId == _record1.recId; select buffer2 where buffer2.RecId == _record2.recId; le = list.getEnumerator(); while (le.moveNext()) { c = le.current(); bufferList.addEnd([[conPeek(c,1), conPeek(c,2), buffer1.(conPeek(c,1))], [conPeek(c,1), conPeek(c,2), buffer2.(conPeek(c,1))]]); } } return bufferList; } Источник: http://alexvoy.blogspot.com/2013/09/...ame-table.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору. Последний раз редактировалось mazzy; 05.11.2013 в 14:43. |
|
![]() |
#2 |
Участник
|
Цитата:
А вот ни разу это не даст полный список полей в случае с таблицей в иерархии наследования. Нужно еще проверить, есть ли у нее родительская таблица, и при необходимости дополнить список ее полями, и так - до корневой таблицы в иерархии. См., например, \Classes\SysDictField\findFieldById. Еще непонятно, почему было не воспользоваться dictField.name(). Последний раз редактировалось gl00mie; 14.09.2013 в 12:53. |
|
|
За это сообщение автора поблагодарили: wojzeh (1). |
![]() |
#3 |
Участник
|
Дельные замечания!
Про наследование таблиц, думаю, верно. Я взял кусок стандартного кода, уж не помню, из какого класса и убрал для простоты ту часть, которая бежит по "вложенным полям". функцию нейм() не использовал, потому что балбес.
__________________
Felix nihil admirari |
|
|
|