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

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

  1. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

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

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

    Yakov Гость

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    Код (Text):
    call doc.save
    такое на кверисейве делать низзя
     
  4. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

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

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

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

    какойто глюк теперь увиделна постопен кодик
    узнаю назву атачмента и потом вичисляю ево размер.
    Код (Text):
    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
    на квери сейв такойже код но чуть другой переменние обозвал иначе
    Код (Text):
    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
     
  5. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

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

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Попробуй @AttachmentNames и @AttachmentLengths
     
  7. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    TIA
    а что скриптом не вийдет?:(
     
  8. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Cleric-Lviv
    Evaluate
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    на QuerySave ставишь
    Код (Text):
    Call Source.Refresh(True)
    и потом анализируешь RichTextItem как тебе надо.
     
  10. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Да, и добавь проверку Isarray перед ForAll, а внутри IsObject
     
  11. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    итак.
    в global форми прописано
    Код (Text):
    Dim lenemobopen As Long -- размер файла при откритии
    Dim lenemobsave As Long -- размер при закритии
    Dim CopyDoc As NotesDocument -- когда откриваем документ делаем копию
    Dim dv As Integer - версия документа
    Dim dn As String - номер документа
    на пост опен
    Код (Text):
    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.
    Код (Text):
    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. где я мог ошибится?
     
  12. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Про сравнение ничё не скажу, но какбэ делать копию и потом её удалать (как я понимаю, это будет происходить в большинстве случаем) - не дело.
    Копию надо делать только тогда, когда надо, а не делать всегда и удалять когда не надо.

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

    Klido Гость

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

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

    Cleric-Lviv Lotus team
    Lotus team

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Cleric-Lviv
    Просто ты делаешь док, а потом его убиваешь.
    Это плохо с точки зрения перфоманса.
    Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
    Т.е. создавай только когда надо.
     
  16. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Omh
    итак скрипт изменил считает полностю размер поля а не последнего атача.
    Код (Text):
    Ты лучше на QuerySave (после того как исправишь скрипт) в ветке, в которую скрипт заходит при изменении размеров создавай док.
    а вот етого я не понял:( можно поподробней?????
     
  17. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не делай CopyDoc на PostOpen, делай на QuerySave только когда надо.
    Может там придётся один воркараунд применить, но это позже :(
     
  18. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Он не будет новый, на QuerySave документ ещё не записан в базу.
    Выдёргиваешь из базы по UNID'у текущего документа некешированный документ (например, из вида) и делаешь копию.

    Примерно так (псевдокот):
    Код (Text):
    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
     
  20. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Omh
    щас буду пробовать:(
     
Загрузка...

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