Автоматический номер

  • Автор темы Автор темы 1KIA
  • Дата начала Дата начала
на QuerySave

If Source.IsNewDoc Then
Dim db As NotesDatabase
Dim view As NotesView
Set db = session.CurrentDatabase
Set view = db.GetView( "number" )
Set doc = view.GetFirstDocument
If Not(doc Is Nothing) Then
Set item = doc.GetFirstItem( "nn" )
doc.nm= Int(item.Text )+1
Call doc.save(True,True)
End If


почему он здесь не проверяется, вот если 1чел уже сохранил, то 2-й по идее должен сохранять +1 номер

Код:
 If Source.IsNewDoc Then
Dim db As NotesDatabase
Dim view As NotesView
Set db = session.CurrentDatabase
Set view = db.GetView( "number" )
Set doc = view.GetFirstDocument
If Not(doc Is Nothing) Then 
Set item = doc.GetFirstItem( "nn" )
doc.nm= Int(item.Text )+1
Call Source.FieldSetText("Number",item.Text ) 
End If

или вы хотите номер в другом документе изменить?

Да и вообще. Если номер должен быть виден, то для чего-то. Скажем для того, чтобы распечатать... И что будет, если он будет распечатан, а потом изменен?

И что есть поле Number, а что nm?
 
Что где надо поменять? не понятно логики... вы объясните, что делаете и что надо...
на QueryOpen: берете из вьюхи 1й док (это вы завели документ-нумератор?), считываете у него поле nn и записываете увеличенное на 1 значение в другое поле nm этого же дока из вьюхи. Документ из вьюхи НЕ сохраняется. текст итема nn (не увеличенный) записывается в текущий док...
Set item = doc.GetFirstItem( "nn" )
doc.nm= Int(item.Text )+1
Call Source.FieldSetText("Number",item.Text )
Где и как nn меняется? В чем смысл nm, где оно проверяется?
на QuerySave:
Set item = doc.GetFirstItem( "nn" )
doc.nm= Int(item.Text )+1
Call doc.save(True,True)
Какие-то совсем хитрые манипуляции: берете из вьюхи 1й док, считываете у него поле nn и записываете увеличенное на 1 значение в другое поле nm этого же дока из вьюхи. Документ из вьюхи теперь сохраняется.
с Source (текущим открытым документом) тут никаких манипуляций не производится, меняется только документ из вьюхи (и то, не то поле, которое считывается).
 
Как документ создаёте? Если notesUIWorkspace.ComposeDocument() или @Command([Compose]; ...), то проверка должна правильно работать, если
Set doc = db.CreateDocument
notesUIWorkspace.EditDocument(true, doc)
то работать НЕ будет, т.к. в этом случае Source.IsNewDoc вернёт False. В этом случае нужно проверять Source.Document.IsNewNote
 
OKEN
да я уже и сама понимаю, что бред выходит
Надо:
1. пользователь открывает док, видит начальные цифры, например 12 (которые и надо сделать счетчиком). Печатать он не может до сохранения.
2. Сам же пользователь вручную (в другом поле) вводит вторую часть номера, которую и надо будет добавить к счетчику, например 12/7777
3. Закрывается документ после сохранения, в этот момент необходимо опять проверить, что никто в этот момент уже не сохранил док, с таким же номером. Если есть документ с номером 12, то этот документ становится 13/7777
 
не
Код:
If Source.IsNewDoc Then
не
Код:
If Source.Document.IsNewNote Then
не помогают... при сохранении от разных пользователей создается док с одинаковыми номерами
понимаю, что скорее всего в этой части необходимо проверять, но не могу понять как:
Код:
		Set db = session.CurrentDatabase
Set view = db.GetView( "number" )
Set Doc = view.GetFirstDocument
If Not(Doc Is Nothing) Then 
Set item = Doc.GetFirstItem( "nm" )
Doc.nm= Int(item.Text )
Call doc.save(True,True)
 
Код:
Function GetNewDocN(viewName As String, defaultN As Double) As Double
'возвращает номер для вновь созданного документа из представления viewName
'требования к представлению viewName: 
'1) флаг Don't show empty categories сброшен 
'2) должна быть одна категоризованная по убыванию числовая колонка с номерами документов
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim vnav As NotesViewNavigator
Dim entry As NotesViewEntry

