www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

落到实处数据库表中的流水号【www.2527.com】,中

2019-09-22 16:22 来源:未知

1.在数据库中拼接好流水号,再次来到给bm

达成的流水号样式(字符 日期 流水号)如下

思路:

<bm:operation name="execute">  <bm:parameters>    <bm:parameter name="p_num" dataType="java.lang.String" input="false" output="true" outputPath="/parameter/@p_num"/>   </bm:parameters>   <bm:update-sql><![CDATA[       begin         d_con_contract_sequence_pck.d_con_contract_back(p_num => ${@p_num});       end;   ]]></bm:update-sql>
</bm:operation>

www.2527.com 1

 通过贰个水流号表,记录当前最大的流水号,以便下一次取用。每一回取号时,将流水号表更新成大的。

2.screen文件中接收重返值

流水号.png

论及的表:

<a:link id="d_con_contract_getNum" model="test.D_project.d_con_find_v_query" modelaction="execute"/>

 function add_info() {                new Aurora.Window({                    id: 'd_con_contract_add_screen',                    url: $('d_con_contract_add').getUrl()   '?p_num='   getNum(),                    title: '创建合同',                    width: 900,                    height: 550                }).on('beforeclose', query_d_con_find_v_result_ds);            }              function getNum() {     var num='';     Aurora.request({     url: $('d_con_contract_getNum').getUrl(),                    sync: true,                    success: function {                        num = res.result.p_num;                    }                });     return num;  }

诚如自个儿在写小demo的时候,都以选择的纯数字自增(1,2,3……)这种。相比来讲,流水号形式的看起来更专门的学业,并且能够从流水号中询问多少的增短时间及各样,当然,是还是不是看着更有逼格。

   流水号表hp_no:  

3.将流水号通过U瑞鹰L传递给要出示页面

现阶段作者动用的方法是,利用存储进度来促成(或然还应该有许多办法),因为这种一般是在插入数据的时候使用,所以把插入数据的操作也位于了积存进程。若是近些日子不精晓存款和储蓄过程这么些定义的小白,能够看本人那篇的牵线第一回接触存款和储蓄进度

字段 类型
TYPE_NAME VARCHAR2(100)
START_NO VARCHAR2(100)
CURRENT_NO VARCHAR2(100)
<a:field name="contract_id" defaultValue="${/parameter/@p_num}" readOnly="true"/>

<h3>分析</h3>
该字段由三部分组成:QQ字符 201706(年月,即近来天期) 0001(流水号,自动拉长)

 代码:

www.2527.com 2www.2527.com 3www.2527.com 4

  1. QQ字符不用管
  2. 201706,当然是先拿走到系统当下的年月,然后得到相应的6位数值
  3. 流水号,为了有限支持主键不重复,同有的时候常候内,那部分流水号应该是例外的,所以流水号从 0000~9999 ,即同一段时间最多会有一万个分裂的流水号。(最近不思考9999加1之后的状态)

1)通过函数得到最大值。 有八个参数,

<h3>实现</h3>
先是建设构造一个test表,方便讲授

  第贰个参数是项目,便于获得分歧的流水号。

create table test(
     pk_id varchar(12) not null,
     name varchar(10) null
)

  第1个参数是前缀,用于在流水号后面放置特别的字符。

贯彻201706的前一步(得到近年来的时间)

  第三个参数是变化的水流号长度。

CONVERT(varchar(8), GETDATE(), 112)  --获取对应格式(20170601)的当前系统时间

 

实现201706,同不经常间把收获的值赋值给一个变量(为了代码看起来清晰)

www.2527.com 5www.2527.com 6代码

declare @dateStr varchar(6)  --定义变量
----使用substring()方法截取前6位,同时赋值变量
select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6)) 

CREATE OR REPLACE FUNCTION Hp_Test_GetNo(
   P_TYPE_NAME   IN   VARCHAR2 DEFAULT '',  --类型 参数1
   P_START_NO    IN   VARCHAR2,  --前缀 参数2
   P_LENGTH      IN   NUMBE揽胜    --获得流水号长度 参数3
)
   RETU牧马人N VARCHATiggo2      --再次来到类型
