Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

Использование скриптов в программе   Найти похожие ветки 

 
Наиль ©   (2009-07-14 10:27) [80]


> На создание нового уйдет 2 часа, вместо 2 дней, когда я
> буду из программы вносить в каждую отдельную ячейку данные,
>  а потом высчитывать - куда мне вставить еще одну таблицу
> и после какой строки. А так же то, что вы предлагаете -
> отдельный лист с переменными - это тоже по сути ручная работа
> программисту.

Второй, третий и т.д. листы - листы программиста.
На них чётко определены ячейки в которые надо вносить данные.
Поэтому высчитывать ни чего не надо. Программист такой программе не нужен.
А первый лист - лист для печати. Он делается на основе данных с остальных листов с использованием формул. На изменение такого листа требуется не более часа. И не нужно вмешиваться для этого в программу.

> Не для пользователя я стараюсь.

Вы можете сильно заболеть (не дай Бог), найти более достойную работу/зарплату (дай Бог), или просто уйти в отпуск. И что будут делать пользователи которым срочно нужно будет изменить форму отчёта?
Если Вы думаете, что им этого не понадобится, то я скажу: "Не зарекайтесь".


 
Skyle ©   (2009-07-14 10:35) [81]


> Kris_ ©   (14.07.09 09:55) [77]

Диспозиция такая: наша программа - суть скрипт-хост. Её задача (в разрезе вывода отчётов) заключается всего в двух вещах:
1. Запустить нужный скрипт (формирующий конкретный отчёт)
2. Обеспечить скрипт необходимыми данными.

И всё. Никаких упоминаний о OOo в программе не нужно, потому как эти скрипты сами по себе могут практически что угодно.

Собственно отчёт формируется скриптом, в моих примерах это будет сделано через OLE-автоматизацию MS Office, написано на VBScript.

Допустим, нужен отчёт, выводящий в Excel прайс-лист.

Для этого мы можем сочинить примерно вот такой вот скрипт.

OPTION EXPLICIT

Dim Excel, Data(), I

SET Excel = CreateObject("Excel.Application")
Excel.DisplayAlerts = False
Excel.Visible = True
Excel.WorkBooks.Add

Data = Reporter.QueryOpen("PriceListStoredProc")

Excel.Cells(1, 1) = "Наименование"
Excel.Cells(1, 2) = "Цена"
Excel.Cells(1, 3) = "Остаток"

for I = LBound(Data) to UBound(Data)
 Excel.Cells(I + 1, 1) = Data(I, 0) " Наименование
 Excel.Cells(I + 1, 2) = Data(I, 1) " цена
 Excel.Cells(I + 1, 3) = Data(I, 2) " Остаток
Next


Сохраняем этот скрипт в файл (допустим, PriceList.vbs) и ложим где-нибудь в доступном для программы месте (например в сети). Далее, наша программа каким-то образом определяет, что пользователь хочет вывести прайс-лист и для этого используется скрипт из файла PriceList.vbs. Программа создаёт экземпляр ScriptControl, берёт весь текст из файла PriceList.vbs и передает его в ScriptControl.AddCode. Затем вызывает ScriptControl.AddObject, куда передаёт написанный нами com-объект (Reporter) и вызывает ScriptControl.Run.  Как-то так.

Что при этом происходит. Объект Reporter несёт нужные нам медоты доступа к данным. В моём примере метод Reporter.QueryOpen выполняет в БД хранимую процедуру PriceListStoredProc и её результат возвращает двумерным массивом в скрипт. Далее, мы просто знаем, в каких столбцах массива лежат нужные нам значения и просто бежим по нему, подставляя в нужных местах.

По поводу ячеек и прочих формул - я не понял необходимости. В данном случае всю предварительную обработку, склеивание строк и прочего можно сделать в скрипте.


 
Kris_ ©   (2009-07-14 11:39) [82]

Skyle, если по вашему, я поняла в чем суть, это хороший вариант, но не поняла - в чем тогда преимущество скрипта? Единственное преимущество в этом способе я вижу, если бы в VBScript была нужная мне функция eval() например. Она там есть?


 
Kris_ ©   (2009-07-14 11:42) [83]

turbouser, я принимаю freeReport  как вариант, но я уже писала - если пользователь надует губки и скажет, фу, мне это не надо (на экран), мне хочется выборку в Excel (ОО) я хочу делать с ней что хочу, а freeReport, по-моему не может экспортировать в ОО/Excel. К тому же я спрашивала, если вы знакомы с этим инструментов - можно ли получить файл frf - легально бесплатно его построить для использования в рантайм? я не знаю ответа на этот вопрос..


 
Skyle ©   (2009-07-14 11:45) [84]


> Kris_ ©   (14.07.09 11:39) [82]


>  но не поняла - в чем тогда преимущество скрипта

Преимущество скрипта в том, что можно делать любые отчёты не меняя программы. Изменения вносятся только в скрипт и сразу же всем доступны (в случае сетевого хранения). Программу менять придётся только в случаях, когда потребуется расширять скрипт-хост, но это очевидно не чаще, чем менять или добавлять отчёты.

