20.02.2013, 13:23 | #1 |
Участник
|
Здравствуйте! Помогите пожалуйста советом. За год с небольшим в справочнике товаров было создано n-ое количество
дублей товаров в силу разных причин. Теперь когда подошли к планированию закупок и продаж эти дубли стали камнем преткновения. Существует ли какой нибудь метод объединения позиций в справочнике? Объединение с переносом всех операций и т.д. Мне посоветовали сделать следующим образом: Item1.SETFILTER("No.",'73437'); Item2.SETFILTER("No.",'73438'); IF Item1.FINDFIRST THEN IF Item2.FINDFIRST THEN BEGIN Item1.DELETE(FALSE); Item2.RENAME('73437'); END; Но этот метод не работает так как по второй команде выскакивает много ошибок о существующих записях с кодом товара 73438 Выскакивает ошибка в единицах измерения, в точке коррекции себестоимости. Конечно можно удалять записи, но чувствую, что это не выход. Так как можно удалить чего нибудь лишнего. Заранее всем благодарен. |
|
20.02.2013, 15:36 | #2 |
Участник
|
Как вариант, занулить остаток по дублированной позиции (Через журнал товаров - Расход). Оприходовать на оставшуюся позицию по сумме и количеству. Сделать коррекцию себестоимости и удалить карточку дубля.
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
20.02.2013, 15:43 | #3 |
Участник
|
Спасибо за ответ, но к сожалению речь идет про тысячи. А в ручном режиме это года пол, если ошибок нигде не сделаешь.
|
|
20.02.2013, 17:19 | #4 |
Участник
|
Цитата:
Надеюсь у вас резервов то хотя бы нет на эти товары? |
|
20.02.2013, 19:18 | #5 |
Участник
|
В резервах могут быть и на транзитных складах и в ячейках! Вот такой
|
|
20.02.2013, 19:18 | #6 |
Участник
|
Вот такой тихий ужас....
|
|
20.02.2013, 20:19 | #7 |
Участник
|
В общем кому интересно то решилось это созданием отчета На базе таблицы Item:
DataItemTable=Table27; OnPreDataItem=BEGIN Item.SETRANGE("No.",OldItemCode1); END; OnAfterGetRecord=VAR ItemLocal@1101970000 : Record 27; BEGIN IF (OldItemCode1 <> '') AND (NewItemCode <> '') THEN WITH Item DO BEGIN ItemLocal.GET(NewItemCode); TempItem.INIT; TempItem.TRANSFERFIELDS(ItemLocal); ItemLocal.DELETE; BinContent.RESET; BinContent.SETRANGE("Item No.",OldItemCode1); BinContent.DELETEALL; ItemUnitOfMeasure.RESET; ItemUnitOfMeasure.SETRANGE("Item No.",OldItemCode1); ItemUnitOfMeasure.DELETEALL; AvgCostAdjmtEntryPoint.RESET; AvgCostAdjmtEntryPoint.SETRANGE("Item No.",OldItemCode1); AvgCostAdjmtEntryPoint.DELETEALL; SalesPrice.RESET; SalesPrice.SETRANGE("Item No.",OldItemCode1); SalesPrice.DELETEALL; ItemItemGroup.RESET; ItemItemGroup.SETRANGE("Item No.",OldItemCode1); ItemItemGroup.DELETEALL; IF RENAME(NewItemCode) THEN BEGIN TRANSFERFIELDS(TempItem); MODIFY; END ELSE BEGIN TempItem.INSERT; END; END; END; } Некоторые таблицы не из стандартной конфигурации (Sales price, ItemItemGroup). Но работает отлично и вроде корректно. Соединяет товары вместе с операциями. Всем спасибо за ответы. |
|
20.02.2013, 20:36 | #8 |
Участник
|
Эх, на самом деле там много глубже...((. Поверьте и никогда не трогайте товарные операции нестандартными способами. (Даже в стандарте, нет сжатия товарных операций и подобных манипуляций).
На вскидку одни ГТД после данной функции улетят в ...
__________________
--------------------------------------------------------------------------------------------- "Собрать стадо из баранов легко, трудно собрать стадо из кошек" Профессор Сергей Капица |
|
21.02.2013, 10:02 | #9 |
Участник
|
Спорить не буду! Тестирование проводил на тестовой базе, мне показалось что сработало корректно. На сколько я понял функция RENAME переименовывает ключ и переименовывает во всех связанных таблицах. Вот тут вопрос на сколько глубоко, она это делает. Тестирование продолжается потом отпишусь о результатах.
|
|
27.02.2013, 00:39 | #10 |
Участник
|
2 года назад была проблема с дублежами товаров/клиентов/брендов/..
Сделал еще тогда (сейчас наверное скажи написать на память - не смогу) код, который "мержит" данные. Сейчас полной БД нет, чтобы достать объект, поэтому пишу почти полную МОЮ (ненужное - просто выкинуть) часть кода: Цитата:
OnAfterGetRecord=VAR
Cust@1210000 : Record 18; BEGIN IF (OldCustomer <> '') AND (NewCustomer <> '') THEN WITH Customer DO BEGIN Cust.GET(NewCustomer); CommentLineTmp.RESET; CommentLineTmp.DELETEALL; CommentLine.RESET; CommentLine.SETRANGE("Table Name", CommentLine."Table Name"::Customer); CommentLine.SETRANGE("No.", Cust."No."); IF CommentLine.FINDFIRST THEN REPEAT CommentLineTmp.INIT; CommentLineTmp.TRANSFERFIELDS(CommentLine); CommentLineTmp.INSERT; CommentLine.DELETE; UNTIL CommentLine.NEXT = 0; TmpCustomer.INIT; TmpCustomer.TRANSFERFIELDS(Cust); Cust.DELETE; IF DefaultDimension.GET(DATABASE::Customer, OldCustomer, 'LAND') THEN BEGIN TmpDefaultDimension.INIT; TmpDefaultDimension.TRANSFERFIELDS(DefaultDimension); DefaultDimension.DELETE; END; IF GUIALLOWED THEN Window.UPDATE(1, Text002); IF RENAME(NewCustomer) THEN BEGIN TRANSFERFIELDS(TmpCustomer); MODIFY; IF GUIALLOWED THEN Window.UPDATE(1, Text003); IF CommentLineTmp.FINDFIRST THEN BEGIN CommentLine.SETRANGE("No.", "No."); IF CommentLine.FINDLAST THEN LineNo := CommentLine."Line No." ELSE LineNo := 0; REPEAT LineNo += 10000; CommentLine.INIT; CommentLine.TRANSFERFIELDS(CommentLineTmp); CommentLine."Line No." := LineNo; CommentLine.INSERT; UNTIL CommentLineTmp.NEXT = 0; END; END ELSE BEGIN TmpCustomer.INSERT; TmpDefaultDimension.INSERT; IF GUIALLOWED THEN Window.UPDATE(1, Text004); IF CommentLineTmp.FINDFIRST THEN REPEAT CommentLine.INIT; CommentLine.TRANSFERFIELDS(CommentLineTmp); CommentLine.INSERT; UNTIL CommentLineTmp.NEXT = 0; END; SLEEP(200); END; END; |
|
27.02.2013, 00:41 | #11 |
Участник
|
Удалил дубляж - была 404 ошибка и обновил страницу. В итоге вставилось 2 раза.
Прошу модеров удалить данное сообщение |
|