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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.11.2012, 14:35   #41  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
С таблицами дело обстоит чуть по другому. Содание таблицы в AOT порождает появление нового типа данных в X++. Этот новый табличный тип представляет собой наследника системного класса xRecord. Дальше вы правы, выполнение команды "select" приводит к изменению состояния табличной переменной. Каждое выбранное из БД значение поместится в соответствующее поле табличной переменной.
... и все-таки, ничо не понимаю.

Вот, есть представления традиционной ориентации.
Есть таблица в БД, есть рекордсет.
Берем таблицу и с помощью оператора select набираем записи из таблицы в рекордсет.

Теперь Аксапта.
Есть таблица в БД.
Дальше Аксапта знает про эту таблицу в БД и структуру этой таблицы держит у себя в качестве типа объекта в виде элемента АОТ. Так?

Дальше мы объявляем переменную с типом данной таблицы.
Что при этом происходит?
Мы создаем в памяти только пустую структуру этой таблицы или уже структуру, заселенную данными?

Дальше самое интересное.
Применяем оператор select.
Результатом его работы должен быть рекордсет.
Так этот самый рекордсет куда складывается?
В нашу пустую объявленную переменную или еще куда-то?

Создается впечатление, что складывается как раз в нашу же переменную.
Но, это же какой-то бардак получается.

То есть, объявлением переменной с типом таблицы, мы создаем копию таблицы или пустой рекордсет?
Если, допустим, пустой рекордсет "r" , то странным выглядит синтаксическая конструкция "select r;", потому как, вроде бы, "r" должен быть не операндом операции select, а ее результатом.

Вот, когда мы, например, в АОТе открываем форму таблицы, где показывается содержание таблицы, что происходит?

И еще.
Вот мы создали в АОТе таблицу.
А потом используем ее, например, в качестве датасорса для датасета, используемого дальше в портале.
Допустим, я хочу к тому моменту, когда таблица будет использоваться в качестве дата сорса, произвести некоторые вычисления и положить результат их в одно из полей таблицы.
Какое событие нужно использовать и какой метод таблицы лучше перекрывать для размещения кода вычислений?
Старый 10.11.2012, 15:44   #42  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
Цитата:
Сообщение от 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   #43  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
2 Narayana
Цитата:
Сообщение от lvan Посмотреть сообщение
возьмите книжку для начинающих по аксапте и прочтите первую главу про таблицы и запросы, если книжка хорошая, там есть ответы на все ваши вопросы
Narayana,

Повторяю :
- вы не умеете формулировать вопросы. Под этим подразумевается ровно то, что вы не умеете задавать вопросы так, чтобы люди, знающие предмет (в отличии от вас.. сори..) готовы были бы на этот вопрос ответить.
- это ровно ваша проблема, лечится ликбезом.. книжками )
- ваши экзсерсисы на тему "а я это так вижу" - никому, кроме вас самого, неинтересны.. например, я это вижу по-другому.. и что?
__________________
Best Regards,
Roman
Старый 10.11.2012, 16:34   #44  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Narayana,

