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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.11.2012, 20:55   #1  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Альтернативой встроенной в язык X++ команде "select" является механизм Query. Так же без Query не обойтись если запрос необходимо не просто обработать в коде, а отобразить пользователю через форму или отчёт.
Только было собирался спросить, не является ли запрос просто конструктором некоторой структуры для использования оператора select, как вот это ваше утверждение о том, что select и query, это два альтернативных механизма.

И в следующем посте от Сергея Мазуркина вижу "Грубо говоря, результатом работы Query является строка "select ... from ... where ... join" "

Товарищи Заслуженные Аксаптоведы, вы уж тогда между собой договоритесь...
Старый 08.11.2012, 21:45   #2  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Narayana Посмотреть сообщение
Только было собирался спросить, не является ли запрос просто конструктором некоторой структуры для использования оператора select, как вот это ваше утверждение о том, что select и query, это два альтернативных механизма.
Мдя.. "не является ли запрос просто конструктором некоторой структуры для использования оператора select".. "а не будет ли так любезен многоуважаемый джинн"..

Narayana, вы сами поняли, что именно спросили? "Некоторая Структура Для Использования Оператора Селект".. внушает..
Цитата:
Сообщение от Narayana Посмотреть сообщение
И в следующем посте от Сергея Мазуркина вижу "Грубо говоря, результатом работы Query является строка "select ... from ... where ... join" "

Товарищи Заслуженные Аксаптоведы, вы уж тогда между собой договоритесь...
Не сильно заслуженный, но - рискну прояснить:

И с помощью QueryBuild*, И с помощью встроенного select можно построить запрос к базе данных. Этот запрос можно выполнить, результат - использовать.

Так понятнее? )

===

А вообще - можно, конечно, задавать иди..тские вопросы.

А можно (альтернативно) - код посмотреть, в клаву потыкать (осмысленно), книжку почитать.. на худой конец.. Вы б попробовали, что ли )
__________________
Best Regards,
Roman
Старый 08.11.2012, 23:26   #3  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Narayana, вы сами поняли, что именно спросили? "Некоторая Структура Для Использования Оператора Селект".. внушает..
Думаю, если вы занимаетесь Аксаптой не позже, чем с 2003 года, то тем более должны были понять

Но, если не поняли, попробую детализировать собственное высказываение.
Если посмотреть в хелп по разработке, то можно увидеть, что оператор select стоит особняком от классов, их методов и функций, что наводит на мысль о его некоторой базовой роли.
Если вы что-нибудь слышали об устройстве аксиоматических математических моделей, то должны понимать, что такой подход наиболее эффективен для построения и изучения систем программных. А именно, очень важен порядок вещей. Что в основе, а что следствие. То есть, понимаете, очень редко бывает нагромождение из равноценных деталей. Так сказать с одинаковым приоритетом. Всегда иерархия.
Так вот, эту самую иерархию, с вашего позволения, я и выискиваю в интересующем меня вопросе.

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

Дак вот, читаем хэлп:
"
The select statement fetches or manipulates data from the database or both fetches and manipulates data from the database.
All select statements use a table variable to fetch records. This variable must be declared before a select statement can be executed.
The select statement only fetches one record, or field. To fetch additional records, you can use the next statement. The next statement fetches the next record in the table. If you use next without a preceding select command, an error occurs. Do not use next with the firstOnly find option. If you need to traverse a number of records, it is more appropriate to use a whileselect statement.
Results of a select statement are returned in a table buffer variable. If you use a field list in the select statement, only those fields are available in the table variable. If you use aggregate functions, such as sum or count, the results are returned in the fields that you perform the sum or count over. You can only count, average, or sum the integer and real fields. "

