25.09.2014, 20:12 | #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) Как в коде правильно просуммировать к-во перемещенных товаров?? |
|
26.09.2014, 09:25 | #2 |
Участник
|
<ЧТО я делаю не так?>
1. Нужно проверить, а темповая ли это таблица. 2. С'инитить запись перед вставкой. 3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов |
|
26.09.2014, 10:48 | #3 |
Участник
|
Спасибо
|
|
26.09.2014, 10:49 | #4 |
Участник
|
Цитата:
Сообщение от VProk
<ЧТО я делаю не так?>
1. Нужно проверить, а темповая ли это таблица. 2. С'инитить запись перед вставкой. 3. Неясен смысл самого отчета. Зачем городить огород, если можно пройтись сразу по всем товарам с флоуфильтрацией по складу и скалкфилдить количество, не привязываясь к датам и т.п. В конце концов, остатки всегда считаются по товарным операциям, а не по строкам документов PS.в названии первичной таблицы ошибся.. правильно - item receipt line. И именно в ней ставлю фильтр по posting date. Также в ней есть поле Quantity (его нет в таблице Item), которое мне надо отобразить в отчете. В отчет также попадают имя и номер поставщика, имя и номер производителя, код товара и его имя - это уже из таблицы Item. (В item receipt line нет имени производителя и поставщика) С навижн неделю только работаю, поэтому не совсем понимаю о чем пишете. Можете привести рабочий пример? Был бы очень благодарен. |
|
26.09.2014, 14:36 | #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; |
|
26.09.2014, 18:14 | #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"; то мне в отчет пустые строки попадают?? |
|
26.09.2014, 18:44 | #7 |
Участник
|
Цитата:
- строка с TmpItem."Vendor Name":=Item."Vendor Name" не нужна (т.к. и TmpItem и Item одна и та же таблица) - в том месте, где печатаете содержимое TmpItem надо прописать Код: TmpItem.CALCFIELDS("Vendor Name"); |
|
30.09.2014, 02:16 | #8 |
Участник
|
Да, вы правы, думал calcfields для вычислений только используется.. всем спасибо за помощь.
|
|