Lotus Script

Gor

Well-Known Member
07.06.2005
517
2
#1
Здавствуйте... Опять обращаюсь за помощью
предположим вот имеется код по присвоению по кнопке полю значения
Код:
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim User As Variant
Call workspace.EditDocument( True )
Set uidoc = workspace.CurrentDocument

User = uidoc.FieldGetText( "status")
Print User 
User = "under repair"
Call uidoc.FieldSetText("status" ,User)
Call uidoc.Refresh	

End Sub
Хотелось бы узнать вот что...
Суть задачи такова...
имеется большой список техники. Чтобы отправить её в ремонт предположим надо наэать кнопку которая выполняет этот скрипт и она меняет значение поля на under repair. Но вот что не могу сообразить как сделать так чтобы по нажатию на эту кнопку заполнялось поле на under repair (это выполняется) и открывалась форма с полями которые надо заполнить для того чтобы определить кто отдал в ремонт технику когда какая поломка итд. В общем я ищу какое то подобие команды @Command....Compose....чтобы потом создать историю поломок. А вот как ещё это открытие привязать не знаю рылся в хелпе не нашёл...и как это всё привязать? какой класс нужен ещё?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#2
Для: Gor
Тебе нужно создать документ-ответ:
Код:
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim newdoc As New NotesDocument(session.CurrentDatabase)

newdoc.Form = "Имя формы"
Call newdoc.MakeResponse(ws.CurrentDocument.Document)
Call ws.EditDocument(True, newdoc)

End Sub
В документе-ответе в событии PostSave прописать код на изменения поля status на under repair, а не как у тебя сейчас. Т.к. документ-ответ можно не сохранить (например, по ошибке кнопку нажал), а статус у тебя уже изменен.
 
D

Domino6

Гость
#3
или вызывай диалог там все заполняй а потом выставляй в нужных документах значения
 

Гость
#4
Помогите!!!!!!Нужно написать script(для почт.сервера).Задание такое:отбирать письма,отправляемые по признаку наличия номера 8095ххххххх в теме и отсылать их на определённные адресс.Очень большое спасибо, если кто сможет!
 

Gor

Well-Known Member
07.06.2005
517
2
#6
Но тут возникает ещё один тогда небольшой вопрос...

Каким образом потом провести снятие с ремонта?

Ведь надо будет потом опять изменить поле статус на пустое по кнопке (это ещё реализуемо) и удалить респонс документ именно к этой записи где записаны пометки о ремонте (кто отдал, когда итд.) Вот как удалить респонс?
Я предполагаю все записи об оборудовании находящемся в ремонте хранить в отдельной вьюхе.
Как лучше реализовать именно это удаление записей когда оборудование придёт с ремонта?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#7
Для: Gor
А зачем удалять ответ ? Он пойдет у тебя в историю для этой техники.
А реализовать, наверное, лучше так: документ-ответ у тебя создается когда техника в ремонт ушла. Т.е. там надо сделать кнопку, вроде "Пришел с ремонта". По нажатию которой меняется статус у главного документа (который описывает технику) и заносится дата возвращения из ремонта в Response-документ.
 

Gor

Well-Known Member
07.06.2005
517
2
#8
Не пойму в чём ошибка всё вроде бы правильно делаю....
Создал по кнопке респонс документ как и советовали
Код:
Sub Postsave(Source As Notesuidocument)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim User As Variant
Call workspace.EditDocument( True )
Set uidoc = workspace.CurrentDocument

User = uidoc.FieldGetText( "status")
Print User 
User = "under repair"
Call uidoc.FieldSetText(	"status" ,User)

Call uidoc.Refresh	
End Sub
этот код засунул в постсэйв в событие уже в респонсе новом.
Но сейчас в основной вьюхе где лежит весь список оборудования не отображается поле статус в колонке когда сохраняешь респонс.
Формула отбора там во вьюхе где всё оборудование лежит такая:

SELECT Form = "Printer_S" & !@IsResponseDoc
(Printer_S это форма по которой создавался весь список об-ия)

И насчёт кнопки пришёл с ремонта. Всё не так видимо просто.... Ведь надо будет по приходу с ремонта опять заполнять уже новую форму кто принял с ремонта во сколько когда цена ремонта итд. Т.е. как я понимаю видимо опять придётся сделать ещё одну кнопку которая бы делала опять же новый респонс с другими полями и на событии опять же постсэйв вешать код для очистки этого поля? к примеру такой какой нить?????
Код:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim User As Variant
Call workspace.EditDocument( True )
Set uidoc = workspace.CurrentDocument

