Как добавить значение диапазона формы при использовании представления в качестве источника данных? - PullRequest
0 голосов
/ 22 октября 2018

Я хотел бы иметь возможность создавать пользовательский фильтр для нового источника данных формы, который представляет собой пользовательское представление, которое я создал.

Я создал пользовательское представление ABCPurchLineBusUnitView (из пользовательского запросакоторый присоединяет таблицу PurchaseLine к представлению DefaultDimension) для добавления к источникам данных существующей формы (PurchaseLineOpenOrder).Столбец DisplayValue в основной сетке формы возвращает значение измерения бизнес-единицы для всех строк закупок.

Настройка формы: -

В методе init () нового источника данных, к которому я присоединился,просмотрите существующий источник данных PurchaseLine следующим образом:

public void init()
{
    #DEFINE.DataSourceBusUnit(7)

    QueryBuildDataSource qbds;

    super();

    qbds = this.query().dataSourceNo(#DataSourceBusUnit);
    qbds.clearLinks();
    qbds.joinMode(JoinMode::InnerJoin);
    qbds.relations(true);
qbds.addLink(fieldNum(PurchLine,RecId),fieldNum(ABCPurchLineBusUnitView,RecId));

    qbrBusinessUnit = qbds.addRange(fieldNum(ABCPurchLineBusUnitView, DisplayValue));
}

В методе executeQuery () того же источника данных я установил жестко закодированное значение диапазона, чтобы возвращать только те строки PurchaseLines, которые относятся к определенному бизнесу.Единица измерения.

public void executeQuery()
{
    qbrBusinessUnit.value(queryValue('Business unit name here'));
    super();
}

Отображаемый столбец работает нормально.Однако, используя CTRL + G для просмотра пользовательского фильтра, становится ясно, что значение фильтра отсутствует и не было применено.

В той же форме, когда я применяю фильтр к существующему источнику данных, он работает нормальноиспользуя описанную выше технику, которая вводит в заблуждение.

Кроме того, я хотел бы, чтобы это работало на внешнем источнике данных и попытался использовать QueryFilters, но не повезло и там, используя те же методы источника данных.

1 Ответ

0 голосов
/ 22 октября 2018

Вы должны использовать executeQuery корневого источника данных (PurchLine), потому что ABCPurchLineBusUnitView объединяется с использованием InnerJoin, поэтому executeQuery там не вызывается.

Кроме этого, несколько наблюдений:

  • Вместо использования qbds = this.query().dataSourceNo(#DataSourceBusUnit); вы можете использовать qbds = this.query().dataSourceTable(tableNum(ABCPurchLineBusUnitView));, который, я уверен, вы уже знаете, поскольку стандартный код в \Forms\PurchLineOpenOrder\Data Sources\PurchLine\Methods\init содержит пример этого синтаксиса.

  • Если свойство LinkType источника данных ABCPurchLineBusUnitView уже установлено на InnerJoin, строка qbds.joinMode(JoinMode::InnerJoin); не требуется и может быть удалена.

  • Вы не должны использовать оба qbds.relations(true); и qbds.addLink(fieldNum(PurchLine, RecId), fieldNum(ABCPurchLineBusUnitView, RecId));.Попробуйте заменить qbds.relations(true); на qbds.relations(false);, если вам нужно использовать addLink.

...