2012-08-17 41 views
3

我正在從事稅務項目。稅收分解爲四個季度。稅收運行的月份是三月,六月,九月和十二月。一旦運行我的網站顯示何時稅款將再次運行。我的問題是,在我的結果頁面中,當下一個運行日期是12月而不是顯示12-2012時,我會看到類似0-2012的東西。使用cfswitch cfcase每3個月顯示

這裏是我的代碼:

<td style="white-space: nowrap;">&nbsp;#stec_mysql_search_results.cover_date#&nbsp;</td> 
<td style="white-space: nowrap;">&nbsp;<cfif "" neq stec_mysql_search_results.next_run>0<cfset temp_next_run = stec_mysql_search_results.next_run MOD 4><cfswitch expression="#temp_next_run#"> 
<cfcase value="1">3</cfcase> 
<cfcase value="2">6</cfcase> 
<cfcase value="3">9</cfcase> 
<cfcase value="4">12</cfcase> 
</cfswitch>-<cfif 4 lt stec_mysql_search_results.next_run>#year(now())+1#<cfelse>#year(now())#</cfif></cfif>&nbsp;</td> 

下面是輸出當您查看源:

<td style="white-space: nowrap;">&nbsp;07-16-2012&nbsp;</td> 
<td style="white-space: nowrap;">&nbsp;0-2012&nbsp;</td> 

回答

2

cfcase將接受一個列表,也許你是在複雜,爲什麼不這樣做:

<cfswitch expression="#stec_mysql_search_results.next_run#"> 
     <cfcase value="1,2,3">3</cfcase> 
     <cfcase value="4,5,6">6</cfcase> 
     <cfcase value="7,8,9">9</cfcase> 
     <cfcase value="10,11,12">12</cfcase> 
    </cfswitch> 
+0

謝謝。我這樣做,它的工作。 – 2012-08-21 13:33:05

3

到問題的關鍵是你的代碼期待12模4給出4,當它給出了0.

你提供的代碼已經被格式化了,幾乎沒有任何換行符,這是編寫代碼的一種愚蠢的方式,因爲它使得它很難維護(在可讀性方面,莫迪甚至簡單的修改比較),特別是當後來的開發人員必須前來了解正在發生的事情時。

請確保您使用換行符 - 特別是如果這意味着要修復其他人編寫的代碼。如果輸出空白是一個問題,那麼理想的解決方案通常是將邏輯放在一個函數中(並使用output=false),儘管您也可以使用<cfsilent>..</cfsilent>塊,適當放置註釋<!--- --->和其他方法。

這裏是你的代碼轉換爲實際的東西可讀的相關部分:

<cfif "" neq stec_mysql_search_results.next_run> 
    0 
    <cfset temp_next_run = stec_mysql_search_results.next_run MOD 4> 
     <cfswitch expression="#temp_next_run#"> 
      <cfcase value="1">3</cfcase> 
      <cfcase value="2">6</cfcase> 
      <cfcase value="3">9</cfcase> 
      <cfcase value="4">12</cfcase> 
     </cfswitch> 
    - 
    <cfif 4 lt stec_mysql_search_results.next_run> 
     #year(now())+1# 
    <cfelse> 
     #year(now())# 
    </cfif> 
</cfif> 

0你看到你的結果是硬編碼一個剛剛CFIF內。

由於交換機沒有0的情況下,它不輸出任何內容。

爲了使現有代碼的工作,只是改變了4 cfcase 0


然而,因爲這是處理宿舍,我不認爲你計算你的意思是什麼是。

以下是簡單地改變從4比0的cfcase會導致...

January = January 
February = February 
March  = March 
April  = December 
May  = January 
June  = February 
July  = March 
August = December 
September = January 
October = February 
November = March 
December = December 


當你可能想要的東西是這樣的:

January = March 
February = March 
March  = March 
April  = June 
May  = June 
June  = June 
July  = September 
August = September 
September = September 
October = December 
November = December 
December = December 


哪可以用3*ceiling(next_run/3)簡單地完成。

如果這個假設是正確的,有一個顯著更好的方式來編寫代碼:

<td>#calculateNextRunQuarter(stec_mysql_search_results.next_run)#</td> 


<cffunction name="calculateNextRunQuarter()" returntype="String" output=false> 
    <cfargument name="NextRunMonth" type="Numeric" required /> 

    <cfset var Quarter = 3*ceiling(Arguments.NextRunMonth/3) /> 
    <cfset var TheYear = Year(Now()) /> 

    <cfif Arguments.NextRunMonth GTE 4 > 
     <cfset TheYear = TheYear + 1 /> 
    </cfif> 

    <cfreturn Right('0'&Quarter,2) & '-' & TheYear /> 
</cffunction> 

而且因爲邏輯是所有輸出函數內部=假沒有雜散空白和代碼仍然是完美的可讀

+3

調用OP笨:(還有什麼你可能想沒有顯示任何代碼,聽起來應該是這樣。 – Busches 2012-08-17 18:20:21

+0

@彼得謝謝。不是愚蠢的評論,我沒有寫代碼,代碼很長,但這是我認爲給我帶來麻煩的領域。 – 2012-08-17 18:23:35

+0

Busches,重新閱讀,你會看到我說*代碼*是愚蠢的,而不是OP! _(此外,該行僅僅是重新排列我的措辭而留下的一個流浪現象 - 現在已刪除)_ – 2012-08-17 19:06:43