如何在PM301000项目录入界面正确排序多级任务ID?
解决PM301000项目录入界面多级任务ID的正确排序问题
嘿,我来帮你搞定这个多级任务ID的排序坑!首先得明白为啥默认排序会乱——因为系统把任务ID当成普通字符串来排序了,字符串比较是逐字符比的,比如"11"的第一个字符是"1",比"2"小,所以就会排在2前面,完全不符合我们的层级逻辑。
要实现你想要的那种按层级顺序(1→1.1→1.1.5→1.2→2→2.1.3→2.2→4→11→13→44)的排序,我给你两个靠谱的实操方案:
方法一:自定义排序字段(最推荐,简单易维护)
这个思路是给任务表加一个计算字段,把多级ID转换成"补零对齐"的字符串,让字符串排序能匹配层级逻辑:
- 打开Acumatica的自定义项目编辑器,找到PMTask这个DAC(数据访问类)
- 添加一个自定义字符串字段,比如叫
UsrTaskIDSortable,长度设50足够用 - 给这个字段加计算逻辑:把原TaskID按点拆分,每个部分补前导零到固定位数(比如3位,应对三位数的层级编号),再用点拼接回去。举个例子:
- 原ID"1" → 转成"001"
- 原ID"1.1" → 转成"001.001"
- 原ID"11" → 转成"011"
你可以用DAC的FieldUpdated事件来实现这个转换(代码示例在下面),或者用SQL计算字段
- 回到PM301000的任务网格,调整排序规则,把这个自定义字段设为升序排序依据,替换原来的TaskID排序
参考代码(C#自定义字段转换)
public class PMTaskExt : PXCacheExtension<PMTask> { public static bool IsActive() => true; [PXDBString(50)] [PXUIField(DisplayName = "排序用任务ID")] public virtual string UsrTaskIDSortable { get; set; } public abstract class usrTaskIDSortable : PX.Data.BQL.BqlString.Field<usrTaskIDSortable> { } // 当TaskID更新时自动计算排序字段 protected void _(Events.FieldUpdated<PMTask.taskID> e) { PMTask task = e.Row; if (task == null || string.IsNullOrEmpty(task.TaskID)) return; string[] idParts = task.TaskID.Split('.'); StringBuilder sortedID = new StringBuilder(); foreach (string part in idParts) { if (sortedID.Length > 0) sortedID.Append('.'); // 补3位前导零,可根据实际层级长度调整位数 sortedID.Append(part.PadLeft(3, '0')); } UsrTaskIDSortable = sortedID.ToString(); } }
方法二:自定义排序比较器(适合不想加字段的场景)
如果不想新增字段,也可以写一个自定义的排序比较逻辑,直接在代码里对TaskID进行语义化比较:
- 在PM301000界面的网格事件里,重写排序逻辑,把TaskID拆分成数字数组,逐层级比较数值大小,而不是字符串比较
- 比如在C#里实现一个
IComparer<string>,专门处理这种带点的多级ID排序,然后绑定到网格的排序规则上
不过这种方法相对复杂一点,维护起来不如自定义字段方便,所以更推荐方法一。
用了上面的方法后,你的任务ID就能按照层级逻辑正确排序啦,完全符合你想要的预期效果!
内容的提问来源于stack exchange,提问作者DChhapgar
相关产品推荐
相关产品推荐

