18.01.2007, 15:50 | #1 |
Участник
|
Статья посвящена прямым вызовам сервера из программ X++ без применения SQL-запросов Dynamics AX (ранее известная как AXAPTA). Это позволяет превратить Dynamics AX в клиент-серверную систему и получить преимущества за счет распределенной обработки данных: повышение скорости обработки, разгрузку вычислительного комплекса. Кроме того, за счет использования в прямых запросах к серверу современных реализаций языка SQL, таких как Transact-SQL для MS SQL или PL/SQL для ORACLE (вместо ограниченного варианта SQL Dynamics AX), достигается большая гибкость и эффективность обработки данных. Приводятся примеры построения отчетов, процедур вставки и модификации данных. В статье речь идет о версиях Dynamics AX до 3.0 SP5 включительно.
Подробнее... http://axapta.mazzy.ru/lib/direct_sql/ |
|
18.01.2007, 22:50 | #2 |
Участник
|
IMHO, не достаточно объективный подход в статье. В частности, авторы упускают в статье следующие аспекты.
1. Двухуровневая архитектура клиент-сервер, которая так ярко описывается в статье, в настоящее время уже устарела. И ей на смену пришла трехуровневая. 2. Одним из факторов не использования хранимых процедур и примитивного SQL является кросс-платформенность. 3. Для OLTP систем тяжелые процедуры и тяжелые SQL-запросы в совокупности с тяжелыми триггерами не всегда оптимальны. Могут возникнуть тяжелые блокировки, что будет тормозить работу пользователей на OLTP операциях. Чем больше пользователей в системе — тем актуальнее проблема. Альтернативный подход к решению проблемы можно посмотреть в Аксапте в процедуре многопользовательского закрытия склада. 4. Запросно-триггерное программирование имеет узкое место — сервер БД. Двухзвенка тяжело масштабируется. У вас есть только один вариант — наращивать ресурсы сервера БД. Либо делать распределенные БД. Последнее далеко не всегда приемлемо или эффективно. А отдача от дополнительных вложенных ресурсов в одну коробку имеет тенденцию к снижению, начиная с определенного предела. То же самое касается большого количества машин в кластере. Сервера приложения масштабировать легче, а при их использовании нагрузка на ресурсы серверов БД снижается. В общем, необходим сбалансированный подход. |
|
18.01.2007, 23:29 | #3 |
Участник
|
Цитата:
Согласен, что нужен сбалансированный подход. |
|
19.01.2007, 11:39 | #4 |
Moderator
|
Статья вызвала живой интерес (среди меня, во всяком случае). Чуть позже поизучаю повнимательнее.
Пока же бросилась в глаза некоторая незаконченность примеров 1 и 2. Хочется спросить "А дальше что?", т.е. хотелось бы увидеть еще несколько шагов, например, куда далее следует подставлять sqlConnect. Особенно "незакончен" пример 2: там фактически инициализируется Excel и потом вызывается метод CopyFromRecordset для ЗАПИСИ (!) в Excel recordset'а rs, который непонятно откуда должен возникнуть. Подчеркиваю еще раз - "для ЗАПИСИ", а не для "чтения RECORDSET из EXCEL" как это написано в заголовке примера. Мои "текстовые претензии": = "вызов EXCEL как COM-объекта через ADO – интерфейс (**); " - Фраза "вызов COM-объекта через ADO–интерфейс" выглядит абсурдно. Excel там вызывается просто как COM-объект ("Excel.Application"), ADO при этом не принимает никакого участия. = "чтение RECORDSET из EXCEL (**): " - Не "чтение", а "запись" в Excel там демонстируется. |
|
19.01.2007, 11:45 | #5 |
Участник
|
Согласен с Глебом, однобокая статья. Опасная для неокрепших умов, мечтающих вернуться в любимые среды разработки.
1. К таким запросам сложно прикрутить пользовательские фильтры 2. Проблемы с RLS 3. Всегда надо помнить про DataAreaId |
|
19.01.2007, 19:01 | #6 |
Участник
|
Следующий шаг после формирования строки sqlConnect может выглядеть так
CCADOConnection ccADOConnection; ; ccADOConnection = new CCADOConnection(); ccADOConnection.open(sqlConnect); В примере 2 инициализируется Excel как CОМ- объект. ADO-интерфейс используется на предыдущем шаге для получения стандартного ADO-Recordset-a, содержащего выборку с SQL-сервера. Этот стандартный RecordSet читается методом Ехсеl CopyFromRecordset, который подразумевает и чтение из объекта RecordSet, и запись в указанный объект Ranges. Согласны с замечанием, что в примере Excel вызывается не через ADO-интерфейс. |
|
22.01.2007, 11:00 | #7 |
Участник
|
Цитата:
Алгоритмы же обработки данных, к которым наши основные претензии, одинаковы, что в трехзвенке, что в двухзвенке, как и сказано в статье. Цитата:
Цитата:
Сообщение от glibs
3. Для OLTP систем тяжелые процедуры и тяжелые SQL-запросы в совокупности с тяжелыми триггерами не всегда оптимальны. Могут возникнуть тяжелые блокировки, что будет тормозить работу пользователей на OLTP операциях. Чем больше пользователей в системе — тем актуальнее проблема. Альтернативный подход к решению проблемы можно посмотреть в Аксапте в процедуре многопользовательского закрытия склада.
Цитата:
Сообщение от glibs
4. Запросно-триггерное программирование имеет узкое место — сервер БД. Двухзвенка тяжело масштабируется. У вас есть только один вариант — наращивать ресурсы сервера БД. Либо делать распределенные БД. Последнее далеко не всегда приемлемо или эффективно. А отдача от дополнительных вложенных ресурсов в одну коробку имеет тенденцию к снижению, начиная с определенного предела. То же самое касается большого количества машин в кластере. Сервера приложения масштабировать легче, а при их использовании нагрузка на ресурсы серверов БД снижается.
|
|
22.01.2007, 11:22 | #8 |
Модератор
|
Цитата:
Цитата:
Поэтому, для того, чтобы быть «кросс-платформным», подъязыку SQL-axapta следует догонять стандарты SQL-92 и SQL-2000, а не оставаться в реликтовых диалектах.
__________________
-ТСЯ или -ТЬСЯ ? |
|
22.01.2007, 12:13 | #9 |
Участник
|
В название примера 2 внесено исправление.
|
|
23.01.2007, 12:09 | #10 |
Moderator
|
|
|
23.01.2007, 12:53 | #11 |
Moderator
|
Цитата:
Цитата:
...........
2. Поля дат - пустые с точки зрения Аксапты = 01.01.1990 с точки зрения SQL Server 3. Содержимое контейнерных полей будет недоступно 4. Енумы будут числами (для представления их "словами" можно сваять в БД дополнительный справочник всех енумов) 5. В случае Oracle надо будет еще бороться с пустыми строками, выглядящими как Chr(2). 6. В случае Oracle я бы еще добавил, что нужно будет следить за регистром символов (особенно в условии WHERE). 7. Для любой СУБД нужно будет иметь в виду ситуации, связанные с использованием текстовых кодов (всякие id, accountnum и т.п.), выравненными по центру или по правому краю, когда в том же условии WHERE строку-фильтр нужно будет начинать слева некоторым количеством пробелов, которое не всегда очевидно (либо использовать славящийся своей неоптимальностью оператор LIKE '%<значение>%' ). |
|
01.02.2007, 23:11 | #12 |
Участник
|
Цитата:
На примере той же Аксапты хорошо это просматривается (3-я версия работает в режиме толстого и "полутонкого" (в смысле не классический mainframe терминал) клиента). Это вопрос терминологии, но при реализации трехзвенки клиент не обязан быть предельно тонким, как вы пишете. Я на терминалах не комплексную. Даже браузер не является тонким клиентом с т.з. классической теории. В общем, я не сторонник терминалов, а сторонник распределения обработки информации по трем узлам (хранилище - прикладной сервер - клиент). При таком подходе можно выиграть на трафике. И последний для вас пример. Решает ли (упростим формулировки в предложениях) MS SQL (пусть будет с использованием T-SQL) задачи построения сложной отчетности? А для чего тогда MS выпустил OLAP? PS. Я сам довольно часто использую прямые запросы к базе. Практически всегда работает быстрее. Но в базе в таких случаях я, как правило, работаю один. А запросы использую для решения аналитических задач, чаще разового характера. (Чтобы никто не подумал, что я враг SQL). |
|
12.02.2007, 05:23 | #13 |
Участник
|
|
|