如何在项目输入屏幕(PM301000)中正确排序具有多级任务ID的任务,如1,1.1,1.1.5,1.2,2,2.1.3,2.2,4,11,13,44等?

默认的开箱即用排序:

在此处输入图像描述

预期排序:

在此处输入图像描述

为项目任务分段密钥(CS202000)设置Edit MaskUnicode ,以允许多级任务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/PXViewOrderByNew方法替换数据视图的排序。

 public class ProjectEntryPXDemoExt : PXGraphExtension { public override void Initialize() { Base.Tasks.OrderByNew>>(); } }