Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум программистов _ Lotus - Программирование _ Россыпь мелких вопросов для разработчиков

Автор: Vagor.ini 13:11:2003, 14:21

Тема для постинга мелких вопросов - ответов для разрботчиков приложений и баз Lotus Notes. Если Ваш вопрос влечет долгое обсуждение, то желательно создать отдельную тему.

Автор: Vagor.ini 13:11:2003, 14:28

Для юзабильностиsmile.gif форм и страниц многие разработчики создают акцию(кнопку) "Закрыть" с командой

@Command([FileCloseWindow])


Но если на форме проводилось редактирование, а потом была нажата кнопка "Закрыть" с подобной командой (подразумевающая, что сохранять не надо) лотусовский клиент все равно спросит диалогом сохранять или нетsmile.gif

Чтобы заставить команду работать без подтвержения сохранения при закрытии следует указать следующий код:
FIELD SaveOptions:="0";
@Command([FileCloseWindow])

Автор: ЛотусМастер 13:11:2003, 16:34

Кстати, для справки: после присвоения SaveOptions:=0 не сохранит даже принудительный [FileSave]

Автор: Vagor.ini 13:11:2003, 19:18

Цитата
Кстати, для справки: после присвоения SaveOptions:=0 не сохранит даже принудительный [FileSave]

Знаем, юзалиsmile.gif

Так я же здесь и собрался такое, мелкое, постить. Будет и сложнее, буду по своим стопамsmile.gif следовать, что сам когда-то искал

Автор: Vagor.ini 13:11:2003, 19:48

Простой скрипт на выгрузку содержимого любого вида (представления) в Excel

Sub Click(Source As Button)
    Dim WS As notesuiworkspace
    Dim UiView As notesuiview
    Dim ViewString As String
    Dim session As NotesSession
    Dim db As NotesDatabase
    Dim v As NotesView
    Dim docX As NotesDocument
    Dim col As Integer
    Dim row As Double
    Dim xl As Variant
    Dim xlWbk As Variant
    Dim pagename As String
    
    Set WS = New notesuiworkspace
    Set session = New notessession
    Set db=session.CurrentDatabase
    
    Print "Please Be Patient as the Excel Spreadsheet is being created..."
    
' Get dynamic view name, R5 only
' Take this part out if using in R4, you have to hard-code the name of the view in ViewString
    Set UiView=WS.currentview
    ViewString=UiView.viewname
    
    Set v=db.GetView(ViewString)
    
' Create Excel Sheet
    Set xl=CreateObject("Excel.Application")
    Set xlWbk=xl.Workbooks.Add
    
' Add column headings to first row
    col=1
    Forall vColumn In v.Columns
 xlWbk.ActiveSheet.Cells(1, col)=vColumn.Title
 col=col+1
    End Forall
    
' Add row data from the documents
    row=2
    Set docX=v.GetFirstDocument
    While Not docX Is Nothing
 col=1
 Forall cValue In docX.ColumnValues
     xlWbk.ActiveSheet.Cells(row, col)=cValue
     col=col+1
 End Forall
 row=row+1
 Set docX=v.GetNextDocument(docX)
    Wend
    
' Make all columns fit
    xlWbk.ActiveSheet.Columns.AutoFit
    
    Print "Excel Document Successfully Created!"
    
' Open it up in Excel
    xl.Visible=True
    
End Sub

Автор: Vagor.ini 13:11:2003, 22:26

Открытие вида(представления) на весь экран, без списка видов в левой части базы

@Command([ViewNavigatorsNone])


P.S. Помню как сам "пылесосил" help пока нашел команду

Автор: Vagor.ini 13:11:2003, 22:32

Удаление неиспользуемых полей базы в инспекторе дизайнера

В Lotus Designer есть однаsmile.gif неудобная штука. Если Вы удалили поле, то в списке существующих полей (инспектор, поля для столбцов вида и т.п.) все равно висит имя этого, несуществующего поля. Это, в принципе ни на что не влияет, но засоряет список. Так вот чтобы убрать это имя поля из списка следует сделать:

1. убедиться, что поле нигде не используется (формы, подформы, документы, в том числе профильные)
2. на последней справа закладке св-в БД поставить галку на "Оптимизировать таблицы документов".
3. Запустить сжатие.

Автор: Vagor.ini 16:11:2003, 23:05

Агент позволяющий удалять дублирующие записи/документы в виде
Нашел вот только, сам не тестировал.

Option Declare
Sub Initialize
%REM
DESCRIPTION:
This agent loop through documents listed in ViewDelete and marks documents that duplicates column
values of another doc. If set it also deletes duplicates docs found in that view.