> функция eval() например. Она там есть?
Функция Eval там есть, даже в двух видах. Только, хоть убейте, не понял, что вы ей собрались делать...


 
Anatoly Podgoretsky ©   (2009-07-14 11:49) [85]

> Kris_  (14.07.2009 11:39:22)  [82]

Вроде есть, но не уверен, но не обязательно в VBScript, может быть в WSH .


 
Anatoly Podgoretsky ©   (2009-07-14 11:50) [86]

> Kris_  (14.07.2009 11:42:23)  [83]

Может и может в Эксель, но в ОО вряд ли, поэтому тебя и пытают, почему ОО


 
Kris_ ©   (2009-07-14 12:12) [87]


> Может и может в Эксель, но в ОО вряд ли, поэтому тебя и
> пытают, почему ОО

Анатолий, я же объяснила почему. Меня по-моему тут уже запытали не только этим.


> Только, хоть убейте, не понял, что вы ей собрались делать.
> ..

Увы, еще раз объяснять не имеет смысла. Если есть эта функция, то это отлично, это хороший выход.
Программу поменять нет проблемы, вообще-то. Обычно я делаю обновление сразу, выкладываю, и при запуске все скачивается через сеть (или интернет) моментально.
Кстати, еще вопрос.
Объясните еще раз, пожалуйста, что именно содержится в вашем примере в Reporter, а то я про свое думаю, видимо еще недопоняла. ЭТо объект со свойством Data (массив) в котором содержатся входные данные для скрипта (собственно, отчета). Так? Подключаем мы его из программы командой AddObject, для того, чтоб он стал виден скрипту. Верно?
И еще - как отлаживать скрипт и где смотреть, к примеру, справку по командам?  в экселе встроенная справка по языку - оно или нет?
А где справка по WSH?


 
Kris_ ©   (2009-07-14 12:14) [88]

Skyle, а еще вопрос - как вернуть значение из скрипта в программу? А если надо массив вернуть?


 
Anatoly Podgoretsky ©   (2009-07-14 12:24) [89]

> Kris_  (14.07.2009 12:12:27)  [87]

Так я понял объяснение, но разве это что то меняет, поддержка ОО пока еще очень, очень ограничена. Теоритически можно работать с ОО как с COM/OLE но нужна библиотека типов и непонятно как ее импортировать. Я не настолько знаком с WSH.
WSH слишком мощный и гигантский инструмент, у него нет даже ограничения по языкам и может работать с любыми COM/OLE объектами, но это надо уметь, а уметь здесь мало народу, все таки мы все ориентированы на Дельфи.

И вопрос по справке - справка у Микрософта, кое какие огрызки есть у меня на сайте, примеры и некоторая методика работы, смотри папку http://www.podgoretsky.com/ftp/Docs/WSH/ но там мало, всего три статьи, основной упор надо делать на Микрософт.


 
Kris_ ©   (2009-07-14 12:30) [90]


> поддержка ОО пока еще очень, очень ограничена.

интересно - что вы имели ввиду - кем или чем ограничена?


> работать с ОО как с COM/OLE но нужна библиотека типов и
> непонятно как ее импортировать.


куда?


 
Skyle ©   (2009-07-14 12:32) [91]

Отвечаю по порядку.

> Kris_ ©   (14.07.09 12:12) [87]
> Увы, еще раз объяснять не имеет смысла
Это печально. А то может VBscript"овые Eval и Execute делают не совсем то, что ваш FoxPro"шный Evaluate. Ну да ладно, посмотрите справку, решите.

> что именно содержится в вашем примере в Reporter
Я вам писал с позиции, что статью из [0] вы всё-таки прочитали. Начиная со слов "Модель расширения TScriptControl". Reporter, это ActiveX, добавленный в вашу программу. Он экспортирует некий интерфейс, который содержит необходимый вам фукнционал, например доступа к данным и прочего.
В моём примере его интерфейс содержит метод QueryOpen, который возвращает результат выполения запроса к базе данных (да, исхожу из того, что вы всё-таки перенесли свои большие файлы OOo в БД, хотя это необязательно). Чтобы скрипту стали видны наши методы, мы должны добавить наш интерфейс в окружение этого самого скрипта с помощью ScriptControl.AddObject. Первый параметр - имя, под которым он будет доступен коду скрипта.

> ЭТо объект со свойством Data
Видимо вы незнакомы с VBScript, потому что в моём примере Data - это переменная, объявленная в скрипте, она используется для получения результатов вызова QueryOpen.

>  как отлаживать скрипт
Да как обычно.. Написали, запустили, исправили, опять запустили. Вроде есть где-то отладчики, но я никогда не интересовался подробно.

> где смотреть, к примеру, справку по командам
В MSDN как водится...

