首页 > 其他分享 >《物料清单汇总查询》二开增加自定义字段

《物料清单汇总查询》二开增加自定义字段

时间:2024-06-09 17:22:49浏览次数:16  
标签:物料 自定义 二开 -- 子项 t3 t1 BOM

业务需求
增加文本,显示物料清单的替代编码。

 说明
BomQueryIntegration继承了BomQueryForward。

具体步骤
1、新建cs类BomQueryIntegrationExtend,继承BomQueryIntegration,重写获取子项信息GetBomChildData。

 protected override List<DynamicObject> GetBomChildData(List<DynamicObject> lstExpandSource, MemBomExpandOption_ForPSV memBomExpandOption)
        {
            var bomQueryChildItems1=base.GetBomChildData(lstExpandSource, memBomExpandOption);
            if (bomQueryChildItems1 != null && bomQueryChildItems1.Count > 0)
            {
                long bomId = 0;
                long orgId = 0;
                //获取顶层bom
                var bom = this.View.Model.GetValue("FBillBomId") as DynamicObject;//BOM版本
                if (bom != null)
                {
                    bomId = Convert.ToInt64(bom["Id"]);
                }
                //var mater = this.View.Model.GetValue("FBillMaterialId") as DynamicObject;//物料编码
                var org = this.View.Model.GetValue("FBomUseOrgId") as DynamicObject;//使用组织
                if (org != null)
                {
                    orgId = Convert.ToInt64(org["Id"]);
                }
                #region
                string _getSql = string.Format(@"{0}with cte as
(
	--1、定点(Anchor)子查询,用来查询最顶级的产品的BOM的
	select 
		0 as BOM层次,t1.fid as 最顶级BOM内码
		,t1.FNUMBER as BOM版本,fxwl.FNUMBER as 父项物料代码,fxwl_L.FNAME as 父项物料名称,t3.FSEQ as 分录行号
		,t3.FREPLACEGROUP as 项次,CAST(10000+t3.FREPLACEGROUP AS nvarchar) as 项次组合
		,cast(CAST(t1.fid AS nvarchar)+'-'+CAST(10000+t3.FREPLACEGROUP AS nvarchar) as nvarchar(max)) as BOM内码和项次组合
		,t3.FMATERIALID as 子项物料内码,zxwl.FNUMBER as 子项物料代码,zxwl_L.FNAME as 子项物料名称
		,t3.FMATERIALTYPE
		,t3.FBOMID,t1.FUSEORGID
		,0 as 是否有子项BOM版本,t3.FREPNUMBER
	from dbo.T_ENG_BOM t1
		join T_BD_MATERIAL fxwl			--用父项关联物料表
			on fxwl.FMATERIALID = t1.FMATERIALID
				and t1.FFORBIDSTATUS = 'A'	--只取未禁用状态的BOM
		join T_BD_MATERIAL_L fxwl_L		--用父项关联物料多语言表
			on fxwl.FMATERIALID = fxwl_l.FMATERIALID and fxwl_L.FLOCALEID =2052
		join T_BD_MATERIALPRODUCE fxwl_P
			on fxwl_P.FMATERIALID = fxwl.FMATERIALID
		join T_ENG_BOMCHILD t3
			on t1.fid = t3.FID		
		join T_BD_MATERIAL zxwl			--用子项关联物料表
			on zxwl.FMATERIALID = t3.FMATERIALID
		join T_BD_MATERIAL_L zxwl_L		--用子项关联物料多语言表
			on zxwl.FMATERIALID = zxwl_L.FMATERIALID and zxwl_L.FLOCALEID =2052
	where 1=1
		and fxwl_P.FISMAINPRD = 1		--物料-生产页签的'可为主产品'属性FISMAINPRD,等于1就意味着可以建立BOM 
		AND t1.FID={1} --750171--799267
		--and t1.FNUMBER in ('1.01.003_V1.0') --这里可以输入一个产品BOM版本,则只会查询一个产品的BOM多级展开;如果这一句注释掉了,就可以查询全部产品物料的多级展开;下面还有一个控制的条件要同步改,一共两个.

	union all

	--2、递归子查询,根据定点子查询的查询结果来关联展开它的所有下级的BOM
	select  
		p.BOM层次+1 as BOM层次,P.最顶级BOM内码 as 最顶级BOM内码
		,t1.FNUMBER as BOM版本,fxwl.FNUMBER as 父项物料代码,fxwl_L.FNAME as 父项物料名称,t3.FSEQ as 分录行号
		,t3.FREPLACEGROUP as 项次,cast(p.项次组合+'.'+CAST(10000+t3.FREPLACEGROUP AS nvarchar) as nvarchar) as 项次组合
		,cast(p.BOM内码和项次组合 +'.'+ ( CAST(t1.FID AS nvarchar) + '-' +CAST(10000+t3.FREPLACEGROUP AS nvarchar) ) as nvarchar(max))  as BOM内码组合
		,t3.FMATERIALID as 子项物料内码,zxwl.FNUMBER as 子项物料代码,zxwl_L.FNAME as 子项物料名称
		,t3.FMATERIALTYPE
		,t3.FBOMID,t1.FUSEORGID
		,case when p.FBOMID = t1.FID then 1 else 0 end as 是否有子项BOM版本,t3.FREPNUMBER
	from cte P		--调用递归CTE本身
		join dbo.T_ENG_BOM t1
			on t1.FMATERIALID = p.子项物料内码
		join T_BD_MATERIAL fxwl			--父项关联物料表
			on fxwl.FMATERIALID = t1.FMATERIALID
				and t1.FFORBIDSTATUS = 'A'
		join T_BD_MATERIAL_L fxwl_L		--父项关联物料多语言表
			on fxwl.FMATERIALID = fxwl_l.FMATERIALID and fxwl_L.FLOCALEID =2052
		join T_ENG_BOMCHILD t3
			on t1.fid = t3.FID		
		join T_BD_MATERIAL zxwl			--子项关联物料表
			on zxwl.FMATERIALID = t3.FMATERIALID
		join T_BD_MATERIAL_L zxwl_L		--子项关联物料多语言表
			on zxwl.FMATERIALID = zxwl_L.FMATERIALID and zxwl_L.FLOCALEID =2052
)
--select * from cte		----调试第一段CTE
,cte2_ZuiXinZiXiangBom as		--这个cte2是用来取非0层的子项BOM的最新BOM版本的,然后和0层的父项信息union在一起
(
	select 
		t1.BOM层次 as BOM层级,t1.最顶级BOM内码,t1.BOM版本
		,t1.父项物料代码 as 物料代码,t1.父项物料名称 as 物料名称
		,0 as 分录行号,0 as 项次,t1.项次组合 as 项次组合,BOM内码和项次组合
		,0 as 子项物料内码,'' as 子项物料代码,'' as 子项物料名称,'0' as FMATERIALTYPE,0 as BOM内码,t1.FUSEORGID,t1.是否有子项BOM版本
		,t1.FREPNUMBER
		,dense_rank() over(partition by t1.最顶级BOM内码,t1.父项物料代码 order by t1.BOM版本 desc) as BOM版本号分区
	from cte t1
	where 1=1 
		and t1.BOM层次 = 0 and t1.项次组合 = '10001'		--这里是只显示0层的产品
		--and t1.BOM版本 in ('1.01.003_V1.0')	--这里可以输入一个产品BOM版本,则只会查询一个产品的BOM多级展开;如果这一句注释掉了,就可以查询全部产品物料的多级展开;上面还有一个控制的条件要同步改,一共两个.

	union 
	select 
		t1.BOM层次+1 as BOM层级,t1.最顶级BOM内码,t1.BOM版本
		,t1.子项物料代码 as 物料代码,t1.子项物料名称 as 物料名称
		,t1.分录行号 as 分录行号,t1.项次 as 项次,t1.项次组合 as 项次组合,BOM内码和项次组合
		,0 as 子项物料内码,t1.子项物料代码 as 子项物料代码,'' as 子项物料名称,t1.FMATERIALTYPE,t1.FBOMID as BOM内码,t1.FUSEORGID,t1.是否有子项BOM版本
		,t1.FREPNUMBER
		,dense_rank() over(partition by t1.最顶级BOM内码,t1.父项物料代码 order by t1.BOM层次+1,t1.是否有子项BOM版本 desc,t1.BOM版本 desc) as BOM版本号分区	--通过这个字段标识最新版本的BOM,按照父项物料分区之后,把BOM版本降序排列,BOM版本高的排序序号就是1
	from cte t1
	where 1=1
		--and t1.BOM层次+1 <=2	--可以通过BOM层次字段来控制递归循环的次数,如果这里不加控制,那系统默认最多是循环100次
)
--select * from cte2_ZuiXinZiXiangBom t2		----调试第二段CTE
select t2.BOM层级 as FBOMLevel
		,t2.物料代码 as FCHILDMATERIALID,t2.物料名称 as FCHILDMATERIALNAME,t2.分录行号 as FROWNUMBER,t2.项次 as FGROUPID,t2.FMATERIALTYPE
		,t2.FUSEORGID,t2.项次组合 as FGROUPIDCOM,t2.BOM内码和项次组合 FBOMGROUPIDCOM
		,t2.BOM内码 as FCHILDBOMID,t2.BOM版本 as FBOM,t2.最顶级BOM内码 FTOPLEVEL,t2.FREPNUMBER,t4.FNUMBER FTOPMATERIALNUMBER	--这一行的可以注释掉,只是为了排查SQL问题用的.
from cte2_ZuiXinZiXiangBom t2
LEFT JOIN T_ENG_BOM t3 ON t2.最顶级BOM内码=t3.FID
LEFT JOIN dbo.T_BD_MATERIAL t4 ON t4.FMATERIALID=t3.FMATERIALID
where  t2.BOM版本号分区 = 1		--通过“BOM版本号分区”标识最新版本的BOM,按照父项物料分区之后,把BOM版本降序排列,BOM版本高的值就是1
	and ( (t2.BOM层级 = 0 and t2.项次组合 = '10001' ) or (t2.BOM层级 > 0) )	--这个是为了查询出最终的结果.
	and t2.FUSEORGID ={2}	--AND t2.FMATERIALTYPE='1'
	AND t2.FREPNUMBER!=''
order by t2.BOM内码和项次组合", OtherConst.DIALECT, bomId, orgId);
                #endregion
                var getBOM = CommonServiceHelper.SelectMethod(this.Context, _getSql);
                List<DynamicObject> getRepNumber = new List<DynamicObject>();
                if (getBOM != null && getBOM.Count > 0)
                {
                    getRepNumber = getBOM.ToList();
                }
                bool isTDJ = Convert.ToBoolean(this.View.Model.GetValue("FIsIntShowSubMtrl"));
                if (!isTDJ)
                {
                    getRepNumber = getRepNumber.Where(s => (s["FMATERIALTYPE"] + "").Equals("1")).ToList();
                }
                foreach (var item in bomQueryChildItems1)
                {
                    string mn = (item["MaterialId"] as DynamicObject)["Number"] + "";
                    var getThisRep = getRepNumber.Where(s => (s["FCHILDMATERIALID"] + "").Equals(mn)).ToList();
                    if (getThisRep != null && getThisRep.Count > 0)
                    {
                        string repNum = getThisRep.FirstOrDefault()["FREPNUMBER"] + "";
                        item.SetDynamicObjectItemValue("FRepNumber", repNum);
                    }
                }
                
            }

            return bomQueryChildItems1;
        }

  

2、扩展《物料清单汇总查询》表单,取消表单插件,挂载新插件。 

 

3、表单实体增加属性FRepNumber,替代编码

 4、测试

 

标签:物料,自定义,二开,--,子项,t3,t1,BOM
From: https://www.cnblogs.com/lanrenka/p/18239783

相关文章

  • python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制
    实现效果(红框内):后端api如下:@task_api.route('/user/task/states_list',methods=['POST','GET'])@visitor_token_requireddeftask_states(user):name_list=['待接单','设计中','交付中','已完成','......
  • C#自定义控件(自定义属性、自定义事件)
    1、创建类库项目在当前解决方案中添加新项目类库。注意选择“.NETFramework”创建完成后,删除默认的Class1类。2、添加项目图片在类库的debug中添加一个文件夹image,并复制项目需要的图片。3、把全部项目拖放到资源文件中选中所有图片,然后拖放到[资源],方法是右击类库项目......
  • 将stanfordcorenlp的tokenizer换成自定义的(或用stanfordcorenlp对自定义tokenizer分词
    本文是基于中文语料做的,对于英文语料应该也是同理,即同样适用的。分析stanfordcorenlp的分词结果,可以发现,它好像是对最小的中文词进行分词,即其对中文的分词粒度很小,这对于某些nlp场景可能就不太合适了,自然的就想到能不能将stanfordcorenlp中用于分词的tokenizer替换掉,替换成自......
  • 实战 | YOLOv10 自定义数据集训练实现车牌检测 (数据集+训练+预测 保姆级教程)
    导读    本文主要介绍如何使用YOLOv10在自定义数据集训练实现车牌检测(数据集+训练+预测保姆级教程)。  YOLOv10简介  YOLOv10是清华大学研究人员在UltralyticsPython包的基础上,引入了一种新的实时目标检测方法,解决了YOLO以前版本在后处理和模型架构方面的不足......
  • C语言笔记第12篇:自定义类型(struct结构体)
    1、结构体类型的声明为什么要有自定义的结构类型呢?这是因为稍微复杂的类型,直接使用内置类型是不行的!比如:描述一个人或 一本书的价格、版号等信息。1.1结构的创建结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。1.1.1 结构的声明structt......
  • Vue 3 的 <teleport> 组件封装为自定义指令
    <Teleport>是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的DOM结构外层的位置去。https://cn.vuejs.org/guide/built-ins/teleport.html为了更加简便灵活,可以将Vue3的<teleport>组件类似的功能封装为自定义指令。当然,但在某些情况下,直接使用<telepo......
  • [ROS自定义消息问题]ImportError: cannot import name ‘GQCNNGrasp‘ from ‘gqcnn_r
         在使用ROS运行Python代码时,经常会遇到无法引用自定义消息文件的情况。这其实是一个比较常见的问题,通常是由于ROS找不到消息文件所在的路径导致的。问题描述:在ROS中运行Python代码时,如果尝试导入自定义消息文件,可能会遇到类似如下的错误:ImportError:Nomodule......
  • 同星TSMaster中如何自定义E2E校验算法
    文章目录前言一、自定义E2E算法教程1.定义checksum算法2.定义【CAN预发送事件】3.E2E报文信号仿真4.运行工程二、TSMaster配置E2E教程1.激活仿真报文2.E2E配置三.小结前言最近因项目需要,用到TSMaster进行E2E校验算法实现。第一次使用TSMaster,把整个的过程做一个记......
  • Asp .Net Core 系列:详解鉴权(身份验证)以及实现 Cookie、JWT、自定义三种鉴权 (含源码解
    什么是鉴权(身份验证)?https://learn.microsoft.com/zh-cn/aspnet/core/security/authentication/?view=aspnetcore-8.0定义鉴权,又称身份验证,是确定用户身份的过程。它验证用户提供的凭据(如用户名和密码)是否有效,并据此确认用户是否具备访问系统的权利。过程用户向系统提供......
  • 零基础非科班也能掌握的C语言知识18 自定义类型
    自定义类型1.结构体1.1结构的声明1.2结构体变量的创建和初始化1.2.1普通声明1.2.2嵌套声明1.2.3不完全声明(匿名结构体)1.3结构成员访问操作符1.3.1结构体成员的直接访问1.3.2结构体成员的间接访问1.4结构体的自引用1.5结构体内存对齐1.5.1对齐规则1.5.2为什么存在内......