среда, октября 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, если выбрана "Отмена"

вторник, сентября 30, 2008

Views: Columns

теперь напишу про свойства столбцов представления, и вывода их значений

Представления (Views): Intro

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

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

основное окно и свойства представлений:

Fields: Dialog list Field

при активации данного поля высвечивается окошко с выбором либо одного варианта (если флажок Allow multiple values не установлен) либо нескольких (в обратном случае) - в виде строк и флажков справа: 

элементы (строки) данного диалога могут задаваться разными способами:

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

Fields: Date/Time Field

Служит для ввода даты и времени, особое внимание заслуживает внешний стиль Calendar/Time Control (устанавливается на первой закладке), который позволяет отобразить поле в виде календаря или шкалы времени:

Fields: Text Field

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

внешний стиль - как это поле будет выглядеть (некоторые поля не позволяют выбирать внешний стиль, а у некоторых смена стиля, наоборот. улучшает способ отображения и восприятия информции, соаржащейся в этом поле). В данном случае (Text field) перекючение на Native OS style позволяет задать полю ширину, высоту и тип рамки (на второй закладки), а так же добавляет возможность многострочного ввода текста

строка-список-строка

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

@Explode( string ) - разбивает строку string на элементы, "разделителем" в данном случае является пробел, символы табуляции и новой строки, а так же спец-символы
@Explode( string ; separators ) -
разбивает строку string на элементы,  испльзуя в качестве "разделителя" символы из строки separators
@Explode( string ; separators ; includeEmpties ) -
как и предыдущая функция, но если параметр  includeEmpties true (1), то  в возвращаемом списке пустые строки не будут исключены (по умолчанию параметр includeEmpties равен false)
@Explode( string ; separators ; includeEmpties ; newlineAsSeparator ) - 
как предыдущая функция, параметр newLineAsSeparator, будучи true указывает, что символ новой строки так же является "разделителем" (по умолчанию - true (1))

ex @Explode("Здравствуйте, товарисчи!"); вернёт "Здравствуйте":"товарисчи!"; @Explode("hello, world!";", ";1); вернёт "hello":"":"world!"

преобразование списка в строку

@Implode( textList ) - объединяет элементы текстового списка textList в строку, разделяя пробелами каждый элемент
@Implode( textList ; separator ) - работает так же, как и предыдущий, разделяя каждый элемент строкой separator

ex @Implode("hello":"world"); вернёт строку "hello world";  @Implode("a":"b":"c";", "); вернёт строку "a, b, c"


длина списков (количество элементов)

есть две функции, показывающие длину списка - @Count(list) и @Elements(list), обе они возвращают количество элементов списка list, одно лишь отличие - для того случая, когда list - не список вовсе, либо список, но пустой - @Count в этом случае вернёт 1, а @Elements - 0

Списки в @Formula

списки в собако-формуле это что-то типа массива и списка одновременно, соответственно элементы одного списка должны быть одинаковы! вот как-то так =) элементы списка задаются через двоеточие ex 2:3:4:5 - числовой список; "hello":"world" - строковый список, допускается список дат и времени

соединение списков также происходит через двоеточие ex list_a:"new element"; list_a:list_b;

сложение списков

одиночное сложение element+list  - к каждому элементу списка прибавится element ex "new_"+"a":"b":"c" даст в результате список "new_a":"new_b":"new_c"; 2+3:4:5 даст 5:6:7

парное сложение list+list -  сложение двух списков - обычно производятся со списками одинаковой длины, элемент первого списка складывается с аналогичным элментом второго списка ex "Bill":"Linus"+"Gates":"Torvalds" даст нам "Bill Gates":"Linus Torvalds"; 10:15+3:5 даст 13:20

по-парное сложение list*+list - каждый элемент складывается с каждым ex "a":"b"*+"c":"d" даст "ac":"ad":"bc":"bd"; 2:3*+5:10 даст 7:12:8:13

(sic!) для числовых списков также доступны операции деления, умножения и вычитания одиночного, парного и по-парного вариантов

удаление лишних пробелов

@Trim(string) - удаляет из строки string начальные, конечные, а также повторяющиеся пробелы; ex @Trim("   превед,            медвед!      !           "); вернёт "превед, медвед! !"

преобразования регистра

@LowerCase(string) - преобразование всех символов строки string к нижнему регистру ex @LowerCase("АдинАдиН!!ЧепяКА"); вернёт "адинадин!!чепяка"

@UpperCase(string) - преобразование всех символов строки string к верхнему регистру ex @UpperCase("не капси!!"); вернёт "НЕ КАПСИ!!"

@ProperCase(string) - преобразование первых символов каждого слова строки string к верхнему регистру, а остальных символов - к нижнему (слово - набор букв без пробелов, разделителем является дефис, пробел и прочие спец-символы) ex @ProperCase("салтыков-щедрИН никиФОР ИВАНЫЧ"); вернёт "Салтыков-Щедрин Никифор Иваныч"

Выделение строки слева и справа

@Left - выдление строки слева направо

@Left( stringToSearch ; numberOfChars ) - стандартное выделение, возвращает подстроку строки stringToSearch, слева длиной numberOfChars; ex @Left("hello, world!", 4); вернёт  "hell"

@Left( stringToSearch ; subString ) - функция посложней, она возвращает подстроку строки stringToSearch слева и до найденного значения subString; если subString не найден - вернёт пустую строку; ex @Left("Make love, no war!","no"); вернёт "Make love, "

@Right 

аналогичен @Left, но ищет справа, приведу примеры:

@Right("Hello, world!",6); вернёт "world!"

@Right("Make love, no war!", "love"); вернёт ", no war!"

@Formula

@Formula intro

собака-формула - шустренький, достаточно простой язык для работы с текстом, числами, ячейками и прочим

все функции @F начинаются с символа at - @, отсюда и название =)

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

Field - параметры

Field  визуальные свойства*

name - имя поля

type (первый список)  позволяет выбрать вид поля и тип хранимых данных

text - для хранения текста

date/time - хранения даты/времени

number - хранение чисел

dialog list - появляется диалог с выбором варианта/тов 

check box - список значений с множественным выбором

radiobutton - список значений с единственным выбором

listbox - список значений 

rich text - форматированный текст

password - поле для ввода пароля (вводимый текст маскируется звёздочками)

type (второй список) задаёт "назначение" поля

editable - поле для ввода данных пользователем

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

computed -  значение вычисляется каждый раз при сохранении документа. сохраняется в документе

computed for display - значение вычисляется лишь при открытии/обновлении документа, т.е. значение поля не доступно, когда документ закрыт

computed when composed - значение вычисляется при создании докумена.  хранится в документе.

на второй закладке отображаются "визуальные свойства", т.н. высота поля, ширина и прочее

третья закладка определяет за дополнительные возможности содержимого поля (наличие подсказок, тип разделителя строк)

четвёртая закладка определяет параметры шрифа, используемый для отображения текста в поле

пятая - выравнивание

шестая закладка даёт возможность скрывать абзац

*свойства, задаваемые в найстройках поля (при выделенном поле нажмите alt+enter)

Field - описание

Field

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

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

Form - заголовок формы


form/window title

пока единственное свойство формы, что мы удосужились изучить) отвечает за заголовок документа

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

Form - описание

форма - это типа контейнер для всяческой шняги типа полей, таблиц, текста, основное окно, с которым так или иначе прийдётся работать