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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.01.2004, 20:19   #1  
epack is offline
epack
Участник
 
15 / 10 (1) +
Регистрация: 14.01.2004
Адрес: Москва
Динамическое создание DataSource на форме, и добавление элементов дизайна.
В методе init формы пытаюсь добавть DataSource, и поля этого DS положить на грид на форме.
Написал следующее:
PHP код:
public class FormRun extends ObjectRun
{
    
FormBuildDataSource    fbds;

    
FormControl formControl1;
    
FormControl formControl2;
}

void init()
{
    
super();

    
fbds form.addDataSource("Table1");

    
Grid.dataSource(fbds.table());  //    Grid.dataSource(fbds.id()); пробовал оба варианта

    
formControl1 Grid.addDataField(fbds.id(),fieldnum(Table1,Field1),formControl0);
    
formControl2 Grid.addDataField(fbds.id(),fieldnum(Table2,Field2),formControl1);

Во-первых, побочный глюк-неудобство - не получается у меня в пустой грид добавить поля из кода, в смысле, при запуске формы грид остаётся пустым.
Так что пришлось положить на грид Control типа StringEdit, под названием formControl0 (EDT, например, Name), а из кода уже после него добавлять остальные, нужные, поля.

Далее, теперь грид формируется правильно (т.е., содержит одно ненужное и два нужных поля), однако не отображает данные из соответствующей таблицы.
Если я такой же набор полей (со сходными свойствами) формирую в гриде вручную, в дизайне, то данные отображаются.
Возможно, некорректно устанавливается свойство DataSource грида..

Объясните пожалуйста, чего не хватает (или что я сделал не так).
Старый 14.01.2004, 20:34   #2  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Коллега! Рекомендую посмотреть код формирования списка должностных лиц при печати складских журналов. Думаю там все найдешь. Класс называется InventJournalPrintForm_RU. Метод run. Идея состояла в следующем: Для складского журнала может формироваться 1..n отчетов. Каждый отчет содержит свой список должностных лиц. Потому кнопку диалога была повешена форма в которую динамически набрасывались tabPages, на них в свою очередь grids, которые привязывались к своим источникам данных. Вот такая штука.


P.S. Это верно для версии 3.0 SP1 и старше.
Старый 15.01.2004, 10:56   #3  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Или посмотрите класс SysTableBrowser (браузер таблиц), там практически все, что Вам нужно.
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 15.01.2004, 17:36   #4  
epack is offline
epack
Участник
 
15 / 10 (1) +
Регистрация: 14.01.2004
Адрес: Москва
Спасибо, посмотрел эти классы, понял, насколько был неправ при написании кода до этого . Но проблему не решил.
Моя ситуация немного отличается. В данных классах сначала создаётся объект Form, затем на него вешаются DataSource и FormControls, затем на основе этого Form создаётся FormRun, и запускается на выполнение.
В моём же случае, нужно изменить структуру формы из самой этой формы.
(Изначально вопрос возник из размышлений на тему, возможно ли сделать относительно универсальный лукап, отсюда и привязка всех действий непосредственно к лукап-форме).
Всё, что нашёл в Аксапте на эту тему - кратенькое замечание в developer's guide про медот формы init() :
"Before the super() call in the method, you can modify the form using the FormBuild system class."

Какие ещё будут соображения по этому поводу?
Старый 15.01.2004, 18:13   #5  
Axapta is offline
Axapta
Участник
 
91 / 12 (1) ++
Регистрация: 21.06.2002
Адрес: Moscow
Попробуйте ваши действия по добавлению динамических элементов производить до супера в init()....
Старый 15.01.2004, 19:23   #6  
epack is offline
epack
Участник
 
15 / 10 (1) +
Регистрация: 14.01.2004
Адрес: Москва
Пробовал, при запуске формы аксапта вылетает.

PHP код:
    dsName tableId2Name(tablenum(Table1);

    
fbds form.addDataSource(dsName);
    
fbds.table(tablenum(Table1));

    
grid form.addControl(FormControlType::Grid"");
    
grid.dataSource(dsName);

    
fc1 grid.addDataField(fbds.id(),fieldnum(Table1,Field1));
    
fc2 grid.addDataField(fbds.id(),fieldnum(Table1,Field1));

    
super(); 
Старый 16.01.2004, 11:23   #7  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Непосредственно на форме не выйдет. Но форму можно создать в классе, как это обсуждалось ранее. Далее этот класс использовать в lookup методе формы. Так как это делается в перекрытых методах lookup.
Старый 16.01.2004, 12:39   #8  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Решал я такую задачу. Все можно сделать, и притом из самой формы. Как было правильно замечено, модифицировать дизайн надо перед super() в init(). Работа идет с классом Form form = formRun.form(). Чтобы Аксапта не вылетала, я заранее завел источник данных в форме, а потом подменяю ему таблицу:
PHP код:
    FormBuildDatasource formBuildDatasource;
    ;
    
// Build the selectable grid
    
formBuildDatasource form.dataSource(#DataSourceSelNo);
    
formBuildDatasource.table(subjTableLookup.subjTableId());
    
selDSId formBuildDatasource.id();
    .... 
Следующим шагом добавляем поля в грид (тоже заведен заранее, хотя это и не столь важно):
PHP код:
private FormControlId buildGrid(container           _fields,
                                
FieldId             _selFieldId,
                                
FormControlName     _name,
                                
FormBuildDatasource _datasource)
{

    
FormBuildControl        control;
    
FormBuildGridControl    gridControl;
    
FormControlId           ret;
    
int                     i;

    
gridControl         form.design().control(_name);
    
gridControl.dataSource(_datasource.id());

    for (
1<= conlen(_fields); i++)
    {
        
control gridControl.addDataField(_datasource.id(), conpeek(_fieldsi));

        if (
conpeek(_fieldsi) == _selFieldId)
        {
            
ret control.id();
        }
    }

    return 
ret;

ВСЕ! В моем случае речь идет о lookup-форме, поэтому выполняются магические пассы с "главным" контролом sel[ected]Field.
Старый 16.01.2004, 12:59   #9  
ANVA is offline
ANVA
Участник
 
24 / 10 (1) +
Регистрация: 04.08.2003
Адрес: Mocква
Спасибо, Женя, был не прав
Старый 19.01.2004, 17:36   #10  
epack is offline
epack
Участник
 
15 / 10 (1) +
Регистрация: 14.01.2004
Адрес: Москва
Спасибо, всё получилось.
Старый 07.02.2005, 17:22   #11  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Цитата:
Изначально опубликовано EVGL
Чтобы Аксапта не вылетала, я заранее завел источник данных в форме, а потом подменяю ему таблицу.
Ещё можно вместо добавления источника, открыть заново форму.
При этом в новую копию формы передать тот же args.

Зачем это надо? - можно без кастомизация формы динамически добавлять функциональность (по типу как сделан SysListPanel).
Вложения
Тип файла: xpo formtest.xpo (4.4 Кб, 384 просмотров)
__________________
С уважением, Игорь Ласийчук.
За это сообщение автора поблагодарили:  (1).
Старый 24.11.2010, 13:42   #12  
AX2009
Гость
 
n/a
Цитата:
Сообщение от Garic Посмотреть сообщение
Ещё можно вместо добавления источника, открыть заново форму.
При этом в новую копию формы передать тот же args.

Зачем это надо? - можно без кастомизация формы динамически добавлять функциональность (по типу как сделан SysListPanel).
так уже не работает.
добавил контрол на форму, и пытаюсь обратиться к нему из метода init()
Вложения
Тип файла: xpo Form_FormTest.xpo (3.0 Кб, 383 просмотров)
Старый 24.11.2010, 15:31   #13  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от AX2009 Посмотреть сообщение
так уже не работает.
добавил контрол на форму, и пытаюсь обратиться к нему из метода init()
Как-то потребовалось создавать диалоги с источниками данных и гридами. В качестве альтернативы созданию собственных форм для каждого случая, была использована одна собственная диалоговая форма (можно модифицировать стандартную форму Dialog) с заранее созданными искуственными источниками данных, которые позднее переопредилялись в RunBase.dialog(...). Динамически создавать источники данных в стандартной форме не получилось по предпологаемой причине, описанной ниже. Далее имхо.
Представьте, что экземпляры объектов, таких как DataSource, DataSource_DS, DataSource_Q, DataSource_QR, и экземпляры контролов с AutoDeclaration = Yes, хранятся некоторым списком. Сами переменные, используемые в коде формы, имеют смысл ссылок на позицию (адрес) в этом списке. При чем экземпляры объектов для источников данных хранятся перед контролами. При добавлении нового источника данных у формы "создаются новые" экземпляры объектов, которые сдвигают контролы в списке. Естественно указатели на контролы становятся неверными, поэтому и возникают ошибки при обращении к ним. В вашем случае - при обращении к StaticText.
Решение: либо добавить нужное количество источников данных на форму заранее в репозитарий, либо, если первое не возможно, как минимум отказаться от использования контролов с AutoDeclaration = Yes (данным путем не ходил, возможно потребуется ввести и другие ограничения)

Последний раз редактировалось vallys; 24.11.2010 в 16:03.
За это сообщение автора поблагодарили: gl00mie (5), S.Kuskov (10),  (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Динамическое создание контролов на форме Yari DAX: Функционал 8 23.08.2007 13:51
Динамическое создание элементов дизайна на Web-формах AvrDen DAX: Программирование 0 04.08.2005 12:58
Динамическое создание меню ta_and DAX: Программирование 7 18.07.2005 19:28
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41
Динамическое добавление элементов в отчет Maxim Gorbunov DAX: База знаний и проекты 1 17.01.2002 14:48

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

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

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