logo

GetLayoutNameByID и GetLayoutIDByName. Функции работы с ID layout.

Бывают случаи когда нам необходимо перейти к тому или другому лайауту, на основании определенных вычислений, а не по наименованию, как это происходит в большинстве случаев. FileMaker в команде скрипта Go to Layout позволяет указать имя или номер лайаута как результат калькуляции. Это очень удобно, однако надо понимать, что переименование лайатуа приведет к ошибке выполнения скрипта. Нам нужно иметь какой-то уникальный неизменяемый идентификатор.

Номер макета, возвращаемый FileMaker функцией Get (LayoutNumber) возвращает не ID лайаута, а порядковый номер в списке макета. Если мы переместим лайаут в списке, то его номер изменится. Тем не менее уникальный ID у каждого лайаута есть. В этом можно убедится воспользовались функцией LayoutIDs ( fileName ) которая вернет список всех ID макетов указанного файла. Однако функции получения ID макета по его имени, и наоборот имя макета по его ID в FileMaker не предусмотрено.

Этот пробел можно восполнить двумя пользовательскими (custom) функциями GetLayoutIDByName ( layout ) и GetLayoutNameByID ( layoutID ) код которых приведен ниже.

GetLayoutIDByName ( layout )
возвращает ID макета по его имени:

Let ( [

name_list = ¶ & LayoutNames ( DatabaseNames ) & ¶ ;

pos = Position ( name_list ; ¶ & layout & ¶ ; 1 ; 1 ) ;
num = ValueCount ( Left ( name_list ; pos ) )

];

GetValue ( LayoutIDs ( DatabaseNames ) ; num )
)

GetLayoutNameByID ( layoutID )
возвращает имя макета по его ID:

Let ( [

id_list = ¶ & LayoutIDs ( DatabaseNames ) & ¶ ;

pos = Position ( id_list ; ¶ & layoutID & ¶ ; 1 ; 1 ) ;
num = ValueCount ( Left ( id_list ; pos ) )

];

GetValue ( LayoutNames ( DatabaseNames ) ; num )
)

 

5 комментариев

  1. В ту же серию. Кастом функция, вычисляющая идентификатор лэйаута.

    GetLayoutID

    GetValue( LayoutIDs (Get( FileName) );Get(LayoutNumber))

    1. Как и было сказано в статье значение Get (LayoutNumber) НЕ ПОСТОЯННОЕ — оно зависит от номера лайаута в списке лайаутов, поэтому использовать его для определения ID макета опасно.
      В принципе ваш вариант будет работать, если исходить из того что LayoutIDs выдает список id в порядке списка лайаутов. Так вроде и происходит, но мне показалось ненадежным полагаться, что так будет всегда, поэтому в приведенном варианте использован более сложный механизм определения ID исходя из того что списки LayoutIDs и LayoutNames могут быть в любой сортировке, но в одной и той же.

  2. Этот идентификатор никогда не меняется. Поэтому его можно использовать в скриптах или вычислениях (например установить видимость отдельных пунктов системного меню), чтобы узнать, находитесь ли вы на нужном макете.

    Например, триггер OnWindowClose
    сможет работать разным образом для разных макетов
    If[GetLayoutID = 53]
    выполняем действия для макета 53
    Else If[GetLayoutID = 81]
    выполняем действия при закрытии макета 81
    Else If[1]
    // ничего не делаем, окно просто будет закрыто
    End If

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

80 + = 89