• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

.getitem = "" ?!

  • Автор темы Mitya
  • Дата начала
M

Mitya

Добрый день.
Ситуация такова:
1) было поле "dep" редактируемое текстовое поле
2) сменил тип "поле со списком" - значение берет по формуле из "справочника"

Если в "справочнике” нет значения - поле вроде пустое, но в свойствах документа я вижу старое значение!
Вопрос в том, как это значение определить?!?!
Пробую так: (Но выводит "")!
Sub Click(Source As Button)
Dim item As NotesItem
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument

Dim session As NotesSession
Dim curdb As NotesDatabase
Dim curdoc As NotesDocument

Set session = New NotesSession
Set curdb = session.CurrentDatabase
Set curdoc = uidoc.Document

subj=curdoc.GetItemValue("dep")
Msgbox(subj(0))
End Sub
Спасибо.
 
M

morpheus

Если в "справочнике” нет значения - поле вроде пустое, но в свойствах документа я вижу старое значение!
документ надо "пересчитать" например computewithform

приведённый код - всё лишнее кроме

Код:
Sub Click(Source As Button)

Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set curdoc = uidoc.Document

subj=curdoc.GetItemValue("dep")
Msgbox(subj(0)) 
End Sub
 
M

Mitya

документ надо "пересчитать" например computewithform

Спасибо. Но, не получается
Делаю так:
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set curdoc = uidoc.Document
If curdoc.ComputeWithForm(False, False) Then
subj=curdoc.GetItemValue("dep")
Msgbox(subj(0))
End If
End Sub
Выдает пустое сообщение.
Заметил, что в открытом документе в свойстве документа поле dep имеет значение, как только я жму на кнопку поле "dep" становится пустым.

Может я не понял смысл этого метода =(
 
H

hosm

в чем задача-то, какое значение надо вычислить, т.е. что надо вообще в принципе - получить и всегда отображать старое непустое значение у документа, затереть старое пустым или каким-то другим значением?
Или, может, надо найти все документы, которые содержат значения, не соответствующие формуле или получить список таких значений?
Вам предложили метод, который пересчитает некоторые поля в документе согласно формулам на вашей форме, потом документ можно(нужно) сохранить.
Если не это надо, а надо получить старое значение, которое хранится в поле, то попробуйте не открывать документ по форме, т.е. полностью убрать работу с UI-документом, получить NotesDocument по-другому (в агенте или кнопке в представлении) и считать значение поля.
Вот варианты как получить NotesDocument в порядке приоритетов использования:
1) взять этот "странный" документ из базы (для текущей БД можно использовать переменную curdb)
- по его unid - NotesDatabase.GetDocumentByUnid(unid),
- или по его noteid - NotesDatabase.GetDocumentByid(noteid),
2) или, может, удобней из какого-то представления (например, если надо обработать несколько таких документов, отмеченных галочкой в представлени)
- курсорный - NotesDatabase.GetDocumentByid(NotesUIView.CaretNoteID)
- или отмеченный галочкой - NotesUIView.Documents.GetFirstDocument
3) поискать документ в базе по значению поля - NotesDatabase.Search, оно ж там как-то видно в свойствах :)
Затем можно посмотреть значение поля и как-то обработать (записать в другое поле, которое не будет пересчитываться при открытии документа и отображать его на форме, если формула из справочника вернет пустоту или заменить значение в поле на другое, которое будет в справочнике) и сохранить документ.
Может, будет проще подкорректировать формулу?
 
M

Mitya

OKEN, спасибо большое!!! Ну очень много советов, прям не знаю что лучше.
Расскажу с самого начала:
Создал форму с полями (тип: текстовые, редактируемые), туда перегнал данные из Excel. Получилось более 2 000 документов.
! В документах есть поля, которые должны иметь строго определенные значения. Вот я эти поля и перевел «поля со списком». Где-то они стали видны, т.к. такое значение есть в «Справочнике», а где-то нет (что меня беспокоит =)) )
Идея была такова: cделать акцию на форме документа, которая вызывала в DialogBox-e копию формы документа, со старыми значениями полей. Где была бы возможность выбора новых значений из «Справочников». И потом DialogBox передал бы эти значения текущему документу.
Как-то так =).
Идея с представлениями меня радует! Что даст возможность обработать не один документ, а коллекцию документов!!! Тока как сделать… «пошел в Библиотеку»

@DbLookup(””:”NoCache”;@DbName;"list";"Адреса";2) - формула выбора из "Справочника"
 
M

Mitya

А вот как теперь открыть докумен в режиме ред.?!

2) или, может, удобней из какого-то представления (например, если надо обработать несколько таких документов, отмеченных галочкой в представлени)
- курсорный - NotesDatabase.GetDocumentByid(NotesUIView.CaretNoteID)
- или отмеченный галочкой - NotesUIView.Documents.GetFirstDocument

Повесил на представление акцию:
Sub Click(Source As Button)
Dim ws As New NotesUIWorkspace
Dim uiview As NotesUIView
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim subj As Variant
Set uiview = ws.CurrentView
Set dc = uiview.Documents
Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
Call doc.AppendItemValue("net","123")
Set doc = dc.GetNextDocument(doc)
Wend
End Sub

Понимаю, что поле "net" со значением 123 не прописалось, т.к. документы открыты не в редактировании.
Делаю так: Call ws.EditDocument (True) - ошибка "Object variable not set"
А как их открыть? метода я такого не нашел...
Спасибо.
 
T

turumbay

Понимаю, что поле "net" со значением 123 не прописалось, т.к. документы открыты не в редактировании.
поле не прописалось, потому что не сохранили документ. Добавьте Call doc.Save(false, false ) и будет вам щастье.
P.S. Подозреваю также, что вместо AppendItemValue нужно использовать ReplaceItemValue - иначе есть шанс получить два одноименных поля в документе
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!