Тема: Отчет на основе набора данных

Есть SQL набор данных с параметрами, в котором присутствуют расчетные поля, значения которых вычисляются при помощи макроса.
Набор отрабатывает правильно, но при попытке построить отчет (в момент выгрузки данных) происходит каскад ошибок и очищаются значения расчетных полей, а значения некоторых полей заполняются хаотичным образом.

Прикрепила картинку этого процесса.

Подскажите пожалуйста, в чем может быть причина такой ошибки?

Post's attachments

????? ?? ?????? ??????.jpg 467.25 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Отчет на основе набора данных

Затрудняюсь ответить. Попробуйте поставить флаг инициализации АПИ в  настройках отчета.

В отчетах АПИ должно работать полноценно.

Или это просто вы модуль с данными подцепили через Интерфейсы и выгружаете стандартно (и тут происходят ошибки)?

Re: Отчет на основе набора данных

Олег Зырянов пишет:

Затрудняюсь ответить. Попробуйте поставить флаг инициализации АПИ в  настройках отчета.

В отчетах АПИ должно работать полноценно.

Или это просто вы модуль с данными подцепили через Интерфейсы и выгружаете стандартно (и тут происходят ошибки)?

Флаг не помог.

Строим из режима Справочники => Наборы данных -> Зависимый объект "Результаты запроса"

Re: Отчет на основе набора данных

Очень похоже на ошибку в расчетах на вкладке "Макрос" построителя запросов.
Закоментируйте код макроса, если отчет сформируется, значит ошибка в макросе.

Re: Отчет на основе набора данных

Виктор Бебякин пишет:

Очень похоже на ошибку в расчетах на вкладке "Макрос" построителя запросов.
Закоментируйте код макроса, если отчет сформируется, значит ошибка в макросе.

Так и есть, но клиенту как раз и нужны значения расчетных полей в отчете. (Есть подозрение, что проблема возникает с выгрузкой полей, где значение равно null, которые в результирующей таблице набора данных отображаются пустыми )

Вот код макроса:

If ((not Qb.IsNull("NmkParameters_NMK_PAR_VALUE")) and (not Qb.IsNull("NmkParameters_1_NMK_PAR_VALUE")) and (not Qb.IsNull("PrBOMFinishProd_Quan"))) then
    If Qb.AsString("NmkParameters_NMK_PAR_VALUE")<>"" and Qb.AsString("NmkParameters_1_NMK_PAR_VALUE")<>"" and Qb.AsString("PrBOMFinishProd_Quan")<>"" and Qb.AsString("OperationNmk_NAME")<>"Закалка ТВЧ" then
        Qb.AsFloat("C_C_TIME") = CDbl (Qb.AsFloat("NmkParameters_NMK_PAR_VALUE")*Qb.AsFloat("PrBOMFinishProd_Quan")*Qb.AsFloat("NmkParameters_1_NMK_PAR_VALUE")/20)
        Qb.AsFloat("C_C_COST") = CDbl (Qb.AsFloat("C_C_TIME")*20)
  Else
        Qb.AsFloat("C_C_TIME") = 0
        Qb.AsFloat("C_C_COST") = 0
  end if
Else
    Qb.AsFloat("C_C_TIME") = 0
    Qb.AsFloat("C_C_COST") = 0
end if

Почему ошибка в макросах возникает непосредственно перед построением?
Без запуска отчета, набор данных выдает необходимые результаты, без каскада ошибок.

Пришлось организовать построение отчета через форму с IUserGModule-м.

Спасибо сказали: Виктор Бебякин1

(изменено: , 27 апреля 2018 13:11:46)

Re: Отчет на основе набора данных

не хватает проверки

  not Qb.IsNull("OperationNmk_NAME")

еще можно весь код завернуть в обработчик ошибок

on error resume next
...
if err then 
  'обработать ошибку
end if
on error goto 0
Спасибо сказали: Алёна Краснощёка1

