Фильтр по названию позиции в - Управление запасами / Запросы / В наличии

Насколько я понимаю, столбец ProductName отображается с помощью методов отображения. По крайней мере, для моей реализации здесь, и этот метод находится в таблице InventSum:

display public ItemNameDisplay itemName()
{
    // Fields might not have been selected on the specified buffers, or might have been updated since selection
    this.checkInvalidFieldAccess(false);

    if (this.InventDimId)
    {
        return this.inventTable().itemName(InventDim::find(this.InventDimId));
    }
    return this.inventTable().itemName();
}

Когда я нажимаю Ctrl + G и пытаюсь отфильтровать данные, эта опция отключается для указанного выше столбца, и я думаю, что это происходит из-за этого метода отображения. Есть ли способ добиться этой функциональности?

Должен ли я попытаться (щелкнув правой кнопкой мыши) добавить туда еще один элемент меню и выполнить фильтрацию с помощью нового диалогового окна (где я запишу имя элемента), как-то с последующим обновлением формы?

Обновление 1:

Я нашел и отредактировал этот подход для своего особого случая:

public void context()
{
   InventTable inventTable;

   int selectedMenu;
   real test;
   formrun fr;
   Args ag;
   Itemname strtext;
   querybuilddataSource qb1;
   queryrun qr;
   query q;
   PopupMenu menu = new PopupMenu(element.hWnd());
   int a = menu.insertItem('Find');
   int c = menu.insertItem('Remove Filter');


   selectedMenu = menu.draw();

   switch (selectedMenu)
   {
       case -1:
       break;

       case a:
       ag = new args('SysformSearch');
       fr = new formrun(ag);
       fr.run();
       fr.wait();
       strtext = fr.design().controlName('FindEdit').valueStr();

      if(strtext)
      {
          select ItemId from inventTable
          where inventTable.NameAlias == strtext;

          InventSum_DS.filter(FieldNum(InventSum,ItemId),Sysquery::value(inventTable.ItemId));
      }
      break;

      case c :
          InventSum_DS.removeFilter();
      break;

      Default:
      break;
   }
}

Тем не менее, я думаю, что это неправильный способ просто отображать новое PopupMenu. Хотелось бы подключиться к обычному меню и тут же добавить новый фильтр «Найти и удалить». И ... удаление фильтра занимает некоторое время, я должен каким-то образом сигнализировать об этом, чтобы пользователь не паниковал.


person Olaru Mircea    schedule 22.01.2016    source источник
comment
Вы хотите фильтровать по имени элемента (как указано в вашем вопросе) или по псевдониму (как реализовано в вашем обновлении 1)? Возможные решения для этих двух полей совершенно разные.   -  person FH-Inway    schedule 22.01.2016
comment
@ FH-Inway, я хочу фильтровать по названию элемента.   -  person Olaru Mircea    schedule 22.01.2016
comment
Кажется, я не могу контролировать вещи таким образом. Если пользователь хочет получить много результатов, мне придется добавить много диапазонов и каким-то образом выполнить strScan, чтобы проверить все значения, содержащие желаемую строку, и, возможно, строка содержит * или! и т.д .. я никуда не пойду ..   -  person Olaru Mircea    schedule 22.01.2016


Ответы (2)


Использование контекстного меню - это не способ сделать это, хотя и дополняет идею.

Что вам нужно сделать, расширить форму источниками данных для необходимого поля. В этом случае требуется InventTable внутреннее соединение с InventSum, EcoResProduct внутреннее соединение с InventTable и EcoresProductTranslation внутреннее соединение с EcoResProduct. Добавьте поле EcoresProductTranslation.Name как поле в сетке.

Вам нужно будет указать диапазон на предпочитаемом языке. Не будет вывода, если нет перевода на этот язык.

Поскольку запрос представляет собой группу по запросу, вам нужно будет сгруппировать по EcoresProductTranslation.Name. Код формы довольно запутан, поэтому заставить его работать может быть сложно.

person Jan B. Kjeldsen    schedule 25.01.2016
comment
Большое спасибо за ваш ответ, Январь. У меня все работает, в пятницу вечером ... не могу начать выходные без этого ... Я думаю, что что-то не хватает с моей стороны ... Я закомментировал языковую часть, чтобы она работала . - person Olaru Mircea; 25.01.2016

Я нашел эту статью:

Присоединиться к ItemName из (EcoResProductTranslation)

По сути, мы создаем запрос на основе InventTable, EcoResProduct и EcoResProductTranslation, чтобы получить название продукта, начиная с поля Product в InventTable.

В InventSum добавлено новое отношение:

введите здесь описание изображения

В InventOnHandItem> DataSources> InventSum> Methods> executeQuery я добавил новые ds:

element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, InventLookupView_ds);

А в классе:

InventDimCtrl_Frm_OnHand> modifyQuery, я добавил этот параметр:

FormDataSource _inventLookup = null 

так что теперь у меня есть это:

public void modifyQuery(
   FormDataSource _inventSum_DS,
   FormDataSource _inventDim_DS,
   FormDataSource _inventLookup = null
)

Экземпляр источника данных для построения запроса:

QueryBuildDataSource    qbsInventLookup;

И этот раздел кода:

if(_inventLookup)
{
    qbsInventLookup = query.dataSourceName(_inventLookup.name());

    //filter current company language
    //qbr = SysQuery::findOrCreateRange(qbsInventLookup, fieldnum(InventLookupView, LanguageId));
    //qbr.value(queryValue(CompanyInfo::languageId()));

    qbsInventLookup.addGroupByField(fieldNum(InventLookupView, Name));
    //qbsInventLookup.addGroupByField(fieldNum(InventLookupView,NameAlias));
}

Вновь созданное представление добавляется в качестве источника данных в InventSum:

введите здесь описание изображения

И перетащите поле «Имя» из этого источника данных в сетку. У меня это сработало.

person Olaru Mircea    schedule 25.01.2016