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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.11.2018, 15:26   #1  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
указатели на таблицы и строки в таблице
Добрый день,

Помогите пожалуйста разобраться с одним нюансом в коде. Есть таблица журналов - JournalAzat и таблица строк - JournalStringsAzat. Есть функция которая при добавлении строки пересчитывет суммы полей sum(JournalStringsAzatCount), sum(JournalStringsAzatSum) и заносит их значения в таблицу журналов в соотвествующие поля. Функция выглдит так
PHP код:
public void CountFieldsJournalAzat()
{
    
JournalAzat             journalAzat;
    
JournalStringsAzat      journalStringsAzat;

    
select JournalIDAzatsum(JournalStringsAzatCount), sum(JournalStringsAzatSumfrom journalStringsAzat
       group by JournalIDAzat
        where this
.JournalIDAzat == journalStringsAzat.JournalIDAzat;


    
select forUpdate journalAzat
        where this
.JournalIDAzat == journalAzat.JournalIDAzat;

    
ttsBegin;
    
journalAzat.CountOfString   journalStringsAzat.JournalStringsAzatCount;
    
journalAzat.SumOfString     journalStringsAzat.JournalStringsAzatSum;
    
journalAzat.update();
    
ttsCommit;

не очень понятно следующее место
X++:
    select JournalIDAzat, sum(JournalStringsAzatCount), sum(JournalStringsAzatSum) from journalStringsAzat
       group by JournalIDAzat
        where this.JournalIDAzat == journalStringsAzat.JournalIDAzat;
this.JournalIDAzat - это указатель на строку которую я добавляю в данный момент времени в таблицу строк, верно?
journalStringsAzat.JournalIDAzat - а что тогда это? указатель на что?

Заранее спасибо за ответ.
Старый 21.11.2018, 15:44   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Логика-то понятная - вы отбираете все строки, которые относятся к тому же журналу, что и текущая
гораздо интереснее, почему вы делаете select forupdate вне границ транзакции
__________________
С уважением,
Вячеслав
За это сообщение автора поблагодарили: AzatGDC (1).
Старый 21.11.2018, 15:56   #3  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
спасибо за ответ. то есть получается что в данном случае
X++:
  select JournalIDAzat, sum(JournalStringsAzatCount), sum(JournalStringsAzatSum) from journalStringsAzat
       group by JournalIDAzat
        where this.JournalIDAzat == journalStringsAzat.JournalIDAzat;
select бежит по строкам и выбирает все строки, которые относятся к тому же журналу, что и текущая, как вы написали? Я думал влогике аксапты select выбирает только одну запись. в данном контексте получается отбирается не одно запись а множество?

за пределами транзакции сделал размышляя что перед обновлением строк я их должен выначале вытащить а потом обновить. это неверно?
Старый 21.11.2018, 16:22   #4  
Pokersky09 is offline
Pokersky09
Участник
 
43 / 60 (3) ++++
Регистрация: 15.11.2012
Адрес: Turkey
X++:
select sum(JournalStringsAzatCount), sum(JournalStringsAzatSum) from journalStringsAzat
        where journalStringsAzat.JournalIDAzat  == this.JournalIDAzat;
Результат будет тот же.
В данном случае из переменной this.JournalIDAzat сначало будет изьято значение, и оно уже передано как константа в условии запроса на сторону SQL.

На стороне SQL, в первую очередь будет выборка множества записей на основе условия where. Далее по ним будет суммирование по заданным полям. Результат будет в виде курсора на 1 строку, содержающую просуммированные значения в заданных полях.

Возвращать поле JournalIDAzat не имеет особого смысла, так как ого можно также получить из переменной this.JournalIDAzat .

P.s. Исходя из вашего логина, постфикс *Azat добавлен как отличительный знак. Это не есть BestPractice, дело конечно ваше. Также таблицу строк обычно называют JournalLines, или JournalDetails.
За это сообщение автора поблагодарили: AzatGDC (1).
Старый 21.11.2018, 16:43   #5  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
спасибо за подробные разъяснения. стало понятнее.
Цитата:
Сообщение от Pokersky09 Посмотреть сообщение


На стороне SQL, в первую очередь будет выборка множества записей на основе условия where. Далее по ним будет суммирование по заданным полям. Результат будет в виде курсора на 1 строку, содержающую просуммированные значения в заданных полях.
Получается что результатмо запроса будет одна строка? а сгруппированное поле JournalID также войдет в результирующую строку?
Старый 21.11.2018, 16:46   #6  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
Цитата:
Сообщение от Pokersky09 Посмотреть сообщение

Возвращать поле JournalIDAzat не имеет особого смысла, так как ого можно также получить из переменной this.JournalIDAzat .

P.s. Исходя из вашего логина, постфикс *Azat добавлен как отличительный знак. Это не есть BestPractice, дело конечно ваше. Также таблицу строк обычно называют JournalLines, или JournalDetails.
спасибо. учту. это тестовая среда и поэтому я добавил постфикс чтобы потом можно было удалить мои таблицы и прочие AOT элементы.
Старый 21.11.2018, 21:12   #7  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от pitersky Посмотреть сообщение
гораздо интереснее, почему вы делаете select forupdate вне границ транзакции
А какая разница ?
За это сообщение автора поблагодарили: trud (1).
Старый 22.11.2018, 07:39   #8  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от skuull Посмотреть сообщение
А какая разница ?
Разница в том, следовать священному писанию Best Practice или нет.
__________________
// no comments
Старый 22.11.2018, 11:11   #9  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
700 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от dech Посмотреть сообщение
Разница в том, следовать священному писанию Best Practice или нет.
На заборе тоже много чего написано Вы нам по-простому раскажите ну или автор сего утверждения может обьяснит.
Старый 22.11.2018, 13:29   #10  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от skuull Посмотреть сообщение
На заборе тоже много чего написано Вы нам по-простому раскажите ну или автор сего утверждения может обьяснит.
Если у таблицы отключена оптимистичная блокировка (OCCEnabled=false), то selectForUpdate транслируется в SQLный хинт UPDLOCK. Вне контекста транзакции, насколько я помню, он стартанет неявную (implicit) транзакцию БД. Я не знаю как это в Ax обрабатывается, Возможно и вправду неявная транзакция начнется (и это довольно катастрофично), возможно среде исполнения хватит соображения просто тупо проигнорировать selectForUpdate в случае таблицы с пессимистичным режимом блокирования. Но честно говоря, я не проверял.
Хотя для таблиц с оптимистической блокировкой, selectForUpdate и вправду синтаксический сахар.

Последний раз редактировалось fed; 22.11.2018 в 14:07.
За это сообщение автора поблагодарили: AzatGDC (1).
Старый 22.11.2018, 14:48   #11  
AzatGDC is offline
AzatGDC
Участник
 
27 / 14 (1) ++
Регистрация: 08.11.2018
можно еще пжлст один вопрос? как я понял из написанного выше select все таки возвращает множество записей. ОК. тогда получается следующий код вернет тоже множество записей?

X++:
select * from journalAzat
        where journalAzat.CountOfString > 133;
в моей таблице таких записей несколько отвечающих данному условию. получется мне вернется затем указатель на первую строку набора выбранных строк? подскажите плиз каким образом мне вывести потом эти строки? куда они записываются? Спасибо заранее за ответ.
Старый 23.11.2018, 12:28   #12  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
Я бы вам для понимание таких базовых вопросов посоветовал почитать книгу Еременко по ax 3.0 хотя бы. Там все очень доступно расписано, сэкономите свое время.
__________________
Существует 10 типов людей: одни понимают двоичную систему, другие - нет.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Аккуратнее! ValidateDelete() на таблице не всегда спасет. Pustik DAX: Программирование 10 16.03.2012 22:40
Обновление detail-таблицы DreamCreator DAX: Программирование 1 05.04.2005 15:57
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16
Query: 2 присоединенные таблицы 1:n Юлия Кузнецова DAX: Программирование 20 02.03.2005 16:15
Изменение цвета строки таблицы Maxim Gorbunov DAX: База знаний и проекты 0 28.11.2001 12:46

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:50.