如何通过ScanExtension重写扫描移库界面的表达式体成员CanOverrideQty?
在Acumatica Scan Move界面重写CanOverrideQty属性的正确方式
问题根源
你遇到的“没有合适的方法可重写”错误,本质是因为ScanMove.ScanExtension基类中的CanOverrideQty属性没有标记为virtual——只有标记为virtual的成员才能被子类重写。而你尝试的[PXOverride]特性仅适用于重写方法,对非virtual的表达式体属性无效,所以加了特性后代码不会执行。
可行解决方案
1. 查找基类中对应的可重写方法
部分Acumatica扫描界面的属性会依赖底层的virtual方法实现逻辑。你可以通过反编译工具(如dotPeek)查看ScanMove.ScanExtension的源码,找到CanOverrideQty依赖的virtual方法。例如,如果基类中有GetCanOverrideQty()这样的virtual方法,就可以直接重写:
public class ScanMoveExt : ScanMove.ScanExtension { protected override bool GetCanOverrideQty() { return (!Base1.DocumentLoaded || Base1.NotReleasedAndHasLines) && (Base1.SelectedLotSerialClass?.LotSerTrack != INLotSerTrack.SerialNumbered || Base1.SelectedLotSerialClass?.LotSerAssign == INLotSerAssign.WhenUsed); } }
2. 直接定制SetQtyCommand的启用状态
如果找不到可重写的virtual成员,直接操作命令的启用状态是更可靠的方案,这也是你提到的替代方法。可以在扩展类的Initialize方法中,为SetQtyCommand的Enabled属性绑定自定义判断逻辑:
public class ScanMoveExt : ScanMove.ScanExtension { public override void Initialize() { base.Initialize(); SetQtyCommand.Enabled.SetVisibleDelegate(() => CustomCanOverrideQty()); } private bool CustomCanOverrideQty() { return (!Base1.DocumentLoaded || Base1.NotReleasedAndHasLines) && (Base1.SelectedLotSerialClass?.LotSerTrack != INLotSerTrack.SerialNumbered || Base1.SelectedLotSerialClass?.LotSerAssign == INLotSerAssign.WhenUsed); } }
额外说明
Acumatica的WMS扫描界面扩展逻辑和普通Graph扩展存在差异,很多属性是内部计算的,并非全部对外暴露可重写的virtual成员。直接查看基类源码是确认重写入口最准确的方式。
内容的提问来源于stack exchange,提问作者Rochelle C
相关产品推荐
相关产品推荐

