自动分组处理案例

--自动分组方案
--1. 原始表,需处理的数据

1 CREATE TABLE tbl_Z_Original
2 (
3     nID bigint identity(1,1) primary key,
4     sPro nvarchar(20),
5     sProBarcode nvarchar(20),        
6     dDate datetime default getdate()
7 )

--2. 计数器,记录分组号
--2.1. 创建表

1 CREATE TABLE tbl_Z_Counter
2 (
3     nID int identity(1,1) primary key,
4     sName nvarchar(50),
5     nCount bigint 
6 )

--2.2. 插入测试数据

1 INSERT INTO tbl_Z_Counter(sName,nCount)
2 VALUES('A',1),
3         ('B',1),
4         ('C',1);

--3. 自动分组表,记录分组后的信息

1 CREATE TABLE tbl_Z_Groups
2 (
3     gid UNIQUEIDENTIFIER PRIMARY KEY,
4     nID BIGINT,            --记录原始表【tbl_Z_Original】中的“nID”
5     sPro NVARCHAR(20),  --记录原始表【tbl_Z_Original】中的“sPro”
6     nGroups BIGINT,        --分组号,获取计数器【tbl_Z_Counter】中的“nCount”
7     sProBarcode NVARCHAR(20),    --记录原始表【tbl_Z_Original】中的“sProBarcode”
8     dDate DATETIME        --记录原始表【tbl_Z_Original】中的“dDate”
9 )

--4. 自动控制器,控制启动与停止分组
--4.1. 创建表

1 CREATE TABLE tbl_Z_Controller
2 (
3     gid UNIQUEIDENTIFIER PRIMARY KEY,
4     sPro nvarchar(20),
5     bStartOrStop BIT DEFAULT 0,
6     bCol1 BIT DEFAULT 0,
7     bCol2 BIT DEFAULT 0,
8     bCol3 BIT DEFAULT 0
9 )

--4.2. 插入测试数据

INSERT INTO tbl_Z_Controller(gid,sPro,bStartOrStop)
VALUES(NEWID(),'A',1),
        (NEWID(),'B',0),
        (NEWID(),'C',1);

--5. 计数规则表,计数循环设置
--5.1. 创建表

1 CREATE TABLE tbl_Z_CountingRules
2 (
3     gid UNIQUEIDENTIFIER PRIMARY KEY,
4     sPro NVARCHAR(20),
5     nCountingRules INT
6 )

--5.2. 插入测试数据

1 INSERT INTO tbl_Z_CountingRules
2 VALUES(NEWID(),'A',12),
3         (NEWID(),'B',10),
4         (NEWID(),'C',5);

--6. 触发器处理
-- 在原始表中创建触发器,每增加一条记录,根据要求自动分组并记录到自动分组表中

 1   -- 在原始表中创建触发器,每增加一条记录,根据要求自动分组并记录到自动分组表中
 2     CREATE TRIGGER [dbo].[tri_insert_tbl_Z_Groups]
 3     ON [dbo].[tbl_Z_Original]
 4     AFTER INSERT
 5     AS
 6     BEGIN
 7         DECLARE @bStartOrStop BIT
 8         DECLARE @isExit BIT
 9 
10         DECLARE @sPro NVARCHAR(20)
11         SELECT @sPro=sPro FROM inserted     --获取当前插入的是哪个编号
12 
13         SELECT @bStartOrStop= bStartOrStop FROM tbl_Z_Controller WHERE sPro=@sPro  
14         SELECT @isExit=CASE WHEN SUBSTRING(sProBarcode,1,3)='SSS' 
15                 THEN 1 ELSE 0 END FROM inserted   --判断是否是合理的数据,示例以“SSS”开头的字符串视为合理数据
16 
17         IF @bStartOrStop=1 AND @isExit=1 
18         BEGIN
19 
20             DECLARE @x INT    
21             DECLARE @nCountingRules INT             --循环计数界限
22             DECLARE @nCount AS INT
23 
24             SELECT @nCountingRules=nCountingRules FROM tbl_Z_CountingRules WHERE sPro=@sPro
25             SELECT @nCount=nCount FROM tbl_Z_Counter WHERE sName=@sPro
26 
27 
28             SELECT @x=COUNT(*) FROM tbl_Z_Groups WITH(NOLOCK)
29             WHERE nGroups=@nCount AND sPro=@sPro 
30 
31 
32             IF @x >= @nCountingRules-1    --分组界限
33             BEGIN
34                 UPDATE tbl_Z_Counter
35                 SET nCount = @nCount + 1
36                 FROM tbl_Z_Counter 
37                 WHERE sName=@sPro 
38             END
39          
40              INSERT INTO tbl_Z_Groups
41              SELECT NEWID(),nID,sPro,@nCount,sProBarcode,dDate FROM inserted
42         END
43     END

当后台有原始表插入记录时,自动分组表获取相应信息,演示结果如下:

posted @ 2020-11-14 15:26  tiger_yj  阅读(167)  评论(0编辑  收藏  举报