NOTES:
Design of ViewDelete:
- View should consist of at least one sorted column. To check if documents duplicate more then
one value, the appropriate number of sorted columns should be added.
- The last column in view should be UNSORTED, and got formula which names the field marking
duplicates (It's the best if there are no values displayed in the last column). Example
formula: MARK_DUPLICATES
Customizing agent:
- set nameViewDelete apropriate if you want to use your own name of view
- markOnly - set true if you want agent only to set field marking duplicates, not to
delete duplicates phisically; set false if you want to delete duplicates phisically
- doCheckMarkTags - set true if you want to preserve field names clash (agent stops if it finds
documents that already got field with name the same as field marking duplicates; set false to
delete all documents which have fields named as field marking duplicates with value valueTagItem
- set valueTagItem if you wants to mark duplicates with another value

HISTORY:
2001-09-05, T.Zoltowski, created
%END REM
'name of search view
    Const nameViewDelete = "ViewDelete"
'hard delete or just marking
    Const markOnly = False
'do check if there is already a field marking duplicates on doc
    Const doCheckMarkTags = True
'value marking duplicates
    Const valueTagItem = "1"
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase
    Dim viewDelete As NotesView
    Set viewDelete = db.GetView(nameViewDelete)
    If viewDelete Is Nothing Then
 Print |View "| & nameViewDelete & |" not found !? Exiting.|
 Exit Sub
    End If
    Dim numberColumns As Integer
    numberColumns = Ubound(viewDelete.Columns) + 1
'check if there is apropriate number of columns
    If numberColumns < 2 Then
 Print |There should be at least 2 columns in view "| & nameViewDelete & |" ! Exiting.|
 Exit Sub
    End If
    Dim columnIndex As Integer
'check if apropriate columns are sorted (it's a MUST to correctly find duplicates)
    For columnIndex = 0 To numberColumns - 2
 If Not viewDelete.Columns(columnIndex).IsSorted Then
     Print |Column | & (columnIndex + 1) & | in view "| & nameViewDelete & |" isn't sorted (it should be!) ! Exiting.|
     Exit Sub
 End If
    Next
'check if last column is unsorted (don't want to resort docs in view at any chance)
    If viewDelete.Columns(columnIndex).IsSorted Then
 Print |Last column in view "| & nameViewDelete & |" is sorted (it shouldn't be!)! Exiting.|
 Exit Sub
    End If
    Dim nameTagItem As String
'taking the name of field marking duplicates
    nameTagItem = viewDelete.Columns(columnIndex).ItemName
'actual doc
    Dim doc As NotesDocument
'doc preceding actual doc in view
    Dim docPrev As NotesDocument
    Set doc = viewDelete.GetFirstDocument
'are there any docs ?
    If doc Is Nothing Then Exit Sub    
'do any checks
    If checkMarkTags(doc, nameTagItem, doCheckMarkTags) Then
 Print |Doc has item "| & nameTagItem & |" - there could be marking clash (try another name)! Exiting.|
 Exit Sub
    End If
    Set docPrev = doc
    Set doc = viewDelete.GetNextDocument(doc)
    If checkMarkTags(doc, nameTagItem, doCheckMarkTags) Then
 Print |Doc has item "| & nameTagItem & |" - there could be marking clash (try another name)! Exiting.|
 Exit Sub
    End If
    Dim countProcessed As Long
    countProcessed = 1
    Dim countDuplicates As Long
    countDuplicates = 0
    Do Until doc Is Nothing
 If checkMarkTags(doc, nameTagItem, doCheckMarkTags) Then
     Print |Doc has item "| & nameTagItem & |" - there could be marking clash (try another name)! Exiting.|
     Exit Sub
 End If
 Dim isDuplicate As Variant
'we assume that actual doc is "identical" as previous
 isDuplicate = True
 For columnIndex = 0 To numberColumns - 2
     If docPrev.ColumnValues(columnIndex) <> doc.ColumnValues(columnIndex) Then
'there is a difference in column values - it's not a duplicate
   isDuplicate = False
   Exit For
     End If
 Next
 If isDuplicate Then
'mark duplicate
     Call doc.ReplaceItemValue(nameTagItem, valueTagItem)
     Call doc.Save(True, True)
     countDuplicates = countDuplicates + 1
 End If
 countProcessed = countProcessed + 1
 Print "Processed " & countProcessed & ", duplicates " & countDuplicates
'move to actual doc to next doc (move previous doc too)
 Set docPrev = doc
 Set doc = viewDelete.GetNextDocument(doc)  
    Loop
    If countDuplicates > 0 Then
'we found some duplicates
 If markOnly Then
'only mark - already done
     Print "Finished processing document: " & countDuplicates & _
     | found. Delete all docs with field "| & nameTagItem & |" set to "| & valueTagItem & |" manually.|
 Else
'do hard delete
     Print "Deleting duplicates"
'reference to doc being deleted (temporary)
     Dim docRemove As NotesDocument
'we are moving upright starting at last doc - it preserves before sliding docs in view after
'deleting docs and refreshing index
     Set doc = viewDelete.GetLastDocument
     Dim countDeleted As Long
     countDeleted = 0
     Do Until doc Is Nothing
'reset reference to deleted doc
   Set docRemove = Nothing
   If doc.HasItem(nameTagItem) Then
       If doc.GetItemValue(nameTagItem)(0) = valueTagItem Then
'if it's doc marked to removing
     Set docRemove = doc
       End If
   End If
   Set doc = viewDelete.GetPrevDocument(doc)
   If Not docRemove Is Nothing Then
'if there is doc to delete
       Call docRemove.Remove(True)
       countDeleted = countDeleted + 1
       Print "Deleted " & countDeleted & " of " & countDuplicates
   End If
     Loop
 End If
    End If
End Sub
Function checkMarkTags(doc As NotesDocument, itemName As String, doCheck As Variant) As Variant
    If doCheck Then
 If doc.HasItem(itemName) Then
     checkMarkTags = True
     Exit Function
 End If
    End If
    checkMarkTags = False
End Function

Автор: Vagor.ini 26:11:2003, 19:20

Может кто сталкивался с подобным вопросом, подскажите пути решения.

Есть вид (view), в котором ряд колонок имеют total'ы, т.е. подбиты суммы и все это собрано в категорию и при свертке строк олучается около 100 шт. Нужно из другой базы получить total'ы категорий программно, допустим по запросу ключевой колонки (первой категоризированной в виде).

Спасибо!

Автор: mony_id 26:11:2003, 19:25

Цитата
Может кто сталкивался с подобным вопросом, подскажите пути решения.

Есть вид (view), в котором ряд колонок имеют total'ы, т.е. подбиты суммы и все это собрано в категорию и при свертке строк олучается около 100 шт. Нужно из другой базы получить total'ы категорий программно, допустим по запросу ключевой колонки (первой категоризированной в виде).

Спасибо!


КАК-ТО НЕ СОВСЕМ ПОНЯНО, ЧТО БУДЕТ ЯВЛЯТЬСЯ КЛЮЧЕМ ДЛЯ ДАННЫХ ИЗ ДРУГОЙ БАЗЫ

Автор: Vagor.ini 26:11:2003, 19:36

mony_id

Цитата
ЧТО БУДЕТ ЯВЛЯТЬСЯ КЛЮЧЕМ ДЛЯ ДАННЫХ

Данные из категоризированного первого столбца вида

Автор: mony_id 26:11:2003, 19:37

С ЛЕТА НЕ СКАЖУ НО НАДО ПОДУМАТЬ, ВООБЩЕТО В СКРИПТАХ ЕСТЬ ПРИМЕРЫ НЕ ПЛОХИЕ, ТАМ ГЛЯНЬ. ЕСЛИ ЧТО НИ-ТЬ НАЙДУ БРОШУ

Автор: mony_id 26:11:2003, 19:40

Vagor.ini
ДАЙ ТИПЫ ДАННЫХ И ЧТО С ЧЕМ ВЯЗАТЬ А ТО ПЛОХО ПРЕДСТАВЛЯЕТСЯ:

ВИД1
МЯСО 10
ПИВО 20
ВОДКА 30
60

Автор: Guest_VZH 26:11:2003, 19:45

Используй либо execute("@DBLookUP(...)") или объект типа NotesNavigator

Автор: Vagor.ini 26:11:2003, 19:54

mony_id
Типа вид

Name Col
-----------------------
>Полка 7
>>Шуруп 3
>>Гайка 2
>>Стяжка 2
>Стол 10
>Стул 13

30

Категория полка типа раскрытаsmile.gif

Нужно программно добраться до тотала полки=7, стол=10 и т.п

Автор: mony_id 26:11:2003, 19:58

ЗАНЕШЬ МОЖНО ПРИ ПОМОЩИ ДОКУМЕНТКОЛЕКШИОНС ПОСЧИТАТЬ СКОЛЬКО ДОКУМЕНТОВ СО ЗНАЧЕНИЕМ "ПОЛКА В ДАННОМ ВИДЕ" И НЕ ТОЛЬКО ПОСЧИТАТЬ НО И СЛОЖИТЬ ЗНАЧЕНИЯ, С ВЕРСИИ 6 ПОЯВИЛИСЬ В СКРИПТАХ МАССИВЫ.

Автор: Vagor.ini 26:11:2003, 20:13

mony_id
Колекциями я то знаю и это делаю, я имел ввиду вопрос можно ли программно получить доступ к тоталам, не персчитываю что-то отдельно. Работаю на 5 domino.

Ну в принципе я написал, работает, просто по ключу считаю (без всяких тоталов)

Sub Initialize
    Dim session As NotesSession
    Dim db As NotesDataBase
    Dim doc As NotesDocument    
    
    Set session = New NotesSession    
    Set w = New NotesUIWorkspace  
    ' Для текущей базы
    Set db = session.CurrentDatabase
    Set doc = w.CurrentDocument
    ' Для базы РВП
    Set dbRVP = New NotesDatabase("mpovtsrv/mpovt/by","BASEMPOVT\RVP.nsf")
    Set viewRVP = dbRVP.GetView("ExcelAllRVP")
    Set docRVP = viewRVP.GetFirstDocument
    
    Dim DSE As String
    Dim TPrice As Double
    
    Do While Not (docRVP Is Nothing)
 DSE = docRVP.TAISRVPform(0)
 Do While (docRVP.TAISRVPform(0)=DSE)
     TPrice = TPrice + Cdbl(docRVP.Field15RVPform(0))
     Set docRVP = viewRVP.GetNextDocument(docRVP)
     If (docRVP Is Nothing) Then
   Exit Do
     End If
 Loop
 
 Set doc = New NotesDocument(db)
 doc.Form = "RVPProductForm"
 doc.DCE_RVP = DSE
 doc.Price_RVP = TPrice
 Call doc.Save(True,False)
 TPrice=0
    Loop
End Sub

Автор: mony_id 26:11:2003, 20:25

Цитата
Колекциями я то знаю и это делаю, я имел ввиду вопрос можно ли программно получить доступ к тоталам, не персчитываю что-то отдельно. Работаю на 5 domino.

Ну в принципе я написал, работает, просто по ключу считаю (без всяких тоталов)


КЛАДУ РУКУ НА СЕРДЦЕ НО НИЧЕГО СЕЙЧАС НЕ СКАЖУ. БОЛЬНО ГОЛОВА БОЛИТ. И Я КАК ТО БОЛЬШЕ АДМИНИСТРИРОВАНИЕМ ЗАНЯТ.

ПРОГРАММНО К ТОТАЛАМ МОЖНО ЕСЛИ ДО ЗАВТРА ТЕРПИТ ТО НАЙДУ ГДЕТО ПОПАДАЛОСЬ.

ТАМ НУЖНО ПРАВИЛЬНО ХОДИТЬ ПО СТОЛБЦАМ В ВИДЕ rolleyes.gif

Автор: Vagor.ini 26:11:2003, 20:34

mony_id

Цитата
ПРОГРАММНО К ТОТАЛАМ МОЖНО ЕСЛИ ДО ЗАВТРА ТЕРПИТ ТО НАЙДУ ГДЕТО ПОПАДАЛОСЬ.

Естественно, подождет, найдешь пиши. Не болейsmile.gif

Автор: mony_id 27:11:2003, 17:09

Цитата
Естественно, подождет, найдешь пиши. Не болей


Почти выздоровил.

пока не нашел, но думаю на днях будет кусок того срипта, мы когда-то тоталы получали, что-бы их в эксель перетаскивать.


Уж чем болен Лотус так это очень слабенькими отчетами. там только своими ручками.

Автор: Vagor.ini 27:11:2003, 20:07

mony_id

Цитата
пока не нашел, но думаю на днях будет кусок того срипта, мы когда-то тоталы получали, что-бы их в эксель перетаскивать.

Во-во, мне тоже в excel загрузить надо в итоге
Цитата
Уж чем болен Лотус так это очень слабенькими отчетами. там только своими ручками.

Вот и нечего "растаскивать" корпоративные базы по локальным отчетамsmile.gif

Автор: mony_id 28:11:2003, 17:20

Цитата
Вот и нечего "растаскивать" корпоративные базы по локальным отчетам


Да в принципе правильно, хоть Домино и есть первая система безбумажного документооборота, но большим босам как всегда приходится отдавать материал на бамажке. tongue.gif

Автор: VZH 9:01:2004, 19:02

Это VZH (пароль за праздники забыл нафик)-

С помощью NotesNavigator не проблема в скрипте получить все тоталы.

Еще можно сделать Execute с @Sum(@DBLookup(...))

Вообщем не проблема :-)

