1

次の関数は、「添え字は1から配列のサイズの間でなければなりません」を返します-CrystalReportsXIで実行するとエラーが発生します。なぜ、どのように修正するのか、何か考えはありますか?

Function (optional BooleanVar start := true)

DateVar Array reportdates := [
    cDate(2012, 10, 22),
    cDate(2012, 11, 15),
    cDate(2013, 01, 23),
    cDate(2013, 02, 20),
    // some more lines of dates...
    cDate(2014, 01, 02)
];

// Here is some code that sorts the array just to be sure.
// Removed from question

// Find index of last reportdate not later than today
NumberVar stopIndex;
for i := 1 to UBound(reportdates) do (
    if CurrentDate >= reportdates[i] then
        stopIndex := i
    );

DateTimeVar returnDateTime;
if start = true then (  // return start date
    NumberVar startIndex;
    if stopIndex = 1 then
        startIndex = 1
    else
        startIndex = stopIndex - 1;
//*** The error occurs here
    returnDateTime := cDateTime(reportdates[startIndex], cTime(0,0,0));
//*** The error occurs here
    )
else (  // return stop date
    DateVar stopDate = reportdates[stopIndex];
    returnDateTime := dateAdd("d", -1, cDateTime(reportdates[stopIndex], cTime(23,59,59)));
    );

returnDateTime;

注:上記の関数は、配列の2番目の日付より前に実行すると、開始日よりも早い停止日を返すことがわかりました。これに対抗するために関数を書き直したところ、問題のエラーが発生するような状況はありませんでしたが、この関数でエラーが発生した理由とその処理方法には関心があります。

4

1 に答える 1

2
NumberVar startIndex;
if stopIndex = 1 then
    startIndex = 1
else
    startIndex = stopIndex - 1;

もちろんする必要があります

NumberVar startIndex;
if stopIndex = 1 then
    startIndex := 1
else
    startIndex := stopIndex - 1;

そして今それは動作します...

NumberVar stopIndex;

また、に変更する必要があります

NumberVar stopIndex := 1;

レポートが最初のレポート日付より前に実行された場合のエラーを回避するため。

于 2013-01-25T08:45:44.503 に答える