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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.03.2008, 10:35   #1  
CasperSKY is offline
CasperSKY
Axapta Retail User
Аватар для CasperSKY
Axapta Retail User
 
53 / 10 (1) +
Регистрация: 22.02.2008
Не отрабатывает выборка
Уважаемые гуру аксы, столкнулсо с проблемкой .... попросили добавить в отчет сумму ндс, но так как НДС встречаются двух типов нужно определить каторый из них встретился...
X++:
display real  nds18()
{
  str nds  ;
  real nds18;
  ;
  while select SalesLine where
  salesLIne.SalesId==inventtrans.TRANSREFID
  {
  nds = salesline.TaxItemGroup;
  if (nds=='НДС18'){

  nds18 = SalesLine.LineAmount;
  }
  }
  return nds18 ;
}
За код ногами не пинать пока кодю как могу, вопрос в следующим доходит до строки while select SalesLine where и сразу прыгает на ретурн, почему не делает выборку понять немогу, сам запрос выполнял через QA работает нормально
Старый 31.03.2008, 10:43   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от CasperSKY Посмотреть сообщение
За код ногами не пинать пока кодю как могу, вопрос в следующим доходит до строки while select SalesLine where и сразу прыгает на ретурн, почему не делает выборку понять немогу, сам запрос выполнял через QA работает нормально
Почему не делает? Делает. Только таблицы inventTrans и SalesLine связаны совсем по другому полю - по лоту. Поэтому записей, удовтелворяющих вашему условию в Аксапте нет.
__________________
полезное на axForum, github, vk, coub.
Старый 31.03.2008, 10:48   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Кроме того:
Цитата:
Сообщение от CasperSKY Посмотреть сообщение
X++:
display real  nds18()
{
  while select ...
  {
    if (nds=='НДС18'){
      nds18 = SalesLine.LineAmount;
    }
  }
  return nds18 ;
}
1. Даже если вы поставите правильное условие, этот код вернет вам НДС ПОСЛЕДНЕЙ строки, а не НДС по всему заказу.
2. предельно внимательно относитесь к производительности display-методов. Обращение к базе данных (select) внутри display-метода скорее всего приведет к диким тормозам, если вы будете этот метод показывать в гриде.
3. SalesLine.LineAmount - это чистая сумма, сумма безо всяких налогов.
4. заказ бывает частично отгруженный. Поэтому обращение к SalesLine.LineAmount может выдать совсем не те суммы, которые будут в накладной, если эта строчка уже частично отгружена.
__________________
полезное на axForum, github, vk, coub.
Старый 31.03.2008, 10:52   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
И еще... Уж извините, но по вашему коду можно обучение проводить на тему "как не надо писать код в Аксапте"

Цитата:
Сообщение от CasperSKY Посмотреть сообщение
X++:
display real  nds18()
Никогда не используйте базовые типы для display- и edit-методов.
У вас будут проблемы с именованием, шириной, размещением и security...

Создайте EDT на базе наиболее подходящего типа и используйте только EDT в display- и edit-методах.
__________________
полезное на axForum, github, vk, coub.
Старый 31.03.2008, 11:17   #5  
CasperSKY is offline
CasperSKY
Axapta Retail User
Аватар для CasperSKY
Axapta Retail User
 
53 / 10 (1) +
Регистрация: 22.02.2008
суть не в том как он ее считает или не считает это выянить можно, суть в том что он не находит совпадений ... связаны они вроди всетаки по этим ид, проверял через квери аналайзер ... он отображает данные ...

вот так например:
X++:
display real nds18()
{

  str nds  ;
  real nds18;
  ;
  while select SalesLine where
    salesLIne.SalesId==inventtrans.TRANSREFID
   {
    nds = salesline.TaxItemGroup;
     if (nds=='НДС18')
     {
      nds18 += SalesLine.LineAmount;
     }
   }
     nds18 = (nds18*0.18)+nds18;
 return nds18 ;
}

Последний раз редактировалось CasperSKY; 31.03.2008 в 11:22.
Старый 31.03.2008, 11:19   #6  
CasperSKY is offline
CasperSKY
Axapta Retail User
Аватар для CasperSKY
Axapta Retail User
 