Автор: Vagor.ini 9:01:2004, 21:27

VZH
Точно, во блин ламакsmile.gif решение как всегда на поверхности

Цитата
@Sum(@DBLookup(...))

так и буду делать...

Автор: Nestor 19:01:2004, 08:10

Народ! Есть очень наболевший вопрос... а именно, как генерить отчеты в lotus? Конечно, все можно выгружать в офис, или ещё куда (Crystal Report), но это все какая-то чушь... Есть возможность "набивать" программно отчеты в ричтекстполе, это более интересно. Если генерить по старинке, т.е. построчно, присутствуют гадкие пробелы перед и после вставляемых строк, как это обойти?

Автор: Vagor.ini 19:01:2004, 13:14

Не знаю что значит по старинке, в принципе отчетами внутри лотуса не занимался, а $Trim не поможет обрезать пробелы...

Автор: mony_id 27:01:2004, 17:37

Вот тема: кто знает как организовано построение топологии сети в административном клиенте.

Например: в разделе Replication Topology.

Меня интересует как сделана графическая часть, что и от куда берется, я понял. А вот как сделана графическая часть вот интересно. Есть задумки реализовать это в некоторых базах данных.

Рад буду услышать ваши мнения.

Автор: Arly 4:03:2004, 10:50

У меня вопрос к опытным разработчикам, если будет время вы бы не могли дать какое нибудь простенькое описание агента, с чего начинать его писать, какие объекты создавать, в смысле ссылки, создавать новую сессию или нет, новое раб. простр. или тоже нет. как связать этого агента с нужной б.д. и т.д. Просто мозги никак не доходят, вроде все по рпимерам делаешь, но почему-то всегда все криво получается, или мозги у меня кривые. короче ПОМОГИТЕ!!!!!!!!!!

Автор: Vagor.ini 4:03:2004, 20:55

Arly
Ok, агент, как правило обрабатывает выделенный документ или все документы, запускается вручную, по событию или расписанию и имеет собственно саму программу ( на языках @ формулы, lotusScript, Java, Simple actions) .

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

Автор: Arly 5:03:2004, 04:13

Vagor.ini Да неважно, мне бы понять в общем так сказать смысле. Ну хотя бы для какой нибудь простенькой б.д.
я у Дебби Линд читал, там вроде описан почтовый агент, принимающий почту, но не все так просто в этой жизни, в смысле отдельные моменты так и не дошли до меня, так например If note. Form ( 0 ) = "REQ" Then, до моей дырявой головы не доходит REQ это форма или поле и как его помечать, но это лишь один из многих моментов которые тревожат душу , но не доходят до мозгов. Спасибо

Автор: Arly 5:03:2004, 04:14

Vagor.ini Да неважно, мне бы понять в общем так сказать смысле. Ну хотя бы для какой нибудь простенькой б.д.
я у Дебби Линд читал, там вроде описан почтовый агент, принимающий почту, но не все так просто в этой жизни, в смысле отдельные моменты так и не дошли до меня, так например If note. Form ( 0 ) = "REQ" Then, до моей дырявой головы не доходит REQ это форма или поле и как его помечать, но это лишь один из многих моментов которые тревожат душу , но не доходят до мозгов. Спасибо

Автор: nor 10:04:2004, 20:05

Уважаемый, Arly. Вот пример крайне простого агента, который производит поиск документов по заданным критериям и найденные документы отображает в папке. В работе агента, я думаю, не составит труда разобраться.

(Declaration)
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim profile As NotesDocument
Dim collection As NotesDocumentCollection
Dim view As NotesView
Dim entry_collection As NotesViewEntryCollection

(Initialize)
Set session = New NotesSession

Set db = session.CurrentDatabase

Set doc = session.DocumentContext

Set view = db.GetView("($profile)")
Set profile = view.GetFirstDocument

Call Search(doc)

Sub Search(doc As NotesDocument)
Dim search_str As String
Dim searchConsultantType As Variant
Dim list_members As String
Dim coord_place As NotesDocument

