Агент расспределения

  • Автор темы Kron
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kron

#1
Суть в чем, есть 4000 контор по алфавиту, в каждой есть поле AgentPressaSalesManager (оно пустое), есть 3 Менегера (Менеджер 1, МЕнеджер 2, Менеджер 3) среди них нужно распределить конторы по 1100 каждому, какие есть варианты?
 
A

allex

#2
Перебрать 3300 контор и напрмер, по порядку , распределить
for i =1 to 1100
if i = 1100 then
for i =1101 to 2200
 
K

Kron

#3
получится по порядку нужно в случайном порядке

Вот что смог, но не работает где глюк не понятно
Sub Click(Source As Button)
Dim ns As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim s(3) As String
Dim m(3) As Integer
Dim i As Integer
Dim j As Integer
Dim b As Boolean

b=False
m(1)=1
m(2)=2
m(3)=3
s(1)="Киров 4"
s(2)="Киров 5"
s(3)="Киров 6"
Randomize
Set db=ns.CurrentDatabase
Set view=db.GetView("Деловая Пресса\Отдел подписки\Менеджеры\деление")
Set doc=view.GetFirstDocument

While (Not (doc Is Nothing)) And (j<1000)
While (Not ;)
i=3-Round(Rnd(1)*2,0)
If m(i)>0 Then
Call doc.ReplaceItemValue("AgentPressaSalesManager" ,"0")
Call doc.Save(True,True)
m(i)=m(i)-1
b=True
End If
Wend
If (m(1)>0) Or (m(2)>0) Or (m(3)>0) Then
b=False
End If

Set doc=view.GetNextDocument(doc)
j=j+1
Print j
Wend
Print Cstr(m(1))+" "+Cstr(m(2))+" "+Cstr(m(3))
Print "End"
End Sub
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#4
;)
Код:
For i = 1 To 3300 Step 3
Next

For i = 2 To 3300 Step 3
Next

For i = 3 To 3300 Step 3
Next
 

Xalet

Well-known member
08.08.2008
410
0
#6
я так понимаю м(н) надо по 1100 присвоить изначально? не? j вообще непонятно зачем 1100.

Call doc.ReplaceItemValue("AgentPressaSalesManager" ,"0")
вроде как по логике:
Call doc.ReplaceItemValue("AgentPressaSalesManager" , s(i))


For i = 1 To 3300 Step 3NextFor i = 2 To 3300 Step 3NextFor i = 3 To 3300 Step 3Next
а так тоже по очереди получится =)

for i=0 to 1099
m(i*3+1)="1"
m(i*3+2)="2"
m(i*3+3)="3"
next
 

Murtas

Lotus team
11.04.2006
128
0
#8
даю бесценный совет ;)

отсортируй документы по UNID и раздай их затем по-порядку
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#10
Ну а можно воспользоваться функцией Rnd(4000) и четырьмя коллекциями.
Первая - основная, в которой будут все документы контор.
в остальные три будут для манагеров.
При добавлении конторы одному из манагеров - удалять ее из общего списка.
Добавлять конечно в цикле. можно попробовать в одном ( сразу для трех манагеров) а можно в трех разных
 

Xalet

Well-known member
08.08.2008
410
0
#11
Код:
Sub Click(Source As Button)
Dim ns As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim s(3) As String
Dim m(3) As Integer
Dim i As Integer
Dim j As Integer
Dim b As Boolean

b=False
m(1)=1100
m(2)=1100
m(3)=1100
s(1)="Киров 4"
s(2)="Киров 5"
s(3)="Киров 6"

Randomize
Set db=ns.CurrentDatabase
Set view=db.GetView("Деловая Пресса\Отдел подписки\Менеджеры\деление")

Set doc=view.GetFirstDocument

While (Not (doc Is Nothing)) And (j<3300)

b=false
While (Not b)
i=((Round(Rnd(),1))*10 mod 3)+1
If m(i)>0 Then
Call doc.ReplaceItemValue("AgentPressaSalesManager" ,s(i))
Call doc.Save(True,True)
m(i)=m(i)-1
b=True
End If
Wend

Set doc=view.GetNextDocument(doc)
j=j+1

If (m(1)>0) Or (m(2)>0) Or (m(3)>0) Then
Exit Sub
End If

