IPB

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Ошибка "variant Or Safe Array Is Locked" при экспорте в Msexcel
mvb
post 5.04.2012, 06:07
Post #1


Advanced Member
***

Group: Members
Posts: 169
Joined: 5.01.2007
From: Казань
Member No.: 4105



Ошибка "Variant or safe array is locked" при экспорте в MSExcel
Attached File(s)
Attached File  bug.JPG ( 12.41k ) Number of downloads: 8
 
Go to the top of the page
 
+Quote Post
kordima
post 6.04.2012, 22:21
Post #2


Member
**

Group: Members
Posts: 11
Joined: 3.02.2004
Member No.: 262



У меня эта ошибка возникла после перехода на FR 4.12.0
Обращение в техподдержку дало почти нулевой результат.
Пришлось засучить рукава и разбираться самому.

Причина:
При экспорте в Excel числовых полей разработчики добавили функцию ConvertNumber,
которая преобразует строку в число. Однако они не учли, что строковое значение
числового поля может быть пропущено через обработчик GetText.

В моем случае выводилась цена и добавлялся символ валюты, типа: 175 р.
В фунции ConvertNumber вызывается StrToFloat, возникает ошибка преобразования,
которая в итоге выглядит как "Variant ... Locked"
(опять привет от разработчиков, по качеству кода обработки ошибок).

Решения:
1. Убрать у числовых полей обработчики GetText.
2. Закоментировать вызов функции ConvertNumber в файле frxExportXLS.pas
(в версии 4.12.6 строка 866)
3. Пинать разрабочиков, чтоб исправили ошибку.

Go to the top of the page
 
+Quote Post
gpi
post 19.04.2012, 20:02
Post #3


Advanced Member
***

Group: FR Team
Posts: 2849
Joined: 23.10.2005
From: г. Волноваха Донецкой обл. Украина
Member No.: 2125



Попробуйте изменить frxExportXLS.pas
Код
  function ConvertNumber(s: AnsiString): Extended;
  var
    i, j, k: Integer;
  begin
    i := 1;
    k := 0;
    for j := 1 to Length(s) do
      case s[j] of
        '0'..'9', '-':
          begin
            s[i] := s[j];
            i := i + 1;
          end;

        ',', '.':
          begin
            if k = 0 then
              begin
                s[i] := AnsiChar(DecimalSeparator);
                k := i;
                i := i + 1;
              end;
          end;
      end;

    SetLength(s, i - 1);
    Result := StrToFloat(string(s));
  end;


--------------------
Ничего в мире не стоит того, чтобы делать из этого проблему
Go to the top of the page
 
+Quote Post
mvb
post 21.04.2012, 13:58
Post #4


Advanced Member
***

Group: Members
Posts: 169
Joined: 5.01.2007
From: Казань
Member No.: 4105



2 kordima, gpi: спасибо!

2 gpi: так работает, правда пришлось заменить Result := StrToFloat(string(s)); на Result := StrToFloatDef(string(s), 0);, иначе вылетало на пустых s.
Go to the top of the page
 
+Quote Post
mvb
post 7.02.2014, 09:00
Post #5


Advanced Member
***

Group: Members
Posts: 169
Joined: 5.01.2007
From: Казань
Member No.: 4105



2 года прошло и ошибка вернулась, благо уже известно где править...

Код
Result := StrToFloatDef(string(s), 0);
Go to the top of the page
 
+Quote Post
Rigins
post 13.02.2014, 20:12
Post #6


Newbie
*

Group: Members
Posts: 8
Joined: 13.02.2014
From: киров
Member No.: 15096



Спасибо
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 



- Time is now: 17.07.2019 - 10:11