Set db = session.CurrentDatabase
Set view = db.GetView(viewName)
Set vnav = view.CreateViewNav()
Set entry = vnav.GetFirst
If entry Is Nothing Then
GetNewDocN = defaultN
Else
GetNewDocN = entry.ColumnValues(Ubound(entry.ColumnValues)) + 1
End If
End Function
P.S. Для нумерации в пределах года в формулу отбора представления добавить условие @Year(@Created) = @Year(@TextToTime("Today"))
 
спасибо огромнейшее
правильно ли я поняла, что на QuerySave остается
Код:
	If Source.IsNewDoc Then
Dim db As NotesDatabase
Dim view As NotesView
Set db = session.CurrentDatabase
Set view = db.GetView( "number" )
Set Doc = view.GetFirstDocument
Set item = Doc.GetFirstItem( "nm" )
Doc.nm= Int(item.Text )
' далее полученное число в nm необходимо проверь в функции GetNewDocN
чтобы и какбы я не подставляла в скобки GetNewDocN() постоянно получаю type mismatch on :huh:
 
опять вопрос - что мешает счетчиком сделать UNID?
 
опять вопрос - что мешает счетчиком сделать UNID?

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

Реализуется довольно просто. Советов в этой ветке было выше крыши.

Сложности возникают обычно когда все номерки еще и регистрируются, где не может быть так, что 2 и 4 есть, а 3 нет...
 
nvy
спасибо
теперь работает, но единственное, если по одному делать, то работает отлично, если двое сохраняют, то в "number" не добавляется значение на 1 больше, хотя в документе все правильно, а в представление не меняется
 
может, рефреш представлению сделать? вот тут дописать:
Set view = db.GetView(viewName)
call view.refresh()
 
OKEN
В оригинале для получения представления используется функция
Код:
Function GetView(view As NotesView, db As NotesDatabase, viewName As String) As NotesView
'возвращает представление с именем viewName из базы db
Set view = db.GetView(viewName)
Set GetView = view
If view Is Nothing Then Exit Function
view.AutoUpdate = False
Call view.Refresh()
End Function
 

First:=@Middle(@NoteID;9;1);
FirstN:=@TextToNumber(@If(First="A";"10";First="B";"11";First="C";"12";First="D";"13";First="E";"14";First="F";"15";First));
Second:=@Middle(@NoteID;8;1);
SecondN:=@TextToNumber(@If(Second="A";"10";Second="B";"11";Second="C";"12";Second="D";"13";Second="E";"14";Second="F";"15";Second));
Third:=@Middle(@NoteID;7;1);
ThirdN:=@TextToNumber(@If(Third="A";"10";Third="B";"11";Third="C";"12";Third="D";"13";Third="E";"14";Third="F";"15";Third));
Fourth:=@Middle(@NoteID;6;1);
FourthN:=@TextToNumber(@If(Fourth="A";"10";Fourth="B";"11";Fourth="C";"12";Fourth="D";"13";Fourth="E";"14";Fourth="F";"15";Fourth));
Fifth:=@Middle(@NoteID;5;1);
FifthN:=@TextToNumber(@If(Fifth="A";"10";Fifth="B";"11";Fifth="C";"12";Fifth="D";"13";Fifth="E";"14";Fifth="F";"15";Fifth));
Sixth:=@Middle(@NoteID;4;1);
SixthN:=@TextToNumber(@If(Sixth="A";"10";Sixth="B";"11";Sixth="C";"12";Sixth="D";"13";Sixth="E";"14";Sixth="F";"15";Sixth));
Seventh:=@Middle(@NoteID;3;1);
SeventhN:=@TextToNumber(@If(Seventh="A";"10";Seventh="B";"11";Seventh="C";"12";Seventh="D";"13";Seventh="E";"14";Seventh="F";"15";Seventh));
ID:=((SeventhN*@Power(16 ;6))+(SixthN*@Power(16 ;5))+(FifthN*@Power(16 ;4))+(FourthN*@Power(16 ;3))+(ThirdN*@Power(16 ;2))+(SecondN*@Power(16 ;1 ))+FirstN*@Power(16;0));
ID
 
lmike
Забавно. Однако этот способ применим только для баз с документами одного типа. Если имеются служебные документы, в нумерации будут "дыры". Способ не подходит для нумерации в пределах года. Короче говоря, слишком много ограничений.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab