-1

年、月、日として表示するために、以前は問題なく動作するコードを以下に示しました。以下のコードは、いくつかの変換を行う日のみを表示するようにまとめたものです。コードでいくつかの小さな問題に直面しています。私の年は 365 ではなく 330 と表示されます。1 年を入力すると 365 と表示され、1 か月は 30 と表示されます。しかし、34 日であれば 34 と表示され、代わりに 60 日と表示されます。以下の私のコードでこのエラーが発生しました。これは、ssrs 2008 のレポート プロパティの私のコードです。

Public Function ILength(length  As Integer ) As String

           dim year As Integer=0
           dim month As Integer=0
           dim day  As Integer=0
           dim sum  as integer


if(length =0)
Return String.Empty
end if

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)
length =(year * 365)
year =cstr(length)

end if

if length>31 Andalso length<366  then

month=cstr (Math.Floor(length/30.4375))
length=(length  Mod 30.4375)
length=(month * 30)
month=cstr(length)

end if

if length<31 Then
day =cstr(length) 
end if

if length = 0 then
Return String.Empty
end if

sum= ((year)+(month)+(day))

return(sum)

End Function

ありがとう

4

2 に答える 2

0

あなたのロジックにはいくつかの問題があります。

  1. まず、何も文字列 (CStr) に変換するべきではありません。SSRS でこれを行う必要がある唯一の理由は、ツール ヒントまたはその他の文字列のみのフィールドを表示することです。とにかく期待どおりに機能しませんが、それらを合計する前にそれを行うべきではありません。
  2. 次に、関数が取るパラメーターは「長さ」であり、このコードは日数を想定しています。次に、日数を返します。この関数には、日の長さを年 (365.25) と月 (30) の設定値に分割し、再結合してこの標準化された年と月の長さを合計する以外の目的はないようです。閏年を大雑把に組み込んでいるように見えることを除いて。366日の長さが1年だと誰が言えますか? うるう年かもしれませんし、1年と1日かもしれません。
  3. 宣言した変数はすべて整数ですが、数学で浮動小数点数または小数を使用しています。
  4. 年と月の値を取得していますが、不要な手順で他の値で上書きしています。

これらすべてを実行する正当な理由があり (共有してください!)、次のような単純なものを使用できないと仮定します。=datediff(d,fields!FirstDate.Value,fields!SecondDate.value)

次に、この関数のどこが間違っているかを示します。

この部分では:

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)
length =(year * 365)
year =cstr(length)

入力値として 367 を使用します。2 行目で year=1 が得られます。3 行目で length=0 が得られます。はい、ゼロです。すべてを整数として宣言したため、整数は暗黙的に仮数 (小数点の後のビット) を切り捨てます。これらを浮動小数点またはそれ以上の正確な数値として宣言する必要があります。4 行目は、長さの値を Year(1) * 365 = 365 で上書きします。5 行目は、365 を文字列に変換して年に割り当てます。ただし、年は整数であるため、暗黙的に整数にキャストバックされます。変数が正しい型として宣言されていれば、必要なのはこれら 3 行だけですが、366 日ということは非常に農業的です。エッジケースの処理が不十分です。

if length >= 366 then
year=cstr(Math.Floor (length/ 365.25)) 
length =(length  Mod 365.25)

次の部分:

if length>31 Andalso length<366  then

これも不要です。コードの最初の部分で、長さが 365 未満であることを既に確認しています (変数が正しいデータ型である場合、長さは 365.25 未満になります)。

これで十分です:

if length>31 then

この次の部分でも同じことを行いました。データ型が固定されていると仮定すると、最初の 2 行で十分です。

month=cstr (Math.Floor(length/30.4375))
length=(length  Mod 30.4375)
length=(month * 30)
month=cstr(length)

この次の部分では、(Cstr を除いて) 動作しますが、不快です。長さ < 31 かどうかをテストする前に、長さ = 0 を確認する必要があります。

if length<31 Then
day =cstr(length) 
end if

if length = 0 then
Return String.Empty
end if

あなたはコメントで2つの矛盾する声明を述べました。最初に、年/月日などの入力があり、開始日と終了日のパラメーターがある秒があります。2 番目が true で、開始日と終了日がある場合は、このコードを破棄して datediff を使用してください。組み込み関数は、うるう年と実際の月の長さを既に考慮しているため、大まかな平均を使用する必要はありません。

存在しない問題に対する複雑な解決策であるカスタムコードを使用したようです。

于 2012-11-05T23:53:43.250 に答える
0
于 2012-11-05T23:30:34.190 に答える