• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Россыпь мелких вопросов

  • Автор темы Vagor.ini
  • Дата начала
G

Gogan.exe

Смысл в том, что часть документа заполняется и отправляется в базу. Из базы ее достает другой человек и заполняет свою часть… и так далее. Вообще-то читать им можно. Только вот разрешение дать только на дополнение, а не изменение. Как это реализовать… я еще совсем в лотусе не разобрался… пытался через сабформы, но ничего не понял.
 
G

Gogan.exe

Хм… я тут подумал, ясно, что документ нужно как-то разбивать на составляющие (к примеру, мне нужно автоматически фиксировать дату изменения документа каждым лицом), но как? Кто мне сможет помочь? И все еще остается открытым вопрос о фиксации порядковости созданного документа. Как подсчитать количество документов в базе и присвоить полю значение +1?
Спасибо.
 
G

Gogan.exe

Creates a controlled access section on a form or subform. Unlike a regular section, a controlled access section has a formula to determine who can edit it.
Вот что я отыскал в хелпе (RTFM блин). Как выглядит формула доступа? Как фиксировать дату последнего изменения _именно этой части (секции)_? Возможно ли это?
 
I

Isk

Gogan.exeПримерно половина тех кто посещает форум задается такими же вопросами. Ты прав, ты в цикле перебираешь все документы в бд. Но тебе, я как понимаю, нужно посчитать
количество документов, созданных только по определенной форме. Это сужает выборку.
Таким образом:


Код
Set collection = db.Searh("Form=""имя_формы""", Nothing, 0)


далее пребираешь один за другим документы из коллекции и формируешь нужные тебе счетчики...

Можно сделать еще лучше и проще:


Код
Set collection = db.Searh("Form=""имя_формы"" & bdname_1 = ""obr""", Nothing, 0)
Ovar = collection.Count

Set collection = db.Searh("Form=""имя_формы"" & bdname_1 = ""vhod""", Nothing, 0)
Vvar = collection.Count

... и т.д.

Это писали здесь. Посчитать и присвоить номер док-у.
 
G

Gogan.exe

что акое bdname? что нужно еще вписать перед данными сторчками? Он у меня collection не понимает. Что такое Nothing, что такое 0.
Объясните, пожайлусто поточнее, если можно. Я в лонусе пока не рублю.
 
G

Gogan.exe

Что значит dim в начале многих строчек в коде Лотуса?
 
G

Gogan.exe

А... вроде начал разбираться... я Dim писал прямо в функциях поля, а нужно в гобале формы... Пожалуйста, в следующий раз все разъясняйте в мелочах, если не трудно, ок?
 
G

Gogan.exe

FIELD Fieldname:=Fieldmame;
Где должна стоять эта строка, почему она необходима, что в ней есть что, и зачем она вообще нужна?
 
V

Veselinka

Gogan.exe

Предложенный способ решения дает большие проблемы с производительностью, так как каждый раз происходит поиск по базе по критериям отбора указанным в формуле |Form="имя_формы" & bdname_1 = "obr"|

Стандартным решением является:
1. Постороение вьюхи, которая выберет все интересующее множество документов, к которому надо будет потом прибавлять +1 к номеру последнего. Вьюха будет индексироваться сервером по расписанию и не будет строиться в коде каждый раз снова - как это было предложено в описанном методе.
2. В предложенном методе если брать coll.count - То есть количество документов - даст сбои в случае если у меня есть документы с номерами 1,2 и 4, а с номером 3 был удален. так как кол-во документов в коллекции будет=3, то номер следующего посчитается как равный 4, а документ с таким номером у нас уже есть.

Поэтому во вьюхе мы сортируем документы по номерам например так что сверху будет документ с наибольшим номером.
3. Во вьюхе берем этот первый документ:
set doc=view.GetFirstDocument
if doc is nothing then
Index=1
else
index=doc.index(0)+1
end if
newdoc.index=index

- то есть если документов во вьюхе нет - то это самый первый и номер у него 1,
если документы есть то берем первый, берем его номер и прибавляем к нему 1.
далее присваиваем полученный номер новому документу. Все тривиально.
Если есть вопросы по синтаксису - читай хэлп. Открываешь дизайнер и жмешь F1, в хэлпе заходишь в раздел index и находишь интересующую тебя конструкцию.
 
G

Gogan.exe

Что-то не понял, если мы взяли первый документ и прибавили к нему единицу, то получим два (если ничего не удалялось). Может нужно взять последний док?
 
G

Gogan.exe

Ах, что я такое говорю. Если по убыванию сортировать, то первый документ как раз будет с самым большим индексом. С этим все понятно. Буду дальше разбираться.
 
G

