使用Acumatica API提交员工薪资数据时出现SQL空值错误
Acumatica API录入员工数据时JWMEmployeeTypeID为空的问题排查
问题根源分析
你遇到的错误本质是子表JWMEmployeeProjectMgmt的JWMEmployeeTypeID字段未被正确赋值,即便传入了HRB,可能的原因包括以下几点:
1. 主表与子表操作顺序错误
代码先执行了子表PayPay的NewRow,再赋值主表EmployeeInfo.EmployeeID,最后执行Insert。这种顺序下,子表行无法关联到未创建的主表行,导致子表字段的赋值未被系统正确处理。
2. 字段映射不匹配
w.PayPay.EmployeeType可能并非直接映射到JWMEmployeeTypeID字段——Acumatica中部分自定义字段的显示名称与数据库存储字段名不一致,需要确认Schema中对应的实际字段是否为JWMEmployeeTypeID。
3. 子表行未被正确提交
仅赋值子表字段但未执行Commit命令,可能导致字段值未被持久化到数据库层面。
解决办法
调整操作顺序(核心修复)
先创建并插入主表行,再处理子表数据,确保子表行能关联到已存在的主表记录:
WM2010JMContent w = context.WM2010JMGetSchema(); List<Command> cmds2 = new List<Command>(); // 1. 初始化主表新行 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.EmployeeInfo.ServiceCommands.NewRow }); // 2. 赋值主表员工ID cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.EmployeeInfo.EmployeeID, Value = employee.General.EmployeeID.ToString() }); // 3. 插入主表行,确保主表记录存在 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.Actions.Insert }); // 4. 初始化PayPay子表新行 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.ServiceCommands.NewRow }); // 5. 赋值子表字段 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.EmployeeType, Value = "HRB" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.Currency, Value = "USD" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.NoteText, Value = "USD" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.YearlySalary, Value = "0" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.HourlyRate, Value = "0" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.PayPeriodSalary, Value = "0" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.EffectiveDate, Value = "4/28/2023" }); cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.EffectiveEndDate, Value = "4/28/2026" }); // 6. 提交子表行,确保字段值被持久化 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.PayPay.ServiceCommands.Commit }); // 7. 保存整个记录 cmds2.Add(new AtlasSync.DataSync.Value { LinkedCommand = w.Actions.Save }); var res2 = context.WM2010JMSubmit(cmds2.ToArray());
额外验证步骤
- 确认字段映射:通过Acumatica自定义项目编辑器查看
WM2010JM表单中,EmployeeType对应的数据库字段是否为JWMEmployeeTypeID,若不是,直接改用对应的字段(比如w.PayPay.JWMEmployeeTypeID)。 - 验证员工类型值:检查Acumatica系统中员工类型配置,确认
HRB是JWMEmployeeTypeID的有效值(而非仅显示名称为HRB)。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

