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

Статус
Закрыто для дальнейших ответов.

toli4sky

Active member
29.11.2011
38
0
#1
Добрый день!
Я в языке 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"

Помогите люди добрые
 

Cleric-Lviv

Lotus team
03.01.2008
600
0
#2
Toli4sky

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

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

toli4sky

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

nvyush

Lotus team
22.04.2009
2 317
0
#4
Подставьте вместо notesdocument имя объектной переменной типа NotesDocument целевого документа, а вместо notesdocumenttemplate — имя переменной документа-шаблона. И почитайте мануалы в конце-то концов, задача выеденного яйца не стоит.
 

dimat

Lotus team
31.07.2008
516
0
#5
Кнопка в документе шаблоне с кодом

Код:
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
 

toli4sky

Active member
29.11.2011
38
0
#6
Ну я же еще пока чайничек...вот и задаю глупые вопросы:)
Все бы ничего...но в lotusscripte пока еще не совсем понятно кое что...
где я возьму имя шаблона? я ж в начале кода просто объявляю переменные типа NotesDocument, тем более у меня их две, Lotus та откуда поймет какая переменная к чему относится...или мне просто указывать имя формы которой открывается шаблон, да и тогда коого указывать в качестве приемника переменной тоже по форме?, это ж как бы не совсем правильно....не понятно как на кого ссылаться, в делфи назвал поле как нибудь, так и везде можешь ссылаться на нее по этому имени...а тут...мануалы читал...так и в итоге запутался ваще совсем, везде по разному пишут и как теперь делать:)
Не ругайтесь громко....помогите плиз начинающему лотусисту :welcome:
 

toli4sky

Active member
29.11.2011
38
0
#8
Ну не то что бы шаблон, грубо говоря да, шаблон, т.к. при открытии документа в этом виде, открывается форма, в которой необходимые поля уже заполнены как мне надо, что б пользователь не сидел не заполнял, а просто выбрал из списка шаблночик который ему нада и новый док у него был уже почти заполнен, как то так
 

dimat

Lotus team
31.07.2008
516
0
#9
Ну не то что бы шаблон, грубо говоря да, шаблон, т.к. при открытии документа в этом виде, открывается форма, в которой необходимые поля уже заполнены как мне надо, что б пользователь не сидел не заполнял, а просто выбрал из списка шаблночик который ему нада и новый док у него был уже почти заполнен, как то так
Следует различать понятия шаблон и документ.
ри открытии документа в этом виде, открывается форма
Открывается не форма, а документ по этой форме

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

toli4sky

Active member
29.11.2011
38
0
#10
Кнопка в документе шаблоне с кодом

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"))
Я не совсем понял, вот это:
Это мы новый док создаем или указываем про созданный документ?
 

toli4sky

Active member
29.11.2011
38
0
#12
Сделайте кнопку в форме в которой открывается документ из вида с выше приведенным кодом
Написал код такой, попробывал, все равно выдает ошибку 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)
 

toli4sky

Active member
29.11.2011
38
0
#13
так и как при таком способе создания нового дока сослаться на новый док?
 

nvyush

Lotus team
22.04.2009
2 317
0
#14
так и как при таком способе создания нового дока сослаться на новый док?
Не мешало бы для начала показать код процедуры DPWA_InitiateProcess, она явно Лотосу не родная.
 

toli4sky

Active member
29.11.2011
38
0
#15
ну ка бы да, не родная...тока она не маленькая:welcome:

Код:
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
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 568
263
#16
все ваши ерроры м.б. оформить эксепшенами а не городить контекстнозависимые месюги в теле ф-ции...
глядишь - и ф-ция былаб небольшой:welcome:
 

toli4sky

Active member
29.11.2011
38
0
#17
Ну это не мной придумано:rolleyes:
Так вот и как теперь можно ссылаться на новый док, который создан таким образом?
Я еще думал мож через обращение к определенному виду и через команду getLastDocument? или есть более простые способы найти новый док?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 568
263
#18
переписать ф-цию так - чтобы возвращала нужный инстанс
потому как возврат там 1 или -1 - а нафига?
когда может возращаться Nothing (что и будет по умочанию) либо NotesDocument
 

toli4sky

Active member
29.11.2011
38
0
#19
а смысл? это ж не повлияет на мою проблему. код та пускай остается как есть, мне б с этим разобраться... :gigi:
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 568
263
#20
я ваще не вник в суть проблемы...
можно двумя словами, без кода?
если трабла перенесении значений из одной UI в др. - ставьте галку в форме (соответ. типа наследовать поля) и в значение полей ставьте названия наследуемых
 
Статус
Закрыто для дальнейших ответов.