Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jasper ireport中将空字段作为参数传递_Java_Sql_Sql Server_Jasper Reports - Fatal编程技术网

Java 在jasper ireport中将空字段作为参数传递

Java 在jasper ireport中将空字段作为参数传递,java,sql,sql-server,jasper-reports,Java,Sql,Sql Server,Jasper Reports,询问 select * from db_accessadmin.customerSummary where (accountNumber = $P{accountNo} or $P{accountNo}='') and (ppuserMobile = $P{mobileNo} or $P{mobileNo}='') and ( ppuserStaticID = $P{customerId} or $P{customerId} = '') and (cast(requestDate as da

询问

select * from db_accessadmin.customerSummary 
where 
(accountNumber = $P{accountNo} or $P{accountNo}='')
and (ppuserMobile = $P{mobileNo} or $P{mobileNo}='')
and ( ppuserStaticID = $P{customerId} or $P{customerId} = '')
and (cast(requestDate as date) between (cast($P{fromDate} as date)) and (cast($P{toDate} as date)))
其目的是根据参数值以jasper格式生成报告。当参数'fromDate'和'toDate'为空时,查询应拉出数据库中的整行。 如何修改查询,使其接受“fromDate”和“toDate”的空值

XML文件

<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="customerSummary2" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="d23efc9c-641e-4e8a-bb9e-25673ee5c713">
<property name="ireport.zoom" value="1.610510000000001"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<parameter name="accountNo" class="java.lang.String"/>
<parameter name="mobileNo" class="java.lang.String"/>
<parameter name="customerId" class="java.lang.String"/>
<parameter name="fromDate" class="java.util.Date">
    <defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
</parameter>
<parameter name="toDate" class="java.util.Date">
    <defaultValueExpression><![CDATA[$P{fromDate}+7]]></defaultValueExpression>
</parameter>
<queryString>
    <![CDATA[select * from db_accessadmin.customerSummary where (accountNumber =         $P{accountNo} or $P{accountNo}='')
 and (ppuserMobile = $P{mobileNo} or $P{mobileNo}='')
 and ( ppuserStaticID = $P{customerId} or $P{customerId} = '')
 and (cast(requestDate as date) between (cast($P{fromDate} as date)) and (cast($P{toDate} as date)))]]>
</queryString>

将查询更改为:

 select * from db_accessadmin.customerSummary 
 where 
 (accountNumber = $P{accountNo} or $P{accountNo}='')
 and (ppuserMobile = $P{mobileNo} or $P{mobileNo}='')
 and ( ppuserStaticID = $P{customerId} or $P{customerId} = '')
 $P!{date_sql}
下面是我将如何在iReport中使用Groovy实现它,因此您必须为Java修改它。创建另一个名为date_sql的参数,类型为text,使用默认值表达式:

 ($P{fromDate}.isEmpty() || $P{fromDate} == null) 
 && ($P{toDate}.isEmpty() || $P{toDate} == null) 
 ? "and 1=1" : "and (cast(requestDate as date) between (cast("+$P{fromDate}+" as date)) and (cast("+$P{toDate}+" as date)))"
这是未经测试的,因此您可能需要使用默认值表达式的第一部分。但本质上,当参数为空或null时,返回1=1(因此,不要按日期约束),但如果参数有值,则使用这些值。如果您的用户输入一个日期,而不是另一个日期,该怎么办?在这种情况下,可以将&&/AND更改为| |/OR并返回1=1。

将查询更改为:

 select * from db_accessadmin.customerSummary 
 where 
 (accountNumber = $P{accountNo} or $P{accountNo}='')
 and (ppuserMobile = $P{mobileNo} or $P{mobileNo}='')
 and ( ppuserStaticID = $P{customerId} or $P{customerId} = '')
 $P!{date_sql}
下面是我将如何在iReport中使用Groovy实现它,因此您必须为Java修改它。创建另一个名为date_sql的参数,类型为text,使用默认值表达式:

 ($P{fromDate}.isEmpty() || $P{fromDate} == null) 
 && ($P{toDate}.isEmpty() || $P{toDate} == null) 
 ? "and 1=1" : "and (cast(requestDate as date) between (cast("+$P{fromDate}+" as date)) and (cast("+$P{toDate}+" as date)))"


这是未经测试的,因此您可能需要使用默认值表达式的第一部分。但本质上,当参数为空或null时,返回1=1(因此,不要按日期约束),但如果参数有值,则使用这些值。如果您的用户输入一个日期,而不是另一个日期,该怎么办?在这种情况下,可能会将&&/AND更改为| |/OR并返回1=1。

只有在jasper iReport中设计报表时才会出现此问题。但一旦我将其部署到服务器中,问题就解决了。服务器接受空值。

此问题仅在我使用jasper iReport设计报表时发生。但一旦我将其部署到服务器中,问题就解决了。服务器接受空值。

如果这是一个存储过程,您可以为它们提供默认值。事实上,您的查询很弱,因为您接受字符串作为日期参数并将其转换为日期。这不仅会降低生产速度,而且如果提交了不代表有效日期的字符串,可能会导致错误。我已将日期保存为数据库中的字符串,以便以特殊格式显示日期和时间。此代码用于测试目的。我想知道应该如何修改代码,以便传递空数据。如果为空,则不应使用日期进行搜索。如果这是一个存储过程,则可以为其提供默认值。事实上,您的查询很弱,因为您接受字符串作为日期参数并将其转换为日期。这不仅会降低生产速度,而且如果提交了不代表有效日期的字符串,可能会导致错误。我已将日期保存为数据库中的字符串,以便以特殊格式显示日期和时间。此代码用于测试目的。我想知道应该如何修改代码,以便传递空数据。如果为空,则不应使用日期进行搜索。只要我将日期字段保持为空,代码就可以正常工作。但在给出任何日期后,它会获取整个数据库。如果我禁用提示“date_sql”,它会显示一个错误。我修改了上面的代码,将$P{fromDate}和$P{toDate}放在引号之外。看看这是否有帮助。我试过了,但还是得到了同样的结果。尝试不同的迭代。无论我给出什么日期范围,它都会获取整个数据库。谢谢。请确保在$P{fromDate}和$P{toDate}之后声明$P{date\u sql}。只有在jasper iReport中设计报表时才会出现此问题。但一旦我将其部署到服务器中,问题就解决了。第三个参数date_sql则不是必需的。谢谢。只要我保持日期字段为空,代码就可以正常工作。但在给出任何日期后,它会获取整个数据库。如果我禁用提示“date_sql”,它会显示一个错误。我修改了上面的代码,将$P{fromDate}和$P{toDate}放在引号之外。看看这是否有帮助。我试过了,但还是得到了同样的结果。尝试不同的迭代。无论我给出什么日期范围,它都会获取整个数据库。谢谢。请确保在$P{fromDate}和$P{toDate}之后声明$P{date\u sql}。只有在jasper iReport中设计报表时才会出现此问题。但一旦我将其部署到服务器中,问题就解决了。第三个参数date_sql则不是必需的。谢谢。这是个好消息。我不知道为什么它在iReport中不起作用。我想知道这是否与将这些字符串重新命名为日期有关?我想这是同样的原因。我必须铸造和重铸日期,以便我能以适当的格式显示它。这是个好消息。我不知道为什么它在iReport中不起作用。我想知道这是否与将这些字符串重新命名为日期有关?我想这是同样的原因。必须铸造和重铸的日期,以便我可以显示在一个适当的格式。