Показаны сообщения с ярлыком DbLookup. Показать все сообщения
Показаны сообщения с ярлыком DbLookup. Показать все сообщения

среда, октября 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; мну всё работает =)