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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.09.2014, 20:12   #1  
Vasa is offline
Vasa
Участник
 
5 / 10 (1) +
Регистрация: 25.09.2014
Добрый день!
Работаю с навижн совсем недавно. Появилась задача: Необходимо вывести отчет по товарам, перемещенным (в связи с ремонтом к примеру) из одного магазина в другой.
Как делаю: в report designer добавляю 2 таблицы:
- основная: item sales lines (возможно ошибаюсь в точном ее названии) - в ней задаю фильтры "по дате" - когда было перемещение и "по отделу".
- вложенная: item - из нее в отчет буду выводить - код товара и наименование и "количество перемещенного товара" (но т.к. этого поля в таблице нет, поэтому беру Quantity из таблицы item sales lines)
И вроде все ничего - но появилась необходимость "группировки записей" - т.е. избежать в отчете одинаковых записей товаров (и просуммировать их перемещенное количество). Сделать это возможно только программно. Делаю так:
1) создаю временную таблицу: в CAL Globals добавляю переменную tmpitem и ставлю ее свойство temporary(yes).
2) в свойствах item sales lines – сортировка по Item No.
3) в свойствах item – сортировка по No., взаимосвязь: No.=FIELD(Item No.)
4)добавляю код (в OnPreRecord item):
***********************************************************
IF Item.FINDSET THEN
REPEAT
// tmpItem - временная таблица, которая будет содерж. Сгруппир. записи
tmpItem.RESET;

// накладываю фильтр на записи, по которым хочу сделать группировку
tmpItem.setrange("No.",’No.’);

IF NOT tmpItem.FINDFIRST THEN BEGIN
// не нашел требуемое сочетание, добавляю запись
tmpItem := Item;
tmpItem.insert(FALSE)
END ELSE BEGIN
// нашел требуемое сочетание, группирую и суммирую
tmpItem.Inventory += item sales lines.Quantity; // в правильности не уверен
tmpItem.MODIFY(FALSE);
END;
UNTIL Item.NEXT = 0;
// по идее теперь во временной таблице д.б. сгруппированные записи, c проссумир. их Кол-вом
*****************************************************************

ВОПРОСЫ (ЧТО я делаю не так?):
1) когда находится одинаковый товар во временной таблице, выскакивает системная ошибка("товар под №№ уже существует"), причем в условие: END ELSE BEGIN (см.код) - программа НЕ переходит!!! Почему?????
2) Как в коде правильно просуммировать к-во перемещенных товаров??
Старый 26.09.2014, 09:25   #2  
VProk is offline
VProk
Участник
 
25 / 10 (1) +
Регистрация: 07.03.2007
<ЧТО я делаю не так?>

1. Нужно проверить, а темповая ли это таблица.
2. С'инитить запись перед вставкой.
3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов
Старый 26.09.2014, 10:48   #3  
Vasa is offline
Vasa
Участник
 
5 / 10 (1) +
Регистрация: 25.09.2014
Спасибо
Старый 26.09.2014, 10:49   #4  
Vasa is offline
Vasa
Участник
 
5 / 10 (1) +
Регистрация: 25.09.2014
Цитата:
Сообщение от VProk Посмотреть сообщение
<ЧТО я делаю не так?>

1. Нужно проверить, а темповая ли это таблица.
2. С'инитить запись перед вставкой.
3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов
VProk, смысл отчета в том, что перед его получением вводится дата (диапазон дат) за которую было перемещение.
PS.в названии первичной таблицы ошибся.. правильно - item receipt line. И именно в ней ставлю фильтр по posting date. Также в ней есть поле Quantity (его нет в таблице Item), которое мне надо отобразить в отчете.
В отчет также попадают имя и номер поставщика, имя и номер производителя, код товара и его имя - это уже из таблицы Item. (В item receipt line нет имени производителя и поставщика)