Wend

End Sub
подправил твой вариант
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#12
1. вопрос. Почему цикл до 3300. Т.е. заведомо откидывается 700 контор? в условии такого небыло
2. Почему Set doc=view.GetNextDocument(doc) ? Вчем тогда случайность выбора? Случайный выбор манагеров как не сильно серьезно

Все же предлагаю дель рендом контор. Тлько немного условие поменять.

i = 4000

Цикл до тех пор пока кул-во доков в коллекции больше 700

j = Rnd( i )

далее берем j-й документ из общей коллекции, указіваем нужного манагера и удаляем его из коллекции.
далее i = i -1 потом снова j = Rnd( i )... берем документ и указываем второго манагера.... опять же не забываем удалять из коллекции
То же самое для третьего.
Ну а потом на начало цикла

кстати... вот такой метод Call doc.ReplaceItemValue("AgentPressaSalesManager" ,s(i)) медленней по произподительности чем doc.AgentPressaSalesManager = s(i)

Думаю можно сделать что-то подобное
Код:
	Dim ns As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim s(3) As String
Dim i As Integer
Dim j As Integer

Dim DocCol As NotesDocumentCollection

s(1)="Киров 4"
s(2)="Киров 5"
s(3)="Киров 6"

Randomize
Set db=ns.CurrentDatabase
Set view=db.GetView("Деловая Пресса\Отдел подписки\Менеджеры\деление")

Set DocCol = view.GetAllDocumentsByKey( "1", True )	' Тут автор сам уточнит условие отбора
Set doc=view.GetFirstDocument

i = DocCol.Count	' или i = 4000 автору должно быть виднее
While DocCol.Count >700

For j = 1 To 3
Set doc = DocCol.GetNthDocument( Rnd( i ) )

If Not doc Is Nothing Then
doc.AgentPressaSalesManager = s( j )
i = i - 1
Call DocCol.DeleteDocument( doc )
End If

Next

Wend
 

alb

Well-known member
13.07.2005
212
0
#13
Randomize
i=1
while coldoc.count>1
Set doc = coldoc.GetNthDocument( Rnd( coldoc.count) )
doc.AgentPressaSalesManager = m( i )
call doc.save(true,true)
call coldoc.DeleteDocument( doc )
i=i+1
if i=4 then i=1
wend
doc.AgentPressaSalesManager = m( i )
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#14
согласен.... только из 4000 надо распределить 3300 ... ну по крайней мере я так понял
Код:
i=i+1
if i=4 then i=1
это как-то не серьезно ИМХО
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#16
Ну а если подумать?
Call это уже вызов внешнего метода/процедуры
doc.AgentPressaSalesManager = s(i) - а тут ничего не вызывается

Но согласен, на маленьких циклах и изменении одного поля это не существенно
 

Xalet

Well-known member
08.08.2008
410
0
#17
1. вопрос. Почему цикл до 3300. Т.е. заведомо откидывается 700 контор? в условии такого небыло
по условию так

2. Почему Set doc=view.GetNextDocument(doc) ? Вчем тогда случайность выбора? Случайный выбор манагеров как не сильно серьезно
Случайно выбирается мэнеджер. Да и если вьюшка отсортирована не по названиям, то конторы будут в произвольном порядке.

З.Ы. Идея алгоритма же не моя. Я подправил то, что крон напрогил.
 

Omh

Lotus team
04.07.2007
2 210
1
#18
NickProstoNick
Да ну, в случае dot-notation теоретически надо сначала перебрать не указываешь ли ты property NotesDocument'a и только потом писать в поле.
А методом ReplaceItemValue мы чётко указываем, что надо заменять значение поля.
Я когда-то проверял, и насколько я помню, ReplaceItemValue был чуть быстрее.
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#20
Ну а если подумать?
Call это уже вызов внешнего метода/процедуры
doc.AgentPressaSalesManager = s(i) - а тут ничего не вызывается
С чего ты решил, что ничего не вызывается? :D

Omh
Я сейчас тоже проверил. 100000 итераций(на большее время не хотелось тратить). Разницы не увидел. Отклонения в пределах погрешности.
 
Статус
Закрыто для дальнейших ответов.