Довольно простое решение ... Я создал собственный класс, который наследуется от INItemPlan, и добавил туда свое поле. Это позволило мне получить доступ к полю при поиске в таблице INItemPlan моей пользовательской ссылки.
[Serializable()]
public partial class ZZINItemPlan : INItemPlan, IBqlTable
{
#region UsrTagNbr
[PXDBString(15)]
[PXUIField(DisplayName ="Tag Nbr.")]
public virtual string UsrTagNbr { get; set; }
public abstract class usrTagNbr : PX.Data.IBqlField { }
#endregion
}
Далее найдите строку из "usrTagNbr" ...
ZZINItemPlan plan =
PXSelect<ZZINItemPlan, Where<ZZINItemPlan.usrTagNbr, Equal<Required<ZZINItemPlan.usrTagNbr>>>>
.Select(this, myData.TagNbr);
Если не найден TagNbr для применения обновлений, создайте новую строку ...
if (plan == null) plan = new ZZINItemPlan();
[set values here]
Давайте выполним нормальный граф для обновления (который будет вставлен, если не найден) в базу данных, чтобы вся нормальная бизнес-логика была проверена для проверки. (Мы должны привести данные ZZINItemPlan к INItemPlan для графика.)
INReplenishmentMaint graphRepl = PXGraph.CreateInstance<INReplenishmentMaint>();
INItemPlan iplan = graphRepl.Plans.Update((INItemPlan) plan);
Поскольку поле usrTagNbr было потеряно при преобразовании в INItemPlan, нам необходимо поместить данные TagNbr в расширение DAC.
INItemPlanExt planExt = PXCache<INItemPlan>.GetExtension<INItemPlanExt>(iplan);
planExt.UsrTagNbr = ncmTag.TagNbr;
graphRepl.Caches[typeof(INItemPlanExt)].Update(planExt);
graphRepl.Caches[typeof(INItemPlanExt)].Persist(PXDBOperation.Update);