创建自定义属性

穆拉里达兰·罗摩克里希南

我必须根据配置屏幕中的字母设置在掩码中显示价格。

我正在尝试为 DAC 字段编写一个自定义属性,以便我可以在报告中使用它。

我在下面给出了现有的一段代码。函数调用工作正常,我正在使用它来获取价值,但我无法将其用作 DAC 属性

#region PXPriceMaskAttribute
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Class)]
public class PXPriceMaskAttribute : PXStringAttribute
{
    #region Ctor
    public PXPriceMaskAttribute()
         : base()
    {

    }
    #endregion
    #region Implementation
    /// <exclude/>
    /// 
    public static string GetPriceMask(PXGraph grp , decimal? val)
    {
        string _maskedstring = string.Empty;
        decimal value = val ?? 0m;
        int ivalue = Convert.ToInt32(Math.Floor(value));
        if (ivalue > 0)
        {
            MemoSetUp setUp = PXSelect<MemoSetUp>.Select(grp);
            char[] arr = ivalue.ToString().ToCharArray();
            char prevvalue = ' ';

            foreach (char cval in arr)
            {
                if (prevvalue != cval)
                {
                    prevvalue = cval;
                    switch (cval)
                    {
                        case '1': _maskedstring += setUp.N1; break;
                        case '2': _maskedstring += setUp.N2; break;
                        case '3': _maskedstring += setUp.N3; break;
                        case '4': _maskedstring += setUp.N4; break;
                        case '5': _maskedstring += setUp.N5; break;
                        case '6': _maskedstring += setUp.N6; break;
                        case '7': _maskedstring += setUp.N7; break;
                        case '8': _maskedstring += setUp.N8; break;
                        case '9': _maskedstring += setUp.N9; break;
                        case '0': _maskedstring += setUp.N0; break;
                        default: break;
                    }
                }
                else
                {
                    _maskedstring += setUp.Repeate;
                }
            }
        }
        return _maskedstring;
    }

    public static string GetPriceMask(MemoSetUp setUp, decimal? val)
    {
        string _maskedstring = string.Empty;
        decimal value = val ?? 0m;
        int ivalue = Convert.ToInt32(Math.Floor(value));
        if (ivalue > 0)
        {
            char[] arr = ivalue.ToString().ToCharArray();
            char prevvalue = ' ';

            foreach (char cval in arr)
            {
                if (prevvalue != cval)
                {
                    prevvalue = cval;
                    switch (cval)
                    {
                        case '1': _maskedstring += setUp.N1; break;
                        case '2': _maskedstring += setUp.N2; break;
                        case '3': _maskedstring += setUp.N3; break;
                        case '4': _maskedstring += setUp.N4; break;
                        case '5': _maskedstring += setUp.N5; break;
                        case '6': _maskedstring += setUp.N6; break;
                        case '7': _maskedstring += setUp.N7; break;
                        case '8': _maskedstring += setUp.N8; break;
                        case '9': _maskedstring += setUp.N9; break;
                        case '0': _maskedstring += setUp.N0; break;
                        default: break;
                    }
                }
                else
                {
                    _maskedstring += setUp.Repeate;
                }
            }
        }
        return _maskedstring;
    }
    public override void FieldUpdating(PXCache sender, PXFieldUpdatingEventArgs e)
    {

        if (e.NewValue != null && !e.Cancel)
        {
            decimal? value = Convert.ToDecimal(e.NewValue);
            e.NewValue = GetPriceMask(sender.Graph, value);
        }
    }
    /// <exclude/>
    public override void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
        if (_AttributeLevel == PXAttributeLevel.Item || e.IsAltered)
        {
            e.ReturnState = PXStringState.CreateInstance(e.ReturnState, _Length, _IsUnicode, _FieldName, _IsKey, null, _InputMask, null, null, null, null);
        }
    }
    /// <exclude/>

    #endregion
}
#endregion

上面这段代码不起作用。解决问题的最佳方法是什么。

更新

我创建了一个 BQL 评估器并附加到 DAC,它总是返回零。

