如何在项目输入屏幕(PM301000)中正确排序具有多级任务ID的任务,如1,1.1,1.1.5,1.2,2,2.1.3,2.2,4,11,13,44等?
默认的开箱即用排序:
预期排序:
为项目任务分段密钥(CS202000)设置Edit Mask
为Unicode
,以允许多级任务CD(允许.
值)
要获得预期的排序,
我们将创建自定义BQL函数,它将数字部分填充到开箱即用的TaskCD字段。
public class HierarchySorting : BqlFormulaEvaluator , IBqlOperand where StringField : IBqlField { public override object Evaluate(PXCache cache, object item, Dictionary pars) { PXFieldState fState = cache.GetStateExt (item) as PXFieldState; return GetSortOrderValueExt(Convert.ToString(fState.Value)); } public string GetSortOrderValueExt(string taskCD) { return Regex.Replace(taskCD, "[0-9]+", MatchReplacer => MatchReplacer.Value.PadLeft(10, '0')); } }
这个自定义BQL函数将在现成的TaskCD值中为任意数字填充零。
我们将在PMTask
DAC扩展中创建一个新的未绑定用户定义字段,并将使用具有自定义BQLfunction的PXFormula
进行装饰
public class PMTaskPXExt : PXCacheExtension { public abstract class usrSortingTaskCD : IBqlField { } [PXString(IsUnicode = true)] [PXUIField(DisplayName = "Usr Task")] [PXFormula(typeof(HierarchySorting))] public virtual string UsrSortingTaskCD { get; set; } }
我们将使用PXSelectBase/PXView
的OrderByNew
方法替换数据视图的排序。
public class ProjectEntryPXDemoExt : PXGraphExtension { public override void Initialize() { Base.Tasks.OrderByNew>>(); } }