Где моя ошибка с моим присоединением к acumatica? - PullRequest
0 голосов
/ 10 марта 2020

Я хочу получить все атрибуты из моего «Актуального инвентарного учета» (из формы складских позиций), поэтому у меня есть:

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

Но это возвращает мне 0 строк. Где моя ошибка?

ОБНОВЛЕНО: Мой l oop такой:

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

... но я не могу go внутри foreach.

  • Извините за английский sh.

1 Ответ

2 голосов
/ 10 марта 2020

Вы должны использовать инициализированный граф, а не просто "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>

... но используете "новый PXGraph () msgstr "" InventoryItem "не будет в текущем кэше данных базового объекта c PXGraph. Следовательно, необходимо ссылаться на полностью определенный граф.

Другой синтаксис для точного указания того, какое значение вы хотите передать, заключается в использовании такого параметра:

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, когда закончите, или вы можете создать много ненужных данных.)

...