1、拆分字符串
IF EXISTS(SELECT NAME FROM sysobjects
WHERE NAME = N'procInsertOrderInfoOrderList' AND Type = N'P')
DROP PROCEDURE procInsertOrderInfoOrderList
GO
CREATE PROCEDURE procInsertOrderInfoOrderList
(
@Did NVARCHAR(1000), --餐桌号(团体时为字符串)
@Mid NVARCHAR(4000), --非套餐时为:菜单号或拼音(字符串),套餐时为:套餐号
@Onum NVARCHAR(4000), --非套餐时为:各个菜的数量(字符串),套餐时为:套餐的数量1
@Onume INT, --餐桌实做人数
@Uid INT, --终端下单服务员员工编号
@OremarkList NVARCHAR(4000), --菜的备注(字符串)
@Oflag BIT, --是否套餐标志{(0,非套餐),(1,套餐)}
@Nstatus BIT --用于判断是团体还是个人{(0,个人),(1,团体)}
)
AS
BEGIN
DECLARE @dt NVARCHAR(1000) --用于存放拆分后的餐桌号
DECLARE @rt NVARCHAR(4000) --用于存放拆分后的菜单号
DECLARE @rt1 NVARCHAR(4000) --存放拆分后的菜的备注
DECLARE @rt2 NVARCHAR(4000) --用于存放拆分后的数量
DECLARE @Orid NVARCHAR(20) --要插入数据库中的订单号
DECLARE @Did1 INT --要插入数据库中的餐桌号
DECLARE @OIid INT --要插入数据库中的订单号对应的记录号
DECLARE @Mid1 INT --要插入数据库中的菜单号
DECLARE @BLid INT --要插入数据库中的套餐号
DECLARE @MPrice1 MONEY --要插入数据库中的价格
DECLARE @Mname1 NVARCHAR(20) --存储菜单对应的拼音
DECLARE @Oremark NVARCHAR(200) --要插入数据库中的菜的备注
DECLARE @count INT --用于统计餐桌的个数
DECLARE @count1 INT --统计菜单的个数
DECLARE @count2 INT --统计一个餐桌上相同菜的个数
DECLARE @mm INT --用于循环餐桌的个数
DECLARE @nn INT --用于循环插入菜单的个数
DECLARE @i INT --用于处理拆分调用SUBSTRING的个数
DECLARE @ii INT --用于处理拆分调用SUBSTRING的个数
DECLARE @timeID NVARCHAR(17) --获取时间唯一标示
DECLARE @OrderInfoDid INT --用于团体开单时取同一个订单号
DECLARE @FirstYN INT --判断是开单还是加菜{(0,开单),(大于0,加菜)}
DECLARE @DidYN INT --存储接收处理后的餐桌号,用于判断是第一次开单还是加菜
DECLARE @Mflag INT --根据Mid取Mflag
DECLARE @update_D_rowcount INT
DECLARE @update_D_error INT
DECLARE @insert_OI_error INT
DECLARE @insert0_OL_error INT
IF( @Oflag = 0 ) --非套餐
BEGIN --(非套餐BEGIN)
IF( @Nstatus = 0 ) --个人开单
BEGIN --(个人开单BEGIN)
SELECT @DidYN = CAST(@Did AS INT)
SELECT
@FirstYN = COUNT(Did)
FROM
OrderInfo
WHERE
( Did = @DidYN )
AND( Ostatus = 0 )
IF(@FirstYN = 0) --个人第一次开单
BEGIN --(个人第一次开单BEGIN)
EXECUTE procGetTimeID @timeID OUTPUT
SELECT @Orid =N'P'+@timeID
SELECT @Did1 = CAST(@Did AS INT)
--修改餐桌状态为"使用中"
BEGIN TRANSACTION
UPDATE
DingingTable
SET
Dstatus = 3
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2) )
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
INSERT INTO OrderInfo( Orid,Did,Onum,Uid )
VALUES( @Orid,@Did1,@Onume,@Uid )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
SET @nn = 1
SET @i = 1
WHILE(@nn <= @count1)
BEGIN
SET @Mid = @Mid + ','
SET @OremarkList = @OremarkList + ','
SET @Onum = @Onum + ','
IF(@nn = 1)
BEGIN
SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜的编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
SELECT @Oremark = @rt1
SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
SELECT @count2 =CAST(@count2 AS INT)
IF( @Mflag != 2)
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
ELSE IF(@nn <=@count1)
BEGIN
SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
WHILE(@i < (@nn - 1))
BEGIN
SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
SET @i = @i + 1
END
SET @i = 1
SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SELECT @Oremark = @rt1
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
SET @nn = @nn + 1
END
--返回个人第一次开单结果
IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
BEGIN
COMMIT TRANSACTION --开单成功
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION --开单失败
SELECT 0 AS Result
END
END --(个人第一次开单END)
ELSE IF( @FirstYN > 0) --个人加菜
BEGIN --(个人加菜BEGIN)
SELECT @Did1 = CAST(@Did AS INT)
DECLARE @OrderInfo_flag INT --判断是否套餐
SELECT
@OrderInfo_flag = Oflag
FROM
OrderInfo
WHERE
( Did = @Did1 )
AND( Ostatus = 0 )
IF( @OrderInfo_flag = 0 ) --非套餐加菜
BEGIN --(个人非套餐加菜BEGIN)
SELECT @OIid = OIid FROM OrderInfo
WHERE
( Did = @Did1 )
AND( Ostatus = 0 )
SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
SET @nn = 1
SET @i = 1
BEGIN TRANSACTION
WHILE (@nn <= @count1)
BEGIN
SET @Mid = @Mid + ','
SET @OremarkList = @OremarkList + ','
SET @Onum = @Onum + ','
IF(@nn = 1)
BEGIN
SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
SELECT @Oremark = @rt1
SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
SELECT @count2 =CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
ELSE IF(@nn <=@count1)
BEGIN
SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
WHILE(@i < (@nn - 1))
BEGIN
SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
SET @i = @i + 1
END
SET @i = 1
SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SELECT @Oremark = @rt1
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
SET @nn = @nn + 1
END
--返回加菜结果
IF( @insert0_OL_error = 0 )
BEGIN
COMMIT TRANSACTION
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SELECT 0 AS Result
END
END --(个人非套餐加菜END)
ELSE IF( @OrderInfo_flag = 1 ) --个人套餐加菜
BEGIN --(个人套餐加菜BEGIN)
SELECT
@OIid = OIid
FROM
OrderInfo
WHERE
( Did = @Did1 )
AND( Ostatus = 0 )
AND( Oflag = 1 )
SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
SET @nn = 1
SET @i = 1
BEGIN TRANSACTION
WHILE(@nn <= @count1)
BEGIN --循环BEGIN
SET @Mid = @Mid + ','
SET @OremarkList = @OremarkList + ','
SET @Onum = @Onum + ','
IF(@nn = 1)
BEGIN
SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
SELECT @Oremark = @rt1
SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
SELECT @count2 =CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
VALUES ( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
ELSE IF(@nn <=@count1)
BEGIN
SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
WHILE(@i < (@nn - 1))
BEGIN
SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
SET @i = @i + 1
END
SET @i = 1
SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SELECT @Oremark = @rt1
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
SET @nn = @nn + 1
END--循环END
IF( @insert0_OL_error = 0 )
BEGIN
COMMIT TRANSACTION
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SELECT 0 AS Result
END
END --(个人套餐加菜END)
END --(个人加菜END)
END --(个人开单END)
ELSE IF ( @Nstatus = 1 )--团体开单 非套餐
BEGIN --(团体开单BEGIN)
SET @ii = 1
SELECT @count = LEN(@Did)-LEN(REPLACE(@Did,',',''))+1 --这里餐桌的个数,即 @count >= 2
SET @mm = 1
WHILE( @mm <= @count )
BEGIN
SET @Did = @Did + ','
BEGIN TRANSACTION
IF( @mm = 1 )
BEGIN
SET @dt=LEFT(@Did,CHARINDEX(',',@Did)-1)
SELECT @Did1 = CAST( @dt AS INT )
UPDATE
DingingTable --更新餐桌状态为"使用中"
SET
Dstatus = 3
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2) )
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
SELECT @OrderInfoDid = @Did1
EXECUTE procGetTimeID @timeID OUTPUT
SELECT @Orid =N'P'+@timeID
BEGIN
INSERT INTO OrderInfo( Orid,Did,Onum,Uid )
VALUES( @Orid,@Did1,@Onume,@Uid )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
SET @nn = 1
SET @i = 1
WHILE(@nn <= @count1)
BEGIN
SET @Mid = @Mid + ','
SET @OremarkList = @OremarkList + ','
SET @Onum = @Onum + ','
IF(@nn = 1)
BEGIN
SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag= Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
SELECT @Oremark = @rt1
SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
ELSE IF(@nn <=@count1)
BEGIN
SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
WHILE(@i < (@nn - 1))
BEGIN
SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
SET @i = @i + 1
END
SET @i = 1
SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SELECT @Oremark = @rt1
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
SET @nn = @nn + 1
END
END
END
ELSE IF( @mm <= @count )
BEGIN
SET @dt=SUBSTRING(@Did,CHARINDEX(',',@Did)+1,4000)
WHILE(@ii < (@mm - 1))
BEGIN
SET @dt = SUBSTRING(@dt,CHARINDEX(',',@dt)+1,4000)
SET @ii = @ii + 1
END
SET @ii = 1
SET @dt = LEFT(@dt,CHARINDEX(',',@dt)-1)
SELECT @Did1 = CAST( @dt AS INT )
UPDATE DingingTable SET Dstatus = 3 --更新餐桌状态为"使用中"
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2) )
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
SELECT @Orid = Orid FROM OrderInfo
WHERE
( Did = @OrderInfoDid )
AND( Ostatus = 0 )
BEGIN
INSERT INTO OrderInfo( Orid,Did,Onum,Uid )
VALUES( @Orid,@Did1,@Onume,@Uid )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
SET @nn = 1
SET @i = 1
WHILE (@nn <= @count1)
BEGIN
SET @Mid = @Mid + ','
SET @OremarkList = @OremarkList + ','
SET @Onum = @Onum + ','
IF(@nn = 1)
BEGIN
SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
SELECT @Oremark = @rt1
SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
ELSE IF(@nn <=@count1)
BEGIN
SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
WHILE(@i < (@nn - 1))
BEGIN
SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
SET @i = @i + 1
END
SET @i = 1
SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
BEGIN
SELECT @Mid1 = CAST( @rt AS INT )
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
ELSE --如果@rt为菜单对应的拼音
BEGIN
SELECT @Mname1 = LOWER( @rt )
SELECT @Mid1 = Mid FROM Menu
WHERE Mname1 = @Mname1
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @Mid1
END
SELECT @Oremark = @rt1
SELECT @count2 = CAST(@count2 AS INT)
IF( @Mflag != 2 )
BEGIN
WHILE( @count2 >=1 )
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
SET @count2 = @count2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
SELECT @insert0_OL_error = @@ERROR
END
END
SET @nn = @nn + 1
END
END
END
SET @mm = @mm + 1
IF(@update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error =0)
BEGIN
COMMIT TRANSACTION
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SELECT 0 AS Result
END
END --循环END
END --(团体开单END)
END --(非套餐END)
ELSE IF(@Oflag = 1) --套餐
BEGIN --(套餐BEGIN)
IF(@Nstatus = 0) --个人开单
BEGIN --(个人开单BEGIN)
EXECUTE procGetTimeID @timeID OUTPUT
SELECT @Orid =N'T'+@timeID
SELECT @Did1 = CAST(@Did AS INT)
--修改餐桌状态为"使用中"
BEGIN TRANSACTION
UPDATE DingingTable SET Dstatus = 3
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2))
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
SELECT @BLid = CAST(@Mid AS INT)
INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag )
VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
--以下向OrderList表中插入数据
DECLARE @Bnum INT --循环相同菜的个数
DECLARE @BLid_Mid INT --保存取出的菜单号
DECLARE Fetch_BLid_Mid CURSOR FOR
SELECT Mid FROM BundlingMenu
WHERE BLid = @BLid
OPEN Fetch_BLid_Mid
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid
WHILE(@@FETCH_STATUS = 0)
BEGIN--取游标BEGIN
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @BLid_Mid
SELECT
@Bnum = Bnum
FROM
BundlingMenu
WHERE
( Mid = @BLid_Mid )
AND( BLid = @BLid )
IF( @Mflag != 2 )
BEGIN
WHILE( @Bnum >= 1 )
BEGIN
INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
VALUES(@OIid,@BLid_Mid,@Mprice1,@Uid)
SELECT @insert0_OL_error = @@ERROR
SET @Bnum = @Bnum - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
VALUES( @OIid,@BLid_Mid,@Mprice1,@Bnum,@Uid)
SELECT @insert0_OL_error = @@ERROR
END
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid
END--取游标END
CLOSE Fetch_BLid_Mid
DEALLOCATE Fetch_BLid_Mid
IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
BEGIN
COMMIT TRANSACTION
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SELECT 0 AS Result
END
END --(个人开单END)
ELSE IF(@Nstatus = 1) --团体套餐开单
BEGIN --(团体套餐开单BEGIN)
SET @ii = 1
SELECT @count = LEN(@Did)-LEN(REPLACE(@Did,',',''))+1 --这里餐桌的个数,即 @count >= 2
SET @mm = 1
WHILE( @mm <= @count )
BEGIN --循环BEGIN
SET @Did = @Did + ','
BEGIN TRANSACTION
IF( @mm = 1 )
BEGIN --(@mm=1BEGIN)
SET @dt=LEFT(@Did,CHARINDEX(',',@Did)-1)
EXECUTE procGetTimeID @timeID OUTPUT
SELECT @Orid =N'T'+@timeID
SELECT @Did1 = CAST(@dt AS INT)
SELECT @OrderInfoDid = @Did1
--修改餐桌状态为"使用中"
UPDATE DingingTable SET Dstatus = 3
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2) )
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
SELECT @BLid = CAST(@Mid AS INT)
INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag )
VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
--以下向OrderList表中插入数据
DECLARE @Bnum1 INT --循环相同菜的个数
DECLARE @BLid_Mid1 INT --保存取出的菜单号
DECLARE Fetch_BLid_Mid CURSOR FOR
SELECT Mid FROM BundlingMenu
WHERE BLid = @BLid
OPEN Fetch_BLid_Mid
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid1
WHILE(@@FETCH_STATUS = 0)
BEGIN--取游标BEGIN
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @BLid_Mid1
SELECT
@Bnum1 = Bnum
FROM
BundlingMenu
WHERE
( Mid = @BLid_Mid1 )
AND( BLid = @BLid )
IF( @Mflag != 2 )
BEGIN
WHILE( @Bnum1 >= 1 )
BEGIN
INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
VALUES(@OIid,@BLid_Mid1,@Mprice1,@Uid)
SELECT @insert0_OL_error = @@ERROR
SET @Bnum1 = @Bnum1 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
VALUES( @OIid,@BLid_Mid1,@Mprice1,@Bnum1,@Uid)
SELECT @insert0_OL_error = @@ERROR
END
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid1
END--取游标END
CLOSE Fetch_BLid_Mid
DEALLOCATE Fetch_BLid_Mid
END --(@mm=1END)
ELSE IF( @mm <= @count )
BEGIN--(@mm <= @count BEGIN)
SET @dt=SUBSTRING(@Did,CHARINDEX(',',@Did)+1,4000)
WHILE(@ii < (@mm - 1))
BEGIN
SET @dt = SUBSTRING(@dt,CHARINDEX(',',@dt)+1,4000)
SET @ii = @ii + 1
END
SET @ii = 1
SET @dt = LEFT(@dt,CHARINDEX(',',@dt)-1)
SELECT @Did1 = CAST( @dt AS INT )
UPDATE
DingingTable --更新餐桌状态为"使用中"
SET
Dstatus = 3
WHERE
( Did = @Did1 )
AND( Dstatus IN(1,2) )
SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
SELECT
@Orid = Orid
FROM
OrderInfo
WHERE
( Did = @OrderInfoDid )
AND( Ostatus = 0 )
SELECT @BLid = CAST(@Mid AS INT)
INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag )
VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
SELECT @insert_OI_error = @@ERROR
SELECT @OIid = IDENT_CURRENT('OrderInfo')
--以下向OrderList表中插入数据
DECLARE @Bnum2 INT --循环相同菜的个数
DECLARE @BLid_Mid2 INT --保存取出的菜单号
DECLARE Fetch_BLid_Mid CURSOR FOR
SELECT Mid FROM BundlingMenu
WHERE BLid = @BLid
OPEN Fetch_BLid_Mid
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid2
WHILE(@@FETCH_STATUS = 0)
BEGIN--取游标BEGIN
SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
WHERE Mid = @BLid_Mid2
SELECT
@Bnum2 = Bnum
FROM
BundlingMenu
WHERE
( Mid = @BLid_Mid2 )
AND( BLid = @BLid )
IF( @Mflag != 2 )
BEGIN
WHILE( @Bnum2 >= 1 )
BEGIN
INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
VALUES(@OIid,@BLid_Mid2,@Mprice1,@Uid)
SELECT @insert0_OL_error = @@ERROR
SET @Bnum2 = @Bnum2 - 1
END
END
ELSE
BEGIN
INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
VALUES( @OIid,@BLid_Mid2,@Mprice1,@Bnum2,@Uid)
SELECT @insert0_OL_error = @@ERROR
END
FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid2
END--取游标END
CLOSE Fetch_BLid_Mid
DEALLOCATE Fetch_BLid_Mid
END--(@mm <= @count END)
SET @mm = @mm + 1
IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
BEGIN
COMMIT TRANSACTION
SELECT 1 AS Result
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SELECT 0 AS Result
END
END--(循环END)
END--(团体套餐开单END)
END--(套餐END)
END
GO
--EXECUTE procInsertOrderInfoOrderList '56,57','1004,1005','1,1','7','1003','不,'0','1'
2、动态SQL
F EXISTS(SELECT NAME FROM sysobjects
WHERE NAME = N'procSelectAccountedInfoByDate' AND Type = N'P')
DROP PROCEDURE procSelectAccountedInfoByDate
GO
CREATE PROCEDURE procSelectAccountedInfoByDate
(
@Date NVARCHAR(10)
)
AS
BEGIN
CREATE TABLE #Temp_001
(
Pid INT,
Pname NVARCHAR(20),
Uname NVARCHAR(20),
Atotal2 MONEY
)
INSERT INTO #Temp_001(Pid,Pname,Uname,Atotal2)
(
SELECT
P.Pid AS Pid,
P.Pname AS Pname,
ISNULL(DBO.funGetUnameByUid(A.Uid),'') AS Uname,
A.Atotal2 AS Atotal2
FROM
Paymode AS P LEFT JOIN Account AS A ON ( P.Pid = A.Pid ) AND ( DBO.funGetNewDate(A.Atime) = @Date )
)
DECLARE @SQL VARCHAR(8000)
SET @SQL = 'SELECT
Pid AS 代码,
Pname AS 科目名称'
SELECT
@SQL = @SQL + ','+Users.Uname+'=CONVERT(NVARCHAR,ISNULL(SUM(CASE Uname WHEN '''+Users.Uname+''' THEN Atotal2 END ),NULL),102)'
FROM
Users
WHERE
Tid = 7 --属于收银
ORDER BY Uid
SET
@SQL = @SQL + ',CONVERT(NVARCHAR,ISNULL(SUM(Atotal2),NULL),102) AS 合计金额
FROM #Temp_001
GROUP BY Pid,Pname
ORDER BY Pid'
PRINT @SQL
EXECUTE (@SQL)
DROP TABLE #Temp_001
END
GO