Бывают случаи когда нам необходимо перейти к тому или другому лайауту, на основании определенных вычислений, а не по наименованию, как это происходит в большинстве случаев. 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 ) )
В ту же серию. Кастом функция, вычисляющая идентификатор лэйаута.
GetLayoutID
GetValue( LayoutIDs (Get( FileName) );Get(LayoutNumber))
Как и было сказано в статье значение Get (LayoutNumber) НЕ ПОСТОЯННОЕ — оно зависит от номера лайаута в списке лайаутов, поэтому использовать его для определения ID макета опасно.
В принципе ваш вариант будет работать, если исходить из того что LayoutIDs выдает список id в порядке списка лайаутов. Так вроде и происходит, но мне показалось ненадежным полагаться, что так будет всегда, поэтому в приведенном варианте использован более сложный механизм определения ID исходя из того что списки LayoutIDs и LayoutNames могут быть в любой сортировке, но в одной и той же.
Аркадий, это используется уже лет пять как 🙂
ну очень хорошо 🙂
Этот идентификатор никогда не меняется. Поэтому его можно использовать в скриптах или вычислениях (например установить видимость отдельных пунктов системного меню), чтобы узнать, находитесь ли вы на нужном макете.
Например, триггер OnWindowClose
сможет работать разным образом для разных макетов
If[GetLayoutID = 53]
выполняем действия для макета 53
Else If[GetLayoutID = 81]
выполняем действия при закрытии макета 81
Else If[1]
// ничего не делаем, окно просто будет закрыто
End If