С навижн неделю только работаю, поэтому не совсем понимаю о чем пишете.
Можете привести рабочий пример? Был бы очень благодарен.
Старый 26.09.2014, 14:36   #5  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Vasa, вы пытаетесь в темповую таблицу записать данные в поле Inventory, оно флоуфилдовое и ничего не получится. В общем виде код должен выглядеть примерно так:
Код:
Item.RESET;
IF Item.FINDEST then
REPEAT
  TmpItem.RESET;
  TmpItem.SETRANGE("No.", "No.");
  IF NOT TmpItem.FINDFIRST then
  BEGIN
    Qty := 0;
    ItemRecLine.RESET;
    ItemRecLine.SETRANGE("Item No.", Item."No.");
    // накладываем доп. фильтры по дате и т.п.
    IF ItemRecLine.FINDFIRST then
    REPEAT
      Qty += ItemRecLine.Quantity;
    UNTIL ItemRecLine = 0;
    TmpItem.INIT;
    TmpItem."No."        := Item."No.";
    TmpItem."Unit Price" := Qty;        // используйте любое не флоуфилдовое поле DECIMAL 
    TmpItem.INSERT;
  END
UNTIL Item.Next = 0;
В данном случае модификация данных не нужна, т.к. вы сразу по товару все посчитаете.
Старый 26.09.2014, 18:14   #6  
Vasa is offline
Vasa
Участник
 
5 / 10 (1) +
Регистрация: 25.09.2014
Цитата:
Сообщение от Constantine Посмотреть сообщение
Vasa, вы пытаетесь в темповую таблицу записать данные в поле Inventory, оно флоуфилдовое и ничего не получится. В общем виде код должен выглядеть примерно так:
Код:
Item.RESET;
IF Item.FINDEST then
REPEAT
  TmpItem.RESET;
  TmpItem.SETRANGE("No.", "No.");
  IF NOT TmpItem.FINDFIRST then
  BEGIN
    Qty := 0;
    ItemRecLine.RESET;
    ItemRecLine.SETRANGE("Item No.", Item."No.");
    // накладываем доп. фильтры по дате и т.п.
    IF ItemRecLine.FINDFIRST then
    REPEAT
      Qty += ItemRecLine.Quantity;
    UNTIL ItemRecLine = 0;
    TmpItem.INIT;
    TmpItem."No."        := Item."No.";
    TmpItem."Unit Price" := Qty;        // используйте любое не флоуфилдовое поле DECIMAL 
    TmpItem.INSERT;
  END
UNTIL Item.Next = 0;
В данном случае модификация данных не нужна, т.к. вы сразу по товару все посчитаете.
Ясно, спасибо, разобрался, у было 2 проблемы:
TmpItem.SETRANGE("No.", 'No.'); - одинарные ковычки
и
TmpItem."inventory" := Qty; - вместо поля типа Unit Price

теперь никак понять не могу почему там где я все поля в коде для tmpitem заполняю (после TmpItem.INIT - если пишу TmpItem."Vendor Name":=Item."Vendor Name"; то мне в отчет пустые строки попадают??
Старый 26.09.2014, 18:44   #7  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Цитата:
Сообщение от Vasa Посмотреть сообщение
теперь никак понять не могу почему там где я все поля в коде для tmpitem заполняю (после TmpItem.INIT - если пишу TmpItem."Vendor Name":=Item."Vendor Name"; то мне в отчет пустые строки попадают??
Посмотрите свойства поля "Vendor Name": если FieldClass = FlowField, тогда:
- строка с TmpItem."Vendor Name":=Item."Vendor Name" не нужна (т.к. и TmpItem и Item одна и та же таблица)
- в том месте, где печатаете содержимое TmpItem надо прописать
Код:
TmpItem.CALCFIELDS("Vendor Name");
Старый 30.09.2014, 02:16   #8  
Vasa is offline
Vasa
Участник
 
5 / 10 (1) +
Регистрация: 25.09.2014
Да, вы правы, думал calcfields для вычислений только используется.. всем спасибо за помощь.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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