单据编号未生成
没有自动生成单据编号
解决
查看数据库函数 tbl_sequence 表是否生成
未生成表可执行如下 sql 生成
-- 添加表tbl_sequence
-- ----------------------------
DROP TABLE IF EXISTS `tbl_sequence`;
CREATE TABLE tbl_sequence (
seq_name VARCHAR(50) NOT NULL COMMENT '序列名称',
min_value bigint(20) NOT NULL COMMENT '最小值',
max_value bigint(20) NOT NULL COMMENT '最大值',
current_val bigint(20) NOT NULL COMMENT '当前值',
increment_val INT DEFAULT '1' NOT NULL COMMENT '增长步数',
remark VARCHAR(500) DEFAULT null COMMENT '备注',
PRIMARY KEY (seq_name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='sequence表';
查看其中的一条关于单据编号的 sequence 数据是否写入
未写入,使用如下 sql 插入数据
-- ----------------------------
-- 添加表单据编号sequence
-- 插入数据前判断,防止数据重复插入
-- ----------------------------
insert into tbl_sequence (seq_name, min_value, max_value, current_val, increment_val,remark)
select 'depot_number_seq', 1, 999999999999999999, 1, 1,'单据编号sequence' from dual where not exists
(select * from tbl_sequence where seq_name='depot_number_seq');
查看生成单据的函数是否存在
不存在对应函数,使用如下 sql 创建
-- ----------------------------
-- 创建function _nextval() 用于获取当前序列号
-- ----------------------------
DROP FUNCTION IF EXISTS _nextval;
DELIMITER ;;
CREATE FUNCTION _nextval(name varchar(50)) RETURNS mediumtext CHARSET utf8
begin
declare _cur bigint;
declare _maxvalue bigint; -- 接收最大值
declare _increment int; -- 接收增长步数
set _increment = (select increment_val from tbl_sequence where seq_name = name);
set _maxvalue = (select max_value from tbl_sequence where seq_name = name);
set _cur = (select current_val from tbl_sequence where seq_name = name for update);
update tbl_sequence -- 更新当前值
set current_val = _cur + increment_val
where seq_name = name ;
if(_cur + _increment >= _maxvalue) then -- 判断是都达到最大值
update tbl_sequence
set current_val = minvalue
where seq_name = name ;
end if;
return _cur;
end
;;
DELIMITER ;
查看函数是否执行
select _nextval('depot_number_seq') from dual;
出现如下情况
使用如下方式创建
DROP FUNCTION IF EXISTS _nextval;
DELIMITER ;;
CREATE
definer = 'root'@'%'
FUNCTION _nextval (name varchar(50))
RETURNS mediumtext CHARSET utf8
comment '生成单据编号'
sql security invoker -- 以调用者的权限来执行
begin
declare _cur bigint;
declare _maxvalue bigint; -- 接收最大值
declare _increment int; -- 接收增长步数
set _increment = (select increment_val from tbl_sequence where seq_name = name);
set _maxvalue = (select max_value from tbl_sequence where seq_name = name);
set _cur = (select current_val from tbl_sequence where seq_name = name for update);
update tbl_sequence -- 更新当前值
set current_val = _cur + increment_val
where seq_name = name ;
if(_cur + _increment >= _maxvalue) then -- 判断是都达到最大值
update tbl_sequence
set current_val = minvalue
where seq_name = name ;
end if;
return _cur;
end
;;
DELIMITER ;
其它
经过如上几步,基本可以保证生成单据编号,如果经过以上步骤还不能生成单据编号,请在这里报告,我们会尽快修复,谢谢您的支持!