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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.09.2003, 16:26   #1  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
? Аксапта и динамический код?
Привет всем!

Можно ли выполнить в аксапте динамически сформированный код?

Например:
Динамически формируется диалог, список полей которого и их типы описаны в какой-нить табличке... Для поля диалога с типом DATE, в текстовом поле таблицы, указано значение по-умолчанию: "today() - 1" или "str2date('01-01-2003',123)"
Необходимо это код выполнить и получить значение даты...

Способна на такое аксапта?
Старый 08.09.2003, 16:50   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Можно. Только в вашем случае это излишне. Для создания функций с подобными динамическими диалогами предназначен класс RunBase, сотни наследников которого дают примеры использования (методы dialog() и getFromDialog() ).

Если все-таки интересует исполнение динамически созданного кода, то вот пища для размышлений: \Classes\ReleaseUpdateDB\run().
Старый 08.09.2003, 18:32   #3  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано EVGL
Можно. Только в вашем случае это излишне. Для создания функций с подобными динамическими диалогами предназначен класс RunBase, сотни наследников которого дают примеры использования (методы dialog() и getFromDialog() ).

Если все-таки интересует исполнение динамически созданного кода, то вот пища для размышлений: \Classes\ReleaseUpdateDB\run().
Спасибо за направление:

Вот что получилось (может кому-то понадобится) :

PHP код:
static void Job5(Args _args)
{
    
xppcompiler         compiler        = new xppcompiler();
    
str                 buf;
    ;
    
buf = @'
date some_method()

    return %1;
}'
;

    
buf strfmt(buf'str2date("31-01-2003", 123)');

    if (
compiler.compile(buf))
    {
        
info(date2str(runbuf(buf),123,2,2,2,2,4));
    }
    else
    {
      
info(':-(');
    }

    
//
    
buf = @'
date some_method()

    return %1;
}'
;
    
buf strfmt(buf'today() - 7');

    if (
compiler.compile(buf))
    {
        
info(date2str(runbuf(buf),123,2,2,2,2,4));
    }
    else 
    {
        
info(':-(');
    }


Старый 08.09.2003, 18:50   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
редкостное извращение, на мой взгляд.
нужны серьерзные обоснования, чтобы такой подход оправданным.

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

а для чего, это? если не секрет
Старый 09.09.2003, 10:23   #5  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано mazzy
редкостное извращение, на мой взгляд.
...
а для чего, это? если не секрет
Для чего, я описал в первом постинге...

