|
|
#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 |
|
|
|
|
#2 |
|
Moderator
|
А что сделать-то надо? Преобразовать процедуру на VBA в джоб на X++ ? Или загрузить номенклатуру из Аксапты в Лотус?
|
|
|
|
|
#3 |
|
Участник
|
Цитата:
Стоит задача настроить внесение изменений в Lotus (в реальном времени) при создании/корректировке номенклатуры в АХ Последний раз редактировалось VKUR; 04.04.2007 в 11:49. |
|
|
|
|
#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). | |
|
|
#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). | |
|
|
#6 |
|
MCTS
|
А еще есть такая штука как "Мастер оболочек СОМ объектов"
Сервис\Средства разработки\Мастера\Мастер оболочек для СОМ-объектов С помощью мастера создаем набор классов-обверток для Лотуса, ну а дальше дело техники...
|
|
|
|
| За это сообщение автора поблагодарили: VKUR (1). | |
|
|
#7 |
|
Модератор
|
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
|
|
#8 |
|
Moderator
|
Честно говоря, обычно получал подобную информацию как бы уже в готовом виде (например, из книжек). Знаю, что строка "Excel.Application" прописана во многих местах реестра Windows. Из какого именно узла реестра читается эта строка в операторе new COM("...") - не знаю. Попробуйте поискать в реестре по словам: Lotus, Notes, Session. Можно полистать вручную ветку реестра Мой компьютер\HKEY_CLASSES_ROOT с целью визуального обнаружения этих же слов. Скорее всего, у вас что-то типа "Notes.Session" и будет, хотя и не обязательно.
Коллеги, если кто-то владеет для подобных случаев процедурой четкого выхода сразу на нужный идентификатор без эвристических метаний по реестру - поделитесь, буду тоже премного благодарен. |
|
|
|
|
#9 |
|
Модератор
|
ищите Lotus Notes COM toolkit
правда, сейчас его вендор с сайта почему-то не дает
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
|
|
#10 |
|
Участник
|
Могу ошибаться, но, кажется, для Лотуса есть ODBC драйвер...
|
|
|
|
|
#11 |
|
Moderator
|
Похоже просто так: Lotus.NotesSession (во всяком случае поиск в гугле по строке "ClassID для NotesSession" дает много таких ссылок)
|
|
|
|
|
#12 |
|
MCTS
|
А еще есть такая штука в самом Лотусе: "Lotus Domino Designer Help"
Там все подробненько описано... |
|
|
|
|
#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). | |
|
|
#14 |
|
Участник
|
|
|
|
|
|
#15 |
|
program-ёр
|
Видимо так
![]() X++: array = Doc.GetItemValue("fldProject");
= array.value(1);
__________________
Становись лучше |
|
|
|
| За это сообщение автора поблагодарили: VKUR (1). | |
|
|
#16 |
|
Участник
|
|
|
|
|
|
#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 | |||
|