В своем совете Андрей Панько рассказал о том, как можно еще улучшить реализацию матричных форм в Microsoft Dynamics NAV 2009.

В предыдущей статье мы рассмотрели, как коллеги из Microsoft реализовали матричные формы. Более того, мы их улучшили. Но все равно результат далек от совершенства.

Что требуется для того, чтобы имитация матричных форм стала удобной. Во-первых, кнопки управления набором столбцов должны быть на той же странице, что и данные. Кроме того, есть очень большое желание управлять набором столбцов точнее, т.е. получить возможность сдвигать набор на одну позицию, а не сразу на 32.

В данной статье мы рассмотрим альтернативный вариант реализации матричных форм. На этот раз мы будем действовать, соблюдая все рекомендации Microsoft, т.е. сначала создадим соответствующую форму, а потом преобразуем ее в страницу.

Создание базовой формы

  1. Открыть в Object Designer форму 9230 _Items by Location. Сохранить форму под ID 50001 и Name = __Items by Location.
  2. В форме 50001 удалить кнопку ShowMatrix, кнопку Help передвинуть вниз, чтобы освободить место для табличной части.
  3. Открыть в Object Designer форму 9231 Items by Location Matrix. Перенести табличную часть и кнопку Item в форму 50001. Сделать красиво, например, как на рисунке ниже.
  4. Microsoft Dynamics NAV 2009: Item by locationMicrosoft Dynamics NAV 2009: Item by location

  5. Скопировать из формы 9231 в форму 50001:
    • Функции: InventoryDrillDown, MATRIX_OnAfterGetRecord, MatrixOnDrillDown
    • Глобальные переменные: MATRIX_CellData, ItemLedgerEntry,
  6. В функции MATRIX_OnAfterGetRecord закомментировать строку: SetVisible; - она все равно не будет работать в ролеориентированном клиенте, позже мы решим, что с ней делать.
  7. Изменить свойства CaptionClass у полей Field1..Field32 с '3,' + MATRIX_ColumnCaption[1] на '3,' + MATRIX_CaptionSet[1]. Совет: сохраните объект в текст и выполните поиск и замену.
  8. У элемента управления TableBox установите в свойство Editable значение No.
  9. В триггер onAfterGetRecord нужно добавить следующий код:
  10. //MATRIX_CurrentColumnOrdinal локальная переменная типа Integer
    FOR MATRIX_CurrentColumnOrdinal := 1 TO MATRIX_CurrSetLength DO
    MATRIX_OnAfterGetRecord(MATRIX_CurrentColumnOrdinal);
  11. В функцию SetColumns в конец добавить: CurrForm.UPDATECONTROLS;. Это чтобы обновились заголовки столбцов, в которых используется свойство CaptionClass.
  12. Сохранить и откомпилировать форму 50001 __ Items by Location.
  13. Форма должна заработать.

Трансформация формы в страницу

