среда, октября 01, 2008

значения полей других документов по UIND

значения полей - штука любопытная, и интересная, всмысле, часто используемая в других документах; а как посмотреть значение поля конкретного документа? и - больше - изменить его? ... чичас сё будет =)

@GetDocField( documentUNID; fieldName)

возвращает значение поля с именем fieldName документа с уникальным номером documentUNID

@SetDocField( documentUNID ; fieldName ; newValue)

присваивает значение newValue полю с именем fieldName документа с уникальным номером documentUNID

вся фенька в том, где взять этот самый documentUNID (дальше буду писать UNID, заебало =))

первый вариант - функция

@DocumentUniqueID которая возвращает UNID текущего документа, то есть нам надо сформировать список документов с полями, содержащими UNID, вывести эти самые иды в представлениях и вывести ещё один столбец - ну, допустим, тоже имя ... продолжим маразм?..

1. итак, создаём computed-поле (UNID) c формулой @DocumentUniqueID (картинку не буду показывать, это вы знаете) и скроем его от лишних глаз (предпоследняя закладка, Hide paragraf from/Notes 4.6 or later)

2. добавляем во view 4-ую колонку (UNID) с выводом значения поля UNID документа (сначала используйте формулу @Text(UNID), чтобы увидеть, задалось ли оно для старых значений)

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

впринципе, юзеру это поле не нужно, так что скроем его =) 

теперь что? попробуем использовать это значение? =)

создадим новую форму (adm), пихнём туда поле"new name" (text, editable) и кнопку "change!" (create-hotspot-button)

теперь,  - программирование нажатия кнопки, по которой что сделаем?

1. создадим два массива для имён и unid'ов (чтобы искать unid по имени)

names:=@DbColumn("":"NoCache";@DbName;"ex_vw";2);
UNIDs:=@DbColumn("":"NoCache";@DbName;"ex_vw";4);

2. запросим у пользователя, какое имя бы он хотел изменить
needName:=@Prompt([OkCancelList];oldName+"select name, who change";"";"";names+", "+UNIDs);

так как мы использовали список с unid'ами (типа для наглядности), приведём взятое значение (то, которое вернула prompt) к только имени
needName:=@Left(needName;",");

3. узнаем, каким стоит выбранное имя в списке имён (его  UNID  - с тем же номером в другом масиве)
n:=@Member(needName;names);
unid:=UNIDs[n];

4. выводим подтверждение действия
answ:=@Prompt([YesNo];"sure?";"selected name is " + needName+" (unid: "+@Text(unid)+") true?");

и если мы соглашаемся, то устанавливаем новое значения поля
@If(answ;@SetDocField(unid;"name";newName);"");

проверяем, правда ли оно установилось...
@Prompt([ok];"new value is:";@GetDocField(unid;"name"));

обновяем представление и хоп - смотрим, обновилось!! =) работает ) ы.



значения полей других документов (через представления)

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

а, да, на заметку - тут пойдёт о "родных" базах данных Лотуса, а не о ODBC (я вообще не ебу, что это, но мануал говорит, что такие есть =))

@DbColumn возвращает список значений всех строк указанного представления, ханящегося на таком-то сервере в такой-то базе данных  в  столбце с указанным номером; стоит отметить, что "скрытые" (не отображаемые для пользователя) столбцы он тоже учитывает - имейте это ввиду, указывая номер столбца.

@DbColumn( class : cache ; server : database ; view ; columnNumber )

class - класс базы данных (тот самый страшный ОДЭБЭЦ указывается здесь, есличё, ну а пока эту строку можно оставлять пустой, либо, для тру-приверженцев Нотуса ставить "Notes"

cache - кэширование данных (т.е. оно может вам брать значения из кэша, а не из самого представления, что иногда чревато =) )

        "" - кэшировать будет

       "ReCache" - как я понял, кэшировать будет, но сначала кэшик обновит для надёжности

       "NoCache" - кэшировать не будет

