23.05.2017, 13:01 | #21 |
Участник
|
Цитата:
Сообщение от mazzy
Как достучаться из веб-приложения к акс2012, акс2009?
Предположим, есть традиционное веб-приложение на традиционном для веба LAMP. Как лучше с архитектурной точки зрения организовать доступ к Аксапте для этого приложения? делать прокси к бизнес-коннектору? делать сервер OData? Создавать специализироованные веб-сервисы средствами самой Аксапты? Еще как-то? Цитата:
Цитата:
Еще по поводу написания веб-сервисов в AX - я видел, к примеру, To-Increase Web Service Studio, там веб-сервисы не столько пишутся, сколько настраиваются - в простейших случаях буквально за считанные минуты: выбрали публикуемый справочник или "документ", выбрали поля, deploy, profit! Цитата:
Цитата:
|
|
|
За это сообщение автора поблагодарили: mazzy (2), Vadik (1), ax_mct (5). |
23.05.2017, 13:18 | #22 |
Участник
|
Понятно. Спасибо. Надо подумать.
Основное отличие в наших картинах мира: Цитата:
Вы считаете, что Аксапта должна взаимодействовать только с middware, ни в коем случае не с фронтом. В этом случае middlware должен быть достаточно интеллектуальным и достаточно самостоятельным. Ок. Надо подумать. |
|
23.05.2017, 13:26 | #23 |
Участник
|
И вопрос:
Цитата:
В частности, если бы в акс2012, акс2009 была бы спущена реализация сервер OData с акс7? |
|
23.05.2017, 14:08 | #24 |
Участник
|
Цитата:
AX as a set of services - Queue - facade [LAMP + front (reactJS)] Можно отказаться от очереди в этой схеме если пользователь готов ждать\терять запрос\ответ и весь роутинг зашить в LAMP
__________________
Sapere aude |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
23.05.2017, 15:47 | #25 |
Banned
|
Цитата:
Сообщение от mazzy
Основное отличие в наших картинах мира:
Я считаю, что middlware вполне можно создавать на Аксапте, если у нее будет удобный интерфейс к фронту и инструменты разработчика по интеграции с фронтом. На крайний случай где-то на каком-нибудь сервере должны быть развернуты прокси-объекты к Аксапте. Вы считаете, что Аксапта должна взаимодействовать только с middware, ни в коем случае не с фронтом. В этом случае middlware должен быть достаточно интеллектуальным и достаточно самостоятельным. Хотя в этом что-то есть Практичнее брать популярный и независимый LAMP продукт и организовать обмен данными. Уверен что чем больше независимости и отдельности - тем лучше. Причем обмен данными может быть и на уровне баз данных. Если тема о построении альтернативного frond-end к AX, то я прошу прощения. Для меня веб-приложения на LAMP это уже известные и популярные продукты, а не самописки. |
|
23.05.2017, 15:56 | #26 |
Участник
|
Цитата:
но небольшие приложения типа вот таких - вполне: https://www.microsoft.com/en-gb/stor...s/9wzdncrfjbj5 https://www.microsoft.com/en-gb/stor...s/9wzdncrfjb81 https://www.microsoft.com/en-gb/stor...s/9wzdncrfjbcc https://www.microsoft.com/en-gb/stor...r/9wzdncrfjbpg https://www.microsoft.com/en-gb/stor.../9wzdncrdtcd1# Цитата:
Цитата:
это тоже радикальный подход. самописки на стандартных библиотеках - наверное тоже. Надо подумать. |
|
23.05.2017, 18:07 | #27 |
Участник
|
Цитата:
Сообщение от mazzy
Согласен, что вряд ли кто заинтересуется альтернативным интерфейсом ко всей Аксапте.
но небольшие приложения типа вот таких - вполне: https://www.microsoft.com/en-us/stor...s/9wzdncrfjbj5 https://www.microsoft.com/en-us/stor...s/9wzdncrfjb81 https://www.microsoft.com/en-us/stor...s/9wzdncrfjbcc https://www.microsoft.com/en-us/stor...r/9wzdncrfjbpg https://www.microsoft.com/en-us/stor.../9wzdncrdtcd1#
|
|
23.05.2017, 18:08 | #28 |
Banned
|
Цитата:
Примеров альтернативной разработки web-интерфейсов на LAMP или WAMP к AX - нет, так это безумие лишенное какого-либо смысла. Технически сложно и платить AX лицензии. Разве что там где очень свой EP - это может быть голый ASP.NET через бизнес-коннектор. Примеры популярных LAMP? Да те же e-commerce. Тот же Bitrix Примеры фундаментальные для не-магазинов (Open-source WMS/CMS/CRM ) упираются в лицензирование для сотрудников. Та же интеграция AX c Open-source CRM скорее всего потребует AX лицензии. Но мне кажется что AX e-commerce чаще на ASP.NET. И самописки и коробки. Просто из-за скиллзов программистов. |
|
23.05.2017, 18:39 | #29 |
Участник
|
Цитата:
почему ты считаешь работу в оффлайне обязательной? да и вопрос был про веб-приложения ) но все равно, почему ты настаиваешь на возможности работы в оффлайне? Цитата:
но хорошо, пусть будет функционал торгового агента, ТОРО или подобное. так как Как лучше с архитектурной точки зрения? Цитата:
Вот!!!! Собственно вопрос про это - что нужно сделать, чтобы было проще? дешевле? быстрее? с меньшими затратами для заказчика? предположим где-то есть некое супер-убер-фиговина, которая уже делает "технически просто". какими свойствами она должна обладать, чтобы специалисты со спокойной душой могли сказать - к этому мы быстро наваяем веб-интерфейс при помощи библиотеки XXX. да, я помню про лицензии. но уже сначала предложил вопрос лицензий пропустить. причина? это постоянная и прогнозируемая величина. после того, как будут сформулированы технические аспекты, стоимость лицензий можно будет приплюсовать и сравнивать с альтернативными решениями. угу-угу. Последний раз редактировалось mazzy; 23.05.2017 в 18:45. |
|
23.05.2017, 20:22 | #30 |
Banned
|
Цитата:
Сообщение от mazzy
Собственно вопрос про это - что нужно сделать, чтобы было проще? дешевле? быстрее? с меньшими затратами для заказчика?
предположим где-то есть некое супер-убер-фиговина, которая уже делает "технически просто". какими свойствами она должна обладать, чтобы специалисты со спокойной душой могли сказать - к этому мы быстро наваяем веб-интерфейс при помощи библиотеки Варианты - web service for AX using AIF. SOAPClient скажем в php. - .NET DLL к которой мы обращаемся в X++ и которая делает все что душе угодно, тот же JSON.NET. - обмен файлами Всякие супер-библиотеки и шины - даром не нужны. Они не упрощают, а усложняют жизнь нормальному программисту. Хотя вот в пример уже привели волшебный костыль To-Increase Web Service Studio, но за всякое волшебство есть своя цена. Не может быть такой библиотеки, у каждого популярного LAMP есть свое API и SDK, Ему и следуем. Надо SOAP/REST да впридачу OAuth - значит пишем .NET сборку которая это делает. Как бы наверное это то что ты прокси называешь. Самый очевидный и простой способ. А если типа интранет и свое - то самый очевидный и простой способ - AX лезет в базу данных этого третьего приложения. Batch job, ODBCConnection. Cheep and cheerful, что еще нужно ---- И конечно Bitrix это сарказм, приложений многие десятки. Достаточно тех что предлагают уже готовую интеграцию с AX в коробке. Но чтобы понять LAMP они или нет, это надо очень постараться чтобы понять на чем они написаны. У моего текущего клиента e-commerce на LAMP и меня спрашивали за интеграцию с AX. Что делает бизнес - ищет уже готовую интеграцию. Потому что найти нормального программиста - сложнее. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
24.05.2017, 17:39 | #31 |
Участник
|
Да, я видел исходный вопрос, но потом почему-то речь зашла про небольшие приложения типа мобильных - я и ответил про мобильные приложения. Впрочем, вернемся к исходной теме...Я не считаю работу в оффлайне обязательной, в некоторых сценариях без онлайна не обойтись. Но я считаю, что обмен данными стороннего приложения с Аксаптой должен быть по возможности асинхронным. Асинхронность уже дает некую автономность и предполагает хранение слепков данных отдельно от БД Аксапты, а дальше, если развивать тему, можно воспроизвести во внешнем приложении некую бизнес-логику, которая будет работать на доступных в оффлайне данных из Аксапты. Банальные Excel-файлы, которые генерятся движком экспорта-импорта данных в AX 2009, уже содержат енумы и возможность выбора значений в связанных ячейках, а не требуют вбивать метки енумов руками. От приложения я как пользователь ожидал бы чего-то большего, нежели выбор значений из справочников, на что способен даже Excel. Я ожидал бы учета истории того, что я вводил, применения некий правил, некой логики, которая облегчала бы мою работу и предупреждала ошибки, а не позволяла мне потратить кучу времени и сил на вбивание данных, чтобы в итоге оказаться в тупике и всё переделывать. Апофеозом такого подхода в моем понимании являются AX POS и Commerce Runtime, но в этой теме, полагаю, речь о чем-то попроще...
На Аксапту зачастую замыкают очень много сторонних приложений и сервисов, подчас критически важных для бизнеса. И чем проще будет делать интеграцию с Аксаптой, тем больше сторонних приложений и сервисов будут с ней связывать. При этом Аксапта в вынешнем виде - это большая монолитная система с большой базой, кучей серверов и необходимостью это все обслуживать. Иными словами, Аксапта бывает иногда недоступна, и чем больше база и/или количество серверов, тем дольше могут длиться периоды недоступности. Так вот, асинхронная интеграция сторонних приложений и сервисов позволяет легче проходить периоды недоступности Аксапты и заодно сглаживать пики нагрузки. Далее, вернемся к сторонним приложениям, с которыми работают конечные пользователи. Если приложение умеет держать автономные слепки справочников, но не помогает мне как пользователю с ними работать, не помогает избегать ошибок, то какой от него толк? Чем оно лучше, "умнее" файлов Excel, куда выгружены справочники и в ячейках настроен выбор из них? А если приложение и в оффлайне не работает, то чем оно лучше уже имеющейся в коробке портальной веб-морды, для которой уже реализован механизм "достучаться до Аксапты"? |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
24.05.2017, 18:37 | #32 |
Участник
|
Цитата:
В акс7 основной клиент в ритейле - браузерный cloudPOS - это набор html-страниц и javaScript'ов. не могу назвать ритейл ни апофеозом, ни примером для подражания. собственно вопрос то и родился в ходе работы в ритейлом в акс7. |
|
24.05.2017, 18:41 | #33 |
Banned
|
Цитата:
При этом данное веб-приложение может требовать наличие интернета, и не обязательно должно уметь работать без него сохраняя что-то на клиентском компьютере. Это уже излишне в большинстве случаев. Но автономность через асинхронность - must be. И в таком свете и реализация будет отличаться от сросшихся близнецов. |
|
24.05.2017, 18:53 | #34 |
Banned
|
Цитата:
Только не говори что ты опять меня забанишь за оффтопик. Это по теме почему один набор html-страниц и javaScript'ов может достучаться, а другой вряд-ли. Supported web browsers for Retail Cloud POS Retail Cloud POS for Dynamics 365 for Operations can run in any of the following web browsers that run on the specified operating systems: Microsoft Edge (latest publicly available version) on Windows 10 Internet Explorer 11 on Windows 10, Windows 8.1, or Windows 7 Chrome (latest publicly available version) on Windows 10, Windows 8.1, or Windows 7 https://docs.microsoft.com/en-us/dyn...m-requirements |
|
24.05.2017, 19:19 | #35 |
Участник
|
нормально вроде.
Цитата:
правда оформлен в стиле виндовых modern apps. но клиент очень тесно завязан на серверную часть магазина. которая сильно завязана на IIS, MS SQL, .net и прочие виндовые технологии. а не могу назвать примером для подражания, поскольку мне кажется, что на других библиотеках подобное пишется гораздо легче и обладает большим функционалом. да, понятно, что ритейлу надо поддерживать совместимость с предыдущей версией. но... просто мне кажется, что можно делать морды намного проще и намного функциональнее при помощи традиционных веб-технологий. если бы был набор библиотек/инструментов доступа к Аксапте. Типа библиотеки доступа к mySQL, postgreSQL, mongoDB. Даже с учетом того, что клиент самой аксапты 7 - это тоже браузерное веб-приложение. |
|
|
За это сообщение автора поблагодарили: ax_mct (5). |
24.05.2017, 19:31 | #36 |
Участник
|
вот состав библиотек в <head> в существующем клиенте аксапты и в cloudPOS
больше всего меня удивляет полифил для промисов... Последний раз редактировалось mazzy; 24.05.2017 в 19:34. |
|
24.05.2017, 20:17 | #37 |
Banned
|
Цитата:
Тоску понимаю и поддерживаю. Выход вижу но туда AX7 не пролезет, она сама стена. Хотя можно анализировать архитектуру AX7 и что-где-чем можно заменить. Но связанными руками да в темной комнате с поттергейстом?. Я думаю это из-за IE. A Promise object represents an operation that is not completed yet, but is expected to complete in the future. Internet Explorer 11 doesn’t implement native promises. For browsers that do not implement native promises, you must include a separate library to provide a polyfill. A polyfill is code that provides capabilities not provided natively by a browser. There are several polyfills or libraries which will allow Internet Explorer 11 to have promises: es6-promise, q.js, and bluebird. https://msdn.microsoft.com/en-us/lib...romiseFunction |
|
24.05.2017, 21:18 | #38 |
Участник
|
именно это и удивляет.
под хромом, кстати, не работает из коробки. хотя обещали. может будет еще. понятно, что промисы удобная штука... но раз уж взялись использовать экспериментальные технологии, то взяли бы сразу async/await тайпскриптовский... хотя само наличие экспериментального полифила в ФИНАНСОВОЙ программе... да еще в браузере... понятно, что в браузере должно работать в режиме киоска... но, блииин... слишком это сложно. собственно поэтому не считаю ритейл образцом для подражания. собственно отсюда и вопрос. |
|
24.05.2017, 21:47 | #39 |
Banned
|
Ответ в "ES6 Promise polyfill".
То что вы думали что мы обещали - так это мы о другом говорили. A promises callback cannot return that same promise. Оставьте это программирование обещающей расе. You must pass an array to Promise race Даже не знаем что вам еще обещать. Попробуйте что-то более современное. Failed to construct Promise. Please use the new. Код: if(typeof Promise !== "undefined" && Promise.toString().indexOf("[native code]") !== -1) { (function(t){function z(){for(var a=0;a<g.length;a++)g[a][0](g[a][1]);g=[];m=!1}function n(a,b){g.push([a,b]);m||(m=!0,A(z,0))}function B(a,b){function c(a){p(b,a)}function h(a){k(b,a)}try{a(c,h)}catch(d){h(d)}}function u(a){var b=a.owner,c=b.state_,b=b.data_,h=a[c];a=a.then;if("function"===typeof h){c=l;try{b=h(b)}catch(d){k(a,d)}}v(a,b)||(c===l&&p(a,b),c===q&&k(a,b))}function v(a,b){var c;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(b&&("function"=== typeof b||"object"===typeof b)){var h=b.then;if("function"===typeof h)return h.call(b,function(d){c||(c=!0,b!==d?p(a,d):w(a,d))},function(b){c||(c=!0,k(a,b))}),!0}}catch(d){return c||k(a,d),!0}return!1}function p(a,b){a!==b&&v(a,b)||w(a,b)}function w(a,b){a.state_===r&&(a.state_=x,a.data_=b,n(C,a))}function k(a,b){a.state_===r&&(a.state_=x,a.data_=b,n(D,a))}function y(a){var b=a.then_;a.then_=void 0;for(a=0;a<b.length;a++)u(b[a])}function C(a){a.state_=l;y(a)}function D(a){a.state_=q;y(a)}function e(a){if("function"!== typeof a)throw new TypeError("Promise constructor takes a function argument");if(!1===this instanceof e)throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this.then_=[];B(a,this)}var f=t.Promise,s=f&&"resolve"in f&&"reject"in f&&"all"in f&&"race"in f&&function(){var a;new f(function(b){a=b});return"function"===typeof a}();"undefined"!==typeof exports&&exports?(exports.Promise=s?f:e,exports.Polyfill=e):"function"== typeof define&&define.amd?define(function(){return s?f:e}):s||(t.Promise=e);var r="pending",x="sealed",l="fulfilled",q="rejected",E=function(){},A="undefined"!==typeof setImmediate?setImmediate:setTimeout,g=[],m;e.prototype={constructor:e,state_:r,then_:null,data_:void 0,then:function(a,b){var c={owner:this,then:new this.constructor(E),fulfilled:a,rejected:b};this.state_===l||this.state_===q?n(u,c):this.then_.push(c);return c.then},"catch":function(a){return this.then(null,a)}};e.all=function(a){if("[object Array]"!== Object.prototype.toString.call(a))throw new TypeError("You must pass an array to Promise.all().");return new this(function(b,c){function h(a){e++;return function(c){d[a]=c;--e||b(d)}}for(var d=[],e=0,f=0,g;f<a.length;f++)(g=a[f])&&"function"===typeof g.then?g.then(h(f),c):d[f]=g;e||b(d)})};e.race=function(a){if("[object Array]"!==Object.prototype.toString.call(a))throw new TypeError("You must pass an array to Promise.race().");return new this(function(b,c){for(var e=0,d;e<a.length;e++)(d=a[e])&&"function"=== typeof d.then?d.then(b,c):b(d)})};e.resolve=function(a){return a&&"object"===typeof a&&a.constructor===this?a:new this(function(b){b(a)})};e.reject=function(a){return new this(function(b,c){c(a)})}})("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this); } |
|
24.05.2017, 21:58 | #40 |
Участник
|
аксапта на react, cloudPOS на knockout... и никогда не быть им вместе...
поэт, уводящий в оффтопик. блин. вернемся к теме? Цитата:
Сообщение от mazzy
Как достучаться из веб-приложения к акс2012, акс2009?
Предположим, есть традиционное веб-приложение на традиционном для веба LAMP Как лучше с архитектурной точки зрения организовать Поделитесь опытом, размышлениями. Есть ли уже готовые решения? Цитата:
Цитата:
Сообщение от egorych
А я бы сделал старый-добрый Web сервис, ну или REST, но независимый от Аксапты - который бы реализовывал нужный функционал.
Как он будет это делать - через коннектор, Odata или просто читать напрямую из базы - уже дело вкуса. Внешнее приложение просто дергало бы в нужный момент сервис и не парилось как там чего реализовано. Цитата:
Сообщение от gl00mie
Я не считаю работу в оффлайне обязательной, в некоторых сценариях без онлайна не обойтись. Но я считаю, что обмен данными стороннего приложения с Аксаптой должен быть по возможности асинхронным. Асинхронность уже дает некую автономность и предполагает хранение слепков данных отдельно от БД Аксапты, а дальше, если развивать тему, можно воспроизвести во внешнем приложении некую бизнес-логику, которая будет работать на доступных в оффлайне данных из Аксапты.
... А если приложение и в оффлайне не работает, то чем оно лучше уже имеющейся в коробке портальной веб-морды, для которой уже реализован механизм "достучаться до Аксапты"? Последний раз редактировалось mazzy; 24.05.2017 в 22:04. |
|
Теги |
ax2009, ax2012, lamp, как правильно |
|
|