3

私は税のプロジェクトに取り組んでいます。税金は四分の一に分割されます。税が実行される月は、3 月、6 月、9 月、および 12 月です。一度私のウェブサイトを実行すると、税金が再び実行される時期が表示されます。私の問題は、次回の実行日が 12-2012 ではなく 12 月の場合、結果ページに 0-2012 のようなものが表示されることです。

これが私のコードです:

<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>
4

2 に答える 2

3

問題の鍵は、あなたのコードが 12 mod 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 に変更するだけです。


しかし、これは四分の一を扱っているので、あなたが何を意味するかを計算しているとは思いません。

単純に cfcase を 4 から 0 に変更すると、次のようになります...

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>

そして、ロジックはすべて output=false の関数内にあるため、迷子の空白はなく、コードは完全に読み取り可能です

于 2012-08-17T17:52:50.143 に答える
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>
于 2012-08-17T19:50:54.537 に答える