18.02.2015, 00:25 | #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). |
19.02.2015, 04:40 | #22 |
Участник
|
вот кстати покопался в своих файлах нашел мегадревний документ 2001г про X++
что интересно, НА РУССКОМ! и в конце бонус - грамматика языка (для тех, кто интерпретатор хочет свой написать |
|
|
За это сообщение автора поблагодарили: Player1 (0), Морковка (0). |
24.02.2015, 11:35 | #23 |
Участник
|
|
|
24.02.2015, 13:52 | #24 |
Участник
|
Цитата:
|
|
26.02.2015, 23:16 | #25 |
Участник
|
Цитата:
Сообщение от belugin
Грамматика есть на MSDN. Правда когда я попробовал идти таким путем, мне посоветовали не идти таким путем, а использовать XLNT, так как грамматики недостаточно для корректного разбора X++ (там есть еще правила, которые используют информацию о типах AOT. Вот они не скопипастили Джаву достаточно хорошо, а теперь мы геморройся)
а то у меня тут есть мысль свой интерпретатор написать описания нет нигде копнул чуток, AST дерево там вроде есть - значит должно быть просто интерпретатор написать |
|
03.03.2015, 13:46 | #26 |
Участник
|
Еще вопрос от начинающего... где можно научиться созданию отчетов как классов xmlReport, примеры средней сложности.. где например есть группировки. В книгах не через класс, а через Reportы. И еще если отчет строится на сложном запросе, то мы изначально запрос создаем как Query в AOT? А если я запрос хочу полностью прописать программно, а не добавляя по уровням всё в query, то как это сделать?
|
|
03.03.2015, 13:52 | #27 |
Участник
|
|
|
05.03.2015, 10:32 | #28 |
Участник
|
8 марта на носу)) помогите, подскажите)
|
|
06.03.2015, 00:37 | #29 |
Участник
|
|
|
06.03.2015, 10:58 | #30 |
Участник
|
AX 2012 R2, ага ssrs. запрос написан на sql, но куда же его текст прям текстом вставить, чтоб дальше в отчете xml использовать.
|
|
10.03.2015, 14:35 | #31 |
Участник
|
столько умных людей и никто не знает?)
|
|
10.03.2015, 14:43 | #32 |
северный Будда
|
Дело в том, что в 2012 (за исключением российских фискальных отчётов вроде бы) в качестве бестпрактиса принято выгружать отчёты именно в виде ссрс и именно используя query из аота. Захардкодить можно всё, что угодно, только зачем?
__________________
С уважением, Вячеслав |
|
10.03.2015, 14:49 | #33 |
Участник
|
Видел у одного кастомера прямые запросы к sql, это ужасно, если честно.
|
|
10.03.2015, 17:26 | #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 |
|
11.03.2015, 09:45 | #35 |
Участник
|
т.е. любой запрос изначально все настраивают в AOT/Queries ? настраивая DataSourse и прям там указывая все условия? или сложный запрос настраивается на методах Queries. непривычно просто, чаще встречала где настрочил текст и вставил текстом.
|
|
11.03.2015, 10:59 | #36 |
NavAx
|
И что, прямо по живой, рабочей базе?
__________________
Isn't it nice when things just work? |
|
11.03.2015, 12:29 | #37 |
северный Будда
|
Цитата:
разумеется, не все условия можно указать прямо в query, но дописать потом в конкретном объекте пару строк не самая большая проблема.
__________________
С уважением, Вячеслав |
|
11.03.2015, 12:56 | #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. |
|
11.03.2015, 17:53 | #39 |
Axapta Retail User
|
|
|
13.03.2015, 10:02 | #40 |
Участник
|
Спасибо большое всем! а вот еще один вопрос не отвеченный мой про обучение отчетам XML, где научиться? где посмотреть простейшие XML отчеты-примеры ?
|
|