Axapta 按物料名称筛选-库存管理/查询/现有

Axapta 按物料名称筛选-库存管理/查询/现有,axapta,microsoft-dynamics,dynamics-ax-2012,dynamics-ax-2012-r3,Axapta,Microsoft Dynamics,Dynamics Ax 2012,Dynamics Ax 2012 R3,据我所知,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(fal

据我所知,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;
   }
}

我仍然认为仅仅显示一个新的弹出菜单是不正确的。我想钩到通常的菜单,并添加新的查找和删除过滤器就在那里。和。。删除过滤器需要一段时间,我应该以某种方式发出信号,这样用户就不会惊慌失措。

使用上下文菜单不是实现这一点的方法,不过这是对想法的补充

您需要做的是使用所需字段的数据源扩展表单。 在这种情况下,它需要
InventTable
内部连接到
InventSum
EcoResProduct
内部连接到
InventTable
EcoresProductTranslation
内部连接到
EcoResProduct
。将字段
EcoresProductTranslation.Name
添加为网格中的字段

你必须在首选语言上做一个范围。如果不存在对该语言的翻译,将不会有输出

由于查询是分组查询,您需要在
EcoresProductTranslation.Name
上按分组。
表单的代码相当复杂,因此让它工作起来可能会很痛苦。

使用上下文菜单不是一种方法,但它是对想法的补充

您需要做的是使用所需字段的数据源扩展表单。 在这种情况下,它需要
InventTable
内部连接到
InventSum
EcoResProduct
内部连接到
InventTable
EcoresProductTranslation
内部连接到
EcoResProduct
。将字段
EcoresProductTranslation.Name
添加为网格中的字段

你必须在首选语言上做一个范围。如果不存在对该语言的翻译,将不会有输出

由于查询是分组查询,您需要在
EcoresProductTranslation.Name
上按分组。
表单的代码相当复杂,因此让它工作起来可能很痛苦。

我发现这篇文章:

基本上,我们基于InventTable、EcoResProduct和EcoResProductTranslation创建一个查询,以便从InventTable中的product字段开始获取产品名称

InventSum上添加了一个新关系:

在InventOnHandItem>DataSources>InventSum>Methods>executeQuery上,我添加了新的ds:

element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, InventLookupView_ds);
在课堂上:

InventDimCtrl\u Frm\u 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中:


并将名称字段从此数据源拖动到网格中。这对我来说很好

我发现了这篇文章:

基本上,我们基于InventTable、EcoResProduct和EcoResProductTranslation创建一个查询,以便从InventTable中的product字段开始获取产品名称

InventSum上添加了一个新关系:

在InventOnHandItem>DataSources>InventSum>Methods>executeQuery上,我添加了新的ds:

element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, InventLookupView_ds);
在课堂上:

InventDimCtrl\u Frm\u 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中:


并将名称字段从此数据源拖动到网格中。这对我来说很好

是否要按项目名称(如问题中所述)或名称别名(如更新1中所实现)进行筛选?对于这两个字段,可能的解决方案是完全不同的。@FH顺便说一句,我想按项目名称进行筛选。我似乎无法用这种方式控制事情。如果用户想要得到许多结果,我必须添加许多范围,并以某种方式执行strScan来检查包含所需字符串的所有值,可能字符串包含*或!等我哪儿也不去..您想按项目名称(如问题中所述)或名称别名(如更新1中所实现)进行筛选吗?对于这两个字段,可能的解决方案是完全不同的。@FH顺便说一句,我想按项目名称进行筛选。我似乎无法用这种方式控制事情。如果用户想要得到许多结果,我必须添加许多范围,并以某种方式执行strScan来检查包含所需字符串的所有值,可能字符串包含*或!等我哪儿也不去。非常感谢你一月的回复。星期五晚上我已经安排好了。。没有这个就不能开始周末了。。我想我这边少了点什么。。为了让它工作,我把语言部分注释掉了。非常感谢你1月份的回复。我已经在周五晚上让它工作了。。没有这个就不能开始周末了。。我想我这边少了点什么。。我注释掉了语言部分,以便它工作。