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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.06.2004, 17:28   #1  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
расчет ИТОГО по колонке темповой таблицы
Доброго времени суток!
Существует времення таблица RMETmpSubLotLog
Необходимо реализовать контроль ввода значений в поле amount.
Правило проверки
select sum(amount) from tmp;
if (tmp.Amount >= element.getLimit())
Сумма по колонке (полю) не должна превышать определенного значения.
Проблема в том, что select sum(amount) from tmp не учитывает новое введенное значение, а только лишь старые данные, введенные за одну операцию до этого.
Проверка реализована в методе validate соответствующего DataSourc-a (RMETmpSubLotLog_ds.cursor()) Как решить проблему, подскажите! =)


PHP код:
public boolean validate() {
  
boolean ret;
  
RMETmpSubLotLog tmp;
  ;
  
ret super();
  
tmp.setTmpData(RMETmpSubLotLog_ds.cursor());
  
select sum(amountfrom tmp;  // return sum   = before modification!!!
  
if (tmp.Amount >= element.getLimit()) {
    
box::info('Overflow limit''Info');
    
retrun false;
  }

  return 
ret;

Старый 11.06.2004, 17:35   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
А если присуммировать новое введенное значение? Что получиться?
Старый 11.06.2004, 17:44   #3  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Не подходит, пробовал =)
Пример:
есть три строки со значениями в поле amount 10,20,30
я добавляю новую строчку со значением 15 , прибавляю ее к сумме (старых значений) получаю sum(10,20,30) + 15 =.75. Все хорошо, все бъет. Но вот если я ИЗМЕНЯЮ сужествующую строку, к примеру строку со значением 10 меняю на 5, то получаю (10,20,30) + 5 = 65 , а должно 55!
Старый 11.06.2004, 17:53   #4  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Можно попробовать к сумме прибавить выражение
<новое_значение_поля> - <старое_значение_поля>,
где старое значение поля добывается через orig().
__________________
Андрей.
Старый 11.06.2004, 17:57   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
В принципе, все логично. SUM берет данные, которые уже есть в таблице. validate() вызывается до внесения изменений в таблицу, стало быть Вашего значения там нет еще. Отнимайте от суммы старое значение, если оно есть, и добавляйте новое.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 11.06.2004, 17:58   #6  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Привет!

Я бы попробовал перечитать курсор:
PHP код:
RMETmpSubLotLog_ds.research(); 
А если можно - вообще бы отказался от использования временной таблицы.
__________________
С уважением,
Андрей Беседин
Старый 11.06.2004, 17:59   #7  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
PHP код:
public boolean validate() {
  boolean ret false;
  RMETmpSubLotLog tmp;
  ;
  ret super();
  tmp.setTmpData(RMETmpSubLotLog_ds.cursor());
  select sum(amountfrom tmp;  // return sum   = before modification!!!
  if (tmp.orig().Amount tmp.Amount >= element.getLimit()) {
    return checkfailed('Overflow limit');
  }
  return ret;

А так?
Старый 11.06.2004, 19:26   #8  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
С миру по нитке ...
Получилось :
PHP код:
 public boolean validate() {
  
boolean ret false;
  
RMETmpSubLotLog tmp;
  ;
  
ret super();
  
RMETmpSubLotLog_ds.research();
  
tmp.setTmpData(RMETmpSubLotLog_ds.cursor());

  
select sum(amountfrom tmp;  // return sum   = before modification!!!
   
if (tmp.Amount >= 100) {
      return 
checkfailed('Overflow limit');
   }

  return 
ret;

Теперь код правильно считает сумму, но появилась новая фича - скидывается значение amount первой строки в гриде, а не того в который ввели
т.e. было три строки 10,20,30 ... проверка на превышение 100 .... ввожу строку четвертую 2000, код правильно ругается, но сбрасывает в ноль первую строку в гриде (к примеру 10 )... Как побороть?
P.S. А чем плохи временные таблицы? Я их использую для того, что бы данные попадали в базу не построчно, а пачкой =)) Хотелось отвязать базу от интерфейса...
2 George Nordic
Может я делал что-то не так, но Ваш код не сработал так мне необходимо ..
Старый 11.06.2004, 20:04   #9  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Вот этот код работает, так как я задумывал .....
Остался последний вопрос: как отключить сортировку в гриде ?
(чтобы добавлялась запись в конец и не сортировалась в зависимости от значения)

PHP код:
public boolean validate() {
  
boolean ret false;
  
RMETmpSubLotLog tmp,curRecord;
  
int recId;
  ;
  
ret super();
  
recId tmpSubLot.RecId;
  
RMETmpSubLotLog_ds.research();
  
tmp.setTmpData(RMETmpSubLotLog_ds.cursor());
  
curRecord.setTmpData(RMETmpSubLotLog_ds.cursor());
  
select sum(amountfrom tmp;  // return sum   = before modification!!!
  
select  curRecord where curRecord.recid == recId;
  
RMETmpSubLotLog_ds.findRecord(curRecord);
   if (
tmp.Amount >= 100) {
      return 
checkfailed('Overflow limit');
   }
  return 
ret;

P.S.
Замысловато получилось ...=(( А можно ли решить такую задачу проще? Я имею в виду контроль суммы по колонке.
Старый 11.06.2004, 20:54   #10  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
В примере Georde Nordic надо заменить строчку на
PHP код:
if (RMETmpSubLotLog.Amount RMETmpSubLotLog.orig().Amount tmp.Amount  >= element.getLimit()) { 
__________________
Андрей.
Старый 15.06.2004, 14:16   #11  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
2 ATimTim
Привет!
Временные таблицы - это очень плохо. Начать с того, что хранится это дело на диске (клиента или сервера - зависит от места первой вставки). "Индексный" поиск по временным таблицам нагружает процессор АОС или клиента. Далее, иногда очень часто лажаются селекты по временным таблицам.
Еще: в 3-х уровневой среде возможны серьезные замедления, связанные с "прояжкой" таблицы между клиентом и сервером.
То ли дело RecordSortedList или MAP (зависит от области применения) - милое дело!
__________________
С уважением,
Андрей Беседин
Старый 19.07.2005, 10:22   #12  
mvf is offline
mvf
Участник
 
52 / 10 (1) +
Регистрация: 18.04.2005
Адрес: Новосибирск
Лимит по колонке обычной таблицы
Здравствуйте!
Мне нужно выполнить такюже задачку, только на обычной таблице
Просмотрела данную тему и возникли вопросы:
1. Как решение такой задачки отличается от решения на темповой таблице?
2. Что скрывается под методом getLimit()? (Можно код?)
3. И вопрос, не относящийся к этой теме: как на int-поле установить значение по умолчанию?

Буду благодарна за развернутые ответы.
Заранее спасибо
Старый 19.07.2005, 11:49   #13  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
1. Решение особо не отличается, но, естественно, не надо заморачиваться со всякими setTmpData().
2. Метод произвольным образом высчитывает и возвращает предел значения по колонке. Сам код его не особо важен, хоть return 100;
3. Значения по умолчанию лучше всего устанавливать в методе initValue() таблицы или DS.
__________________
Андрей.
Старый 19.07.2005, 11:59   #14  
mvf is offline
mvf
Участник
 
52 / 10 (1) +
Регистрация: 18.04.2005
Адрес: Новосибирск
Спасибо, Dron AKA andy.
Буду пробовать...
Старый 19.07.2005, 15:03   #15  
Pasha_x is offline
Pasha_x
Участник
 
6 / 10 (1) +
Регистрация: 12.08.2004
Адрес: Москва
Thumbs up
Спасибо за информацию. Мне пример ATimTim пригодился очень.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16
Как решить проблему с правами на вновь создаваемые записи таблицы. AY DAX: Прочие вопросы 4 02.10.2003 12:44
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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