В данный момент мы выполнили не все изменения, которые планировали. Не беспокойтесь – так и было задумано. Чуть позже мы реализуем все свои задумки, а пока выполним преобразование формы в страницу. Для этого должен быть установлен Transformation Tool.

  1. Открыть форму 177000 Transformation Forms.
  2. Ввести новую запись:
    • ID = 50001.
    • FormType = Matrix.
    • PageType = Worksheet. Если оставить Card, то исчезнет возможность управлять сортировкой и накладывать фильтры, а если выбрать List, то возникнет проблема с разметкой страницы. В данном случае, удобнее всего оказался тип Worksheet. Желающие потом могут попробовать изменить у полученной страницы свойство PageType и посмотреть на результат.
  3. Далее создадим кнопки на панели действий. Щелкнуть кнопку Input, Add, New and Promoted Actions.
  4. В окне Page Actions ввести новую запись
    • ActionsType = Action Items.
    • Control ID = 31 (ID кнопки Previous Set)
    • Promoted = Yes (Чтобы кнопка появилась в панели действий)
    • PromotedIsBig = Yes (И была большой)
    • Image = PreviousSet (это иконка для действия, ее можно выбрать из списка)
    • Description = Previous Set
  5. Это была кнопка Previous Set, теперь то же самое нужно сделать для Next Set. В окне Page Actions нужно ввести новую запись.
    • ActionsType = Action Items.
    • Control ID = 32
    • Promoted = Yes (Чтобы кнопка появилась в панели действий)
    • PromotedIsBig = Yes (И была большой)
    • Image = NextSet (это иконка для действия, ее можно выбрать из списка)
    • Description = Next Set
  6. Щелкнуть кнопку Input, Add, New Control Property. В окне Move Page Elements ввести новую запись.
    • Group = Promoted Field
    • Control ID = 30 (ID текстовой зоны «Column Set»)
  7. Щелкнуть кнопку Input, Delete Page Control. В окне Delete Page Elements ввести новую запись
    • ID = 5 (ID кнопки Help)
  8. Далее нужно создать входящие файлы для Transformation Tool. Для этого щелкните кнопку Function, Create Transformation Input,
    • Transform Pages, сохраните файл как TransformPages.xml.
    • Delete Pages Elements, сохраните как DeleteElements.xml.
    • Move Pages Elements, сохраните как MoveElements.xml.
  9. В Object Designer выберите форму 50001 __Items by Location, затем щелкните File, Export. Сохраните форму как Forms.xml (тип файла XML Format).
  10. Поместите полученные четыре файла в папку Transformation Tools и запустите файл Microsoft.Dynamics.Nav.Tools.FormTransformation.exe, если трансформация пройдет удачно, то в папке появится файл Pages.xml
  11. Трансформация объектов в Роле-ориентированный интерфейсТрансформация объектов в Роле-ориентированный интерфейс

  12. Откройте Object Designer, щелкните File, Import и выберите полученный файл Pages.xml.
  13. Откомпилируйте объект Страница с ID = 50001 и названием __ Items by Location
  14. Запустим новую страницу и посмотрим, что получилось: DynamicsNAV:////runpage?page=50001

Добавление функциональности в базовую форму.

Итак, теперь можно указывать требуемый набор записей в той же странице, где отображаются результаты. Т.к. в данной ситуации мы не можем управлять видимостью столбцов, то нужно выполнить пару улучшений. По Best Practice мы должны выполнить эти улучшения в форме, а затем снова ее трансформировать. Итак, в форме 50001 выполним следующие изменения.

  1. Чтобы отключить DrillDown на пустых столбцах, нужно изменить функцию MatrixOnDrillDown (добавить условие):
  2. IF ColumnID <= MATRIX_CurrSetLength THEN BEGIN
    //существующий код
    END;
  3. При переходе к следующему набору записей, вместо пустых заголовков у столбцов отображаются идентификаторы. Чтобы избавиться от этого добавим в конец функции SetColumns следующий код (вместо пустых строк будем использовать пробел).
  4. IF CurrentMatrixRecordOrdinal < ARRAYLEN(MATRIX_CaptionSet) THEN
    FOR CurrentMatrixRecordOrdinal:=CurrentMatrixRecordOrdinal TO ARRAYLEN(MATRIX_CaptionSet) DO
    MATRIX_CaptionSet[CurrentMatrixRecordOrdinal]:=' ';

Теперь реализуем требование в точном позиционировании, т.е. нужно добавить возможность сдвигать набор на одну позицию, а не сразу на 32. Как известно, за формирование набора записей отвечает функция GenerateMatrixData из программного модуля 9200 Matrix Management. Откроем в Object Designer этот программный модуль, а затем сохраним его под ID 50001 и Name = _Matrix Management.

  1. Открыть в Object Designer программный модуль 50001. Найти в нем функцию GenerateMatrixData.
  2. Открыть C/AL Locals. Для переменной SetWanted изменить свойство OptionString на Initial,Previous,Same,Next,1Previous,1Next (добавить две опции : 1Previous и 1Next).
  3. Изменить код в функции GenerateMatrixData следующим образом:
  4. Код функции GenerateMatrixData

