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