Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2023, 05:00   #1
bastibubu
 
Регистрация: 20.06.2017
Сообщений: 6
По умолчанию исключение 'bad variable type'

Здравствуйте. Этот код должен экспортировать данные из датасета в excel но оператор
Код:
Range.Value := arrData;
вызывает исключение:
Цитата:
project raised exception class EOleSysError 'Bad variable type'
. Где искать причину исключения? Спасибо за помощь.
Код:
procedure Tform1.BExcelClick(Sender: TObject);
var 
 row,col,i,j:integer;
 xls, wb, arrData, Range: OLEVariant;
begin
 Query1.Close;
 Query1.Open;
            
 row := Query1.RecordCount;
 col := Query1.FieldCount;
 arrData := VarArrayCreate([1, row, 1, col], varVariant);
                                                                                            
 for i:=1 to row do begin
  for j:=1 to col do
    arrData[i,j] := Query1.Fields[j-1].Value;
     Query1.Next;
 end;
            
 xls := CreateOLEObject('Excel.Application');                                  
 wb := xls.Workbooks.Add;
          
 for j:=1 to col do
   WB.Worksheets[1].Cells[1,j]:= dbgrid1.Columns[j-1].Title.Caption;
            
 Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[2, 1], wb.WorkSheets[1].Cells[row+1, col]];
 Range.Value := arrData;
 xls.Visible := True;
end;
bastibubu вне форума Ответить с цитированием
Старый 27.10.2023, 10:45   #2
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

я б сначала убрал всё сложное, особенно циклы и попробовал в EXCEL передать какое-то одно значение. если прокатит, то по нарастающей усложнять код.
----------------
1) открытие и закрытие EXCEL
2) передача 1 значения
3) цикл по строкам
4) цикл по столбцам...
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Старый 27.10.2023, 16:36   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Вообще, по логике, “Bad variable type” — когда через вариантную переменную в OLE передается неподходящий тип. Обычно это строковый тип, вроде бы AnsiString или UnicodeString. По стандарту должен быть только WideString, остальные типы допустимы только между Delphi-приложениями.

Раньше строки вроде всегда преобразовывались при присваивании варианту, а в новых версиях Delphi что-то поменяли, разнеся логически типы Variant и OleVariant.

Конкретно в данном примере предположу, что массив нужно создавать с типом элемента varOleVariant, если таковой имеется.
Vapaamies вне форума Ответить с цитированием
Старый 28.10.2023, 04:55   #4
bastibubu
 
Регистрация: 20.06.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от NetSpace Посмотреть сообщение
я б сначала убрал всё сложное, особенно циклы и попробовал в EXCEL передать какое-то одно значение. если прокатит, то по нарастающей усложнять код.
----------------
1) открытие и закрытие EXCEL
2) передача 1 значения
3) цикл по строкам
4) цикл по столбцам...
Vapaamies, нашел точное место где пройсходит исключение. в запросе есть 2 поля- типа datetime(имя ExpDate) и calculated field summa (quantity*price). Без них запрос правильно работает. Как их дабавляю в запросе вызывает исключение.
запрос:
Код:
select   
 g.GoodsName,  --имя товара 
 s.qnt,  --количество проданного товара
 s.Price,           --цена  
 s.qnt*s.price as summa, 
 s.series,   --серия
 s.ExpDate,  --срок товара         
 t.temp   --температура хранения
from sales s, goods g, incomes i,  temperatures t
where (s.Doc_id=:Doc_id) and
          (s.goods_id=g.goods_id)and
          (s.id=i.id)and
          (g.temp_id=t.id)
group by g.goodsname,  s.qnt, s.Price, summa, s.series, s.ExpDate, t.temp
order by g.GoodsName
Как исправить?

Последний раз редактировалось bastibubu; 28.10.2023 в 13:51. Причина: добапил запрос
bastibubu вне форума Ответить с цитированием
Старый 29.10.2023, 04:51   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Так пробовали?
Код:
  arrData[i,j] := OleVariant(Query1.Fields[j-1].Value);
Vapaamies вне форума Ответить с цитированием
Старый 29.10.2023, 15:01   #6
bastibubu
 
Регистрация: 20.06.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Так пробовали?
Код:
  arrData[i,j] := OleVariant(Query1.Fields[j-1].Value);
Vapaamies, большое спасибо вам. Заработал!!!
bastibubu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При связывании подчиненных полей форм выдает ошибку object variable or with block variable not set access qqq`` Помощь студентам 0 26.09.2018 17:36
Run time error 91: Object variable or with block variable non set, excel 2010 vba (не могу найти ошибку) ac1-caesar Microsoft Office Excel 6 16.10.2014 15:03
ошибка - Run-time error '91' Object variable or With block variable not set Артур Иваныч Microsoft Office Excel 13 12.09.2012 14:18
Ошибка for loop control variable must be simple local variable 2UnLiMiTeDD Общие вопросы Delphi 8 19.03.2012 16:13
run-time error 91 (object variable or with block variable not set) mrs.petrushina Microsoft Office Excel 7 05.04.2011 00:22