AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.08.2004, 20:42   #1  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
? Динамическое создание методов.
Здравствуйте.

Существует следующая проблема.
Необходимо выводить на экран в отчете только те поля таблички, которые были выбраны в диалоге. Причем если я добавляю Control с указанием DateField, то отображаются пустые строки, а если я создаю Control с использованием Display-метода, то все отображается правильно. Так как в таблице много полей не хотелось бы создавать большое количество display-методов. Есть ли возможность создать display-методы динамически при анализе данных, полученных от диалога.

Заранее благодарен за ответ, Ратмир.
Старый 16.08.2004, 22:47   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Не легче ли перекрыть fetch()? Сейчас под рукой нет примера, приду на работу, постараюсь выслать.

С Уважением,
Георгий
Старый 17.08.2004, 09:27   #3  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
fetch у меня перекрыт, но толку от этого мало.
Старый 17.08.2004, 10:41   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
У полей отчета есть свойство Visible. Т.е. лепишь в отчет вообще все поля, которые только могут понадобиться (с привязкой к DateField), а в зависимости от настроек пользователя меняшь их свойство Visible(true) - это можно сделать в методе Fetch.
Старый 17.08.2004, 11:01   #5  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
Привязка к DateField не работает; когда я помещаю в отчет StringEdit InventDim.InventLocationId он выводит пустую строку, а когда я вывожу Display-метод
display inventLocationId()
{
return InventDim.InventLocationId;
}
все отрабатывает прекрасно. Но не хотелось бы для каждого поля каждой из использующихся в отчете таблиц создавать дисплэй-метод.
Хотелось бы, чтобы в момент инициализации отчета динамически создавались все необходимые методы. Реально ли это?
Старый 17.08.2004, 11:07   #6  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
в executeSection() Body Report'a я перекрываю метод и вытаскиваю все необходимые мне поля:
PHP код:
public void executeSection()
{
    
QueryBuildDataSource    qbds = new QueryBuildDataSource();
    
QueryBuildRange         qbr = new QueryBuildRange();
    
int                     range;
    
int                     ranges 0;
    
int                     links;
    
int                     elements;
    
FieldId                 fieldId;
    
DictTable               tableDescr;
    
DictField               fieldDescr;
    ;
    
qbds outputSelection.query().dataSourceNo(1);
    if (
qbds.enabled())
        
ranges qbds.rangeCount();

    
//info(strfmt("Ranges: %1; Links: %2", qbds.rangeCount(), qbds.linkCount()));

    
for (range 1range <= rangesrange++)
    {
        
qbr qbds.range(range);
        
tableDescr = new DictTable(tableIdentificator);
        
fieldId tableDescr.fieldName2Id(qbr.name());
        
fieldDescr = new DictField(tableIdentificatorfieldId);
        
//info(strfmt("Range: %1; %2 %3 %4", range, qbr.label(), qbr.name(), fieldDescr.label()));// qbr.AOTToString() ));
        
this.addControl(tableIdentificator,fieldId);
    }

    
super();

Удачи!
Георгий
Старый 17.08.2004, 11:13   #7  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
Ещё раз повторяю, что если я использую addControl(tableIdentificator,fieldId);
то на экране отображается пустая строка. Поэтому необходимо использовать display-метод.

X++:
for (j=1;j<=query.dataSourceCount();j++)
{
    for (i=1;i<=query.dataSourceNo(j).sortFieldCount();i++)
    {
        rsc = rs.addControl(query.dataSourceNo(j).table(),query.dataSourceNo(j).sortField(i));
    }
}
Если я использую такой код, то поля отображаются, то они пустые.

X++:
for (j=1;j<=query.dataSourceCount();j++)
{
    for (i=1;i<=query.dataSourceNo(j).sortFieldCount();i++)
    {
        rs.addDisplayControl(strfmt('field_%1_%2',query.dataSourceNo(j).table(),query.dataSourceNo(j).sortField(i)));
    }
}
Если я использую такой код, то все хорошо, но создавать несколько десятков методов
типа field_%1_%2 не хочется. поэтому хотелось бы вставить в init отчета динамическое формирование всех этих методов.

С уважением, Ратмир.
Старый 17.08.2004, 11:18   #8  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Если очень хочется воспользоваться динамическими методами - воспользуйтесь поиском. Данная проблема уже обсуждалась и решение было найдено.
Другое дело, стоит ли использовать такое решение или пересмотреть постановку задачи.....
Старый 17.08.2004, 11:25   #9  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
:(
К сожалению, поиск по ключевым словам "динамические методы", "создание методов" и т.д. ничего полезного не выдает.
Старый 17.08.2004, 11:29   #10  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Ну например так я добавлял метод в Класс, хотя можно в любой узел AOT добавлять что хочешь...
PHP код:
static void AddGlobalMethods(Args _args)
{
    
TreeNode    nodeGlobalrootnodeMethod;
    
xInfo       xinfo = new xInfo();
    
str         sour;
    ;
     
root xinfo.rootNode();
     
nodeGlobal root.findChild("Classes"); 
     if(
nodeGlobal.treeNodePath() != "")
     {
        
nodeGlobal nodeGlobal.findChild("Global");
        
nodeMethod nodeGlobal.findChild("str2NumOk2");
        if (!
nodeMethod)
        {
            
nodeGlobal.add("str2NumOk2");
            
nodeMethod nodeGlobal.findChild("str2NumOk2");
            
nodeMethod.AOTsetSource("static boolean str2NumOk2(TempStr txt)\n" +
                                    
"{\n" +
                                    
"   TempStr tmp = strLRTrim(txt);\n" +
                                    
"   int     len = strLen(tmp);\n" +
                                    
"   int     pos;\n" +
                                    
"   int     posE;\n" +
                                    
"\n" +
                                    
"   if (strFind(tmp, ',.0123456789' , 1, len) == 0)\n" +
                                    
"       return false;\n" +
                                    
"\n" +
                                    
"   return true;\n" +
                                    
"}\n"False);
        }
        
nodeGlobal.compile();
     }


__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
За это сообщение автора поблагодарили: mazzy (5).
Старый 17.08.2004, 11:33   #11  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Изначально опубликовано Ratmir
Ещё раз повторяю, что если я использую addControl(tableIdentificator,fieldId);то на экране отображается пустая строка.
А! А у отчета какой DataSource? Если его нет или он не совпадает с tableIdentificator, то так и будет.

С Уважением,
Георгий
Старый 17.08.2004, 11:44   #12  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
Цитата:
Изначально опубликовано George Nordic

А! А у отчета какой DataSource?
У отчета три DataSource, если я вывожу поля DataSource, на котором основана секция, то поля выводятся, если двух остальных-то поля не выводятся.
Старый 17.08.2004, 12:38   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
К сожалению, поиск по ключевым словам "динамические методы", "создание методов" и т.д. ничего полезного не выдает.
http://www.axforum.info/forums/showt...F7%E5%F1%EA%E8
Старый 17.08.2004, 12:57   #14  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
To blokva,Андре
Спасибо, очень помогли!!!
Старый 17.08.2004, 13:25   #15  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Хм... интересно, сколько у Вас будет подобного рода методов, автоматически созданных, через несколько месяцев, не говоря уже о годах...

Хотя, конечно, универсальный отчет - вещь хорошая
Старый 17.08.2004, 16:51   #16  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Цитата:
Изначально опубликовано George Nordic
Хм... интересно, сколько у Вас будет подобного рода методов, автоматически созданных, через несколько месяцев, не говоря уже о годах...
Метод будет один, но в зависимости от ситуации в момент запуска отчета, его содержание будет меняться!
Хотя нет методов будет 2 - один будет изменять содержание другого в зависимости от ситуёвины...
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 17.08.2004, 17:17   #17  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Т.е. пользователь выбирает 25 полей для вывода на экран (бывают и такие), потом 1 метод генерит 25 display -методов, которые выполняются по каждой строчке... потом - удалить их... Что ж - это, конечно, выход. Но, по сути, я полностью согласен с macklakov'вым по данному вопросу (в указанной Андре ветке)

to blokva - спасибо, интересный код.. Может и пригодиться когда Кто ж этих юзеров знает....

С Уважением,
Георгий.
Старый 17.08.2004, 17:36   #18  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
2Георгий
Я тоже согласен, что поднятую проблемму надо решать совершенно по-другому ибо генерация методов и их компиляция занимает достаточно времени.
С другой стороны я тоже согласен что
Цитата:
Кто ж этих юзеров знает....
А данный подход помогает когда не хочешь "затирать" весь класс (Global, Application, Session, WinAPI etc.) а переносить свои методы надо...
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/
Старый 17.08.2004, 17:44   #19  
Ratmir is offline
Ratmir
Участник
 
21 / 10 (1) +
Регистрация: 16.08.2004
Адрес: Саратов
Разъяснения:

Цитата:
генерация методов и их компиляция занимает достаточно времени.
В момент выполнения отчета методы не генерятся. они сгенерированы единожды и хранятся в отчете. Просто единожды запускается операция добавления методов в отчет. Можете сказать, а зачем нам в отчете 45 методов типа field_50053_51232, но если не использовать динамическое добавление методов, то все эти методы пришлось бы создавать заново. Временные методы не конструктивны, так как при запуске отчета несколькими пользователями он свалится.
Так как пишется ряд отчетов (около 10), то создание порядка 500 методов могло сильно разрушить мою психику, так что написанный генератор методов мне очень сильно поможет.
Старый 18.08.2004, 09:13   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Я чего-то глубоко не понимаю в постановке задачи. Каким боком здесь вообще нужны динамические методы? В смысле создающиеся в каждом отдельном отчете.

1) Что мешает создать 1 (один) display метод возвращающий символьную строку и в качестве параметра передать в этот display-метод id таблицы и id поля (ну, или создать массив нужных id)? Для конвертации в строку любого типа данных можно использовать StrFmt(). Если принципиально важно возвращать числа, то создаешь 2 dispaly-метода - один для строк, другой для чисел.

2) Кроме того, еще раз напомню, у объектов отчета есть свойство Visible. Если его установить в false, то объект не просто не будет печататься в отчете, но и все остальные объекты сдвинуться, чтобы заполнить освободившееся место. Т.е. формируешь в отчете вообще ВСЕ поля всех таблиц источников, а при инициализации просто определеяешь visible для нужных полей.

3) Если пользователь такой непредсказуемый, то пусть сам и делает отчет! Какие проблемы-то. В Axapta все есть для этой цели
Теги
метод, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Динамическое создание DataSource на форме, и добавление элементов дизайна. epack DAX: Программирование 12 24.11.2010 15:31
Динамическое создание метода. HorrR DAX: Программирование 23 19.02.2008 14:44
Создание методов find и exist Maxim Gorbunov DAX: База знаний и проекты 21 07.01.2007 23:55
Динамическое создание элементов дизайна на Web-формах AvrDen DAX: Программирование 0 04.08.2005 12:58
Динамическое создание меню ta_and DAX: Программирование 7 18.07.2005 19:28

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:56.