53 / 10 (1) +
Регистрация: 22.02.2008
я месяц назад увидел аксапту учусь как могу ... конкретно дисплей метод взят откуда то из стандартного метода ...

Последний раз редактировалось CasperSKY; 31.03.2008 в 11:22.
Старый 31.03.2008, 11:34   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Вот переписанный ваш запрос.
X++:
display SalesLineAmount nds18() // НИКАКИХ real. Только Extended Data Type = EDT
{

  TaxItemGroup nds; // НИКАКИХ str. Только Extended Data Type = EDT
  SalesLineAmount nds18; // НИКАКИХ real. Только Extended Data Type = EDT
  ;
  while select SalesLine where
    salesLIne.InventTransId==inventtrans.inventTransId
    && salesline.TaxItemGroup ==  'НДС18' // сразу сокращайте выборку, не надо тянуть с сервера лишние записи
   {
      nds18 += SalesLine.LineAmount;
   }
 return nds18 ;
}
а вот как вы его должны были написать
X++:
display SalesLineAmount nds18() // НИКАКИХ real. Только Extended Data Type = EDT
{

  TaxItemGroup nds; // НИКАКИХ str. Только Extended Data Type = EDT
  ;
  select sum(lineAmount) from SalesLine where
    salesLIne.InventTransId==inventtrans.inventTransId
    && salesline.TaxItemGroup ==  'НДС18' // сразу сокращайте выборку, не надо тянуть с сервера лишние записи
   ;
   nds18 = SalesLine.LineAmount;
   ....
 return nds18 ;
}
далее, таблица inventTrans в данном запросе явно лишняя...
но даже после такой модификации все равно написано плохо, поскольку в display-методах не должно быть обращений к базе.

Цитата:
Сообщение от CasperSKY Посмотреть сообщение
конкретно дисплей метод взят откуда то из стандартного метода ...
Не может такого быть!
__________________
полезное на axForum, github, vk, coub.
Старый 31.03.2008, 11:44   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от CasperSKY Посмотреть сообщение
вопрос в следующим доходит до строки while select SalesLine where и сразу прыгает на ретурн, почему не делает выборку понять немогу, сам запрос выполнял через QA работает нормально
И еще:
Определить поля связи можно следующим образом
1. Создайте новый запрос (Query) в АОТ
2. ДОбавьте в датасорс одну таблицу
3. Добавьте во вложенный датасорс вторую таблицу
4. у вложенной таблицы включите свойство Relation = Yes
5. Посмотрите какие relation создала Аксапта

Если relation не пояивлись, значит таблицы никак не связаны.
Если relation появился, то скорее всего это правильный relation. но учтите, что это возможно не самый оптимальный (таблицы могут быть связаны несколькими способами, ядро покажет первую попавшуюся)
Миниатюры
Нажмите на изображение для увеличения
Название: 1.gif
Просмотров: 380
Размер:	42.0 Кб
ID:	3330  
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: CasperSKY (1).
Старый 31.03.2008, 14:27   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
У вас возможно записи не выбираются, потому что вы используете переменные источников данных отчета, насколько я погляжу.
Во всяком случае, в методе у вас их не объявлено.
Старый 31.03.2008, 15:55   #10  
CasperSKY is offline
CasperSKY
Axapta Retail User
Аватар для CasperSKY
Axapta Retail User
 
53 / 10 (1) +
Регистрация: 22.02.2008
Всё заработало, как всегда .... всё дело во внимательности ... mazzy был прав

Последний раз редактировалось CasperSKY; 31.03.2008 в 15:58.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
MDX запрос, выборка за период. Вата DAX: Программирование 2 17.10.2008 14:34
Почему не отрабатывает update_recordset? breakpoint DAX: Программирование 17 25.06.2008 18:27
SalesLine.initFromSalesTable() - кроме журналов, никогда корректно не отрабатывает? gl00mie DAX: Программирование 2 23.01.2008 11:48
Долго отрабатывает запрос по таблице InventItemLocation AlexeyBP DAX: Администрирование 1 30.05.2007 17:33
не отрабатывает запрос к View LedgerBalances loka DAX: Программирование 4 31.05.2006 16:01

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

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

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