0

Насколько я понимаю, столбец 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 и попытаться отфильтровать данные, эта опция отключена для выше колонки, и я думаю, что это происходит благодаря тому, что дисплей способ. Есть ли способ достичь этой функциональности?

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

Update 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. Я хотел бы подключиться к обычному меню и добавить новый «Найти и удалить фильтр» прямо там. И .. удалить фильтр занимает некоторое время, я должен сигнализировать об этом так, чтобы пользователь не паниковал.

+0

Вы хотите отфильтровать по названию объекта (как указано в вашем вопросе) или по псевдониму имени (как реализовано в вашем обновлении 1)? Возможные решения для этих двух полей весьма различны. –

+0

@ FH-Inway, я хотел бы отфильтровать по названию позиции. –

+0

Кажется, я не могу контролировать это. Если пользователь хочет иметь много результатов, мне придется добавить множество диапазонов и выполнить strScan, чтобы проверить все значения, содержащие нужную строку, и, возможно, строка содержит * или! и т. д. Я иду в никуда .. –

ответ

1

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

Join ItemName from (EcoResProductTranslation)

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

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

enter image description here

На InventOnHandItem> DataSources> InventSum> Методы> 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:

enter image description here

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

1

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

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

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

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

+0

Большое спасибо за ваш ответ Ян. У меня это работает в пятницу вечером .. не удалось начать выходные без этого .. я думаю, что что-то не хватает на моей стороне .. я прокомментировал из языковой части, чтобы она работала. –

 Смежные вопросы

  • Нет связанных вопросов^_^