Выборочное удаление

PaKo

Well-known member
29.04.2005
59
0
#1
Есть вид, в нем документы созданные по 3-м формам. Пользователь может удалить только один тип документа.
Как в querydocumentdelete удалить то что надо и запретить то что удалять нельзя?

Код:
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
If Source.Documents.Count=0 Then
Exit sub
End If

Dim doc As NotesDocument
Set doc=Source.Documents.Getfirstdocument()
While Not doc Is Nothing
If doc.form(0)="Problem" Then
Continue = True
Else
Continue = False
End If
Print doc.form(0)
Set doc=source.Documents.Getnextdocument(doc)
Wend
End Sub
Вот мой код, но при таком раскладе удаляются все доки что выделены.
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
Попробуйте так:
Код:
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim nextDoc As NotesDocument

Set docs = Source.Documents
Set doc = docs.Getfirstdocument()

Do Until doc Is Nothing
Set nextDoc = docs.Getnextdocument(doc)
If doc.form(0)="Problem" Then
'Continue = True
Else
docs.DeleteDocument(doc) 'удаляем из коллекции удаляемых
End If
Print doc.form(0)
Set doc = nextDoc
Loop
End Sub
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#3
nvy
главное сверху написать
Continue = false ' блокируем лотусиное удаление ВООБЩЕ :facepalm:
 

PaKo

Well-known member
29.04.2005
59
0
#5
ToxaRat
Ну это само собой.


Добавлено: Вообщем попробовал предложенный вариант. Вот код:
Код:
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
Continue=False
Dim docs As NotesDocumentCollection
Dim doc As NotesDocument
Dim nextDoc As NotesDocument

Set docs = Source.Documents
Set doc = docs.Getfirstdocument()

Do Until doc Is Nothing
Set nextDoc = docs.Getnextdocument(doc)
If doc.form(0)="Problem" Then
'Continue = True
Else
Call docs.Deletedocument(doc) 'удаляем из коллекции удаляемых
End If
Print doc.form(0)
Set doc = nextDoc
Loop
Continue=True
End Sub
Все равно удаляются все доки. Если в конце не вставить Continue=True то ничего не происходит.

Upd.
Заменил Continue=True на docs.Removeall(True) и все заработало.
 

hosm

* so what *
18.05.2009
2 442
6
#6
вместо Continue=True
call docs.RemoveAll(True)
упс, не заметила, пока пыталась перелогиниться, что уже дописали :facepalm:
 

nvyush

Lotus team
22.04.2009
2 317
0
#8
Обходится лёгким движением левой задней ноги юзера
Далеко не каждый юзер знает, что такое отладчик, да ещё может юзать его "левой задней ногой". С другой стороны, что мешает скрыть дизайн рабочей базы?
 

nvyush

Lotus team
22.04.2009
2 317
0
#10
Это он о том, как правильно - а не как можно
Поделитесь сакральными знаниями, как правильно.
Я использую вариации на тему вышеприведённого кода (только у пользователей в ТУД сброшена галка удаления, и документы только помечаются удалёнными).
 

rinsk

Lotus team
12.11.2009
900
44
#11
Поделитесь сакральными знаниями, как правильно.
Я использую вариации на тему вышеприведённого кода (только у пользователей в ТУД сброшена галка удаления, и документы только помечаются удалёнными).
Дак сами и озвучили эти сакральные знания:D только бы я их поменял местами - "в ТУД сброшена галка удаления" + "вариации на тему вышеприведённого кода"
 
30.05.2006
1 345
11
#12
Далеко не каждый юзер знает, что такое отладчик, да ещё может юзать его "левой задней ногой". С другой стороны, что мешает скрыть дизайн рабочей базы?
Зачем отладчик?? Достаточно File->Preferenses..->ToolBar preferenses ..
 

nvyush

Lotus team
22.04.2009
2 317
0
#13
Достаточно File->Preferenses..->ToolBar preferenses ..
Если я правильно понял, это намёк на SmartButton? Проверять лень, но мне помнится, что там допустимы только дог-формулы, а разве @Command([MoveToTrash]) или @Command([EditClear]) обходят Querydocumentdelete?
 

hosm

* so what *
18.05.2009
2 442
6
#14
могу ошибаться, но вроде Simple Action "Delete document" забивает на Querydocumentdelete.
 

nvyush

Lotus team
22.04.2009
2 317
0
#15
могу ошибаться, но вроде Simple Action "Delete document" забивает на Querydocumentdelete.
Что-то я не нашёл возможности использовать в "умных кнопках" простые действия (клиент 8.0.Х). А давать простым пользователям права на создание агентов считаю непозволительной роскошью ;) .
 
30.05.2006
1 345
11
#16
Если я правильно понял, это намёк на SmartButton? Проверять лень, но мне помнится, что там допустимы только дог-формулы, а разве @Command([MoveToTrash]) или @Command([EditClear]) обходят Querydocumentdelete?
Там допустима формула FIELD any:=@DeleteDocument
 

nvyush

Lotus team
22.04.2009
2 317
0
#17
Там допустима формула FIELD any:=@DeleteDocument
Это да. Но речь-то шла об удалении документов, а не о редактировании. А что касается @SetField(), то можно, конечно, не давать на документы авторских прав вообще, а все обновления производить серверными агентами, только нужно адекватно оценивать угрозы и выбирать способы защиты. Далеко не всегда требуется возводить крепостные стены от гусей.
 
30.05.2006
1 345
11
#18
Это да. Но речь-то шла об удалении документов, а не о редактировании. А что касается @SetField(), то можно, конечно, не давать на документы авторских прав вообще, а все обновления производить серверными агентами, только нужно адекватно оценивать угрозы и выбирать способы защиты
Это "редактирование" и есть удаление. Защищать от него отъёмом авторских прав - это как раз возведение китайских стен. Адекватная мера - галка "Удаление" в ACL (как тут уже говорилось)
 

nvyush

Lotus team
22.04.2009
2 317
0
#19
Это "редактирование" и есть удаление.
Извиняюсь, спутал "FIELD any:=@DeleteDocument" с "FIELD any:= @DeleteField" (таким способом можно поудалять все поля в документе, потому я и завёл речь о правах автора на документ).
Что касается @DeleteDocument, то в соответствии со справкой дизайнера "This function works only in agents". Недоверяя справке, проверил формулу "FIELD any:=@DeleteDocument" в "умной кнопке" — не работает (клиент 8.0.Х). Формулы "@Command([EditClear])" и "@Command([MoveToTrash])" в "умной кнопке" работают, но не обходят Querydocumentdelete, т.е. если скрыть дизайн, даже отладчик не поможет обойти запрет удаления.
 
13.03.2009
625
1
#20
т.е. если скрыть дизайн, даже отладчик не поможет обойти запрет удаления.
не смартбаттонами едиными: например от агента в локальной базе защиты все равно нету...
а вызов агента можно уже и на смартбаттон вешать :)