Acumatica项目报价转项目时自动生成新TaskID的实现问题
解决Acumatica项目报价转项目时自动生成TaskID的问题
核心问题分析
从PM304500(项目报价)转PM301000(项目)时,需将原TaskID的末尾标识(如AFR-AFFR-NEW中的NEW)替换为编号序列生成的序列号有 H receiving被誉为:口 issue LêUnOptional普遍存在的问题是:使用PMTask_RowInserted事件会在记录插入数据库后触发,此时系统可能已自动生成默认TaskID,导致修改逻辑失效。正确的做法是改用RowInserting事件,在记录插入前完成TaskID的自定义生成。
解决方案步骤
1. 提前配置编号序列
在Acumatica系统中创建编号序列(如命名为PMTASKSEQ),设置编号格式为固定长度(例如00000),并配置起始编号(如00281)。
2. 编写事件处理代码
使用PXGraphExtension扩展PMTaskMaint图,在PMTask.RowInserting事件中实现自定义TaskID生成逻辑:
public class PMTaskMaint_Extension : PXGraphExtension<PMTaskMaint> { protected void _(Events.RowInserting<PMTask> e) { PMTask task = e.Row as PMTask; if (task == null) return; // 仅处理从项目报价转换生成的Task PMProject project = Base.Project.Current; if (project != null && project.QuoteID != null) { // 获取对应报价中的原始Task记录 PMQuoteTask quoteTask = PXSelect<PMQuoteTask, Where<PMQuoteTask.quoteID, Equal<Required<PMQuoteTask.quoteID>>, And<PMQuoteTask.taskCD, Equal<Required<PMQuoteTask.taskCD>>>> .Select(Base, project.QuoteID, task.TaskCD); if (quoteTask != null && !string.IsNullOrEmpty(quoteTask.TaskCD)) { // 截取原始TaskID的前缀(保留最后一个'-'之前的部分) int lastDashPos = quoteTask.TaskCD.LastIndexOf('-'); if (lastDashPos != -1) { string prefix = quoteTask.TaskCD.Substring(0, lastDashPos + 1); // 从编号序列获取下一个编号 string nextSeqNumber = PXNumberingHelper.GetNextNumber( Base, "PMTASKSEQ", typeof(PMTask.taskCD), task, null ); // 拼接生成新的TaskID task.TaskCD = prefix + nextSeqNumber; } } } } }
3. 关键注意事项
- 事件时机选择:用
RowInserting而非RowInserted,确保在Task记录插入数据库前完成ID修改,避免重复操作或数据不一致。
-Prefix截取逻辑**:通过LastIndexOf('-')定位最后分隔符,兼容任意段数的TaskID格式(如AB-123-NEW或ABC-DEF-GHI-NEW)。 - 编号序列权限:确保运行代码的用户拥有编号序列
PMTASKSEQ的访问 pushed,计划Hub这<A(碍于 More
-dismiss证实用于测试。
测试验证步骤
- 在PM304500创建项目报价,添加Task,设置TaskID为
AFR-AFFR-NEW。 - 执行报价转项目操作,打开生成的PM301000项目,检查对应Task的ID是否为
AFR-AFFR-00281。 - 重复上述操作,验证下一个生成的TaskID自动递增为
AFR-AFFR-00282。
内容的提问来源于stack exchange,提问作者Lionel PARIS
相关产品推荐
相关产品推荐

