CftClub.ru
Клуб специалистов ЦФТ-Банк

Ошибка формирования отчета в Excel

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеЧт Ноя 15, 2018 18:20   Ошибка формирования отчета в Excel Ответить с цитатой
Полезность: Нет оценки
Добрый день,
При при выполнении операции (формировании отчета в Excel) выскакивает ошибка: 800a03ec.
Это происходит в том случае, если количество столбцов > 257. Если меньше - все нормально.
Версия Excel 2007.

В чем причина, кто-то может подсказать?
Blackmore64
Профи


Вступление в Клуб: 17.01.2017
СообщениеПт Ноя 16, 2018 08:25   Re: Ошибка формирования отчета в Excel Ответить с цитатой
Полезность: Нет оценки
TannyGo пишет:
При при выполнении операции (формировании отчета в Excel) выскакивает ошибка: 800a03ec.
Это происходит в том случае, если количество столбцов > 257. Если меньше - все нормально. Версия Excel 2007

Если используется шаблон, то возможно он версии 97-2003, у которого было такое ограничение. Попробуйте пересохранить его в формате 2007.
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПт Ноя 16, 2018 09:39    Ответить с цитатой
Полезность: Нет оценки
В том-то и дело, что шаблон в данном случае не используется.
Новый файл открывается командой EXCEL.open_file(null,true,true).

Странно еще одно: в Excel-e ранних версий ограничение на количество столбцов - 256. В данном случае максимальное количество столбцов 257. Кстати, если в этом недоформированном файле попробовать сделать изменения вручную - все прекрасно добавляется.
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПт Ноя 16, 2018 13:44    Ответить с цитатой
Полезность: Нет оценки
Сделала тестовую простейшую операцию, запись чисел в строку, чтобы проверить ограничение количества столбцов. Не проблема - все работает.
begin
if p_message = 'DEFAULT' then
EXCEL.init_xls;
EXCEL.open_file(null,true,true);
for i in 1..16000 loop
put(1, i, i);
end loop;
elsif p_message = 'VALIDATE' then
EXCEL.exec_script(V_DEST);
end if;
end;

Но как только в цикле добавляю форматирование ячейки:
put(1, i, i, 'CM'); -- соответственно увеличиваю V_DEST

опять та же ошибка и в таблице последнее число 257.

Может, что-то связано со строкой валидатора?
Кто-то может помочь, плз?
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПт Ноя 16, 2018 13:50    Ответить с цитатой
Полезность: Нет оценки
На всякий случай (не уверен что поможет)

а в клиент скрипте есть очистка после выполнения ?

Execute DEST_STR.TEXT
DEST_STR.TEXT = ""
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПт Ноя 16, 2018 15:11    Ответить с цитатой
Полезность: Нет оценки
Мой клиент-скрипт:

Public Function Main(LastControl)
if LastControl is Nothing then
Execute Dest.Text
Dest.Text = ""
end if

If LastControl is OK and Dest.Text <> "" Then
DO
Execute Dest.Text
Dest.Text = ""
Call Form1.ScriptServerValidate( OK, "OK")
Loop While Dest.Text <> ""
else
Execute Dest.Text
Dest.Text = ""
End If
Main = True
End Function


Как видно, есть)))
Blackmore64
Профи


Вступление в Клуб: 17.01.2017
СообщениеПн Ноя 19, 2018 08:20    Ответить с цитатой
Полезность: Нет оценки
Может попробовать переделать отчет в OOXML? Типа так
В проверке
Код:
begin
 if P_MESSAGE = 'VALIDATE' then
  Draw();
 end if;
end;
В локальных описаниях
Код:
pragma macro (xl,'[OOXML]::[API_XL]');
procedure Draw ()
is
 xl_out blob := empty_blob();
 cur_row integer;
 sheet_name varchar2;
begin
 &xl.init_xls;
 &xl.delSheet(1);
 sheet_name := 'Page1';
 &xl.new_sheet(sheet_name);
 &xl.open_sheet(sheet_name);
 cur_row := 1;
 &xl.set_column_width(5, 1, 1);
 &xl.cell(cur_row, 2, 'Номер');
 for (select x(x.[NUM] :c_num) in ::[ MAIN_DOCUM]) loop
  cur_row := cur_row+1;
  &xl.cell(cur_row, 2, x.c_num);
 end loop;
 &xl.finish(xl_out);
 ::[OOXML].[API_ORSA].putReport2Run(xl_out, 'xlsx', 'Отчет');
end;
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеПн Ноя 19, 2018 09:55    Ответить с цитатой
Полезность: Нет оценки
1. с количеством столбцов проблем нет
2. не вижу в тексте excel.print_array
3.
Цитата:
put(1, i, i, 'CM');

процедура Excel.put имеет другой набор параметров
procedure Put
/* Добавление значения в массив */
( Lin integer
/* Номер строки */
, Col integer
/* Номер колонки */
, Val varchar2(32767)
/* Добавляемое значение */
, p_copy_right integer := 0
/* на сколько ячеек сдублировать вправо */
, p_copy_down integer := 0
/* на сколько ячеек сдублировать вниз */
);
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПн Ноя 19, 2018 10:12    Ответить с цитатой
Полезность: Нет оценки
Blackmore64 пишет:
Может попробовать переделать отчет в OOXML? [/code]


Спасибо за совет, но сразу ошибка:
PLP-CLASS_NOT_FOUND: Тип [OOXML] не найден.

Наверное, пойду по другому пути. Попробую убедить, что лучше раздробить таблицу, а не выдавать нечитабельную информацию.

Хотя все равно интересно найти, в чем же проблема...
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПн Ноя 19, 2018 10:38    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:

процедура Excel.put имеет другой набор параметров


Это не Excel.put, а локальная процедура:
Код:
Procedure Put(   r            number                        -- 1
            ,c            number                        -- 2
            ,value         varchar2(2000)                  -- 3
            ,Allighment      varchar2(10)   default null      -- 4
            ,Bold         boolean         default false      -- 5
            ,Italic         boolean         default false      -- 6
            ,P_SIZE         number         default   null      -- 7
            ,FontName      varchar2(50)   default null      -- 8
            ) is
Begin
   If value = '0' Then value := '''' || value; End If;

   [EXCEL].Write(   r               -- 1
               ,c               -- 2
               ,value            -- 3
               ,Bold            -- 4
               ,Italic            -- 5
               ,P_SIZE            -- 6
               ,FontName         -- 7
               ,Allighment         -- 8
               );
End;


Последний раз редактировалось: TannyGo (Пн Ноя 19, 2018 16:16), всего редактировалось 1 раз
TannyGo
Участник


Вступление в Клуб: 05.01.2018
СообщениеПн Ноя 19, 2018 16:01    Ответить с цитатой
Полезность: Нет оценки
Проблема решена!

В системной процедуре EXCEL.Write использовалось значение функции VCol, а там было ограничение, снятие которого решило все проблемы

Код:
-- Возвращает ссылку на колонку Excel
function vCol(idx integer) return varchar2 is
   iMod      integer;
   iMain      integer;
   vRet      varchar2(10);
Begin
   --If idx <= 0 or idx > 256 Then
   If idx <= 0  Then
      return null;
   End If;


Всем спасибо!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru