25.05.2007, 15:53 | #1 |
Участник
|
Лукап, отображающий список полей определённой таблицы
Изучая метод pickField() наткнулся на метод findFields() таблицы TmpSysTableField.
Есть там такой вот участок X++: field = new SysDictField(dictTable.id(), dictTable.fieldCnt2Id(i), j); if ((field.flags() & #DBF_VISIBLE) && (field.flags() & #DBF_STORE) && (field.baseType() != Types::CONTAINER) && (field.name() != fieldStr(Common, dataAreaId)) && (field.name() != fieldStr(Common, sequenceNum)) && (field.name() != fieldStr(Common, tableId)) && (field.baseType() != Types::VARSTRING)) { elements++; pack = conIns(pack, elements, [dictTable.fieldCnt2Id(i), field.extendedFieldId(), field.name(), field.label(), field.help(j), field.extendedTypeId(), field.baseType()]); } Вобщем вот, высказался P.S. Проверено в 3.0 SP5 и 4.0 SP1
__________________
Дмитрий |
|
25.05.2007, 17:51 | #2 |
Участник
|
на самом деле, думаю работает все правильно.
Поле в АОТ одно. Но оно является массивом. Поэтому перебираются все элементы массива. Но название поля то одно и то же. Другое дело, что в базе данных это поле хранится как отдельные поля. Но при просмотре поля в базе данных все отрабатывает как положено X++: static void tutorial_SysDictFieldDimension(Args _args) { SysDictField fld = new SysDictField(tableNum(LedgerJournalTable), fieldNum(LedgerJournalTable, Dimension)); ; info(fld.name()); info(fld.name(DbBackend::Sql, 1)); info(fld.name(DbBackend::Sql, 2)); info(fld.name(DbBackend::Sql, 3)); } |
|
25.05.2007, 18:22 | #3 |
Участник
|
И в итоге метод pickField() отобразит на экране окошко типа
... AccountNum CurrencyCode Dimension Dimension Dimension ... не очень как-то удобно видеть дименшны без номеров
__________________
Дмитрий |
|
25.05.2007, 18:26 | #4 |
Участник
|
Да, согласен. Может возникнуть непонятка.
Поэтому стоит делать так: (в смысле, выводить кроме названия поля еще и его метку) http://www.axaptapedia.com/Image:SelectFields.PNG |
|
16.09.2009, 15:50 | #5 |
Участник
|
pickField() ?
Есть ли в аксапте метод вроде pickField() только чтобы выпадал список не name а label полей таблицы ?
или как можно создать такой метод? |
|
16.09.2009, 17:42 | #6 |
Участник
|
Я такого метода не знаю. Но если программировать, придется чуток покорежить парочку классов.
Можно сделать более "тактичнее", но если делать "в лоб", то примерно вот так. 1. В BaseEnum SysPickListType добавить еще один элемент. Пусть он будет называться FieldsLabels. 2. В классе Global добавить еще один метод, почти такой же, как и метод pickField X++: static int pickFieldLabel(tableId tableId) { Object formRun; Args args; ; args = new Args(formstr(SysPick)); args.parm(strRFix(int2str(SysPickListType::FieldsLabels),2)+int2str(tableId)); formRun = classfactory.formRunClass(args); formRun.init(); formRun.run(); formRun.wait(); if (formRun.selection()) return formRun.selection(); return 0; } X++: public static client container fillFieldsLabelsMap(str _argsParm) { TmpSysTableField tmpSysTableField; DictTable dictTable = new DictTable(str2int(_argsParm)); Map map = new Map(Types::Integer, Types::String); ; if (dictTable && dictTable.rights() > AccessType::NoAccess) { tmpSysTableField = TmpSysTableField::findTableFields(tmpSysTableField, dictTable.id()); while select tmpSysTableField { map.insert(tmpSysTableField.ExtendedFieldId, tmpSysTableField.FieldLabel); } } return map.pack(); } X++: //------------- case SysPickListType::FieldsLabels : imageRes = #imageField; caption = "@SYS3852"; designWidth = #designLargeWidth; if (!map) { map = Map::create(sysPickList::fillFieldsLabelsMap(parmTxt)); } break; //------------- X++: Global::pickFieldLabel(tableNum(InventTable)); |
|
|
За это сообщение автора поблагодарили: mazzy (2), lev (3), Poleax (5), propeller (1), abri (1), MazZzDaI (1). |
17.09.2010, 17:46 | #7 |
Модератор
|
По аналогии с выше приведенным постом tricky, я сделал для себя выпадающий список (Lookup) для всех полей таблицы не являющимися системными:
Результат:
Для примера можно выбрать форму для изучения \Forms\PBATreeTable. Пример Lookup метода: X++: void lookup() { fieldId id; //AnyUserTable - таблица куда сохраняем поле ; id = pickFieldUserLabel(tableNum(CustTable)); if (! id) return; AnyUserTable.FieldName = fieldid2name(tableNum(CustTable),id); AnyUserTable_ds.refresh(); }
__________________
This posting is provided "AS IS" with no warranties, and confers no rights. |
|
|
За это сообщение автора поблагодарили: mazzy (2), Lemming (5), lev (2), mallard (2), Proba (1). |
17.09.2010, 18:00 | #8 |
Ищущий знания...
|
ну и в дагонку методам pick (может кому пригодится )..
в своё время нужны были методы, которые вываливают список EDT, Forms и MainMenu. т.к. в стандарте таковых не нашел добавил следующие методы в класс Global: Ax3.0 sp3 1. список EDT: X++: static int pickExtDataTypes() { Object formRun; container names; int i; Dictionary dict = new Dictionary(); DictType dictType; #ResAppl ; formRun = classFactory.createPicklist(); formRun.init(); for (i=1; i <= dict.typeCnt(); i++) { dictType = new DictType(dict.typeCnt2Id(i)); names += dictType.name(); } formRun.choices(names, #ImageEDT); formRun.caption("EDT"); formRun.run(); formRun.wait(); if (formRun.choice()) { return dict.typeName2Id(formRun.choice()); } return 0; } X++: static FormName pickForms() { Object formRun; container names; TreeNode treeNode; TreeNode treeNodeChild; #ResAppl #AOT ; treeNode = TreeNode::findNode(#FormsPath); treeNodeChild = treeNode.AOTfirstChild(); formRun = classFactory.createPicklist(); formRun.init(); while (treeNodeChild) { names += treeNodeChild.treeNodeName(); treeNodeChild = treeNodeChild.AOTnextSibling(); } formRun.choices(names, #ImageForm); formRun.caption("Forms"); formRun.run(); formRun.wait(); if (formRun.choice()) { return formRun.choice(); } return ''; } X++: static MenuName pickMenusMain() { Object formRun; container names; TreeNode treeNode; TreeNode treeNodeChild; SysDictMenu dictMenu; #ResAppl #AOT #Admin ; treeNode = TreeNode::findNode(#MenusPath + '\\' + #MainMenu); treeNodeChild = treeNode.AOTfirstChild(); formRun = classFactory.createPicklist(); formRun.init(); while (treeNodeChild) { dictMenu = SysDictMenu::newMenuName(#MainMenu + '\\' + treeNodeChild.treeNodeName()); names += dictMenu.label(); treeNodeChild = treeNodeChild.AOTnextSibling(); } formRun.choices(names, #ImageMenuMain); formRun.caption("MainMenu"); formRun.run(); formRun.wait(); if (formRun.choice()) { return formRun.choice(); } return ''; }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: TasmanianDevil (4). |
Теги |
ax3.0, ax4.0, lookup, lookupfield, полезное, программно |
|
|