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

Тема в разделе "Lotus - Программирование", создана пользователем Kron, 21 апр 2009.

Статус темы:
Закрыта.
  1. Kron

    Kron Гость

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

    allex Гость

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

    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
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    ;)
    Код (Text):
    For i = 1 To 3300 Step 3
    Next

    For i = 2 To 3300 Step 3
    Next

    For i = 3 To 3300 Step 3
    Next
     
  5. Kron

    Kron Гость

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

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    я так понимаю м(н) надо по 1100 присвоить изначально? не? j вообще непонятно зачем 1100.

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


    а так тоже по очереди получится =)

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Так, например.
    Код (Text):
    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
    Это если Кировы менеджеры. ;)
     
  8. Murtas

    Murtas Well-Known Member

    Регистрация:
    11 апр 2006
    Сообщения:
    123
    Симпатии:
    0
    даю бесценный совет ;)

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

    Kron Гость

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну а можно воспользоваться функцией Rnd(4000) и четырьмя коллекциями.
    Первая - основная, в которой будут все документы контор.
    в остальные три будут для манагеров.
    При добавлении конторы одному из манагеров - удалять ее из общего списка.
    Добавлять конечно в цикле. можно попробовать в одном ( сразу для трех манагеров) а можно в трех разных
     
  11. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    Код (Text):
    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
    подправил твой вариант
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    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)

    Думаю можно сделать что-то подобное
    Код (Text):
        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
     
  13. alb

    alb Well-Known Member

    Регистрация:
    13 июл 2005
    Сообщения:
    212
    Симпатии:
    0
    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 )
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    согласен.... только из 4000 надо распределить 3300 ... ну по крайней мере я так понял
    Код (Text):
    i=i+1
    if i=4 then i=1
    это как-то не серьезно ИМХО
     
  15. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Интересно, кто-нибудь проверял?
     
  16. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Ну а если подумать?
    Call это уже вызов внешнего метода/процедуры
    doc.AgentPressaSalesManager = s(i) - а тут ничего не вызывается

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

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    по условию так

    Случайно выбирается мэнеджер. Да и если вьюшка отсортирована не по названиям, то конторы будут в произвольном порядке.

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    NickProstoNick
    Да ну, в случае dot-notation теоретически надо сначала перебрать не указываешь ли ты property NotesDocument'a и только потом писать в поле.
    А методом ReplaceItemValue мы чётко указываем, что надо заменять значение поля.
    Я когда-то проверял, и насколько я помню, ReplaceItemValue был чуть быстрее.
     
  19. Xalet

    Xalet Well-Known Member

    Регистрация:
    8 авг 2008
    Сообщения:
    410
    Симпатии:
    0
    А второй способ с ричтекст филдами работает? Вроде не особо. А Крон не указал тип поля.
     
  20. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    С чего ты решил, что ничего не вызывается? :D

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

Поделиться этой страницей