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

Cleric-Lviv

Lotus team
03.01.2008
600
0
#1
всем привет
читаю и чтото не пойму. каким образом создать два масива, заполнить их и сравнить дание в них?
или можна ето дело както иначе провернуть?
 

hosm

* so what *
18.05.2009
2 442
6
#3
Вроде ж не пятница еще :) опиши задачу.
А в чем проблема, собственно - что, массивы сильно большие получаются или долго работать будет?
смотря как надо сравнивать, есть ли дубликаты и как их обрабатывать надо.
Если на идентичность без учета порядка - на скрипте можно попытаться через поэлементный проход / ArrayGetIndex / ArrayReplace.
для маленьких массивов вот еще забавный вариант c сортировкой: http://dpastov.blogspot.com/2008/01/compare-arrays.html - (думаю, на больших данных будет Operation failed), только не забывать для собак экранировать слеши и кавычки :)

и на яве тоже можно :)
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#4
TIA
както иначе ето не через масив:))))

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

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

кстати вот код которим я пробовал ето делать (не вишло:()
Код:
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)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#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">не дитинський, а дочірній
 
13.03.2009
625
1
#8
вместо массива лучше использовать список:
1.пройтись по респонсам шаблона, создать список ( list As NotesDocument ), типа
Код:
Set list( ключ, вычисленный на текущем респонсе шаблона) = templateResponse
'ключ = "номер + статус документа"
2.пройтись по респонсам "больного" документа:
Код:
if iselement( list ( ключ, вычисленный на текущем респонсе документа ) ) then
'... нашли:
docResponse.flag = flagValue ' "п.8: уставливаем флаг (обязательний или необязательний)"
else
'... не нашли
создаем новый: Set clone = ...
валим текущий респонс документа ' "п.9. все ненужние доки удаляем." 
end if
P.S. Если респонсов у шаблона много( > 100 ), то список (list ) объектов NotesDocument можно заменить на список объектов самописного класса, чтобы не держать кучу документов в памяти.
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#9
Akupaka

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

turumbay

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

hosm

* so what *
18.05.2009
2 442
6
#10
<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">а чому не "дочірній" або "документ-відповідь"? я б "документ-відповідь" юзала
 

alik86

Lotus team
20.11.2008
465
1
#11
<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:
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#12
<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:Т мягкого в Белорусском нету, и не было никогда.. аяйяй. Потому тогда уже Дакумент-бацька
Украинцам - украинское, а белорусский не надо портить.
 

alik86

Lotus team
20.11.2008
465
1
#13
<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. А белорусский уже и без нас, увы, испортили...
 

hosm

* so what *
18.05.2009
2 442
6
#14
<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 ну че, победил свою задачу?
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#15
<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">
ибо меня уже он подкалывал насчет добавления еще одного языка в правила форума
я уже давно об этом серьезно говорил!
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#16
вот кое что набросал тут....
вопроси с непонятками внутри скрипта....
Код:
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
нет:(
 

hosm

* so what *
18.05.2009
2 442
6
#17
<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).
Если есть, менять те поля, что нужно. Если нет - вроде создавать надо, правильно? При желании, отобранные и проверенные можно удалять из списка респонсов текущего дока или ставить в список признак, что документ обработан. А потом пройтись по списку респонсов (вроде достаточно только списка текущего дока) и удалить лишние документы.
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#18
OKEN

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

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

hosm

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

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

Cleric-Lviv

Lotus team
03.01.2008
600
0
#20
OKEN

да с обязательностю нет проблем, ее можно отцепить. тоесть работать только с обязательними документами.
что в новой колекции что в старой.
Код:
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
итак остается только просмотреть списки.
Код:
Forall a In newdc
docid=Listtag(a)
If Iselement(olddc(docid)) Then

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

Set clone = db.CreateDocument

End If
End Forall