Открытие Excel в Report

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Андрей
Старожил
Сообщения: 206
Зарегистрирован: 30 Октябрь 2005, 3:58

Открытие Excel в Report

Сообщение Андрей » 13 Апрель 2018, 10:35

Добрый день всем !

Прошу подсказать такую штуку...
Обычно вывод в Ecxel делал из Window, а тут есть Report который множественные (по фильтру) расч. листки выводит и попросили сделать вывод в Excel. Чтоб не переносить весь код в Window, пытаюсь сделать это в Reporte и не пойму куда поставить код инициализации книги

Код: Выделить всё

bind('l:FileName',l:FileName)
l:OLE = create(0, CREATE:ole)
l:OLE{prop:Create} = 'EXCEL.Application'
L:FileName =path()&'\Отчеты\Расчетные листки.xls'
copy('.\Forms\RLmany.xls',L:FileName)
If Error() 
	message('Ошибка копирования шаблона ! '&error())
ELSE
	l:OLE{'Application.workbooks.open("' & clip(l:FileName) & '")'}
	l:ole{'visible'} = true
	l:ole{'Sheets("Лист1").Select'}
end	
Если ставлю его в Process Manager-Take Record, то работает для печати одного р/л, но мне ж нужна еще пакетная печать, и нельзя объект XLS множественно создавать, ставлю в Process Manager-Open - не работает, в Beginning of Procedure,After Openning Files - не работает... а куда ж правильно ?

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Открытие Excel в Report

Сообщение kreator » 13 Апрель 2018, 13:49

Вы бы версию Клаши сказали бы для начала. Я так понимаю - ABC в любом случае? Придумываете какие-то костыли, ну да ладно. В Window Manager (он же Report Manager) есть метод OpenReport. В нём (возможно после Parent Call) нужно открыть своё окно (причём скрытое) и в нём создать контрол OLE (OLE должен быть на окне, а,ИМХО, несмотря на то, что ReportManager наследник WindowManager, окна как такового нет). И потом не забыть сделать destroy и закрыть окно. Но это где-то метод EndReport или до открытия превьюера.
We are hard at work… for you. :)

Андрей
Старожил
Сообщения: 206
Зарегистрирован: 30 Октябрь 2005, 3:58

Открытие Excel в Report

Сообщение Андрей » 17 Апрель 2018, 8:50

kreator писал(а):
13 Апрель 2018, 13:49
В Window Manager (он же Report Manager) есть метод OpenReport. В нём (возможно после Parent Call) нужно открыть своё окно (причём скрытое)
В спешке написал неточно - объект то Excel создается, только если я создаю его в Process Manager-Take Record, там где обрабатываю записи, передача в Excel идет, а если пытаюсь инициализировать его в другом месте, то он не заполняется. Пока решил проблему "костылем" - по флагу инициализирую объект там же, но один раз.

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Открытие Excel в Report

Сообщение kreator » 17 Апрель 2018, 10:06

Андрей писал(а):
17 Апрель 2018, 8:50
объект то Excel создается, только если я создаю его в Process Manager-Take Record,
Вы создаёте столько объектов, сколько раз вызывается Take Record? И, естественно, destroy не делаете! Непонятно, как ещё программа на GPF не вываливается? Надежда, что при закрытии окна прогресс-бара происходит автоматический destroy экранных объектов. В общем, предложение - костыли убрать и сделать по-человечески. Например, попробовать мою версию.
Версия Клариона какая?
We are hard at work… for you. :)

Андрей
Старожил
Сообщения: 206
Зарегистрирован: 30 Октябрь 2005, 3:58

Открытие Excel в Report

Сообщение Андрей » 17 Апрель 2018, 10:11

kreator писал(а):
17 Апрель 2018, 10:06
Вы создаёте столько объектов, сколько раз вызывается Take Record?
Нет, один раз по флагу

Код: Выделить всё

If ~l:flgCrtExcel
        bind('l:FileName',l:FileName)
        l:OLE = create(0, CREATE:ole)
        l:OLE{prop:Create} = 'EXCEL.Application'
        L:FileName =path()&'\Отчеты\Расчетные листки.xls'
        copy('.\Forms\RLmany.xls',L:FileName)
        If Error() 
            message('Ошибка копирования шаблона ! '&error())
        ELSE
            l:OLE{'Application.workbooks.open("' & clip(l:FileName) & '")'}
            l:ole{'visible'} = true
            l:ole{'Sheets("Лист1").Select'}
        end	
        l:flgCrtExcel=1
    end

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2120
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Открытие Excel в Report

Сообщение Дед Пахом » 17 Апрель 2018, 10:17

Можно сделать проще - создать Excel во внешней оконной процедуре (в той, из которой отчёт вызывается), и передать его в Report-процедуру как параметр.
С уважением, ДП

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Открытие Excel в Report

Сообщение kreator » 17 Апрель 2018, 10:34

Андрей писал(а):
17 Апрель 2018, 10:11
Нет, один раз по флагу
Решает вопрос. Изначально в этом и была проблема. Только destroy хорошо бы делать (мутная тема, нигде не описанная). А Visible Экселя Вы намеренно делаете? Чтобы пользователь видел ещё и заполнение Экселевского шаблона? Или от примера какого-то осталось?
We are hard at work… for you. :)

Андрей
Старожил
Сообщения: 206
Зарегистрирован: 30 Октябрь 2005, 3:58

Открытие Excel в Report

Сообщение Андрей » 19 Апрель 2018, 10:07

Visible - остался от отладки. В общем так и не понял в какой точке вставки объект XLS то инициализировать, почему пока удалось только при создании в этом месте получить заполнение, а в др. местах XLS остается пустым....

Ответить