• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы toli4sky
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

toli4sky

не помогает наследственность...
Двумя словами требуется что б по нажатю кнопки переносились значения из одного поля одного документа в другое поле другого документа (нового), при этом в коде нажатия кнопки имеется конкретная процедура для создания нового документа DPWA_InitiateProcess, так вот данные поля будут переноситься из старого документа в новый. А наследственность тут не поможет, потому что я же не одну и ту же форму использую
 
T

toli4sky

мешать не мешает, но и не помогает:gigi:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
всегда помогала, а тут не поможет, может попробовать стоит? (как описано)для создания нового документа DPWA_InitiateProcess, так вот данные поля будут переноситься из старого документа в новый
если речь идет о новом - кот. создан в DWPA, то как писал выше - верните UIdoc и сним делайте чё хотите, а просто и одного доко в др. - @Command ([Compose]...)
вот пример ЛС:
Код:
Sub Click(Source As Button)
'Dim wks As New NotesUIWorkspace
Dim srcUI As NotesUIDocument
Set srcUI=wks.CurrentDocument
Dim db As NotesDatabase
Set db=wks.CurrentDatabase.Database
Dim doc As NotesDocument
Set doc=db.CreateDocument
Call doc.ReplaceItemValue({Form},{test})
Dim uidoc As NotesUIDocument
Set uidoc=wks.EditDocument(True, doc)
Call uidoc.FieldSetText({test},srcUI.Document.GetItemValue({test})(0))
End Sub
 
T

toli4sky

Может в моей голове уже бардак, но давайте с небольшим уточнением...
Я понимаю это так

Sub Click(Source As Button)
'Dim wks As New NotesUIWorkspace
Dim srcUI As NotesUIDocument - это мы объявляем переменную для текущего документа
Set srcUI=wks.CurrentDocument - тут присваеваем этой переменной текущий документ
Dim db As NotesDatabase - переменная, наша база данных
Set db=wks.CurrentDatabase.Database - присваеваем ей текущую базу
Dim doc As NotesDocument - переменная под документ лотуса
Set doc=db.CreateDocument - тут создаем новый
Call doc.ReplaceItemValue({Form},{test}) - тут не очень понятно.. заменяем значение поля, причем тут Форма? или какую указывать? test - тут что писать? а точнее для чего?
Dim uidoc As NotesUIDocument - здесь переченная под текущий документ
Set uidoc=wks.EditDocument(True, doc) - делаем текущий для редактирования
Call uidoc.FieldSetText({test},srcUI.Document.GetItemValue({investor})(0)) - в текущем документе присваеваем полю текст(поле test) из предыдущего документа с указанным полем investor
End Sub

Если я все правильно понял, то попробую соостнести все и поставить у себя
 
N

nvyush

> Set db=wks.CurrentDatabase.Database - присваеваем ей текущую базу
Обычно это делается так:
Dim session As New NotesSession
Set db = session.CurrentDatabase

>Call doc.ReplaceItemValue({Form},{test}) - тут не очень понятно.. заменяем значение поля, причем тут Форма? или какую указывать?
данная конструкция присваивает итему с именем {Form} значение {test}. Перед тем как открывать созданный документ, нужно указать по какой форме, соответственно вместо {test} пишите {Имя_нужной_формы}
Далее, если у Вас уже открыт документ-шаблон, скопировать нужные значения полей можно так:
Call doc.ReplaceItemValue({Имя_поля_документа}, templateDoc.GetItemValue({Имя_поля_шаблона_документа}))
Если копируете поля типа Name/Authors/Readers, можно сразу указать соответствующий флаг:
doc.ReplaceItemValue({Имя_поля_документа}, templateDoc.GetItemValue({Имя_поля_шаблона})).IsNames = True 'IsAuthors = True | IsReaders = True
 
T

toli4sky

Я написал таким образом, но теперь получил новую ошибку: "Ошибка Notes - не удается найти поле"

Вот код:
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 docOld As NotesUIDocument
Set docOld=workspace.CurrentDocument

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

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

Dim docN As NotesUIDocument
Set docN=workspace.CurrentDocument

Call docN.FieldSetText({Field1},docOld.Document.GetItemValue({Field2})(0))

End Sub


