二开新增字段在即时库存明细、单据库存查询单据上显示物料分配组织下的物料名称。
这里以新增物料分配组织下对应的物料名称为例。
一、在BOS设计器中添加字段
扩展【即时库存】,添加文本类型控件,命名为【物料名称(组织)】,参考下图:
二、编写二开插件
通过BeforeGetDataForTempTableAccess方法,对字段进行更新,然后编译插件并注册到单据上,参考代码如下:
using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Linq; using Kingdee.BOS.Core.List.PlugIn; using Kingdee.BOS.ServiceHelper; namespace CustomerPluginService { public class InventoryListEx : AbstractListPlugIn { public override void BeforeGetDataForTempTableAccess(Kingdee.BOS.Core.List.PlugIn.Args.BeforeGetDataForTempTableAccessArgs e) { //判断表中是否含有物料、库存组织以及物料名称(组织)列 if (ColExist(e.TableName, new List<string>() { "FSTOCKORGID_ID", "FMATERIALID_ID", "FORGMaterialName" })) { string sqlText = string.Format(@"MERGE INTO {0} a USING (SELECT m.FMATERIALID,m.FMASTERID,m.FUSEORGID,ISNULL(ml.FNAME,'') FNAME FROM T_BD_MATERIAL m LEFT JOIN T_BD_MATERIAL_L ml ON ml.FMATERIALID=m.FMATERIALID AND ml.FLOCALEID={1}) b ON b.FMASTERID=a.FMATERIALID_ID AND b.FUSEORGID=a.FSTOCKORGID_ID WHEN MATCHED THEN UPDATE SET a.FORGMaterialName=b.FNAME;", e.TableName, this.Context.UserLocale.LCID); DBServiceHelper.Execute(this.Context, sqlText); } } /// <summary> /// 判断列是否存在 /// </summary> /// <param name="tablename"></param> /// <param name="fields"></param> /// <returns></returns> private bool ColExist(string tablename, List<string> fields) { //这里以SQL SERVER为例 string sqlText = string.Format(@"/*dialect*/SELECT COUNT(*) countNum FROM SYSCOLUMNS WHERE id=OBJECT_ID('{0}') AND name IN('{1}')", tablename, string.Join("','", fields)); int count = DBServiceHelper.ExecuteScalar<int>(this.Context, sqlText, 0); return count == fields.Count; } } }
三、效果展示
1)、即时库存明细
2)单据库存查询