AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2007, 10:33   #1  
VKUR is offline
VKUR
Участник
Аватар для VKUR
 
12 / 10 (1) +
Регистрация: 19.03.2007
Работа с 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
Не могу разобраться, как мне запихать все это в Axapta. Может какой джобик для примера найдется?
Старый 04.04.2007, 11:40   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
А что сделать-то надо? Преобразовать процедуру на VBA в джоб на X++ ? Или загрузить номенклатуру из Аксапты в Лотус?
Старый 04.04.2007, 11:46   #3  
VKUR is offline
VKUR
Участник
Аватар для VKUR
 
12 / 10 (1) +
Регистрация: 19.03.2007
Цитата:
Сообщение от Gustav Посмотреть сообщение
А что сделать-то надо? Преобразовать процедуру на VBA в джоб на X++ ? Или загрузить номенклатуру из Аксапты в Лотус?
Для начала хотя бы преобразовать в джоб
Стоит задача настроить внесение изменений в Lotus (в реальном времени) при создании/корректировке номенклатуры в АХ

Последний раз редактировалось VKUR; 04.04.2007 в 11:49.
Старый 04.04.2007, 12:36   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от VKUR Посмотреть сообщение
Для начала хотя бы преобразовать в джоб
ну, подход примерно такой:

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  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Как вариант с минимальными усилиями: можете попробовать запускать из Аксапты вашу 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  
#bet is offline
#bet
MCTS
Аватар для #bet
MCBMSS
 
30 / 13 (1) ++
Регистрация: 02.06.2004
Адрес: Киев
А еще есть такая штука как "Мастер оболочек СОМ объектов"
Сервис\Средства разработки\Мастера\Мастер оболочек для СОМ-объектов

С помощью мастера создаем набор классов-обверток для Лотуса, ну а дальше дело техники...
За это сообщение автора поблагодарили: VKUR (1).
Старый 05.04.2007, 09:42   #7  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от VKUR Посмотреть сообщение
Может кто знает?
Простите, Вы предыдущие сообщения внимательно прочитали?
__________________
-ТСЯ или -ТЬСЯ ?
Старый 05.04.2007, 10:02   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от VKUR Посмотреть сообщение
Может кто знает?
Честно говоря, обычно получал подобную информацию как бы уже в готовом виде (например, из книжек). Знаю, что строка "Excel.Application" прописана во многих местах реестра Windows. Из какого именно узла реестра читается эта строка в операторе new COM("...") - не знаю. Попробуйте поискать в реестре по словам: Lotus, Notes, Session. Можно полистать вручную ветку реестра Мой компьютер\HKEY_CLASSES_ROOT с целью визуального обнаружения этих же слов. Скорее всего, у вас что-то типа "Notes.Session" и будет, хотя и не обязательно.

Коллеги, если кто-то владеет для подобных случаев процедурой четкого выхода сразу на нужный идентификатор без эвристических метаний по реестру - поделитесь, буду тоже премного благодарен.
Старый 05.04.2007, 10:07   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от VKUR Посмотреть сообщение
Может кто знает?
ищите Lotus Notes COM toolkit
правда, сейчас его вендор с сайта почему-то не дает
__________________
-ТСЯ или -ТЬСЯ ?
Старый 05.04.2007, 10:15   #10  
Yugene is offline
Yugene
Участник
 
46 / 11 (1) +
Регистрация: 02.12.2004
Адрес: Moscow
Могу ошибаться, но, кажется, для Лотуса есть ODBC драйвер...
Старый 05.04.2007, 10:29   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Похоже просто так: Lotus.NotesSession (во всяком случае поиск в гугле по строке "ClassID для NotesSession" дает много таких ссылок)
Старый 05.04.2007, 10:33   #12  
#bet is offline
#bet
MCTS
Аватар для #bet
MCBMSS
 
30 / 13 (1) ++
Регистрация: 02.06.2004
Адрес: Киев
А еще есть такая штука в самом Лотусе: "Lotus Domino Designer Help"

Там все подробненько описано...
Старый 05.04.2007, 11:30   #13  
Ashir is offline
Ashir
Участник
 
45 / 22 (1) +++
Регистрация: 27.10.2005
Если у вас на машине стоит клиент 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  
VKUR is offline
VKUR
Участник
Аватар для VKUR
 
12 / 10 (1) +
Регистрация: 19.03.2007
Цитата:
Сообщение от Gustav Посмотреть сообщение
ну, подход примерно такой:
Снова здорова

Проект = doc.GetItemValue("fldProject")(0)

То есть получение первого элемента массива. Не могу понять как это будет выглядеть в Х++
Старый 17.04.2007, 10:33   #15  
kvg6 is offline
kvg6
program-ёр
Аватар для kvg6
1C
 
160 / 81 (3) ++++
Регистрация: 27.09.2005
Адрес: Moscow forever
Цитата:
Сообщение от VKUR Посмотреть сообщение
Проект = doc.GetItemValue("fldProject")(0)
Видимо так
X++:
array  = Doc.GetItemValue("fldProject");
         = array.value(1);
__________________
Становись лучше
За это сообщение автора поблагодарили: VKUR (1).
Старый 18.04.2007, 11:10   #16  
VKUR is offline
VKUR
Участник
Аватар для VKUR
 
12 / 10 (1) +
Регистрация: 19.03.2007
Цитата:
Сообщение от VKUR Посмотреть сообщение
То есть получение первого элемента массива. Не могу понять как это будет выглядеть в Х++
Разобрался
Вот так работает:
X++:
COMArray = COMDoc.GetFirstItem("fldProject");
 = COMArray.text();
Старый 19.04.2007, 12:39   #17  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Наверное, даже можно сэкономить на одной строчке и на промежуточной переменной:
X++:
 = COM::createFromObject( COMDoc.GetFirstItem("fldProject") ).text();
За это сообщение автора поблагодарили: VKUR (1).
Теги
lotus, vba, axapta

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Доступ к меню "Работа с документами" Kuat DAX: Администрирование 4 16.11.2007 17:07
Работа с Lotus через COM madproger DAX: Программирование 2 03.04.2007 15:47
VBA konopello DAX: Программирование 13 05.05.2006 14:46
Axapta программирует Excel на VBA Gustav DAX: База знаний и проекты 10 13.03.2006 11:42
Axapta и Lotus Domino ani DAX: Администрирование 0 28.08.2003 17:03
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:14.