server:database - имя сервера и базы данных, в котором хранится необходимое нам представление

viewимя представления, значения из столба которого нам необходимы

columnNumber - номер столбца в представлении, значения строк которого нам почему-то понадобились

ex @DbColumn("":"NoCache"; @DBName; "users"; 1); вернёт, к примеру, строковой список имён пользователей в текущей базе данных при условии существования представления users и наличия в этом представлении первого столбца с значением имён пользователей

@DbLookup делает то же, что и предыдущий, но использует группировку и может искать значения по именам полей, а не номерам столбцов (в этом случае даже не обязательно, чтобы столбец со значением данного поля был в представлении)

то есть данная функция берёт не все строки представления, а строки для группы, указанной параметром key.

отгруппированый столбец должен быть первым, иначе выходит хрень

@DbLookup( class : cache ; server : database ; view ; key ; fieldName ; keywords )
@DbLookup( class : cache ; server : database ; view ; key ; columnNumber ; keywords)

всё тоже самое, что и у @DbColumn, за исключением некоторых дополнений:

key - значение "ключевого" столбца (столбец, который отгруппирован) 

fieldName - имя поля документа, значение которого нам необходимо

keywords - некоторые дополнительные опции (если нуж указать несколько)

[FAILSILENT] - есличё, вместо ошибки возвращает пустую строку

[PARTIALMATCH] - 

[RETURNDOCUMENTUNIQUEID] - возвращает не значения полей/столбцов, а UIND - уникальный идентификатор документа, очень полезная штука, надо сказать, но об этом позже, потому как я не разобрался ещё)))

развёрнутый пример

1. создадим новую форму с двумя текстовыми полями - name, содержащее имя пользователя и comment, содержащее краткий комментарий:

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

Жанна, Женя, Вася, Кузя, Витя, Коля, Дима, Даша и Денис

2. создадим представление (назовём его ex_vw )с тремя столбами:

-первая буква имени (@Left(name,1);) сразу категоризируем этот столбец (вторая закладка, type: Categorized)

-имя (name)

-комментарий (comment)

при просмотре должно получиться следующее:

то есть у нас получилась группировка имён по первым буквам

3. перейдём в нашу форму и изменим поле comments:

-тип поля DialogList

-значения элементов задаются формулой (Use formula for choises), записываем формулу:

@DbLookup("":"NoCache";@DbName;"ex_vw";"к";"name")+" - цука личность"

то есть у нас будут значения, содержащиеся в подгруппе "к" (подгруппа у нас задана как первая буква имени), стало быть - все имена, начинающиеся на "к" - наши =) результат выбора комментария должен быть таким:

кто не наигрался - добавьте поле alpha на эту форму, задайте тип DialogList, список элементов - Use Formula for choises и вбейте туда следующую формулу:

@DbColumn("":"NoCache";@DbName;"ex_vw";1)

то есть тут значения будут - те самые первые буквы имён, что у нас в базе вообще есть. А формулу поля comment немножко изменим:

@DbLookup("":"NoCache";@DbName;"ex_vw";alpha;"name")+" - цука личность"

то есть данная штука будет брать имена начинающиеся на ту букву, которую мы выберем в поле alpha =); для полного счастья не забудьте поставить галочки в настройках Refresh choises on document refresh (обновить список элементов при обновлении документа) у поля comment и Refresh fields on keyword change (обновить поля при изменении значения) поля alpha; мну всё работает =)

диалог с НИМ

@prompt - диалог с пользователем

@Prompt( [style] : [ NoSort ] ; title ; prompt ; defaultChoice ; choiceList ; filetype)

title - заголовок сообщения; стоит учесть, что заголовок сообщения для некоторых стилей остаётся стандартным

prompt - само сообщение (как и title, для некоторых стилей не актуально)

defaultChoise - текст, задающий значение по умолчанию (актуально только для OkCancelEdit)

choiseList - текстовый список, задающий возможные варианты выбора

