c# - 如何更改缓存中的项目
问题描述
您好,我想更改和更改我的 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; 在缓存中
谢谢您的帮助
解决方案
您可以使用视图名称或缓存类型来访问您的缓存实例。例如:(其中“Base”是图形实例)
Base.Transactions.Cache
或者
Base.Caches<APTran>().Cache
使用缓存实例,您可以使用Cached
、Inserted
、Updated
或Deleted
根据您要查找的记录类型来循环缓存值。您还可以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);
}
推荐阅读
- android - Flutter:如果页面已经被压入堆栈,如何重新打开它们?
- algorithm - 具有给定 OR 值的对数
- c# - GetType 在 C# 中的每个对象中是如何实现的?
- c# - Unity-如何使对象始终面对移动的相机?
- c# - 获取所有已实现接口的列表
- android - Flutter:如何在触发转换之前为小部件设置动画?
- asp.net - cTransform.TransformFinalBlock 总是返回空字符串?
- python-3.x - 如何将多本词典变成一本词典?
- swift - 使用任何 RGB 颜色空间时无法获得有效的 CGContext?
- php - Wampserver RewriteRule 问题