Select Case doc.category(0)
Case "0"
search_str = "Form = ""consultrequest"""
If doc.request_contact_person(0) <> "" Then search_str = search_str + " & " + "contact_person = """ + Trim$(doc.request_contact_person(0)) + """"
If doc.request_consultant_name(0) <> "" Then search_str = search_str + " & " + "consultant_name = """ + Trim$(doc.request_consultant_name(0)) + """"
If doc.request_status(0) <> "Выбрать..." Then
search_str = search_str + " & " + "doc_status = """ + Trim$(doc.request_status(0)) + """"
Else
search_str = search_str + "& @Contains(doc_status; ""1"" : ""2"" : ""3"" : ""4"" : ""5"" : ""8"" : ""9"")"
End If
If doc.request_urgency(0) <> "Выбрать..." Then search_str = search_str + " & " + "consult_urgency = """ + Trim$(doc.request_urgency(0)) + """"
If doc.request_target(0) <> "Выбрать..." Then search_str = search_str + " & " + "consult_target = """ + Trim$(doc.request_target(0)) + """"
If doc.request_consult_type(0) <> "Выбрать..." Then search_str = search_str + " & " + "consult_type = """ + Trim$(doc.request_consult_type(0)) + """"
If doc.request_date_start(0) <> "" Then search_str = search_str + " & " + "@Created >= @TextToTime(""" + Cstr(doc.request_date_start(0)) + """)"
If doc.request_date_end(0) <> "" Then search_str = search_str + " & " + "@Created <= @TextToTime(""" + Cstr(doc.request_date_end(0)) + """)"
Case "1"
search_str = "Form = ""consultrequest_author"""
If doc.author_LastNameRus(0) <> "" Then search_str = search_str + " & " + "userLastNameRus = """ + Trim$(doc.author_LastNameRus(0)) + """"
If doc.author_FirstNameRus(0) <> "" Then search_str = search_str + " & " + "userFirstNameRus = """ + Trim$(doc.author_FirstNameRus(0)) + """"
If doc.author_MiddleNameRus(0) <> "" Then search_str = search_str + " & " + "userMiddleNameRus = """ + Trim$(doc.author_MiddleNameRus(0)) + """"
If doc.author_company(0) <> "" Then search_str = search_str + " & " + "organization = """ + Trim$(doc.author_company(0)) + """"
If doc.author_email(0) <> "" Then search_str = search_str + " & " + "email = """ + Trim$(doc.author_email(0)) + """"
Case "2"
search_str = "Form = ""consultant"""
If doc.consultant_LastNameRus(0) <> "" Then search_str = search_str + " & " + "userLastNameRus = """ + Trim$(doc.consultant_LastNameRus(0)) + """"
If doc.consultant_FirstNameRus(0) <> "" Then search_str = search_str + " & " + "userFirstNameRus = """ + Trim$(doc.consultant_FirstNameRus(0)) + """"
If doc.consultant_MiddleNameRus(0) <> "" Then search_str = search_str + " & " + "userMiddleNameRus = """ + Trim$(doc.consultant_MiddleNameRus(0)) + """"
If doc.consultant_medicine_place(0) <> "" Then search_str = search_str + " & " + "medicine_place = """ + Trim$(doc.consultant_medicine_place(0)) + """"
If doc.consultant_email(0) <> "" Then search_str = search_str + " & " + "email = """ + Trim$(doc.consultant_email(0)) + """"
If doc.consultant_type(0) <> "Выбрать..." Then search_str = search_str + " & " + "@Contains(consult_type; """ + doc.consultant_type(0) + """)"
End Select

Set collection = db.Search(search_str, Nothing, 0)
Set view = db.GetView("SearchResults")
Set entry_collection = view.AllEntries
Call entry_collection.RemoveAllFromFolder("SearchResults")
If collection.Count <> 0 Then
Call collection.PutAllInFolder("SearchResults")
Call view.Refresh
End If

Set coord_place = New NotesDocument(dB)
coord_place.Form = "coordinator_place"
coord_place.menu = "SearchResults"
coord_place.title = ":: Результаты поиска документов"
coord_place.is_folder = 1
Call coord_place.ComputeWithForm(False, False)
Call coord_place.Save(True, True)
Print "[" + profile.db_directory(0) + "/" + db.FileName + "/0/" + coord_place.UniversalID + "?OpenDocument]"

End Sub

Автор: Guest 12:04:2004, 02:23

nor Спасибо, буду разбирать.

Автор: Veselinka 12:04:2004, 12:07

Есть предложение, при написании сэмпловых скриптов в формуе - выделять самую суть, которая решает поставленный вопрос, а то каждый раз... куча нагромождения... так и хочется упомянуть шутку из Титаника "о страсти некоторых мужчин к большим размерам". tongue.gif Чем лаконичнее изложено решение проблемы - с минимум посторонних, не относящихся к делу подробностей, тем как правило понятнее бывает тому, до кого это решение пытаются донести.

Автор: nor 12:04:2004, 17:52

Veselinka, я написал "САМУЮ СУТЬ", которая "решает поставленный вопрос", без "нагромаждения". smile.gif

Автор: osmor 13:04:2004, 13:45

Доброго всем времени.
Поможите кто чем может.
Вопрос такой, как в форме вывести RTF поле и при этом не дать его редактировать. Другие поля должны редактироваться.
Попытался сделать как учит ув. Veselinka (еще раз спасибо за "Концепции ..." :-)) т.е. создал два поля одно изменяемое, второе вычисляемое c "противоположной" видимостью. Но почему, то не хочет вычисляться поле "текст RTF".
Если вместо вычисляемого "текст RTF" поставить поле с типом "текст" и формулу для вычисления @abstract (..... ), то все работает, но тогда форматирование текста теряется.
Спасибо.
Чуть не забыл работаю на 6.5

Автор: nor 13:04:2004, 17:56

Привет, osmor.
Это стандартная ситуация: поле включаешь в Controlled Access Section. Тип секции - Computed. Далее необходимо указать условие (формулу), которое предоставляет доступ к секции для редактирования указанным людям (имя пользователя нужно указывать в иерархическом виде), указанным группам, или указанным людям, наделенными определенными правами. Также секцию можно скрыть, свернуть и т.д. Подпись секции также можно отдельно скрыть. Приведу пример:

@If(
is_under_execution = 0;
"[request_author]";
"[noone]"
)


Данная формула предоставляет доступ к секции (к полям секции) для редактирования пользователям с ролью "request_author", если статус документа "is_under_execution = 0". Иначе, если условие не выполняется, доступ предоставляется пользователям с ролью "noone". Здесь - внимание. В acl бд у меня вообще нету такой роли. Таким образом, при невыполнении условия, поля секции все пользователи системы, вне зависимости от их уровня доступа к бд, могут только прочитать, так как пользователей с ролью "noone" у меня вообще нету. Немного непонятно и каламбурно. Почему я вместо "noone" не указал "" или что-то другое? Я уже не помню. Этот пример взят из работающей бд и когда-то был выработан мной с затратами определенного количества нервной энергии и времени. smile.gif

Автор: osmor 14:04:2004, 05:20

Огромное спасибо, nor!!!
Все получилось, все работает. rolleyes.gif
Это как раз к вопросу о концепции, пока не знаешь КАК можно потратить дни, и никакие знания языка здесь не помогут...
И еще сразу вопрос, можно как то избавиться от этого красивого окошка "Изменять содержимое данного раздела могут", которое выскакивает при одинарном клике на разделе?
Еще раз спасибо. biggrin.gif

Автор: Veselinka 14:04:2004, 06:19

Нор, рулез - я не знала такого способа обходиться с вычисляемыми РТФами wink.gif
Спасибо за подсказку, как-то сталкивалась с этой проблемой - через подформы решала, не помню правда уже как, но 5-ка глючила, когда РТФ поле с одним именем отображалось то как редактируемое, то как вычисляемое, вобщем по сути элегантно эта проблема так и не была решена.

Автор: osmor 14:04:2004, 08:17

Опять вопросы...
Хочу чтобы пользователь ввел даные в поле формы, но не просто, а в отдельно открывшемся окне.
Пытаюсь использовать для этого @DialogBox
Создал форму в которой есть одно поле, такое же как в той форме данные в которой изменяет пользователь.
ПОсле определенныго события выдываю @DialogBox с этой маленькой формой.
Но почемуто при нажаниина OK, данные в поле основной формы не отображаются и не сохраняются ....
Вероятнее всего что-то делаю не так, но что?
И второй вопрос вытекающий из первого, можно ли как-то изменить перед записью в поле, те данные которые пользователь ввел в форме открытой через @DialogBox, ну например добавить в тому что ввел пользователь его имя и дату (как получить имя и дату знаю biggrin.gif )

Автор: osmor 14:04:2004, 08:59

Первая часть вопроса снята. Прошу прощения за беспокойство. Сам мир blink.gif
Внимательнее папиры читать надо.
"Rich text fields will not be displayed in the form, even if field names are the same as in the current document"
А у меня как раз Rich text fields.

Автор: nor 14:04:2004, 09:47

Привет, Osmor.

Попробуй в событии Input Translation нужного тебе поля написать нужный тебе код. Например, для поля OfficePhoneNumber нужно, что в нем после заполнения его по методу @DialogBox автоматически вначале поля вставлялся какой-то текст, например, "(без кода города)".

OfficePhoneNumber = "";
""(без кода города) " + OfficePhoneNumber;


Вот. Аналогично можно манипулировать содержанием поля при помощи LotusScript, сымитировать кнопки OK и Cancel на диалоговой форме и навесить на них собственный обработчик.

Если возникнут трудности, то обращайся, я все более подробно расскажу. Просто в архиве не хочу копаться...

Автор: osmor 14:04:2004, 10:50

Спасибо.
Проверка правиности приема smile.gif

Цитата
содержанием поля при помощи LotusScript, сымитировать кнопки OK и Cancel на диалоговой форме

Сие значит, что я в @DialogBox прячу обе кнопки ([NOOKCANCEL]:[NOCANCEL]), а в форме рисую свои со своей обработкой?
Здорово...
Если я правильно понял, можно не отвечать ....

Автор: nor 14:04:2004, 18:49

Ты правильно понял.

Автор: Vagor.ini 15:04:2004, 06:58

Такой вопрос, может кто нотолкнет на идею, как сделать...

Есть форма (форма вызывается как диалог @DialogBox), на ней EmbeddedView, нужно получить доступ к самому EView, чтобы потом иметь доступ к выделенномы документу.

И еще фишка, кто не знает, ActionBar у встроенного вида на форме, которая вызывается через диалог не отображается... (или я не прав?)

Автор: Isk 15:04:2004, 10:26

Помогите, есть база, в ней документы, в документе поле "название базы", тип поля-диалог лист, надо посчитать сколько раз выбрали именно эту базу и вывсети куда нибудь, как можно это сделать и куда ? Санкс

Автор: Vagor.ini 15:04:2004, 12:21

Isk
Что значит выбрали, не понятно...

Автор: nor 15:04:2004, 18:57

Isk
Я смогу помочь тебе, но мне оязательно нужно знать, каким релизом лотуса ты пользуешься? 6 или 5?

Автор: nor 15:04:2004, 19:17

Vagor.ini
Я попробовал решить твою проблему и вот с какими проблемами столкнулся:
1. Если форму, вызываемую через @DialogBox, определить как Layout Region, то на нее Embedded View внедрить никак не получается.
2. Если использовать обыкновенную форму, вызываемую через @DialogBox, то можно внедрить туда Embedded View и производить навигацию по документам. При этом нам необходимо наличие действий, которые бы обрабатывали выбранный документ. Пускай действия будут выполнятся при помощи кнопок. Я так и сделал. Вызвал форму через @DialogBox и перевел курсор на Embedded View. После чего перевести курсор на какую-либо другую область этой же формы мне не удавалось (элементарно что бы нажать на кнопку и запустить оработчик).

Такие вот дела. Поэтому помочь тебе не получается.

Однако, я думаю, можно все же операцию твою заменить вызывом диалогового окна с содержанием не формы , а нужного тебе предствления: @PickList.

Автор: Isk 16:04:2004, 02:15

nor 6. Мне сказали сделать счетчик.
Vagor.iniВ смысле есть поле, там названия типа "обращения граждан", "входящие" и т.д., надо посчитать сколько раз выбрали допустим "обращения граждан" и вывести все это куда-нибудь. Конкретно куда не сказали.

Автор: mony_id 16:04:2004, 16:20

Цитата
Помогите, есть база, в ней документы, в документе поле "название базы", тип поля-диалог лист, надо посчитать сколько раз выбрали именно эту базу и вывсети куда нибудь, как можно это сделать и куда ? Санкс

Два пути решения проблемы:
1. Открыть базу данных log.nsf и там посмотреть(это если действительно осуществляется обращение к базе данных).
2. Пишется скрипт в кнопке выбора и один из его параметров это создание документа в какой нибудь другой базе данных.

Автор: mony_id 16:04:2004, 16:36

Цитата
nor 6. Мне сказали сделать счетчик.
Vagor.iniВ смысле есть поле, там названия типа "обращения граждан", "входящие" и т.д., надо посчитать сколько раз выбрали допустим "обращения граждан" и вывести все это куда-нибудь. Конкретно куда не сказали.

И наверное сказали что-бы счетчик был типа 1,2,3,4 и т.п.

Варианты могут быть следующие:
1. подсчитавть количество документов в виде и присваивать номер (Недостаток если одновременно создаются документы несколькими пользователями то номер для этих пользователей может быть один и тотже и со временем вычисление № с четырехзначным числом станет занимать много времени).
2. Использовать отдельную базу для регистрации номера в одном единственном документе с заменой этого номера (Недостаток одновременное обращение к документу приведет к созданию конфликта репликации).
3. Использовать связку с реляционной базой данных, с одной таблицей и двумя полями "Счетчик" и "копия счетчика". Как работает не скажу.
4. Использовать свой оригинальный способ создания счетчика.

Я делал сочитание времени и личного идентификатора пользователя "ИДВ-170104180501" такой номер никода не повторится.
Противникам такого скажу: очень простое и надежное решение, когда сливаются несколько реплик, и потом вот как вам номера ГТД.

Автор: Isk 19:04:2004, 02:30

Еще вопрос. Подскажите как сделать так чтобы в документе поля после второго открытия не были редактируемыми. спасибо за помощь.

Автор: osmor 20:04:2004, 07:11

Цитата(Isk @ 19:04:2004, 05:30 )
Еще вопрос. Подскажите как сделать так чтобы в документе поля после второго открытия не были редактируемыми. спасибо за помощь.

Чуть Выше в этой ветке ув. nor отвечал мне на подобный вопрос.

Автор: osmor 20:04:2004, 08:21

Всем доброго времени суток.
Опять простенькая задачка.
История работы с документом.
Открыли - добавилась запись в поле с историей
Изменили что-то в документе - добавилась запись в поле с историей
Все получается кроме одного, как заставить выводить каждую новую запись в этом поле с новой строки?
В текстовое поле если при формированиии добавлять между записями @Char(10) & @Char(13) в любой комбинации не помогает.
Если использовать ":" для соединения записей тоже не переносит на новую...
МОжет конечно надо вместо тектового поля использовать список, но у меня не получилось, в него вообще не добавляется
Спасибо.

Автор: Veselinka 20:04:2004, 08:33

1. При внесении истории - организуй ее в виде Text List - ТО есть списка строк.
2. В самом поле на 3 закладке свойств есть опции отображения мультивалюйности - там и выбери разделитель.
3. Очевидно на 1 закладке свойств надо сказать Allow multiple

Автор: Guest_osmor 20:04:2004, 09:21

Спасибо.
1. Text List не нашел использовал ListBox (я его уже и раньше пробовал)
2. В случае если тип ListBox эта поле недоступно (disabled)
3. Эта галка установлена
Со списком я уже пытался, но в него ничего не получается добавить

Пока решил так
1. Сделал невидимое поле (Text) назвал fldHistory
2. В него по событиям добавляю строки (@SetField("fldHistory"; fldHistory : "ПОльзователь такой-то сделал то-то");
3. Сдела видимое вычисляемое поле ListBox назвал fldViewHistory в нем "Use formula for choices" - @Explode(fldHistory;",")

Вроде работает.
Но вопрос, "как программно добавить новое значение (item) в список", остался.
И вообще, может я изобретаю велосипед... как принято такие задачи решать в Lоtus?

Автор: Isk 20:04:2004, 10:11

Подскажите как в поле сохранить число? Не получается. ЛН ругается что неправильное использование свойства.

Автор: Isk 20:04:2004, 10:50

Задолбался я уже, и так пробовал и по другому.

Автор: Chernom0r 20:04:2004, 11:13

Цитата(Isk @ 20:04:2004, 13:50 )
Задолбался я уже, и так пробовал и по другому.

чтобы сохранить число в поле это поле должно иметь соответствующий формат (Number)
Либо придется переводить числовое значение в string.

Автор: nor 20:04:2004, 16:05

To osmor

Форма: "temp1".
Поле, которое содердит текст логов: "history", Text, Computed when composed, Value: history.

(Declaration)
Dim session As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim item As NotesDocument

Sub Initialize
    
    Set session = New NotesSession
    Set ws = New NotesUIWorkspace
    Set db = session.CurrentDatabase
    
End Sub

Sub Postopen(Source As Notesuidocument)
    
    Set uidoc = ws.CurrentDocument
    Set doc = uidoc.Document
    
End Sub

Sub Click(Source As Button)
    Dim new_msg As String
    
    new_msg = "сообщение 1"
    doc.history = doc.history(0) + Chr(10) + new_msg
    
    new_msg = "сообщение 2"
    doc.history = doc.history(0) + Chr(10) + new_msg
    
    new_msg = "сообщение 3"
    doc.history = doc.history(0) + Chr(10) + new_msg
    
    Call doc.Save(True, True)
    
End Sub



Каждый раз, при активировании действия (Sub Click)? в поле "history" добавляется некоторая текстовая информация, новые сообщения добавляются с новой строки причем.

Автор: nor 20:04:2004, 16:18

to Isk

Форма: "temp1".
Поля:
1. "number_field", Number, Computed when composed, Value: number_field.
2. "number_field2", Number, Computed when composed, Value: number_field2.

(Declaration)          
Dim session As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument

Sub Initialize
    
    Set session = New NotesSession
    Set ws = New NotesUIWorkspace
    Set db = session.CurrentDatabase
    
End Sub

Sub Postopen(Source As Notesuidocument)
    
    Set uidoc = ws.CurrentDocument
    Set doc = uidoc.Document
    
End Sub

Sub Click(Source As Button)
    Dim value As String
    
    value  = Inputbox$("Введите целое число:", "Новое число")
    If value = "" Then Exit Sub
    
    doc.number_field = Cint(value)
    doc.number_field2 = (doc.number_field(0) * 3) / 5
    
    Call doc.Save(True, True)
    
End Sub



Каждый раз, при активировании действия (Sub Click), в поле number_field записывается число, указанное пользователем. На основании значения поля "number_field" по определенной формуле рассчитывается числовое значение поля "number_field2".

Автор: Isk 21:04:2004, 03:22

Спасибо nor , ты не можешь подсказать как сделать это все без ввода числа пользователем. просто допустим есть какой-то счетчик в форме или виде и надо его значение сохранить в поле чтобы при создании нового документа по этой форме брать значение из этого поля последнего документа. своего рода сортировка . то есть во всей коллекции ищется макс. знач. и наращивается на 1.

Автор: Guest 21:04:2004, 05:28

Спасибо nor.
С помощью Lotus script не пробовал, все пытался на собаках, поскольку вроде все должно было получиться ...
но такой же способ с использованием @Char не сработал.

Автор: Vagor.ini 21:04:2004, 05:46

Isk
Здесь тебе помощь - читать про профайловые формы, через них можно легко организовать счетчик, и обрабатывать его на событии QuereSave

Автор: osmor 21:04:2004, 13:22

Вопросец.
Существует ли в Lotus (IBM) общепринятая нотация именования объектов? Типа Венгерской ...
Ну привык я, что нужно именовать по правилам ...
Можно конечно и Венгерскую подогнать, или самому придумать, но может есть уже принятые правила именования?
Например:
Два поля одно для ввода данных другое для отображения ...
View (представления), наборы рамок, страницы, агенты, структуры, да и действия тоже наверное ...

Автор: Vagor.ini 21:04:2004, 13:42

osmor
Ну не знаю, определенной наверное нет, я например часто использую в полях префиксы типа полей и суффикс-имя формы.

Автор: nor 21:04:2004, 17:37

osmor, официально - нет, не существует, но в книгах крупных издательств авторы рекомендуют определенную нотацию.

Автор: nor 21:04:2004, 17:47

Isk

Форма "temp1".
Поле, которое хранит значения порядкового счетчика документов, созданных по форме "form1": "ordinal_num", number, computed when composed, value: ordinal_num.
Скрытое служебное представление ($temp1): столбец1: column value: ordinal_num, sort: Descending.

(Declartion)
Dim session As NotesSession
Dim ws As NotesUIWorkspace
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Dim view As NotesView

Sub Initialize
    
    Set session = New NotesSession
    Set ws = New NotesUIWorkspace
    Set db = session.CurrentDatabase
    
End Sub

Sub AssignNewDocNum(doc As NotesDocument)
    Dim temp1 As notesDocument
    
    Set view = db.GetView("($temp1)")
    Set temp1 = view.GetFirstDocument
    If temp1 Is Nothing Then
 doc.ordinal_num = 1
    Else
 doc.ordinal_num = temp1.ordinal_num(0) + 1
    End If
    
    
End Sub

Sub Postopen(Source As Notesuidocument)
    
    Set uidoc = ws.CurrentDocument
    Set doc = uidoc.Document
    
    If doc.IsNewNote Then Call AssignNewDocNum(doc)
    
End Sub


Таким образом, каждому новому документу при созднии по форме "temp1" присваивается очередной порядковый номер.

Автор: Isk 22:04:2004, 02:11

nor Сделал вот такую х..ню, на большее мозгов пока не хватило. Единственное что радует что сам.
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim ses As New NotesSession
Dim ws As New NotesUIWorkspace
Dim udoc As NotesUIDocument
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim col As NotesDocumentCollection
Dim str1 As String
Dim Ovar As Variant
Dim Vvar As Variant
Dim Ivar As Variant
Dim Orvar As Variant
Dim str2 As String

Ovar=1
Vvar=1
Ivar=1
Orvar=1

Set db=ses.CurrentDatabase
Set col=db.AllDocuments
Set doc=source.Document
Set doc=col.GetFirstDocument


While Not doc Is Nothing
If doc.bdname_1(0)="obr" Then
Ovar=Ovar+1
End If
If doc.bdname_1(0)="vhod" Then
Vvar=Vvar+1
End If
If doc.bdname_1(0)="ish" Then
Ivar=Ivar+1
End If
If doc.bdname_1(0)="ord" Then
Orvar=Orvar+1
End If

Set doc=col.GetNextDocument(doc)
Wend


Set udoc=ws.CurrentDocument
Set doc=udoc.Document

If doc.bdname_1(0)="obr" Then
str1="O"
str2=str1+"-" & Ovar
Messagebox("nomer documenta" & Ovar & str1)
End If
If doc.bdname_1(0)="vhod" Then
str1="V"
str2=str1+"-" & Vvar
Messagebox("nomer documenta" & Vvar & str1)
End If
If doc.bdname_1(0)="ish" Then
str1="Is"
str2=str1+"-" & Ivar
Messagebox("nomer documenta" & Ivar & str1)
End If
If doc.bdname_1(0)="ord" Then
str1="Or"
str2=str1+"-" & Orvar
Messagebox("nomer documenta" & Orvar & str1)
End If

Call source.FieldSetText("num",str2)

End Sub


Но как я сам думаю если док. будет много то все будет работать очень и очень медленно. Подскажи что можно переделать?

Автор: Guest 22:04:2004, 05:42

Vagor.ini и nor, спасибо.
Я понимаю что все нотации являются рекомендательными.
Пока мне не встретилось (ни в книгах ни в Инете) четкого описания рекомендаций по именованию объектов Lotus. Видно, что авторы используют какую-то систему именования, но формального описания или рекомендаций пока не встретил.
Буду искать или сам придумаю, точнее уже начал придумывать ... поля только для отображения того что вводитсяв другое поля с такой же смысловой нагрузкой именую с приставкой view :-)

Автор: Chernom0r 22:04:2004, 08:39

Здравствуйте.
В Domino R5 есть возможность запускать агентов на сервере (After New Mail has Arrived).
Есть ли какие-либо специфические траблы с такими агетами?
Как я понял понятие UIWorkspase я в этом случае использовать не могу.

Автор: nor 22:04:2004, 08:48

Isk
Ты прав, ты в цикле перебираешь все документы в бд. Но тебе, я как понимаю, нужно посчитать количество документов, созданных только по определенной форме. Это сужает выборку.
Таким образом:

Set collection = db.Searh("Form=""имя_формы""", Nothing, 0)

