|
09.11.2012, 09:56 | #1 |
Участник
|
Сорри, что встреваю в разговор. Поддержу RVS, что Narayana "странно" задает вопросы. Просто имейте это в виду, когда "гуру" не смогут вам ответить, и проще будет сказать "Не знаю"
Цитата:
Сообщение от Narayana
Ну, дак на SQL-сервер уже уходит запрос на sql-transact, как я понимаю?
Значит, все-таки кирпичик, связывающий Х++ с SQL-сервером? То есть строки таблиц с SQL-сервера таскаются с помощью оператора select в Х++, а потом уже в соответствии со структурой запроса в Х++ формируются в конечный результат? 2. оператор Select - один из кирпичиков. Формально - верное утверждение. 3. Вывод касается только оператора SELECT? Nогда первая часть утверждения верная, вторая часть - непонятная. =) Что такое структура запроса в X++? Если вы имеете в виду целиком оператор select с табличными переменными, выбираемыми полями и условиями - то да. Если вы тут пытаетесь опять к SELECT привязать Query - то нет.
__________________
Ivanhoe as is.. |
|
09.11.2012, 10:09 | #2 |
Участник
|
Цитата:
Для организации подобного взаимодействия 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. |
|
10.11.2012, 14:35 | #3 |
Участник
|
Цитата:
Сообщение от S.Kuskov
С таблицами дело обстоит чуть по другому. Содание таблицы в AOT порождает появление нового типа данных в X++. Этот новый табличный тип представляет собой наследника системного класса xRecord. Дальше вы правы, выполнение команды "select" приводит к изменению состояния табличной переменной. Каждое выбранное из БД значение поместится в соответствующее поле табличной переменной.
Вот, есть представления традиционной ориентации. Есть таблица в БД, есть рекордсет. Берем таблицу и с помощью оператора select набираем записи из таблицы в рекордсет. Теперь Аксапта. Есть таблица в БД. Дальше Аксапта знает про эту таблицу в БД и структуру этой таблицы держит у себя в качестве типа объекта в виде элемента АОТ. Так? Дальше мы объявляем переменную с типом данной таблицы. Что при этом происходит? Мы создаем в памяти только пустую структуру этой таблицы или уже структуру, заселенную данными? Дальше самое интересное. Применяем оператор select. Результатом его работы должен быть рекордсет. Так этот самый рекордсет куда складывается? В нашу пустую объявленную переменную или еще куда-то? Создается впечатление, что складывается как раз в нашу же переменную. Но, это же какой-то бардак получается. То есть, объявлением переменной с типом таблицы, мы создаем копию таблицы или пустой рекордсет? Если, допустим, пустой рекордсет "r" , то странным выглядит синтаксическая конструкция "select r;", потому как, вроде бы, "r" должен быть не операндом операции select, а ее результатом. Вот, когда мы, например, в АОТе открываем форму таблицы, где показывается содержание таблицы, что происходит? И еще. Вот мы создали в АОТе таблицу. А потом используем ее, например, в качестве датасорса для датасета, используемого дальше в портале. Допустим, я хочу к тому моменту, когда таблица будет использоваться в качестве дата сорса, произвести некоторые вычисления и положить результат их в одно из полей таблицы. Какое событие нужно использовать и какой метод таблицы лучше перекрывать для размещения кода вычислений? |
|
10.11.2012, 15:44 | #4 |
Участник
|
Цитата:
Сообщение от Narayana
... и все-таки, ничо не понимаю.
Вот, есть представления традиционной ориентации. Есть таблица в БД, есть рекордсет. Берем таблицу и с помощью оператора select набираем записи из таблицы в рекордсет. Теперь Аксапта. Есть таблица в БД. Дальше Аксапта знает про эту таблицу в БД и структуру этой таблицы держит у себя в качестве типа объекта в виде элемента АОТ. Так? Так Дальше мы объявляем переменную с типом данной таблицы. Что при этом происходит? Ничего вроде, разве что память выделяется под переменную, но не уверен, вроде бы как в Java языке происходит. Мы создаем в памяти только пустую структуру этой таблицы или уже структуру, заселенную данными? Дальше самое интересное. Применяем оператор select. Результатом его работы должен быть рекордсет. Так этот самый рекордсет куда складывается? В нашу пустую объявленную переменную или еще куда-то? оператор селект формирует запрос к БП. Если не используется noFetch то он обычно сразу же и исполняется. Результат "складывается" (в реальности все сложнее - используется буфер, и складывается не весь результат) в объявленную табличную переменную Создается впечатление, что складывается как раз в нашу же переменную. Но, это же какой-то бардак получается. То есть, объявлением переменной с типом таблицы, мы создаем копию таблицы или пустой рекордсет? Если, допустим, пустой рекордсет "r" , то странным выглядит синтаксическая конструкция "select r;", потому как, вроде бы, "r" должен быть не операндом операции select, а ее результатом. Синтаксис не я придумал, но наверное проблемы с его пониманием возникают только у .Net девеорперов. Если вы его не понимаете, то у вас скорее всего проблемы с абстрагированием и программирование вам вообще противопоказано Вот, когда мы, например, в АОТе открываем форму таблицы, где показывается содержание таблицы, что происходит? Много чего, впрочем к вышесказанному отношение имеет опосредованное И еще. Вот мы создали в АОТе таблицу. А потом используем ее, например, в качестве датасорса для датасета, используемого дальше в портале. Допустим, я хочу к тому моменту, когда таблица будет использоваться в качестве дата сорса, произвести некоторые вычисления и положить результат их в одно из полей таблицы. Какое событие нужно использовать и какой метод таблицы лучше перекрывать для размещения кода вычислений? вы хотите не это наверное, просто решили, что хотите сделать XXX через YYY и спрашиваете на форуме, как сделать YYY как в известном анекдоте. Никто так не делает в здравом уме, обновление данных вместе с выводом тупо убъет производительность, представьте, что два пользователя откроют страничку, что произойдет с блокировками в сиквеле? Последний раз редактировалось lvan; 10.11.2012 в 16:01. |
|
10.11.2012, 16:28 | #5 |
Сенбернар
|
2 Narayana
Цитата:
Повторяю : - вы не умеете формулировать вопросы. Под этим подразумевается ровно то, что вы не умеете задавать вопросы так, чтобы люди, знающие предмет (в отличии от вас.. сори..) готовы были бы на этот вопрос ответить. - это ровно ваша проблема, лечится ликбезом.. книжками ) - ваши экзсерсисы на тему "а я это так вижу" - никому, кроме вас самого, неинтересны.. например, я это вижу по-другому.. и что?
__________________
Best Regards, Roman |
|
10.11.2012, 16:34 | #6 |
Участник
|
Цитата:
Сообщение от RVS
Narayana,
Повторяю : - вы не умеете формулировать вопросы. Под этим подразумевается ровно то, что вы не умеете задавать вопросы так, чтобы люди, знающие предмет (в отличии от вас.. сори..) готовы были бы на этот вопрос ответить. - это ровно ваша проблема, лечится ликбезом.. книжками ) - ваши экзсерсисы на тему "а я это так вижу" - никому, кроме вас самого, неинтересны.. например, я это вижу по-другому.. и что? Если вам не интересно, не читайте. |
|
12.11.2012, 15:24 | #7 |
Участник
|
Цитата:
Увы, ни у Еременко, ни в "Аксапта изнутри", ни в хелпе по Аксапте нет слов, которые могли бы удовлетворить полностью. Эти слова есть в Development II in Microsoft Dynamics® AX 2009 и звучат они примерно так: " A table buffer: Stores complete records in a variable- Is declared like a variable – specify the table name in the declaration •- Is required when you use select commands to retrieve records •- Is declared before the select statement The following code shows a table buffer declaration: CustTable custTable; //declares a table buffer for the CustTable When a select statement result is assigned to a table buffer, the variable can be considered a subset of data from that table depending on the criteria of the search. " Оно, вроде бы, и несложно, когда уже понимаешь, о чем идет речь. А вот пока не понимаешь, то убогость хелпов не очень помогает понять всю последовательность событий, происходящих при объявлении переменной и дальнейшей работой с данными. Последний раз редактировалось Narayana; 12.11.2012 в 17:03. |
|
10.11.2012, 18:10 | #8 |
Участник
|
Цитата:
Все зависит от реализации клиента, который подает команду. Может выбираем в рекордсет на клиенте, может просто открываем серверный курсор, может просто определяем структуру рекордсета. В любом случае, для разработчика это просто некоторое действие, которым можно пользоваться, внутренняя реализация для разработчика прикладной части абсолютно по барабану. Подробности могут заинтересовать только системного разработчика, который, например, реализовывает низкоуровневый доступ к конкретной системе. Цитата:
Теперь Аксапта.
Есть таблица в БД. Дальше Аксапта знает про эту таблицу в БД и структуру этой таблицы держит у себя в качестве типа объекта в виде элемента АОТ. Так? Цитата:
Дальше мы объявляем переменную с типом данной таблицы.
Что при этом происходит? Мы создаем в памяти только пустую структуру этой таблицы или уже структуру, заселенную данными? Цитата:
Дальше самое интересное.
Применяем оператор select. Результатом его работы должен быть рекордсет. Так этот самый рекордсет куда складывается? В нашу пустую объявленную переменную или еще куда-то? Создается впечатление, что складывается как раз в нашу же переменную. Но, это же какой-то бардак получается. Цитата:
То есть, объявлением переменной с типом таблицы, мы создаем копию таблицы или пустой рекордсет?
Цитата:
Если, допустим, пустой рекордсет "r" , то странным выглядит синтаксическая конструкция "select r;", потому как, вроде бы, "r" должен быть не операндом операции select, а ее результатом.
Цитата:
...
Не только в Аксе, но и в dot.net, в OBDC и т.п. есть определенные соглашения о том, как использовать доступ к данным. При это разработчика прикладных решений не касаются внутренние реализации механизмов. Конечно, понимать общие принципы необходимо хотя бы с точки зрения быстродействия. |
|
|
За это сообщение автора поблагодарили: RVS (3), AlexeyS (2). |
11.11.2012, 00:13 | #9 |
Сенбернар
|
Цитата:
Сообщение от Raven Melancholic
В любом случае, для разработчика это просто некоторое действие, которым можно пользоваться, внутренняя реализация для разработчика прикладной части абсолютно по барабану. Подробности могут заинтересовать только системного разработчика, который, например, реализовывает низкоуровневый доступ к конкретной системе.
=== А началось-то - с чего? Просто парень хотел суммируемое поле на форму подвесить.. в ШареПойнт... Море юмора.. в этом мире
__________________
Best Regards, Roman Последний раз редактировалось RVS; 11.11.2012 в 00:27. |
|
12.11.2012, 15:40 | #10 |
Участник
|
|
|
08.11.2012, 14:03 | #11 |
Участник
|
Мне кажется, таким, как Кусков, нужно давать долю с продажи рекламы на этом сайте.
|
|
09.11.2012, 13:21 | #12 |
Участник
|
Уф... Столько интересного!
А можно тогда еще один очень важный для меня вопрос? Так получилось, что у меня все подошло к запуску уже рабочей системы на моем предприятии. Изначально мне казалось, что сейчас внедрять нужно только Ax2009. Ну, просто в силу того, что она более-менее изучена, много обновлений и документации. Но, сейчас моя уверенность пошатнулась. И вот, собственно, вопрос. Что лучше, запускаться на Ax2009 или дождаться русского релиза Ах2012, потратить еще несколько месяцев на изучение и стартовать на Ах2012? Тем более, что программные доработки, вроде бы должны встать и на новую Аксапту... |
|
09.11.2012, 13:27 | #13 |
Участник
|
Цитата:
Т.е. доработки изначально делались с таким прицелом? Если явно такого требования не было, то очень даже сомнительно. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
09.11.2012, 13:31 | #14 |
Участник
|
Цитата:
погодите пока с ax2012. там слишком МНОГО изменений. пусть устаканятся чуток. |
|
09.11.2012, 13:34 | #15 |
Axapta
|
Ждать осталось совсем недолго. Всего три недели.
Я бы не был в этом так уверен. Смотря какие у вас доработки. И смотря сколько их. AX2012 R2 от AX2009 отличается ооооочень существенно.
__________________
С уважением, Олег. |
|
09.11.2012, 13:29 | #16 |
Участник
|
возвращаясь к исходному вопросу.
Цитата:
До этого предлагалось использовать Display/Edit методы на таблицах и/или на датасорсах формы. http://msdn.microsoft.com/en-US/libr...(v=ax.50).aspx http://msdn.microsoft.com/en-US/libr...(v=ax.50).aspx и т.д. А до этого (очень давно) предлагалось использовать метод postLoad таблицы. (устарело, не используйте) Для display/edit методов было много чего придумано и сделано. Главный принцип - на AOS попадает каждая запись из запрашиваемой таблицы. В этом случае display/edit подход отлично работал. (тогда поддерживалось несколько движков баз данных, вплоть до DBF) но с версии ax3.0 в аксапту пришли групповые операции. И вообще, разработчики стали гораздо больше переносить тяжелые обработки на SQL-сервер. Начиная с ax3.0 поддерживаются только MS SQL и Oracle в качестве движков баз данных. а начиная с ax2012 - только MS SQL В условиях групповых операций подход с display/edit-методами работает не очень. Но пока вы не перешли на ax2012 других способов добавить вычислимое поле в форму или отчет нет. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Скорее не проблема, а фича, связанная с совместимостью со старыми версиями |
|
10.11.2012, 22:17 | #17 |
Участник
|
Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset Параметры и табличные переменные Цитата:
Сообщение от S.Kuskov
Мне кажется, что всё станет на свои места если до конца разобраться, в том что всётаки представляет из себя табличная переменная в аксапте?
Табличная переменная содержит либо ссылается на
|
|
12.11.2012, 15:36 | #18 |
Участник
|
ну, хорошо...
Цитата:
Сообщение от S.Kuskov
Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset Параметры и табличные переменные Допустим, запрос, это самый гибкий механизм выборки данных из базы данных в буфер переменной. Ок. Но, вот ведь какая штука. Произвольного вида запрос мы можем создать только на Х++. Возможности графического конструктора АОТ по этой части сильно ограничены. Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ. Что в этом случае делать? |
|
12.11.2012, 16:12 | #19 |
Участник
|
Далеко не произволного. В X++ сильно урезанная реализация SQL. Сложные запросы здесь принято разбивать на несколько вложенных. И под вложенными здесь я имею в виду не подчинённые, а независимые запросы выполняемые для вычисления промежуточного значения. Т.е. многие вещи реализовать "за один запрос" в аксапте просто нельзя.
Цитата:
Цитата:
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос". Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:19. |
|
12.11.2012, 16:30 | #20 |
Участник
|
Цитата:
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ? Цитата:
Можно ведь результаты выполнеия промежуточного запроса вывести во View... А потом использовать как датасорс для окончательного... ? |
|
Теги |
query, архитектура, как правильно |
|
|