Повторяю :
- вы не умеете формулировать вопросы. Под этим подразумевается ровно то, что вы не умеете задавать вопросы так, чтобы люди, знающие предмет (в отличии от вас.. сори..) готовы были бы на этот вопрос ответить.
- это ровно ваша проблема, лечится ликбезом.. книжками )
- ваши экзсерсисы на тему "а я это так вижу" - никому, кроме вас самого, неинтересны.. например, я это вижу по-другому.. и что?
Вы, вообще, не умеете с людьми разговаривать, но ведь разговариваете же.
Если вам не интересно, не читайте.
Старый 10.11.2012, 16:39   #45  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Мдя... тяжелый случай
__________________
Best Regards,
Roman
Старый 10.11.2012, 18:10   #46  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от Narayana Посмотреть сообщение
.
Вот, есть представления традиционной ориентации.
Есть таблица в БД, есть рекордсет.
Берем таблицу и с помощью оператора select набираем записи из таблицы в рекордсет.
Абсолютно не факт.
Все зависит от реализации клиента, который подает команду. Может выбираем в рекордсет на клиенте, может просто открываем серверный курсор, может просто определяем структуру рекордсета.
В любом случае, для разработчика это просто некоторое действие, которым можно пользоваться, внутренняя реализация для разработчика прикладной части абсолютно по барабану. Подробности могут заинтересовать только системного разработчика, который, например, реализовывает низкоуровневый доступ к конкретной системе.
Цитата:
Теперь Аксапта.
Есть таблица в БД.
Дальше Аксапта знает про эту таблицу в БД и структуру этой таблицы держит у себя в качестве типа объекта в виде элемента АОТ. Так?
Можно сказать и так
Цитата:
Дальше мы объявляем переменную с типом данной таблицы.
Что при этом происходит?
Мы создаем в памяти только пустую структуру этой таблицы или уже структуру, заселенную данными?
Какая разница,что при этом происходит? Это все проблемы Аксы. Явно данными эта структура пока не заполнена, а уж что там выделяется - просто ссылка на область памяти или эта область памяти будет выделена при первом обращении, что там в этой области памяти, может быть просто резервируется какой-либо хендл для доступа к объектам - прикладного программиста это волновать вообще не должно.
Цитата:
Дальше самое интересное.
Применяем оператор select.
Результатом его работы должен быть рекордсет.
Так этот самый рекордсет куда складывается?
В нашу пустую объявленную переменную или еще куда-то?
Создается впечатление, что складывается как раз в нашу же переменную.
Но, это же какой-то бардак получается.
Опять же, техническая реализация Вас волновать не должна. Может быть данные сразу передаются в рекордсет клиента, может быть серверный курсор выдает данные по мере потребности (если включить профайлер на MS SQL, то для конкретных случаев будет все понятно, но зачем эта информация кроме тех случаев, когда производите тонкую настройку производительности?)
Цитата:
То есть, объявлением переменной с типом таблицы, мы создаем копию таблицы или пустой рекордсет?
Ничего Вы не создаете, Вы просто объявляете переменную. Что при этом дулает Акса: выделяет память ли ждут обращения к переменной, Вас волновать не должно.
Цитата:
Если, допустим, пустой рекордсет "r" , то странным выглядит синтаксическая конструкция "select r;", потому как, вроде бы, "r" должен быть не операндом операции select, а ее результатом.
Как уже сказано, ничего не создается. А конструкция это просто особенность синтаксиса, применяемого в Аксе. Его просто нужно знать, как синтаксис LINQ тоже в первое время может казаться странным, но потом понимаешь, что вроде все логично. Я часто создаю хранимые процедуры и функции в MS SQL. понимаю, что синтаксис Аксы немного своеобразный, но это не составляет проблемы - нужно просто знать и понимать как что использовать.
Цитата:
...
У Вас там еще много всего. Просто следует отделять функциональный подход стандарта SQL и процедурную реализацию доступа к данным в разных клиентах.
Не только в Аксе, но и в dot.net, в OBDC и т.п. есть определенные соглашения о том, как использовать доступ к данным. При это разработчика прикладных решений не касаются внутренние реализации механизмов. Конечно, понимать общие принципы необходимо хотя бы с точки зрения быстродействия.
За это сообщение автора поблагодарили: RVS (3), AlexeyS (2).
Старый 10.11.2012, 22:17   #47  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset
Параметры и табличные переменные
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Мне кажется, что всё станет на свои места если до конца разобраться, в том что всётаки представляет из себя табличная переменная в аксапте?

Табличная переменная содержит либо ссылается на
  • табличный буфер (временный либо постоянный)
  • запрос который был применён к этому табличному буферу
  • текущую строку (текущую позицию курсора в этом запросе)
  • текущие значения полей текущей строки
  • оригинальные значения полей текущей строки (common.orig())
  • флаги-параметры, влияющие на работу с курсором
  • возможно ещё что-то
Старый 11.11.2012, 00:13   #48  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
В любом случае, для разработчика это просто некоторое действие, которым можно пользоваться, внутренняя реализация для разработчика прикладной части абсолютно по барабану. Подробности могут заинтересовать только системного разработчика, который, например, реализовывает низкоуровневый доступ к конкретной системе.
+100500
===
А началось-то - с чего? Просто парень хотел суммируемое поле на форму подвесить.. в ШареПойнт...

Море юмора.. в этом мире
__________________
Best Regards,
Roman

Последний раз редактировалось RVS; 11.11.2012 в 00:27.
Старый 12.11.2012, 15:24   #49  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от lvan Посмотреть сообщение
возьмите книжку для начинающих по аксапте и прочтите первую главу про таблицы и запросы, если книжка хорошая, там есть ответы на все ваши вопросы
Можно подумать, что книжек по Аксапте великое множество.
Увы, ни у Еременко, ни в "Аксапта изнутри", ни в хелпе по Аксапте нет слов, которые могли бы удовлетворить полностью.
Эти слова есть в 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.
Старый 12.11.2012, 15:36   #50  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
ну, хорошо...
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Narayana, боюсь окончательно вас запутать, но просто чтобы вы понимали - в аксапте табличные переменные присутствуют ещё с тех времён, когда аксата ещё не была продуктом Microsoft. Поэтому говорить о "традиционности" не приходится.
В аксапте табличная переменная - это больше чем просто recordset
Параметры и табличные переменные
Благодаря вашим подсказкам мне удалось изменить свое представление о табличных переменных до вполне удовлетворительного, но дальше...