Этот кусочек текста в первую очередь наводит на мысль, что и создание объекта типа таблицы, вещь довольно первичная. И применение оператора select, тоже. Ведь этот оператор не является даже методом какого-нибудь класса, как я понимаю.
Чувствуете, на что намекаю?
Есть объектная модель языка X++ для Аксапты.
Эта модель предполагает стройную систему классов, методов и объектов.
А есть кое-что, что стоит как бы над этой объектной моделью.
Этакие торчащие уши, за которые система общается с внешним окружением.

Дак вот, я и предположил, что оператор select, это и есть нечто, лежащее вне объектной модели Х++.

Стало быть, конструкции внутри классов (не смущает слово "конструкции"?) могут использовать этот базовый оператор для работы с данными.
Ну и естественно, подумал, что методы классов Query...* вполне в своей внутренней реализации могут также использовать оператор select.
Ну, теперь понятно, борец вы наш за чистоту идеалов?



Цитата:
Сообщение от RVS Посмотреть сообщение
И с помощью QueryBuild*, И с помощью встроенного select можно построить запрос к базе данных. Этот запрос можно выполнить, результат - использовать.

Так понятнее? )
Вы меня, конечно, извините, но это и ежику понятно.
Речь, как вы уже поняли, шла о том, не является ли оператор select главным внутренним кубиком, с помощью которого строится QueryBuild и в словах Сергея Мазуркина я увидел намек, что является. А вот вы именно на этот вопрос не ответили.


Цитата:
Сообщение от RVS Посмотреть сообщение
А вообще - можно, конечно, задавать иди..тские вопросы.
А можно (альтернативно) - код посмотреть, в клаву потыкать (осмысленно), книжку почитать.. на худой конец.. Вы б попробовали, что ли )
Мне кажется, уважаемый RVS, что вы кушаете много жирного. Вследствие этого у вас эмоциональная реакция несколько опережает умственную
Старый 08.11.2012, 23:41   #4  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Очень много букв, цитировать не буду, звиняйте.. Итак :

Попробуем зайти с противоположного конца : select был всегда. По крайней мере, он появился вместе с SQL-сервером (могу ошибаться, но не сильно).

Axapta появилась несколько позже. Axapta работает с базой данных SQL.

Уже это наводит на некоторые мысли

В Axapta есть 2 способа получения данных из базы данных :

- написание явно, в коде Х++, select-стейтмента
- построение Query, который (внимание!) тоже выполнит некий select-statement
===
- Query можно построить "из кода" (семейство классов QueryBuild*)
- Query можно нарисовать в AOT

Вот, собственно, и все, что копья ломать?


Оператор Select, таким образом, не является "кубиком, с помощью которого строится". Оно "строится" для того, чтобы этот Select описать и затем выполнить (это я про Query)
===

Что до прочего - личного :

- мне видится, что вы не умеете формулировать вопросы
- мне видится, что у вас каша в голове пока что
- мне видится, что было бы знаком уважения к "знатокам Axapta" хотя бы попытаться разобраться (не начитаться.. терминов, а именно разобраться) в предмете. Прежде, чем задавать вопросы.

В конце концов, все, что вам здесь сказали, многократно написано. У вас, как я понял, есть живая Axapta, которая сама по себе - лучшая литература по Axapta.. ну, и так далее..

Воооот...
__________________
Best Regards,
Roman

Последний раз редактировалось RVS; 08.11.2012 в 23:51. Причина: Немного подробностей
Старый 09.11.2012, 00:15   #5  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Попробуем зайти с противоположного конца : select был всегда. По крайней мере, он появился вместе с SQL-сервером (могу ошибаться, но не сильно).

Axapta появилась несколько позже. Axapta работает с базой данных SQL.

Уже это наводит на некоторые мысли ...
Безусловно, наводит.
И в первую очередь на мысль, что select в Аксапте, это не тот же самый select, что в родном для SQL-server select на sql-transact. Надеюсь, вы понимаете, что select в Аксапте даже не есть вызов SQL-серверного select. А если не есть, то и говорить не о чем, потому как к устройству Аксапты в нашем случае это отношения не имеет.
Но, вот в SQL server оператор select, скорее всего, появился тогда же, когда и механизм построения запросов. И скорее всего, они были в таких супружеских отношениях, как и в Аксапте.

