我有一个Sybase SP,它以日期为唯一参数并返回有关订单的信息。我从CF页面上的JQuery日期选择器获取日期 - 格式化为yy-mm-dd。当没有输入时,SP默认为getDate()。当我在表格上输入日期时,一切正常。当我没有发送日期 - 日期字段留空时 - 我收到一个CF错误,告诉我该参数不是日期类型。我知道SP正在发送日期时间值,但我怎样才能让CF函数识别它?
在SP ......
declare @order_dt datetime
If @order_dt IS NULL
BEGIN
SELECT @order_dt = getDate()
END
在cfc ...
<cfargument name="order_dt" type="date" required="true" hint="order date to search for" >
和
<cfprocparam type="In" cfsqltype="CF_SQL_DATE" dbvarname="@order_dt" value="#order_dt#" null="No">
在.cfm页面上......
<!--JQuery datepicker -->
<script type="text/javascript">
$(function() {
$("#datepicker").datepicker({ dateFormat: "yy-mm-dd" }).val()
});
表格如下:
<form id="xxxxForm">
<label for="date1">Pick a Date... </label>
<br>
<p><input type="text" id="datepicker" value="" name="date1"></p>
Then choose 'Search'...<br>
<input type="submit" name="submit" value="Search">
<br>
<br>
</form>
如何让CF认识到这是一个很好的价值?如果我将@order_dt声明为日期,我或许在想?
答案 0 :(得分:2)
> <cfargument name="order_dt" type="date" required="true"
当您将日期字段留空时,提交的值为空字符串“”。空字符串不是有效的date
。这就是CF在你尝试调用函数时抱怨的原因。
如评论中所述,您可以使用required="false"
或default="#now()#"
。但是为了使它按预期工作,当日期留空时,你必须也省略参数。如果你向函数传递任何东西,即使是一个空字符串,default
也不会启动。但验证会。所以你仍然会得到同样的错误。
另一种选择是将参数类型更改为string
。然后验证函数内部。如果提供的值不是有效日期,请将其替换为now()
<cfargument name="order_dt" type="string" default="">
<!--- simplistic date validation for illustration --->
<cfif NOT isDate(arguments.order_dt)>
<cfset arguments.order_dt = now()>
</cfif>
或者只是将NULL
传递给存储过程
<cfargument name="order_dt" type="string" default="">
...
<cfprocparam type="In" value="#arguments.order_dt#"
null="#not isDate(arguments.order_dt)#" ....>
另一方面,dbvarname
暂时被弃用了。在最近的版本中它什么也没做。仅支持位置参数。