帆软自增ID使用

数据库自增长ID填报-http://help.finereport.com/doc-view-544.html

 

 

报表自己生成自增ID   方法   单元格设置公式:=ds1.select(#0),该公式的意义是取ds1数据源当中的所有行号,返回的结果为1,2,3……。 ps:数据源名称  有中文或 以数字开头,会导致公式失效

1. 描述

 

数据库自增长ID填报是指在FineReport模板中进行数据填报的时候,不需要设置ID数据列,在往数据库中插入数据的时候,数据库的主键ID会自动增长。

在填报中,数据批量处理时,使用流水号来作为自增长型主键进行数据更新,可是当用户同时进行并发填报,即多人同时对一张报表进行填报,一个用户填报提交后,另外一个用户没有与服务器进行同步,默认会出现一个流水号,与数据库中刚提交的内容冲突。下面我们以Sql Server数据库为例,讲述数据库自增长ID填报实现报表的自动编号功能。

2. Sql Server数据库

在Sql Server数据库中,提供了标识,可以通过设置标识、标识种子和标识增量来实现Sql Server主键的自增长。

2.1 自动编号设置

1)假设在SQL Server数据库中存在下面一张数据表,我们需要将其id列实现自增长,就可以在列属性中设置是标识,修改标识增量和标识种子,如下图:



2)也可以使用sql语句来创建,identity(1,1)指定id由1开始,每次增长1.

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>create table khk (
id int identity(<span style="color:teal">1</span>,<span style="color:teal">1</span>) primary key,
kh varchar(<span style="color:teal">20</span>)
)</code></span></span>

2.2 模板制作

1)新建数据连接

新建一个数据连接,连接至该数据库,新建数据连接的方法详细请参照数据连接

2)模板设置

新建一张模板,添加数据集SELECT * FROM dbo.[KHK]。

在模板设计主体页面第一行分别添加两个文本控件和一个插入行的按钮控件,并在第三行中将数据列拖曳至对应单元格中,如下图:

注:由于ID自增长不需要自己输入,因此只需要填报KH字段,B2单元格需要设置为纵向扩展,第二行的两个控件分别是,文本控件和按钮控件,按钮控件是插入行控件。

3)填报属性设置

点击模板>报表填报属性,增加一个内置SQL,如下图:

注:为数据表中的字段绑定报表单元格。

2.3 自增长ID使用

点击填报预览,在web端进行数据填报,如下图:

在KH标题下面的控件中插入2条数据,点击提交按钮,将数据提交入库,刷新页面,可以看到下面蓝色区域部分多了2条数据,即刚刚填报数据的数据,并且ID列也进行了自增长。

3. Oracle数据库

3.1 自增长的实现

在Oracle数据库中,提供了序列的功能,可以通过Oracle的序列及触发器,实现主键的自增长。

1)  创建序列

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>CREATE SEQUENCE seq_name -- 尽量使用统一前缀命名,方便管理    
     INCREMENT BY <span style="color:teal">1</span>   -- 自增步长 这里设置为<span style="color:teal">1</span>  
     START WITH <span style="color:teal">1</span>     -- 计数起点 这里设置为<span style="color:teal">1</span>  
     NOMAXVALUE       -- 不设置最大值 可选项 MAXVALUE|MINVALUE  
     NOCYCLE          -- 一直累加,不循环    
     CACHE <span style="color:teal">10</span>;   -- 如果追求效率 可设置缓存 如果在Oracle宕机或者断电等非正常中断服务的情况 可能会造成序列不连继续的情况出现,如果不使用缓存,则这里写NOCACHE </code></span></span>

2)创建触发器

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>CREATE OR REPLACE TRIGGER TRG_name  --触发器名称  
BEFORE INSERT ON <span style="color:#dd1144">"tbl_name"</span> -- 在向tbl_name表插入数据之前触发  
FOR EACH ROW-- 表示该触发器为一个行级触发器  
BEGIN -- 触发器开始 -- 以下代码表示触发器的行为  
  SELECT seq_name.nextval INTO :<span style="color:teal">new</span>.ID FROM dual ; -- seq_name.nextval返回的是序列的下一个值, 将该值设为新值插入到tbl_name表中的主键列tbl_id中去.  
END ; -- 触发器结束 </code></span></span>

 

 

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>CREATE SEQUENCE seq_name -- 尽量使用统一前缀命名,方便管理    
     INCREMENT BY <span style="color:teal">1</span>   -- 自增步长 这里设置为<span style="color:teal">1</span>  
     START WITH <span style="color:teal">1</span>     -- 计数起点 这里设置为<span style="color:teal">1</span>  
     NOMAXVALUE       -- 不设置最大值 可选项 MAXVALUE|MINVALUE  
     NOCYCLE          -- 一直累加,不循环    
     CACHE <span style="color:teal">10</span>;   -- 如果追求效率 可设置缓存 如果在Oracle宕机或者断电等非正常中断服务的情况 可能会造成序列不连继续的情况出现,如果不使用缓存,则这里写NOCACHE  </code></span></span>

* ORACLE 12C 引进了Identity Columns新特性,从而实现了列自增长功能。

举例如下所示: 

CREATETABLE"CHF"."T_XIFENFEI"

   (    "ID" NUMBER GENERATED ALWAYS ASIDENTITY MINVALUE 1 MAXVALUE

   9999999999999999999999999999 INCREMENT BY1 START WITH1

   CACHE 20 NOORDER  NOCYCLE  NOTNULLENABLE,

        "NAME"VARCHAR2(100)

   ) SEGMENT CREATION DEFERRED

  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255

 NOCOMPRESS LOGGING

  TABLESPACE "INMEMORY"

3.2 模板实现

其模板实现与SQL Server数据库一致,这里不再赘述。

4. 常见问题

4.1 报错信息

在7.0.4版本及之后的版本,使用数据库自增长ID进行数据填报时,可能会发生下图所示报错:

当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'KHK' 中的标识列插入显式值。

4.2 报错原因

出现该报错原因是因为在7.0.4及之后版本中,FineReport数据填报自增长ID的时候,主键不能插入空数据,即报表填报属性处绑定的自增长ID字段所对应的单元格在进行填报时,不能为空,但是自增长ID本意就是不需要输入ID,所以导致报错。

4.3 解决方案

将以下的内容放入记事本中,并将文件另存为insertIgnoreColumn.properties,放入%FR_HOME%\WEB-INF\resources文件夹下面即可,文件内容为:

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code>KHK.ignoreColumns=id</code></span></span>

 

注:其中KHK是填报数据的数据表名称,需要对应修改,如果有多个数据表需要使用自增长ID,那么直接换行再加入这句话内容即可。

新增insertIgnoreColumn.properties文件或者修改insertIgnoreColumn.properties文件里的内容后,需重启web服务才生效。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值