> в экселе встроенная справка по языку - оно или нет?
Там справка по VBA, это немного другое. В принципе тот же VBScript, только ему много раз сделали AddObject и по мотивам этого написали справку. По самому языку справку ищите в MSDN.


> Kris_ ©   (14.07.09 12:14) [88]
> Skyle, а еще вопрос - как вернуть значение из скрипта в
> программу? А если надо массив вернуть?

Ничего вам не мешает добавить в свой Reporter соответствующий метод или свойство. Я в одной из своих программ выставлял в скрипт что-то типа датасета. И заполнялся этот датасет именно скриптом, а потом в программе я его уже использовал.


 
Kris_ ©   (2009-07-14 12:44) [92]

Skyle, большое спасибо за терпение

> А то может VBscript"овые Eval и Execute

если Eval и Execute , то они делают совсем не то. EVALUATE() в фокспро  - эта функция имеет параметром строку кода, который выполняет, это выражение с переменными. Фокс - интерпретатор, может выполнить в рантайм строчку кода без проблем. Надеюсь, что и VBScript это каким-то образом умеет.

Про остальное теперь мне более ясно, с VBScript я не знакома, лишь читала эту и  еще вот эту статью
http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/helloworld/activescript.htm
ну еще Delphi и COM  того же автора
все :)


 
Skyle ©   (2009-07-14 12:53) [93]


> Kris_ ©   (14.07.09 12:44) [92]
> Skyle, большое спасибо за терпение
>
> > А то может VBscript"овые Eval и Execute
>
> если Eval и Execute , то они делают совсем не то. EVALUATE()
> в фокспро  - эта функция имеет параметром строку кода, который
> выполняет, это выражение с переменными. Фокс - интерпретатор,
>  может выполнить в рантайм строчку кода без проблем. Надеюсь,
>  что и VBScript это каким-то образом умеет.

VBScript тоже интерпретируемый язык, поэтому конечно он это умеет.

Посмотрите справку
Eval
http://msdn.microsoft.com/en-us/library/0z5x4094(VS.85).aspx

Execute
http://msdn.microsoft.com/en-us/library/03t418d2(VS.85).aspx


 
Dennis I. Komarov ©   (2009-07-14 13:04) [94]

Совсем девушку замучили... или она...

> Kris_ ©

Вам просто хотят сказать, что привязываться к некой конкретной программе (в частности ОО) не есть хорошо. Если программа работает с неким набором данных, то не верно передавать их ей в формате некой конкретной программы. Логичнее было бы сконвертировать этим средством (к которому все очень прикипели) данные в некий универсатьный формат. Например сохранить в формате dbf (и Excel и Calc сие умеют), написать макрос который выгрузит данные в нужном формате (если dbf не угодил) и т.д. и т.п.


 
Anatoly Podgoretsky ©   (2009-07-14 13:23) [95]


> интересно - что вы имели ввиду - кем или чем ограничена?

Ограничена любителями, более серьезной поддержки на уровне системы и Дельфи нет, в отличии от МС Офиса


 
Kris_ ©   (2009-07-14 14:49) [96]


> Ограничена любителями, более серьезной поддержки на уровне
> системы и Дельфи нет, в отличии от МС Офиса

сорри, но не вижу в этом никакой проблемы. Все замечательно автоматизируется, моими пользователями используется  и т.д. Я же объяснила - что у нас все перешли уже на ОО, т.е. не в одной отдельно взятой фирме, а в городе. И в плане универсальности все оки. Можно выдать в ОО, а затем - хочешь в эксель, хочешь в rtf. Не вижу ни проблем ни ограничений. Но это уже офф. Надоело, если честно это обсуждать. Тема была в другом.

Skyle,
>Execute Statement
Executes one or more specified statements.
Вполне себе сойдет. Спасибо за прекрасные ссылки.


 
Inovet ©   (2009-07-14 16:21) [97]

> [8] Kris_ ©   (13.07.09 20:46)
> turbouser,
> Все прочие компоненты отпадают потому, что их нельзя добавить
> в турбо-дельфи. т.е. добавить можно лишь в рантайм. Я с
> трудом это себе представляю с генератором отчетов.

Да ну. Как раз в случае с ФР самый правильный подход.


 
TDelphi ©   (2009-07-15 12:14) [98]

Ребят я прочитал весь этот "трактат" и выражаясь сленгом "ниасилил" :)
Присоединяюсь к БарЛог ©



Страницы: 1 2 3 вся ветка

Текущий архив: 2009.09.13;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.018 c
2-1247156156
dusha
2009-07-09 20:15
2009.09.13
обратный отсчет времени


2-1247220630
liveD
2009-07-10 14:10
2009.09.13
создание службы


2-1247209825
b/@.
2009-07-10 11:10
2009.09.13
Можно ли возвратить из функции массив ?


2-1247062851
mr1Andersen
2009-07-08 18:20
2009.09.13
Как программно (Delphi 7), изменить значения «Свойства папки», на


2-1247149247
Varkan
2009-07-09 18:20
2009.09.13
Поменять местами узлы в TreeView