Работа с переменными Record — 3. FILTERGROUP. Чтение в другой фирме.

Предыдущие части можно найти здесь: «Основные команды. Чтение без блокировок», «Работа с Modify».

Использование групп фильтров – FILTERGROUP

Группы фильтров полезны для накладывания нескольких фильтров на одно и то же поле, а также для скрытия фильтров от пользователей.

Пара советов: используйте группы от 10 и выше. Группы фильтров от 0 до 6 зарезервированы (подробности — см. справку по C/SIDE в системе), но я бы рассчитывал на то, что в будущем появятся еще какие-нибудь дополнительные группы фильтров (например, пару версий назад 6-я группа фильтров НЕ БЫЛА зарезервирована).

ВАЖНО — несколько фильтров на одном поле работает как оператор AND по всем условиям.

Пример 1: вы хотите спрятать фильтр от пользователя, чтобы запретить ему изменять его.

TheTable.RESET;
TheTable.SETCURRENTKEY(....);
TheTable.FILTERGROUP(10); // меняем группу на ту, которую не увидит пользователь
TheTable.SETRANGE(....);
TheTable.FILTERGROUP(0); // возвращаемся к группе по умолчанию. Ту, в которой пользователь может делать все, что пожелает
FORM.RUNMODAL(0,TheTable); // Изменить фильтры пользователь уже не сможет

Пример 2: вам надо наложить несколько фильтров на одно поле. Вам нужны все записи, в которых определенное поле начинается с А, заканчивается на B, а в где-то середине есть буква C. Конечно, вы можете составить фильтр для команды SETFILTER. Но как вы будете составлять этот фильтр для более сложных запросов?

TheTable.RESET;
TheTable.SETCURRENTKEY(...);
TheTable.SETFILTER("The Field",'A*C*B');
IF TheTable.FINDSET THEN

Тот же самый пример с использованием FILTERGROUP:

TheTable.RESET;
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, доступные из кода, из связей таблицы — будут из ТЕКУЩЕЙ фирмы.

  1. АБСОЛЮТНО НЕВЕРНО — НИКОГДА не используйте триггеры для операций с записью из другой фирмы. Весь код будет работать по ТЕКУЩЕЙ фирме.
    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);
  2. ПРАВИЛЬНО — вставка записи в другую фирму (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);
  3. ПРАВИЛЬНО — чтение одной записи из другой фирмы
    CLEAR(TheTable);
    TheTable.CHANGECOMPANY('Some Other Company');
    TheTable.GET(....);
  4. ПРАВИЛЬНО — чтение/удаление/изменение одной или нескольких записей в другой фирме
    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.

Добавить комментарий