@environment - Замена для Web

Тема в разделе "Lotus - Программирование", создана пользователем Kvant, 29 янв 2008.

  1. Kvant

    Kvant Гость

    Приветсвую.
    У меня раньше была БД, в которой выполнялся агент (по дейсвтию).

    На форме - поле ввода Podr и скрытое поле PodrOld
    Вот само действие (сохранить)
    Нужно для изменения названия подразделения.

    Код (Text):
    Var:= @If(PodrOld != "" & PodrOld != Podr; "1"; "");
    @If(Var = "1"; @Environment("PodrNameOld"; PodrOld); "");

    FIELD PodrOld := Podr;

    FIELD SaveOptions := "1";
    @Command([FileSave]);
    FIELD SaveOptions := "0";

    @If(Var = "1";
    @Do(
    @Environment("PodrNameNew"; Podr);
    @Command([OpenView]; "po_polu"; ""; "1");
    @Command([ToolsRunMacro]; "(Изменить подразделение)");
    @Command([FileCloseWindow])); "");
    Вот сам агент -
    Код (Text):
    SELECT Podr = @Environment("PodrNameOld");
    FIELD Podr := @Environment("PodrNameNew");

    То есть - открывается вью с анкетой, записывается старое название подразделения в notes.ini, через @Environment, и присваивается новое название.

    Соотвественно под Веб это не работает ибо @Environment использует notes.ini.

    Вопрост такой - чем проще всего заменить данную функцию. Только Lotus Script? То есть необходимо как-то передавать в вью глобальную переменную... Куда её можно сохранять и как читать?
     
  2. Sandr

    Sandr Гость

    поему это не работает? Все работает.. на сервере тоже есть notes.ini.
     
  3. Kvant

    Kvant Гость

    Ммм так в том то и дело, что нет сервера. При запуске из дизайнера в браузере.
     
  4. Kvant

    Kvant Гость

    Попробовал так:
    @DbColumn("Notes" : "NoCache" ; "" : "" ; "podrazdeleniya" ; 2)
    Создал в вью podrazdeleniya столбец второй со значением поля Podr
    Так по идее можно прочитать.
    Он возвращает список всех подразделений. Чтобы взять только первое значение пользую
    @Subset(@DbColumn("Notes" : "NoCache" ; "" : "" ; "podrazdeleniya" ; 2);1)

    В итоге получилось так:
    Код (Text):
    SELECT Podr = @Subset(@DbColumn("Notes" : "NoCache"; "" : ""; "podrazdeleniya"; 2);1);

    Вопрос 1 - как выбирать не первую(вторую....энную), а ту которая была конкретно в том подразделении?

    Вопрос 2 - С выборкой уже более понятно, но вот как вставлять в саму базу значения полей?
    Если тока создать новый вью и писать, например FIELD Podr := @DbColumn(из нового вью);
    НО тогда как в этот вью изначально заносить данные?
     
  5. fvoice

    fvoice Гость

    Для: Kvant
    1. используйте @DbLookup
    2. присваивайте результат @DbColumn полю, если подразделения уникальны то он будет возвращать одно значение, если не уникальны то подумайте над усложнением ключа для поиска.

    Не понятно зачем такие трудности? переменные окружения.. агенты.. обьясните поподробнее задачу, возможно ее решение гораздо проще.
     
  6. Kvant

    Kvant Гость

    Спасибо, fvoice. Попробую.

    Задача - такая. У меня была база, сделанная под клиент Нотус. В ней были агенты. Надо переработать базу так, чтобы весь функционал работал из под браузера. В распоряжении только дизайнер, клиент и ещё можно пользоваться административным клиентом. В принципе, я думаю, можно установить и сервер.

    Конкретно этот агент нужен для того, чтобы:
    То есть он просматривает все документы в представлении, открытом для его выполнения и отбирает среди них документы, в которых название подразделения, в котором работает сотрудник, совпадает со старым названием. Если название подразделения в поле Podr анкеты сотрудника совпадает со старым название подразделения, то в поле Podr, с помощью оператора FIELD Podr := @Environment("PodrNameNew"); записывается новое название подразделения


    Подразделения уникальны. Для @DbLookup нужен ключ... У меня в представлении только список подразделений в 1 колонке и всё.
    В качестве ключа что использовать?
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Делать через энвироменты - достаточно кривой способ.

    На WebQuerySave вызываем серверного агента и делаем всё это без особых хлопот.
     
  8. fvoice

    fvoice Гость

    <!--QuoteBegin-Kvant+30:01:2008, 13:40 -->
    <span class="vbquote">(Kvant @ 30:01:2008, 13:40 )</span><!--QuoteEBegin-->В принципе, я думаю, можно установить и сервер.
    [snapback]95725" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Вы работаете с БД локально? Только один пользователь?

    Тогда может Вам просто написать скрипт, который выберет документы и изменит значение поля?
    типа такого:
    Код (Text):
        Dim ws As New NotesUIWorkspace
    Dim db As NotesDatabase
    Dim dc As NotesDocumentCollection
    Dim curdoc As NotesDocument
    Dim doc As NotesDocument   

    Set curdoc = ws.CurrentDocument.Document
    If curdoc.OldPodr(0)<>curdoc.Podr(0) Then
    Set dc = db.Search({SELECT Form = "Podrazdelenie" & Podr = } & curdoc.OldPodr(0),Nothing,0)
    If dc.Count <> 0 Then
    While Not doc Is Nothing
    If Not doc.UniversalID = curdoc.UniversalID Then
    doc.Podr = curdoc.Podr(0)
    doc.OldPodr = curdoc.Podr(0)
    Call doc.Save(True,False,True)
    End If
    set doc = dc.GetNextDocument(doc)
    Wend
    End If
    curdoc.OldPodr = curdoc.Podr
    End If
    _________________________________

    тьфу ты, забыл что все это под Веб, на работе проблемы с интернетом, пока обновится страница, забываешь о чем писать хотел..

    Для: Kvant

    не пойму только если у Вас нет сервера, то как Вы просматривать БД под Веб будете?
     
  9. Sandr

    Sandr Гость

    Чесно говоря, не пойму, зачем нужна работа через браузер, если база локальная...
     
  10. Kvant

    Kvant Гость

    Да это задание такое дали.. я ХЗ нафиг это вообще нужно :D

    По поводу скрипта - а разве UI работает под веб?

    Сервер могу поставить.
     
  11. Sandr

    Sandr Гость

    Для: Kvant

    UI не работает по вебом...
     
  12. Kvant

    Kvant Гость

    Хмм а если в коде использовать не UI, а сессии? Только я не знаю как бы это закодить...
     
  13. Kvant

    Kvant Гость

    Друг написал такой скрипт - у него работает
    Код (Text):
    Dim doc As NotesDocument
    Dim cdoc As NotesDocument
    Dim session As New NotesSession
    Dim View As NotesView
    Dim db As NotesDatabase

    Dim cdPodr As Variant
    Dim PodrNameOld As Variant
    Dim tempPodr As Variant

    Set db= session.CurrentDatabase
    Set cdoc = session.DocumentContext
    Set View = db.GetView("po_polu")

    cdPodr = cdoc.GetItemValue("Podr") 
    PodrNameOld = cdoc.GetItemValue("PodrNameOld")

    Set doc = View.GetFirstDocument
    Messagebox "======="
    While Not (doc Is Nothing)     
    tempPodr = doc.GetItemValue("Podr")
    If ( tempPodr ( 0 ) = PodrNameOld (0)  ) Then
    doc.Podr = cdPodr ( 0 )
    Call doc.Save( True, True )            
    End If

    Set doc = View.GetNextDocument ( doc )


    Wend
    Мучаюсь который час пробовал всё уже.
    Просто вставляю его скрипт и работает.
    Меняю имя скрипта - ничего не пашет (соответсвенно в вызове тоже меняю имя)
    Просто меняю имя! Все свойства агента оставляю нетронутыми...

    С его именем(changePodr)- всё обрабатывает. Меняю на (Change) не пашет...

    Причём с его именем нормально происходит после агента @Command([FileCloseWindow]));

    Меняю имя - выдает Document Submited (как будто новое подразделение делал)

    Поразительно то, что когда в ВЫЗОВЕ указано @Command([RunAgent];"(Change)"); ТО даже если такого агента нет вызывается всё равно (changePodr)....

    В Чём дело?
     
  14. fvoice

    fvoice Гость

    Для: Kvant
    Вы все-таки поставили сервер, или работаете через быстрый просмотр?

    Возможно браузер грузит страницу из кеша, от этого и старые названия вызываются, попробуйте открыть в другом браузере.
     
  15. Kvant

    Kvant Гость

    Удалил лишние файлы баз примеров.. Теперь ваще ничо не пашет xD
    Работаю через быстрый просмотр.
     
  16. fvoice

    fvoice Гость

    <!--QuoteBegin-Kvant+31:01:2008, 10:58 -->
    <span class="vbquote">(Kvant @ 31:01:2008, 10:58 )</span><!--QuoteEBegin-->Удалил лигие файлы баз примеров.. Теперь ваще ничо не пашет xD
    [snapback]95913" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Мне кажется Вы перепутали несколько баз данных, проверьте еще раз все названия в рабочей версии, а ошибки агента можно посмотреть в локальном Log.nsf (я думаю локальный Web сервер будет складывать их именно туда)
     
  17. Kvant

    Kvant Гость

    31.01.2008 07:50:47 HTTP Web Server: Lotus Notes Exception - You are not allowed to modify environment variables. [/primer_2_9.nsf/c90d781b718fa10ac325739c004d21f9/f2353c259900e53ac32573e10006a9df?EditDocument&Seq=1]

    Хотя левел прав доступа выдает 4 (редактор) (@UserAccess)
    Да и не трогаю я переменные окружения...
     
  18. fvoice

    fvoice Гость

    Для: Kvant
    не пойму, Вы используете скриптовый агент, выложенный несколькими постами выше? В нем же нету обращений Environment, может запускается Ваш старый агент?
     
  19. Kvant

    Kvant Гость

    Да я использую скриптовый тот, который друг написал.
    Как может запускаться старый, если его уже в помине нет в базе...
     
  20. fvoice

    fvoice Гость

    Для: Kvant
    напишите в начале агента messagebox "Это я!!!", запустите, если выполняется этот агент, то в логе будет надпись "Это я!!!"
     
Загрузка...

Поделиться этой страницей