Lotus Script

Тема в разделе "Lotus - Программирование", создана пользователем Gor, 8 авг 2005.

  1. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Здавствуйте... Опять обращаюсь за помощью
    предположим вот имеется код по присвоению по кнопке полю значения
    Код (Text):
    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....чтобы потом создать историю поломок. А вот как ещё это открытие привязать не знаю рылся в хелпе не нашёл...и как это всё привязать? какой класс нужен ещё?
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Gor
    Тебе нужно создать документ-ответ:
    Код (Text):
    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, а не как у тебя сейчас. Т.к. документ-ответ можно не сохранить (например, по ошибке кнопку нажал), а статус у тебя уже изменен.
     
  3. Domino6

    Domino6 Гость

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

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

    Domino6 Гость

    Поставь правила на сервере
     
  6. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Но тут возникает ещё один тогда небольшой вопрос...

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: Gor
    А зачем удалять ответ ? Он пойдет у тебя в историю для этой техники.
    А реализовать, наверное, лучше так: документ-ответ у тебя создается когда техника в ремонт ушла. Т.е. там надо сделать кнопку, вроде "Пришел с ремонта". По нажатию которой меняется статус у главного документа (который описывает технику) и заносится дата возвращения из ремонта в Response-документ.
     
  8. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Не пойму в чём ошибка всё вроде бы правильно делаю....
    Создал по кнопке респонс документ как и советовали
    Код (Text):
    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 это форма по которой создавался весь список об-ия)

    И насчёт кнопки пришёл с ремонта. Всё не так видимо просто.... Ведь надо будет по приходу с ремонта опять заполнять уже новую форму кто принял с ремонта во сколько когда цена ремонта итд. Т.е. как я понимаю видимо опять придётся сделать ещё одну кнопку которая бы делала опять же новый респонс с другими полями и на событии опять же постсэйв вешать код для очистки этого поля? к примеру такой какой нить?????
    Код (Text):
    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х респонсов??
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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. :)
    И будет у тебя вьюха с иерархией - документ с техникой, к нему дочерние с поломкой, к ним дочерние с отчетом о ремонте. :)
     
  10. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    тоже верно)
    У меня были мысли сделать это всё в одном документе просто скрытие я не знаю как написать)
    его же надо прямо в поля записать...в hide paragraph.........is true
    Просто тут условие какое то хитрое - одна группа полей должна скрываться когда нажимаешь кнопку с одним названием например "в ремонт" а другая группа полей должна быть открытой и наоборот...
     
  11. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Код (Text):
    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: ??
     
  12. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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 респонса пишем:
    Код (Text):
    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).
     
  13. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Код (Text):
    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 отображаются нормально
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Т.е. как не отображаются ?
    Какая формула у computed полей ?
     
  15. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    ТТТАААККК))))
    ок) попробую описать сначала всю ситуацию которая сейчас возникла.
    Может так понятней будет. Просто вопросов много накопилось... за всё это обсуждение и что то не сходится помоему...
    Что мы имеем:
    имеем список оборудования записаный во вьюху заполняется он по родительской форме к примеру MAT.
    Задача: Чтобы во вьюхе с оборудованием при постановке на ремонт техники отображался статус в отдельном столбце. (к примеру on repair) и при снятии он убирался. Также должна быть ещё одна вьюха фиксирующая все отправки на ремонт и приём с ремонта.
    Выполнение:
    Создаём поле Status в родительском документе пускай оно будет всегда скрытое. В родительском документе должны быть 2 кнопки отправка техники на ремонт и снятие с ремонта. Причём кнопка снятие с ремонта должна быть скрыта всегда если у родительского документа нету документа ответа????(писал я тут про это хитрое условие скрытия)Не соображу как это скрытие написать.... Отправка техники на ремонт осуществляется нажатием одной из кнопок в данном случае onrepair. По нажатию кнопки создаётся по скрипту документ ответ:
    Код (Text):
    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?

    Код (Text):
    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 будет имя этого респонса и всё?
     
  16. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    так они же и так должны отображаться если одно поле допустим Editable в родительском а другое computed в респонсе и свойство у формы респонса
    Formulas inherit values from selected documents...а в value у полей написаны только их названия без формул. Вроде бы так всегда computed отображались...Даже пробовал в этой базе документ с помощью Compose открыть и все поля computed отображаются.. а если этот скрипт на создание пишешь то нет....
     
  17. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: 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 документа(документ вновь созданный и значения наследуются). Вроде так.
    Через скрипты надо использовать формулу для наследования значений полей.
    Код (Text):
    @GetDocField($Ref; "Имя поля в родителе")
    Так делать удобно для Computed For Display полей. Тогда значение такого поля в документе-ответе всегда будет соотвествовать значению поля в главном документе.
     
  18. Gor

    Gor Well-Known Member

    Регистрация:
    7 июн 2005
    Сообщения:
    517
    Симпатии:
    2
    Спасибо большое попробую твой вариант реализовать Medevic!
    Ну уж если чего не допойму постить уж в эту тему буду не ругайте меня сильно матным языком :D
     
  19. Gor

    Gor Well-Known Member

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    Это зачем ты так делаешь ? Если ты хочешь инициализировать вычисляемое поле при создании документа, то использую в нем формулу типа:
    Код (Text):
    @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]
    Должно работать всегда. Проверь дебаггером.
     
Загрузка...

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