|
|
#1 |
|
Участник
|
Добрый день!
Работаю с навижн совсем недавно. Появилась задача: Необходимо вывести отчет по товарам, перемещенным (в связи с ремонтом к примеру) из одного магазина в другой. Как делаю: в 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) Как в коде правильно просуммировать к-во перемещенных товаров?? |
|
|
|
|
#2 |
|
Участник
|
<ЧТО я делаю не так?>
1. Нужно проверить, а темповая ли это таблица. 2. С'инитить запись перед вставкой. 3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов |
|
|
|
|
#3 |
|
Участник
|
Спасибо
|
|
|
|
|
#4 |
|
Участник
|
Цитата:
Сообщение от VProk
<ЧТО я делаю не так?>
1. Нужно проверить, а темповая ли это таблица. 2. С'инитить запись перед вставкой. 3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов PS.в названии первичной таблицы ошибся.. правильно - item receipt line. И именно в ней ставлю фильтр по posting date. Также в ней есть поле Quantity (его нет в таблице Item), которое мне надо отобразить в отчете. В отчет также попадают имя и номер поставщика, имя и номер производителя, код товара и его имя - это уже из таблицы Item. (В item receipt line нет имени производителя и поставщика) С навижн неделю только работаю, поэтому не совсем понимаю о чем пишете. Можете привести рабочий пример? Был бы очень благодарен. |
|
|
|
|
#5 |
|
Участник
|
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; |
|
|
|
|
#6 |
|
Участник
|
Цитата:
Сообщение от 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;TmpItem.SETRANGE("No.", 'No.'); - одинарные ковычки и TmpItem."inventory" := Qty; - вместо поля типа Unit Price теперь никак понять не могу почему там где я все поля в коде для tmpitem заполняю (после TmpItem.INIT - если пишу TmpItem."Vendor Name":=Item."Vendor Name"; то мне в отчет пустые строки попадают??
|
|
|
|
|
#7 |
|
Участник
|
Цитата:
- строка с TmpItem."Vendor Name":=Item."Vendor Name" не нужна (т.к. и TmpItem и Item одна и та же таблица) - в том месте, где печатаете содержимое TmpItem надо прописать Код: TmpItem.CALCFIELDS("Vendor Name"); |
|
|
|
|
#8 |
|
Участник
|
Да, вы правы, думал calcfields для вычислений только используется.. всем спасибо за помощь.
|
|
|