Теперь функция умеет смещать набор записей на одну позицию вправо или влево. Кроме того изменен алгоритм смещения набора записей на несколько позиций.

Сохраним программный модуль 50001. Откроем форму 50001 и интегрируем в нее новые возможности.

  1. Открыть окно C/AL Globals, изменить для переменной MATRIX_SetWanted значение свойства OptionString на Initial,Previous,Same,Next,1Previous,1Next.
  2. Открыть закладку Functions окна C/AL Globals, открыть окно C/AL Locals для функции SetColumns.
  3. Для переменной SetWanted и зменить значение OptionString на Initial, Previous, Same, Next, 1Previous, 1Next.
  4. Добавить переменную lrItem типа Record подтипа Item.
  5. Открыть закладку Variables окна C/AL Locals, для переменной MatrixMgt указать в поле Subtype значение 50001.
  6. В начало функции SetColumns добавить строку lrItem:=Rec;, в конец функции добавить строку Rec:=lrItem;. Это нужно для плавного перехода между наборами столбцов. Если этого не сделать, то при переходе к следующему набору, будет выполняться позиционирование на первую запись таблицы Item (Товары).
  7. Добавить две кнопки: Previous One и Next One, в триггерах onPush указать соответственно SetColumns(MATRIX_SetWanted::"1Previous"); и SetColumns(MATRIX_SetWanted::"1Next");
  8. Сохранить и откомпилировать форму 50001 __Items by Location.
  9. Форма должна заработать.

Теперь, когда форма работает, нужно выполнить ее трансформацию в страницу. Для этого нужно выполнить следующие шаги.

  1. Открыть форму 177000 Transformation Forms.
  2. Установить курсор в строку с ID = 50001 (это наша форма, для которой уже была выполнена часть настроек).
  3. Единственное отличие этой формы, от предыдущей - в новых доступных действиях. Создадим кнопки на панели действий. Щелкнуть кнопку Input, Add, New and Promoted Actions.
  4. В окне Page Actions ввести новую запись
    • ActionsType = Action Items.
    • Control ID = 1000000074 (ID кнопки Previous One)
    • Promoted = Yes (Чтобы кнопка появилась в панели действий)
    • PromotedIsBig = Yes (И была большой)
    • Description = Previous One
  5. Это была кнопка Previous Set, теперь то же самое нужно сделать для Next Set. В окне Page Actions нужно ввести новую запись.
    • ActionsType = Action Items.
    • Control ID = 1000000075 (ID кнопки Next One)
    • Promoted = Yes (Чтобы кнопка появилась в панели действий)
    • PromotedIsBig = Yes (И была большой)
    • Description = Next One
  6. Далее нужно создать входящие файлы для Transformation Tool. Для этого щелкните кнопку Function, Create Transformation Input,
    • Transform Pages, сохраните файл как TransformPages.xml.
    • Delete Pages Elements, сохраните как DeleteElements.xml.
    • Move Pages Elements, сохраните как MoveElements.xml.
  7. В Object Designer выберите форму 50001 __Items by Location, затем щелкните File, Export. Сохраните форму как Forms.xml (тип файла XML Format).
  8. Поместите полученные четыре файла в папку Transformation Tools и запустите файл Microsoft.Dynamics.Nav.Tools.FormTransformation.exe, если трансформация пройдет удачно, то в папке появится файл Pages.xml
  9. Откройте Object Designer, щелкните File, Import и выберите полученный файл Pages.xml.
  10. Откомпилируйте объект Страница с ID = 50001 и названием __Items by Location
  11. Запустим новую страницу и посмотрим, что получилось: DynamicsNAV:////runpage?page=50001

Альтернативная реализация матричной формы в Microsoft Dynamics NAV 2009Альтернативная реализация матричной формы в Microsoft Dynamics NAV 2009

А вот как было раньше. На мой взгляд, получилось неплохо.

 

Андрей Панько >>
Dynamics NAV MVP
apanko@rabota-na-rezultat.ru