• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

Kron

Суть в чем, есть 4000 контор по алфавиту, в каждой есть поле AgentPressaSalesManager (оно пустое), есть 3 Менегера (Менеджер 1, МЕнеджер 2, Менеджер 3) среди них нужно распределить конторы по 1100 каждому, какие есть варианты?
 
Перебрать 3300 контор и напрмер, по порядку , распределить
for i =1 to 1100
if i = 1100 then
for i =1101 to 2200
 
получится по порядку нужно в случайном порядке

Вот что смог, но не работает где глюк не понятно
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
 
;)
Код:
For i = 1 To 3300 Step 3
Next

For i = 2 To 3300 Step 3
Next

For i = 3 To 3300 Step 3
Next
 

я так понимаю м(н) надо по 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
 
как в агенте это будет выглядеть?
Так, например.
Код:
i = 1
Set doc=view.GetFirstDocument
While Not (doc Is Nothing)
Call doc.ReplaceItemValue("AgentPressaSalesManager", s(i))
i = i + 1
If i = 4 Then i = 1
Set doc=view.GetNextDocument(doc)
Wend

Это если Кировы менеджеры. ;)
 
даю бесценный совет ;)

отсортируй документы по UNID и раздай их затем по-порядку
 
;) так и сделал, уже с агентом наплясался
 
Ну а можно воспользоваться функцией Rnd(4000) и четырьмя коллекциями.
Первая - основная, в которой будут все документы контор.
в остальные три будут для манагеров.
При добавлении конторы одному из манагеров - удалять ее из общего списка.
Добавлять конечно в цикле. можно попробовать в одном ( сразу для трех манагеров) а можно в трех разных
 
Код:
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

подправил твой вариант
 
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
 
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 )
 
согласен.... только из 4000 надо распределить 3300 ... ну по крайней мере я так понял
Код:
i=i+1
if i=4 then i=1
это как-то не серьезно ИМХО
 
Ну а если подумать?
Call это уже вызов внешнего метода/процедуры
doc.AgentPressaSalesManager = s(i) - а тут ничего не вызывается

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

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

З.Ы. Идея алгоритма же не моя. Я подправил то, что крон напрогил.
 
NickProstoNick
Да ну, в случае dot-notation теоретически надо сначала перебрать не указываешь ли ты property NotesDocument'a и только потом писать в поле.
А методом ReplaceItemValue мы чётко указываем, что надо заменять значение поля.
Я когда-то проверял, и насколько я помню, ReplaceItemValue был чуть быстрее.
 
Ну а если подумать?
Call это уже вызов внешнего метода/процедуры
doc.AgentPressaSalesManager = s(i) - а тут ничего не вызывается
С чего ты решил, что ничего не вызывается? :D

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

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