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

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

  1. Gor

    Gor Well-Known Member

    Репутация:
    0
    Регистрация:
    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 Гость

    Репутация:
    0
    Наверное было бы логичнее заменить

    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

    Репутация:
    0
    Регистрация:
    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

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

    Gor Well-Known Member

    Репутация:
    0
    Регистрация:
    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
    Lotus team

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

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

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

    Axel Гость

    Репутация:
    0
    Для: 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

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

    Axel Гость

    Репутация:
    0
    Для: Gor

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

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

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

    Gor Well-Known Member

    Репутация:
    0
    Регистрация:
    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 Гость

    Репутация:
    0
    могу ошибаться.

    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

    Репутация:
    0
    Регистрация:
    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

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

    Axel Гость

    Репутация:
    0
    Для: Gor

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

    oshmianski Гость

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

    Gor Well-Known Member

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

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

    oshmianski Гость

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

    Gor Well-Known Member

    Репутация:
    0
    Регистрация:
    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
     
Загрузка...

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