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

Gor

Well-known member
07.06.2005
517
1
#1
Всем здравствуйте!
Столкнулся вот с такой штукой!
У меня есть агент вот его код:
Код:
Option Public
Use "LibID"

Sub Initialize
Call [u]UpDateSapRole[/u]("TabNOM")
End Sub
LibID
Код:
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
В чём может быть проблема?
 
A

ak-47

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

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
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#3
<!--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 отследить что происходит.
 

Gor

Well-known member
07.06.2005
517
1
#5
Для: ak-47
Нет, помоему логичнее так как я писал выше
Код:
Set doc = view.GetFirstDocument()
While Not (doc Is Nothing)
Call doc.Remove(True)
Set doc = view.GetFirstDocument()
Wend
т.к.
Если сделать GetNext вместо GetFirst будет выходить ошибка...
Как же он будет находить Next если First документ удалён?
А так он удалит все доки
Для: Medevic
2) а реальная: doc уже удален. Т.е. doc is Nothing, а ты используешь его в параметре GetNextDocument(doc), что приведет к ошибке.
Ну я тогда всё равно не пойму почему агент отрабатывается нормально вручную :blink:
я же его по щагам прямо проходил в дебагере(
А вот Notes Log посмотреть я не пробовал ещё попробуем...
 
30.05.2006
1 345
11
#6
Для: ak-47
Нет, помоему логичнее так как я писал выше
Код:
Set doc = view.GetFirstDocument()
While Not (doc Is Nothing)
Call doc.Remove(True)
Set doc = view.GetFirstDocument()
Wend
т.к.
Если сделать GetNext вместо GetFirst будет выходить ошибка...
Как же он будет находить Next если First документ удалён?
А так он удалит все доки
Для: Medevic

Ну я тогда всё равно не пойму почему агент отрабатывается нормально вручную :blink:
я же его по щагам прямо проходил в дебагере(
А кто вьюху рефрешить будет? При пошаговом оно успевает само (фоновая задачка индексер), на автомате - надо ждать.
Но правильнее так:

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

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

Axel

#7
Для: 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.

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

Gor

Well-known member
07.06.2005
517
1
#8
Для: Axel
Способ хороший но в моём случае не пройдёт(
Set notesViewEntryCollection = notesView.AllEntries
не понимает( сервер 5.0 вываливает ошибку
 
A

Axel

#9
Для: Gor

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

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

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

Gor

Well-known member
07.06.2005
517
1
#10
Для: Axel
Мда. В 5-ке такого класса няма....

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

А еще лучше переходите на 7-ку. 7.0.1FP1 нормально работает.
Уже переделал... но агент по шедуллеру всё равно не отрабатывается оставляет только один док...
а в ручную всё пашет... уже не знаю чего и делать...
всё уже перепробовал...
если закоментарить работу с файлом доки он пустые создаёт по шедуллеру, а как толлько раскоментаришь так пустая вьюха..
не знаю как и справиться!!!
по логу вот чего :
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-ку не разрешает...
придерживаются главной заповеди типа всё работает значит всё хорошо и лучше ничего не трогать)
 
O

oshmianski

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

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%.

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

Код:
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%
 

Gor

Well-known member
07.06.2005
517
1
#12
Для: oshmianski
да оченнь интересно...
это надо проверить ок хоть какая то зацепка...спс

я сейчас пытаюсь обрубить концы ещё откуда всё это идёт
вот написал такой агентик! чтобы немного смоделировать ситуацию...а также упростить
Код:
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) итд итп
и агент отработается по шедуллеру....
ЧТО ЭТО??????!!!!!!! ЛОТУС ПО РАСПИСАНИЮ ДО ФАЙЛА ДОБРАТЬСЯ НЕ МОЖЕТ И ОБОЙТИ ВСЁ ПО АЛГОРИТМУ?!
ИЛИ Я ЧЕГО ТО не знаю?....
 
A
#14
Для: Gor

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

Do Until Eof(1) итд итп
и агент отработается по шедуллеру....
ЧТО ЭТО??????!!!!!!! ЛОТУС ПО РАСПИСАНИЮ ДО ФАЙЛА ДОБРАТЬСЯ НЕ МОЖЕТ И ОБОЙТИ ВСЁ ПО АЛГОРИТМУ?!
ИЛИ Я ЧЕГО ТО не знаю?....
Такое чуйство, что у агента, когда он запускается на сервере не хватает правей на файловые операции. Проверь, разрешены ли агенту Restricted действия. Опять же проверь, что подписывающий агента человек прописан в серверном документе на разрешение запуска агентов с Restricted действиями.
 
O

oshmianski

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

Gor

Well-known member
07.06.2005
517
1
#16
Для: Axel
всё проверил... с этим всё нормально...права есть
Для: oshmianski
запускается как сервис...

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

oshmianski

#17
Для: Axel
всё проверил... с этим всё нормально...права есть
Для: oshmianski
запускается как сервис...

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

Gor

Well-known member
07.06.2005
517
1
#18
разобрался!!
в .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