Вы можете использовать событие RowUpdated
и сравнить старую строку с новой строкой, чтобы определить, какое поле изменилось. Я согласен с тем, что предпочтительнее хранить все логи c в одном методе.
public virtual void DAC_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
DAC row = e.Row as DAC;
DAC oldRow = e.OldRow as DAC;
if (row == null || oldRow == null) return;
// Compare old row with new row to determine which field changed
if (row.Inches != oldRow.Inches)
{
// Inches field changed, update CM value
row.CM = row.Inches * INCHES_TO_CM_CONSTANT;
}
// Add more conditions for the other fields
[..]
}
Я знаю, что формулы будут создавать циклическую ссылку, поэтому их нельзя использовать.
Да, я бы тоже не советовал, вы могли бы использовать свойство Setter DA C.
public string _Inches
public virtual string Inches
{
get
{
return this._Inches;
}
set
{
this._Inches = value;
this.CM = value * INCHES_TO_CM_CONSTANT;
}
}
Для всех решений (кроме атрибутов Formula / DA C) я думаю, что условие нужно остановить рекурсия должна быть возможной, если это абсолютно необходимо:
if (this.CM != value * INCHES_TO_CM_CONSTANT)
this.CM = value * INCHES_TO_CM_CONSTANT;
Идеально правильное использование / обход SetValueExt
для контроля, когда возникают события (метод Ext вызывает события), было бы достаточно, чтобы остановить бесконечные циклы.