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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.06.2006, 13:43   #1  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
День добрый всем. С аксаптой я знаком всего несколько дней, проект ожидается не продолжительный, потому предпочтительно прибегнуть к помощи экспертов.

Кстати Аксапта эта мне очень сильно напоминает SmallTalk, аналогичные идеи, решения.
  1. Значит вопрос первый думаю стандартный, документация по классам, в нете практически ничего нет, как с этим всем разбираться? Вот хочу я создать инстанс другой формы из метода моего класса, нужно использовать ClassFactory::fromRunClassOnClient? Или что то другое? Как заполнить Args, в каком формате это принято делать? Все это можно понять только при наличии документации.
  2. СОМ взаимодействие. Из примеров более менее ясно как построить ссылку на объект. Меня интересует как в Х++ собрать класс, который я смогу передать в методы СОМ объекта в качестве аргумента, и из СОМ-а уже вызывать эти методы Аксапта обьекта? Где то прочитал что можно унаследоваться от класса СОМ и получится как бы то что нужно. Можно подробности, какие методы, кроме наследования, нужно перекрыть, как имплементировать тот или инной интерфейс, который определен в АктивХ ТЛБ, какой тип интерфейса возможно имплементировать - дюал или только диспинтерфейс для позднего связывания?
  3. Язык видимо джавоидный, значит должна быть рефлексия, как ей воспользоваться для исследования типов в рантайме, для имплементации позднего связывания и вызовов методов посредством рефлексии? Помнится в СмолТоке можно было получить все инстансы конкретного класса, которые были построены сейчас, как с этим обстоят дела в Х++?
  4. Подписка на GUI controls Events. Судя по тому что я вижу, можно перекрыть метод и обрабатывать таким образом сообщение. Как реализовать множественного наблюдателя, как в Джаве или .Нет, котгда есть возможность засунуть список листнеров\делегатов на одно событие, чтобы можно было это проделать в рантайме, не перекрывая заранее методы в дизайн тайме.
  5. Если предыдущий пункт не получается проделать, тогда выхода нет и прийдется править классы контролов (кнопок, списков, таблиц), встраивать тот когд, который мне необходим туда. Принято ли это делать, и можно ли вообще поменять имплементацию классов стандартной библиотеки (опять же в СмолТоке это делалось), к примеру я хочу дописать пару строк в ClassFactory::fromRunClassOnClient, или в Button.clicked

  6. Если и этого нельзя сделать, тогда может есть какие то метасредства? В некоторых версиях Смолтока можно было добавлять пре и пост кондишнс на конкретные методы, для меня это как раз, например к методу Button.clicked в пост кондишн добавить пару моих строк кода, который будет вызываться с теми же аргументами что и обработчик сообщения. (Такой метод был бы предпочтительнее чем менять библиотечные классы, которые с новыми петчами могут тоже поменяться и вся моя писанина уйдет коту под хвост).
  7. Если и этого нельзя сделать! Тогда может есть возможность встроить свой типа ClassLoader, который при загрузке мне необходимых классов будет их на лету модифицировать и добавлять строчки кода в нужные мне обработчики?
Вот такие вопросы, надеюсь объяснился понятным языком?
Старый 07.06.2006, 14:26   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
День добрый всем. С аксаптой я знаком всего несколько дней, проект ожидается не продолжительный, потому предпочтительно прибегнуть к помощи экспертов.

Кстати Аксапта эта мне очень сильно напоминает SmallTalk, аналогичные идеи, решения.
Ох, какие хорошие вопросы...
И как хорошо вас понимаю...

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Значит вопрос первый думаю стандартный, документация по классам, в нете практически ничего нет, как с этим всем разбираться? Вот хочу я создать инстанс другой формы из метода моего класса, нужно использовать ClassFactory::fromRunClassOnClient? Или что то другое? Как заполнить Args, в каком формате это принято делать? Все это можно понять только при наличии документации.
Практически полностью отсутствует.

Ищите по крохам.
Например, как здесь Описание скрытых объектов
или по ссылкам http://axapta.mazzy.ru/links
или тренингах или в книжках.