По идее с поможщью моей процедуры DPWA_InitiateProcess создается док со всеми определенными мной полями... но почему то лотус не находит поле...хотя с одной стороны в свойствах документа я не вижу нужного поля, нашел его только в отладке.
Может есть какая нибудь функция что б поле создать в документе? или может не в этом беда? просто я выбирал даже поле то которое отображается в свойствах документа, ошибка та же самая...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
Call DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)

Dim docN As NotesUIDocument
Set docN=workspace.CurrentDocument
прекратите заниматься ерундой...
контекст CurentDocument может быть утерян, сделайте как я сказал - исправьте возврат ф-ции на uidoc
 
T

toli4sky

Я канешно дико извиняюсь, но по этому вопросу у меня уже Дико кипят мозги...
кого куда менять? переменную что ли переименновать? что это даст?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
в ф-ции вы открыли uidoc
Код:
  If docProcessDef.ProcessAutoClaimDP(0) <> "" Then
Call workspace.EditDocument(True, docMain)		
Else
Call workspace.EditDocument(False, docMain)		
End If
но не возвратили его в осноной код, а пытаетесь достучаться до него через wks.CurrentDocument, что является уточённым извращением :), потому как этот контекст моет указывать на др. uidoc
а потому надо
Код:
  If docProcessDef.ProcessAutoClaimDP(0) <> "" Then
Set DPWA_InitiateProcess=workspace.EditDocument(True, docMain)		
Else
Set DPWA_InitiateProcess=workspace.EditDocument(False, docMain)		
End If
предварительно сменив тип возврата Function DPWA_InitiateProcess(dbApplication As NotesDatabase, ProcessID As String, docContent As NotesDocument, SourceList As Variant, TargetList As Variant, ErrString As String) As Variant
либо жёстко затипизировав Function DPWA_InitiateProcess(dbApplication As NotesDatabase, ProcessID As String, docContent As NotesDocument, SourceList As Variant, TargetList As Variant, ErrString As String) As NotesUIDocument
и исправив по коду несоответствие

ИБО: возвращать 1 или -1 - это БСК, в данной ф-ции, никакого смысла в возврате целого нет (да и быть не может) надо при ошибке - Nothing, при нормальном завершении - д.б. NotesUIDocument

Добавлено: и далее по коду сделать вместо:
Код:
v = Evaluate({"Нов док":""})
Call DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)

Dim docN As NotesUIDocument
Set docN=workspace.CurrentDocument

Call docN.FieldSetText({Field1},docOld.Document.GetItemValue({Field2})(0))
надо:
Код:
v = Evaluate({"Нов док":""})
Dim docN As NotesUIDocument
Set docN=DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)
Call docN.FieldSetText({Field1},docOld.Document.GetItemValue({Field2})(0))


Добавлено: PPS: фокус с Evaluate я не понял ;) - зачем так получать массив, когда можно Split ({Text},{})
 
N

nvyush

Добавлено: PPS: фокус с Evaluate я не понял wink.gif - зачем так получать массив, когда можно Split ({Text},{})
А в функцию подставляется нулевой элемент массива:
Set docN=DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)
Спрашивается — а нельзя ли сразу подставить нужное значение без таких извращений?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
Спрашивается — а нельзя ли сразу подставить нужное значение без таких извращений?
справедливо замечено :), ну а мое замечание относилось к получению массива, а не к контексту его странного использвания
 
T

toli4sky

Спасибо что подсказываете как оптимизировать код процедуры DPWA_InitiateProcess, но это не решает необходимое, там как все есть так оно пусть и будет.

а по этому:
надо:v = Evaluate({"Нов док":""})
Dim docN As NotesUIDocument
Set docN=DPWA_InitiateProcess(dbApplication, v(0), Nothing, "", "", ErrString)
Call docN.FieldSetText({Field1},docOld.Document.GetItemValue({Field2})(0))

сделал я так, в итоге вернулся к старой ошибке.
с тем кодом который мой последний, я вроде нашел причину, только не могу теперь понять где найти ответ.
При создании документа процедурой DPWA_InitiateProcess в документе не появляется поле Field1, оно появляется после сохранения документа. Так вот, я добавил в коде Call docN.Save(), так вот, документ начал ругаться (это где то уже предусмотренно) что сохранение производится только по кнопке (тоже кем то созданной в форме) "сохранить и закрыть" вот теперь я не могу найти где это написано, в событиях сохранения формы ни че не написано, тока ссылается на библиатеку, а там тоже ниче такого не написано...где искать...
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
а в библиотеке есть USE другой библиотеки? если есть, то смотри в ней (в них).
можно еще пройти дебагером и посмотреть где именно вылетает при сохранении.
События сохранения формы полностью пустые?
Что-то подсказывает, что там есть вызовы функций, в которых может быть проверка.

