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

Тема в разделе "Lotus - Программирование", создана пользователем PaKo, 13 апр 2011.

  1. PaKo

    PaKo Well-Known Member

    Регистрация:
    29 апр 2005
    Сообщения:
    59
    Симпатии:
    0
    Есть вид, в нем документы созданные по 3-м формам. Пользователь может удалить только один тип документа.
    Как в querydocumentdelete удалить то что надо и запретить то что удалять нельзя?

    Код (LotusScript):
    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
    Вот мой код, но при таком раскладе удаляются все доки что выделены.
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Попробуйте так:
    Код (LotusScript):
    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
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    nvy
    главное сверху написать
    Continue = false ' блокируем лотусиное удаление ВООБЩЕ :facepalm:
     
  4. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Уточнение: ВООБЩЕ - лотусиное удаление блокируется только через ACL :facepalm:
     
  5. PaKo

    PaKo Well-Known Member

    Регистрация:
    29 апр 2005
    Сообщения:
    59
    Симпатии:
    0
    ToxaRat
    Ну это само собой.


    Добавлено: Вообщем попробовал предложенный вариант. Вот код:
    Код (LotusScript):
    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) и все заработало.
     
  6. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    вместо Continue=True
    call docs.RemoveAll(True)
    упс, не заметила, пока пыталась перелогиниться, что уже дописали :facepalm:
     
  7. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Querydocumentdelete - интерфейсный бантик.

    Обходится лёгким движением левой задней ноги юзера
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Далеко не каждый юзер знает, что такое отладчик, да ещё может юзать его "левой задней ногой". С другой стороны, что мешает скрыть дизайн рабочей базы?
     
  9. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    не... Это он о том, как правильно - а не как можно:D
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Поделитесь сакральными знаниями, как правильно.
    Я использую вариации на тему вышеприведённого кода (только у пользователей в ТУД сброшена галка удаления, и документы только помечаются удалёнными).
     
  11. rinsk

    rinsk Lotus team
    Lotus team

    Регистрация:
    12 ноя 2009
    Сообщения:
    797
    Симпатии:
    78
    Дак сами и озвучили эти сакральные знания:D только бы я их поменял местами - "в ТУД сброшена галка удаления" + "вариации на тему вышеприведённого кода"
     
  12. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Зачем отладчик?? Достаточно File->Preferenses..->ToolBar preferenses ..
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Если я правильно понял, это намёк на SmartButton? Проверять лень, но мне помнится, что там допустимы только дог-формулы, а разве @Command([MoveToTrash]) или @Command([EditClear]) обходят Querydocumentdelete?
     
  14. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    могу ошибаться, но вроде Simple Action "Delete document" забивает на Querydocumentdelete.
     
  15. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Что-то я не нашёл возможности использовать в "умных кнопках" простые действия (клиент 8.0.Х). А давать простым пользователям права на создание агентов считаю непозволительной роскошью ;) .
     
  16. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Там допустима формула FIELD any:=@DeleteDocument
     
  17. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Это да. Но речь-то шла об удалении документов, а не о редактировании. А что касается @SetField(), то можно, конечно, не давать на документы авторских прав вообще, а все обновления производить серверными агентами, только нужно адекватно оценивать угрозы и выбирать способы защиты. Далеко не всегда требуется возводить крепостные стены от гусей.
     
  18. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Это "редактирование" и есть удаление. Защищать от него отъёмом авторских прав - это как раз возведение китайских стен. Адекватная мера - галка "Удаление" в ACL (как тут уже говорилось)
     
  19. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Извиняюсь, спутал "FIELD any:=@DeleteDocument" с "FIELD any:= @DeleteField" (таким способом можно поудалять все поля в документе, потому я и завёл речь о правах автора на документ).
    Что касается @DeleteDocument, то в соответствии со справкой дизайнера "This function works only in agents". Недоверяя справке, проверил формулу "FIELD any:=@DeleteDocument" в "умной кнопке" — не работает (клиент 8.0.Х). Формулы "@Command([EditClear])" и "@Command([MoveToTrash])" в "умной кнопке" работают, но не обходят Querydocumentdelete, т.е. если скрыть дизайн, даже отладчик не поможет обойти запрет удаления.
     
  20. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    не смартбаттонами едиными: например от агента в локальной базе защиты все равно нету...
    а вызов агента можно уже и на смартбаттон вешать :)
     
Загрузка...

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