04.04.2007, 10:33 | #1 |
Участник
|
Работа с Lotus посредством VBA
Всем привет!
Есть код VBA создающий номенклатуру в Lotus, взятый из макроса Excel X++: Sub CreateNomenclature() '===============поля из аксапты recid$ = "" imtetype$ = "" itemid$ = "" ItemName$ = "" bname$ = "" cname$ = "" dname$ = "" ename$ = "" '============== Password$ = "password" ' пароль на тот notesid, что установлен на машине Server$ = "dev-server.lipa.ru/Lipa" ', "зз" Path$ = "dev\po2.nsf" 'путь к бд "зз" Dim s As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument s.Initialize (Password$) Set db = s.GetDatabase(Server$, Path$) Set view = db.GetView("viewNomenclaturebyRecId") Set doc = view.GetDocumentByKey(recid$) If doc Is Nothing Then Set doc = db.CreateDocument Call doc.ReplaceItemValue("form", "formNomenclature") Call doc.ReplaceItemValue("fldRecId", recid$) End If Select Case itemtype$ Case 0: Call doc.ReplaceItemValue("fldItemType", "Номенклатура") Case 1: Call doc.ReplaceItemValue("fldItemType", "Спецификация") Case 2: Call doc.ReplaceItemValue("fldItemType", "Услуга") Case 3: Call doc.ReplaceItemValue("fldItemType", "Основные средства") Case 4: Call doc.ReplaceItemValue("fldItemType", "Финансовое вложение") Case Else: Call doc.ReplaceItemValue("fldItemType", "Неизвестный тип") End Select Call doc.ReplaceItemValue("fldItemId", itemid$) Call doc.ReplaceItemValue("fldItemName", ItemName$) Call doc.ReplaceItemValue("fldbname", bname$) Call doc.ReplaceItemValue("fldcname", cname$) Call doc.ReplaceItemValue("flddname", dname$) Call doc.ReplaceItemValue("fldename", ename$) Call doc.Save(False, False) End Sub |
|
04.04.2007, 11:40 | #2 |
Moderator
|
А что сделать-то надо? Преобразовать процедуру на VBA в джоб на X++ ? Или загрузить номенклатуру из Аксапты в Лотус?
|
|
04.04.2007, 11:46 | #3 |
Участник
|
Цитата:
Стоит задача настроить внесение изменений в Lotus (в реальном времени) при создании/корректировке номенклатуры в АХ Последний раз редактировалось VKUR; 04.04.2007 в 11:49. |
|
04.04.2007, 12:36 | #4 |
Moderator
|
ну, подход примерно такой:
1. описываем переменные как str str recid; str imtetype; и остальные тоже 2. описываем вот эти объектные переменные как COM Dim s As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument т.е заменяем на COM s; COM db; и т.д. 3. Далее для воплощения оператора New NotesSession нужно знать строковый идентификатор этого COM-объекта. например, для Excel это "Excel.Application" и строка создания выглядит так: xlApp = new COM("Excel.Application"); а вам нужно аналогичное для NotesSession (вместо многоточия): s = new COM("..."); 4. В конце каждого оператора - точка с запятой : s.Initialize(Password); 5. Для объектов слово Set не надо, просто присваивание: db = s.GetDatabase(Server, Path); 6. Если у метода нет параметров, то все равно круглые скобки в конце: doc = db.CreateDocument(); 7. Конструкцию "If doc Is Nothing Then" заменяем на "if (!doc)" 8. Select Case => switch 9. Ключевое слово Call не надо. ну и т.д. Начинайте! P.S. 10. Оператор Path$ = "dev\po2.nsf" , содержащий обратный слэш можно преобразовать либо так c удвоением: path = 'dev\\po2.nsf'; либо так с собакой: path = @'dev\po2.nsf'; |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
04.04.2007, 15:43 | #5 |
Moderator
|
Как вариант с минимальными усилиями: можете попробовать запускать из Аксапты вашу VBA-процедуру в первозданном эксельном виде на невидимом эксельном хосте при помощи следующего джоба:
X++: static void Job_CreateNomenclature(Args _args) { COM xlApp, wbks, wbk; ; xlApp = new COM('Excel.Application'); wbks = xlApp.Workbooks(); wbk = wbks.Open(@'C:\YourExcelFile.xls'); xlApp.Run('CreateNomenclature'); } |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
04.04.2007, 16:19 | #6 |
MCTS
|
А еще есть такая штука как "Мастер оболочек СОМ объектов"
Сервис\Средства разработки\Мастера\Мастер оболочек для СОМ-объектов С помощью мастера создаем набор классов-обверток для Лотуса, ну а дальше дело техники... |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
05.04.2007, 09:42 | #7 |
Модератор
|
__________________
-ТСЯ или -ТЬСЯ ? |
|
05.04.2007, 10:02 | #8 |
Moderator
|
Честно говоря, обычно получал подобную информацию как бы уже в готовом виде (например, из книжек). Знаю, что строка "Excel.Application" прописана во многих местах реестра Windows. Из какого именно узла реестра читается эта строка в операторе new COM("...") - не знаю. Попробуйте поискать в реестре по словам: Lotus, Notes, Session. Можно полистать вручную ветку реестра Мой компьютер\HKEY_CLASSES_ROOT с целью визуального обнаружения этих же слов. Скорее всего, у вас что-то типа "Notes.Session" и будет, хотя и не обязательно.
Коллеги, если кто-то владеет для подобных случаев процедурой четкого выхода сразу на нужный идентификатор без эвристических метаний по реестру - поделитесь, буду тоже премного благодарен. |
|
05.04.2007, 10:07 | #9 |
Модератор
|
ищите Lotus Notes COM toolkit
правда, сейчас его вендор с сайта почему-то не дает
__________________
-ТСЯ или -ТЬСЯ ? |
|
05.04.2007, 10:15 | #10 |
Участник
|
Могу ошибаться, но, кажется, для Лотуса есть ODBC драйвер...
|
|
05.04.2007, 10:29 | #11 |
Moderator
|
Похоже просто так: Lotus.NotesSession (во всяком случае поиск в гугле по строке "ClassID для NotesSession" дает много таких ссылок)
|
|
05.04.2007, 10:33 | #12 |
MCTS
|
А еще есть такая штука в самом Лотусе: "Lotus Domino Designer Help"
Там все подробненько описано... |
|
05.04.2007, 11:30 | #13 |
Участник
|
Если у вас на машине стоит клиент LotusNotes, то:
1 откройте редактор VBA кода 2 Tools->References, добавить ссылку на Lotus Domino Objects 3 запустите ObjectBrowser 4 в списке библиотек выбрать Domino и вам откроются недры СОМ интерфейса LonusNotes. заодно посмотрите это: http://www-128.ibm.com/developerwork...ls-COM_Access/ http://www.intertrust.ru/help/help6_...n?OpenFrameSet http://forum.codeby.net/forum11.html
__________________
Самое полезное в жизни – это собственный опыт... Последний раз редактировалось Ashir; 05.04.2007 в 11:37. |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
17.04.2007, 10:18 | #14 |
Участник
|
|
|
17.04.2007, 10:33 | #15 |
program-ёр
|
Видимо так
X++: array = Doc.GetItemValue("fldProject");
= array.value(1);
__________________
Становись лучше |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
18.04.2007, 11:10 | #16 |
Участник
|
|
|
19.04.2007, 12:39 | #17 |
Moderator
|
Наверное, даже можно сэкономить на одной строчке и на промежуточной переменной:
X++: = COM::createFromObject( COMDoc.GetFirstItem("fldProject") ).text(); |
|
|
За это сообщение автора поблагодарили: VKUR (1). |
Теги |
lotus, vba, axapta |
|
Похожие темы | ||||
Тема | Ответов | |||
Доступ к меню "Работа с документами" | 4 | |||
Работа с Lotus через COM | 2 | |||
VBA | 13 | |||
Axapta программирует Excel на VBA | 10 | |||
Axapta и Lotus Domino | 0 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|