User = uidoc.FieldGetText( "status")
Print User 
User = ""
Call uidoc.FieldSetText("status" ,User)

Call uidoc.Refresh
А потом во вьюхе где история поломок будет т.е. когда ушёл на ремонт когда пришёл с ремонта там какая выборка то будет вообще?? из 2х респонсов??
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#9
<!--QuoteBegin-Gor+9:08:2005, 11:49 -->
<span class="vbquote">(Gor @ 9:08:2005, 11:49 )</span><!--QuoteEBegin-->Но сейчас в основной вьюхе где лежит весь список оборудования не отображается поле статус в колонке когда сохраняешь респонс.
[snapback]23183" rel="nofollow" target="_blank[/snapback]​
[/quote]
А почему он должен отображаться ? :)
Поле статуса ты меняешь у response-документа, которые не отображаешь в представлении.
Меняй поле статуса не у response, а у главного документа.

<!--QuoteBegin-Gor+9:08:2005, 11:49 -->
<span class="vbquote">(Gor @ 9:08:2005, 11:49 )</span><!--QuoteEBegin-->И насчёт кнопки пришёл с ремонта. Всё не так видимо просто.... Ведь надо будет по приходу с ремонта опять заполнять уже новую форму кто принял с ремонта во сколько когда цена ремонта итд. Т.е. как я понимаю видимо опять придётся сделать ещё одну кнопку которая бы делала опять же новый респонс с другими полями и на событии опять же постсэйв вешать код для очистки этого поля? к примеру такой какой нить?????
[snapback]23183" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я бы сделал все это в одном документе. Одна поломка (с отчетом о ремонте) - один документ. Просто вначале не заполняешь некоторые поля, которые заполняешь когда техника вернется с ремонта (можно их скрывать в зависимости от статуса).
Но если ты хочешь отдельным документом, то делай форму Response-To-Response. :)
И будет у тебя вьюха с иерархией - документ с техникой, к нему дочерние с поломкой, к ним дочерние с отчетом о ремонте. :)
 

Gor

Well-Known Member
07.06.2005
517
2
#10
тоже верно)
У меня были мысли сделать это всё в одном документе просто скрытие я не знаю как написать)
его же надо прямо в поля записать...в hide paragraph.........is true
Просто тут условие какое то хитрое - одна группа полей должна скрываться когда нажимаешь кнопку с одним названием например "в ремонт" а другая группа полей должна быть открытой и наоборот...
 

Gor

Well-Known Member
07.06.2005
517
2
#11
Код:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim User As Variant
Call workspace.EditDocument( True )
Set uidoc = workspace.CurrentDocument

User = uidoc.FieldGetText( "status")
Print User 
User = "under repair"
Call uidoc.FieldSetText(	"status" ,User)

Call uidoc.Refresh
Так вот этот код на изменения поля status в респонсе.
Я так понимаю поле значит должно status быть в основном документе?
А событие всё равно на постсэйв в респонсе?
А как тогда обратиться к основному документу к полю status из респонса в постсэйв?? Всё тоже самое только Set uidoc = workspace.???????? и вот на этом месте должно быть имя формы? А он распознает то что ему надо именно к текущему документу статус применить (поменять в смысле) тогда же он вроде ко всем сразу применит документам статус :blink: ??
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#12
<!--QuoteBegin-Gor+9:08:2005, 12:22 -->
<span class="vbquote">(Gor @ 9:08:2005, 12:22 )</span><!--QuoteEBegin-->Просто тут условие какое то хитрое - одна группа полей должна скрываться когда нажимаешь кнопку с одним названием например "в ремонт" а другая группа полей должна быть открытой и наоборот...
[snapback]23186" rel="nofollow" target="_blank[/snapback]​
[/quote]
Первая должна быть открыта всегда. Вторая - только после ремонта. Имхо, так правильнее.

Статус надо сделать и в главном, и в респонсе. Пока у респонса статус "в ремонте", вторую группу полей не показываем. Статус можно даже не по кнопке сделать, а из списка выбирать.

Тебе надо получить back-end документ родителя. Например в PostSave респонса пишем:
Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument

Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)
doc.Status = Source.Document.Status
Call doc.Save(True, True)
End Sub
Этот код изменит статус родителя в зависимости от статуса потомка.

