0

我有一个 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 声明为只是一个日期?

4

1 回答 1

2
> <cfargument name="order_dt" type="date" required="true" 

当您将日期字段留空时,提交的值为空字符串“”。空字符串不是有效的date。这就是为什么当您尝试调用该函数时 CF 会抱怨的原因。

如评论中所述,您可以使用required="false"or 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不久前被弃用了。在最近的版本中,它什么也不做。仅支持位置参数。

于 2012-09-12T19:17:57.590 回答