|
Возможно ли???
|
|||
---|---|---|---|
#18+
Доброго всем времени суток. Комрады есть такой вопрос (зараннее предупреждаю, где брал траву, не спрашивать): Создаю таблицу, колонки - названия моих .pbd и что-то типа curr_version для каждой из них: create table PBD( main_pbd text not null, main_pbd_curr_version smalldatetime not null, menu_pbd text not null, menu_pbd_curr_version smalldatetime not null ну и т.д. ....) Каким-то макаром загружаю туда свои .pbd Потом, как только юзер заводит аппликацию, где нибудь в скрипте open event'а запускаю процедуру, летит она в базу данных к таблице PDB и возврашает мне все бла-бла-бла_curr_version's которые я гружу куда-нибудь типа dt_versions[]. Потом, for i_knt = 1 to UpperBound(dt_versions[]) if dt_version[i_knt] <> f_api_функция_пока_сам_не_знаю_какая_возврашает_date_created_для_pbd("c:\app_folder\main_pbd.pbd") then SELECT main_pbd INTO :blob_var FROM PBD; ну и потом, fileopen, filewrite, fileclose ... if not b_restart then b_restart = true next if b_restart then messagebox('', "щас рестартну") HALT end if В результате чего, клиентам, не надо будет посылать новые билды, если я поймаю бага или добавлю новый процесс, всё что мне надо, это сгенериривать новый .pbd и толкнуть его в базу данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2006, 18:04 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Поиск в этои форуме рулит... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2006, 18:10 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
если честно, я не совсем представляю на какое слово искать, не только форум, но и гугли. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2006, 18:30 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Начинай искать со слов SetLibraryList, AddToLibraryList. --- http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2006, 18:49 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Неверно, начинать надо по простому - с PBD :-) А вообще то был топик Обновление приложения ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2006, 18:57 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Спасибо ребята, но ... 1. Сова, мне как бы не надо добавлять и убирать библиотеки (pbd'шки). 2. Филипп, запускать одну прогу из другой ... самый последний вариант, должен быть полностью уверен, что инного выхода нет. Вы мне обясните ребята, а то у меня образование два класса - три коридора: запускаетса аппликация, последняя строчка open (w_frame) w_frame, open event ... код-код-код ... в конце пишу: IF FileDelete('c:\app_folder\xyz.pbd') THEN MessageBox('frame', 'deleted') else messagebox('frame', 'NOT deleted') end if где xyz.pbd - один из .pbd включенных в билд. потом в меню аппликации на кнопке delete (рэндомли выбрал) пишу // Over ... IF FileDelete('c:\app_folder\xyz.pbd') THEN MessageBox('menu', 'deleted') else messagebox('menu', 'NOT deleted') end if потом в одном из тестировочных окон которое вижу только я, на click event кнопки "test" пишу: IF FileDelete('c:\app_folder\xyz.pbd') THEN MessageBox('test', 'deleted') else messagebox('test', 'NOT deleted') end if генерирую билд, запихиваю свеже испечённые .exe и .pbd'шки в фолдер аппликации и запускаю прогу. выскакивает: messagebox('frame', 'NOT deleted'), на всякий случай проверяю директорию, xyz.pbd там. жму "delete" из менюшки, выскакивает: messagebox('menu', 'NOT deleted'), на всякий случай проверяю директорию, xyz.pbd там. открываю своё тестировачное окошко, жму кнопку "ТЕСТ", выскакивает: MessageBox('test', 'deleted'), опять на всякий случай проверяю директорию, xyz.pbd там НЕТ. Я так понял что всё дело в лоад/анлоад или лок/анлок. Я к чему это всё, хочу переписать .pbd когда прога уже стартанула. ????????????? Tnx ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 00:51 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
voronk2. Филипп, запускать одну прогу из другой ... самый последний вариант, должен быть полностью уверен, что инного выхода нет. Это единственно приемлемый вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 01:28 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Чтобы работало динамическое создание PBD нужно чтобы загрузчик не зависел (статически) от объектов в тех PBD. Пусть приложение состоит из таких библиотек: loader.pbd, app1.pbd, app2.pbd Тогда при сборке EXE должен быть libraryList={loader.pbl} При старте приложения loader создает PBD и меняет libraryList на {loader.pbd; app1.pbd; app2.pbd} После этого запускается основной класс приложения: Код: plaintext 1. 2.
PS. С PFC это не сработает, так как там используется глобальная переменная менеджера приложения и не получится убрать из library list библиотеки PFC. Хотя поизвращаться можно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 12:16 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Большое всем спасибо за разъяснение. Я не работаю с PFC, наша аппликация завязана на PowerTool от PowerServ. Анатолий, если не затруднит, можно немного поподробнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 18:02 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Что именно не понятно? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 19:47 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Значит мне из моего project нужно убрать все библиотеки которые я потенциально менять на ходу. Оставить все powertool которые заведуют подключением к базе данных и т.д. В open event аппликации, добавить свою кодировку по проверке и замене .pbd и если всё будет успешно последнее строкой добавить SetLibraryList(s_lib_list) где s_lib_list = мои рабочии .pbd которые уже возможно были заменены. Я правильно понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 20:13 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
да, все верно. --- http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 20:18 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
а если загрузчик загружает, запускает приложение и плавно отваливает Такой вариант не рассматривался? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 20:24 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
spas2001а если загрузчик загружает, запускает приложение и плавно отваливает Такой вариант не рассматривался? Это то о чем Филипп говорил. Это самый простой вариант - ничего не надо менять в приложении, и нет описанных выше ограничений. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2006, 21:04 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Докладаю. Вчера всё дописал и сделал quick тест. Ok. В библиотеку где находитса апплиkация, были передвинуты из других библиотек несколько объектов, на которые есть референс в open event аппликации. Как-то, w_login и функция которая заведует проверкой create/modify date .pbd'шек в аппликейшн фолдере у юзеров. В конце open eventa аппликации был добавлен следуюший скрипт: SetNull(l_handle) s_name = space(81) GetModuleFileNamea(l_handle, s_name, 80) // делаем это всё только в продакшн энвайромент ... IF UPPER(Right(s_name, 8)) <> 'PB90.EXE' THEN /* динамически создаём datastore на базе процедуры которая возврашает дату из таблицы: вот на всякий случай синтакс таблицы, процедура возвращает только pbd и pbd_created_date ... if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[CUSTOM_PBD]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[CUSTOM_PBD] GO CREATE TABLE [dbo].[CUSTOM_PBD] ( [pbd] [char] (30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [pbd_text] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL , [pbd_created_date] [smalldatetime] NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO */ s_sql_syntax = 'execute dbo.spu_custom_pbd_list;1' s_presentation_str = "style(type=Tabular) Column(Font.Face='Microsoft Sans Serif' Font.Height= -8)" s_dwsyntax_str = sqlca.SyntaxFromSQL(s_sql_syntax, '', s_errors) IF Len(s_errors) > 0 THEN MessageBox("Title", 'SyntaxFromSQL Failed. Errors: ' + s_errors, Exclamation!) END IF ds_pbd = CREATE datastore ds_pbd.CREATE(s_dwsyntax_str, s_errors) IF Len(s_errors) > 0 THEN MessageBox("Title", 'SQLCreate Failed. Errors: ' + s_errors, Exclamation!) END IF i_rc = ds_pbd.settransobject(sqlca) IF Len(s_errors) > 0 THEN MessageBox("Title", 'settransobject()=' + string(i_rc), Exclamation!) END IF l_row = ds_pbd.Retrieve() IF l_row < 1 THEN DESTROY ds_pbd ELSE FOR l_row = 1 TO ds_pbd.RowCount() s_db_pbd = ds_pbd.GetItemString(l_row, 'pbd') s_local_pbd = 'c:\app_folder\' + s_db_pbd dt_db_pbd_created_date = ds_pbd.GetItemDateTime (l_row, 'pbd_created_date') i_rc = f_get_file_time(s_local_pbd, dt_null, dt_null, dt_local_pbd_created_date) IF i_rc <> 1 THEN MessageBox("Title", 'f_get_file_time() <> 1', Exclamation!) EXIT ELSE IF dt_local_pbd_created_date < dt_db_pbd_created_date THEN i_file_num = FileOpen(s_local_pbd, StreamMode!, Write!, LockReadWrite!, Replace!) IF i_file_num = -1 OR IsNull(i_file_num) = TRUE THEN MessageBox("Title", 'FileOpen() Fail', Exclamation!) EXIT ELSE SELECTBLOB pbd_text INTO :bl_tot_bl FROM CUSTOM_PBD WHERE pbd = :s_db_pbd USING SQLCA; l_bloblen = Len(bl_tot_bl) IF l_bloblen > 0 THEN // Determine the number of writes required // to write the entire blob IF l_bloblen > 32765 THEN IF Mod(l_bloblen, 32765) = 0 THEN i_writes = l_bloblen / 32765 ELSE i_writes = (l_bloblen / 32765) + 1 END IF ELSE i_writes = 1 END IF l_currentpos = 1 FOR i_cnt = 1 TO i_writes lblb_Data = BlobMid(bl_tot_bl, l_currentpos, 32765) l_CurrentPos += 32765 IF FileWrite(i_file_num, lblb_Data) = -1 THEN EXIT RETURN END IF NEXT FileClose(i_file_num) END IF END IF END IF END IF NEXT END IF DESTROY ds_pbd i_rc = AddToLibraryList ('abc.pbd,xyz.pbd, .....') IF i_rc <> 1 THEN MessageBox("Title", 'AddToLibraryList()=' + string(i_rc) + 'Application can not be started.', Exclamation!) HALT CLOSE END IF END IF потом- Сохранил свой "старый" project как project2 и убрал галки со всех рабочих .pbd Теперь, сначала я делаю deploy "старого" project, который создаёт мне рабочии .pbd, потом "нового", который создаёт мне "правильный" .exe Гружу все файлы в InstallShieldExpress, генерирую .msi и устанавливаю на тестировочные машины с разными операционками, 98, 2000, XP. С утра интенсивно тестировал, втягивание: window, datawindow, function, structure, изменение кода и layout уже сушествуюших объектов. Вроде работает всё кроме изменений (добавлений) в меню OBJECT, хотя дату файла меняет, значит .pbd создаёт ... ??? разберёмся. Вообщем я счастлив, большое всем спасибо. Буду благодарен за любые поправки в выше изложеном коде/подходе, надеюсь может кому-нибудь, на что-нибудь и сгодитса. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2006, 17:14 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
voronkIF UPPER(Right(s_name, 8)) <> 'PB90.EXE' THEN Более универсально так: Код: plaintext
потом- Сохранил свой "старый" project как project2 и убрал галки со всех рабочих .pbd Теперь, сначала я делаю deploy "старого" project, который создаёт мне рабочии .pbd, потом "нового", который создаёт мне "правильный" .exe Здесь не так надо делать. Дело в том что если убрать галки в проекте, то объекты этих PBL включаются в EXE. А EXE находится в liblist в самом начале и это никак нельзя изменить. А значит объекты EXE будут иметь приоритет перед объектами в PBD. Для корректной сборки, нужно сделать отдельный таргет с liblist = loader и EXE собирать им, а PBD собирать в таргете с полным liblist. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2006, 18:03 |
|
Возможно ли???
|
|||
---|---|---|---|
#18+
Спасибо Анатолий. Переделал, пришлось в библиотеку с аппликацией добавить парочку объектов без которых .exe не хотел создаватса. Один из которых ... - наше меню, что автоматически объяснило почему сегодня утром у меня были с ним проблемы. Будем тестировать дальше. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2006, 20:43 |
|
|
start [/forum/topic.php?fid=15&msg=33880972&tid=1337673]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 306ms |
0 / 0 |