IS
   V_RESULT       VARCHAR2 (100) := '';   --结果   变量1
   V_CURRENT_NO   VARCHAR2 (100) := '';  --当前值  变量2
   V_NUM          NUMBER         := 0;  --补值    变量3
   V_START_NO   VARCHAR2(100);    --前缀    变量4
   V_ROWID        VARCHA帕杰罗2 (100);    --要更新行的RowID  变量4
BEGIN
   V_START_NO :=P_START_NO;  --参数值赋给变量

落到实处0001的前一步(这里借使表中一度存在一条数据,那么它的4位流水号应该是0000,完整代码部分中会思索第一条数据的标题。获得近期生产的4位流水号,新的流水号是在此基础上得到)

   SELECT COUNT (*)
     INTO V_NUM
     FROM HP_NO
    WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO;    --获得类型与前缀一样值的数目,首要用来推断是还是不是发生过流水号

----拿到上一个最近生成的pk_id
select top 1 pk_id from table test order by pk_id desc 

--剖断是或不是有资料 未有则发出初叶值插入库中
   IF V_NUM = 0  --未有记录过时
   THEN
      V_CURRENT_NO := LPAD ('1', P_LENGTH, '0');  --得到P_length长的0001流水号
      V_RESULT := V_CURRENT_NO;  --将前缀与流水号相连起来

实现0001,那只是开端

      INSERT INTO HP_NO(TYPE_NAME, START_NO, CURRENT_NO)
           VALUES (P_TYPE_NAME, P_START_NO, V_CURRENT_NO);  --将新的最大值记录下来
   ELSE  
      SELECT ROWID, CURRENT_NO   1
      INTO V_ROWID, V_CURRENT_NO
        FROM HP_NO
       WHERE TYPE_NAME = P_TYPE_NAME AND START_NO = P_START_NO; --获得最大值加1

declare @maxNo varchar(4)  ----定义变量
----把上诉得到的最近生产的pk_id,通过substring()方法截取最后的4位流水号,然后对其加1
select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4) 1);

      V_CURRENT_NO := LPAD (V_CURRENT_NO, P_LENGTH, '0');     
      
      
      UPDATE HP_NO
         SET CURRENT_NO = V_CURRENT_NO
       WHERE ROWID = V_ROWID;    --更新最大值
   END IF;  

尽管如此新生成了二个流水号,可是无法直接行使,因为假设@maxNo的值不是4位数,那么就可以振撼pk_id的队形,所以要求张开决断

   IF V_START_NO IS NULL OR V_START_NO='' THEN
      V_RESULT := V_CURRENT_NO;
   ELSE
      V_RESULT :=V_START_NO || V_CURRENT_NO;
   END IF;
   
   RETURN V_RESULT;
END;

if (@maxNo < 10) begin
    set @maxNo = '000'   @maxNo; --如果是1位数的话,需要在前面加3个0,补够4位
end 
else if (@maxNo < 100) begin
    set @maxNo = '00'   @maxNo; --如果是2位数的话,需要在前面加2个0,补够4位
end
else if (@maxNo < 1000) begin
    set @maxNo = '0'   @maxNo; --如果是3位数的话,需要在前面加1个0,补够4位
end

动用存款和储蓄进程调用函数的点子:

时至前日,分割的顺序部分都完毕了。为了便于插入操作,把全体值结合起来,用八个新的变量来囤积

www.2527.com 7www.2527.com 8代码

declare @result nvarchar(12)--共计12位,前两位为QQ,中间6位是年月,最后4位是流水号
----把之前得到的@dateStr和maxNo加上,QQ字符直接加上即可
select @result=(Select 'QQ'   @dateStr   @maxNo);

--调用function存款和储蓄进程
CREATE OR REPLACE PROCEDURE Hp_Pro_GetTestNo
(
      v_FirstLetter in varchar2,
      v_Result out  varchar2
)
   IS
      v_FirstValue varchar2(30);
      v_SystDate varchar2(30);
