Отфильтровать родительский источник данных с полем, которое находится в другой таблице в D365

Иногда нам нужно фильтровать сетку формы на основе статуса идентификатора ссылки транзакции. Предположим, что мы хотим отображать заказы на поставку с подтверждением состояния документа в форме обзора прибытия. Поле состояния документа находится в таблице покупок. С этой целью я пытаюсь подключиться к WMSArrivalOverviewTmp, чтобы очистить таблицу и добавить Range. Однако результаты не такие, как я ожидал. Это код, который я пробовал в событии инициализированного источника данных:

 [FormDataSourceEventHandler(formDataSourceStr(WMSArrivalOverview, WMSArrivalOverviewTmp), FormDataSourceEventType::Initialized)]
    public static void WMSArrivalOverviewTmp_OnInitialized(FormDataSource sender, FormDataSourceEventArgs e)
    {
        QueryBuildDataSource    qbds    = sender.queryBuildDataSource();
        QueryBuildDataSource    qbdsPO;

        qbdsPO  = qbds.addDataSource(tableNum(PurchTable));

        qbdsPO.clearRange(fieldNum(PurchTable, DocumentState));

        qbdsPO.joinMode(JoinMode::OuterJoin);
        qbdsPO.fetchMode(QueryFetchMode::One2One);
        qbdsPO.addLink(fieldNum(WMSArrivalOverviewTmp, InventTransRefId ),fieldNum(PurchTable, PurchId), qbds.name());
        qbdsPO.relations(false);
        qbdsPO.addRange(fieldNum(PurchTable, DocumentState)).value(SysQuery::value(VersioningDocumentState::Confirmed));
        info(sender.query().toString());
    }

Это запрос, который был показан:

ВЫБРАТЬ FIRSTFAST * ИЗ WMSArrivalOverviewTmp (WMSArrivalOverviewTmp) ВНЕШНЕЕ СОЕДИНЕНИЕ ИЗ PurchTable (PurchTable_1) НА WMSArrivalOverviewTmp.InventTransRefId = PurchTable.PurchId И ((DocumentState = 40))

Кроме того, я изменил тип события на выполнение запроса, но получаю ошибки:

[Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Ошибка преобразования типа данных nvarchar в bigint. Невозможно выбрать запись в заказах на покупку (PurchTable). База данных SQL выдала ошибку.

P.S. Я заметил, что ошибка возникает, когда я нажимаю кнопку обновления после заполнения одного из полей в разделе фильтра (вариант прибытия). Например, когда я заполняю номер счета или склад. Кроме того, я заметил, что когда я нажимаю кнопку обновления, когда поля не заполнены в разделе фильтра, операция объединения не применяется правильно, то есть отображаются заказы на покупку, которые имеют статус черновика.


person Nastaran Hakimi    schedule 11.03.2020    source источник


Ответы (1)


Ваш фактический запрос мне кажется правильным. Я бы добавил, что вы можете добавить ссылку между WMSArrivalOverviewTmp.InventTransType == InventTransType::Purch (или установить qbds.relations(true), чтобы вы использовали взаимосвязь таблицы), но я сомневаюсь, что это корень вашей проблемы. Конечно, не помешало бы убедиться, что ваш запрос работает так, как вы ожидаете, путем преобразования результатов имеющегося у вас вызова info () в код SQL и запуска его в SSMS для двойной проверки набора результатов.

Кроме того, мне любопытно, зачем вам помещать событие в источник данных, которым вы пытаетесь манипулировать? Я бы порекомендовал исследовать, может ли это произойти в OnModified событии «статус идентификатора ссылки на транзакцию». Хотя, возможно, я неправильно понимаю - если эта ситуация больше похожа на «нам нужно происходить все время, когда форма загружается», чем на «иногда нам нужно», как вы начните свой вопрос - место, где можно изменить запрос, - это изменить его в обработчике события OnQueryExecuting источника данных.

Есть два способа изменить запрос события, когда оно происходит.

FormRun formRun = sender.formRun() as FormRun;
FormDataSource formDataSource = formRun.dataSource(formDataSourceStr(WMSArrivalOverview, WMSArrivalOverviewTmp));

//First way - get the base query and use executeQuery() to reload changes
Query query = formDataSource.query();
//modified query here.
formDataSource.executeQuery();


//Second way - get the current queryRun query and use research() to reload changes
Query query = formDataSource.queryRun.query();
//modified query here.
formDataSource.research();
person rjv    schedule 11.03.2020
comment
Уважаемый @rjv, иногда я имею в виду некоторые формы, и исправленное предложение состоит в том, что нам нужно, чтобы некоторые формы выполнялись постоянно, когда они загружаются. Я получаю эти ошибки, если использую внешнее соединение, другие типы соединений в порядке. но вы знаете, что мне нужно использовать внешнее соединение. потому что поле статуса отсутствует в источнике данных формы. - person Nastaran Hakimi; 12.03.2020
comment
Каков результат запроса x ++, когда вы распечатываете его с помощью информационного метода, который есть в нижней части вашего кода? - person rjv; 12.03.2020
comment
Уважаемый rjv, я обновил свой вопрос. Теперь вы можете увидеть значение запроса в моем вопросе. Спасибо за поддержку. - person Nastaran Hakimi; 13.03.2020
comment
Кажется, у вас возникла ошибка, заключающаяся в том, что вы пытаетесь передать строку в столбец int, но ваш запрос, похоже, правильно отформатировал documentstate до 40, который является int. Ваш постскриптум меня смущает, я не уверен в макете вашей формы или в коде, который выполняется, когда вы нажимаете кнопку обновления. Я не уверен, есть ли у вас несколько ошибок или всего одна на данный момент. Я бы начал с определения, как удалить ошибку типа данных, и посмотреть, что произойдет после этого. - person rjv; 16.03.2020