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

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

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

а, да, на заметку - тут пойдёт о "родных" базах данных Лотуса, а не о 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; мну всё работает =)

Комментариев нет: