Crystal Reports 13 Стандартное отклонение с полями формул

Я работал над отчетом, сделанным кем-то другим, который использует функцию StDev. Я думал, что это будет достаточно просто, но данные могут содержать несколько значений для каждой записи, поэтому есть операторы if, используемые для определения того, какое значение брать из каждой записи. Я экспортировал таблицу в Excel, содержащую одно значение для каждой записи (то самое, которое должно использоваться в StDev), а затем вычислил там SD, чтобы обеспечить проверку.

Отчет и Excel дают мне очень разные значения :(

Итак, я возвращаюсь к отчету и использую некоторые дополнительные поля формулы для расчета SD от руки, чтобы действовать как своего рода решающий голос (скрестив пальцы, это не дает третьего набора значений...).

Я исправил синтаксические ошибки, но все еще получаю ошибку времени выполнения - «Деление на ноль», которая затем выделяет раздел кода, указанный ниже...

Мои поля формулы:

{@StDevArrayPopulate} — в разделе сведений

NumberVar Array varStDevArray;
NumberVar varStDevArrayCount;

varStDevArray [varStDevArrayCount] := {ValueToSummarise};

varStDevArrayCount := varStDevArrayCount + 1;

{@StDevArrayCalculate} — в футере группы

NumberVar Array varStDevArray;
NumberVar varCounter :=1;
NumberVar varMean := 0;
NumberVar varStDev := 0;
NumberVar varStDevArrayCount;

// START OF MEAN

// Sum of all of the values in the array

for varCounter:= 1 to varStDevArrayCount step 1 do
(
    varMean := varMean + varStDevArray [varStDevArrayCount];
);

// Divide by the total number of values in the array

varMean := varMean / varStDevArrayCount;  // !! This is the line that highlights after the error message !!

// END OF MEAN

// START OF STANDARD DEVIATION

// Subtract the mean from each value in the array and square the result

for varCounter := 1 to varStDevArrayCount step 1 do
(
    varStDevArray[varStDevArrayCount] := (varStDevArray [varStDevArrayCount] - varMean) * (varStDevArray [varStDevArrayCount] - varMean);
);

// Sum of all of the values in the array

for varCounter:= 1 to varStDevArrayCount step 1 do
(
    varStDev := varStDev + varStDevArray [varStDevArrayCount];
);

// Divide by the total number of values in the array

varStDev := varStDev / varStDevArrayCount;

// Square root of mean of differences

varStDev := Sqr(varStDev)

// END OF STANDARD DEVIATION

{@StDevArrayCalculate} — в футере группы

NumberVar varMean;
NumberVar varStDev;

"The mean is " & varMean & ", and the standard deviation is " & varStDev & "."

Я пытался использовать поле Текущая сумма, но это давало ошибки, так как нужно было подсчитать первую запись до запуска поля формулы Заполнить. Я также попытался добавить в заголовок четвертое поле, которое инициализирует varStDevArrayCount как 1.

У кого-нибудь есть предложения?


person recordmgmtnoob    schedule 30.06.2016    source источник


Ответы (1)


Похоже, что нет подробных записей, поэтому вы получаете ноль в массиве... Я не думаю, что инициализация с помощью 1 будет иметь какое-либо значение, вместо этого внесите небольшое изменение, как показано ниже, и проверьте.

if varStDevArrayCount=0
then
varMean :=varMean 
else
varMean := varMean / varStDevArrayCount;

Я бы посоветовал вам просто подробно проверить записи, а затем отладить

person Siva    schedule 01.07.2016