Неправильно считается Sum

отредактировано 03:59 Раздел: FastReport 4.0
FR 4.12.6. Есть бэнд Footer, в котором считаются итоги по DetailData:
[SUM(<dsetRequest."PRICE_RESULT">,DetailData1)]
Но сумма почему-то в нем всегда целая и меньше реальной суммы на некоторое значение. Этот же код в подвале группы работает корректно.
Вычислить правильную сумму помогает вот такая конструкция:
[SUM(<dsetRequest."PRICE_RESULT"> + 0,DetailData1)]
В чем может быть дело и как обойтись без +0?

Комментарии

  • HunterNSHunterNS Таганрог
    отредактировано 03:59
    Может у вас датасет содержит NULL-значения и поэтому не может их суммировать. Попробуйте в запросе менять NULL на 0.
  • отредактировано 03:59
    HunterNS написал: »
    Может у вас датасет содержит NULL-значения и поэтому не может их суммировать. Попробуйте в запросе менять NULL на 0.
    Нет, Null-ов нет. Тот же самый код, только в GroupFooter, работает корректно. Причем это работает как-то выборочно - тут нормально, тут исключение.

    Выяснил корень проблемы - такое случается, если поле имеет тип NUMERIC(18,2) и хранится как BCD. Сделал в запросе CAST поля к NUMERIC(9,2) и проблема исчезла.
  • отредактировано 03:59
    Нашел причину. Это баг в FIB+. Потому что на версии 7.2 ошибок нет, на версии 7.3 - есть.
  • отредактировано 03:59
    CyberMax написал: »
    Нет, Null-ов нет. Тот же самый код, только в GroupFooter, работает корректно. Причем это работает как-то выборочно - тут нормально, тут исключение.
    CyberMax написал: »
    Нашел причину. Это баг в FIB+. Потому что на версии 7.2 ошибок нет, на версии 7.3 - есть.

    Тогда почему в GroupFooter работает корректно?
  • отредактировано 03:59
    написал: »
    Тогда почему в GroupFooter работает корректно?
    Мне тоже непонятно. Cитуация вообще парадоксальная. Например, вот это дает исключение о преобразовании Null в Double в ReportSummary1OnBeforePrint:
      if (SUM(<dsetReport."ADVANCE_PAYMENT">) - SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT">)) <= 0 then                                      
           memo75.Visible := False;
    
    А вот так работает:
      if (SUM(<dsetReport."ADVANCE_PAYMENT">) - SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT"> + 0)) <= 0 then                                      
           memo75.Visible := False;
    
      if SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT">) <= 0 then                                      
           memo75.Visible := False;
    
  • отредактировано 03:59
    CyberMax написал: »
    А вот так работает:
      if (SUM(<dsetReport."ADVANCE_PAYMENT">) - SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT"> + 0)) <= 0 then                                      
           memo75.Visible := False;
    
      if SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT">) <= 0 then                                      
           memo75.Visible := False;
    

    SUM(<dsetReport."ON_ACCOUNT_OF_CREDIT"> + 0)
    Явная ошибка в интерпритаторе выражений.
    Похожая проблема была в 2.5 при вычислении с BCD и BigInt, там я правил в исходниках определение типа переменной от типа поля. В текущей версии с ходу разобраться не получилось, а досконально разбираться в логике работы нет желания.

    А что выставлено по умолчанию в опциях FBPLus sSQLINT64ToBCD и psUseLargeIntField?

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.