Открытие Excel в Report

Clarion, Clarion 7

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

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

Открытие Excel в Report

Сообщение Андрей »

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

Прошу подсказать такую штуку...
Обычно вывод в 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
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Открытие Excel в Report

Сообщение kreator »

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

Открытие Excel в Report

Сообщение Андрей »

kreator писал(а): 13 Апрель 2018, 13:49 В Window Manager (он же Report Manager) есть метод OpenReport. В нём (возможно после Parent Call) нужно открыть своё окно (причём скрытое)
В спешке написал неточно - объект то Excel создается, только если я создаю его в Process Manager-Take Record, там где обрабатываю записи, передача в Excel идет, а если пытаюсь инициализировать его в другом месте, то он не заполняется. Пока решил проблему "костылем" - по флагу инициализирую объект там же, но один раз.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Открытие Excel в Report

Сообщение kreator »

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

Открытие Excel в Report

Сообщение Андрей »

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
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Открытие Excel в Report

Сообщение Дед Пахом »

Можно сделать проще - создать Excel во внешней оконной процедуре (в той, из которой отчёт вызывается), и передать его в Report-процедуру как параметр.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Открытие Excel в Report

Сообщение kreator »

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

Открытие Excel в Report

Сообщение Андрей »

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