далее пребираешь один за другим документы из коллекции и формируешь нужные тебе счетчики...

Можно сделать еще лучше и проще:

Set collection = db.Searh("Form=""имя_формы"" & bdname_1 = ""obr""", Nothing, 0)
Ovar = collection.Count

Set collection = db.Searh("Form=""имя_формы"" & bdname_1 = ""vhod""", Nothing, 0)
Vvar = collection.Count

... и т.д.


Это будет работть быстрее.

Автор: nor 22:04:2004, 08:56

Chernom0r
В агентах (любых) ты не можешь пользоваться классами Front end (uidocument, uiview, ...), а также функциями, требующими реакции конечного пользователя, типа MessageBox и др. Поэтому, что бы отладить агент, нужно его код навесить на кнопку либо в документе, либо в представлении, либо еще что-нибудь придумать, главное, что бы был досупен Debuger.

Автор: Chernom0r 22:04:2004, 09:16

nor
Отладка агента уже пройдена. Агент выполняет все мои требования.
Как мне теперь избавиться от UI....?
Вот часть этого агента. Выполняться он должен на сервере по приходу нового документа в почтовую базу.


Sub Initialize
       
       Dim session As NotesSession
       Dim db As NotesDatabase
       Dim doc As NotesDocument
       Dim collection As NotesDocumentCollection
       Dim rtitem As NotesRichTextItem
       Dim item As NotesItem
       
       Set session = New NotesSession
       Set ws = New NotesUIWorkspace
                     ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
       Set db = session.CurrentDatabase
       Set doc = session.DocumentContext