filetype - в доке написано, что задаёт фильтр для выбираемых файлов ("1" - только для файлов NSF, "2" - для NTF и "3" - для всех файлов), но мну чо-то не получилось (не увидел разницы)

[NoSort] - (не обязательно) позволяет отображать список выбора так, как его задали, тогда как по умолчанию данный список сортируется

ещё одно важное замечание - почти во всех стилях есть кнопка "Отмена" - для всех стилей, где она есть, кроме стиля YesNoCancel, нажатие кнопки приводит к прекращению обработки @Формулы в этой области! (то есть не просто закрывает окошко выбора, но и выполняет функцию @return(""))

[style]
самый таки главный параметр - задаёт стиль  сообщения, как такового =) то есть это может быть простое сообщение с одной кнопкой, а может предложение выбрать пункт ну и прочее по порядку:

[ChooseDatabase] предлагает пользователю выбрать базу данных:

ex @Prompt([choosedatabase];"";"");  вернёт к примеру такой результат "":"AgentRunner.nsf":"Java Agent Runner"

сама функция возвращает список из трёх элементов "имя сервера":"имя файла":"название базы данных", если база данных локальная, вместо имени сервера вернёт пустую строку

[LocalBrowse]

предлагает пользователю выбрать локальный файл:

ex @Prompt([LocalBrowse];"";"");  вернёт к примеру такой результат "D:\porn\Digger.mp3"

возвращает полный адрес выбранного файла

 
[Ok]

показывает окошко с единственной кнопкой - ок:

ex @Prompt([ok];"title";"prompt"); 

всегда возващает 1 (true)

[OkCancelCombo]

показывает сообщение с просьбой выбрать один из вариантов, для этого стиля требуется указать текстовый список вариантов :

ex @Prompt([OkCancelCombo];"title";"prompt";"default";"first elem":"second elem");  вернёт к примеру такой результат "first elem"

возвращает заголовок выбранного элемента

[OkCancelEdit]

предлагает пользователю ввести какой-либо текст:

ex @Prompt([OkCancelEdit];"title";"prompt"); 

ex @Prompt([OkCancelEdit];"title";"prompt";"default value");  

возвращает текст, введённый пользователем (максимальная длина вводимой строки - 254 символа)

[OkCancelEditCombo]

сочетание двух предыдущих вариантов - текст можно выбрать из списка, либо ввести новое значение:

ex @Prompt([OkCancelEditCombo];"title";"prompt";"";"first elem":"second elem");  вернёт к примеру такой результат "new value"

возвращает текст выбранного или введённого значения


[OkCancelList]

работает, как и OkCancelCombo, только вместо выпадающего списка "развёрнутый список"

ex @Prompt([OkCancelList];"title";"prompt";"";"first elem":"second elem");  вернёт к примеру такой результат "second elem"

возвращает выбанный элемент

[OkCancelListMult]

похож на предыдущий, но с возможностью выбора нескольких элементов; возвращает текстовый список выбранных значений

ex @Prompt([OkCancelListMult];"title";"prompt";"";"first elem":"second elem");  вернёт к примеру такой результат "first elem":"select elem" (если выбраны оба элемента)

[Password]

похож на OkCancelEdit, но вводимый текст "маскируется" звёздочками:

ex @Prompt([Password];"title";"prompt");  вернёт к примеру такой результат "my mega-super-puper hard PASSWORD!"

возвращает строку, введённую пользователем (в нормальном виде, разумеется)

[YesNo]

показывает окшко с двумя кнопками - Да и Нет (ну или Yes и No):

ex @Prompt([YesNo];"title";"prompt"); 

вернёт 1 (true), если выбран ответ Да, и 0 (false) в противном случае


[YesNoCancel]

покажет окошко с тремя кнопками - Да, Нет, Отмена (Yes, No, Cancel):

ex @Prompt([YesNoCancel];"title";"prompt"); 

возвращает 1 (true) если выбран ответ "Да", 0 (false) при ответе "Нет" и -1, если выбрана "Отмена"