создать масиви и сравнить дание

Тема в разделе "Lotus - Программирование", создана пользователем Cleric-Lviv, 8 июл 2010.

  1. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    всем привет
    читаю и чтото не пойму. каким образом создать два масива, заполнить их и сравнить дание в них?
    или можна ето дело както иначе провернуть?
     
  2. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Как-то иначе провернуть по сравнению с чем?
     
  3. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Вроде ж не пятница еще :) опиши задачу.
    А в чем проблема, собственно - что, массивы сильно большие получаются или долго работать будет?
    смотря как надо сравнивать, есть ли дубликаты и как их обрабатывать надо.
    Если на идентичность без учета порядка - на скрипте можно попытаться через поэлементный проход / ArrayGetIndex / ArrayReplace.
    для маленьких массивов вот еще забавный вариант c сортировкой: http://dpastov.blogspot.com/2008/01/compare-arrays.html - (думаю, на больших данных будет Operation failed), только не забывать для собак экранировать слеши и кавычки :)

    и на яве тоже можно :)
     
  4. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    TIA
    както иначе ето не через масив:))))

    OKEN
    задача:
    документ можно создать с помощю 15 шаблонов. каждий шаблон имеет свой набор документов, НО если в одном шаблоне есть доукмент-ответ с назвой "паспорт" и он стоит под 10 номером, то во всех шаблонах етот документ будет иметь 10 номер.

    теперь пользователь ошибся с вибором шаблона. нуна поменять тип шаблона. я ето делал через цикли и не получилось:(
    хочю попробовать через масив ето сделать, мисль такая:
    1. беру "плохой документ"
    2. проганяю все документи-ответи и считиваю номер + статус документа(обязательний или необязательний)
    3. ето все надобно занести в масив . назовем ево например "old collection"
    4. теперь вибераем через пиклист нужний темплейт
    5. снова проганяю документи и считиваю номер + статус документа
    6. назовем ево "new collection"
    7. берем первую запись с "new collection" и сравниваем с записями в "old collection"
    8. если есть уставливаем флаг (обязательний или необязательний)
    9. все ненужние докуи удаляем.

    кстати вот код которим я пробовал ето делать (не вишло:()
    Код (LotusScript):
    Dim ses As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument'документ який будем міняти
    Dim dcres As NotesDocumentCollection'колекція респонзів основного документу
    Dim docres As NotesDocument'респонз основного документу
    Dim doctp As NotesDocument'шаблонний документ
    Dim doctpres As NotesDocument'респонз шаблонного документу
    Dim clone As NotesDocument 'майбутній дитинський документ клієнта
    Dim dc As NotesDocumentCollection'колекція документів для зміни
    Dim dctp As NotesDocumentCollection'колекція темплейтів
    Dim dctpres As NotesDocumentCollection'колекція респонзів до темплейту
    Dim db As NotesDatabase
    Dim tp As String
    Dim tptempl As String
    Dim fm As Variant
    Dim value As String
    Dim v As String

    Set db = ses.CurrentDatabase
    Set dc = ses.CurrentDatabase.UnprocessedDocuments
    If dc.Count >0 Then
    Set doc = dc.GetFirstDocument
    While Not doc Is Nothing
    tp = doc.GetItemValue("CustomerType")(0) ' визначаєм поточний тип клієнта
    'діалог вибору, щоб визначити необхідний тип клієнта
    Set dctp = ws.PickListCollection( 3, False, db.Server,db.FilePath , "vw-customer-types", "Оберіть необхідний тип документу", "тип документу" )
    If dctp.Count > 0 Then
    Set doctp = dctp.GetFirstDocument
    tptempl = doctp.GetItemValue("Code")(0)
    Else
    Exit Sub
    End If
    Call doc.ReplaceItemValue("Code", tptempl)

    Set dctpres = doctp.Responses
    Set dcres = doc.Responses
    If dctpres.Count>0 Then
    Set doctpres = dctpres.GetFirstDocument
    While doctpres.form(0)="document"
    If doctpres.IsMandatory(0)="M" Then
    v = doctpres.GetItemValue("DocNo")(0)
    Set docres = dcres.GetFirstDocument
    While docres.form(0)="document"
    value = docres.GetItemValue("DocID")(0)
    ss$ = Strrightback(value, ".")
    If ss$=v Then
    If doctpres.IsMandatory(0)=docres.IsMandatory(0) Then

    Else
    Call doc.ReplaceItemValue("IsMandatory", doctpres.IsMandatory(0))                                  
    End If
    Else       
    Set clone = db.CreateDocument
    If Not clone Is Nothing Then
    clone.form = doctpres.form(0)
    clone.DocName = doctpres.DocName(0)
    clone.IsMandatory = doctpres.IsMandatory(0)
    clone.DocComment = doctpres.DocComment(0)
    clone.form = doctpres.form(0)
    Call clone.CopyAllItems(doctpres)
    Call clone.RemoveItem("$UpdatedBy")
    clone.isClone = "1"
    Call clone.ReplaceItemValue ( "DocBranchDate", Evaluate ({ @Now }))
    clone.DocVer = 1
    clone.DocNo = doc.customerid(0) & "." & doctpres.DocNo(0)
    clone.DocID = clone.DocNo(0)
    clone.isTemplate = "0"
    Call clone.MakeResponse(doc)
    Call clone.Save(True, False)
    End If
    End If
    Set docres = dcres.GetNextDocument(docres)
    Wend
    End If
    Set doctpres = dctpres.GetNextDocument(doctpres)
    Wend                   
    End If             
    Wend
    End If
    Call doc.Save(True, False)
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    :( :) :(
     
  6. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Akupaka

    глупие вопроси? :)
     
  7. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    тема си... задача не ясна

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">текст</div></div><div class="sp-body"><div class="sp-content">не дитинський, а дочірній
     
  8. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    вместо массива лучше использовать список:
    1.пройтись по респонсам шаблона, создать список ( list As NotesDocument ), типа
    Код (LotusScript):
    Set list( ключ, вычисленный на текущем респонсе шаблона) = templateResponse
    'ключ = "номер + статус документа"
    2.пройтись по респонсам "больного" документа:
    Код (LotusScript):
    if iselement( list ( ключ, вычисленный на текущем респонсе документа ) ) then
    '... нашли:
    docResponse.flag = flagValue ' "п.8: уставливаем флаг (обязательний или необязательний)"
    else
    '... не нашли
    создаем новый: Set clone = ...
    валим текущий респонс документа ' "п.9. все ненужние доки удаляем."
    end if
    P.S. Если респонсов у шаблона много( > 100 ), то список (list ) объектов NotesDocument можно заменить на список объектов самописного класса, чтобы не держать кучу документов в памяти.
     
  9. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Akupaka

    ото тобі нема до чого вчепитись :lovecodeby:

    turumbay

    спасибо буду пробовать
     
  10. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">офф:нема до чого вчепитись</div></div><div class="sp-body"><div class="sp-content">а чому не "дочірній" або "документ-відповідь"? я б "документ-відповідь" юзала
     
  11. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"И я чуть-чуть офтопа добавлю"</div></div><div class="sp-body"><div class="sp-content">"Основной документ" пусть будет "Документ-батько" -- на маю думку атрымаецца вельмi самабытна... :lovecodeby:
     
  12. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">alik86</div></div><div class="sp-body"><div class="sp-content">
    :lovecodeby:Т мягкого в Белорусском нету, и не было никогда.. аяйяй. Потому тогда уже Дакумент-бацька
    Украинцам - украинское, а белорусский не надо портить.
     
  13. alik86

    alik86 Lotus team
    Lotus team

    Регистрация:
    20 ноя 2008
    Сообщения:
    465
    Симпатии:
    0
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"vital"</div></div><div class="sp-body"><div class="sp-content">Ну так внимательный белорус заметил бы, что и "документ" - не по-белоруски (трэба "дАкумент"), а "Документ-батько" это лишь офтоп-совет украинцам (а по украински, если я не ошибаюсь, будет именно "Документ-батько") :(
    P.S. А белорусский уже и без нас, увы, испортили...
     
  14. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">alik86</div></div><div class="sp-body"><div class="sp-content">ты по-украински правильно написал. Зря Виталя придирается. Но не будем оффтопить и злить админов, ибо меня уже он подкалывал насчет добавления еще одного языка в правила форума :(
    Cleric-Lviv ну че, победил свою задачу?
     
  15. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">OKEN</div></div><div class="sp-body"><div class="sp-content">
    я уже давно об этом серьезно говорил!
     
  16. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    вот кое что набросал тут....
    вопроси с непонятками внутри скрипта....
    Код (LotusScript):
    Dim ses As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim doc As NotesDocument'документ який будем міняти
    Dim dcres As NotesDocumentCollection'колекція респонзів основного документу
    Dim docres As NotesDocument'респонз основного документу
    Dim doctp As NotesDocument'шаблонний документ
    Dim doctpres As NotesDocument'респонз шаблонного документу
    Dim clone As NotesDocument 'майбутній дочірній документ клієнта
    Dim dc As NotesDocumentCollection'колекція документів для зміни
    Dim dctp As NotesDocumentCollection'колекція темплейтів
    Dim dctpres As NotesDocumentCollection'колекція респонзів до темплейту
    Dim db As NotesDatabase
    Dim tp As String
    Dim tptempl As String
    Dim fm As Variant
    Dim value As String
    Dim v As String
    Dim olddc List As NotesDocument
    Dim newdc List As NotesDocument
    Dim ListKey As String
    Dim ListKeyNext As String
    Dim ListKeyOld As String
    Dim ListKeyNextOld As String

    Set db = ses.CurrentDatabase
    Set dc = ses.CurrentDatabase.UnprocessedDocuments
    If dc.Count >0 Then
    Set doc = dc.GetFirstDocument

    tp = doc.GetItemValue("CustomerType")(0)
    Set dctp = ws.PickListCollection( 3, False, db.Server,db.FilePath , "vw-customer-types", "Оберіть необхідний тип документу", "тип документу" )
    If dctp.Count > 0 Then
    Set doctp = dctp.GetFirstDocument
    tptempl = doctp.GetItemValue("Code")(0)
    Set dctpres = doctp.Responses
    If dctpres.Count>0 Then
    Set doctpres = dctpres.GetFirstDocument

    Do Until doctpres Is Nothing
    ListKey = doctpres.IsMandatory(0)
    ListKeyNext = doctpres.DocNo(0)
    Set newdc( ListKey ) = doctpres
    Set newdc( ListKeyNext ) = doctpres                
    Set doctpres = dctpres.GetNextDocument( doctpres )
    Loop
    Else
    Exit Sub
    End If
    End If

    Set dcres = doc.Responses
    Set docres = dcres.GetFirstDocument
    Do Until docres Is Nothing
    ListKeyOld = docres.IsMandatory(0)         
    value = docres.GetItemValue("DocID")(0)
    ListKeyNextOld = Strrightback(value, ".")
    Set olddc( ListKeyOld ) = docres
    Set olddc( ListKeyNextOld ) = docres       
    Set docres = dcres.GetNextDocument( docres )
    Loop   

    End If

    имеется два списка... newdc & olddc

    Forall a In newdc
    docid=Listtag(a)        ---- здесь(сначала показивает обязателен ли документ, потом второе значение(номер документа)..
    я думал что будет проверять сразу строку.....или я неправильно делаю проверку...
    )
    If Iselement(olddc(docid)) Then


    Else

    End If
    End If
    End Forall
    Call doc.ReplaceItemValue("Code", tptempl) 
    Call doc.Save(True, False)
    OKEN
    нет:(
     
  17. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Akupaka</div></div><div class="sp-body"><div class="sp-content">
    Во-первых, двое админов точно будут против.
    Во-вторых, я тебе вот что скажу (я тоже, в принципе, админ) - форум сам по себе белорусский и присутствие двух национальных языков этой страны для меня считается естественным.
    Почему ты считаешь, что надо добавлять украинский?
    А чем казахский, латышский, литовский, еврейский, польский и т.д. хуже? ведь есть же форумчане и оттуда. Удобно будет пользоваться транслятором или ты знаешь все эти языки?
    Надо писать на украинском- пожалуйста, я тебе давала ссылку на украинский форум.

    Cleric-Lviv
    Слушай, может, я не достаточно поняла задачу, но тебе вроде надо получать номер и обязательность и по ним решать, что делать с существующими документами.
    Может, огранизовать 2 списка для каждой коллекции:
    1-й: ключ- номер, значение - документ (как есть)
    2-й: ключ- номер, значение - обязательность или признак того, что документ обработан (как удобней для обработки).
    проходить по списку респонсов из выбранного темплейта(dctp) и проверять потом наличие такого по номеру среди респонсов текущего дока(doc).
    Если есть, менять те поля, что нужно. Если нет - вроде создавать надо, правильно? При желании, отобранные и проверенные можно удалять из списка респонсов текущего дока или ставить в список признак, что документ обработан. А потом пройтись по списку респонсов (вроде достаточно только списка текущего дока) и удалить лишние документы.
     
  18. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    OKEN

    я в етих списках плутаюсь.... а тут еще создавать.......

    может попробовать добить етот код....
     
  19. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    смотри, список - просто: есть ключ. Ключу должно соотвествовать какое-то значение (число, строка, массив, объект).
    Считать значение для ключа (if проверка мб не обязательна - если проходим по элементам списка, т.е. элемент там точно есть):
    if IsElement(список(ключ)) then
    значение = список( ключ)
    end if.
    Если значение - объект, везде для получения и задания значения используется Set.
    убрать из списка значение для ключа: Erase список(ключ).
    в цикле Forall для просмотра элементов списка получаем в переменной для Forall значение, ключ получаем через Listtag(значение).
    задать (поменять) значение : список( ключ) = значение.
    Если у тебя уже было значение для ключа, то оно перезатирается (тут внимательно!)
    Собственно, про уникальность DocNo среди текущих респонсов ты вроде бы говорил.
    А насчет того, уникально ли это - ListKey = doctpres.IsMandatory(0), я, чесгря, не уверена.
    Не может быть, что ты просто его перезатираешь при просмотре коллекции?

    и как-то путано проверять в одном списке значения и номера, и обязательности, поэтому предложила разнести на 2 списка.
    Если сразу надо проверять именно обязательность, то какие значения она может принимать? Если только пару - отдельно составлять список обязательных и необязательных доков, а? как удобней?
     
  20. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    OKEN

    да с обязательностю нет проблем, ее можно отцепить. тоесть работать только с обязательними документами.
    что в новой колекции что в старой.
    Код (LotusScript):
    Do Until doctpres Is Nothing
    If doctpres.form(0) = "document" Then
    If doctpres.IsMandatory(0)="M" Then
    'ListKey = doctpres.IsMandatory(0)
    ListKeyNext = doctpres.DocNo(0)
    'Set newdc( ListKey ) = doctpres
    Set newdc( ListKeyNext ) = doctpres
    End If
    End If
    Set doctpres = dctpres.GetNextDocument( doctpres )
    Loop
    итак остается только просмотреть списки.
    Код (LotusScript):
    Forall a In newdc
    docid=Listtag(a)
    If Iselement(olddc(docid)) Then

    здесь хотелось би проставлять флаг - "обязательность" для всех доков...
    ну чтоб перестраховатся
    но вот как ???? :(
    Else
    тут создавать новие документи....

    Set clone = db.CreateDocument

    End If
    End Forall
     
Загрузка...

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