68.关联部门流水号

/*--自己做编号的示例:
	根据输入的RoleID,另一个表中查到一个部门ID(三位)
	然后用部门ID作为插入记录流水号的前三位,后面六位为自动增加的。
--*/

--测试环境

--部门表
create table 部门(部门id char(3),部门名称 varchar(10),RoleID int)
insert 部门 
select '001','A部门',1
union all select '002','B部门',2
union all select '003','c部门',3

--A表
create table A表(编号 char(9) primary key default '',RoleID int)
go

--处理的函数
create function f_getid(@RoleID int)
returns char(9)
as
begin
	declare @re char(9),@部门id char(3)

	select @部门id=部门id from 部门 where RoleID=@RoleID
	select @re=max(编号) from A表
	where 编号 like @部门id+'%'
	return(@部门id+case when @re is null then '000001' 
		else right('000000'+cast(cast(right(@re,6) as int)+1 as varchar),6) end)
end
go

--创建触发器,自动生成编号
create trigger t_insert on A表
instead of insert
as
declare @部门编号 char(3),@id int,@RoleID int,@编号 char(9)

select * into #t from inserted order by RoleID

update #t set 
	@编号=case RoleID when @RoleID then @编号 else dbo.f_getid(RoleID) end
	,@部门编号=case RoleID when @RoleID then @部门编号 else left(@编号,3) end
	,@id=case RoleID when @RoleID then @id+1 else right(@编号,6) end
	,编号=@部门编号+right('000000'+cast(@id as varchar),6)
	,@RoleID=RoleID
insert into A表 select * from #t
go

--插入数据到A表
insert A表(RoleID)
select 1
union all select 1
union all select 2
union all select 3
union all select 2
union all select 1
union all select 2
union all select 3
union all select 3
go

--显示处理结果
select * from A表
go

--删除测试环境
drop table 部门,A表
drop function f_getid

/*--测试结果

编号        RoleID      
--------- ----------- 
001000001 1
001000002 1
001000003 1
002000001 2
002000002 2
002000003 2
003000001 3
003000002 3
003000003 3

(所影响的行数为 9 行)
--*/

	

