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

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

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

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

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

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

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

Kron

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

allex

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

Kron

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

Вот что смог, но не работает где глюк не понятно
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

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
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
 
K

Kron

как в агенте это будет выглядеть?
 
X

Xalet


я так понимаю м(н) надо по 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

Green Team
11.04.2006
137
1
BIT
4
даю бесценный совет ;)

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

Kron

;) так и сделал, уже с агентом наплясался
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ну а можно воспользоваться функцией Rnd(4000) и четырьмя коллекциями.
Первая - основная, в которой будут все документы контор.
в остальные три будут для манагеров.
При добавлении конторы одному из манагеров - удалять ее из общего списка.
Добавлять конечно в цикле. можно попробовать в одном ( сразу для трех манагеров) а можно в трех разных
 
X

Xalet

Код:
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 851
27
BIT
0
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
 
A

alb

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 851
27
BIT
0
согласен.... только из 4000 надо распределить 3300 ... ну по крайней мере я так понял
Код:
i=i+1
if i=4 then i=1
это как-то не серьезно ИМХО
 

NickProstoNick

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

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

Xalet

1. вопрос. Почему цикл до 3300. Т.е. заведомо откидывается 700 контор? в условии такого небыло
по условию так

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

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

Omh

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

Medevic

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

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

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