Перенос Значения Поля В Другую Форму

Тема в разделе "Lotus - Программирование", создана пользователем toli4sky, 29 ноя 2011.

Статус темы:
Закрыта.
  1. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Добрый день!
    Я в языке lotusscript пока очень мало знаю, подскажите пожалуйста такой вопрос, если можно по подробнее.
    Коротко опишу начало:
    В общем, в моей базе при выборе конкретного вида отображается список документов - это так сказать шаблоны, при открытии любого документа у меня открывается форма, конкретно заданная, одна и та же, у любого из этих документов. На этой форме есть несколько полей, с уже внесенными данными (поля в виде переключателей), так же на форме есть кнопка для создания нового документа и переноса значений этих полей.
    Так вот суть проблемы в чем - при нажатии на эту кнопку надо бы что б значения переносились :welcome: вот у меня что то не получается так сделать, подскажите пожалуйста, уже неделю мучаюсь с этим.
    Пока у моей кнопки таков программый код, написанный на lotusscript:

    Sub Click(Source As Button)
    Dim session As New NotesSession
    Dim dbApplication As NotesDatabase
    Dim ProcessID As String
    Dim ErrString As String
    Dim workspace As New NotesUIWorkspace
    Dim docUI As NotesUIDocument
    Dim docNew As NotesDocument
    Dim v As Variant
    Dim docMain As NotesDocument
    Dim docCur As NotesDocument

    Set docUI = workspace.CurrentDocument
    Set dbApplication = session.CurrentDatabase

    v = Evaluate({"Новый док":""})
    Call DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)

    End Sub

    Я пробовал командой "Call docMain.AppendItemValue(Listtag(vl), v)" - но что то не получилось
    пробовал "GetItemValue" - так же без успешно, да, и во время эксперементов очень часто появлялась ошибка "Object Variable Not Set"

    Помогите люди добрые
     
  2. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

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

    а что тут смотреть? ви визиваете функцию, которая что себе делает.....
    GetItemValue - берет значение какого нибудь поля, чтоб передать нужние значения используйте

    Код (LotusScript):
    call notesdocument.replaceitemvalue("item", notesdocumenttemplate.getitemvalue("templateitem")(0))
     
  3. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Я может чего то не понимаю, ну скорее всего не понимаю:welcome:
    Написал я так, item - это поле в которое переносим, а templateitem - из которого берем значение, но ошибка в другом, ругается что нет такой функции - NotesDocument (not a sub or function name NOTESDOCUMENT)
    что мне еще добавить надо?
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Подставьте вместо notesdocument имя объектной переменной типа NotesDocument целевого документа, а вместо notesdocumenttemplate — имя переменной документа-шаблона. И почитайте мануалы в конце-то концов, задача выеденного яйца не стоит.
     
  5. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Кнопка в документе шаблоне с кодом

    Код (LotusScript):
    dim ns as new NotesSession
    dim db as NotesDatabase
    dim ws new as notesUIworkspace
    dim templDoc as notesDocument

    set db=ns.CurrentDatabase
    Set templDoc=ws.CurentDocument.Document
    Dim newDoc as notesDocument
    set newDoc=db.CreateDocument
    Call newDoc.ReplaceItemValue("Form","FormName")
    'Дальше переносим значения нужных полей
    Call newDoc.replaceItemValue("FieldName",templDoc.GetitemValue("FieldName"))
    ........

    Call ws.EditDocument(true,newDoc) 'Показываем новый док пользователю
    Будут вопросы по коду - спрашивайте

    а так рекомендую почитать справку по классам LotusScript
     
  6. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Ну я же еще пока чайничек...вот и задаю глупые вопросы:)
    Все бы ничего...но в lotusscripte пока еще не совсем понятно кое что...
    где я возьму имя шаблона? я ж в начале кода просто объявляю переменные типа NotesDocument, тем более у меня их две, Lotus та откуда поймет какая переменная к чему относится...или мне просто указывать имя формы которой открывается шаблон, да и тогда коого указывать в качестве приемника переменной тоже по форме?, это ж как бы не совсем правильно....не понятно как на кого ссылаться, в делфи назвал поле как нибудь, так и везде можешь ссылаться на нее по этому имени...а тут...мануалы читал...так и в итоге запутался ваще совсем, везде по разному пишут и как теперь делать:)
    Не ругайтесь громко....помогите плиз начинающему лотусисту :welcome:
     
  7. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Это и есть шаблон как я понял?
     
  8. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Ну не то что бы шаблон, грубо говоря да, шаблон, т.к. при открытии документа в этом виде, открывается форма, в которой необходимые поля уже заполнены как мне надо, что б пользователь не сидел не заполнял, а просто выбрал из списка шаблночик который ему нада и новый док у него был уже почти заполнен, как то так
     
  9. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Следует различать понятия шаблон и документ.
    Открывается не форма, а документ по этой форме

    Сделайте кнопку в форме в которой открывается документ из вида с выше приведенным кодом
     
  10. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Я не совсем понял, вот это:
    Это мы новый док создаем или указываем про созданный документ?
     
  11. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Новый
     
  12. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Написал код такой, попробывал, все равно выдает ошибку object variable not set, судя по всему ругается где то на вот это:
    Set docUI = workspace.CurrentDocument
    Set dbApplication = session.CurrentDatabase

    Set db=ns.CurrentDatabase
    Set templDoc=ws.CurrentDocument.Document

    Добавлено:
    У меня новый создается вот таким способом:

    v = Evaluate({"Новый док":""})
    Call DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)
     
  13. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    так и как при таком способе создания нового дока сослаться на новый док?
     
  14. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Не мешало бы для начала показать код процедуры DPWA_InitiateProcess, она явно Лотосу не родная.
     
  15. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    ну ка бы да, не родная...тока она не маленькая:welcome:

    Код (LotusScript):
    Function DPWA_InitiateProcess(dbApplication As NotesDatabase, ProcessID As String, docContent As NotesDocument, SourceList As Variant, TargetList As Variant, ErrString As String) As Integer
    Dim workspace As New NotesUIWorkspace
    Dim dbNames As NotesDatabase
    Dim ViewID As NotesView
    Dim ViewNames As NotesView
    Dim session As New NotesSession
    Dim dbProcess As NotesDatabase
    Dim dbOrg As NotesDatabase
    Dim docProcess As NotesDocument
    Dim docMail As NotesDocument
    Dim docProcessDef As NotesDocument
    Dim ViewOD As NotesView
    Dim ViewDef As NotesView
    Dim ResultID As Integer
    Dim ResultObject As String
    Dim LowLevelID As String
    Dim HighLevelID As String
    Dim InfoText As String
    Dim docMain As NotesDocument
    Dim docResult As NotesDocument
    Dim ViewUNID As NotesView
    Dim v As Variant

    On Error Goto ErrLab

    If (DPTestLicensePolicy("0", "WF", "", "2.0")=0) Then
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    DPWA_InitiateProcess = 0
    ErrString = "Сбой инициализации БД - проверьте, что передается правильная база приложения"
    Set ViewID = dbApplication.GetView("DPWAStartProcessView")
    Call ViewID.Refresh
    ErrString = ""

    Set dbNames = session.GetDatabase(dbApplication.Server, "names.nsf")
    Set ViewNames = dbNames.GetView("($VIMGroups)")
    Call ViewNames.Refresh

    Set docProcess = ViewID.GetDocumentByKey(ProcessID)
    If ( docProcess Is Nothing) Then
    Messagebox {Сбой запуска процесса - нет описания процесса с названием "} + ProcessID + {"}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    Set ViewDef = dbApplication.GetView("(ProcessInstances)")
    Set docProcessDef = ViewDef.GetDocumentByKey(docProcess.ProcessID(0) + docProcess.ProcessVersionDP(0))
    If (docProcessDef Is Nothing) Then
    Messagebox {Сбой выполнения - нет определения процесса}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    If (DPQueryInitProcess(docProcessDef) <> 1) Then
    Exit Function
    End If

    If (DPWS_GetDatabase(session, docProcess.SetODBaseDP(0), dbOrg )<=0) Then
    Messagebox {Сбой выполнения - неверная база данных организационной директории}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    ResultID = DPWA_SelectUserObjects(docProcessDef, docProcessDef, docMain, session.UserName, _
    dbOrg, ViewOD, ViewID, ViewNames, "ProcessInitiators", "ProcessInitiatorsKindDP", _
    LowLevelID, ErrString)

    If ( ResultID <0) Then
    Messagebox {Неверный доступ инициатора}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    If ( ResultID =0) Then
    Messagebox {Неверный доступ - у пользователя нет соответствующего типа доступа}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    ResultID = DPWA_HS_CheckMainObject(docMain, docProcessDef.ProcessInitiatorsIDDP,docProcessDef.ProcessInitiatorsDP, _
    LowLevelID, HighLevelID, ViewOD, ViewNames, ErrString)

    If ( ResultID <=0) Then
    Messagebox {Неверный доступ - Сбой вычисления группы доступа}, 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    If (DPWS_GetDatabase(session, docProcess.SetProcessCentreDBDP(0), dbProcess)<=0) Then
    Messagebox {Missed Process Centre Database}
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    Set docMail = dbProcess.CreateDocument
    docMail.Form = "DPWProcess"
    docMail.Action = "Create Instance"
    docMail.ProcessBaseDB = dbApplication.FilePath
    docMail.ProcessDocument = docProcess.UniversalID
    docMail.LowLevelID = LowLevelID
    docMail.HighLevelID = HighLevelID
    docMail.InitiatorAddress = session.UserName
    docMail.SetODBaseDP = docProcess.SetODBaseDP
    docMail.SetProcessCentreDBDP = docProcess.SetProcessCentreDBDP
    docMail.SetAppBaseDP = dbApplication.FilePath
    docMail.SetProcessCentreMailDP = docProcess.SetProcessCentreMailDP

    Dim sList As Variant
    Dim tList As Variant
    Dim sCount As Integer, tCount As Integer
    Dim canProcess As Boolean
    Dim i As Integer
    Dim docR As NotesDocument

    canProcess = True
    If ( Not docContent Is Nothing) Then
    If (Isarray(SourceList)) Then
    Redim sList (Ubound(SourceList)) As String
    For i = 0 To Ubound(SourceList)
    sList(i) = SourceList(i)
    Next
    Else
    Redim sList(0) As String
    sList(0) = SourceList
    End If
    sCount = Ubound(sList)

    If (Isarray(TargetList) ) Then
    Redim tList (Ubound(TargetList)) As String
    For i = 0 To Ubound(TargetList)
    tList(i) = TargetList(i)
    Next
    Else
    Redim tList(0) As String
    tList(0) = TargetList
    End If

    If ( Ubound(sList) <> Ubound(tList)) Then
    canProcess = False
    End If

    For i = 0 To Ubound(tList)
    If ( Trim(tList(i)) = "") Then
    canProcess = False
    i = Ubound(tList)
    End If
    Next

    If ( Not ( canProcess)) Then
    Messagebox "Неправильно заданы параметры переноса данных", 16, "Операция остановлена"
    DPWA_InitiateProcess = -1
    Exit Function
    End If

    On Error Goto ErrResume
    For i = 0 To Ubound(tList)
    If ( Trim(Ucase(sList(i))) = "@DOCUMENTUNIQUEID") Then
    Set docR = dbApplication.CreateDocument
    Call docR.MakeResponse(docContent)
    If ( docMail.HasItem(tList(i))) Then
    Call docMail.RemoveItem(tList(i))
    End If
    Call docMail.CopyItem(docR.GetFirstItem("$REF"), tList(i))
    Else
    v = Evaluate(sList(i), docContent)

    If ( docMail.HasItem(tList(i))) Then
    Call docMail.RemoveItem(tList(i))
    End If
    Call docMail.AppendItemValue(tList(i), v)
    End If

    ResNext:
    Next

    docMail.StartFieldListDP = tList
    End If

    On Error Goto Errlab
    Call docMail.Save(False, False)

    Call DPWA_AskForAction(docMail)

    Set ViewUNID = dbProcess.GetView("(UNID)")
    Call ViewUNID.Refresh
    ViewUNID.AutoUpdate = False

    Set docResult = ViewUNID.GetDocumentByKey(docMail.UniversalID)

    If ( docResult.ErrString(0) <> "") Then
    Messagebox docResult.ErrString(0), 64, "Сбой выполнения"
    DPWA_InitiateProcess = -1
    Call docResult.Remove(True)
    Exit Function
    End If

    Set docMain = dbApplication.GetDocumentByUNID(docResult.ResultID(0))
    Call docResult.Remove(True)

    '===av 
    '   Call workspace.EditDocument(False, docMain)
    If docProcessDef.ProcessAutoClaimDP(0) <> "" Then
    Call workspace.EditDocument(True, docMain)     
    Else
    Call workspace.EditDocument(False, docMain)    
    End If
    '===av     

    DPWA_InitiateProcess = 1
    Exit Function

    ErrLab:
    DPWA_InitiateProcess = -1
    Exit Function

    ErrResume:
    Resume ResNext

    End Function
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    все ваши ерроры м.б. оформить эксепшенами а не городить контекстнозависимые месюги в теле ф-ции...
    глядишь - и ф-ция былаб небольшой:welcome:
     
  17. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    Ну это не мной придумано:rolleyes:
    Так вот и как теперь можно ссылаться на новый док, который создан таким образом?
    Я еще думал мож через обращение к определенному виду и через команду getLastDocument? или есть более простые способы найти новый док?
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    переписать ф-цию так - чтобы возвращала нужный инстанс
    потому как возврат там 1 или -1 - а нафига?
    когда может возращаться Nothing (что и будет по умочанию) либо NotesDocument
     
  19. toli4sky

    toli4sky Active Member

    Регистрация:
    29 ноя 2011
    Сообщения:
    38
    Симпатии:
    0
    а смысл? это ж не повлияет на мою проблему. код та пускай остается как есть, мне б с этим разобраться... :gigi:
     
  20. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    я ваще не вник в суть проблемы...
    можно двумя словами, без кода?
    если трабла перенесении значений из одной UI в др. - ставьте галку в форме (соответ. типа наследовать поля) и в значение полей ставьте названия наследуемых
     
Загрузка...
Статус темы:
Закрыта.

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