И сразу настрой права (поля Authors/Readers).
 

Gor

Well-Known Member
07.06.2005
517
2
#13
Код:
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim newdoc As New NotesDocument(session.CurrentDatabase)

newdoc.Form = "Имя формы"
Call newdoc.MakeResponse(ws.CurrentDocument.Document)
Call ws.EditDocument(True, newdoc)

End Sub
Додавлю уж этот вопрос)
Этот код как было описано создаёт респонс документ, а почему тогда поля типа computed в нём не отображаются взятые из родительского. Причём они не отображаются только тогда когда его создаёшь через Lotus script а если на @ формулах перейти @Command([compose];"название респонса") то все поля которые в ресонсе computed отображаются нормально
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#14
Т.е. как не отображаются ?
Какая формула у computed полей ?
 

Gor

Well-Known Member
07.06.2005
517
2
#15
ТТТАААККК))))
ок) попробую описать сначала всю ситуацию которая сейчас возникла.
Может так понятней будет. Просто вопросов много накопилось... за всё это обсуждение и что то не сходится помоему...
Что мы имеем:
имеем список оборудования записаный во вьюху заполняется он по родительской форме к примеру MAT.
Задача: Чтобы во вьюхе с оборудованием при постановке на ремонт техники отображался статус в отдельном столбце. (к примеру on repair) и при снятии он убирался. Также должна быть ещё одна вьюха фиксирующая все отправки на ремонт и приём с ремонта.
Выполнение:
Создаём поле Status в родительском документе пускай оно будет всегда скрытое. В родительском документе должны быть 2 кнопки отправка техники на ремонт и снятие с ремонта. Причём кнопка снятие с ремонта должна быть скрыта всегда если у родительского документа нету документа ответа????(писал я тут про это хитрое условие скрытия)Не соображу как это скрытие написать.... Отправка техники на ремонт осуществляется нажатием одной из кнопок в данном случае onrepair. По нажатию кнопки создаётся по скрипту документ ответ:
Код:
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim newdoc As New NotesDocument(session.CurrentDatabase)

newdoc.Form = "Имя формы"
Call newdoc.MakeResponse(ws.CurrentDocument.Document)
Call ws.EditDocument(True, newdoc)

End Sub
в котором содержатся поля и для принятия на ремонт и для снятия с ремонта
Но при нажатии кнопки onrepair поля для снятия с ремонта должны скрываться(здесь тоже как написать скрытие не очень понятно) . В документе ответе на событии постсэйв должен висеть скрипт который бы изменял поле статус в родительском документе на onrepair?

Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim doc As NotesDocument

Set doc = session.CurrentDatabase.GetDocumentByUNID(Source.Document.ParentDocumentUNID)
doc.Status = Source.Document.Status
Call doc.Save(True, True)
End Sub
Просто перед этим же надо сменить статус в респонсе.........чтобы этот код выполнялся....где ж его в какой момент поменять?
А во вьюхе со всеми поломками отображать надо именно этот респонс?
как раз со всеми полями? просто в Select будет имя этого респонса и всё?
 

Gor

Well-Known Member
07.06.2005
517
2
#16
так они же и так должны отображаться если одно поле допустим Editable в родительском а другое computed в респонсе и свойство у формы респонса
Formulas inherit values from selected documents...а в value у полей написаны только их названия без формул. Вроде бы так всегда computed отображались...Даже пробовал в этой базе документ с помощью Compose открыть и все поля computed отображаются.. а если этот скрипт на создание пишешь то нет....
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#17
Для: Gor
Как бы я сделал:
В родительском документе две кнопки. Одна создает документ с описанием поломки, другая его открывает (при возврате из ремонта).
По первой все понятно.
По второй. Пишешь код, который перебирает все документы-ответы и проверяет статус. Если находим ответ со статусом "В ремонте" (по идее таких должно быть не больше одного), то открываем его на редактирование. Иначе выводим сообщение, что оборудование рабочее :blink:.

В документе с поломкой есть поле "Status". И кнопка (вроде, "Ремонт завершен"), которая это поле обнуляет.
При создании документа с поломкой (по первой кнопке из родителя) автоматически ставится статус "В ремонте". Дополнительные поля (которые заполняются, когда ремонт закончен) скрываем формулой Status="В ремонте".
Также делаем ссылку на главный документ для удобства.

