![]() |
#14 |
Moderator
|
Подручные средства для облегчения создания рутинных фрагментов кода
Во загнул, скажете, но на самом деле все очень просто. То тут, то там приходится выписывать последовательности операторов присваивания для перевалки данных из одного места в другое, например, пересылать значения из несвязанных контролов формы в поля таблицы. Для оформления подобных операций желательно иметь выстроенный список полей с одной и с другой стороны, которые в коде необходимо "совместить" друг с другом посредством знака равенства.
Такое совмещение можно приготовить в любом редакторе текста, позволяющем блочные вставки, например, в MultiEdit или в текстовом редакторе программы FAR (выделение прямоугольника при помощи Alt+стрелка), и затем вставить в текст конкретного метода в Axapta. Еще проще подготовить присваивания при помощи таблиц Excel, вставив наборы полей в соседние колонки, связав их формулами и наконец скопировав вычисленные значения формул в код X++. Пусть, например, имееется набор полей таблицы: Table1.StrField1 Table1.StrField2 Table1.StrField3 и набор контролов формы (подразумевается AutoDeclaration = Yes): StringEditControl1 StringEditControl2 StringEditControl3 Допустим, что код должен выглядеть следующим образом: Table1.Field1 = StringEditControl1.valueStr(); Table1.Field2 = StringEditControl2.valueStr(); Table1.Field3 = StringEditControl3.valueStr(); Создадим эти операторы присваивания при помощи Excel. Для этого: - скопируем набор полей в столбец A Excel, начиная с ячейки A1; - скопируем набор контролов в столбец B Excel, начиная с ячейки B1; - в ячейку C1 введем формулу: =A1 & " = " & B1 & ".valueStr();" и распространим ее вниз копированием на все необходимые строки; - далее из столбца C забираем строки кода X++ для вставки в Axapta. Всё неплохо. Дело осталось за малым - автоматизировать получение самих списков полей (не вручную их же набирать в самом деле! ![]() Вот два коротеньких джобика, которые могут помочь в этом. Первый - получение списка полей таблицы: X++: static void Job_getTableFieldList(Args _args) { str tableName = 'RAssetTable'; // подставь здесь свою таблицу treeNode treeNode = new xInfo() .rootNode() .AOTfindChild('Data Dictionary') .AOTfindChild('Tables') .AOTfindChild( tableName ) .AOTfindChild('Fields'); ; treeNode = treeNode.AOTfirstChild(); while ( treeNode ) { info( strfmt('%1.%2', tableName, treeNode.treeNodeName()) ); treeNode = treeNode.AOTnextSibling(); } } Второй джоб - получение списка контролов формы: X++: static void Job_getFormControlList(Args _args) { str formName = 'RAssetTable'; // подставь здесь свою форму int row, hLevel; // служебные поля на случай вывода сквозной нумерации строк или уровней иерархии TreeNode treeNode = new xInfo() .rootNode() .AOTfindChild('Forms') .AOTfindChild( formName ) .AOTfindChild('Designs') .AOTfindChild('Design'); str controlType; str controlName; void nextNode( treeNode _tn) { ; hLevel++; _tn = _tn.AOTfirstChild(); while (_tn ) { if (strscan(_tn.treeNodeName(), ':', 1, 10000)) { row++; [controlType, controlName] = str2con(_tn.treeNodeName(), ':'); if (substr(controlType,1,1)=='[') // Tab, TabPage, Group, Grid, ButtonGroup { controlType = substr(controlType, 2, strlen(controlType) ); controlName = substr(controlName, 1, strlen(controlName)-1); } info( strfmt('%1.valueStr();', controlName) ); } nextNode(_tn ); _tn = _tn.AOTnextSibling(); } hLevel--; } ; nextNode( treeNode ); } |
|
Теги |
excel, rls, полезное, blog, axapta |
|
|