首页 > 解决方案 > 我加入 acumatica 的错误在哪里?

问题描述

我想从我的“实际物品库存”(来自库存物品表格)中获取所有属性,所以我有:

PXResultset<CSAnswers> res = PXSelectJoin<CSAnswers,
InnerJoin<InventoryItem,
        On<CSAnswers.refNoteID, Equal<Current<InventoryItem.noteID>>>
    >
>.Select(new PXGraph());

但是,这会返回 0 行。我的错误在哪里?

更新:我的循环是这样的:

foreach (PXResult<CSAnswers> record in res)
{
    CSAnswers answers = (CSAnswers)record;
    string refnoteid = answers.RefNoteID.ToString();
    string value = answers.Value;
}

...但我不能进入 foreach。

标签: acumatica

解决方案


您应该使用已初始化的图形,而不仅仅是“new PXGraph()”进行选择。这可以像“this”或“Base”一样简单,具体取决于此代码所在的位置。有时初始化一个新的图实例是可以的,但也有时是不行的。不知道您的代码示例的上下文,让我们假设“this”和“Base”不足,您需要初始化一个新图。如果您需要在另一个图形实例中工作,这就是您的代码的外观。

InventoryItemMaint graph = PXGraph<InventoryItemMaint>.CreateInstance<InventoryItemMaint>();
PXResultset<CSAnswers> res = PXSelectJoin<CSAnswers,
    InnerJoin<InventoryItem, On<CSAnswers.refNoteID, Equal<Current<InventoryItem.noteID>>>>>
    .Select(graph);

foreach (PXResult<CSAnswers> record in res)
{
    CSAnswers answers = (CSAnswers)record;
    string refnoteid = answers.RefNoteID.ToString();
    string value = answers.Value;
}

但是,由于您应该在图形或图形扩展中初始化图形,您应该能够使用:

.Select(this) // To use the current graph containing this logic

或者

.Select(Base) // To use the base graph that is being extended if in a graph extension

既然你指的是:

Current<InventoryItem.noteID>

...但是使用“new PXGraph()”,则通用基础对象 PXGraph 的当前数据缓存中没有“InventoryItem”。因此需要引用一个完全定义的图。

另一种准确指定要传入的值的语​​法是使用如下参数:

var myNoteIdVariable = ...
InventoryItemMaint graph = PXGraph<InventoryItemMaint>.CreateInstance<InventoryItemMaint>();
PXResultset<CSAnswers> res = PXSelectJoin<CSAnswers,
    InnerJoin<InventoryItem, On<CSAnswers.refNoteID, Equal<Required<InventoryItem.noteID>>>>>
    .Select(graph, myNoteIdVariable);

foreach (PXResult<CSAnswers> record in res)
{
    CSAnswers answers = (CSAnswers)record;
    string refnoteid = answers.RefNoteID.ToString();
    string value = answers.Value;
}

请注意 Select() 部分中的“必需”和额外值。检查您的参数是否具有值的一种快速简便的方法是使用 PXTrace 写入跟踪,您可以在刷新屏幕并执行任何可以执行代码的操作后检查该跟踪:

PXTrace.WriteInformation(myNoteIdVariable.ToString());

...查看 myNoteIdVariable 中是否有用于检索结果集的值。将其放在 foreach 块之外,否则当您实际获取记录时,您只会在跟踪中获得一个值......这在您的情况下不会发生。

如果您想深入了解正在生成和执行的 SQL 语句,请在菜单中查找 Request Profiler 并在运行测试时启用 SQL 日志记录。然后回来查看结果。(记得在完成后禁用 SQL 日志记录,否则会生成大量不必要的数据。)


推荐阅读