Допустим, запрос, это самый гибкий механизм выборки данных из базы данных в буфер переменной. Ок.
Но, вот ведь какая штука.
Произвольного вида запрос мы можем создать только на Х++.
Возможности графического конструктора АОТ по этой части сильно ограничены.

Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ.

Что в этом случае делать?
Старый 12.11.2012, 15:40   #51  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Конечно, понимать общие принципы необходимо хотя бы с точки зрения быстродействия.
...и не только с точки зрения быстродействия.
А вам не кажется, что это ваше последнее утверждение несколько противоречит всему, что вы написали выше?
Старый 12.11.2012, 16:12   #52  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Произвольного вида запрос мы можем создать только на Х++.
Далеко не произволного. В X++ сильно урезанная реализация SQL. Сложные запросы здесь принято разбивать на несколько вложенных. И под вложенными здесь я имею в виду не подчинённые, а независимые запросы выполняемые для вычисления промежуточного значения. Т.е. многие вещи реализовать "за один запрос" в аксапте просто нельзя.

Цитата:
Сообщение от Narayana Посмотреть сообщение
Возможности графического конструктора АОТ по этой части сильно ограничены.
Отнюдь.
Цитата:
Сообщение от Narayana Посмотреть сообщение
Моя задача в этом случае (создать вычислимое поле во View) остается нерешенной, потому что, даже построив удовлетворяющий меня запрос в коде Х++, я не могу этот запрос перенести как сохраненный в АОТ.
Любой запрос, который можно построить программно, можно собрать и мышкой в AOT.
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос".

Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:19.
Старый 12.11.2012, 16:30   #53  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Любой запрос, который можно построить программно, можно собрать и мышкой в AOT.
Это хорошие новости.
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ?

Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Друго дело что в вашей формулировке вы и на X++ не сможете получить нужные вам данные "за один запрос".
Ну, это, вроде, ничего.
Можно ведь результаты выполнеия промежуточного запроса вывести во View... А потом использовать как датасорс для окончательного... ?
Старый 12.11.2012, 16:35   #54  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
А как в графическом конструкторе сделать "field3 = mytable.field1 + mytable.field2;" ?
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.

Не уверен, но может если так прямо и написать в значение выражение в скобках...
Сейчас попробовал. Получилось

Последний раз редактировалось S.Kuskov; 12.11.2012 в 16:51.
Старый 12.11.2012, 16:45   #55  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.
Не совсем мышкой, конечно.. Например, в одном из запросов в AOT у нас когда-то был сделан следующий фильтр на поле RecId (прям в поле Value прописано):
Цитата:
((custTransOpen_1.AccountNum == custTransOpen.AccountNum) && (((custTransOpen_1.AmountCur>0) && (custTransOpen.AmountCur<0)) || ((custTransOpen_1.AmountCur<0) && (custTransOpen.AmountCur>0)))
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 12.11.2012, 23:58   #56  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Амм... Погорячился. Извините. Как реализовать http://www.axaptapedia.com/Expressions_in_query_ranges мышкой в AOT не знаю.

Не уверен, но может если так прямо и написать в значение выражение в скобках...
Сейчас попробовал. Получилось
Угумс, понятно.

Если можно, прошу вас прояснить еще один момент.

Вот, допустим, у нас есть запрос произвольной форме, написанный на Х++, в котором в цикле с помощью метода next() из класса QueryRun выбираются записи какой-то таблицы.

qr = new QueryRun(q);
while(qr.next())
{
//do something

}


Наверное, для того, чтобы производить вычисления в полях таблицы во время выборки ее записей в буфер табличной переменной, правильно эти вычисления подставлять вместо //do something.

А если мы строим запрос в АОТе?
В коде мы объявили переменную qr для запроса.
Но в АОТе-то мы никаких переменных при построении запроса не объявляли.

Нам что, нужно перекрыть какой-нибудь метод запроса, чтобы произвести вычисления так же, как в коде Х++?
А какой тогда?
Но, для того, чтобы вызвать метод, нам еще и переменную нужно объявить, но переменная с произвольным именем, вроде бы, должна быть новым экземпляром класса и при этом, скорее всего, отличным от того экзепляра, который был создан в АОТ и названия переменной которого мы не знаем...

RVS, спокойно, не волнуйтесь...!

Последний раз редактировалось Narayana; 13.11.2012 в 00:03.
Старый 13.11.2012, 08:10   #57  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Narayana Посмотреть сообщение
Наверное, для того, чтобы производить вычисления в полях таблицы во время выборки ее записей в буфер табличной переменной, правильно эти вычисления подставлять вместо //do something.
Верно. Только с одной поправкой. Вычисления эти будут происходить не "во время", а "после" выборки очередной записи в буфер табличной переменной. Они [вычисления] непосредственно над этим выбранным буфером и будут происходить.
Цитата:
Сообщение от Narayana Посмотреть сообщение
А если мы строим запрос в АОТе?
Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something.

Именно это ограничение я и имел в виду когда говорил о том что многие вещи "за один запрос" не решаются.
Стандартных выхода (о которых вам уже в этой ветке не раз говорили) два:
1) либо максимально отсрочить окончательные расчёты и перенести их на сторону интерфейсной части (display-методы)
2) либо, если вычисление требуется не в конце, а в середине процесса сбора данных, создавать вспомогательные таблицы, в которые складировать промежуточный результат.