Gogan.exe

1)Как сказать, что newdoc – это тот документ, который только что создан (current)? или counter подразумевает, что пренадлежит к current?
2)Он мне выдает ошибку Varient does not contain an object если в списке нет ни одного документа, почему?
3)counter = doc.counter(0) +1 получаю Type mismatch. Что значит "0"?
4) Как присвоить полю типа Number полученое значение counter (Integer type)? Какую именно и где использовать формулу? Пытался и Field и SetField, но не получаеться (может не правильно пользую?).
Буду очень благодарен!
 
G

Guest

Veselinka А еще есть способы подсчета и присвоения номера?
 
V

Veselinka

Gogan.exe - похоже что ты путаешь скрипт и формулы.
То что я писала - писала на скрипте. Я не буду здесь читать курс по синтаксису скрипта - кроме того это есть в

посмотри как получить текущий документ на события формы или на кнопке если у тебя код на кнопке исполняется.

Guest - приведенный способ подсчета - один из оптимальных, однако надо понимать, что в распределенной среде он может давать сбои, так как на разных серверах может одновременно возникнуть документ с одним и тем же номером. В распределенной системе для решения задач нумерации часто используется либо сложная система построения номера , где номер зависит от места создания документа, либо номера присваиваются документам по расписанию самой системой во время минимальной активности пользователей - где-то ночью на центральном сервере, чтобы все не попавшие еще на центральный сервер документы - просто не были пронумерованы.

В нотесах нет секвенций как в РДБ, к сожалению и транзакций тоже нет, поэтому нельзя гарантировать 100% уникальность нумерации, а лишь минимальную веротяность ситуации в которой могут возникнуть дубликаты. Хотя ждите R7, подкладывайте DB2 и наслаждайтесь всеми прелестями RDBMS :ph34r:
 
G

Gogan.exe

Тот док, на который ты мне ссылку дала у меня есть.
Сейчас я все подряд путаю.
Мне дали пример БД с работающим каунтером, но там вообще не разобраться ни в чем!
Вот что я накидал в Form ->Field (Номер Документа) ->Initialize :
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim counter As Integer
Set db = session.CurrentDatabase
Set view = db.GetView("СписокДокументов")
Set doc = view.GetFirstDocument
If Isnull(doc) Then
counter = 1
Else
counter = 2
End If
counter = 3
End Sub
Правильно ли это? Каунтер =3 – это для проверки просто ну и 2 – тоже для провсерки… короче сейчас этот скрипт просто должен присвоить значение каунтеру. Как теперь сделать так, чтобы при открытии документа, в поле Номер Документа указывалось значение, хранимое в counter?
Где именно и что именно нужно написать?
Туда ли я поместил этот скрипт?
 
V

Veselinka

Запись в поле делается при открытии документа или при сохранении - правильнее делать при сохранении, чтобы уменьшить тот интервал, в который кто-то еще может создать документ и ему посчитается тот же номер.
Поэтому рассмотрим событие QuerySave формы

Сразу говорю - объекты в скирипте проверяются на IS nothing а не на Null, не внимательно значит читал документ, раз такие ошибки делаешь (см страницу 66)

Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim counter As Integer

Set db = source.document.parentDatabase

Set view = db.GetView("СписокДокументов")

Set doc = view.GetFirstDocument

If doc is nothing Then
counter = 1
Else
counter=doc.counter(0)+1
End If

source.document.counter=counter

В данном куске кода предполагается, что номер хранится в поле counter

Если повесить на открытии документа, то подойдет событие открытия формы PostOpen, только надо будет UIDocument рефрешить - call source.refresh, ну и считать надо каунтер 1 раз - когда документ новый - source.isnewdoc, не пересчитывать каждый раз при открытии.
 
G

Gogan.exe

Про null я прочитал в F1. Может, я просто не так понял. Хотя в предложенном варианте я видел, что стоит Nothing. :
“Return value
Document
The specified document. If the specified document is not in the collection, returns null. “
Так что извини.
С остальным сейчас буду разбираться. Только вот уже сейчас не ясно, как сделать так, чтобы значение counter отображалось в поле (Field) НомерЗаказа? Я пытался сделать через @SetField() Но опять же не понял куда и как это вписывать.
Спасибо.
 
G

Gogan.exe

Уа, товарищи! Считает. По всей видимости он и раньше считал, но только теперь я понял как провеить - создал столбец во View. Красиво так считает. Теперьвот как это значение присвоить полю?
 
V

Veselinka

call doc.replaceitemvalue("имя поля",значение или переменная со значением)
 
G

Gogan.exe

Чего-то не работает. Остаеться прежним. :)
 
Мы в соцсетях:

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