30.03.2007, 13:37 | #1 |
Участник
|
Столкнулся с проблемой. Необходимо каждый день в определенное время запускать определенный codeunit (в целях синхронизации). Как это можно сделать средствами Нави? Может быть стоит попробовать придумать что-то с Application Server?
|
|
30.03.2007, 14:03 | #2 |
Участник
|
Посмотри форму 6093 и все что с ней связано в 3.70 - диспетчер задачь. Должно хватить.
|
|
30.03.2007, 15:04 | #3 |
Участник
|
У меня постоянно запущена формочка, и каждые 2 минуты запускает синхронизацию.
|
|
30.03.2007, 15:57 | #4 |
Участник
|
Цитата:
Хотя даже если он используется, то можно дописаться либо в 1 кодеюнит (по аналогии), либо куда-нибудь еще (где он используется). Тогда сервер сам будет запусакть его в нужное время (днем, ночью, по выходным и т.д.) |
|
02.04.2007, 11:17 | #5 |
Участник
|
Есть функционал Диспетчера задач в 4.0 (Администрирование - Управление ИТ - Диспетчер задач)
С помощью него можно запускать разные объекты (в т. ч. кодъюниты) Правда как работает - не разобрался |
|
02.04.2007, 13:45 | #6 |
Участник
|
Этот диспечер задач должен быть запущен "вручную", чтобы потом он запускал разные объекты.
|
|
04.04.2007, 15:14 | #7 |
Участник
|
Способ 1: NAS - запуск в качестве сервиса из командной строки в формате:
"\\сетевой_путь_к_папке_NAS\nassql.exe" appservername=NAVISIONSERVER-SQL, servername=NAVISIONSERVER, database=LiveDB, company="Компания """Тест""", startupparameter=jobschID_SCHED, installasservice=Yes эту строку нужно запустить 1 раз. А эту каждый раз, когда вам нужно запустить Диспетчер задач: "\\сетевой_путь_к_папке_NAS\nassql.exe" appservername=NAVISIONSERVER-SQL, servername=NAVISIONSERVER, database=LiveDB, company="Компания """Тест""", startupparameter=jobschID_SCHED где ID_SCHED - код задания в таблице 5981 При этом в СU1 ApplicationManagement нужно в триггере NASHandler прописать такой текст (отмечен //EDV01 begin/end) ParamStr := UPPERCASE(NASID); REPEAT SepPosition := STRPOS(ParamStr,','); IF SepPosition > 0 THEN Parameter := COPYSTR(ParamStr,1,SepPosition - 1) ELSE Parameter := COPYSTR(ParamStr,1); IF (COPYSTR(Parameter,1,2) = 'CG') THEN BEGIN BizTalkNASStartup.RUN; IF STRPOS(Parameter,' PORT=') > 0 THEN IF EVALUATE(PortNumber,COPYSTR(Parameter,STRPOS(Parameter,'=') + 1)) THEN BEGIN BizTalkNASStartup.StartTcpListen(PortNumber); CGNASStartedinLoop := TRUE; END; IF (STRLEN(Parameter) = 2) THEN BEGIN BizTalkNASStartup.StartTcpListen(0); CGNASStartedinLoop := TRUE; END; END; IF (COPYSTR(Parameter,1,4) = 'ADCS') THEN BEGIN IF STRPOS(Parameter,' ADCSID=') > 0 THEN IF EVALUATE(ADCSID,COPYSTR(Parameter,STRPOS(Parameter,'=') + 1)) THEN ADCSNASStartup.SetNASID(ADCSID) ELSE ADCSNASStartup.SetNASID('NAS1'); ADCSNASStartup.RUN; CGNASStartedinLoop := TRUE; END; //EDV01 begin IF COPYSTR(Parameter,1,6) = 'JOBSCH' THEN IF JobSchedulerSetup.GET(DELCHR(COPYSTR(Parameter,7),'<>',' ')) THEN BEGIN CASE JobSchedulerSetup."Object Type" OF JobSchedulerSetup."Object Type"::Report: REPORT.RUNMODAL(JobSchedulerSetup."Object No.",FALSE,FALSE); JobSchedulerSetup."Object Type":ataport: DATAPORT.RUNMODAL(JobSchedulerSetup."Object No.",FALSE); JobSchedulerSetup."Object Type"::Codeunit: CODEUNIT.RUN(JobSchedulerSetup."Object No."); END; END; CGNASStartedinLoop := TRUE; //EDV01 end IF CGNASStartedinLoop = FALSE THEN CASE Parameter OF 'MAILLOG': CODEUNIT.RUN(CODEUNIT::"E-Mail Dispatcher"); ELSE IF CPApplnSrvSetup.GET(Parameter) THEN BEGIN CPApplnSrvMgt.SetNASID(Parameter); WORKDATE := 0D; IF CPApplnSrvMgt.GetSendMail THEN BEGIN MailHandler.RUN; MailHandler.StartCountDown(2000); END; IF CPApplnSrvMgt.GetPerformSynch THEN MsgDispatcher.RUN; IF CPApplnSrvMgt.GetPerformRequests THEN RequestHandler.RUN; END ELSE ERROR(Text018,Parameter); END; ParamStr := COPYSTR(ParamStr,SepPosition + 1); CGNASStartedinLoop := FALSE; UNTIL SepPosition = 0; Это для случая, если нам нужно вызвать какую-то конкретную задачу. Если же нужно просто запустить диспетчер, то можно дописать //EDV01 begin IF COPYSTR(Parameter,1,6) = 'JOBSCH' THEN IF JobSchedulerSetup.GET(DELCHR(COPYSTR(Parameter,7),'<>',' ')) THEN BEGIN CASE JobSchedulerSetup."Object Type" OF JobSchedulerSetup."Object Type"::Report: REPORT.RUNMODAL(JobSchedulerSetup."Object No.",FALSE,FALSE); JobSchedulerSetup."Object Type":ataport: DATAPORT.RUNMODAL(JobSchedulerSetup."Object No.",FALSE); JobSchedulerSetup."Object Type"::Codeunit: CODEUNIT.RUN(JobSchedulerSetup."Object No."); END; END ELSE //добавляем для обработки параметра JOBSCH без указания конкретной задачи //сюда вставить код с кнопки СТАРТ формы управления диспетчером задач CGNASStartedinLoop := TRUE; //EDV01 end Единственное, что я не знаю, так это то, какой параметр нужно указать в строке запуска NAS (или NASSQL) для того, чтобы отрубить сессию (останосить application server). Если кто знает, подскажите. Способ 2: Создать сервис Windows с помощью Windows Resource Kit (доки можно почитать тут: http://support.microsoft.com/kb/q137890/ Ресурс кит загружается тут - http://www.microsoft.com/downloads/details...DisplayLang=en) Затем создать задания Windows через Стандартные программы Назначенные задания для запуска и остановки созданного сервиса. Например: C:\WINDOWS\system32\sc.exe start JobSchedulerNav C:\WINDOWS\system32\sc.exe stop JobSchedulerNav Все это нужно сделать от некого пользователя, отвечающего за диспетчер. На главной форме или в ApplicationManagement написать проверку пользователя и запуск диспетчера, если пользователь тот, который нам нужен. Все это работает. Отжирает сессию, конечно. Но ведь ночью мало кто работает из сотрудников |
|
04.04.2007, 17:09 | #8 |
Участник
|
для организации синхронизаций еще есть замечательный инструмент от компании ланштайнер, последняя их версия это дата директор ..... очень рекомендую, по заявлениям может даже объекты в удаленных базах синхранизировать (но это я не проверял) ... работает отлично, канал при этом сильно не грузит, как то там сам регулирует размеры пакетов .... в общем достаточно интерессное решение получилось
|
|
04.04.2007, 18:27 | #9 |
Участник
|
Цитата:
Сообщение от vovka
для организации синхронизаций еще есть замечательный инструмент от компании ланштайнер, последняя их версия это дата директор ..... очень рекомендую, по заявлениям может даже объекты в удаленных базах синхранизировать (но это я не проверял) ... работает отлично, канал при этом сильно не грузит, как то там сам регулирует размеры пакетов .... в общем достаточно интерессное решение получилось
Правда есть несколько бочков и самый основной из них - лицензирование. Код не продают отдельно, а нужно покупать все решение + кол-во магазинов столько, сколько баз. Хотя если распределенная сеть со своими базами в областях (например региональные представительства) = 100% решение., потоум что цена не очень велика. Да и то, что они добавили - просто "лакомка" для людей, которые любят различные рода "акции и подарки". |
|
05.04.2007, 12:10 | #10 |
Участник
|
Zapuskat' cherez Appl. Server, tam vse dostatochno prosto i ne s'efdaetsja sessija, a v CU nuzno ewe rabotat's timerom. Ja delal nemnogo bolee universal'no - pishetsja otdel'nij CU s timerom iz kotorogo zapuskajutsja modernizirovannie modernizirovannij Job scheduler.
|
|
05.04.2007, 12:42 | #11 |
Участник
|
Цитата:
Цитата:
Ja delal nemnogo bolee universal'no - pishetsja otdel'nij CU s timerom iz kotorogo zapuskajutsja modernizirovannie modernizirovannij Job scheduler.
Как по мне - подкорректировать 1 кодеюнит (или связанные данные - зависит от задачи) таким образом (если присутствует только 1 лицензия), чтобы дополнительно проверялось время и сопоставлялось с каким нибудь временем, которое хранится в настройках (всего 3 поля для универсальности - старое значение времени, тип настроечного времени - день, час, минута, секунта, {сводобное творчество}, значение прироста). Если пришло время отработки - запуск чего-то. Ну это общая концепция, если делать через Appl. Server |
|
05.04.2007, 13:09 | #12 |
Участник
|
"Так тогда этот кодеюнит нужно запускать каким-то образом, чтобы таймер отработал "
Esstestvenno on zapuskaetsja cherez 1-i CU (cherez Appl. Sever). Fishka v tom, chto standartnij Navi Job Scheduler ne trebuet dopolnitel'noj sessii, ne trebuet ruuchnogo zapuska, a v nem zalozeno dostatochno mnogo vsjakih udobnih vewei. |
|
05.04.2007, 13:57 | #13 |
Участник
|
Коллеги!
С шедуллером, который запускается по времени, все просто и способов множество. А вот как быть с запуском Navision с конкретным параметром, обработку которого несложно сделать в 1CU (NASHandler)??? Причем проблема не с самим запуском и не со съеданием сессии (какой бы то ни было), а именно с тем, чтобы NAS закрылся и чтобы его можно было запустить в следующий раз с другим параметром. Например, нам нужен некий механизм управления батчами (обработки пакетов по миграции данных из разных систем, по учету и т.д.), который должен работать из некого внешнего приложения, написанного, к приеру на Delphi. Есть список процессов, которые нужно администровать централизованно. Есть администратор, который при необходимости должен запускать тот или иной процесс (в любой из ИС предприятия) вручную. Задача в том, чтобы запустить Navision с неким параметром (ID задачи из диспетчера задач), в результате чего бы выполнилась определенная задача диспетчера задач. И задачу это можно решить с помощью NAS, НО! После запуска NAS из командной строки, этот самый администратор должен нажать кнопку ESC, чтобы закончить работу NAS для того, чтобы запустить следующую задачу (например). В принципе - администратору не сложно нажать эту кнопку, но хочется как-то сделать процесс красивее что ли. Чтобы по нажатию некой кнопки в написанном на Delhpi (или в любой другой среде разработки) приложении запускался NAS с определенным параметром, в триггере NASHandler происходила обработка этого параметра, запускалась соответствующая задача диспетчера задач и после ее успешного завершения NAS закрывался, освобождая тем самым сессию NAS и закрывая окно командной строки. То есть, по сути, нужно симитировать нажатие кнопки ESC админимтсратором, которого так ждет NAS для того, чтобы завершить свою работу. В случае возниконовения ошибки обработки какой-либо задачи хотелось бы при этом получать сообщение либо писать информацию об ошибке в лог. Если есть у кого то такой опыт, поделитесь, пожалуйста. |
|
05.04.2007, 14:17 | #14 |
Участник
|
1. да не надо его закрывать, пусть себе крутится и обрабатывает очередь заданий, а это внешнее приложение пусть очередью управляет (записи в табличке создает с номером объекта и строкой параметров).
2. для обработки ошибок в NAS есть триггер NavisionTimer::TimerError(ErrorString : Text[1024]) в компоненте 'Navision Timer 1.0'.Timer |
|
05.04.2007, 14:34 | #15 |
Участник
|
Мне не нужен таймер и не нужна очередь.
Ок, спасибо за ответы! |
|
05.04.2007, 14:58 | #16 |
Участник
|
Честно говоря, вышеперечисленные советы более разумны. Но, если вы настаиваете на внешнем закрытии сессии, то можно такой метод попробовтаь:
1. Создаете процессы (Service) NAS с нужными параметрами. 2. Все-таки придется создать таблицу с признаками - в каком состоянии находится задание NAS. Выполнилось. В процессе выполнения. Свободно... 3. "внешнее приложение, написанное, к примеру, на Delphi" стартует NET START нужный процесс. Затем подсоединяется к SQL базе. Смотрит таблицу признаков - когда флаг станет "задание выполнено". Запускает NET STOP |
|
05.04.2007, 15:24 | #17 |
Участник
|
|
|
06.04.2007, 10:56 | #18 |
Участник
|
RedFox, батчник мне как раз подходит!
Но у меня проблема с его написанием. Я пишу так: "\\navisionserver\Application Server\nassql.exe" appservername=NAVISION-SQL, servername=NAVISIONSERVER, database=Live, company=Компания ""РиК"", startupparameter=jobschmigex, installasservice=Yes net start NAVISION-SQL net stop NAVISION-SQL Но, моя обработка в триггере NASHandler не отрабатывает в этом случае. Если открыть службу Navision Application Server NAVISION-SQL после ее установки первой строкой батника, то в ней нет никаких параметров, а строка испролняемый файл содержит следующее: "\\navisionserver\Application Server\nassql.exe" А строка Параметры запуска пустая. Если я в строку параметров запуска прописываю: servername=NAVISIONSERVER, database=Live, company=Компания ""РиК"", startupparameter=jobschmigex и запускаю службу, то ничего в общем то не меняется, кроме состояния службы. Сессия в Navi не появляется, обработка не работает. Обращаюсь снова к вам за помощью! Заранее спасибо! |
|
06.04.2007, 11:22 | #19 |
Участник
|
Цитата:
Сообщение от EDVard
"\\navisionserver\Application Server\nassql.exe" appservername=NAVISION-SQL, servername=NAVISIONSERVER, database=Live, company=Компания ""РиК"", startupparameter=jobschmigex, installasservice=Yes
net start NAVISION-SQL net stop NAVISION-SQL Но, моя обработка в триггере NASHandler не отрабатывает в этом случае. Если открыть службу Navision Application Server NAVISION-SQL после ее установки первой строкой батника, то в ней нет никаких параметров, а строка испролняемый файл содержит следующее: "\\navisionserver\Application Server\nassql.exe" А строка Параметры запуска пустая. Если я в строку параметров запуска прописываю: servername=NAVISIONSERVER, database=Live, company=Компания ""РиК"", startupparameter=jobschmigex и запускаю службу, то ничего в общем то не меняется, кроме состояния службы. Сессия в Navi не появляется, обработка не работает. - запуск на выполнение Application Server с необходимыми параметрами (startupparameter=jobschmigex, где jobschmigex - код, по которому в 1 кодеюните производится обработка - см. аналог ADCS). Так же производится корректировка 1 кодеюнита с запуском то, что нужно, будь то другой кодеюнит, отчет, внешняя компонента или что-то еще. Самое главное, чтобы она возвращала куда-то признак о том, что ее работа или обработка закончилась (нужно смотреть по бизнес-процессу). - далее можно использовать что-то для анализа статуса завершения процесса (это может быть что угодно, в зависимости от реализации и интеграции). Как только получено сообщение о завершении работы - переход на следующий пункт. - остановка Application Server с необходимыми параметрами (startupparameter=jobschmigex) и переход на другое место Далее все повторяется, но меняется только startupparameter=SecondJobsChmigex. P.S. Кстати. вопрос к крутым спецам: Если кому не трудно, то объясните точнее по поводу net start NAVISION-SQL .. net stop NAVISION-SQL, а то интересно. Ну или пришлите что-нибудь в личку или redfox@list.ru. Заранее благодарен. |
|
06.04.2007, 11:41 | #20 |
Участник
|
Цитата:
Во-вторых, зачем вы каждый раз инсталируете как сервис ??? Сделайте заранее несколько сервисов NAS !!! Каждый со своим параметром !!! И потом уже играйтесь с net start NAVISION-SQL_NUM1 net stop NAVISION-SQL_NUM1 net start NAVISION-SQL_NUM2 net stop NAVISION-SQL_NUM2 и т.п. Кстати, не обязательно запускать его батником - для тестов можно в NAS консоли Navision позапускать с разными параметрами. В третьих, прописав за start сразу stop - я не уверен, что у вас будет все нормально выполняться. Надо все-таки между этим как-то убедиться что ваше задание уже выполнилось - как проверить - варианты описаны выше. to redfox: net start и net stop - просто запускает и останавливает виновский Service. |
|