Сравнение даних

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#1
цель следюющая

когда юзер откривает документ(postopen) делается проверка по ртполю, на размер етого поля, переменной lenemobopen присваивается значение
когда юзер закривает документ(qverysave) делается тоже проверка по етому полю и тоже вичисляется рамер етого поля. и перемонной lenemobsave присваивается ето значение
далее писал
Код:
if lenemobopen<>lenemobsave then
ля-ля-ля
else
call doc.save
end if
я думал что переменная lenemobopen будет отрабативать в qverysave проверке но она пустая........
как мне взять значение переменной lenemobopen и сунуть ее в проверку на qverysave???????
 
Y

Yakov

Гость
#2
1. Option Declare в Globals формы.
2. Объявить переменную lenemobopen как глобальную (в Globals формы или в библиотеке).
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 226
25
#3
Код:
call doc.save
такое на кверисейве делать низзя
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#4
call doc.save

такое на кверисейве делать низзя

та я уже потом понял:))))))

какойто глюк теперь увиделна постопен кодик
узнаю назву атачмента и потом вичисляю ево размер.
Код:
If ( item.Type = RICHTEXT ) Then
Forall o In item.EmbeddedObjects
fn = o.name
End Forall		
Set emob = item.GetEmbeddedObject(fn)
lenemobopen = emob.FileSize
End If
на квери сейв такойже код но чуть другой переменние обозвал иначе
Код:
If ( item.Type = RICHTEXT ) Then
Forall k In item.EmbeddedObjects
fln = k.name
End Forall		
Set emob = item.GetEmbeddedObject(fln)
lenemobsave = emob.FileSize
End If
теперь если файл остался и не менялся. то все класно работает, но вот если пользователь удалил файл и вставил другой то уже ругается на
Forall k In item.EmbeddedObjects --- type mismatch
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#5
решил поднять ету тему:(
все таки вернулся я к етому месту, как проверить поле на присутствие атачмента, имя атачмента и размер не сохранив документ?
или каким способом можна ето сделать?

Код:
If doc.HasEmbedded Then
If ( item.Type = RICHTEXT ) Then
Forall o In item.EmbeddedObjects	---type mismatch
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#9
на QuerySave ставишь
Код:
Call Source.Refresh(True)
и потом анализируешь RichTextItem как тебе надо.
 

TIA

:-)
Lotus team
15.05.2009
790
2
#10
Да, и добавь проверку Isarray перед ForAll, а внутри IsObject
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#11
итак.
в global форми прописано
Код:
Dim lenemobopen As Long -- размер файла при откритии
Dim lenemobsave As Long -- размер при закритии
Dim CopyDoc As NotesDocument -- когда откриваем документ делаем копию
Dim dv As Integer - версия документа
Dim dn As String - номер документа
на пост опен
Код:
dv = Cint(doc.GetItemValue("DocVer")(0)) 
dn = Cstr(doc.GetItemValue("DocNo")(0))
Set CopyDoc = db.CreateDocument
Call doc.CopyAllItems(CopyDoc, True)
Call CopyDoc.MakeResponse(doc)
Call CopyDoc.Save(False, True)
Set item = doc.GetFirstItem("DocContainer")

If doc.HasEmbedded Then
If ( item.Type = RICHTEXT ) Then
Forall o In item.EmbeddedObjects			
fn = o.name
End Forall		
Set emob = item.GetEmbeddedObject(fn)		
lenemobopen = emob.FileSize
End If
End If
итак на кверисейв когда виполняется код имеем lenemobopen, CopyDoc, dv, dn.
Код:
Set doc = source.Document
Set item = doc.GetFirstItem("DocContainer")
Call source.Refresh(True)
If doc.HasEmbedded Then
If ( item.Type = RICHTEXT ) Then
Forall o In item.EmbeddedObjects			
fn = o.name
End Forall		
Set emob = item.GetEmbeddedObject(fn)		
lenemobsave = emob.FileSize
If lenemobopen <> lenemobsave Then
Call doc.ReplaceItemValue("DocStatus", "")
Call doc.ReplaceItemValue("DocVer", dv+1) --- версия документа так и не меняется
Call doc.ReplaceItemValue("DocID", dn) 

Else
Call CopyDoc.Remove(True)
End If
End If
End If
в каждом доке есть embededview в которой должен бить виден респонз, но ево там нету:( хотя в базе можно найти ети респонзи если на view сделать select @all. где я мог ошибится?
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#12
Про сравнение ничё не скажу, но какбэ делать копию и потом её удалать (как я понимаю, это будет происходить в большинстве случаем) - не дело.
Копию надо делать только тогда, когда надо, а не делать всегда и удалять когда не надо.

По коду, если несколько аттачей, буде проверятся только последний.
Складывай их размеры, а не бери размер одного.
 
K

Klido

Гость
#13
похоже эта ветка отработала.. принтани размеры - совпадают?

а у меня вот другая проблемка с аттачами...
надо просто проверить есть ли хоть один аттач, но не более одного :( до сохранения документа...
код похожий, с рефрешем каждый раз,но..
если аттача нет - ОК
вложили 1 аттач - ОК
вложили >1 аттача - ОК, сообщает юзеру, что нельзя больше 1-го, нормально..
тут юзер удаляет явно хоть все аттачи - всё равно говорит, что аттачей больше 1-го, даже если ровно 1 оставить - всё равно говорит их больше...
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#14
Omh
я заметил что берет только размер последнего атача, дописал, щас тестану.
на счет делать копию...задача следуюющая, если изменится размер поля(атачмент, имя и так далее) нужно сберечь новий док и увеличить версионность документа а старий док сделать респонзом к нему. я сделал кнопу по которой ета процедура делается в нужний мне момент но начальство не хочет так ......
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#15
Cleric-Lviv
Просто ты делаешь док, а потом его убиваешь.
Это плохо с точки зрения перфоманса.
Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
Т.е. создавай только когда надо.
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#16
Omh
итак скрипт изменил считает полностю размер поля а не последнего атача.
Код:
Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
а вот етого я не понял:( можно поподробней?????
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#17
Не делай CopyDoc на PostOpen, делай на QuerySave только когда надо.
Может там придётся один воркараунд применить, но это позже :(
 

Cleric-Lviv

Well-Known Member
Lotus team
03.01.2008
600
0
#18
Omh
ятото я не пойму ..... смотри есть docA которий в даний момент актуальний. заходит юзер и меняєт атачмент в docA. теперь ето docAA. теперь когда я сохраняю то как я могу сделать CopyDoc docA, атач уже новий значит если я буду делать copy то я сделаю copy уже нового документа а не старого ??? или я чтото не так понимаю...........
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#19
Он не будет новый, на QuerySave документ ещё не записан в базу.
Выдёргиваешь из базы по UNID'у текущего документа некешированный документ (например, из вида) и делаешь копию.

Примерно так (псевдокот):
Код:
Sub QuerySave
if SIZE_CAHNGED then
Set db = doc.ParentDatabase
Dim View as NotesView
Set View = db.GetView("VIEW_WHERE_ALL_DOCUMENTS_IS_SORTED_BY_UNID")
Dim UncachedDoc as NotesDocument
Set UncachedDoc = view.GetDocumentByKey(doc.UniversalID, True)
Dim CopyDoc as NotesDocument
Set CopyDoc = UncachedDoc.CopyYoDatabase(db)
Vsjo
end if