Работа с переменными Record — 3. FILTERGROUP. Чтение в другой фирме.
Предыдущие части можно найти здесь: «Основные команды. Чтение без блокировок», «Работа с Modify».
Использование групп фильтров – FILTERGROUP
Группы фильтров полезны для накладывания нескольких фильтров на одно и то же поле, а также для скрытия фильтров от пользователей.
Пара советов: используйте группы от 10 и выше. Группы фильтров от 0 до 6 зарезервированы (подробности — см. справку по C/SIDE в системе), но я бы рассчитывал на то, что в будущем появятся еще какие-нибудь дополнительные группы фильтров (например, пару версий назад 6-я группа фильтров НЕ БЫЛА зарезервирована).
ВАЖНО — несколько фильтров на одном поле работает как оператор AND по всем условиям.
Пример 1: вы хотите спрятать фильтр от пользователя, чтобы запретить ему изменять его.
TheTable.SETCURRENTKEY(....);
TheTable.FILTERGROUP(10); // меняем группу на ту, которую не увидит пользователь
TheTable.SETRANGE(....);
TheTable.FILTERGROUP(0); // возвращаемся к группе по умолчанию. Ту, в которой пользователь может делать все, что пожелает
FORM.RUNMODAL(0,TheTable); // Изменить фильтры пользователь уже не сможет
Пример 2: вам надо наложить несколько фильтров на одно поле. Вам нужны все записи, в которых определенное поле начинается с А, заканчивается на B, а в где-то середине есть буква C. Конечно, вы можете составить фильтр для команды SETFILTER. Но как вы будете составлять этот фильтр для более сложных запросов?
TheTable.SETCURRENTKEY(...);
TheTable.SETFILTER("The Field",'A*C*B');
IF TheTable.FINDSET THEN
Тот же самый пример с использованием FILTERGROUP:
TheTable.SETCURRENTKEY(...);
TheTable.FILTERGROUP(10);
TheTable.SETFILTER("The Field",'A*');
TheTable.FILTERGROUP(11);
TheTable.SETFILTER("The Field",'*C*');
TheTable.FILTERGROUP(12);
TheTable.SETFILTER("The Field",'*B');
TheTable.FILTERGROUP(0);
IF TheTable.FINDSET THEN
Чтение/вставка/изменение/удаление записей в другой фирме (не в вашей открытой фирме)
ВАЖНО — помните, что ТОЛЬКО эта переменная будет в другой фирме. Все остальные переменные типа Record, доступные из кода, из связей таблицы — будут из ТЕКУЩЕЙ фирмы.
- АБСОЛЮТНО НЕВЕРНО — НИКОГДА не используйте триггеры для операций с записью из другой фирмы. Весь код будет работать по ТЕКУЩЕЙ фирме.
CLEAR(TheTable);
TheTable.CHANGECOMPANY('Some Other Company');
TheTable.VALIDATE("Field 1",'Some Value');
TheTable.VALIDATE("Field 2",'Some Value');
TheTable.VALIDATE("Field 3",'Some Value');
TheTable.INSERT(TRUE); - ПРАВИЛЬНО — вставка записи в другую фирму (MODIFY и DELETE работают так же):
CLEAR(TheTable)
TheTable.CHANGECOMPANY('Some Other Company');
TheTable."Field 1" := 'Some Value';
TheTable."Field 2" := 'Some Value';
TheTable."Field 3" := 'Some Value';
TheTable.INSERT(FALSE); - ПРАВИЛЬНО — чтение одной записи из другой фирмы
CLEAR(TheTable);
TheTable.CHANGECOMPANY('Some Other Company');
TheTable.GET(....); - ПРАВИЛЬНО — чтение/удаление/изменение одной или нескольких записей в другой фирме
CLEAR(TheTable);
TheTable.CHANGECOMPANY('Some Other Company');
TheTable.SETRANGE("Field 1",'Some Value');
TheTable.FINDSET;
REPEAT
...
UNTIL TheTable.NEXT = 0;
//ИЛИ
TheTable.DELETEALL(FALSE); // Без триггеров
//ИЛИ
TheTable.MODIFYALL(FALSE); // Без триггеровДанная статья – вольный перевод заметки «How to work with record-variables (version 2)?»
Окончание цикла статей читайте здесь – «Часть четвертая, практическая».
Исправления и дополнения приветствуются :) Пишите на mailbox@naviart.ru

Автор: Андрей Стрельников
В области Navision - с 2003 года. Профессиональные интересы: NAV, MS SQL, .NET, BPMN, IT-менеджмент. Предметная область: логистика, финансы, склады, 3PL.
Количество статей, опубликованных автором: 86.