ОБСУЖДЕНИЕ

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

20 ответов 8,6 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
цель следюющая

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

я думал что переменная lenemobopen будет отрабативать в qverysave проверке но она пустая........
как мне взять значение переменной lenemobopen и сунуть ее в проверку на qverysave???????
 
1. Option Declare в Globals формы.
2. Объявить переменную lenemobopen как глобальную (в Globals формы или в библиотеке).
 
Код:
call doc.save
такое на кверисейве делать низзя
 
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
 
решил поднять ету тему:(
все таки вернулся я к етому месту, как проверить поле на присутствие атачмента, имя атачмента и размер не сохранив документ?
или каким способом можна ето сделать?

Код:
If doc.HasEmbedded Then
If ( item.Type = RICHTEXT ) Then
Forall o In item.EmbeddedObjects	---type mismatch
 
Попробуй @AttachmentNames и @AttachmentLengths
 
на QuerySave ставишь
Код:
Call Source.Refresh(True)
и потом анализируешь RichTextItem как тебе надо.
 
Да, и добавь проверку Isarray перед ForAll, а внутри IsObject
 
итак.
в 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. где я мог ошибится?
 
Про сравнение ничё не скажу, но какбэ делать копию и потом её удалать (как я понимаю, это будет происходить в большинстве случаем) - не дело.
Копию надо делать только тогда, когда надо, а не делать всегда и удалять когда не надо.

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

а у меня вот другая проблемка с аттачами...
надо просто проверить есть ли хоть один аттач, но не более одного :( до сохранения документа...
код похожий, с рефрешем каждый раз,но..
если аттача нет - ОК
вложили 1 аттач - ОК
вложили >1 аттача - ОК, сообщает юзеру, что нельзя больше 1-го, нормально..
тут юзер удаляет явно хоть все аттачи - всё равно говорит, что аттачей больше 1-го, даже если ровно 1 оставить - всё равно говорит их больше...
 
Omh
я заметил что берет только размер последнего атача, дописал, щас тестану.
на счет делать копию...задача следуюющая, если изменится размер поля(атачмент, имя и так далее) нужно сберечь новий док и увеличить версионность документа а старий док сделать респонзом к нему. я сделал кнопу по которой ета процедура делается в нужний мне момент но начальство не хочет так ......
 
Cleric-Lviv
Просто ты делаешь док, а потом его убиваешь.
Это плохо с точки зрения перфоманса.
Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
Т.е. создавай только когда надо.
 
Omh
итак скрипт изменил считает полностю размер поля а не последнего атача.
Код:
Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
а вот етого я не понял:( можно поподробней?????
 
Не делай CopyDoc на PostOpen, делай на QuerySave только когда надо.
Может там придётся один воркараунд применить, но это позже :(
 
Omh
ятото я не пойму ..... смотри есть docA которий в даний момент актуальний. заходит юзер и меняєт атачмент в docA. теперь ето docAA. теперь когда я сохраняю то как я могу сделать CopyDoc docA, атач уже новий значит если я буду делать copy то я сделаю copy уже нового документа а не старого ??? или я чтото не так понимаю...........
 
Он не будет новый, на 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
 

Статистика тем

Создано
Cleric84,
Последний ответ от
Cleric84,
Ответы
20
Просмотры
8 622