Агент по расписанию..

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 14 сен 2006.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Всем здравствуйте!
    Столкнулся вот с такой штукой!
    У меня есть агент вот его код:
    Код (Text):
    Option Public
    Use "LibID"

    Sub Initialize
    Call [u]UpDateSapRole[/u]("TabNOM")
    End Sub
    LibID
    Код (Text):
    Public Sub [u]UpDateSapRole[/u](SName As String)
    Dim s As New NotesSession
    Set db = s.CurrentDatabase
    Dim view As NotesView
    Dim doc As NotesDocument
    Set view = db.GetView(SName)
    Set doc = view.GetFirstDocument()
    While Not (doc Is Nothing)
    Call doc.Remove(True)
    Set doc = view.GetFirstDocument()
    Wend

    Call [i]GetRoleFile[/i]("c:\XXX.csv")

    Call view.Refresh
    End Sub

    Public Sub [i]GetRoleFile[/i](Path As String)
    Dim doc,doc1 As NotesDocument  
    Dim session As New NotesSession
    Set db = session.CurrentDatabase
    Dim text As String, fileNum As Integer 
    i = 1
    fileNum% = Freefile()
    Open Path For Input As fileNum%

    Do Until Eof(1)
    Set doc = New NotesDocument( db )
    doc.Form = "TabN"

    Line Input #1, text$

    REM Call OemToAnsi(text$,text$)
    S = Strleft(text$,";")

    doc.IDN = Cstr(Cint(S))
    S1 = Ltrim(Strright(text$,";"))
    S2 = Strright(S1,";")
    S3 = Strleft(S2,";")
    S4 = Ltrim(Strright(S2,";"))
    S5 = Strleft(S4,";")
    S6 = Ltrim(Strright(S4,";"))
    S7 = Strleft(S6,";")
    S8 = Ltrim(Strright(S6,";"))
    S9 = Strleft(S8,";")
    S10 = Ltrim(Strright(S8,";"))
    S11 = Strleft(S10,";")
    S12 = Ltrim(Strright(S10,";"))
    S13 = Strleft(S12,";")
    S14 = Ltrim(Strright(S12,";"))
    S15 = Strleft(S14,";")


    doc.FIO = S5 + " " + S3
    doc.INFO = S11 + " " +"(" + S15 + ")"

    Call doc.Save( True, True )
    Loop   

    Close fileNum%

    End Sub
    Вот такая вещь! в .сsv файле 3000 записей. Когда я пускаю агент вручную - Run
    он отрабатывается на ура - создаёт 3000 записей в нужные поля записывает нужные значения
    А когда я ставлю его запуск по расписанию с настройками :
    Shared
    On Shedule - Daily
    Start running agent at - 17:00
    Run on - SERVER
    Target - all document in database
    Allow restricted operation with full administration rights
    ОН ОТРАБАТЫВАЕТСЯ ТАК - ВСЁ СТИРАЕТ И ВО ВЬЮХЕ ТОЛЬКО ОДИН ДОКУМЕНТ СФОРМИРОВАННЫЙ ИЗ ПЕРВОЙ СТРОКИ ИЗ ФАЙЛА .csv
    В чём может быть проблема?
     
  2. ak-47

    ak-47 Гость

    Наверное было бы логичнее заменить

    Set doc = view.GetFirstDocument()
    While Not (doc Is Nothing)
    Call doc.Remove(True)
    Set doc = view.GetFirstDocument()
    Wend


    на
    Set doc = view.GetFirstDocument()
    While Not (doc Is Nothing)
    Call doc.Remove(True)
    Set doc = view.GetNextDocument(doc)
    Wend
     
  3. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--QuoteBegin-ak-47+15:09:2006, 10:54 -->
    <span class="vbquote">(ak-47 @ 15:09:2006, 10:54 )</span><!--QuoteEBegin-->на
    Set doc = view.GetFirstDocument()
    While Not (doc Is Nothing)
    Call doc.Remove(True)
    Set doc = view.GetNextDocument(doc)
    Wend

    [snapback]43913" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Это не будет работать по двум причинам.
    1) логическая: мы удаляем первый док, значит второй станет первым. Метод GetNextDocument(doc) вернул бы третий документ (который стал вторым). Т.е. второй док мы пропустим (который стал первым).
    2) а реальная: doc уже удален. Т.е. doc is Nothing, а ты используешь его в параметре GetNextDocument(doc), что приведет к ошибке.


    Для: Gor
    Попробуй через NotesLog отследить что происходит.
     
  4. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Хотя с 1 первой причиной я ошибся. :blink:
     
  5. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: ak-47
    Нет, помоему логичнее так как я писал выше
    Код (Text):
    Set doc = view.GetFirstDocument()
    While Not (doc Is Nothing)
    Call doc.Remove(True)
    Set doc = view.GetFirstDocument()
    Wend
    т.к.
    Если сделать GetNext вместо GetFirst будет выходить ошибка...
    Как же он будет находить Next если First документ удалён?
    А так он удалит все доки
    Для: Medevic
    Ну я тогда всё равно не пойму почему агент отрабатывается нормально вручную :blink:
    я же его по щагам прямо проходил в дебагере(
    А вот Notes Log посмотреть я не пробовал ещё попробуем...
     
  6. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    А кто вьюху рефрешить будет? При пошаговом оно успевает само (фоновая задачка индексер), на автомате - надо ждать.
    Но правильнее так:

    set nxt = view.GetFirstDocument()
    While not nxt is nothing
    set doc = nxt
    set nxt = view.GetNextDoc(doc)
    doc.Remove
    Wend

    Тогда рефрешить не надо (точнее - один раз)
     
  7. Axel

    Axel Гость

    Для: Gor

    А проще всего так

    Set notesViewEntryCollection = notesView.AllEntries
    Call notesViewEntryCollection.RemoveAll( force )

    force
    Boolean. If True, a document is removed even if another user modifies the document after it is retrieved. If False, a document is not removed if another document modifies it first.

    По-моему самый простой вариант и не надо заморачиваться на рефреш вьюхи))))))
     
  8. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: Axel
    Способ хороший но в моём случае не пройдёт(
    Set notesViewEntryCollection = notesView.AllEntries
    не понимает( сервер 5.0 вываливает ошибку
     
  9. Axel

    Axel Гость

    Для: Gor

    Мда. В 5-ке такого класса няма....

    Тогда надо как Constantin A Chervonenko писал.

    А еще лучше переходите на 7-ку. 7.0.1FP1 нормально работает.
     
  10. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: Axel
    Уже переделал... но агент по шедуллеру всё равно не отрабатывается оставляет только один док...
    а в ручную всё пашет... уже не знаю чего и делать...
    всё уже перепробовал...
    если закоментарить работу с файлом доки он пустые создаёт по шедуллеру, а как толлько раскоментаришь так пустая вьюха..
    не знаю как и справиться!!!
    по логу вот чего :
    Started running agent 'Import' on 20.09.2006 15:35:23
    Running on new or modified documents: 3186 total
    Found 3186 document(s) that match search criteria
    Ran LotusScript code
    Done running agent 'Import' on 20.09.2006 15:37:40

    Перейти на 7 - ку бы с удовольствием, руководсто то даже на 6-ку не разрешает...
    придерживаются главной заповеди типа всё работает значит всё хорошо и лучше ничего не трогать)
     
  11. oshmianski

    oshmianski Гость

    могу ошибаться.

    Open fileName
    [ For { Random | Input | Output | Append | Binary } ]
    [ Access { Read | Read Write | Write } ]
    [ { Shared | Lock Read | Lock Read Write | Lock Write } ]
    As [#]fileNumber
    [ Len = recLen ]
    [Charset = MIMECharsetName]

    fileNumber
    An integer expression with a value between 1 and 255, inclusive. This number is associated with the file when you open the file. Other file-manipulation commands use this number to refer to the file.

    т.е. может на серваке у тебя #1 это не есть твой #fileNum%.

    Вот пример из хелпа

    Код (Text):
    Dim text As String, fileNum As Integer
    fileNum% = FreeFile()
    Open "c:\config.sys" For Input As fileNum%
    Do While Not EOF(fileNum%)
    Line Input #fileNum%, text$
    Print text$      ' Prints one line of config.sys
    Loop
    Close fileNum%
     
  12. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: oshmianski
    да оченнь интересно...
    это надо проверить ок хоть какая то зацепка...спс

    я сейчас пытаюсь обрубить концы ещё откуда всё это идёт
    вот написал такой агентик! чтобы немного смоделировать ситуацию...а также упростить
    Код (Text):
    Sub Initialize 
    Dim s As New NotesSession
    Set db = s.CurrentDatabase
    Dim view As NotesView
    Dim doc As NotesDocument
    Dim nxt As NotesDocument
    Set view = db.GetView("TabNOM")
    Set nxt = view.GetFirstDocument()
    While Not nxt Is Nothing
    Set doc = nxt
    Set nxt = view.GetNextDocument(doc)
    Call doc.Remove(True)
    Wend

    Set xlApp = createObject("Excel.Application") 'создаем объект Excel
    Set xlWB = xlApp.Workbooks.open("\\srvsdsk\sapdata\import_helpdesk_persons_EN.csv")
    Set xlSheet = xlWB.Sheets(1) ' выбираем первую "страницу"
    With xlApp
    .visible = False
    End With
    Dim i As String
    Dim k As Integer
    k% = 0
    Do
    k% = k% + 1
    If k% > 35 Then Exit Do

    Set doc = New NotesDocument(s.CurrentDatabase)
    doc.Form = "TabN"

    doc.IDN = k

    doc.IDN = xlSheet.Cells(k,1).Value
    doc.FIO = xlSheet.Cells(k,4).Value +" "+xlSheet.Cells(k,3).Value
    doc.INFO = xlSheet.Cells(k,7).Value

    Call doc.Save( False, True )
    Loop
    xlWB.Close
    End Sub
    Этот агент также не отрабатывается с настройками
    по шедуллеру
    Shared
    On Shedule - Daily
    Start running agent at - 17:00
    Run on - SERVER
    Target - all document in database
    Allow restricted operation with full administration rights
    По команде Run из дизайнера отрабатывается создаёт доки 35 шт чтобы немного их было и заполняет в доках поля

    Сейчас ситуация - ЕСЛИ ЗАКОМЕНТАРИТЬ ВСЕ СТРОЧКИ СВЯЗАННЫЕ С ОТКРЫТИЕМ И ОПРЕДЕЛЕНИЕМ
    ОБЪЕКТА xls т.е. строчки приведённые ниже АГЕНТ ОТРАБАТЫВАЕТСЯ ПО ШЕДУЛЛЕРУ!!!!!! СТИРАЕТ ПРОШЛЫЕ ЗАПИСИ, СОЗДАЁТ 35 ДОКОВ и ЗАПИСЫВАЕТ в ПОЛЕ TabN номера!!!!!!!!!!
    КАК ТОЛЬКО РАСКОМЕНТАРИТЬ ЭТИ СТРОЧКИ ПО ШЕДУЛЛЕРУ АГЕНТ НЕ ИДЁТ И ОТРАБАТЫВАЕТСЯ ТОЛЬКО ВРУЧНУЮ по команде Run из дизайнера!

    Set xlApp = createObject("Excel.Application") 'создаем объект Excel
    Set xlWB = xlApp.Workbooks.open("\\srvsdsk\sapdata\import_helpdesk_persons_EN.csv")
    Set xlSheet = xlWB.Sheets(1) ' выбираем первую "страницу"
    doc.IDN = xlSheet.Cells(k,1).Value
    doc.FIO = xlSheet.Cells(k,4).Value +" "+xlSheet.Cells(k,3).Value
    doc.INFO = xlSheet.Cells(k,7).Value


    тоже самое и можно проделать с моим прошлым кодом... закоментарить все строчки связанные с открытием файла FileNum% = Freefile()
    Open Path For Input As fileNum%

    Do Until Eof(1) итд итп
    и агент отработается по шедуллеру....
    ЧТО ЭТО??????!!!!!!! ЛОТУС ПО РАСПИСАНИЮ ДО ФАЙЛА ДОБРАТЬСЯ НЕ МОЖЕТ И ОБОЙТИ ВСЁ ПО АЛГОРИТМУ?!
    ИЛИ Я ЧЕГО ТО не знаю?....
     
  13. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    видимо "СИТУАЦИЯ"...
     
  14. Axel

    Axel Гость

    Для: Gor

    Такое чуйство, что у агента, когда он запускается на сервере не хватает правей на файловые операции. Проверь, разрешены ли агенту Restricted действия. Опять же проверь, что подписывающий агента человек прописан в серверном документе на разрешение запуска агентов с Restricted действиями.
     
  15. oshmianski

    oshmianski Гость

    Кроме того, как запускается сервак? Как сервис или как обычная апликатина? Если как сервис, то от чьего имени. Смотри виндовые права доступа.
     
  16. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Для: Axel
    всё проверил... с этим всё нормально...права есть
    Для: oshmianski
    запускается как сервис...

    А разница должна какая то быть? Он же вручную нормально отрабатывается корректно.... такой глюк только по шедуллеру...
     
  17. oshmianski

    oshmianski Гость

    виндовые права у сервиса и обычного приложения могут быть разные. а может это и не права вовсе?
    была похожая ситуёвина.
    сервак работал как сервис. написал он агентика. вручную все на ура, и на клиенте и на серваке. а если делать агента по расписанию, то попа. когда перезапустил сервак как обычное приложение - все гут, шедульный агент отработал на ура. трабла была в том, что объект Excel создаться не мог.
    вот и поди ж ты разберись...
     
  18. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    разобрался!!
    в .csv файле разделители "неправильные", решил проблемку добавлением в файл разделителей правильных для инпута,
    открываю файл с сервера, запускаю програмку рукописную делфёвую из шела которая разделители правильные делает, и потом всё ок! Правда небольшой загадкой осталось то почему агент вручную отрабатывался нормально... а по шедуллеру нет...видимо не хватало памяти..
    вот и весь агент...

    Sub Initialize
    ' копируем файл туда где есть права
    Filecopy "\\srv\sapdata\import_helpdesk_persons_EN.csv", "\\srv\m$\Lotus\Sap\import_helpdesk_persons_EN.csv"
    result = Shell("\\srvclst1\m$\Lotus\Sap\csz.exe \\srv\m$\Lotus\Sap\import_helpdesk_persons_EN.csv \\srv\m$\Lotus\Sap\import_helpdesk_persons_EN.txt", 1)
    "\\srv\m$\Lotus\Sap\import_helpdesk_persons_EN.csv"

    Call UpDateSapRole("TabNOM")

    End Sub
     
Загрузка...

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