|
|
#21 |
|
Дмитрий Ерин
|
Кстати про борщ)
Много лет назад объяснял девушке на подобном примере азы С++. Ей помогло, может быть для вас тоже что-то прояснится (адаптировано под Х++): X++: // Класс "Борщ" - описание рецепта приготовления борща class Borsh { ... void addItems(Real _water, Real _kartofan, Real _svekla) // добавить ингредиенты {...} void addSalt() // посолить {...} void cook(Real _cookTime) // варить {...} void doSimple() // приготовить "стандартный" вариант (не заморачиваясь) { // Через "объект" this можно вызывать "собственные" методы // (то есть принадлежащие тому же экземпляру, к которому относится текущий метод) // This является служебной конструкцией языка, его не нужно объявлять, он доступен в любом классе this.addItems(1500, 300, 200); this.addSalt(); this.cook(45); } } // Используем наш класс-рецепт дважды public static void Job_Borsh(Args _args) { // Сварить два разных экземпляра борща: "обычный" и "экспериментальный" Borsh simpleBorsh = new Borsh(); Borsh overSaltBorsh = new Borsh(); // обычный (все этапы готовки выполнятся "по кулинарной книге"): simpleBorsh.doSimple(); // экспериментальный (управляем этапами самостоятельно): overSaltBorsh.addItems(1500, 100, 900); // ингредиенты в "своих" пропорциях overSaltBorsh.addSalt(); // солить overSaltBorsh.addSalt(); // солить overSaltBorsh.cook(90); // варить overSaltBorsh.addSalt(); // и опять солить... } // А еще можно сделать класс-наследник, добавив новый ингредиент class Borsh_Morkovka extends Borsh { ... void addMorkovka(Real _morkovka) {...} void doSimple() // перекрыть метод класса-предка { this.addMorkovka(150); // добавить новый ингредиент super(); // вызов унаследованного поведения (см. Borsh/doSimple()) } } |
|
|
|
| За это сообщение автора поблагодарили: Logger (1), Daiver (1), gl00mie (1), Kabardian (4), pedrozzz (2), A_BAS (1), Товарищ ♂uatr (1), Морковка (1). | |
|
|
#22 |
|
Участник
|
вот кстати покопался в своих файлах нашел мегадревний документ 2001г про X++
что интересно, НА РУССКОМ! и в конце бонус - грамматика языка (для тех, кто интерпретатор хочет свой написать
|
|
|
|
| За это сообщение автора поблагодарили: Player1 (0), Морковка (0). | |
|
|
#23 |
|
Участник
|
|
|
|
|
|
#24 |
|
Участник
|
Цитата:
|
|
|
|
|
#25 |
|
Участник
|
Цитата:
Сообщение от belugin
Грамматика есть на MSDN. Правда когда я попробовал идти таким путем, мне посоветовали не идти таким путем, а использовать XLNT, так как грамматики недостаточно для корректного разбора X++ (там есть еще правила, которые используют информацию о типах AOT. Вот они не скопипастили Джаву достаточно хорошо, а теперь мы геморройся)
а то у меня тут есть мысль свой интерпретатор написать описания нет нигде копнул чуток, AST дерево там вроде есть - значит должно быть просто интерпретатор написать |
|
|
|
|
#26 |
|
Участник
|
Еще вопрос от начинающего... где можно научиться созданию отчетов как классов xmlReport, примеры средней сложности.. где например есть группировки. В книгах не через класс, а через Reportы. И еще если отчет строится на сложном запросе, то мы изначально запрос создаем как Query в AOT? А если я запрос хочу полностью прописать программно, а не добавляя по уровням всё в query, то как это сделать?
|
|
|
|
|
#27 |
|
Участник
|
|
|
|
|
|
#28 |
|
Участник
|
8 марта на носу)) помогите, подскажите)
|
|
|
|
|
#29 |
|
Участник
|
|
|
|
|
|
#30 |
|
Участник
|
AX 2012 R2, ага ssrs. запрос написан на sql, но куда же его текст прям текстом вставить, чтоб дальше в отчете xml использовать.
|
|
|
|
|
#31 |
|
Участник
|
столько умных людей и никто не знает?)
|
|
|
|
|
#32 |
|
северный Будда
|
Дело в том, что в 2012 (за исключением российских фискальных отчётов вроде бы) в качестве бестпрактиса принято выгружать отчёты именно в виде ссрс и именно используя query из аота. Захардкодить можно всё, что угодно, только зачем?
__________________
С уважением, Вячеслав |
|
|
|
|
#33 |
|
Участник
|
Видел у одного кастомера прямые запросы к sql, это ужасно, если честно.
|
|
|
|
|
#34 |
|
Axapta Retail User
|
Как-то на проекте переносили данные прямым запросом.
Не так ужасно -) И очень быстро -)) X++: SOURCE #RHRMImportCalendarDate
#static void RHRMImportCalendarDate(Args _args)
#{
# ODBCConnection odbcConnection;
# Statement statement;
# str sqlQueryString;
# SqlStatementExecutePermission permission;
# ResultSet resultSet;
# LoginProperty loginProperty;
# str serverName = "SUPER";
# //str dataBaseName = "BASE";
# str dataBaseName = "DT";
# DataAreaId dataAreaId;
# int counter;
#
# void import()
# {
# RPayCalendarDate rpayCalendarDate;
# ;
#
# rpayCalendarDate.clear();
# rpayCalendarDate.TransDate = resultSet.getDate(1);
# rpayCalendarDate.CalendarId = resultSet.getString(2);
# rpayCalendarDate.PayDayType = resultSet.getInt(3);
#
# if(!RPayCalendarDate::exist(rpayCalendarDate.CalendarId, rpayCalendarDate.TransDate))
# {
# rpayCalendarDate.doInsert();
# }
#
#
# counter++;
# }
# ;
#
# try
# {
# loginProperty = new LoginProperty();
# loginProperty.setServer(serverName);
# loginProperty.setDatabase(dataBaseName);
#
# odbcConnection = new ODBCConnection(loginProperty);
#
# if (!odbcConnection)
# {
# info("Ошибка при подключении к базе данных");
# }
# }
# catch (Exception::Internal)
# {
# info("Возникла ошибка при подключении к базе данных. Операция отменена.");
# }
# catch (Exception::Error)
# {
# info("Ошибка при подключении к базе данных!");
# }
#
# statement = odbcConnection.createStatement();
#
#
# sqlQueryString = strfmt("SELECT RPAYCALENDARDATE.TRANSDATE"//1
# + ", RPAYCALENDARDATE.CALENDARID"//2
# + ", RPAYCALENDARDATE.PAYDAYTYPE"//3
# + " FROM RPAYCALENDARDATE"
# + " WHERE RPAYCALENDARDATE.DATAAREAID = 'dat'"
# + " AND RPAYCALENDARDATE.TRANSDATE > '20091231'");
#
# permission = new SqlStatementExecutePermission(sqlQueryString);
# permission.assert();
# resultSet = statement.executeQuery(sqlQueryString);
#
# while (resultSet.next())
# {
# ttsbegin;
#
# import();
#
# ttscommit;
# }
#
# statement.close();
#
# info(strfmt("Импортировано %1", counter));
#}
ENDSOURCE |
|
|
|
|
#35 |
|
Участник
|
т.е. любой запрос изначально все настраивают в AOT/Queries ? настраивая DataSourse и прям там указывая все условия? или сложный запрос настраивается на методах Queries. непривычно просто, чаще встречала где настрочил текст и вставил текстом.
|
|
|
|
|
#36 |
|
NavAx
|
Цитата:
__________________
Isn't it nice when things just work? |
|
|
|
|
#37 |
|
северный Будда
|
Цитата:
разумеется, не все условия можно указать прямо в query, но дописать потом в конкретном объекте пару строк не самая большая проблема.
__________________
С уважением, Вячеслав |
|
|
|
|
#38 |
|
Участник
|
Цитата:
Сообщение от novic
Как-то на проекте переносили данные прямым запросом.
Не так ужасно -) И очень быстро -)) X++: SOURCE #RHRMImportCalendarDate
#static void RHRMImportCalendarDate(Args _args)
#{
# ODBCConnection odbcConnection;
# Statement statement;
# str sqlQueryString;
# SqlStatementExecutePermission permission;
# ResultSet resultSet;
# LoginProperty loginProperty;
# str serverName = "SUPER";
# //str dataBaseName = "BA
# str dataBaseName = "DT";
# DataAreaId dataAreaId;
# int counter;
#
# void import()
# {
# RPayCalendarDate rpayCalendarDate;
# ;
#
# rpayCalendarDate.clear();
# rpayCalendarDate.TransDate = resultSet.getDate(1);
# rpayCalendarDate.CalendarId = resultSet.getString(2);
# rpayCalendarDate.PayDayType = resultSet.getInt(3);
#
# if(!RPayCalendarDate::exist(rpayCalendarDate.CalendarId, rpayCalendarDate.TransDate))
# {
# rpayCalendarDate.doInsert();
# }
#
#
# counter++;
# }
# ;
#
# try
# {
# loginProperty = new LoginProperty();
# loginProperty.setServer(serverName);
# loginProperty.setDatabase(dataBaseName);
#
# odbcConnection = new ODBCConnection(loginProperty);
#
# if (!odbcConnection)
# {
# info("Ошибка при подключении к базе данных");
# }
# }
# catch (Exception::Internal)
# {
# info("Возникла ошибка при подключении к базе данных. Операция отменена.");
# }
# catch (Exception::Error)
# {
# info("Ошибка при подключении к базе данных!");
# }
#
# statement = odbcConnection.createStatement();
#
#
# sqlQueryString = strfmt("SELECT RPAYCALENDARDATE.TRANSDATE"//1
# + ", RPAYCALENDARDATE.CALENDARID"//2
# + ", RPAYCALENDARDATE.PAYDAYTYPE"//3
# + " FROM RPAYCALENDARDATE"
# + " WHERE RPAYCALENDARDATE.DATAAREAID = 'dat'"
# + " AND RPAYCALENDARDATE.TRANSDATE > '20091231'");
#
# permission = new SqlStatementExecutePermission(sqlQueryString);
# permission.assert();
# resultSet = statement.executeQuery(sqlQueryString);
#
# while (resultSet.next())
# {
# ttsbegin;
#
# import();
#
# ttscommit;
# }
#
# statement.close();
#
# info(strfmt("Импортировано %1", counter));
#}
ENDSOURCEЕсли всё-таки odbcConnection может быть null то пользователь увидит инфо, а потом стектрейс. И интересно кто закроет statement если что-то упадёт в execute или в while какой-нибудь дедлок или ещё что... Ну и counter показует количество прочитанных строк, а не вставленных. В худшем случае напишет что заимпортило 1000, а по факту в базу может попасть 0. Последний раз редактировалось skuull; 11.03.2015 в 12:59. |
|
|
|
|
#39 |
|
Axapta Retail User
|
|
|
|
|
|
#40 |
|
Участник
|
Спасибо большое всем! а вот еще один вопрос не отвеченный мой про обучение отчетам XML, где научиться? где посмотреть простейшие XML отчеты-примеры ?
|
|
|
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|