【发布时间】:2018-01-12 03:35:41
【问题描述】:
我需要在 SalesOrder 屏幕上有一个字段,并且相同的字段也应该出现在各个 SalesOrder 的 Shipment 屏幕上。并且用户应该能够在两个屏幕上更新这些字段。
我在销售订单屏幕上创建了一个绑定字段,用户可以保存它。然后我在发货屏幕上创建了一个未绑定字段来显示销售订单中的文本。为此,我编写了一个 SOShipment_RowSelected 事件,后来为了让用户将其更新到数据库,我编写了 SOShipment_RowUpdated。但是,当我尝试编辑该字段时,它会触发 RowSelected 事件并覆盖编辑并返回相同的原始值。
我已尝试使用 SOShipment_ShipmentNbr_FieldUpdated 和 SOShipment_ShipmentNbr_FieldUpdating 事件,但不是每次都触发。
这里是缓存扩展的代码-
public class SOOrderExtension : PXCacheExtension<SOOrder>
{
#region UsrNotesText
[PXDBString(255)]
[PXUIField(DisplayName = "Pick List Notes")]
public virtual string UsrNotesText { get; set; }
public abstract class usrNotesText : IBqlField { }
#endregion
}
public class SOShipmentExtension : PXCacheExtension<SOShipment>
{
#region UsrNotesText
[PXString(255)]
[PXUIField(DisplayName = "Pick List Notes")]
public virtual string UsrNotesText { get; set; }
public abstract class usrNotesText : IBqlField { }
#endregion
}
SOSshipment扩展代码-
public class SOShipmentEntryExtension : PXGraphExtension<SOShipmentEntry>
{
PXSelect<SOOrder> soOrder;
protected virtual void SOShipment_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
if (e.Row != null)
{
SOOrder order = PXSelectJoin<SOOrder,
LeftJoin<SOOrderShipment, On<SOOrder.orderNbr, Equal<SOOrderShipment.orderNbr>,
And<SOOrder.orderType, Equal<SOOrderShipment.orderType>>>,
LeftJoin<SOShipment, On<SOOrderShipment.shipmentNbr, Equal<SOShipment.shipmentNbr>>>>,
Where<SOShipment.shipmentNbr, Equal<Current<SOShipment.shipmentNbr>>>>.Select(Base);
if (order != null)
{
SOOrderExtension orderExt = PXCache<SOOrder>.GetExtension<SOOrderExtension>(order);
SOShipment soShipment = Base.Document.Current;
SOShipmentExtension ext = PXCache<SOShipment>.GetExtension<SOShipmentExtension>(soShipment);
ext.UsrNotesText = orderExt.UsrNotesText;
}
}
}
protected virtual void SOShipment_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
SOShipment oldRow = (SOShipment)e.OldRow;
SOShipment newRow = (SOShipment)e.Row;
if (oldRow != null || newRow != null)
{
SOShipmentExtension oldExt = PXCache<SOShipment>.GetExtension<SOShipmentExtension>(oldRow);
SOShipmentExtension newExt = PXCache<SOShipment>.GetExtension<SOShipmentExtension>(newRow);
if (oldExt.UsrNotesText != newExt.UsrNotesText)
{
{
SOOrder order = PXSelectJoin<SOOrder,
LeftJoin<SOOrderShipment, On<SOOrder.orderNbr, Equal<SOOrderShipment.orderNbr>,
And<SOOrder.orderType, Equal<SOOrderShipment.orderType>>>,
LeftJoin<SOShipment, On<SOOrderShipment.shipmentNbr, Equal<SOShipment.shipmentNbr>>>>,
Where<SOShipment.shipmentNbr, Equal<Current<SOShipment.shipmentNbr>>>>.Select(Base);
soOrder.Current = order;
if (order != null)
{
SOOrderExtension orderExt = PXCache<SOOrder>.GetExtension<SOOrderExtension>(order);
orderExt.UsrNotesText = newExt.UsrNotesText;
soOrder.Update(order);
}
}
}
}
}
}
有什么建议吗?
【问题讨论】:
-
RowSelected 不是数据更新的好地方。应该只用于 UI 内容,例如可见、启用等。RowInserted 怎么样?
-
RowInserted 也不起作用。我认为只有在为主 DAC 插入新行时才会触发。我知道 RowSelected 不是设置一些默认值的好地方,但是由于某种原因,没有其他事件对我有用。
-
如果一切都失败了,SOSshipment_UsrNotesText_FieldSelecting 应该这样做。
-
问题是没有触发此类事件。我正在使用 Acumatica 版本 17.203.0029,该事件是否有任何问题。
-
我从来没有触发过FieldSelecting。事实上,它通常是大多数事件问题的最后解决方案。仔细检查语法: public void SOShipment_UsrNotesText_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
标签: acumatica