我需要能够通过代码在Acumatica自定义中更改项目ID(db中的Contract.ContractCD),而无需显示用户对话框。这应该很简单,但事实并非如此。从到目前为止的经验来看,我认为我需要创建一个PXChangeID动作,就像ProjectEntry图中的现有动作一样,该动作会打开一个对话框,但没有该对话框。 Acumatica自己的代码中有一些PXChangeID的用法,但是没有对话框弹出框,我什么也找不到。如果有人有一个可行的例子,我很乐意看到它。
对于不熟悉的人,如果只更改值并保存,它的作用就像是插入,因为默认情况下不允许更改键值。尽管这很有意义,但是应该有一种方法可以覆盖它。
更新-尝试根据响应建议使用PXDatabase.Update(),但出现运行时错误,即PMProject不是有效的对象名称。
PXDatabase.Update<PMProject>(
new PXDataFieldAssign<PMProject.contractCD>(project.ContractCD),
new PXDataFieldRestrict<PMProjectExtension.usrSharedProjectID>(projectExt.UsrSharedProjectID)
);
答案 0 :(得分:1)
根据您要更新CD字段的方式,我只使用PXDatabase.Update。调用PXDatabase.Update将在调用表后立即对其进行更新-而不是在保留图形时进行更新。拨打电话后,您将需要刷新显示项目的视图。
这是一个可用于任何ID / CD表的工作示例:
public static void ChangeCDValue<Dac, IDField, CDField>(int? id, string newCD)
where Dac : IBqlTable
where IDField : IBqlField
where CDField : IBqlField
{
if (id == null)
{
throw new ArgumentNullException(nameof(id));
}
if (string.IsNullOrWhiteSpace(newCD))
{
throw new ArgumentNullException(nameof(newCD));
}
PXDatabase.Update<Dac>(
new PXDataFieldAssign<CDField>(newCD),
new PXDataFieldRestrict<IDField>(PXDbType.Int, id));
}
要更新项目CD,您可以像下面这样使用Contract DAC:
ChangeCDValue<PX.Objects.CT.Contract, PX.Objects.CT.Contract.contractID, PX.Objects.CT.Contract.contractCD>(3354, "TESTCHANGE");
类似的更改库存CD值的调用:
ChangeCDValue<PX.Objects.IN.InventoryItem, PX.Objects.IN.InventoryItem.inventoryID, PX.Objects.IN.InventoryItem.inventoryCD>(10, "NEWCD");
或者,如在问题注释中提到的 @HB_Acumatica 一样,您可以制作自己的ChangeProjectID
类版本,以删除对话框代码。如果您在按名称搜索类时遇到问题,则该类位于Acumatica站点中的以下文件中:App_Data \ CodeRepository \ PX.Objects \ PM \ ProjectEntry.cs
使用ChangeProjectID中的代码将使您可以更新缓存中的值,并等待进行更改直到持久。在视觉上,它应该显示更改,而无需进行自己的刷新。