Sometimes you need to know what’s the difference between records. I
made a simple function to do just that.It takes two records and returns a
container with the field IDs and the values from both records. For
simplicity I used a flattened container instead of more complicated data
structures. Feel free to replace it with nested containers or some
kind of collection.
I added this to the class Global for easy access.
public static container compareRecords(Common _record1, Common _record2) { SysDictTable dictTable = new SysDictTable(_record1.TableId); SysDictField dictField; FieldId fieldId, extFieldId; container ret; int i, j; ; if (_record1.TableId != _record2.TableId) return conNull(); for (i=1; i<=dictTable.fieldCnt(); ++i) { fieldId = dictTable.fieldCnt2Id(i); dictField = new SysDictField(_record1.tableId, fieldId); if (!dictField.isSystem()) { for (j=1; j<= dictField.arraySize(); ++j) { extFieldId = fieldId2Ext(fieldId, j); if (_record1.(extFieldId) != _record2.(extFieldId)) { ret += [extFieldId, _record1.(extFieldId), _record2.(extFieldId)]; } } } } return ret; }
Using it is quite straightforward.
static void demoCompareRecords(Args _args) { CustTable custTable1 = CustTable::find('1101'); // CEE demo data CustTable custTable2 = CustTable::find('1102'); // CEE demo data container con; int i; ; con = Global::compareRecords(custTable1, custTable2); for (i=1; i<=conLen(con); i+=3) { info(strFmt("%1: '%2' <-> '%3'" ,fieldId2Name(tableNum(CustTable), conPeek(con, i)) ,conPeek(con, i+1) ,conPeek(con, i+2) ) ); } }
No comments:
Post a Comment