(изменено: Алёна Краснощёка, 27 апреля 2018 14:07:20)

Re: Отчет на основе набора данных

Виктор Бебякин пишет:

не хватает проверки

  not Qb.IsNull("OperationNmk_NAME")

Такая проверка не повлияла на результат

Виктор Бебякин пишет:

еще можно весь код завернуть в обработчик ошибок

on error resume next
...
if err then 
  'обработать ошибку
end if
on error goto 0

пропуск ошибок позволил выгрузить неправильные значения расчетных полей.
Ошибка преобразования Null в Double.
Но как она возникает, если все поля (которые участвуют в расчетах) не являются null?

Post's attachments

Image 1.png 13.09 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

Re: Отчет на основе набора данных

Ошибка преобразования Null в Double.
Но как она возникает, если все поля (которые участвуют в расчетах) не являются null?

If ((not Qb.IsNull("NmkParameters_NMK_PAR_VALUE")) and (not Qb.IsNull("NmkParameters_1_NMK_PAR_VALUE")) and (not Qb.IsNull("PrBOMFinishProd_Quan"))) then
    If Qb.AsString("NmkParameters_NMK_PAR_VALUE")<>"" and Qb.AsString("NmkParameters_1_NMK_PAR_VALUE")<>"" and Qb.AsString("PrBOMFinishProd_Quan")<>"" and Qb.AsString("OperationNmk_NAME")<>"Закалка ТВЧ" then

'здесь происходит ошибка преобразования строки в Double
        Qb.AsFloat("C_C_TIME") = CDbl (Qb.AsFloat("NmkParameters_NMK_PAR_VALUE")*Qb.AsFloat("PrBOMFinishProd_Quan")*Qb.AsFloat("NmkParameters_1_NMK_PAR_VALUE")/20)
'Qb.AsFloat("C_C_TIME") = NULL из-за предыдущей ошибки, потому получаете: "Ошибка преобразования Null в Double"
        Qb.AsFloat("C_C_COST") = CDbl (Qb.AsFloat("C_C_TIME")*20)
  Else
        Qb.AsFloat("C_C_TIME") = 0
        Qb.AsFloat("C_C_COST") = 0
  end if
Else
    Qb.AsFloat("C_C_TIME") = 0
    Qb.AsFloat("C_C_COST") = 0
end if

Обойти проблему можно так:

function toFloat(str)
  if IsNull(str) or IsEmpty(str) then
    toFloat = 0
  else
    dim sep
    sep = InStr(CStr(1.1), ".")
    if sep > 0 then
      toFloat = CDbl(Replace(str, ",", "."))
    else
      toFloat = CDbl(Replace(str, ".", ","))
    end if
  end if
end function

If Qb.AsString("OperationNmk_NAME")<>"Закалка ТВЧ" then
      Dim v
      v = toFloat(Qb.Value("NmkParameters_NMK_PAR_VALUE"))_
          *toFloat(Qb.Value("PrBOMFinishProd_Quan"))_
          *toFloat(Qb.Value("NmkParameters_1_NMK_PAR_VALUE"))/20
      Qb.AsFloat("C_C_TIME") = v
      Qb.AsFloat("C_C_COST") = v*20
Else
      Qb.AsFloat("C_C_TIME") = 0
      Qb.AsFloat("C_C_COST") = 0
end if
Спасибо сказали: Алёна Краснощёка1

Re: Отчет на основе набора данных

Виктор Бебякин пишет:

Обойти проблему можно так:

function toFloat(str)
  if IsNull(str) or IsEmpty(str) then
    toFloat = 0
  else
    dim sep
    sep = InStr(CStr(1.1), ".")
    if sep > 0 then
      toFloat = CDbl(Replace(str, ",", "."))
    else
      toFloat = CDbl(Replace(str, ".", ","))
    end if
  end if
end function

Спасибо! Получилось.