单据编号未生成

没有自动生成单据编号

QQ图片20190521104315.jpg

解决

查看数据库函数 tbl_sequence 表是否生成

图片.png
未生成表可执行如下 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');

查看生成单据的函数是否存在

图片.png
不存在对应函数,使用如下 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;

图片.png

出现如下情况
QQ图片20190521114034.png

使用如下方式创建

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 ;  

其它

经过如上几步,基本可以保证生成单据编号,如果经过以上步骤还不能生成单据编号,请在这里报告,我们会尽快修复,谢谢您的支持!