Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Россыпь мелких вопросов для разработчиков, Вопросы не требующие отдельнх обсуждений
Vagor.ini
Вставить ник
сообщение 13:11:2003, 14:21
Цитата Ответить 


MANTICora Software
Иконка группы

Группа: Lotus team
Сообщений: 826
Регистрация: 8:08:2003
Из: Минск, Беларусь
Пользователь №: 4



Репутация:   1  


Тема для постинга мелких вопросов - ответов для разрботчиков приложений и баз Lotus Notes. Если Ваш вопрос влечет долгое обсуждение, то желательно создать отдельную тему.
Подняться вверх 
 
Сообщение #1
9 страниц V  < 1 2 3 4 5 > »   
Новая тема 
Ответов (60 - 89)
nor
Вставить ник
сообщение 20:04:2004, 16:05
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


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" добавляется некоторая текстовая информация, новые сообщения добавляются с новой строки причем.
Подняться вверх 
 
Сообщение #61
nor
Вставить ник
сообщение 20:04:2004, 16:18
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


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".
Подняться вверх 
 
Сообщение #62
Isk
Вставить ник
сообщение 21:04:2004, 03:22
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 42
Регистрация: 14:04:2004
Пользователь №: 416



Репутация:   0  


Спасибо nor , ты не можешь подсказать как сделать это все без ввода числа пользователем. просто допустим есть какой-то счетчик в форме или виде и надо его значение сохранить в поле чтобы при создании нового документа по этой форме брать значение из этого поля последнего документа. своего рода сортировка . то есть во всей коллекции ищется макс. знач. и наращивается на 1.
Подняться вверх 
 
Сообщение #63
Гость_Guest_*
сообщение 21:04:2004, 05:28
Цитата Ответить 





Инопланетный гость






    


Спасибо nor.
С помощью Lotus script не пробовал, все пытался на собаках, поскольку вроде все должно было получиться ...
но такой же способ с использованием @Char не сработал.
Подняться вверх 
 
Сообщение #64
Vagor.ini
Вставить ник
сообщение 21:04:2004, 05:46
Цитата Ответить 


MANTICora Software
Иконка группы

Группа: Lotus team
Сообщений: 826
Регистрация: 8:08:2003
Из: Минск, Беларусь
Пользователь №: 4



Репутация:   1  


Isk
Здесь тебе помощь - читать про профайловые формы, через них можно легко организовать счетчик, и обрабатывать его на событии QuereSave
Подняться вверх 
 
Сообщение #65
osmor
Вставить ник
сообщение 21:04:2004, 13:22
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 84
Регистрация: 9:01:2004
Пользователь №: 208



Репутация:   1  


Вопросец.
Существует ли в Lotus (IBM) общепринятая нотация именования объектов? Типа Венгерской ...
Ну привык я, что нужно именовать по правилам ...
Можно конечно и Венгерскую подогнать, или самому придумать, но может есть уже принятые правила именования?
Например:
Два поля одно для ввода данных другое для отображения ...
View (представления), наборы рамок, страницы, агенты, структуры, да и действия тоже наверное ...
Подняться вверх 
 
Сообщение #66
Vagor.ini
Вставить ник
сообщение 21:04:2004, 13:42
Цитата Ответить 


MANTICora Software
Иконка группы

Группа: Lotus team
Сообщений: 826
Регистрация: 8:08:2003
Из: Минск, Беларусь
Пользователь №: 4



Репутация:   1  


osmor
Ну не знаю, определенной наверное нет, я например часто использую в полях префиксы типа полей и суффикс-имя формы.
Подняться вверх 
 
Сообщение #67
nor
Вставить ник
сообщение 21:04:2004, 17:37
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


osmor, официально - нет, не существует, но в книгах крупных издательств авторы рекомендуют определенную нотацию.
Подняться вверх 
 
Сообщение #68
nor
Вставить ник
сообщение 21:04:2004, 17:47
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


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" присваивается очередной порядковый номер.
Подняться вверх 
 
Сообщение #69
Isk
Вставить ник
сообщение 22:04:2004, 02:11
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 42
Регистрация: 14:04:2004
Пользователь №: 416



Репутация:   0  


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


Но как я сам думаю если док. будет много то все будет работать очень и очень медленно. Подскажи что можно переделать?
Подняться вверх 
 
Сообщение #70
Гость_Guest_*
сообщение 22:04:2004, 05:42
Цитата Ответить 





Инопланетный гость






    


Vagor.ini и nor, спасибо.
Я понимаю что все нотации являются рекомендательными.
Пока мне не встретилось (ни в книгах ни в Инете) четкого описания рекомендаций по именованию объектов Lotus. Видно, что авторы используют какую-то систему именования, но формального описания или рекомендаций пока не встретил.
Буду искать или сам придумаю, точнее уже начал придумывать ... поля только для отображения того что вводитсяв другое поля с такой же смысловой нагрузкой именую с приставкой view :-)
Подняться вверх 
 
