首页 > 解决方案 > 如何更改缓存中的项目

问题描述

您好,我想更改和更改我的 acumatica 缓存中的值我想知道该怎么做

例如我想改变分机。以编程方式计算第一行或第二行的成本值,或者我可以检查事务 Descr 上是否已经存在“数据备份”。

在此处输入图像描述

在此处输入图像描述

 public delegate void PersistDelegate();
[PXOverride]
public void Persist(PersistDelegate baseMethod)
{
      if (Globalvar.GlobalBoolean == true)
        {
            PXCache cache = Base.Transactions.Cache;
        APTran red = new APTran();
        red.BranchID = Base.Transactions.Current.BranchID;
        red.InventoryID = 10045;
        var curyl = Convert.ToDecimal(Globalvar.Globalred);
        red.CuryLineAmt = curyl * -1;
        cache.Insert(red);

        }
        else
        {

        }

         baseMethod();
}

此代码在持久性上添加新行,但如果再次保存,则再次添加同一行 agaub u wabt ti 检查是否已经存在 inventoryID =10045; 在缓存中

谢谢您的帮助

标签: c#acumatica

解决方案


您可以使用视图名称或缓存类型来访问您的缓存实例。例如:(其中“Base”是图形实例)

Base.Transactions.Cache

或者

Base.Caches<APTran>().Cache

使用缓存实例,您可以使用CachedInsertedUpdatedDeleted根据您要查找的记录类型来循环缓存值。您还可以GetStatus()在对象上使用来确定它是否已插入、更新等。或者调用PXSelect将在缓存中找到结果(PXSelectReadOnly不会)。

所以你可以像这样循环你的结果:

foreach (MyDac row in Base.Caches<MyDac>().Cache.Cached)
{
    // logic
}

如果您知道要查找的缓存对象的键值,则可以使用 Locate 按键字段查找:

var row = (MyDac)Base.Transactions.Cache.Locate(new MyDac
{
    MyKey1 = "",
    MyKey2 = ""
    // etc... must include each key field
});

如前所述,您也可以只使用PXSelect语句来获取值。

一旦你有行来更新你设置对象属性的值,然后Update(row)在基础持久之前调用你的缓存,你就可以开始了。如果需要Insert(row)或类似Delete(row)

所以在你的情况下,你可能会在你的坚持中得到这样的结果:

foreach (APTran row in Base.Transactions.Cache.Cached)
{
    if (Globalvar.GlobalBoolean != true || row.TranDesc == null || !row.TranDesc.Contains("Data Backup"))
    {
        continue;
    }

    //Found my row
    var curyl = Convert.ToDecimal(Globalvar.Globalred);
    row.CuryLineAmt = curyl * -1;
    Base.Transactions.Update(row);
}

推荐阅读