背景:合同表:Contract_Master 字段:LEGAL_CONT_NO --法务合同号(唯一性)
要求前台保存时法务合同号在后台自动生成
合同号结构:
公司代号+采购类型编码+日期+流水号(两位)
示例:XYZ-CL-200331-01
其中公司代号、采购类型编码在数据库中都能匹配到,直接拼接
日期:DateTime.Now.ToString("yyMMdd");
流水号:SELECT NVL(MAX(TO_NUMBER(SUBSTR(T.LEGAL_CONT_NO,-2,2))),0) NO FROM Contract_Master T WHERE T.LEGAL_CONT_NO LIKE 'XYZ-CL-200331-%';
此sql语句查询出的是满足 公司代号+采购类型编码+日期条件的流水号的最大值 ,只需在此值之上加1即可得到本次的流水号
最后在使用 NO.ToString("00");格式化为2位数 拼接起来就行了
所用知识点总结:
1.ToString();
2.oracle 函数 nvl()、to_number()、max()、substr()
nvl(a,b) : 若a=null返回b 若a!=null返回a
to_number() :可将varchar2或char类型的值转换为数值类型 注意:要转换的字符串类型也要符合数值类型的格式
max():求一列的最大值
substr():
格式1: substr(string string, int a, int b);
格式2:substr(string string, int a) ;
格式1:
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度
格式2:
1、string 需要截取的字符串
2、a 可以理解为从第a个字符开始截取后面所有的字符串。