Сообщение #71
Chernom0r
Вставить ник
сообщение 22:04:2004, 08:39
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 50
Регистрация: 16:04:2004
Из: Москва
Пользователь №: 424



Репутация:   0  


Здравствуйте.
В Domino R5 есть возможность запускать агентов на сервере (After New Mail has Arrived).
Есть ли какие-либо специфические траблы с такими агетами?
Как я понял понятие UIWorkspase я в этом случае использовать не могу.
Подняться вверх 
 
Сообщение #72
nor
Вставить ник
сообщение 22:04:2004, 08:48
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


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

... и т.д.


Это будет работть быстрее.
Подняться вверх 
 
Сообщение #73
nor
Вставить ник
сообщение 22:04:2004, 08:56
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


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


Новенький
Иконка группы

Группа: Новенький
Сообщений: 50
Регистрация: 16:04:2004
Из: Москва
Пользователь №: 424



Репутация:   0  


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

и т.д.
Подняться вверх 
 
Сообщение #75
nor
Вставить ник
сообщение 22:04:2004, 18:57
Цитата Ответить 


Lotus master
Иконка группы

Группа: Модеры
Сообщений: 353
Регистрация: 10:04:2004
Пользователь №: 398



Репутация:   5  


Chernom0r
"Как мне теперь избавиться от UI....?" - не пользуйся UI классами! smile.gif Замени их либо откажись от них. Не думаю, что в твоем агенте UI классы являются определяющими и критически необходимыми. smile.gif
Подняться вверх 
 
Сообщение #76
Gogan.exe
Вставить ник
сообщение 27:04:2004, 06:02
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Новенький
Сообщений: 162
Регистрация: 23:04:2004
Из: Ульяновск НГ
Пользователь №: 445



Репутация:   0  


Как открыть форму? Есть команды OpenPage, OpenFrameset и тому подобные, а есть ли команда OpetForm или какая-то похожая по функции?
Подняться вверх 
 
Сообщение #77
Veselinka
Вставить ник
сообщение 27:04:2004, 07:57
Цитата Ответить 


Lotus team
Иконка группы

Группа: Lotus team
Сообщений: 142
Регистрация: 3:03:2004
Из: Новосибирск
Пользователь №: 303



Репутация:   0  


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

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

dim ws as new NotesUIWorkspace

dim doc as notesdocument
set doc=....

call ws.EditDocument(false,doc)

- открывает документ по той форме, которая у него в поле form
Подняться вверх 
 
Сообщение #78
Gogan.exe
Вставить ник
сообщение 27:04:2004, 08:10
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Новенький
Сообщений: 162
Регистрация: 23:04:2004
Из: Ульяновск НГ
Пользователь №: 445



Репутация:   0  


аагррр.... умпф... ничего не понял.. учиться еще и учиться... может позднее пойму. спасибо
Подняться вверх 
 
Сообщение #79
Gogan.exe
Вставить ник
сообщение 27:04:2004, 10:26
Цитата Ответить 


Продвинутый
Иконка группы

Группа: Новенький
Сообщений: 162
Регистрация: 23:04:2004
Из: Ульяновск НГ
Пользователь №: 445



Репутация:   0  


Для пробы, я создал базу данных по песенкам. Сева у меня менюшка с двумя кнопками – добавить песню и посмотреть список. Вопрос вот в чем – когда я нажимаю на одну из кнопок и справа открывается окно, то в верхней менюшке (список окон) появляется еще одно окно. Так, поработав с базой и понажимав кнопки, в меню появляется просто дикое количество окон. Как сделать так, чтобы окна не открывались по-новому, а заменяли друг друга? Извиняюсь, если непонятно объяснил.
Подняться вверх 
 
Сообщение #80
Isk
Вставить ник
сообщение 28:04:2004, 02:55
Цитата Ответить 


Новенький
Иконка группы

Группа: Новенький
Сообщений: 42
Регистрация: 14:04:2004
Пользователь №: 416



Репутация:   0  


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


Блин!!!!!!!! Спасибо
Подняться вверх 
 
Сообщение #81
Veselinka
Вставить ник
сообщение 28:04:2004, 06:48
Цитата Ответить 


Lotus team
Иконка группы

Группа: Lotus team
Сообщений: 142
Регистрация: 3:03:2004
Из: Новосибирск
Пользователь №: 303



Репутация:   0  


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
Подняться вверх 
 
Сообщение #82
Veselinka
Вставить ник
сообщение 28:04:2004, 06:52
Цитата Ответить 


Lotus team
Иконка группы

Группа: Lotus team
Сообщений: 142
Регистрация: 3:03:2004
Из: Новосибирск
Пользователь №: 303



Репутация:   0