"Query, который (внимание!) тоже выполнит некий select-statement"
"Оператор Select, таким образом, не является "кубиком, с помощью которого строится"."
"Оно "строится" для того, чтобы этот Select описать и затем выполнить (это я про Query) ""

ё-мое... ))
Если select выполнить, значит использовать. Если использовать, значит кубик. Не упорствуйте ))

"Что до прочего - личного :

- мне видится, что вы не умеете формулировать вопросы"

Я умею формулировать вопросы.

"- мне видится, что у вас каша в голове пока что"

Если бы у меня не было каши сейчас в голове, то этот сайт мне был бы не нужен.
По секрету открою вам одну тайну.
У всех каша в голове.
И у вас тоже

"- мне видится, что было бы знаком уважения к "знатокам Axapta" хотя бы попытаться разобраться (не начитаться.. терминов, а именно разобраться) в предмете. Прежде, чем задавать вопросы."

Еще раз уверяю вас, что мои вопросы вполне нормальные и разбираться я умею не хуже вас. Но, комплексов насчет стесняться спросить у меня нет.
То, о чем я сейчас спрашиваю не написано в явном виде в документации и, мало того, ну, совсем крутые специалисты в Аксапте на некоторые из этих вопросов без всяких комплексов ответили "Не знаю!".
Так что, оставьте свои нравоучения для малолетних
За это сообщение автора поблагодарили: macklakov (1).
Старый 09.11.2012, 00:28   #6  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Narayana Посмотреть сообщение
select в Аксапте, это не тот же самый select, что в родном для SQL-server select на sql-transact.
Синтаксис несколько иной, по сути - то же самое.
Цитата:
Сообщение от Narayana Посмотреть сообщение
select в Аксапте даже не есть вызов SQL-серверного select.
Дааа? "А пацаны-то и не в курсе.."
Цитата:
Сообщение от Narayana Посмотреть сообщение
Если select выполнить, значит использовать. Если использовать, значит кубик. Не упорствуйте ))
Передергиваете

Вы спросили : "не является ли оператор select главным внутренним кубиком, с помощью которого строится QueryBuild"

Ответ : нет, не является "кубиком, с помощью которого строится QueryBuild". И вообще, QueryBuild - не строится, он строит. Строит Query, который при выполнении его из QueryRun выполняет тот самый SQL-серверный select. Включите трассировку SQL в Axapta, вы удивитесь, видимо

Именно это и имел в виду, говоря, что вы.. забавно задаете вопросы.
__________________
Best Regards,
Roman
Старый 09.11.2012, 00:46   #7  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Вы спросили : "не является ли оператор select главным внутренним кубиком, с помощью которого строится QueryBuild"
Хотите пообщаться на тему "Что может означать слово "строится"?" ?
Старый 08.11.2012, 23:50   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Narayana Посмотреть сообщение
И в следующем посте от Сергея Мазуркина вижу "Грубо говоря, результатом работы Query является строка "select ... from ... where ... join" "

Товарищи Заслуженные Аксаптоведы, вы уж тогда между собой договоритесь...
1. "следюущий пост" - это вот этот Query, где почитать?
2. противоречия нет.

