Acumatica 如何更改自定义代码中记录的id键值

Acumatica 如何更改自定义代码中记录的id键值,acumatica,Acumatica,我需要能够通过代码在Acumatica定制中更改项目ID(数据库中的Contract.ContractCD),而不显示用户对话框。这应该是直截了当的,但似乎并非如此。根据我目前收集的信息,我认为我需要创建一个PXChangeID操作,就像ProjectEntry图形中打开对话框但没有对话框的现有操作一样。Acumatica自己的代码中有一些PXChangeID的用法,但是如果没有弹出的对话框,我什么都找不到。如果有人有一个有效的例子,我很乐意看到 对于那些不熟悉的人,如果您只是更改值并保存,它就

我需要能够通过代码在Acumatica定制中更改项目ID(数据库中的Contract.ContractCD),而不显示用户对话框。这应该是直截了当的,但似乎并非如此。根据我目前收集的信息,我认为我需要创建一个PXChangeID操作,就像ProjectEntry图形中打开对话框但没有对话框的现有操作一样。Acumatica自己的代码中有一些PXChangeID的用法,但是如果没有弹出的对话框,我什么都找不到。如果有人有一个有效的例子,我很乐意看到

对于那些不熟悉的人,如果您只是更改值并保存,它就像插入一样,因为默认情况下不允许更改键值。虽然这是有道理的,但应该有一种方法来克服这一点

Update-尝试按照响应中的建议使用PXDatabase.Update(),但出现运行时错误,表明PMProject不是有效的对象名称

PXDatabase.Update<PMProject>(
    new PXDataFieldAssign<PMProject.contractCD>(project.ContractCD),
    new PXDataFieldRestrict<PMProjectExtension.usrSharedProjectID>(projectExt.UsrSharedProjectID)
);
PXDatabase.Update(
新的PXDataFieldAssign(project.ContractCD),
新的PXDataFieldRestrict(projectExt.UsrSharedProjectID)
);

根据您想要更新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));
}
publicstaticvoidchangecdvalue(int?id,stringnewcd)
其中Dac:IBqlTable
其中IDField:IBqlField
其中CDField:IBqlField
{
if(id==null)
{
抛出新ArgumentNullException(nameof(id));
}
if(string.IsNullOrWhiteSpace(newCD))
{
抛出新ArgumentNullException(nameof(newCD));
}
PXDatabase.Update(
新建PXDataFieldAssign(新建CD),
新的PXDataFieldRestrict(PXDbType.Int,id));
}
要更新项目CD,您可以使用合同DAC,如下所示:

ChangeCDValue<PX.Objects.CT.Contract, PX.Objects.CT.Contract.contractID, PX.Objects.CT.Contract.contractCD>(3354, "TESTCHANGE");
ChangeCDValue(3354,“TESTCHANGE”);
更改库存CD值的类似调用:

ChangeCDValue<PX.Objects.IN.InventoryItem, PX.Objects.IN.InventoryItem.inventoryID, PX.Objects.IN.InventoryItem.inventoryCD>(10, "NEWCD");
ChangeCDValue(10,“NEWCD”);
或者,正如您的问题评论中提到的@HB_Acumatica,您可以制作自己版本的
changeprojectd
类,删除对话框代码。如果按名称搜索类时遇到问题,则该类位于Acumatica站点的以下文件中:App_Data\coderestorage\PX.Objects\PM\ProjectEntry.cs


使用ChangeProjectID中的代码将允许您更新缓存中的值,并等待进行更改,直到持久化。直观地显示更改,而无需您自己进行刷新。

快速回答是使用PXDatabase。更新并将CD值设置为新值,因为在表中它不是键-您应该是安全的。ID是关键,可以在任何地方使用。您还可以复制ChangeProjectID类,从处理程序中删除对话框,并用自己的逻辑替换它。神奇发生在ChangeCDProject方法中。刚刚尝试使用PXDatabase.Update,但它告诉我PMProject是无效的对象名称。哈?HB_ACUMATICA——我在源代码中搜索了ChangeProjectID和ChangeCDProject,但都没有找到。你是说ChangeID吗?在INItemClassMaint图中,我发现了一个看起来很有前途的即时ChangeID类,但我也不能让它工作。它仍然在保存时创建一个新项目,而不是更新CategoryCD字段。您提到的文件中没有任何更改CDValue(),至少对于我使用的构建--17.210.0034。您引用的是较新的版本吗?我刚刚查看了较新的版本源(18.208.0013),现在看到了ChangeCDProject(),但没有ChangeCDValue()。我想我会看看这个新版本中的ChangeCDProject()是否有帮助。我想我用的是18.206。我认为更改ID功能是在18R1或18R2中添加的,因此这是有意义的。感谢您的工作示例。我用它最终使它发挥作用。正如我前面提到的,我自己的PXDatabase.Update()调用为PMProject返回了一个错误。我还使用扩展字段作为标准。在你们的例子中,一旦我改为使用契约和收缩,它就会起作用。由于我的场景,我必须首先使用扩展字段查询收缩。我认为我最初的工作方式也应该是可行的,尽管PMProject是一个子类,引用的字段是一个扩展字段。可能有bug,但至少它现在起作用了。