06.07.2006, 12:16 | #1 |
Участник
|
Помогите пожалуйста, как организовать выгрузку в MS Project?
|
|
06.07.2006, 18:23 | #2 |
Участник
|
Слишком широко поставлена задача.
По этому примерно такой ответ: В справочной системе к Microsoft Project есть описание объектной модели Microsoft Project. Попробуйте начать с неё. Также Вам помогут темы форума, посвященные интеграции с Microsoft Office. |
|
07.07.2006, 21:51 | #3 |
Участник
|
По карйней мере сразу видно несколько вариантов:
1. Через текстовые файлы 2. Через подключение по ОЛЕ 3. Через SQL таблицы (если MS Project в SQL-е конечно) 4. Через какой-либо еще файл, в который можно что-то выгрузить из Навижна и который поймет Проджект
__________________
С уваженем, rootadmin |
|
17.07.2006, 16:20 | #4 |
Участник
|
5. ctrl+c & ctrl+v
:-))) |
|
18.07.2006, 18:30 | #5 |
Шаман форума
|
__________________
All information in this post is strictly confidential. If you have read it in error, please forget it immediately. |
|
17.08.2006, 11:44 | #6 |
Заноза в заднице
|
На самом деле в последнее время достали комменты в форуме, типа "..через бумажный разъем.." или "..ты что тупой? Читай help (или MSDN, или документацию)..". Господа, давайте будем конструктивны: если можете подмочь - пишите комменты, если нет идите... (чуть не выругался..) дальше по форуму. На самом деле вариант с использованием базы SQL представляется наиболее удобным, если точно знаешь, что перехода на новую версию MSProject не ожидается. А вообще я сейчас пытаюсь работать с помощью Automation Server'а: Microsoft Project 11.0 Object Library - стандартного COM-компонента MSProject (в моём случае - 2003). Я даже нарыл кое-какие исходники для VB, которые в принципе должны работать и в Nav, только вот столкнулся с такой проблемой: в VB примере используется такой метод (или функция, или что-то ещё) - Nothing. Исходный код выглядит так:
Public pjApp As New MSProject.Application pjApp = CreateObject("MSProject.Application") pjApp.Visible = True pjApp = Nothing Nav-код я представил так: //MSPApp = DataType: Automation; Subtype: 'Microsoft Project 11.0 Object Library'.Application CLEAR(MSPApp); IF NOT CREATE(MSPApp, TRUE) THEN BEGIN MESSAGE('Не установлен MS Project!'); EXIT; END ELSE MSPApp.Visible(TRUE); Вроде всё путём должно быть, только реально, когда запускаешь код на исполнение в результате окошко Project'а моргает на экране и сразу закрывается. Вот я и думаю: скорее всего это этот Nothing имеет какое-то значение... потому как если посмотреть свойство MSApp.Projects через C/AL Symbol Menu, то можно увидеть [VAR NOTHING Projects := ] Projects([VAR NOTHING Projects])... тоже Nothing... Что это? Ответьте кто-нибудь? Только прошу, если хотете меня отправить читать help по VB - то лучше не пишите ничего...
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|
|
За это сообщение автора поблагодарили: mira (1). |
17.08.2006, 12:23 | #7 |
Участник
|
а Project потом остается открытым? В диспетчере задач его видно?
Кстати, а что если в конце еще поставить CLEAR(MSPApp); ? Думаю глюк в этом |
|
17.08.2006, 13:05 | #8 |
Заноза в заднице
|
2 Fordewind: Project закрывается при таком представлении, потому как MSPApp объявлена локальной переменной функции. И после отработки функции он хлопается сразу. В диспетчере его ессно нет. Кстати, я разобрался и с Nothing. CLEAR(MSApp) - есть ни что иное как аналог VB-строки: pjApp = Nothing. Кстати, для интереса, попробуйте объявить переменную MSPApp = DataType: Automation; Subtype: 'Microsoft Project 11.0 Object Library'.Application, как глобальную переменную в форме или в кодеюните. ;-)
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|
17.08.2006, 13:17 | #9 |
Участник
|
Цитата:
хм.. объявил на форме... ничего в глаза не бросилось. А у вас что вышло? |
|
01.09.2006, 17:25 | #10 |
Заноза в заднице
|
При сохранении объекта выдает ошибку. Цитировать не буду, но скриншот в прикреплении. Моя переменная объявлена под именем PROJECTAPPL...
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков! |
|
04.09.2006, 08:44 | #11 |
Участник
|
Большое всем спасибо, разобрался. Получился вот такой код:
Это так наброски, код еще не оптимизировал. CREATE(Appl); Appl.Projects.Add; Appl.Visible(TRUE); LN:=0; JBL.RESET; JBL.SETRANGE("Job No.",CurrentJobNo); JBL.SETCURRENTKEY(LineNo); Job.GET("Job No."); Appl.SelectTaskField(LN,'Name'); Appl.SetTaskField('Name',Job.Description); Appl.SetTaskField('Start',FORMAT(TODAY)); Appl.SetTaskField('Finish',FORMAT(TODAY)); Appl.SetTaskField('Notes',CurrentJobNo); Line:=1; LN:=1; IF JBL.FIND('-') THEN Stage:=''; Task:=''; IF JBL.FIND('-') THEN REPEAT IF Stage<>JBL."Phase Code" THEN BEGIN Phase.GET(JBL."Phase Code"); Appl.SelectTaskField(LN,'Name'); Appl.SetTaskField('Name',Phase.Description); Appl.SetTaskField('Outline Level',FORMAT(2)); Appl.SetTaskField('Notes',JBL."Phase Code"); Stage:=JBL."Phase Code"; Line+=1; END; IF Task<>JBL."Task Code" THEN BEGIN TTask.GET(JBL."Task Code"); Appl.SelectTaskField(LN,'Name'); Appl.SetTaskField('Name',TTask.Description); Appl.SetTaskField('Outline Level',FORMAT(3)); Appl.SetTaskField('Notes',JBL."Task Code"); Task:=JBL."Task Code"; Line+=1; END; IF SubTask<>JBL."Step Code" THEN BEGIN TSubTask.GET(JBL."Step Code"); Appl.SelectTaskField(LN,'Name'); Appl.SetTaskField('Name',TSubTask.Description); IF FORMAT(Appl.ActiveProject.ProjectStart)>FORMAT(JBL."Starting Date") THEN Appl.ActiveProject.ProjectStart:=FORMAT(JBL."Starting Date"); Appl.SetTaskField('Start',FORMAT(JBL."Starting Date")); Appl.SetTaskField('Finish',FORMAT(JBL.EndDate)); Appl.SetTaskField('Outline Level',FORMAT(4)); Appl.SetTaskField('Notes',JBL."Step Code"); Appl.SetTaskField('Text1',JBL."Work Type Code"); SubTask:=JBL."Step Code" END; JBL.CALCFIELDS(Quantity); JBL.CALCFIELDS(JBL."Re-planned Quantity"); IF JBL.Chargebility=TRUE THEN Appl.SetTaskField('Work',FORMAT(JBL.Quantity)) ELSE Appl.SetTaskField('Work',FORMAT(JBL.Quantity+JBL."Re-planned Quantity")); IF (JBL."Legacy Type"=0) AND (JBL.Parent<>'') THEN IF JBL.Shift<>0 THEN Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'SS+'+FORMAT(JBL.Shift)+'d') ELSE Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'SS'); IF (JBL."Legacy Type"=1) AND (JBL.Parent<>'') THEN IF JBL.Shift<>0 THEN Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'FS+'+FORMAT(JBL.Shift)+'d') ELSE Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'FS'); IF (JBL."Legacy Type"=2) AND (JBL.Parent<>'') THEN IF JBL.Shift<>0 THEN Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'FF+'+FORMAT(JBL.Shift)+'d') ELSE Appl.SetTaskField('Predecessors',FORMAT(StrToInt(JBL.Parent)+Line)+'FF'); CASE JBL.Type OF JBL.Type::Resource: BEGIN Res.GET(JBL."No."); Res.TESTFIELD(Blocked,FALSE); Appl.SetTaskField('Resource Names',Res.Name); END; JBL.Type::Item: BEGIN Item.GET(JBL."No."); Appl.SetTaskField('Resource Names',Item.Description); END; JBL.Type::"G/L Account": BEGIN GLAcc.GET(JBL."No."); GLAcc.CheckGLAcc; GLAcc.TESTFIELD("Direct Posting",TRUE); Appl.SetTaskField('Resource Names',GLAcc.Name); END; JBL.Type::"Group (Resource)": BEGIN ResGr.GET(JBL."No."); Appl.SetTaskField('Resource Names',ResGr.Name); END; END; LN:=1; UNTIL JBL.NEXT=0; MESSAGE('Ok'); CLEAR(Appl); |
|
|
За это сообщение автора поблагодарили: mira (1). |