агрегатная ф-я при передаче ч/з Массив..

отредактировано 00:56 Раздел: FastReport Studio
Visual Basic 6 - > Fast Report
т.к. возможности передавать данные из recordset VB6 напрямую не существует, работаю через массив. Параметры события OnGetValue передаются в виде типа данных VARIANT. Все отлично передается, обрабатывается условия по группам... но если добавить агрегатную функцию, то возникает <span style='color:red'>ошибка: Invalid variant operation!</span>
С чем это может быть связано и возможно ли это как-то обойти?

Комментарии

  • almanalman космополит
    отредактировано 00:56
    Вы не могли бы привести пример кода?
    Навскидку ничего сказать не получается.
  • отредактировано 00:56
    strSql = "SELECT Агент AS [Агент], [Производитель], SUM([ОстатокТовара]) As [Количество] FROM #исходнаяТ " & sWhere & " GROUP BY Агент, Производитель ORDER BY [Агент],[Производитель]"

    ' получим данные и создадим массив
    With rstGroup
    .ActiveConnection = cnnConnect
    .CursorType = adOpenStatic
    .CursorLocation = adUseClient
    .LockType = adLockReadOnly

    .Open strSql, , adOpenStatic, adLockReadOnly, adCmdText

    ' так из ADO.Recordset можно сразу получить массив
    avarData = .GetRows(adGetRowsRest)
    ' количество записей (размер массива)
    FAllcount = UBound(avarData, 2) - 1

    intCol = 0
    strFields = ""
    For Each fldOrders In .Fields
    'Set the Fields array values
    strFields = strFields & fldOrders.Name + Chr(13) + Chr(10)
    intCol = intCol + 1
    Next fldOrders
    End With

    Set rstGroup = Nothing

    ' создаем user Dataset и загружаем отчет (шаблон)
    dataset.Name = "MyDataSet"
    dataset.Fields = strFields
    frx.LoadReportFromFile App.Path & "\" & "new.fr3"

    ' передаем user Dataset
    frx.SelectDataset True, dataset
    '
    frx.ShowReport

    '//*********** события Fast Report ***********//
    Private Sub dataset_OnCheckEOF(IsEOF As Boolean)
    If Fcount = FAllcount Then
    IsEOF = True
    Else
    IsEOF = False
    End If
    End Sub

    Private Sub dataset_OnFirst()
    Fcount = 0
    End Sub
    Private Sub dataset_OnGetValue(ByVal VarName As Variant, Value As Variant)

    If VarName = "Агент" Then
    Value = IIf(IsNull(avarData(0, Fcount)), "", avarData(0, Fcount))
    ElseIf VarName = "Производитель" Then
    Value = IIf(IsNull(avarData(2, Fcount)), "", avarData(2, Fcount))
    ElseIf VarName = "Количество" Then
    Value = IIf(IsNull(avarData(3, Fcount)), 0, avarData(3, Fcount))
    Else
    Value = ""
    End If

    End Sub

    Private Sub dataset_OnNext()
    Fcount = Fcount + 1
    End Sub

    Private Sub dataset_OnPrior()
    Fcount = Fcount - 1
    End Sub

    в отчете присутствует MasterData1, GroupHeader(1,2), GroupFooter(1,2)

    Если не добовлять агрегатную функцию отчет формируется, группирует по агенту и проиводителю.
  • отредактировано 00:56
    причем первая строка с показателями количества выводится, а затем падает (выдаем ошибку) видимо в момент формирования (вычисления) агрегатной функции.
  • отредактировано 00:56
    я нашел в чем был траблс!

    переменная avarData объявлена AS VARIANT это тот самый массив который мы в полседствии обрабатываем.

    Из ADO.Recordset можно сразу получить массив
    avarData = .GetRows(adGetRowsRest). Не стал разбираться в каком виде он там лежит, но видимо если его передавать просто так без преобразования он передается как "<span style='color:red'>as String for non-numerics</span>" т.е. надо в самом Васике добавить четкое преобразование типа.

    Агрегатные функции начали работать!

    Private Sub dataset_OnGetValue(ByVal VarName As Variant, Value As Variant)

    If VarName = "Агент" Then
    Value = avarData(0, Fcount)
    ElseIf VarName = "Производитель" Then
    Value = avarData(2, Fcount)
    ElseIf VarName = "Количество" Then
    Value = CDbl(avarData(3, Fcount))
    Else
    Value = ""
    End If

    End Sub

    Очень понравилось как легко можно подключить Fast Report в приложение. Спасибо.

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

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