BEGIN
     select to_char(sysdate,'yyyymm') into v_SystDate from dual;
     v_FirstValue:=(v_FirstLetter || v_SystDate);
     v_Result:=hp_test_getno('HpTest' ,v_FirstValue,4);
END;

终极,把须要插入表中的多寡作为参数字传送递到存款和储蓄进程中,在存款和储蓄进程中实行插入操作

结果:

@name -- 需要插入test表中的值
insert into test(pk_id,name) values(@result,@name)

   调用存款和储蓄进度Hp_Pro_GetTestNo('hp',4);

那正是总体的进度,在施行插入数据的操作时,把除了pk_id之外的字段当做参数字传送入到存款和储蓄进度中,在积攒进度中试行insert操作就能够

  结果为:hp2010020001

总体的仓库储存进程代码如下

 

USE [Test] ----Test是test表所在的数据库名
GO
/****** Object:  StoredProcedure [dbo].[AddData]    Script Date: 06/01/2017 18:51:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[AddData]  
    @name varchar(10)  ----参数,用于接收传入的name值
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    declare @dateStr varchar(6),  ----定义变量,用于存储6位数的时间
    @maxNo varchar(4), ----定义变量,用于存储4位流水号
    @result varchar(12) -----定义变量,用于存储新生成的pk_id

    ----获取到系统当前时间,并截取符合条件的6位,同时赋值给@dateStr
    select @dateStr = (select SUBSTRING((Select CONVERT(varchar(8), GETDATE(), 112)),1,6))

    ----先判断是否第一次向test表中插入数据(即当前表中是否存在数据)
    if exists (select * from test) begin
        ----获取数据表中最近产生的一个pk_id,并截取最后4位流水号,对4位流水号进行加1,最后赋值给@maxNo
        select @maxNo=(Select SUBSTRING( (select top 1 pk_id from test order by pk_id desc),9,4) 1);

        ----对上诉的@maxNo做判断,确保流水号一定是4位,不够的在前面补0
        if (@maxNo < 10) begin
            set @maxNo = '000'   @maxNo; --如果是1位数的话,需要在前面加3个0,补够4位
        end 
        else if (@maxNo < 100) begin
            set @maxNo = '00'   @maxNo; --如果是2位数的话,需要在前面加2个0,补够4位
        end
        else if (@maxNo < 1000) begin
            set @maxNo = '0'   @maxNo; --如果是3位数的话,需要在前面加1个0,补够4位
        end

        ----将上诉结果合成一个新的pk_id
        select @result=(Select 'QQ'   @dateStr   @maxNo)
    end 
    else
       ----如实当前插入的数据时第一条数据,那么直接把4位流水号设为0000
       select @result = 'QQ'   @dateStr   '0000'

    ----将数据插入到test表中
    insert into test(pk_id,name) values(@result,@name);
END

别的思虑

一、新增加时毫无出示流水号,如获得得到一而再流水号

 方法:

  选用流水号子表,此表用于保存未有用过的流水号。当客户取号时,首要推荐判定子表是或不是包涵流水号,当临时,抽取三个,并删除此个(防止别其他顾客取用);不然调用主表获得新流水号。

当插入战败则将近年来流水号保存到流水号子表中,供后一次取用。

当删除时,将近些日子流水号保存到流水号子表中,供下一次取用。

二、增加产量时须出示流水号,如获得获得延续流水号

方法:

  选取流水号子表,此表用于保存没有用过的流水号。当顾客取号时,首推决断子表是还是不是富含流水号,当临时,取出一个,并删除此个(防止别其他客商取用);不然调用 主表获得新流水号。

当顾客不保留或插队失利则将眼下流水号保存到流水号子表中,供下一次取用。

当删除时,将近期流水号保存到流水号子表中,供 下一次取用。

 

别的考虑的代码笔者未有写,有意思味的相爱的人能够友善写。

 

 

 

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于www.2527.com,转载请注明出处:落到实处数据库表中的流水号【www.2527.com】,中