销售业务设计过程
1️⃣与销售业务有关的表?
tb_syjlb(收银记录表)
tb_symxb(收银明细表)
tb_kcxxb(库存信息表)
tb_hyxxb(会员信息表)
2️⃣与这些表的关系?
tb_syjlb(收银记录表) insert
tb_symxb(收银明细表) insert
tb_kcxxb(库存信息表) update
tb_hyxxb(会员信息表) update
3️⃣分别需要对哪些列赋值或更新哪些列的值?
tb_syjlb(收银记录表) insert syyid(收银员id) gkid(顾客id) ysje(应收金额) ssje(实收金额) zffs(支付方式)
tb_symxb(收银明细表) insert syid(收银id) hpid(货品id) xssl(销售数量) dj(单价) lsj(零售价)
tb_kcxxb(库存信息表) update 依据hpid xssl(销售数量)更新kcsl(库存数量)
tb_hyxxb(会员信息表) update 依据hyid(会员id) ssje(销售金额)更新knye(卡内余额) kyjf(可用积分)
4️⃣这些值从何而来?
tb_syjlb(收银记录表)insert syyid gkid ysje ssje zffs 需要从用户界面传过来 syyid gkid ysje ssje zffs
tb_syjlmxb(收银记录明细表)insert syid hpid xssl dj lsj 需要从用户界面传过来 hpid xssl
tb_hpkcb (货品库存表) update 依据hpid xssl 更新 kcsl 需要从用户界面传过来hpid xssl
tb_hyxxb(会员信息表) update 依据hyid ssje 更新knye kyjf 需要从用户界面传过来 hpid ssje
5️⃣表格数据向数据库传递的方法——数据转换的方法(没有表参数,就是没办法直接把表从界面传给数据库)转换方法?
把表格中的数据连接成字符串,传到数据库中后再把字符串还原为表格
例如:把销售明细中的hpid,xssl连接为以逗号分隔的字符串
DELIMITER $$
CREATE
PROCEDURE `possystem`.`xsjlcp`(xsmx VARCHAR(1000))
BEGIN
DROP TABLE IF EXISTS lsb;
CREATE TEMPORARY TABLE lsb(hpid INT,xssl NUMERIC(18,3));
WHILE (xsmx>'') DO
SET @k=POSITION(',' IN xsmx);
SET @hpid=LEFT(xsmx,@k-1);
SET xsmx=SUBSTR(xsmx,@k+1);
SET @k=POSITION(',' IN xsmx);
SET @xssl=LEFT(xsmx,@k-1);
INSERT INTO lsb VALUES(@hpid,@xssl);
SET xsmx=SUBSTR(xsmx,@k+1);
END WHILE;
SELECT * FROM lsb;
SELECT hptm,hpmc,jldw,dj,cxj,xssl*cxj AS 金额 FROM tb_hpxxb,lsb WHERE tb_hpxxb.hpid=lsb.hpid;
END$$
DELIMITER ;
为什么在mysql中执行存储过程不出结果?
6️⃣销售业务实现?
DELIMITER $$
CREATE
PROCEDURE `possystem`.`xsjlcp_new`(syyid INT,hyid INT,ysje DECIMAL(18,2),ssje DECIMAL(18,2),zffs TINYINT,xsmx VARCHAR(1000))
BEGIN
/*1. tb_syjlb(收银记录表) insert syyid(收银员id) gkid(顾客id)
ysje(应收金额) ssje(实收金额) zffs(支付方式)*/
INSERT INTO tb_syjlb(syyid,gkid,ysje,ssje,zffs) VALUES(syyid,hyid,ysje,ssje,zffs);
SET @syid=@@identity;
DROP TABLE IF EXISTS lsb;
CREATE TEMPORARY TABLE lsb(hpid INT,xssl NUMERIC(18,3));
WHILE (xsmx>'') DO
SET @k=POSITION(',' IN xsmx);
SET @hpid=LEFT(xsmx,@k-1);
SET xsmx=SUBSTR(xsmx,@k+1);
SET @k=POSITION(',' IN xsmx);
SET @xssl=LEFT(xsmx,@k-1);
INSERT INTO lsb VALUES(@hpid,@xssl);
SET xsmx=SUBSTR(xsmx,@k+1);
END WHILE;
/*2. tb_syjlmxb(收银记录明细表)insert syid hpid xssl dj lsj
需要从用户界面传过来 hpid xssl*/
INSERT INTO tb_symxb(syid,hpid,xssl,dj,lsj) SELECT @syid,lsb.hpid,xssl,dj,cxj FROM lsb,tb_hpxxb WHERE lsb.hpid=tb_hpxxb.`hpid`;
/*3. tb_hpkcb (货品库存表) update 依据hpid xssl 更新 kcsl
需要从用户界面传过来hpid xssl*/
DROP TABLE IF EXISTS lsb1;
CREATE TEMPORARY TABLE lsb1(hpid INT,xssl NUMERIC(18,3));
INSERT INTO lsb1 SELECT hpid,SUM(xssl) FROM lsb GROUP BY hpid;
UPDATE tb_hpkcb b1,lsb1 b2 SET b1.kcsl=b1.kcsl-b2.xssl WHERE b1.hpid=b2.hpid;
/*4. tb_hyxxb(会员信息表) update 依据hyid ssje 更新knye kyjf
需要从用户界面传过来 hpid ssje */
IF hyid>10000 THEN
UPDATE tb_hyxxb SET knye=knye-ssje,kyjf=kyjf+FLOOR(ssje) WHERE tb_hyxxb.`hyid`=hyid;
END IF;
END$$
DELIMITER ;
一、事务的概念
在销售存储过程中增加事务控制
start transaction;
COMMIT; 或者
ROLLBACK;
二、作业与思考题:
1、在上面的练习中用到了哪些内置函数?
MySQL POSITION() 函数
实例
在字符串“begtut.com”中搜索“u”,并返回位置:
SELECT POSITION("u" IN "begtut.com") AS MatchPosition;
定义和用法
POSITION()函数返回字符串中第一次出现的子字符串的位置。
如果在原始字符串中找不到子字符串,则此函数返回0。
此函数执行不区分大小写的搜索。
注:LOCATE()函数等于position()函数。
语法
POSITION(substring IN string)
参数值
参数 | 描述 |
---|---|
substring | 必须项。要在字符串中搜索的子字符串 |
string | 必须项。要搜索的原始字符串 |
MySQL LEFT() 函数
实例
从字符串中提取3个字符(从左侧开始):
SELECT LEFT("SQL Tutorial", 3) AS ExtractString;
定义和用法
LEFT()函数从字符串中提取多个字符(从左开始)。
**提示:**另请查看RIGHT()函数。
语法
LEFT(string, number_of_chars)
参数值
参数 | 描述 |
---|---|
string | 必须项。要从中提取的字符串 |
number_of_chars | 必须项。要提取的字符数。如果此参数大于字符串中的字符数,则此函数将返回字符串 |
MySQL SUBSTR() 函数
实例
从字符串中提取子字符串(从位置5开始,提取3个字符):
SELECT SUBSTR("SQL Tutorial", 5, 3) AS ExtractString;
定义和用法
SUBSTR()函数从字符串中提取子字符串(从任何位置开始)。
注意: SUBSTR()和MID()函数等于SUBSTRING()函数。
语法
SUBSTR(string, start, length)
要么:
SUBSTR(string FROM start FOR length)
参数值
参数 | 描述 |
---|---|
string | 必须项。要从中提取的字符串 |
start | 必须项。起始位置。可以是正数或负数。如果是正数,则此函数从字符串的开头提取。如果是负数,则此函数从字符串的末尾提取 |
length | 可选项。要提取的字符数。如果省略,将返回整个字符串(从起始位置) |
2、临时表如何创建?
先把临时表转化成字符串,再把字符串转换成表格,添加到创建的表中
3、如何实现带子查询的插入操作?
insert into *** select *** from tb where ***;
4、@@identity里面存储的是什么数据?
@@identity得到上一次插入记录时自动产生的ID
5、设计存储过程的基本步骤是什么?
创建存储过程—>写所需要的参数—>根据功能编写sql语句—>测试存储过程