и т.д.

Автор: nor 22:04:2004, 18:57

Chernom0r
"Как мне теперь избавиться от UI....?" - не пользуйся UI классами! smile.gif Замени их либо откажись от них. Не думаю, что в твоем агенте UI классы являются определяющими и критически необходимыми. smile.gif

Автор: Gogan.exe 27:04:2004, 06:02

Как открыть форму? Есть команды OpenPage, OpenFrameset и тому подобные, а есть ли команда OpetForm или какая-то похожая по функции?

Автор: Veselinka 27:04:2004, 07:57

@command([compose];"имя формы")

- создает новый документ по форме

dim ws as new NotesUIWorkspace

dim doc as notesdocument
set doc=....

call ws.EditDocument(false,doc)

- открывает документ по той форме, которая у него в поле form

Автор: Gogan.exe 27:04:2004, 08:10

аагррр.... умпф... ничего не понял.. учиться еще и учиться... может позднее пойму. спасибо

Автор: Gogan.exe 27:04:2004, 10:26

Для пробы, я создал базу данных по песенкам. Сева у меня менюшка с двумя кнопками – добавить песню и посмотреть список. Вопрос вот в чем – когда я нажимаю на одну из кнопок и справа открывается окно, то в верхней менюшке (список окон) появляется еще одно окно. Так, поработав с базой и понажимав кнопки, в меню появляется просто дикое количество окон. Как сделать так, чтобы окна не открывались по-новому, а заменяли друг друга? Извиняюсь, если непонятно объяснил.

Автор: Isk 28:04:2004, 02:55

Veselinka Привет, в очередной раз обращаюсь за помощью. Не подскажешь? Как в документе запретить редактирование? полностью. Вот что попробовал сделать, но виснет все!!!!

Sub Postopen(Source As Notesuidocument)
Dim ses As New NotesSession
Dim db As NotesDatabase
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Dim acl As NotesACL

Set db=ses.CurrentDatabase
Set acl=db.ACL
Set source=ws.CurrentDocument
Set doc=source.Document

If source.IsNewDoc Then
Exit Sub
Else
If acl.Roles="[AdminBD]" Then
source.EditMode=True
Else
Call ws.EditDocument(False)
End If

End If

End Sub


Блин!!!!!!!! Спасибо

Автор: Veselinka 28:04:2004, 06:48

Isk, естьу формы такое событие QueryModeChange

у него как и у всех событий типа Query есть параметр Continue, который при установке его на False, не даст свершиться тому действию, которому событие предшествует.

Кроме того на Postopen действительно надо запретить переход в режим редактирования.

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

А теперь я хочу прокоментировать твой код, может Это заставит тебя читать спецификацию и понимать - что пишешь:

Sub Postopen(Source As Notesuidocument)

Dim ses As New NotesSession
Dim db As NotesDatabase
Dim ws As New NotesUIWorkspace
Dim doc As NotesDocument
Dim acl As NotesACL

Set db=ses.CurrentDatabase
Set acl=db.ACL
Set source=ws.CurrentDocument

нафига присваивать переданному тебе открываемому документу Source еще что-то - тебе его и так в этом методе передают - зачем его еще каким-то образом искать? Может перед тем как чем-то пользоваться - почитать сначала что это такое? Ты же не расчесываешься по утрам вилкой и если видишь незнакомый предмет - выясняешь - для чего он нужен, перед тем как пользоваться - почему бы тебе мануалы наконец не начать читать? Если ты не начнешь этого делать - то твои вопросы НИКОГДА не иссякнут.

Set doc=source.Document

If source.IsNewDoc Then
Exit Sub
Else
If acl.Roles="[AdminBD]" Then


Syntax
To get: stringArray = notesACL.Roles

