我们有BIRT 4.4.0报告,其中包含十进制数据类型的报告参数。 报表参数在数据集预览结果中向上/向下舍入到最接近的10(当报表运行时,我们已将问题缩小到数据集)。 例如。如果参数是 0-4,向下舍入为0 5-9,最多10个 10-14轮到10轮 15-20轮到20 : : 90-94轮到90 95-100轮到100
数据库是SQLServer 2012.该问题尚未针对其他数据库进行测试。
.rptdesign未包含在内,因为下面的各种测试会更改它,您可以使用空白报告。 问题出在DataSet中,您不需要运行报表,而是预览DataSet中的结果。
重现的步骤 1)使用BIRT 4.4.0设计器,Java 1.7 u25(jdk-7u25-windows-i586.exe),SQLServer 2012
2)
Create a database (AlbumsDB) with a table (Albums) with the following columns
Title varchar(50) not null
Cost decimal(18,0) not null
Type char(10) not null
3)
Populate with the following 3 rows
Title Cost Type
APPLE 0 D
ABBEY ROAD 1 D
BEATLES 2 D
4)创建一个空白报告 5)为SQLServer创建数据源 6)创建数据集
BIRT中的数据集查询是使用表中的列选择(而不是键入)创建的。 请保持格式如图所示,仅使用光标定位并双击列/表名称进行选择。
select dbo.Albums.Title,
dbo.Albums.Cost,
dbo.Albums.type
from dbo.Albums
where dbo.Albums.Cost = ?
查询参数:
Name: param_1
Native Name: greyed out and not enterable
Data Type: Decimal
Direction: Input
Default Value: 2
Linked to Report Parameter: None
默认参数设置为2,因此测试将生成正确的Cost = 2行,或者向下舍入并生成不正确的Cost = 0行。
1)当以这种格式设置SQL语句时, - "预览结果'在数据集中产生了错误的结果(向下舍入的Cost = 0行) - .rptdesign文件没有nativeDataType属性
2)编辑sql并将表名提升到与选择的最后一列相同的行时:
select dbo.Albums.Title,
dbo.Albums.Cost,
dbo.Albums.type from dbo.Albums
where dbo.Albums.Cost = ?
3)当sql的格式为
时select dbo.Albums.Title, dbo.Albums.Cost,
dbo.Albums.type
from dbo.Albums
where dbo.Albums.Cost = ?
或
select dbo.Albums.Title,.Albums.Cost,.Albums.type
from dbo.Albums
where dbo.Albums.Cost = ?
也就是说,选中的部分或全部列与"选择",保持"来自"在另一条线上 - "预览结果'在数据集中产生了错误的结果(向下舍入的Cost = 0行) - .rptdesign文件没有nativeDataType属性
4)当整个SQL放在一行
时select dbo.Albums.Title,.Albums.Cost,.Albums.type from dbo.Albums where dbo.Albums.Cost = ?
- the "Peview Results " in the Data Set produced the correct result (the Cost=2 row)
- the .rptdesign file now had the correct nativeDataType attribute `<propert name="nativeDataType">3</property>`
5)在语句中引入任何空格(空格)时:
select dbo.Albums.Title,
dbo.Albums.Cost,
dbo.Albums.type
from dbo.Albums
where dbo.Albums.Cost = ?
- the "Preview Results' in the Data Set produced the wrong result (the rounded down Cost=0 row)
- the .rptdesign file had an incorrect nativeDataType attribute `<property name="nativeDataType">0</property>`
在上面的所有测试中,如果还原了SQL格式,则nativeDataType属性保留在.rptdesign文件中。 它改变了&#34; 0&#34;到&#34; 3&#34;当&#34;来自dbo.Albums&#34;被带到和#34;选择&#34;。
的同一行 6)将nativeDataType行添加到.rptdesign没有任何效果,直到步骤6d)
a)编辑了初始的.rptdesign(没有nativeDataType)和#1中创建的sql格式,并添加了<property name="nativeDataType">3</property>
- &#34;预览结果&#39;在数据集中产生了错误的结果(向下舍入的Cost = 0行)
b)然后添加<property name="nativeName"></property>
- &#34;预览结果&#39;在数据集中产生了错误的结果(向下舍入的Cost = 0行)
c)然后添加<property name="isOptional">false</property>
- &#34;预览结果&#39;在数据集中产生了错误的结果(向下舍入的Cost = 0行)
d)当对SQL语句的格式稍有改动时(从db.Albums&#34;到最后一列选定行),CDReport.rptdesign产生正确的结果
答案 0 :(得分:0)
如果结果取决于SQL语句的格式(尽管语句的语义相同,但结果不同),正如您在d)中提到的那样,这绝对是一个错误,无论是在BIRT 4.4.1还是在JDBC驱动程序(或在SQL Server中,但我不这么认为)。
要查看错误实际发生的位置,您应该
使用BIRT 4.2.1
在某些SQL-JDBC IDE中测试SQL语句(完全相同的语句,使用bind vars!)(对于Oracle,这将是SQL Developer,我不知道是否有类似的东西可用于MS SQL服务器)或缺少这样的IDE,在一个独立的Java程序中。
使用不同的JDBC驱动程序测试相同的报告