报错 业务体系列无效 原始代码是这样的 CREATE TABLE [#TEMP_Department] (Department nvarchar(20)) INSERT INTO [#TEMP_Department] EXEC [ZY_P_Get_SAP_Account_to_TempDept] IF NOT EXISTS(SELECT * FROM [#TEMP_Department]) BEGIN SELECT '无法获取SAP账号ID,请重启电脑后重试' RETURN END --------------- DECLARE @date1 DateTime DECLARE @date2 DateTime DECLARE @SlpName VARCHAR(64) DECLARE @NumAtCard varchar(20) DECLARE @SupplCode varchar(20) DECLARE @CardCode varchar(20) DECLARE @CardName varchar(200) DECLARE @Department VARCHAR(64) DECLARE @U_USER VARCHAR(64) SELECT @SlpName=TX0.SlpName FROM OSLP TX0 WHERE TX0.SlpName = '[%3]' SELECT @CardCode=TX1.CardCode FROM ODLN TX1 WHERE TX1.CardCode = '[%4]' SELECT @CardName=TX1.CardName FROM ODLN TX1 WHERE TX1.CardName = '[%5]' SELECT @Department=TX1.U_Department FROM ODLN TX1 WHERE TX1.U_Department = '[%6]' SELECT @NumAtCard=TX1.NumAtCard FROM ODLN TX1 WHERE TX1.NumAtCard = '[%10]' SELECT @SupplCode=TX1.SupplCode FROM ODLN TX1 WHERE TX1.SupplCode = '[%11]' SELECT @U_USER=TX1.U_USER FROM ODLN TX1 WHERE TX1.U_USER = '[%12]' SET @SlpName = '[%3]' SET @CardCode = '[%4]' SET @CardName = '[%5]' SET @Department = '[%6]' SET @numatcard = '[%10]' SET @SupplCode = '[%11]' SET @U_USER = '[%12]' SELECT T.类型 as '单据类型',T.DocEntry as '单据流水号', T.DN日期 as '销货日期', T.合同号 as '合同号', T.DN补充代码 as 'DN补充代码',T.制单人 as '制单人',T.销售员 as '销售员' ,T.部门 as '部门',T.综合部门 as '综合部门', T.客户编码 as '客户编码', T.客户名称 as '客户名称',T.单据币别 as '单据币别', T.DN金额 as '销货单金额', T.IN金额 as '应收发票金额' ,T.已收款金额 AS '已收款金额',T.未收款金额 AS '未收款金额', isnull(V.U_ATCC_user,D.U_ATCC_user) as '客户联系人' ,isnull(V.U_PerPayCon,D.U_PerPayCon) as '客户付款条件', isnull(V.U_consignee,D.U_consignee) '收货人',T.客户类型 as '客户类型',T.IN补充代码 as 'IN补充代码' , isnull(V.U_CusOdrCode,D.U_CusOdrCode ) as '体现在发票上的备注', '' as '联系人分组', isnull(X.XM_YN,'N') as '项目合同', DS.U_FHtype as '项目类型', DATEDIFF(day,GETDATE() ,T.DN日期 ) '超期天数' ,CASE WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<0 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-30 THEN '1个月' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-30 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-60 THEN '2个月' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-60 AND DATEDIFF(day,GETDATE(),T.DN日期 )>=-90 THEN '3个月' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-90 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-180 THEN '6个月' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-180 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-365 THEN '1年' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-365 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-545 THEN '1年半' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-545 AND DATEDIFF(day,GETDATE() ,T.DN日期 )>=-730 THEN '2年' WHEN DATEDIFF(day,GETDATE() ,T.DN日期 )<-730 then '2年以上' ELSE '未超期' END AS '超期类型' , isnull(V.Comments ,D.Comments) as '备注' ,F.已开票金额 as '已开票总额' ,F2.SQ开票金额 as 'SQ开票金额',F2.SQ发票号 'SQ发票号' ,F2.OR开票金额 as 'OR开票金额',F2.OR发票号 'OR发票号' ,isnull(V.U_ApplyInvoiceAmt,0) as 'IN开票金额', F1.发票号 'IN发票号' ,F.发票日期 as '发票日期' --,Case When isnull(F.开票总金额,0) >0 Then 'Y' When isnull(Y.IN冲预留款金额sum,0) >0 Then 'Y' Else 'N' End '是否已开票' ,CASE WHEN F.未开票金额 <=0 THEN 'Y' WHEN V.U_BillType ='Y' THEN 'Y' ELSE 'N' END '已开票YN' ,Y.IN_YK对账金额 as '冲预留款发票金额', Y.发票号 as '关联预留款YK号',Y.发票号 AS 'YK关联发票号' ,CASE WHEN T.业务体系 = '平台体系' THEN '平台业务' WHEN T.业务体系 NOT IN ('平台体系','经销体系') THEN '其它' WHEN T.业务体系 IS NULL THEN '其它' WHEN T.综合部门 ='工业部' THEN '工业业务' WHEN T.综合部门 ='生命科学部' THEN '科研业务' WHEN T.综合部门 ='基础科研部' THEN '科研业务' WHEN T.综合部门 ='分销部' THEN '分销业务' WHEN T.客户类型 ='工业客户' THEN '工业业务' WHEN T.客户类型 ='经销商客户' THEN '分销业务' ELSE '科研业务' END '业务类别' ,T.业务体系 ,'|' '|' ,isnull(V.DocCur,D.DocCur) as '币别',isnull(V.DocRate,D.DocRate) '汇率',isnull(V.DocTotalFC,D.DocTotalFC) '原币单据金额' , T.未收款金额 / isnull(V.DocTotal,D.DocTotal) * isnull(V.DocTotalFC,D.DocTotalFC) AS '原币未收款金额(估)' FROM [ZY_TB_Receivable_Balance_Base] T INNER JOIN [#TEMP_Department] X0 ON X0.Department =T.综合部门 ---卡数据 LEFT JOIN OINV V ON V.DocEntry =T.DocEntry AND T.ObjType ='IN' LEFT JOIN ODLN D ON D.DocEntry =T.DocEntry AND T.ObjType ='DN' LEFT JOIN [ZY_VIEW_XM] X ON X.ConCode =T.合同号 LEFT JOIN [@AVA_DS_OCTR] DS ON DS.U_ConCode =T.合同号 LEFT JOIN [ZY_TB_ConCode_FP_Status] F ON F.合同号 = T.合同号 ---- 按合同号记录的发票信息 LEFT JOIN [ZY_TB_ConCode_Suppl_FP] F1 ON F1.补充代码 =V.SupplCode ---- 按补充代码记录的发票信息 LEFT JOIN --- 按 SQ OR 开票的信息汇总 (---SQ开票信息与OR开票信息合并,保证按合同号一行数据 SELECT Q.合同号 ,isnull(Q.SQ开票金额,0) as 'SQ开票金额' ,Q.SQ发票号 , isnull(R.OR开票金额,0) as 'OR开票金额' ,R.OR发票号 FROM (--- SQ的,不会有重复行 SELECT T.合同号 ,isnull(Q.U_ApplyInvoiceAmt,0) - isnull(Q.U_ReturnInoiceAmt,0) AS 'SQ开票金额',T.发票号 'SQ发票号' FROM OQUT Q INNER JOIN (SELECT distinct 合同号 FROM [ZY_TB_Receivable_Balance_Base] )X ON X.合同号=Q.NumAtCard ---有应收的合同号 INNER JOIN [ZY_TB_ConCode_Suppl_FP] T ON T.补充代码 =Q.SupplCode WHERE LEFT(补充代码,2) ='SQ' )Q LEFT JOIN ( --OR的,要按合同号先汇总,再串接发票号 SELECT DISTINCT R.NumAtCard ,R.OR开票金额 ,(SELECT DISTINCT A.发票号+'' FROM [ZY_TB_ConCode_Suppl_FP] A WHERE A.合同号 =T.合同号 FOR XML PATH('') ) AS 'OR发票号' FROM(--- OR单的,开票金额进行汇总 SELECT R.NumAtCard,SUM(isnull(R.U_ApplyInvoiceAmt,0) - isnull(R.U_ReturnInoiceAmt,0)) AS 'OR开票金额' FROM ORDR R INNER JOIN (SELECT distinct 合同号 FROM [ZY_TB_Receivable_Balance_Base] ) X ON X.合同号=R.NumAtCard ---有应收的合同号 GROUP BY R.NumAtCard ) R LEFT JOIN [ZY_TB_ConCode_Suppl_FP] T ON T.合同号 =R.NumAtCard ) R ON R.NumAtCard =Q.合同号 ) F2 ON F2.合同号 =T.合同号 LEFT JOIN [ZY_TB_ConCode_FP_IN_YKFP] Y ON Y.IN_DocEntry =T.DocEntry AND T.ObjType ='IN' WHERE --T.合同号 ='2024SHVS02088' (T.客户编码=@CardCode or @CardCode ='') and (T.客户名称 =@cardname or @cardname ='') and (T.销售员 =@SlpName or @SlpName ='') and (T.合同号 =@NumAtCard or @NumAtCard ='') and (T.DN补充代码=@SupplCode or @SupplCode ='') and (T.综合部门 =@department or @department ='') and (T.制单人=@U_USER or @U_USER ='') DROP TABLE #TEMP_Department
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值