При сравнении массива со строкой что происходит? Правильно - все падает - ибо они не сравнимы! Кроме того наверное смысл твоего кода - не проверить наличие в ACL твоей базы такой роли, а проверить ее наличие у текущего пользователя. Значит перед тем как пользоваться методом - надо выяснить - что он возвращает и имеет ли смысл его употреблять. Здесь надо использовать что-то совсем иное... Что? Вопрос для самостоятельного выснения. Подсказка - почитай про @userRoles И про то как использовать выполнение формул из лотус скрипта.

source.EditMode=True
Else
Call ws.EditDocument(False)

вот это меня просто прибило...
у тебя документ УЖЕ открывается в рабочей области -зачем же его открывать опять? Я даже не знаю как поведет себя нотес в такой ситуации - если все упадет с красным экраном я не удивлюсь.

Ты же уже начал рулить параметром edit mode - ну и продолжай с ним работать.

End If

End If

Если бы я писала код на PostOpen событии, то я бы написала вот так:


Mode=source.editmode

If not source.IsNewDoc then
tmp=evaluate(|@IsMember("[AdminBD]";@UserRoles)|)
if tmp(0)=0 then
' Это значит, чтопользователь не админ
source.editMode=Mode

end if

end if

Автор: Veselinka 28:04:2004, 06:52

послалось, раньше чем я закончила редактирование этого поста:

Mode=source.editmode

If not source.IsNewDoc then
tmp=evaluate(|@IsMember("[AdminBD]";@UserRoles)|)
if tmp(0)=0 then
' Это значит, что пользователь не админ
source.editmode=false
else
source.editMode=Mode
end if

end if

Автор: nor 28:04:2004, 07:23

Gogan.exe
1. Форму открыть нельзя в UI (User Interface). Так же как нельзя открыть в UI, например, Script Library. Можно по форме создать документ. Форма является "заготовкой", "скелетом" документов.
2. Насчет твоей пробной бд с песнями. Меню слева, как я понял, у тебя располагается в левом Frame (пусть его имя будет "left_frame"). Отображение информации о конкретной песне, как я понял, у тебя располагается справа, в главном Frame (пусть его имя будет "main_frame"). Каждый раз, когда ты, пользуясь навигацией, расположенной слева, открываешь документы, они отображаются в новом окне. Это происходит потому что ты не указал имя фрэйма по-умолчанию для открытия ссылок левого фрэйма. Таким образом, Framesets - <имя фрэймсета> - <Frame Properties левого фрэма ("left_frame"), в котором располагается навигация> - Defualt targets for links in frame - <указываешь имя правого, главного фрэйма ("main_frame"), в котором по идее должны открываться ссылки (из левого фрэма)> .

Если что-то не получится, то пиши.

Автор: Isk 28:04:2004, 09:20

Veselinka Приму к сведению, спасибо, я же говорил что с англ. у меня проблемы. Хэлп я читаю, но честное слово не всегда все понятно. А насчет событий я ведь еще только учусь. Но если ты не против то я у тебя все равно буду консультироваться. А насчет вилки по утрам это прикольно надо попробовать. Хотя у меня дома только палочки. Спасибо еще раз.

Автор: Isk 28:04:2004, 09:31

подскажите народ как сделать профайл и что для этого вообще надо сделать.

Автор: Isk 28:04:2004, 09:34

Простите уже нашел, я сам мир знаю еще раз извините

Автор: Gogan.exe 28:04:2004, 13:37

НОР, я указал дефолт и открываются ссылки в правом фрейме как и надо, но вот в верхнем меню список открытых окон увеличивается. Получается, что то, что раньше было в правом (мейн_фрейм) не закрывается, а новая ссылка открывается как-то поверх что ли. Извини, что не могу точнее все написать.
Может нужно где-то галочку поставить на обновление фрейма?
И еще вопрос. В той моей БД есть поля типа «автор» «название» и т.п.
Во-первых, что должно быть в кнопке «сохранить» а то приходиться сохранять кнопкой из верхнего меню.
Во-вторых, что и где нужно указать, чтобы после сохранения, поля отчищались и были готовы для приема новой инфы.
Еще раз прошу прощения за ламерские вопросы – я попутно читаю мануал, но по ходу чтения возникают такие вот вопросы.

Автор: nor 28:04:2004, 21:12

Isk
Из твоего запроса я понял следующее: тебе нужно запретить редактирование документа всем, кроме роли AdminBD.
Так как ты внятно не описал проблему, то могу предположить, что созданный документ, вне зависимости от его автора и последующего статуса, должен быть доступен для всех только в режиме чтения, а для роли AdminBD - в режиме редактирования. Будем исходить из этого.

Sub Querymodechange(Source As Notesuidocument, Continue As Variant)    
    Dim user_names As Variant
    
    user_names = Evaluate("@UserNamesList", doc)
    If Isnull (Arraygetindex(user_names, "[AdminBD]", 0)) Then Continue = False  
    
End Sub

Автор: nor 28:04:2004, 21:29

Gogan.exe
1. Я совершенно не понимаю, почему у тебя так открываются ссылки. Возможно тебе кто-нибудь другой сможет помочь. (У меня открыватся как положено, без новых окон... blink.gif )
2. В кнопке сохранить должно быть: @Command([FileSave]).
3. В событии Querysave пишешь скрипт, который очищает нужные тебе поля. Доступ к документу можно получить посредством параметра события Source. Не забудь сохранить изменения методом Save.

Автор: Isk 29:04:2004, 02:48

nor Еще раз спасибо, именно это и надо было.

Автор: Gogan.exe 29:04:2004, 06:13

Все ясно… чтобы добавить песни – я открывал новый фреймсет. Если в кнопке просто написать «@Command([Openview]; "ViewOne")» тогда справа и правда открывается ВьюВн, но вот левое меню заменяется на какой-то дефолтовый! Что не так?
Понятно почему ссылки появлялись - это ссылки на открытые фреймы.

Автор: Veselinka 29:04:2004, 06:59

Isk - прости, мне очень стыдно, я злобно наехала на тебя...

Я сидела - меня достали на работе, я писала пост, просто в очень плохом настроении... и вовсе его в таком виде не собиралась посылать и выливать на ни в чем не повинного человека - ушат отстоя, к нему не относящийся, а оно послалось - когда я писала код и табуляции пыталась в него вставлять - перескочило из окошка на кнопку отправки поста - как я понимаю. Вот и получилось... я сегодня даже ночью уснуть не могла ... психовала, что обидела тебя... извини еще раз - если можешь. Я не горжусь тем, что я написала..... sad.gif

Автор: Isk 29:04:2004, 10:04

Veselinka Да я не обиделся честное слово, а вопросы все равно буду присылать и писать, никуда не денешься. Спасибо

Автор: Isk 30:04:2004, 04:30

Не подскажете, если есть агент который помечает документ как снятый с контроля, я так понял что это делается агентом
Dim ws As NotesUIWorkspace
Dim ses As NotesSession
Dim db As NotesDatabase
Dim controldb As NotesDatabase
Dim col As NotesDocumentCollection
Dim agent As NotesAgent
Dim action(2) As String
Dim response As String
Dim cdoc As NotesDocument
Dim item As NotesItem
Dim asitem As NotesItem

On Error Goto er

Set ws = New NotesUIWorkspace

action(0) = "Снять с контроля"
action(1) = "Восстановить контроль"
response = ws.Prompt (PROMPT_OKCANCELLIST, "Сервис","Выберите тип сервиса",action(0), action)
If response="" Then Exit Sub