Почему такая ситуация?
Дело в том, что разработчики болели идеей самодокументируемого кода.
Вы постоянно будете натыкаться на зачатки инструментов анализа кода...
Самый импользуемый - перекрестные ссылки
http://axapta.mazzy.ru/lib/xref/
http://axapta.mazzy.ru/lib/explore/
http://axapta.mazzy.ru/lib/explorepricelist/
а также Visual MorphXplorer (он показан здесь http://axapta.mazzy.ru/lib/querytuning/ )

Есть и другие инструменты, но они почти бесполезны...
Поскольку в какой-то момент объем кода стал настолько большим и взаимосвязей настолько много, что без документации понять принципы работы системы невозможно.

Ваши вопросы именно по принципам работы.

Совет: начните с tutorial-объектов, проштудируйте их.
http://axapta.mazzy.ru/lib/gettingstarted/

Посмотрите тажке сюда
http://erpkb.com/Axapta/Programmirovanie?v=1c65

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
СОМ взаимодействие. Из примеров более менее ясно как построить ссылку на объект. Меня интересует как в Х++ собрать класс, который я смогу передать в методы СОМ объекта в качестве аргумента, и из СОМ-а уже вызывать эти методы Аксапта обьекта? Где то прочитал что можно унаследоваться от класса СОМ и получится как бы то что нужно. Можно подробности, какие методы, кроме наследования, нужно перекрыть, как имплементировать тот или инной интерфейс, который определен в АктивХ ТЛБ, какой тип интерфейса возможно имплементировать - дюал или только диспинтерфейс для позднего связывания?
Читайте руководство разработчика, раздел Axapta Business Connector.
Проштудируйте классы семейтва ax*.
Эти классы предназначены именно для обращения извне.


Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Язык видимо джавоидный, значит должна быть рефлексия, как ей воспользоваться для исследования типов в рантайме, для имплементации позднего связывания и вызовов методов посредством рефлексии? Помнится в СмолТоке можно было получить все инстансы конкретного класса, которые были построены сейчас, как с этим обстоят дела в Х++?
Эх... Не хватает смайлика "причмокнул языком от удовольствия"...

Изучите семейство системных классов Dict*
Для работы в рантайме инструментов мало. Функции typеof, dimof, некоторые методы в классе Global и также некоторые статитические методы в классах семейства Dict*

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Подписка на GUI controls Events. Судя по тому что я вижу, можно перекрыть метод и обрабатывать таким образом сообщение. Как реализовать множественного наблюдателя, как в Джаве или .Нет, котгда есть возможность засунуть список листнеров\делегатов на одно событие, чтобы можно было это проделать в рантайме, не перекрывая заранее методы в дизайн тайме.
Ох... Правильно сформулированный вопрос содержит...
Нет, такого нет.

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Если предыдущий пункт не получается проделать, тогда выхода нет и прийдется править классы контролов (кнопок, списков, таблиц), встраивать тот когд, который мне необходим туда. Принято ли это делать, и можно ли вообще поменять имплементацию классов стандартной библиотеки (опять же в СмолТоке это делалось), к примеру я хочу дописать пару строк в ClassFactory::fromRunClassOnClient, или в Button.clicked
Да, придется.
Да, можно, но осторожно.
Прочитайте главу "Design guidelines for cost-efficient upgrades" в Best Practice.

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Если и этого нельзя сделать, тогда может есть какие то метасредства? В некоторых версиях Смолтока можно было добавлять пре и пост кондишнс на конкретные методы, для меня это как раз, например к методу Button.clicked в пост кондишн добавить пару моих строк кода, который будет вызываться с теми же аргументами что и обработчик сообщения. (Такой метод был бы предпочтительнее чем менять библиотечные классы, которые с новыми петчами могут тоже поменяться и вся моя писанина уйдет коту под хвост).
Не увлекайтесь метасредствами.
Метасредства есть. Но их бездумное использование приводит к очень большому объему программирования. Прежде всего вам придется очень внимательно перехватывать код, относящийся к безопасности, включению/выключению функционала, автосвязыванию форм и датасорсов...

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

В общем, на первых порах, лучше не используйте метасредства.
Изучите аспекты поведения ядра. Тогда вам перехватывать события будет намного легче.

Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Если и этого нельзя сделать! Тогда может есть возможность встроить свой типа ClassLoader, который при загрузке мне необходимых классов будет их на лету модифицировать и добавлять строчки кода в нужные мне обработчики?
Самомодификация в Аксапте тоже есть
См. генератор отчетов, генератор классов, а также скрипты в редакторе...
Но будьте осторожны.

Аксапта хороша не как инструмент программирования.
А как готовая бизнес-логика с возможностью быстрой и удобной доработки.
Если ваша "доработка" становится более дорогой, нежели создание новой программы в Delphi, VS или в другой инструментальной среде...
То использование Аксапты теряет всяческий смысл.

Вопрос не в можно/нельзя.
Вопрос в рационально/нерационально.


См. также проекты по самомодификации Аксапты
http://www.axforum.info/forums/showthread.php?t=7788
http://www.axforum.info/forums/showthread.php?t=13282
http://www.axforum.info/forums/showthread.php?t=11701
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 14:40   #3  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Спасибо за быстрый и содержательный ответ.

Я в среде еще не настолько освоился. Когда вы пишите "Изучите семейство системных классов Dict*" как мне туда добраться, какими поисковыми средствами? Я пользуюсь Lookup Defenition по контекстному меню, иногда среда выдает тело метода или определение класса, иногда нет.

Видимо демо версия кастирована, и многие вещи не позволяет делать.

Что касается моих доработок, то у меня немного другая задача, мне нужно интегрировать аксапут со средствами автоматического фанкшнал тестинга, чтобы любого рода аппликации написанные на Аксапте можно было бы автоматически протестировать. Потому и вопросы такие спецефические, покачто только примеряюсь как прозрачнее провести интеграцию системы.
Старый 07.06.2006, 15:19   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Когда вы пишите "Изучите семейство системных классов Dict*" как мне туда добраться, какими поисковыми средствами?
AOT \System Documentation \ Classes \ Dict*
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 16:25   #5  
macklakov_imported is offline
macklakov_imported
Участник
 
11 / 10 (1) +
Регистрация: 10.01.2005
Цитата:
знаком всего несколько дней, проект ожидается не продолжительный
И затеваете такую нетривиальную модификацию? Надеюсь, задачу поставил опытный и ответственный специалист, который сможет проконтролировать результат.
Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Что касается моих доработок, то у меня немного другая задача, мне нужно интегрировать аксапут со средствами автоматического фанкшнал тестинга, чтобы любого рода аппликации написанные на Аксапте можно было бы автоматически протестировать. Потому и вопросы такие спецефические, покачто только примеряюсь как прозрачнее провести интеграцию системы.
Маленький совет, сразу обертывайте тестирующий код в макросы, чтоб одной константой можно было все закоментировать
Старый 07.06.2006, 17:00   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от macklakov Посмотреть сообщение
Маленький совет, сразу обертывайте тестирующий код в макросы, чтоб одной константой можно было все закоментировать
Эх, я думал, что про тестирование будет пропущено...

Маленький совет.
Лучше подождите Аксапту 4.0. Там модуль тестирования и самотестирования встроен унутрь...
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 18:13   #7  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
Цитата:
Сообщение от macklakov Посмотреть сообщение
Маленький совет, сразу обертывайте тестирующий код в макросы, чтоб одной константой можно было все закоментировать
Эх, я думал, что про тестирование будет пропущено...

Маленький совет.
Лучше подождите Аксапту 4.0. Там модуль тестирования и самотестирования встроен унутрь...
А можно подробнее про модуль тестирования, что имеется ввиду?

Для информации, у меня задача интегрировать приложения Аксапты с Mercury QTP Functional Testing

Вы имели ввиду нечто подобное?

Цитата:
Цитата(Sergey Batiskaf @ 07.06.2006, 13:43) *

СОМ взаимодействие. Из примеров более менее ясно как построить ссылку на объект. Меня интересует как в Х++ собрать класс, который я смогу передать в методы СОМ объекта в качестве аргумента, и из СОМ-а уже вызывать эти методы Аксапта обьекта? Где то прочитал что можно унаследоваться от класса СОМ и получится как бы то что нужно. Можно подробности, какие методы, кроме наследования, нужно перекрыть, как имплементировать тот или инной интерфейс, который определен в АктивХ ТЛБ, какой тип интерфейса возможно имплементировать - дюал или только диспинтерфейс для позднего связывания?

Читайте руководство разработчика, раздел Axapta Business Connector.
Проштудируйте классы семейтва ax*.
Эти классы предназначены именно для обращения извне.

Axapta Business Connector это немного не то. Мне нужно из Аксапты (Х++) создать СОМ объект, и передать в метод этого обьекта ссылку на Х++ MyInsideAxaptaObject. Попробовал унаследовать MyInsideAxaptaObject class от класса СОМ, передавать объекты теперь можно, но в коде СОМ объекта эта ссылка почему то нулевая. Может нужно еще что то заимплементировать?
Старый 07.06.2006, 18:27   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
COM-объекты принимают и возвращают переменные только с типом Vatiant.
Посмотрите на системный Аксаптовский класс Variant.
__________________
полезное на axForum, github, vk, coub.
Старый 08.06.2006, 10:47   #9  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
COM-объекты принимают и возвращают переменные только с типом Vatiant.
Посмотрите на системный Аксаптовский класс Variant.
ОК. Давайте я на этом форуме буду обсуждать проблемы с СОМ, а на том все что касается модели событий контрола.

Значит есть у меня класс:

class MyClass extends COM
{

public void f1()
{
Print("MyClass::f1");
}
}

дальше я строю какой то СОМ обж., и передаю ему инстанс на MyClass:

void main()
{
COM srv = new COM("MyVBCOM");
srv.setcallback(new MyClass() );
}

Где в setcallback происходит следующее:

function setcallback (obj as Object)
obj.f1
end function

Значтит когда я не наследую класс MyClass от СОМ то все это падает на момент передачи Аксапта обьекта в метод СОМ, рантайм говорит что эта переменная не может передаваться в СОМ метод. Когда я наследую от СОМ, то передача происходит нормально, но в VB методе setcallback переменная obj имеет значение Nothing. Я так подозреваю что во время передачи в СОМ метод происходит у моего аксапта обьекта QueryInterface, и ни один интерфейс не находится, возвращается ноль. В COMVariant запаковать этот обьект тоже не получается, по логике вещей нужно инициализировать его как iDispatch, но метод этот принимает тип comInterface, кастинг не проходит. Видимо MyClass нужно заимплементировать СОМ интерфейс, чтобы QueryInterface вернул нармальное значение, а как это делается? Как объявить в Аксапте интерфейс, и еще в добавок ко всему СОМ, как имплементировать его в классе? Вопросы касаются обычного синтаксиса, видимо.
Старый 08.06.2006, 12:58   #10  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от belugin
Насколько я знаю, такого делать нельзя. Колбеков в аксапте нет, кроме событий ActiveX объектов.
В предыдущем посте я более подробно описал ситуацию, не зря же в Аксапте есть типы comInterface и COMVariant?

Колбеки меня тоже устраивают, только при условии что мне не прийдется строить окно, на котором будет лежать ActiveX, мне нужно написать класс с перекрытыми методами-обработчиками событий.
Старый 08.06.2006, 13:32   #11  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
Цитата:
Сообщение от Sergey Batiskaf Посмотреть сообщение
Видимо MyClass нужно заимплементировать СОМ интерфейс, чтобы QueryInterface вернул нармальное значение, а как это делается? Как объявить в Аксапте интерфейс, и еще в добавок ко всему СОМ, как имплементировать его в классе? Вопросы касаются обычного синтаксиса, видимо.
интерфейс сделать можно (см. то, что генерит ком визард). заимплементить его можно (implements вообще X++ с жабы делан). А вот сделать то, что вы хотите - не получится
Старый 08.06.2006, 13:54   #12  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
см. то, что генерит ком визард
Если бы я еще мог посмотреть это, моя Аксапта не хочет мне показывать декларации этих классов, а куда она засунула то что генернулось понятия не имею. Могу только метод обертку увидеть, а саму декларацию - нет, Lookup Defenition ничего не возвращает. Можете сказать как мне открыть делкрацию того или иного класса, например Classes\MyScriptlet? Или хотя бы как руками написать этот интерфейс, и как его потом унаследовать в классе, мои эксперименты с синтаксисом ни к чему хорошему не привели.
Старый 08.06.2006, 14:01   #13  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
// SourceSafe checkouts interface
interface IVSSCheckout
{
}

// SourceSafe database object interface
interface IVSSDatabase extends IVSSDatabaseOld
{
}

а вот наследования там нет - (VSSDatabase implements IVSSDatabase)

где-то еще было - поищите intarface по коду
Старый 08.06.2006, 14:11   #14  
mugz is offline
mugz
Участник
 
107 / 10 (1) +
Регистрация: 05.08.2004
// SourceSafe database object interface
interface IVSSDatabase extends IVSSDatabaseOld
{
}

а вот наследования там нет - (VSSDatabase implements IVSSDatabase)

где-то еще было - поищите interface по коду
Старый 08.06.2006, 14:25   #15  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Расскажите мне, как вы это находите! Я долбашу полчаса по кнопкам чтобы найти класс дефенишн! Как мне построить свой интерфейс в моем проекте руками, без визарда? Я фигею, в такой оболочке вы еще умедряетесь что то разрабатывать и находить?
Старый 08.06.2006, 14:41   #17  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Большое вам человеческое спасибо! Хто же знал что нужно АОТ открыть... Теперь я буду экспертом, сто пудов!
 


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

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

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