You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Acumatica处理页面过滤器DAC字段问题:如何持久化设置用于行处理

解决Acumatica过滤器字段值在Process方法中丢失的问题

你遇到的核心问题是公共实例变量在Graph回发时会被重置——每次点击Process按钮触发回发,Acumatica会重新创建Graph实例,之前赋值的变量自然就丢失了。下面是几个靠谱的解决思路,都是Acumatica开发里常用的方案:

方案1:将字段绑定到过滤器DAC(推荐)

这是最规范的做法,把决定处理方式的字段直接集成到你的过滤器DAC中,它的值会自动被Acumatica的缓存机制保留,在Process方法里直接就能获取。

步骤:

  1. 更新过滤器DAC,添加你需要的字段:
public class MyProcessFilter : IBqlTable
{
    // 原有字段...
    [PXString(50)]
    [PXUIField(DisplayName = "处理模式")]
    public virtual string ProcessingMode { get; set; }
    public abstract class processingMode : PX.Data.BQL.BqlString.Field<processingMode> { }
}
  1. 在Graph中声明过滤器视图(如果已经有了就跳过):
public PXFilter<MyProcessFilter> Filter;
  1. 在Process方法中直接获取值:
public virtual IEnumerable Process(PXAdapter adapter)
{
    // 获取当前过滤器的选中记录
    MyProcessFilter currentFilter = Filter.Current;
    if (currentFilter == null) return adapter.Get();

    // 拿到你需要的字段值
    string processMode = currentFilter.ProcessingMode;

    // 用这个值处理行数据
    foreach (var row in adapter.Get())
    {
        if (processMode == "ModeA")
        {
            // 模式A的处理逻辑
        }
        else
        {
            // 模式B的处理逻辑
        }
        yield return row;
    }
    return adapter.Get();
}

这种方式完全利用Acumatica原生的缓存和ViewState机制,不需要额外处理值的持久化,还符合Acumatica的开发规范。

方案2:使用PXViewState保存临时值

如果你不想修改过滤器DAC(比如只是临时需求),可以用PXViewState来存储字段值——它会把数据存在页面的ViewState里,回发时不会丢失。

步骤:

  1. 在过滤器的RowSelected事件中保存值:
protected virtual void MyProcessFilter_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
    MyProcessFilter filter = e.Row as MyProcessFilter;
    if (filter != null)
    {
        // 将字段值存入ViewState,指定一个唯一的键
        PXViewState.SetViewState<string>("MyProcessingMode", filter.ProcessingMode);
    }
}
  1. 在Process方法中读取值:
public virtual IEnumerable Process(PXAdapter adapter)
{
    // 从ViewState中取出值,注意键要和保存时一致
    string processMode = PXViewState.GetViewState<string>("MyProcessingMode");

    // 后续处理逻辑和方案1一致
    foreach (var row in adapter.Get())
    {
        // 根据processMode处理行
        yield return row;
    }
    return adapter.Get();
}

方案3:检查过滤器缓存的访问方式

如果你之前尝试访问过滤器缓存失败,大概率是访问方式不对。正确的方式是通过过滤器视图的Current属性获取当前选中的过滤器记录,而不是直接操作缓存的Get或其他方法:

// 错误的方式(可能获取不到当前值)
var filterRecord = Filter.Cache.GetItem(...);

// 正确的方式
var filterRecord = Filter.Current;

另外要注意,过滤器视图的名字要和你声明的一致,比如你声明的是PXFilter<MyProcessFilter> Filter,就必须用Filter.Current,别写错名字。


内容的提问来源于stack exchange,提问作者Jerry Welliver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:23:06