如何清除智能面板对话框 (PXFilter) 的输入?

Bri*_*ens 1 acumatica

我在自定义屏幕中创建了一个智能面板,以请求用户输入,以方便将库存从正常库存转移到隔离区域。我经常使用的原始智能面板示例是 SOOrderEntry 图中的复制订单 (SO301000)。在这种情况下,我需要进行一些验证,并且用户很可能决定关闭智能面板并更新屏幕中的文档,然后再次重新打开智能面板。如果用户单击取消按钮,我需要智能面板在每次打开时重置回默认值。

我认为这可能在 ASPX 屏幕定义中处理,但我找不到表单本身的正确设置。我在选择器上使用“自动刷新”来在每次打开它们时进行刷新,但我需要表单本身执行相同的操作并在每次打开时刷新回默认值。当我导航到图表主 DAC 的另一条记录时,所需的行为确实会自动发生,但我似乎无法强制智能面板在每次打开时自动刷新。我查看了 ASPX 中表单的各种选项,但我忽略了它是否存在。

与 SOOrderEntry 上的 CopyOrder 类似,这是我的图表中的代码示例。

public PXFilter<StockParamFilter> stockparamfilter;

#region AddFromStock
public PXAction<MyTag> addFromStock;
[PXUIField(DisplayName = Messages.AddFromStock, MapEnableRights = PXCacheRights.Insert, MapViewRights = PXCacheRights.Insert)]
[PXButton]
protected virtual IEnumerable AddFromStock(PXAdapter adapter)
{
    MyTag tag = Tags.Current;

    if (tag?.TranRefNbr != null)
    {
        throw new PXException(Messages.TagAlreadyReceived);
    }

    MyTagEntry graph = PXGraph.CreateInstance<MyTagEntry>();

    WebDialogResult dialogResult = stockparamfilter.AskExt(setStockStateFilter, true);
    if (dialogResult == WebDialogResult.OK || (IsContractBasedAPI && dialogResult == WebDialogResult.Yes))
    {
        // My Business Logic Here
    }
    return adapter.Get();
}
#endregion

#region CheckStockParams (OK Button in Smart Panel)
public PXAction<MyTag> checkStockParams;
[PXUIField(DisplayName = "OK", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
[PXLookupButton]
public virtual IEnumerable CheckStockParams(PXAdapter adapter)
{
    return adapter.Get();
}
#endregion

#region setStockStateFilter
private void setStockStateFilter(PXGraph aGraph, string ViewName)
{
    checkStockStateFilter();
}
#endregion

#region checkStockStateFilter
protected virtual void checkStockStateFilter()
{
    // My Business Logic Here to set bool enableStockParams = ???
    checkStockParams.SetEnabled(enableStockParams);
}
#endregion
Run Code Online (Sandbox Code Playgroud)

这似乎是我过去做过的事情,但我似乎无法找到代码。我认为这与 stockparamfilter 是 PXFilter 而不是 PXSelect (或 SelectFrom)有关。

我尝试过 stockparamfilter.ClearDialog() 但没有成功。我尝试过 stockparamfilter.RequestRefresh() 但没有成功。我什至尝试了 stockparamfilter.DeleteCurrent() ,当我点击“取消”时,它似乎可以工作,但当我点击“确定”时,我的代码没有执行。当我使用 stockparamfilter.Cache.SetDefaultExt<StockParamFilter.locationID>(filter); 时,我似乎也得到了想要的结果。在每个字段上,直到我点击“确定”,但什么也没做。就像每次我尝试操作过滤器时,我都会破坏智能面板,而跟踪中不会出现任何错误。事实上,这是我尝试失败的列表:

StockParamFilter filter = stockparamfilter.Current;
stockparamfilter.View.Clear();
stockparamfilter.View.RequestRefresh();

stockparamfilter.Cache.Clear();
stockparamfilter.View.RequestRefresh();
stockparamfilter.View.RequestFiltersReset();
stockparamfilter.DeleteCurrent();

stockparamfilter.ClearDialog();

stockparamfilter.Cache.SetDefaultExt<StockParamFilter.locationID>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.toLocationID>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.qty>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.lotSerialNbr>(filter);
stockparamfilter.Cache.SetDefaultExt<StockParamFilter.origRefNbr>(filter);
Run Code Online (Sandbox Code Playgroud)

可以让我将智能面板重置为默认值的 ASPX 代码或 C# 代码是什么?

Bri*_*ens 5

非常感谢 Acumatica 的 Hughes Beausejour 提供的离线协助。为可能遇到此问题的其他人发布解决方案。

首先,了解 AskExt 生成 2 遍代码非常重要。第一遍提示智能面板。在响应智能面板后,代码再次执行,但在第二个上下文中跳过询问。考虑到这一点,我的代码无法运行的原因就变得清楚了,正如休斯向我解释的那样。

要在初始化表单时执行代码,必须在询问发生之前执行该代码。否则,表单呈现后初始化代码就执行得太晚了。此外,必须对其进行调节,使其仅在用户未向智能面板给出 OK 响应时触发。 (没有意识到代码执行了两次,我没有意识到我正在重置两次传递中的字段。当我可以重置表单时,后续处理将失败,因为我也在该传递中重置了它。 ) ,AskExt 可用于呈现表单以及用户响应的正常处理。

我的代码显示了工作示例,如下所示:

StockParamFilter filter = stockparamfilter.Current;

// If the user response is anything except an affirmative, default the fields
if (!(stockparamfilter.View.Answer == WebDialogResult.OK || (IsContractBasedAPI && stockparamfilter.View.Answer == WebDialogResult.Yes)))
{
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.locationID>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.toLocationID>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.qty>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.lotSerialNbr>(filter);
    stockparamfilter.Cache.SetDefaultExt<StockParamFilter.origRefNbr>(filter);
}

// Present the Smart Panel Dialog (happens only on the 1st pass - AskExt causes the code to execute twice)
WebDialogResult dialogResult = stockparamfilter.AskExt(setStockStateFilter, true);

// If the response was affirmative, execute the business logic
if (dialogResult == WebDialogResult.OK || (IsContractBasedAPI && dialogResult == WebDialogResult.Yes))
{
    // Do Business Logic Based On User Response In Smart Panel
}
Run Code Online (Sandbox Code Playgroud)