#filemaker
#filemaker
Вопрос:
У меня есть таблица с автоматически вычисляемыми полями для того, кто (имя) и когда (дата) строка была изменена в последний раз, используя обычные определения полей FileMaker и защищенное поле.
Однако у меня есть один вариант использования, когда я копирую данные в эту таблицу из источника, в котором также есть эти записи, и я хочу также скопировать их. Но когда мой скрипт копирует данные, он запускает автоматическое вычисление, и, в конце концов, мое «изменено в» устанавливается на текущее время и «изменено» для текущего пользователя. Я хочу сохранить все, что есть у моего внешнего источника в этих полях.
Как я могу временно отключить автоматическое вычисление для этих полей в FileMaker, чтобы на время работы моего скрипта они действовали как обычные поля и просто принимали данные, которые я ввожу?
Комментарии:
1. Можете ли вы импортировать данные? При импорте у вас есть возможность отключить параметры автоматического ввода.
2. На самом деле это не вариант. Я пытаюсь синхронизировать данные между двумя источниками. Очевидно, что синхронизация не должна учитываться как изменение, иначе у меня будет бесконечный цикл синхронизации.
3. Я не понимаю, почему это «на самом деле не вариант». Альтернативой является использование вашей собственной формулы вычисления и создание исключения при включенном флаге. Это большая работа.
4. Я выполняю двустороннюю синхронизацию, поэтому обычный импорт не поддерживает мой вариант использования здесь.
Ответ №1:
Измените автоматически введенные поля модификации следующим образом
- Переключиться на автоматический ввод вычисляемого значения
- Выключите параметр «Не заменять существующее значение поля (если оно есть)»
Затем установите для вычисления автоматического ввода значение, подобное следующему
Let ( trigger = GetField ( "" ) ; If ( $SilentSync > 0 ; Self ; Get ( CurrentDate ) ) )
Вам нужно будет изменить значение Get ( CurrentDate )
на то, что подходит для этого поля, и вам нужно будет сделать это для всех полей модификации в каждой таблице.
После этого эти поля будут работать в обычном режиме при ежедневном редактировании и т. Д.
При настройке данных во время синхронизации вы можете использовать следующее в начале процесса синхронизации
Set Variable [$SilentSync: 1]
Затем очистите $$SilentSync в конце процесса синхронизации
Set Variable [$SilentSync: ""]
Комментарии:
1. похоже, это сделает то, что мне нужно. На данный момент я поддержал его и протестирую.
2. Я экспериментирую с этим и не понимаю, что делает первый оператор (let trigger) и зачем он нужен.
3. Ах да, это трюк, вокруг которого вращается эта функциональность. Вычисление по этому полю должно запускаться при каждом изменении любого поля в записи. Для достижения этого вы могли бы ссылаться на каждое поле из вычисления (и не забывайте добавлять к нему новые поля всякий раз, когда вы добавляли их в таблицу), однако это неудобно. Но использование функции getField ( «» ) с пустой строкой в качестве параметра делает всю работу за вас. Это заставляет функцию выполнять оценку при изменении любого поля. После этого вам просто нужно включить эту функцию в какую-то безопасную область calc, я выбрал заголовок Let
4. Теперь я построил свое решение на основе этой идеи, и оно работает блестяще. Спасибо!
5. забавный факт: это работает, чтобы предотвратить обновление поля через пользовательский интерфейс, но не в том случае, если я вставляю данные через JDBC. Странно, потому что я думал, что у меня это работает.