В Post Save документа с поломкой пишем код, который изменяет статус родителя в зависимости от статуса документа.
В главном документе делаем встроенное представление, которое показывает все документы-ответы. Это и будет историей.

<!--QuoteBegin-Gor+9:08:2005, 14:45 -->
<span class="vbquote">(Gor @ 9:08:2005, 14:45 )</span><!--QuoteEBegin-->Даже пробовал в этой базе документ с помощью Compose открыть и все поля computed отображаются.. а если этот скрипт на создание пишешь то нет....
[snapback]23196" rel="nofollow" target="_blank[/snapback]​
[/quote]
Т.к. когда делаешь через скрипт, то ты заранее создаешь back-end документ и открываешь его во front-end (т.е. фактически документ получается не вновь созданный и значения не наследуются). Когда делаешь через формулу, то там back-end документ создается только после сохранения front-end документа(документ вновь созданный и значения наследуются). Вроде так.
Через скрипты надо использовать формулу для наследования значений полей.
Код:
@GetDocField($Ref; "Имя поля в родителе")
Так делать удобно для Computed For Display полей. Тогда значение такого поля в документе-ответе всегда будет соотвествовать значению поля в главном документе.
 

Gor

Well-Known Member
07.06.2005
517
2
#18
Спасибо большое попробую твой вариант реализовать Medevic!
Ну уж если чего не допойму постить уж в эту тему буду не ругайте меня сильно матным языком :D
 

Gor

Well-Known Member
07.06.2005
517
2
#19
Для: Medevic
Всё вроде бы нормально кнопки по скрытию работают, снятие с ремонта вроде бы тоже продвигается удачно...
не совсем корректно работает одна вещь...
Например создаём респонс по скрипту (из родительского на него выходим по кнопке), Потом на событие PostOpen респонса я меняю поле статус в респонсе.
Оно успешно меняется. Когда вношу изменения в респонс и сохраняю там на событии PostSave висит скрипт который присваивет полю из родительского документа значение статуса из респонса который уже сменен по событию PostOpen в респонсе, НО!!!! 2 маленькие проблемки при этом если закрываем респонс, во вьюхе значение колонки статус не меняется сразу же. Тоже самое и в родительском. Только если заново открываешь родительский и вьюху там уже статус меняется... и + почему то не работает PostSave в респонсе вообще если сохранение проводится по кнопке а не когда сам документ предлагает себя сохранить. В кнопке сохранения @Command([FileSave]); @Command([FileCloseWindow])
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#20
<!--QuoteBegin-Gor+10:08:2005, 14:04 -->
<span class="vbquote">(Gor @ 10:08:2005, 14:04 )</span><!--QuoteEBegin-->Например создаём респонс по скрипту (из родительского на него выходим по кнопке), Потом на событие PostOpen респонса я меняю поле статус в респонсе.
[snapback]23257" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это зачем ты так делаешь ? Если ты хочешь инициализировать вычисляемое поле при создании документа, то использую в нем формулу типа:
Код:
@If(@IsNewDoc;"Значение";@ThisValue)
<!--QuoteBegin-Gor+10:08:2005, 14:04 -->
<span class="vbquote">(Gor @ 10:08:2005, 14:04 )</span><!--QuoteEBegin-->Оно успешно меняется. Когда вношу изменения в респонс и сохраняю там на событии PostSave висит скрипт который присваивет полю из родительского документа значение статуса из респонса который уже сменен по событию PostOpen в респонсе, НО!!!! 2 маленькие проблемки при этом если закрываем респонс, во вьюхе значение колонки статус не меняется сразу же. Тоже самое и в родительском. Только если заново открываешь родительский и вьюху там уже статус меняется...
[snapback]23257" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если я правильно понял, то так и должно быть. :D Жми F9 для обновления.


<!--QuoteBegin-Gor+10:08:2005, 14:04 -->
<span class="vbquote">(Gor @ 10:08:2005, 14:04 )</span><!--QuoteEBegin-->почему то не работает PostSave в респонсе вообще если сохранение проводится по кнопке а не когда сам документ предлагает себя сохранить. В кнопке сохранения @Command([FileSave]); @Command([FileCloseWindow])
[snapback]23257" rel="nofollow" target="_blank[/snapback]​
[/quote]
Должно работать всегда. Проверь дебаггером.