如何在自定义代码中更改记录的ID键值

时间:2019-02-06 19:36:36

标签: acumatica

我需要能够通过代码在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)
);

1 个答案:

答案 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中的代码将使您可以更新缓存中的值,并等待进行更改直到持久。在视觉上,它应该显示更改,而无需进行自己的刷新。