/ Object: StoredProcedure [dbo].[p_he_erpsale] Script Date: 08/15/2019 14:22:49 /
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER OFF
GO ALTER PROC [dbo].[p_he_erpsale]
@userid VARCHAR(10) ,
@saleno VARCHAR(40) OUT
AS
BEGIN
/*
当前版本v1.1
v1.1 添加营业员
*/
DECLARE @msg VARCHAR(100) DECLARE @errortxt VARCHAR(1000); DECLARE @accdate DATETIME; SET @saleno = ''; SET @accdate = CAST(CONVERT(VARCHAR(10), GETDATE(), 120) AS DATETIME); --平台 DECLARE @hdorderno VARCHAR(30); DECLARE @busno VARCHAR(13) DECLARE @member VARCHAR(20) DECLARE @saler varchar(10) DECLARE @eccode VARCHAR(10); DECLARE @olshopid VARCHAR(10); DECLARE @olorderno VARCHAR(30); DECLARE @payment NUMERIC(16, 6) DECLARE @para_2455 int --零售计算营业员积分的依据 DECLARE @pile numeric(16,6) DECLARE @wareid varchar(13) DECLARE @salegroup varchar(10) DECLARE @shiftid int DECLARE @shiftdate DATETIME DECLARE @is_rtn INT select @payment = sum( ROUND(ISNULL(netsum, 0), 2)) FROM #he_sale_pay SELECT @hdorderno = hdorderno, @busno = busno, @eccode = eccode , @olshopid = olshopid, @olorderno = olorderno, @saler = saler, @member = member, @shiftid = shiftid, @shiftdate = shiftdate FROM #he_sale_m select @para_2455 = para from c_sys_ini (nolock) where ini = '2455' select @salegroup = salegroup from c_org_busi where busno = @busno IF OBJECT_ID('tempdb..#t_last_sale_c_check') IS NOT NULL DROP TABLE #t_last_sale_c_check; CREATE TABLE #t_last_sale_c_check ( saleno VARCHAR(40) , wareid VARCHAR(13) , wareqty NUMERIC(16, 6) ); IF OBJECT_ID('tempdb..#t_salepst_memintegral') IS NOT NULL DROP TABLE #t_salepst_memintegral; CREATE TABLE #t_salepst_memintegral ( memintegral_d NUMERIC(16, 4) NULL , memintegrl_add NUMERIC(16, 4) NULL, pstplannos_d varchar(500), pstplannos_add varchar(500) ); SET @is_rtn = 0 IF EXISTS(SELECT 1 FROM #sale WHERE act_wareqty < 0) SET @is_rtn = 1 --是退单 IF @is_rtn = 0 BEGIN --屏蔽触发器 if OBJECT_ID('#disable_u_sale_m') is null create table #disable_u_sale_m(i int) if OBJECT_ID('#disable_u_sale_c') is null create table #disable_u_sale_c(i int) if OBJECT_ID('#disable_u_sale_pay') is null create table #disable_u_sale_pay(i int) --扣减库存 update u_store_c set u_store_c.wareqty=ISNULL(u_store_c.wareqty,0)-isnull(b.act_wareqty,0) from u_store_c,#sale b where u_store_c.batchno=b.batchno and u_store_c.wareid=b.wareid and u_store_c.idno=b.idno and u_store_c.stallno=b.stallno and u_store_c.busno=b.busno if @@ERROR<>0 begin rollback raiserror('扣减库存失败',16,1) return end --库存校验 if exists(select 1 from u_store_c,#sale b where u_store_c.batchno=b.batchno and u_store_c.wareid=b.wareid and u_store_c.idno=b.idno and u_store_c.stallno=b.stallno and u_store_c.busno=b.busno and u_store_c.wareqty<0) begin rollback raiserror('扣减库存后出现库存不平衡',16,1) return END SELECT TOP 1 @msg = '不存在库存明细('+'batchno:'+ISNULL(batchno,'')+',wareid:'+ISNULL(wareid,'')+',idno:'+ISNULL(idno,'')+',stallno:'+ISNULL(stallno,'')+',busno:'+ISNULL(busno,'')+')!' FROM #sale b WHERE b.warekind = 1 and NOT EXISTS(SELECT 1 FROM u_store_c where u_store_c.batchno=b.batchno and u_store_c.wareid=b.wareid and u_store_c.idno=b.idno and u_store_c.stallno=b.stallno and u_store_c.busno=b.busno ) IF @@ROWCOUNT > 0 begin rollback raiserror(@msg,16,1) return END END –兑换损失(补零)
DECLARE @loss NUMERIC(16, 2);
SET @loss = ROUND(( SELECT SUM(ROUND(ISNULL(act_wareqty * netprice, 0),
2))
FROM #sale
) – ( SELECT SUM(ROUND(ISNULL(payment, 0), 2))
FROM #he_sale_m
), 2); –获取零售单号
BEGIN TRAN t1;
EXEC p_skip ‘SAL’;
SELECT @saleno = serialno
FROM dbo.f_get_serialno(‘SAL’);
COMMIT TRAN t1;
DECLARE @rowno INT;
DECLARE @sale_rowid INT;
SET @sale_rowid = 0;
WHILE 1 = 1
BEGIN
SELECT TOP 1
@rowno = rowno,
@wareid = wareid
FROM #sale
WHERE flag_sale = 0;
IF @@ROWCOUNT <= 0
BREAK;
UPDATE #sale
SET flag_sale = 1
WHERE rowno = @rowno;
SET @sale_rowid = @sale_rowid + 1; --以商品资料中的积分计算 if @para_2455 = 1 begin select @pile = pile from u_ware_q where wareid = @wareid end --以价格组的积分计算 if @para_2455 = 2 begin select @pile = pile from u_ware_saleprice where groupid = @salegroup and wareid = @wareid end --当价格组积分大于零时以价格组为准,否则以商品资料为准 if @para_2455 = 3 begin select @pile = pile from u_ware_saleprice where groupid = @salegroup and wareid = @wareid if isnull(@pile,0) <= 0 begin select @pile = pile from u_ware_q where wareid = @wareid end end --生成零售明细 INSERT u_sale_c ( saleno , rowid , busno , accdate , wareid , batchno , idno , stallno , makeno , stdprice , netprice , minprice , wareqty , groupid , saler , times , invalidate , minqty , stdtomin , disrate , distype , disno , message , purprice , purtax , bak1 , bak2 , avgpurprice , rowtype , insno , pile , storeqty , saletax ) SELECT saleno = @saleno , rowid = @sale_rowid , busno = a.busno , accdate = @accdate , wareid = a.wareid , batchno = a.batchno , idno = a.idno , stallno = a.stallno , makeno = a.makeno , stdprice = a.price ,--标价 netprice = a.netprice ,--实价 minprice = 0 ,--拆零售价 wareqty = a.act_wareqty , groupid = 1 , saler = @saler, times = 1 , invalidate = a.invalidate , minqty = 0 , stdtomin = 1 ,--拆零比率 disrate = 1 , distype = 0 , disno = '' , message = '' , purprice = a.purprice ,--进价 purtax = a.purtax , bak1 = 0 , bak2 = '' , avgpurprice = u_ware_q.avgpurprice ,--加权进价 rowtype = CASE WHEN u_ware_q.warekind = 3 THEN 3 ELSE 1 END , insno = NULL , pile = @pile , storeqty = CASE WHEN u_ware_q.warekind = 3 THEN NULL ELSE a.storeqty - a.act_wareqty END , saletax = u_ware_q.saletax FROM #sale a LEFT JOIN u_ware_q(nolock) ON a.wareid = u_ware_q.wareid WHERE a.rowno = @rowno; END; –生成零售主表
INSERT u_sale_m
( saleno ,
busno ,
posno ,
accdate ,
starttime ,
finaltime ,
payee ,
discounter ,
crediter ,
returner ,
warranter2 ,
warranter1 ,
warranter3 ,
warranter4 ,
warranter5 ,
stdsum ,
netsum ,
loss ,
member ,
precash ,
bak1 ,
bak2 ,
shiftid ,
shiftdate ,
yb_saleno
)
SELECT saleno = @saleno ,
busno = @busno ,
posno = @busno ,
accdate = @accdate ,
starttime = GETDATE() ,
finaltime = GETDATE() ,
payee = @userid ,–收银员
discounter = ” ,–打折授权人
crediter = ” ,–赊销授权人
returner = ” ,–退货授权人
warranter1 = ‘HE_SRC’ ,
warranter2 = @hdorderno ,
warranter3 = @eccode ,
warranter4 = @olshopid ,
warranter5 = @olorderno ,
stdsum = SUM(ROUND(ISNULL(act_wareqty * price, 0), 2)) ,–标价总金额
netsum = @payment ,–实价金额
loss = @loss ,–兑换损失
member = @member ,–会员卡号
precash = @payment ,–收现金额
bak1 = 0 ,
bak2 = ” ,
shiftid = @shiftid,–班次
shiftdate = @shiftdate,–班次日期
yb_saleno = ”
FROM #sale;
–生成零售支付表
INSERT u_sale_pay
( saleno ,
paytype ,
cardno ,
netsum ,
bak1 ,
bak2
)
SELECT @saleno ,
paytype ,
NULL ,
ROUND(ISNULL(netsum, 0), 2) ,
NULL ,
NULL
FROM #he_sale_pay a --检测u_sale_c与u_sale_pay的平衡 IF ( SELECT SUM(ROUND(ISNULL(wareqty * netprice, 0), 2)) FROM u_sale_c(nolock) WHERE saleno = @saleno ) - @loss <> ( SELECT SUM(ROUND(ISNULL(netsum, 0), 2)) FROM u_sale_pay(nolock) WHERE saleno = @saleno ) BEGIN ROLLBACK; SET @errortxt = 'sum(round(isnull(u_sale_c.wareqty*u_sale_c.netprice,0),2))-@loss<>sum(round(u_sale_pay.netsum,2))'; RAISERROR(@errortxt,16,1); RETURN; END; –检测paytype
IF EXISTS ( SELECT 1
FROM u_sale_pay(nolock)
WHERE u_sale_pay.saleno = @saleno
AND NOT EXISTS ( SELECT 1
FROM c_dddw(NOLOCK)
WHERE c_dddw.dddwno = ‘222’
AND c_dddw.dddwlist = u_sale_pay.paytype ) )
BEGIN
ROLLBACK;
SET @errortxt = ‘有支付类型非法’;
RAISERROR(@errortxt,16,1);
RETURN;
END; IF @is_rtn = 0 BEGIN if OBJECT_ID('#disable_u_sale_m') is not null drop table #disable_u_sale_m if OBJECT_ID('#disable_u_sale_c') is not null drop table #disable_u_sale_c if OBJECT_ID('#disable_u_sale_pay') is not null drop table #disable_u_sale_pay --执行扩展触发器代码 declare @triggername varchar(100) select @triggername = 'tr_u_sale_c' if exists(select 1 from c_trigger_ext(nolock) where triggername = @triggername and status_use = 1 and ltrim(rtrim(isnull(sql,''))) <> '') BEGIN EXEC('select * into #inserted from u_sale_c WHERE saleno = '''+@saleno+''' select * into #deleted from u_sale_c WHERE 1 <> 1 exec p_trigger_ext '''+@triggername+'''') end select @triggername = 'tr_u_sale_m_i' if exists(select 1 from c_trigger_ext(nolock) where triggername = @triggername and status_use = 1 and ltrim(rtrim(isnull(sql,''))) <> '') BEGIN EXEC('select * into #inserted from u_sale_m WHERE saleno = '''+@saleno+''' select * into #deleted from u_sale_m WHERE 1 <> 1 exec p_trigger_ext '''+@triggername+'''') end select @triggername = 'tr_u_sale_pay_i' if exists(select 1 from c_trigger_ext(nolock) where triggername = @triggername and status_use = 1 and ltrim(rtrim(isnull(sql,''))) <> '') BEGIN EXEC('select * into #inserted from u_sale_pay WHERE saleno = '''+@saleno+''' select * into #deleted from u_sale_pay WHERE 1 <> 1 exec p_trigger_ext '''+@triggername+'''') end END END GO
|