public class PriceRounding<PriceField> : BqlFormulaEvaluator<PriceField>, IBqlOperand
        where PriceField : IBqlField
    {
        public override object Evaluate(PXCache cache, object item,
                                        Dictionary<Type, object> pars)
        {
            PXFieldState fState = cache.GetStateExt<PriceField>(item) as PXFieldState;
            return GetSortOrderValueExt(Convert.ToDecimal(fState.Value));
        }

        public decimal GetSortOrderValueExt(decimal dVal)
        {
            dVal = Math.Round(dVal, 0);
            decimal divider = (dVal <= 5000) ? 25m : (dVal <= 10000) ? 50m : (dVal <= 100000) ? 100m : 500m;
            decimal reminder = dVal % divider;
            if (reminder > 0)
            {
                decimal diff = divider - reminder;
                dVal = dVal + diff;
            }
            return dVal;
        }
    }

DAC领域

#region RetailPrice
        public abstract class retailPrice : PX.Data.IBqlField
        {
        }
        protected decimal? _RetailPrice;
        [PXDBDecimal(2)]
        [PXUIField(DisplayName = "Retail Price")]
        [PXFormula(typeof(PriceRounding<InfoInventoryItemAttributeExtNV.retailPrice>))]
        public virtual decimal? RetailPrice
        {
            get
            {
                return this._RetailPrice;
            }
            set
            {
                this._RetailPrice = value;
            }
        }
        #endregion
穆拉里达兰·罗摩克里希南

以下代码对我来说比使用 BQL 公式评估器更适合自定义四舍五入

#region PXDBPriceRoundingAttribute

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Class)]
    public class PXDBPriceRoundingAttribute : PXDBDecimalAttribute
    {
        #region Implementation
        public static decimal Round(decimal value)
        {
            value = Math.Round(value, 0);
            decimal divider = (value <= 5000) ? 25m : (value <= 10000) ? 50m : (value <= 100000) ? 100m : 500m;
            decimal reminder = value % divider;
            if (reminder > 0)
            {
                decimal diff = divider - reminder;
                value = value + diff;
            }

            return value;
        }

        public override void RowSelecting(PXCache sender, PXRowSelectingEventArgs e)
        {
            base.RowSelecting(sender, e);
            string name = _FieldName;
            if (sender.GetValue(e.Row, _FieldOrdinal) == null)
            {
                sender.SetValue(e.Row, _FieldOrdinal, 0m);
            }
            else
            {
                decimal? value = sender.GetValue(e.Row, _FieldOrdinal) as decimal?;
                decimal _roundedValue = Round(value ?? 0m);
                if ((value ?? 0m) != _roundedValue)
                {
                    sender.SetValue(e.Row, _FieldOrdinal, _roundedValue);
                }
            }

        }
        public override void FieldUpdating(PXCache sender, PXFieldUpdatingEventArgs e)
        {
            base.FieldUpdating(sender, e);
            decimal? value = sender.GetValue(e.Row, _FieldOrdinal) as decimal?;
            decimal _roundedValue = Round(value??0m);
            if((value??0m) != _roundedValue)
            {
                sender.SetValue(e.Row, _FieldOrdinal, _roundedValue);
            }
        }

        public void FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
        {
            decimal? value = sender.GetValue(e.Row, _FieldOrdinal) as decimal?;
            decimal _roundedValue = Round(value ?? 0m);
            if ((value ?? 0m) != _roundedValue)
            {
                sender.SetValue(e.Row, _FieldOrdinal, _roundedValue);
            }
        }

        public override void RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
        {
            base.RowPersisting(sender, e);
            decimal? value = sender.GetValue(e.Row, _FieldOrdinal) as decimal?;
            decimal _roundedValue = Round(value ?? 0m);
            if ((value ?? 0m) != _roundedValue)
            {
                sender.SetValue(e.Row, _FieldOrdinal, _roundedValue);
            }
        }
        #endregion
        #region Initialization
        public override void CacheAttached(PXCache sender)
        {
            base.CacheAttached(sender);
            _Precision = CommonSetupDecPl.PrcCst;
        }
        #endregion
    }

    #endregion

在 DAC 中使用

#region WholeSalesPrice
        public abstract class wholeSalesPrice : PX.Data.IBqlField
        {
        }
        protected decimal? _WholeSalesPrice;
        [PXDBPriceRoundingAttribute()]
        [PXUIField(DisplayName = "Wholesale Price")]

        public virtual decimal? WholeSalesPrice
        {
            get
            {
                return this._WholeSalesPrice;
            }
            set
            {
                this._WholeSalesPrice = value;
            }
        }
        #endregion

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章