Как присоединиться к источнику данных, используя `Like`` LEFT` - PullRequest
0 голосов
/ 21 февраля 2020

Сначала я создал запрос SQL, а теперь преобразую его в запрос AOT в AX 2012 R3 . У меня все остальное работает, кроме одной вещи. У меня есть соединение в моем SQL, которое: JOIN dbo.INVENTJOURNALTABLE AS INV3 ON INV.INVENTBATCHID LIKE left(INV3.DESCRIPTION,17). В SQL это работает и возвращает данные, которые мне нужны.

Я не знаю, как создать этот join в запросе AOT .

То, что INV3.DESCRIPTION - это строка, содержащая InventBatchID .

Есть ли способ сделать join ?

1 Ответ

1 голос
/ 24 февраля 2020

Для достижения sh того, что вы хотите, с помощью объекта Query это сложно / необычно, и AX не предназначен для этого прямым способом и требует очень творческого решения.

Я бы, как правило, указал sh на написание чистого x++ запроса, поскольку я не верю, что LEFT и LIKE могут быть изначально объединены, особенно в запросе. Вы можете использовать * в значении «like» в качестве опции.

Вы можете выполнить sh, используя выражений в диапазонах запросов каким-либо образом.

Если вы должны иметь запрос, я могу подумать, комбинируя View, Computed Column и Query ... и я не могу гарантировать, что он будет работать, но Я могу дать вам достаточно, чтобы у вас было что проверить. Некоторая информация в этом ответе довольно концентрированная, поэтому внимательно посмотрите на все, чтобы понять ее.

Создайте View, добавьте приведенный ниже вычисляемый столбец, а затем добавьте его к Query, как показано ниже. Для вычисляемого столбца необходимо добавить новое поле String в представление и установить для свойства ViewMethod имя метода. См. Здесь для получения дополнительной информации о добавлении Computed Columns.

Computed Column выполняет часть left(..., 17), и вы можете просмотреть представление для подтверждения.

Последнее part пытается присоединиться либо с помощью relation (как показано ниже, но не выполняет sh * like), либо с помощью выражения Value, используя выражение, следуя ссылке выше. Вам может потребоваться создать пользовательское выражение в \Classes\SysQueryRangeUtil. Вам нужно поэкспериментировать, чтобы проверить, работает ли он.

enter image description here

private static server str compColDescLeft()
{
    #define.ViewName(InventJournalTableView)
    #define.DataSourceName("InventJournalTable_1")
    #define.FieldDescription("Description")
    #define.LeftCount("17")

    str             sReturn;
    str             sLeftDesc;
    DictView        dictView;

    dictView = new DictView(tableNum(#ViewName));

    sLeftDesc = dictView.computedColumnString(#DataSourceName, #FieldDescription, FieldNameGenerationMode::FieldList, true);

    sReturn = "left(" + sLeftDesc + ", " + #LeftCount + ")";

    return sReturn;
}
...