Еще вариант записать текст сообщения, создать в базе данных Design Synopsis (добавить форму, библиотеки и агенты) и поиском поискать текст сообщения.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
При создании документа процедурой DPWA_InitiateProcess в документе не появляется поле Field1
если поле есть на форме и оно едитабле - никаких проблем не будет (с сохранением), для того, в примере, я и задавал форму для документа! и используется FieldSetText
в режиме просмотра (не редактирования) не будет работать это метод
 
T

toli4sky

Call docN.ReplaceItemValue({Form},{Test})

Я так делал, но у меня ругается типа: not a member REPLACEITEMVALUE, вот и не стал ее использовать, да и не совсем понял для чего она... а че за ошибка так и не понял и че мне с ней делать:)
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
REPLACEITEMVALUE метод для NOTESDOCUMENT. а не для NOTESUIDOCUMENT
Чтобы его вызвать надо делать так:

call docN.Document.ReplaceItemValue("Form",{Test})

либо

Dim docNN as NotesDocument
set docNN = docN.Document
call docNN.ReplaceItemValue("Form",{Test})

***
Совет:
Справку дизайнера держи открытой. Тебе как новичку с LS надо постоянно смотреть методы тех или иных классов.
Вот если ты работаешь с NotesUIDocument, то открой этот класс в Help и почитай какие методы и свойства он имеет.
Какие объекты других классов можно из получить из данного объекта и т.д.
Это позволит более четко видеть зависимость объектов и способствует обучению.
 
T

toli4sky

теперь более менее понятно...попробую.
Я несколько лет изучал Delphi, даже дипломку в универе делал на нем, изучал html, а тут ващпе голова кругом идет от того что надо кого то куда то присвоить для того что бы обозначить, за тредеветь земель сослаться на библиотеки, на другие процедуры, где попало объявить переменные вот и происходит взрыв мозга))

Добавлено: к сажелению, даже с ReplaceItemValue все равно ошибка....лотус не может найти поле...

Вставить ник
Новенький


Репутация: 1



↓«— информация —»↓
Группа: ПрограммистСообщений: 22Регистрация: 28:10:2011Пользователь №: 37 559ICQ: 329038701

«— информация —»
а в библиотеке есть USE другой библиотеки? если есть, то смотри в ней (в них).
можно еще пройти дебагером и посмотреть где именно вылетает при сохранении.
События сохранения формы полностью пустые?
Что-то подсказывает, что там есть вызовы функций, в которых может быть проверка.

там в событиях Querysave у формы прописанн вызов процедуры call DPFFQuerysave, подключена библиотека, но в этой библиотеке вывает:
Sub DPFFQuerysave(Source As Notesuidocument, Continue As Variant)

End Sub
т.е. ничего....в остальных событиях типа закрытие, открытие та же история...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
215
где попало объявить переменные вот и происходит взрыв мозга))
Option Declare надо ставить и ошибок будет меньше
и ниразу язык не сложнее того же дельфи - не надо сочинять...
ЛС - это практически бижуалвасик, местами даже удобнее, но он уже устаревший язык и его не плнируют развивать
к сожалению UI ф-ции доступны тока на нём и весь интерфейс писан под винду-онли (начиная с 5-ки)
теперь это пытаются исправить, но как-то медленно и коряво, назвали сие чудо 8.х
еслиб полностью сделали эклипсовый интерфейс - былбы торт, но увы (этож надо думать:) - индусы так не умеют)
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
180
Добавлено: к сажелению, даже с ReplaceItemValue все равно ошибка....лотус не может найти поле...

текст ошибки? Если у тебя всплывает окошечко с текстом, то коперни его Ctrl+C когда оно открыто. Лотус позволяет.

Про DPFFQuerysave очень странно, что-то еще должно вызываться... Ничего не появляется из ниоткуда)
Попробуй все же сделать Design Synopsis и поискать по тексту сообщения...
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!