Set ses = New NotesSession
Set db = ses.CurrentDatabase
Set controldb = ses.GetDatabase(db.Server,GetBasePath("ControlDB")
Set agent = controldb.GetAgent("Service")
Set col = db.UnprocessedDocuments
Set cdoc = col.GetFirstDocument

While Not cdoc Is Nothing
If cdoc.Form(0)="IN" Or cdoc.Form(0)="KR" Or cdoc.Form(0)="KP" Or cdoc.Form(0)="Q" Then
Set asitem = cdoc.GetFirstItem("agentstart")
Select Case response
Case "Снять с контроля":
cdoc.agentstart=Replace(cdoc.agentstart,"ServiceRestoreControl","")
asitem.AppendToTextList "ServiceResetControl"
cdoc.ServiceParameter = ses.UserName
Case "Восстановить контроль":
cdoc.agentstart=Replace(cdoc.agentstart,"ServiceResetControl","")
asitem.AppendToTextList "ServiceRestoreControl"
cdoc.ServiceParameter = ses.UserName
End Select
cdoc.Save False,False
End If
Set cdoc = col.GetNextDocument(cdoc)
Wend

' Call agent.RunOnServer
ws.ViewRefresh
Exit Sub

er:
Msgbox "Ошибка "+Error+" " +Cstr(Erl),16,"Ошибка "
Resume en
en:



вот код, не могу найти агента с этим именем ServiceRestoreControl
вопрос где бы это могло храниться, и как?

Автор: nor 30:04:2004, 06:48

Isk
smile.gif Извини, пожалуйста, но я не понимаю твой вопрос. blink.gif Агенты - это набор процедур, их можно найти в Дизайнере на закладке Agents. Слово "ServiceRestoreControl" встречается у тебя в строчке cdoc.agentstart=Replace(cdoc.agentstart,"ServiceRestoreControl",""....
И отключай смайлики, когда пишешь код.

Автор: Gogan.exe 30:04:2004, 07:15

Теперь я решил создать для пробы сайтик на базе лотус. На всех страничках поставил галочку «Treat contents as HTML», но почему-то при запуске експлорера с сайта или из дизайнера, он отвечает, что страница не найдена. В чем дело?

Автор: Veselinka 30:04:2004, 09:48

Описываю ситуацию:
1. Есть документ с вложенными атачментами
2. Документ редактируется через web
3. Домино генерит внизу уродскую надпись "Mark attachments for deletion" и список атачей с чекбоксами для удаления

Чего хочется:
Привести дизайн и локализацию этого куска формы к общему стилю.

Если конкретно - то желательно бы перенести этот кусок ближе к середине документа
Русифицировать, и одеть на него стили, сейчас домино там генерит таг font с параметрами, от него надо бы избавиться, чтобы стили оделись.

Проблема наверняка - часто встречающаяся у разработчиков веб сайтов на домино. Но я в данной области девелопмента под домино - не особо сильна и не знакома со стандартными приемами.

В хэлпе по этому поводу не нашла ничего подходящего....
Может быть можно с <div> поиграться и задвинуть его куда-нибудь и сгенерить самой этот блок... но этот как-то сложно, может быть по-проще можно? Кто знает?

Автор: nor 30:04:2004, 17:46

Gogan.exe
А ты http сервер включил?

Автор: nor 30:04:2004, 18:44

Veselinka
К сожалению, я не вижу возможности решить эту проблему мне известными стандартными методами. Буду крайне признателен, если тебе что-то получится сделать в этом плане и ты поделишься со всеми нами результатами.

Автор: Dark 3:05:2004, 10:00

Всем привет!
Помогите, кто сможет!
Трабл в том, что мне надо сотворить дерево (типа существуют отделы. в них подотделы и т.д.)
Это дерево предполагает создание и удалени отделов.
Так вот как это сделать программно? как его генерить?
Если чесно делала (использ. схему, скриптом генерировала ее), все замечательно, если бы не одно НО:
не отображаются изменения в Outlines. Если смотрю в дизайнере - все есть, все поменялось как надо, и если это все сохранить в самом дизайнере и открыть в клиенте, то все ОК.
А вот в самом клиенте ничего не видно.....
Объясните что я делаю не так? Саму схему сохраняю, уже и рефреш окна пробовала - ничего не помогает.... Но зато, что самое интересное, в дизайнере все изменения видны...

Автор: Vagor.ini 3:05:2004, 12:12

Dark
Переоткрыть базу надо...
Оутлайн встроен на пайдж, а он динамически не обновляется...

Автор: Dark 3:05:2004, 13:05

Vagor.ini
ну да, я сама заметила, что переоткрывая базу все замечательно, тока не нравится это мне.... Не будет же человек переоткрывать ее все время....если еще один раз за какой-то промежуток ввести данные надо - еще куда ни шло, а если за раз надо ввести несколько записей (отделов)...не говорю уже о МНОГО записей
переоткрывать ее самой - тоже как то ....
....что делать... ех....
или я чиво -то не поняла?

Автор: Vagor.ini 3:05:2004, 19:41

Dark
Если переоткрывать базу не хочется, то сорри... Page рефрешить не возможно (или я не прав).

Автор: Dark 4:05:2004, 05:19

Vagor.ini
по поводу Page прав wink.gif , да и вообще прав smile.gif
да и я все это знала..... но что хорошо, что убедилась точно , что была права - мне это тоже нужно было
СПАСИБО за помощь! smile.gif

PS .... а может есть еще какой-нить способ создания дерева? unsure.gif не тока с помощью Outline?

Автор: Veselinka 4:05:2004, 07:45

Цитата(QUOTE @ nor)
Veselinka
К сожалению, я не вижу возможности решить эту проблему мне известными стандартными методами. Буду крайне признателен, если тебе что-то получится сделать в этом плане и ты поделишься со всеми нами результатами.

Решить проблему удалось:

1. В стилях страницы пишешь стиль например .hiddenDiv {}
у которого абсолютная позиция по горизонтали и вертикали -200 px

Потом в конце формы перед полями хиднутыми пишешь
<div class=hidenDiv>

И закрывашку после хиднутых полей </div>

Получается, что стандартный диалог и отображение атачмента попадает в этот задвинутый за границу экрана див.

Далее на ява скрипте на событии OnSubmit пишешь код, который находит чекбоксы (это частный случай моей бизнес логики - у меня других чекбоксов на форме просто нет) и если в аплоад контроле у меня что-то аплоадится (новый вариант моего атачмента) - то чекает все чекбоксы на старых атачментах (помечает на удаление в этом задвинутом диве).

А сам атачмент для просмотра доступен по генеренной ссылке в другом месте - ссылка выглядит следующим образом
http:/server/path/viewunid/documentunid/$FILE/имя файла

где имена атачнутых файлов на web query open считаются.
Ну вот вобщем-то и все.

Автор: nor 4:05:2004, 10:43

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

Автор: Guest 5:05:2004, 05:26

nor, когда открываю с сайта – это бесплатный сайтик на 20 мегов, так что сервер не под моим контролем. А когда открываю експлорером – это локально с помощью кнопочки в верхнем правом углу. Я что-то не так делаю?

Автор: Guest 5:05:2004, 05:30

Прошлое сообщение от Gogan.exe

Автор: nor 5:05:2004, 08:51

Gogan.exe
привет
я прочитал много раз и так не понял, про что ты меня спросил... smile.gif

Автор: Gogan.exe 5:05:2004, 10:02

Трудно объяснить то, что мне и так ясно smile.gif
Постараюсь еще разок.
В общем я решил сделать сайтик (пробный) на лотусе, так как мне нужно с ним практиковаться.
Я сделал несколько пару фреймсетов, менюшку и две странички (в менюшке две кнопки – открыть первую стр и откр. Вт. Стр).
Проблема в том, что если закачать эту базу на сервер (я на narod.ru ее кинул), то при попытке открыть ее, говорят, что файл не найден. То же сообщение выдается, если попытаться открыть базу как HTML прямо из дизайнера (в верхнем правом углу есть кнопочки – посмотреть в ноутс и посмотреть в експлорере). В Ноутс все смотрится нормально, а вот в интернет браузере не находиться файл.
Теперь яснее? Надеюсь, что да.

Автор: osmor 5:05:2004, 10:30

Здравствуйте.
Есть ли в стандартный метод для вызова диалога выбора папки?
про метод NotesUIWorkspace.OpenFileDialog знаю, но он мне не подходит, нужно выбрать папку.
ПОка сделал через win 32 API. Кстати вопрос как определить дескриптор окна в LOTUS?
Спасибо.

Автор: osmor 5:05:2004, 13:53

Опять вопросы. cool.gif
Хочется в ФОРМЕ документа показать ответы к этому документу в табличном виде.
т.е. вверху поля документа, внизу табличка со списком ответов.
КрасивШЕ всего было бы внедренное представление, но похоже не получится.
Можно ли у внедренного представления (да и вообще у представления) менять формулу отбора динамически?
В принципе вопрос несколько более общий, как такое вообще в LOTUS реализуется? Подтолкните в нужную сторону.
Спасибо.

Автор: nor 5:05:2004, 20:34

Gogan.exe
1. Что бы просмотреть бд в броузере (MS Explorer), необходимо расположить ее в ..\Domino\Data\.. и загрузить HTTP Server предварительно, а также в Domino Administrator в документе текущего сервера на закладке Security настроить схему по доступу и выполнению кода в открываемой бд, например, поле Run restricted LotusScript/Java agents...
2. Для просмотра бд, ориентированных на веб и созданных на Lotus, необходим Domino сервер, поэтому на narod.ru скорее всего не получится открыть бд.

Автор: nor 5:05:2004, 20:37

Gogan.exe
Так же обрати внимание на acl бд, в частности на свойство Maximum Internet Name and Password на закладке Advanced acl бд.

Автор: nor 5:05:2004, 20:51

osmor
У внедренного представлния можно динамически менять Embedded Selection (а также Show Single Category), таким образом, в зависимости от условия на месте внедр. представления появляются различные представления.
Также можно сделать динамическую таблицу, которую ты хочешь, с возможностью добавления, р