Последний раз редактировалось S.Kuskov; 13.11.2012 в 08:33.
За это сообщение автора поблагодарили: lev (3).
Старый 13.11.2012, 09:41   #58  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от Narayana Посмотреть сообщение
RVS, спокойно, не волнуйтесь...!
Ну, вот.. обозвали, практически.. земляным червяком

Narayana,

Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ) очень интересно читать.

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

Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу.

Можно в личку
__________________
Best Regards,
Roman
Старый 13.11.2012, 12:48   #59  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от RVS Посмотреть сообщение
Ну, вот.. обозвали, практически.. земляным червяком

Narayana,

Не волнуюсь, нисколько. Инициируемые вами обсуждения (ответы в основном.. не вопросы ) очень интересно читать.

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

Если нетрудно - напишите, вкратце, что конкретно вы хотите получить в результате, в Axapta. Чем смогу - помогу.

Можно в личку
Да, я че? Я ничо...!
Но, если будете обижать маленьких, буду применять "метод упреждающего возмездия"
Старый 13.11.2012, 12:51   #60  
Narayana is offline
Narayana
Участник
 
241 / 100 (4) +++++
Регистрация: 05.01.2009
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Верно. Только с одной поправкой. Вычисления эти будут происходить не "во время", а "после" выборки очередной записи в буфер табличной переменной. Они [вычисления] непосредственно над этим выбранным буфером и будут происходить.

Narayana, невозможно do something запихнуть в текст SQL запроса. Query, как уже говорилось, не содержит обрабатываемые данные, Query хранит только текст запроса. У него не предусмотренно никаких методов постобработки данных, потому что никакие данные он не обрабатывает. Данные обрабатывает QueryRun. Query только описывает какие данные будут доступны QueryRun'у и к сожалению это описание не предусматривает даже декларативного описания вычисляемых полей, не говоря уже о возможности процедурного вычисления do something.

Именно это ограничение я и имел в виду когда говорил о том что многие вещи "за один запрос" не решаются.
Стандартных выхода (о которых вам уже в этой ветке не раз говорили) два:
1) либо максимально отсрочить окончательные расчёты и перенести их на сторону интерфейсной части (display-методы)
2) либо, если вычисление требуется не в конце, а в середине процесса сбора данных, создавать вспомогательные таблицы, в которые складировать промежуточный результат.
м-м-м... э-э-э...
А я попробовал сделать вот такой примерчик, дак, вроде бы, в нем удалось запихнуть вычисления внутрь запроса. Только почему-то результаты не сохраняются в поле баланса. Наверное какое-нибудь волшебное слово типа update() надо в правильное место поставить?

X++:
static void Job2(Args _args)
{
Query q;
QueryRun qr;
QueryBuildDatasource qbds1, qbds2;
QueryBuildRange qbr;
EmplCommissionWageEndBalance a;
;
q = new Query();
qbds1 = q.addDataSource(tablenum(EmplCommissionWageEndBalance));
qr = new QueryRun(q);
while(qr.next())
{
a = qr.get(tableNum(EmplCommissionWageEndBalance));
a.EndBalanceMST = a.SumOfAmountMST_In - a.SumOfAmountMST_Out;
print "сотр = ", a.EmplId, " сюда = ", a.SumOfAmountMST_In, " отсюда ", a.SumOfAmountMST_Out, " баланс ", a.EndBalanceMST;
pause;
}
}

Кажется, понятно, почему они вместо переменных для ссылки на таблицы используют системные номера таблиц. Как раз затем, чтобы обойти проблему с областью видимости таблицы...!

Последний раз редактировалось Narayana; 13.11.2012 в 12:55.
Теги
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, время: 06:27.