按物品名称过滤 - 库存 management/Inquiries/On-hand
Filter by item name in - Inventory management/Inquiries/On-hand
据我了解,ProductName 列是通过显示方法显示的。至少对于我在这里的实现而言,此方法位于 InventSum table:
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 并借助新对话框(我将在其中记下项目名称)进行过滤,然后以某种方式刷新表单?
更新 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 不是正确的方法。我想连接到常用菜单并在那里添加新的“查找和删除过滤器”。而且..删除过滤器需要一段时间,我应该以某种方式发出信号,这样用户就不会惊慌。
使用上下文菜单不是解决问题的方法,不过是对想法的补充。
您需要为必填字段使用数据源扩展表单。
在这种情况下,它需要 InventTable
内部连接到 InventSum
,EcoResProduct
内部连接到 InventTable
和 EcoresProductTranslation
内部连接到 EcoResProduct
。添加字段 EcoresProductTranslation.Name
作为网格中的字段。
您必须对首选语言进行范围调整。如果不存在该语言的翻译,则不会有输出。
由于查询是按查询分组的,因此您需要按 EcoresProductTranslation.Name
分组。
表单的代码比较复杂,可能会比较费劲。
我找到了这篇文章:
Join ItemName from (EcoResProductTranslation )
基本上,我们基于 InventTable、EcoResProduct 和 EcoResProductTranslation 创建一个查询,以便从 InventTable 中的 Product 字段开始获取产品名称。
在 InventSum 上添加了一个新关系:
在 InventOnHandItem > DataSources > InventSum > Methods > executeQuery 我添加了新的 ds:
element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, InventLookupView_ds);
并且在 class 中:
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 中:
并将名称字段从该数据源拖到网格中。它对我来说很好用。
据我了解,ProductName 列是通过显示方法显示的。至少对于我在这里的实现而言,此方法位于 InventSum table:
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 并借助新对话框(我将在其中记下项目名称)进行过滤,然后以某种方式刷新表单?
更新 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 不是正确的方法。我想连接到常用菜单并在那里添加新的“查找和删除过滤器”。而且..删除过滤器需要一段时间,我应该以某种方式发出信号,这样用户就不会惊慌。
使用上下文菜单不是解决问题的方法,不过是对想法的补充。
您需要为必填字段使用数据源扩展表单。
在这种情况下,它需要 InventTable
内部连接到 InventSum
,EcoResProduct
内部连接到 InventTable
和 EcoresProductTranslation
内部连接到 EcoResProduct
。添加字段 EcoresProductTranslation.Name
作为网格中的字段。
您必须对首选语言进行范围调整。如果不存在该语言的翻译,则不会有输出。
由于查询是按查询分组的,因此您需要按 EcoresProductTranslation.Name
分组。
表单的代码比较复杂,可能会比较费劲。
我找到了这篇文章:
Join ItemName from (EcoResProductTranslation )
基本上,我们基于 InventTable、EcoResProduct 和 EcoResProductTranslation 创建一个查询,以便从 InventTable 中的 Product 字段开始获取产品名称。
在 InventSum 上添加了一个新关系:
在 InventOnHandItem > DataSources > InventSum > Methods > executeQuery 我添加了新的 ds:
element.inventDimSetupObject().modifyQuery(inventSum_DS,inventDim_DS, InventLookupView_ds);
并且在 class 中:
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 中:
并将名称字段从该数据源拖到网格中。它对我来说很好用。