есть следующие сущности. две из них имеют одинаковое название:
2.1. Query - объект, который позволяет строить СТРОКУ ЗАПРОСА вида "select ... from ... where ... join ...". Эта строка запроса так или иначе уходит на SQL-сервер.
2.2. QueryRun - объект, который принимает Query и фактически посылает строку на SQL, принимает результаты из SQL.
2.3. есть ОПЕРАТОР языка X++ select (http://msdn.microsoft.com/en-us/library/aa861766.aspx) (S.Kuskov назвает командой языка)
в результате выполнения оператора также уходит запрос на SQL-сервер и тут же принимаются результаты с SQL

так вот:
Query позволяет легко модифицировать СТРОКУ запроса программным образом.
Query позволяет работать с метасимволами поиска http://axapta.mazzy.ru/lib/search/
Query позволяет дать пользователю возможность модифицировать запрос
Query позволяет разработчику создать объект-прототип в AOT и потом легко создать запрос (Query q = new Query(querystr(myQueryInAOT)))

X++:
Query q = new Query(querystr(CustTable));
QueryRun qr = new QueryRun(q);
CustTable custTable;

while( qr.next() )
{
  custTable = qr.get(tablenum(custTable));
  info(custTable.name);
}
оператор языка SELECT нельзя модифицировать никоим образом.
и в простейших ситуациях программисты часто используют именно его, предполагая, что "так проще".
X++:
CustTable custTable;

while select custTable
{
  info(custTable.name);
}

различайте оператор языка X++ select и строку SQL-запроса, которая содержит select
За это сообщение автора поблагодарили: driller (2), Narayana (1).
Старый 09.11.2012, 00:39   #9  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
2.3. есть ОПЕРАТОР языка X++ select (http://msdn.microsoft.com/en-us/library/aa861766.aspx) (S.Kuskov назвает командой языка)
в результате выполнения оператора также уходит запрос на SQL-сервер и тут же принимаются результаты с SQL
Ну, дак на SQL-сервер уже уходит запрос на sql-transact, как я понимаю?
Значит, все-таки кирпичик, связывающий Х++ с SQL-сервером?
То есть строки таблиц с SQL-сервера таскаются с помощью оператора select в Х++, а потом уже в соответствии со структурой запроса в Х++ формируются в конечный результат?

А как тогда все-таки с временными таблицами?
Я это не могу понять.
Вот мы временную таблицу добавили в запрос в качестве дата-сорса.
Если мы такой запрос добавим во View, то поля этой таблицы, равно как и сама временная таблица в свойствах View отражаться не будут.

Почему так?
Ведь View, это ведь просто способ вывести результаты запроса.
Ну, допустим, временная таблица пустая, ну и путь бы запрос давал пустой результат.
Ну, инициализировали значения во временной таблице внутри какого-нибудь метода запроса или таблицы, тогда б и строки отобразились?
Зачем не давать использовать временную таблицу стандартным образом во View???
Старый 09.11.2012, 09:20   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
А как тогда все-таки с временными таблицами?
Я это не могу понять.
Вот мы временную таблицу добавили в запрос в качестве дата-сорса.
Если мы такой запрос добавим во View, то поля этой таблицы, равно как и сама временная таблица в свойствах View отражаться не будут.

Почему так?
Скорее всего данное ограничение связано с тем что временные таблицы реализуются не средствами БД, а средствами AOS (приложением аксапты).
К слову сказать в версии AX2012 появились временные таблицы уровня БД.
Цитата:
Сообщение от Narayana Посмотреть сообщение
Ведь View, это ведь просто способ вывести результаты запроса.
Ну, допустим, временная таблица пустая, ну и путь бы запрос давал пустой результат.
Ну, инициализировали значения во временной таблице внутри какого-нибудь метода запроса или таблицы, тогда б и строки отобразились?
Зачем не давать использовать временную таблицу стандартным образом во View???
Нет View это не способ вывести результат запроса (куда вывести?). View это реализация принципа повторного использования кода. Так сказать макрос уровня запросов.
Для вывода результатов запроса на форме или отчёте View не требуется. Просто укажите в свойстве Query узла "Data Sources" имя вашего запроса.

Если по каким-то причинам нужен именно View, то в качестве workaround можно попробовать в RunTime делать постоянную таблицу временной (см. метод xRecord.setTmp()). Либо для промежуточных вычислений использовать постоянные таблицы (потребуется самостоятельно изолировать данные между пользовательскими сессиями).

Последний раз редактировалось S.Kuskov; 09.11.2012 в 09:45.
Старый 09.11.2012, 11:50   #11  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Нет View это не способ вывести результат запроса (куда вывести?). View это реализация принципа повторного использования кода. Так сказать макрос уровня запросов.
Для вывода результатов запроса на форме или отчёте View не требуется. Просто укажите в свойстве Query узла "Data Sources" имя вашего запроса.
Для меня View, это возможность представить данные на очередном шаге бизнес-процесса. В частности, подготовить баланс расчета с агентами, для того чтобы вывести результаты на портале, куда агенты могут заходить в личный кабинет.
Ну, типа, подготовил то, что можно подставить в Data Set для портала и забыл.
В этом случае этот кусочек данных может использоваться и внутри Аксапты, и на портале. Только внутри это выведется в форме, а на портале в контроле ШейрПоинта.
Старый 09.11.2012, 12:19   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Для меня View, это возможность представить данные на очередном шаге бизнес-процесса. В частности, подготовить баланс расчета с агентами, для того чтобы вывести результаты на портале, куда агенты могут заходить в личный кабинет.
Ну, типа, подготовил то, что можно подставить в Data Set для портала и забыл.
В этом случае этот кусочек данных может использоваться и внутри Аксапты, и на портале. Только внутри это выведется в форме, а на портале в контроле ШейрПоинта.
Чесно говоря, у меня недостаточно опыта работы с порталом, что бы утверждать, что предложенный мной workaround будет работоспособен из ШейрПоинта. Возможно более знающие люди вам смогут помочь.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Оператор select я воспринимаю как аргумент функции (в математическом смысле) Query. При этом select имеет внутреннюю реализацию, описанную S.Kuskov-ым.
Кто-то говорит что люди произошли от обезьян, кто-то - что обезьяны от людей, а кто-то, вы представляете, вообще предположил, что друг от друга они не происходили, а произошли от общего предка.

Представьте, что в результате "компиляции" код X++ переводится на некий псевдокод, который потом ядро системы (интерпретатор) способно интерпретировать (выполнить). Так вот и команда "select" и вызов QueryRun.next() компилируется компилятором в "одинаковый" псевдокод. Это моё личное восприятие действительности. Вы можете воспринимать как захотите.

Один интересный факт сейчас вспомнил. В версии AX2009 появилась возможность реализовать UNION. Но возможность эта реализуется только посредством Query. Через синтаксис "select" реализовать UNION не получится. Это так, к слову о первопричинности

Цитата:
Сообщение от Narayana Посмотреть сообщение
Если строка запроса "так или иначе уходит на SQL-сервер", то что получается, - временную таблицу запрос не обрабатывает и оператор select не действует?
Оператор select языка X++ применённый к временной таблице действительно НЕ инициирует реальный SQL запрос к БД.

Последний раз редактировалось S.Kuskov; 09.11.2012 в 12:57.
Старый 09.11.2012, 13:04   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Через синтаксис "select" реализовать UNION не получится.
угу. разработчики аксапты постоянно забывали синхронизировать возможности оператора и Query. Так, долгое время в операторе нельзя было использовать элемент типа-массива. Пичалька.

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Оператор select языка X++ применённый к временной таблице действительно НЕ инициирует реальный SQL запрос к БД.
Не только оператор. Query тоже не инициирует (до версии ax2012)
Старый 09.11.2012, 09:56   #14  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Сорри, что встреваю в разговор. Поддержу RVS, что Narayana "странно" задает вопросы. Просто имейте это в виду, когда "гуру" не смогут вам ответить, и проще будет сказать "Не знаю"

Цитата:
Сообщение от Narayana Посмотреть сообщение
Ну, дак на SQL-сервер уже уходит запрос на sql-transact, как я понимаю?
Значит, все-таки кирпичик, связывающий Х++ с SQL-сервером?
То есть строки таблиц с SQL-сервера таскаются с помощью оператора select в Х++, а потом уже в соответствии со структурой запроса в Х++ формируются в конечный результат?
1. утверждение - верное.
2. оператор Select - один из кирпичиков. Формально - верное утверждение.
3. Вывод касается только оператора SELECT? Nогда первая часть утверждения верная, вторая часть - непонятная. =) Что такое структура запроса в X++? Если вы имеете в виду целиком оператор select с табличными переменными, выбираемыми полями и условиями - то да. Если вы тут пытаетесь опять к SELECT привязать Query - то нет.
__________________
Ivanhoe as is..
Старый 09.11.2012, 11:58   #15  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Если вы имеете в виду целиком оператор select с табличными переменными, выбираемыми полями и условиями - то да.
Да, именно это имею в виду.



Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
Если вы тут пытаетесь опять к SELECT привязать Query - то нет.
Ну, хорошо, этот момент уже обстреляли со всех сторон, но повторюсь.
Оператор select я воспринимаю как аргумент функции (в математическом смысле) Query. При этом select имеет внутреннюю реализацию, описанную S.Kuskov-ым.
Старый 09.11.2012, 12:10   #16  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Дак, что на выходе?
Я имею в виду временные таблицы...

Mazzy пишет:
"2.1. Query - объект, который позволяет строить СТРОКУ ЗАПРОСА вида "select ... from ... where ... join ...". Эта строка запроса так или иначе уходит на SQL-сервер."

Понимаю, что выглядит как занудство, но...
Временная таблица живет в памяти или отдельно создаваемом для нее файле.
Если строка запроса "так или иначе уходит на SQL-сервер", то что получается, - временную таблицу запрос не обрабатывает и оператор select не действует?
Старый 09.11.2012, 13:02   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Narayana, в принципе, вам уже ответили.
но попробую и я вставить.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Ну, дак на SQL-сервер уже уходит запрос на sql-transact, как я понимаю?
отличный вопрос.
Прежде всего, хочу извиниться за упрощение.
Полностью утверждение выглядит так:
= строка запроса уходит в некий преобразователь запросов Аксапты.
= этот преобразователь диспетчеризирует запрос к
=== собственной базе данных (временные таблицы, псевдотаблицы UtilElements)
=== к кэшу (если у таблицы установлено свойство CacheLokup и запрос простой)
=== внешней базе данных (MS SQL, Oracle, ранее были my SQL и еще десяток других)

Внимание: преобразователь может вполне разбить один запрос на несколько подзапросов, вставить/убрать хинты, вставить убрать поля.

В большинстве случаев в конечном итоге срока запроса уходит таки на SQL.

Теперь еще внимание: начиная с AX2012 поддерживается только MS SQL, временные таблицы хранятся в MS SQL, псевдотаблицы с бизнеслогикой - также в MS SQL.

Поэтому начиная с AX2012 увтерждение "запрос на sql-transact" является верным.
Но вот до ax2012 это слишком жесткое утверждение. Вполне возможно, что запрос будет на PL/SQL. Вполне возможно, что запрос будет к собственной базе данных.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Значит, все-таки кирпичик, связывающий Х++ с SQL-сервером?
Да. Но добраться до этого кирпичика можно как оператором языка, так и объектом Query.

Цитата:
Сообщение от Narayana Посмотреть сообщение
То есть строки таблиц с SQL-сервера таскаются с помощью оператора select в Х++, а потом уже в соответствии со структурой запроса в Х++ формируются в конечный результат?
Тут тоже упрощение.
оператор select в X++ - это синтаксический сахар.
Внутри происходят процессы, похожие на Query/QueryRun.

Обратите внимание на оператор next, который непосредственно связан с оператором select.
Вот такой код вполне валиден. Хотя и считается сильно устаревшим
X++:
CustTable custTable;

select custTable;
while( custTable )
{
   info(custTable.name);
   next CustTable;
}
Цитата:
Сообщение от Narayana Посмотреть сообщение
А как тогда все-таки с временными таблицами?
До ax2012 временные таблицы обрабатываются внутренним аксаптовским исполнителем SQL-запросов.
Начиная с ax2012 временные таблицы "живут" в MS SQL и обрабатываются обычным образом SQL-сервером.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Ведь View, это ведь просто способ вывести результаты запроса.
Нет, View - это материализованный запрос. Он живет на SQL-сервере с момента появления в ax4.0. До этого был только Query.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Ну, допустим, временная таблица пустая, ну и путь бы запрос давал пустой результат.
Вопросы просто отличные.
Но с какого-то момента вам нужно четко определить по какой версии вы задаете вопросы.
ax3.0, ax4.0, ax2009, ax2012 очень сильно отличаются в части внутренних механизмов работы с базой.

в ax2012 все живет в MS SQL. И все просто.
в более ранних версиях все гораздо запутаннее.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Зачем не давать использовать временную таблицу стандартным образом во View???
потому что view живет на SQL-сервере, а временная таблица (до ax2012) живет только в рамках AOS.


Цитата:
Сообщение от Narayana Посмотреть сообщение
Понимаю, что выглядит как занудство, но...
Временная таблица живет в памяти или отдельно создаваемом для нее файле.
Если строка запроса "так или иначе уходит на SQL-сервер", то что получается, - временную таблицу запрос не обрабатывает и оператор select не действует?
до версии ax2012 - да.
до версии ax2012 есть еще внутренний преобразователь SQL-запросов. Он может разбить запрос на несколько вложенных подзапросов, если встречает временную таблицу. И отдеспетчиризировать каждый подзапрос своей подсистеме исполнения SQL-запроса. (см. начало этого сообщения)
Старый 09.11.2012, 13:08   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Narayana Посмотреть сообщение
Оператор select я воспринимаю как аргумент функции (в математическом смысле) Query.
Тоже позанудствую

ни в коем случае не "как аргумент".
только как "результат функции".

Query не умеет принимать и разбирать строку SQL-запроса. И никогда не умел.
Query умеет только строить строку SQL-запроса на основании других аргументов.
Старый 09.11.2012, 10:09   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
То есть строки таблиц с SQL-сервера таскаются с помощью оператора select в Х++, а потом уже в соответствии со структурой запроса в Х++ формируются в конечный результат?
Что вы имеете в виду под фразой "с помощью оператора select"? Строки таблиц с SQL-сервера таскаются ядром аксапты, протоколы обмена данными разные задействованы... я думаю вас не это интересует.

Для организации подобного взаимодействия AOS<->БД на стороне SQL-servera используется механизм курсоров.

Когда обрабатывается команда X++ "select" или выполняется первая итерация цикла "while select", а также когда первый раз выполняется метод QueryRun.next(), на SQL-сервере происходит создание курсора "DECLARE CURSOR..." (не напрямую кончно, через вспомогательгы хранимые процедуры, но не столь важно).

Когда выполняется команда X++ "next" или выполняются последующие итерации цикла "while select" или QueryRun.next(), на SQL-сервере происходит движение курсора к следующей строке запроса "FETCH".

Могу ошибаться в деталях, но общая схема работы именно такая.

Последний раз редактировалось S.Kuskov; 09.11.2012 в 10:48.
Теги
query, архитектура, как правильно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Обновление поля с определённым типом во всех таблицах. Corel DAX: Программирование 1 20.12.2008 13:37
Достаточно ли изменить дату в таблицах inventTrans, inventTransPosting, VendPackingSlipJour? DmitryS DAX: Программирование 3 18.09.2008 14:37
Проверки заполненных значений в связанных таблицах. miklenew DAX: База знаний и проекты 11 25.12.2007 14:40
Как не использовать relations на таблицах demetra DAX: Программирование 13 14.07.2006 11:00
Осторожнее с CTRL+S на таблицах mit DAX: Администрирование 7 25.07.2005 19:09

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:27.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.