Повторюсь, если что-то показалось непонятным:
- диалог формируется динамически и с произвольным числом параметров, т.е. заранее неизвестно сколько данных (dialogField'ов) и каких типов будет запрошено у пользователя - диалоги и описания их парметров хранятся в некой таблице...
- у некоторого dialogField'а с типом DATE необходимо сразу установить значение по-умолчанию, например - сегодня, день или неделю или месяц... назад или вперед
- задав некоторую формулу (или даже весь метод) получения значения по-умолчанию для некоторого поля я смогу заполнить данное поле при динамическом формировании диалога... Соответсвенно формула может меняться в зависимости от текущей необходимости... без исправления кода приложения...

Если можешь предложить другое решение - предлагай...

ЗЫ
пример с датой рассмотрен как самый простой для понимания...
вот другой пример: необходимо заполнить поле диалога типа листбокс или комбобокс списком заранее неизвесных значений...
Старый 09.09.2003, 11:58   #6  
puz is offline
puz
Участник
 
37 / 11 (1) +
Регистрация: 01.09.2003
Адрес: Новосибирск
Можно воспользоваться методом add() и в ComboBox и в ListBox.
Он как раз позволяет добавить элементы в список.
Старый 09.09.2003, 12:03   #7  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Я думаю, автор знает, как добавлять элементы в комбобокс, он решает другую интересную задачу: как создать интерфейс, который позволит единообразно и гибко задавать начальные значения полей произвольных типов.
Тут остается посоветовать только вот что: на таблице, в которой вводятся эти "today() - 1" и т.д., стоит сделать метод проверки validateWrite(), который запускал бы код с помощью того же runbuf() и проверял его синтаксис на предмет ошибок.
Старый 09.09.2003, 12:11   #8  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Цитата:
Изначально опубликовано puz
Можно воспользоваться методом add() и в ComboBox и в ListBox.
Он как раз позволяет добавить элементы в список.
что ты будешь добавлять методом add() если список значений тебе заранее не известен ?

PS
здесь обсуждается тема НЕ как добавить элемент в комбобокс или листбокс, а как выполнить динамически сгенерированный код для формирования списка значений для комбобокса или листбокса не исправляя ни строчки кода приложения
Старый 09.09.2003, 12:40   #9  
puz is offline
puz
Участник
 
37 / 11 (1) +
Регистрация: 01.09.2003
Адрес: Новосибирск
Сорри. Сглупил. Внес сумбур. Больше не буду.
Старый 09.09.2003, 13:06   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано SnowMan
Для чего, я описал в первом постинге...
...
у некоторого dialogField'а с типом DATE необходимо сразу установить значение по-умолчанию
Для диалога EVGL дал хороший ответ. В руководстве разработчика в статье Using the Dialog class очень хорошо сказано как надо инициализировать значения контролов в диалоге ДО выполнения диалога.

Поэтому, EVGL, я не понял твоего замечания насчет "интересную задачу: как создать интерфейс". Такой интерфейс уже существует. Назвается dialog. Описан в документации.

Делается цикл. В цикле считаываются ваши параметры и значения по умолчанию. В цилке создаются контролы и ИНИЦИАЛИЗИРУЮТСЯ.

Или я снова чего-то не понимаю? В чем проблема то?

пример
PHP код:
void testDialog(container c)
{
    
Dialog dialog = new Dialog("@SYS22540");
    
DialogField DialogAccountId;

    while(
myContainerHasParms(c))
    {
        
DialogAccountId dialog.addField(myGetTypeFromContainer(c)); 
        
DialogAccountId.Value(myGetValueFromContainer(c)); /// !!!! Инициализация
        
myNextContainerParms(c);
    }
    if (
dialog.run())
    {
       return 
true;
    }
    return 
false;

Старый 09.09.2003, 13:14   #11  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
:)
Просто автор с самого начала дал в вопросе слишком много информации, что вызвало переполнение стека у EVGL и mazzy. Автор знает, как создавать поля диалога. Его интересует, как создать динамичный интерфейс для указания значений по умолчанию этих полей! Надо долго читать, чтобы понять.
Старый 09.09.2003, 13:38   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Я тупой, наверное. Не понял.
Старый 09.09.2003, 14:48   #13  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Наверное я плохо объясняю...

Как говорится лучше один раз увидеть

Попытаюсь еще раз

Есть форма регистрации диалогов (см рис 1) в которой можно зарегистрировать новый диалог и описать его параметры...


Значения по-умолчанию для типа DATE указаны как 'today() - 7' и 'today() + 7' соответсвенно...

Результат вызова диалога показан на рисунке 2


в случае если необходимо поменять значения по-умолчанию для первой даты, то нет необходимости исправлять код приложения, а можно просто поменять допустим на 'str2date("01-01-2003",123)'
теперь результат вызова будет как на рис 3
Вложения
Тип файла: img19588-1 (15.9 Кб, 1149 просмотров)
Тип файла: img19588-2 (4.7 Кб, 1100 просмотров)
Тип файла: img19588-3 (4.7 Кб, 1140 просмотров)
Старый 09.09.2003, 16:13   #14  
Shrike is offline
Shrike
Участник
 
63 / 10 (1) +
Регистрация: 18.04.2003
Вот к чему приводит чрезмерное увлечение любимым лозунгом МБС: "Не бойтесь программировать в Аксапте!"
Старый 09.09.2003, 20:14   #15  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано SnowMan
Как говорится лучше один раз увидеть
Точно. Теперь понял. Спасибо.

... и это все еще и на динамическом диалоге, у которого нет хелпа... мдя..
Что ж, начнем каверзные вопросы.
  1. Вы делаете свой механизм сохранения и загрузки параметров для диалога. Пусть так. Чем вас не устраивает стандартный механизм LastValue? (см. Руководство разработчика)
  2. Вы предлагаете использовать формулы для дат. Чем не устраивает стандартный механизм интервалы дат? (см. главная книга \ Настройка). Почему вы не стали вместо дат вводить просто интервал дат? (как в финансовых отчетах, например)
  3. Вы всерьез полагаете, что пользователи смогут запомнить хитросочиненные английские функции? Или этот механизм вы только для себя делаете? Кто будет настраивать этот механизм для пользователей?
  4. Вы наверняка понимаете, что в колонке "значение по умолчанию" можно использовать только функции без аргументов. Как вы думаете сколько таких более-менее полезных функций существует? Судя по закладке в верхней части формы, вы вводить аргументы функций в свой механизм, так? Как вы планируете указывать аргументы?

Главные вопросы, конечно же - почему вас не устроили стандартные механизмы?

Я конечно же могу ошибаться...
Но такого программировать точно не стоит.
Старый 10.09.2003, 12:33   #16  
SnowMan is offline
SnowMan
Участник
 
57 / 10 (1) +
Регистрация: 15.08.2003
Адрес: Москва
Начну с того, что тема данной ветки сообщений представляла собой вопрос: "Дружат ли аксапта и динамически сформированный код? "
На поставленный вопрос во втором постинге был получен исчерпывающий ответ (огромное спасибо EVGL)

Дальнейшее же обсуждение лежит в области вопроса "а зачем?"

На него можно ответить просто: "Надо", но я попробую все-таки объснить, что за задачу я решаю на данный момент...

Сразу оговорюсь - я не внедренец (нам внедряют), систему изучаю не больше месяца, полную функциональность и приемы программирования освоить не успел и поэтому рад конструктивной критике...

Итак, описание целей и задач:
Глобальная цель (уровня отдела ИТ и, надеюсь, внедренцев) - подружить аксапту с бизнесом, в основном именно аксапту, а не бизнес (надеюсь объяснять не придется, да и это не тема для данного форума)
Исходя из глобальной цели, необходимы временные (в 80% случаев читай постоянные) механизмы взаимодействия аксапты и функционирующего бизнеса.
Отсюда Задача - создание механизма управления внешними приложениями или паралельными задачами.
Требования:
- Необходимо зарегистрировать внешнее приложение в системе, указать список требуемых для выполнения параметров, разграничить права доступа к задаче и возможно, параметрам. Количество внешних приложений и их параметров не ограничено. Параметры могут быть обязательными и не обязательными, видимыми и не видимыми, доступными и не доступными, с автозаполнением и заполнением в ручную...
- Необходимо указание где должно быть запущено приложение: на машине инициатора или на сервере (AOS)
- Необходимо осуществить два метода запуска внешнего приложения: с ожиданием завершения работы и без ожидания.
- Необходимо сформировать уведомление (если таковое требуется) инициатора запуска о результатах работы приложения и если требуется доставить результат работы приложения инициатору (будь то сформированный файл или просто код возврата)
- Необходимо описать реакцию системы инициатора на полученный результат работы внешнего приложения, вплоть до запуска другого внешнего приложения
- Необходимо регистрировать: кто, когда, с какими параметрами и какое внешнее приложение запускал, когда внешнее приложение завершило свою работу и с какими результатами.
- Необходимо вести архив результатов работы внешних приложений в системе, чтобы пользователь, в случае, если пользователь инициировал задачу, или другое лицо, наделенное соответствующими правами, могли иметь доступ к результатам и логам работы внешнего приложения.

Возможно что-то упустил, но смысл, думаю передал...

Теперь скажите, есть ли подобная функциональность в аксапте и можно ли избежать программирования для осуществления такой задачи?



Цитата:
Изначально опубликовано mazzy

... и это все еще и на динамическом диалоге, у которого нет хелпа... мдя..
если честно, не понял... добавить кнопку хелп на диалог?... возможно

Цитата:
Изначально опубликовано mazzy

Чем вас не устраивает стандартный механизм LastValue? (см. Руководство разработчика)
еще не сталкивался с таким механизмом, попытка найти его описание в Руководстве разработчика (полный поиск по словосочетанию LastValue) не увенчалась успехом, оправлю сообщение посмотрю полным поиском по AOT

Цитата:
Изначально опубликовано mazzy

Вы предлагаете использовать формулы для дат. Чем не устраивает стандартный механизм интервалы дат? (см. главная книга \ Настройка). Почему вы не стали вместо дат вводить просто интервал дат? (как в финансовых отчетах, например)
посмотрю, очень интересно... а если надо указать одну дату, а не интервал?

Цитата:
Изначально опубликовано mazzy

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

Цитата:
Изначально опубликовано mazzy

Вы наверняка понимаете, что в колонке "значение по умолчанию" можно использовать только функции без аргументов.
по-моему, не факт или в вызове функции 'str2date("01-01-2003",123)' нет аргументов?

Цитата:
Изначально опубликовано mazzy

Судя по закладке в верхней части формы, вы вводить аргументы функций в свой механизм, так? Как вы планируете указывать аргументы?
аргументы или параметры вызова внешней задачи указаны во втором гриде первого рисунка (вкладки аргументы и разное не несут смысловой нагрузки)

Цитата:
Изначально опубликовано mazzy

Главные вопросы, конечно же - почему вас не устроили стандартные механизмы?
если есть такая функциональность в аксапте укажите направление, пример, документацию... буду очень признателен
Старый 10.09.2003, 13:25   #17  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Хочется поздравить SnowMan: я не разделяю скептицизм Mazzy, для первого месяца работы с системой - очень хорошо, на удивление хорошо придумано. Теперь по вопросам:
  • мысль маззи насчет хелпа тоже не понял, возможно, имеется в виду, что на динамическом диалоге нельзя создать контекстную справку по полям. Если я это правильно понял, то возражение странное: мало кто эту справку вообще делает ввиду отсутствия времени, в особенности на клиентском проекте.
  • LastValue. Запоминает последнее значение, введенное пользователем. Встроенная возможность при работе с классами RunBase (см. методы pack и unpack у наследников, то, как они вызываются). В вашем случае подходит не всегда, т.к. today()-1 свой на каждый день, очевидно. Но: вы вызываете приложения и на клиенте, и на сервере. Тогда вы просто ОБЯЗАНЫ сериализовать класс с помощью методов pack() и unpack(), иначе все параметры "потеряются" по дороге.
  • Интервалы дат. Позволяют решить проблему "today()-1", не прибегая к программированию. Если нужно задать одну дату, создайте плавающий интервал, у которого дата начала равна дате конца. Или условьтесь, что за дату принимается начальная дата интервала.
  • Аргументы. Полагаю, вы вводите аргументы строками? Жуткий геморрой с преобразованием типов. Как минимум - десятки проверок на предмет того, что значение введено в правильном формате. А если еще связаться с расширенными типами данных в качестве параметров...
  • Направление на похожий механизм: конфигуратор продукции. Отличный образец. Делает совсем не то, что вам нужно, но с аналогичным интерфейсом.
Старый 10.09.2003, 13:42   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано EVGL
Хочется поздравить SnowMan: я не разделяю скептицизм Mazzy, для первого месяца работы с системой - очень хорошо, на удивление хорошо придумано.
Согласен. Поздравить можно. Для первого месяца изучения очень токовые вопросы. Но останавливаться на достигнутом не надо.

Насчет скпетицизма и разделения...
EVGL, это у нас давно. Однако, это не есть плохо
Нормальное расхождение мнений по рабочим вопросам.

Цитата:
Изначально опубликовано EVGL
мысль маззи насчет хелпа тоже не понял, возможно, имеется в виду, что на динамическом диалоге нельзя создать контекстную справку по полям. Если я это правильно понял, то возражение странное: мало кто эту справку вообще делает ввиду отсутствия времени, в особенности на клиентском проекте.
Да, по полям и по самой форме.
А то, что эту справку мало кто делает...кхм... вот это и есть странно.
А предложенный SnowMan'ом механизм делает создание справки вообще нереальным делом.

SnowMan, да я вспомнил ваши вопросы про управление сторонним приложением. Стало понятнее. Спасибо. Я выбрал бы статический подход. Вроде финансовых отчетов. Можно выбрать и динамический, как в конфигураторе. Тут вам взвешивать плюсы и минусы и принимать решение.

Мне кажется, что динамическое программирование в Аксапте не очень хорошо поддерживается ядром и слишком много придется делать руками. Или по-другому, ядро замечательно поддерживает статические связи и статические формы. По-моему при прочих равных, в Аксапте стоит выбрать статическое программирование.
Старый 10.09.2003, 13:53   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано SnowMan
еще не сталкивался с таким механизмом, попытка найти его описание в Руководстве разработчика (полный поиск по словосочетанию LastValue) не увенчалась успехом, оправлю сообщение посмотрю полным поиском по AOT
А ведь точно нет. таблица SysLastValue. Я не помню где читал об этом механизме. Поищите в каталоге technical info. После прочтения документа разобраться с этим механизмом очень даже несложно.

Последние введенные (LastValue) значения в Аксапте 3.0 можно посмотреть в
меню Сервис \ Средства разработки \ Объекты приложения \ использование данных
закладка Настройка форм.
Кнопка Данные позволит вам просмотреть контейнер.

Идея состоит в том, что если уж программировать, то переопределить этот стандартный механизм, чтобы он подставлял в форму то что вам нужно. Тогда этот механизм будет работать на всех формах, а не только на ваших.
Старый 10.09.2003, 13:59   #20  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Никаких проблем со скептицизмом и разделением.
Теперь по поводу
Цитата:
предложенный SnowMan'ом механизм делает создание справки вообще нереальным делом
В программировании реально все, в этом и проблема руководителя софтверного проекта. В данном случае можно в форме настройки диалогов влепить элемент редактирования HTML со всей "справочной" инфраструктурой или, что рациональнее, вызывать одну из существующих форм редактирования справки, обеспечив механизм генерации пути в AOT для справки к динамически созданным диалогам и сохранения справки по этому пути. Потом в диалоге, правильно, создать кнопку помощи или озаботиться перехватыванием клавиатуры. Или модифицировать алгоритм поиска топика в стандартном справочном окне. Так или иначе, но работы на неделю найдется.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Каков процент внедрений "стандартной" поставки системы Аксапта? coolibin DAX: Прочие вопросы 17 10.02.2009 12:45
Код палеты Varmen DAX: Функционал 10 27.03.2008 15:54
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 5 07.09.2004 17:24
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 0 07.09.2004 13:39
Ошибка "необходимо заполнить 'основной код сотрудника' " alpin DAX: Функционал 2 04.12.2003 16:28
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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