11.02.2009, 15:52 | #1 |
Участник
|
В версии 5.1 появилась такая полезная вещь как Трассировка товаров (Производство - История - Трассировка товаров). По ней можно посмотреть из какой партии был произведен расход в удобной древовидной форме. Но она работает исходя из названия только с товарами, где есть лоты или серийные номера. У меня на проекте ни того, ни другого не используется, по этому я решил заставить работать этот функционал для обыкновенных товаров без трассировки. Прошу не судить строго, но возможно это кому-то пригодиться.
Тестирование Кода на товарах с лотами или серийными номерами не производилось. Нужно сделать следующие изменения в коде: cu6520 функция FirstLevel(VAR TempTrackEntry... исходный код Код: ItemLedgEntry.SETFILTER("Lot No.",LotNoFilter); ItemLedgEntry.SETFILTER("Serial No.",SerialNoFilter); ItemLedgEntry.SETFILTER("Item No.",ItemNoFilter); ItemLedgEntry.SETFILTER("Variant Code",VariantFilter); Код: IF LotNoFilter<>'' THEN//ctaga ItemLedgEntry.SETFILTER("Lot No.",LotNoFilter); IF SerialNoFilter <>'' THEN//ctaga ItemLedgEntry.SETFILTER("Serial No.",SerialNoFilter); IF ItemNoFilter<>'' THEN//ctaga ItemLedgEntry.SETFILTER("Item No.",ItemNoFilter); IF VariantFilter<>'' THEN//ctaga ItemLedgEntry.SETFILTER("Variant Code",VariantFilter); Код: FirstLevelEntries.ASCENDING(Direction = Direction::Forward); IF FirstLevelEntries.FIND('-') THEN REPEAT ItemLedgEntry.GET(FirstLevelEntries."Item Ledger Entry No."); IF (ItemLedgEntry."Serial No." <> '') OR (ItemLedgEntry."Lot No." <> '') THEN BEGIN//ctaga ItemLedgEntry2 := ItemLedgEntry; // Test for Reclass IF (Direction = Direction::Backward) AND (ItemLedgEntry."Entry Type" = ItemLedgEntry."Entry Type"::Transfer) AND NOT ItemLedgEntry.Positive THEN BEGIN ItemApplnEntry.RESET; ItemApplnEntry.SETCURRENTKEY("Outbound Item Entry No."); ItemApplnEntry.SETRANGE("Outbound Item Entry No.",ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Item Ledger Entry No.",ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Transferred-from Entry No.",0); IF ItemApplnEntry.FIND('-') THEN BEGIN ItemApplnEntry.SETFILTER("Item Ledger Entry No.",'<>%1',ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Transferred-from Entry No.",ItemApplnEntry."Inbound Item Entry No."); IF ItemApplnEntry.FIND('-') THEN BEGIN ItemLedgEntry2.RESET; IF NOT ItemLedgEntry2.GET(ItemApplnEntry."Item Ledger Entry No.") THEN ItemLedgEntry2 := ItemLedgEntry; END; END; END; IF SearchCriteria = SearchCriteria::Item THEN ItemLedgEntry2.SETRANGE("Item No.",ItemLedgEntry."Item No."); TransferData(ItemLedgEntry2,TempTrackEntry); IF InsertRecord(TempTrackEntry,0) THEN BEGIN FindComponents(ItemLedgEntry2,TempTrackEntry,Direction,ShowComponents,ItemLedgEntry2."Entry No."); NextLevel(TempTrackEntry,TempTrackEntry,Direction,ShowComponents,ItemLedgEntry2."Entry No."); END; END; Код: FirstLevelEntries.ASCENDING(Direction = Direction::Forward); IF FirstLevelEntries.FIND('-') THEN REPEAT ItemLedgEntry.GET(FirstLevelEntries."Item Ledger Entry No."); //IF (ItemLedgEntry."Serial No." <> '') OR (ItemLedgEntry."Lot No." <> '') THEN BEGIN//ctaga ItemLedgEntry2 := ItemLedgEntry; // Test for Reclass IF (Direction = Direction::Backward) AND (ItemLedgEntry."Entry Type" = ItemLedgEntry."Entry Type"::Transfer) AND NOT ItemLedgEntry.Positive THEN BEGIN ItemApplnEntry.RESET; ItemApplnEntry.SETCURRENTKEY("Outbound Item Entry No."); ItemApplnEntry.SETRANGE("Outbound Item Entry No.",ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Item Ledger Entry No.",ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Transferred-from Entry No.",0); IF ItemApplnEntry.FIND('-') THEN BEGIN ItemApplnEntry.SETFILTER("Item Ledger Entry No.",'<>%1',ItemLedgEntry2."Entry No."); ItemApplnEntry.SETRANGE("Transferred-from Entry No.",ItemApplnEntry."Inbound Item Entry No."); IF ItemApplnEntry.FIND('-') THEN BEGIN ItemLedgEntry2.RESET; IF NOT ItemLedgEntry2.GET(ItemApplnEntry."Item Ledger Entry No.") THEN ItemLedgEntry2 := ItemLedgEntry; END; END; END; IF SearchCriteria = SearchCriteria::Item THEN ItemLedgEntry2.SETRANGE("Item No.",ItemLedgEntry."Item No."); TransferData(ItemLedgEntry2,TempTrackEntry); IF InsertRecord(TempTrackEntry,0) THEN BEGIN FindComponents(ItemLedgEntry2,TempTrackEntry,Direction,ShowComponents,ItemLedgEntry2."Entry No."); NextLevel(TempTrackEntry,TempTrackEntry,Direction,ShowComponents,ItemLedgEntry2."Entry No."); END; //END;////ctaga функция ExitLevel(TempTrackEntry : Record "Item Tracing Buffer") : Boolean исходный код Код: WITH TempTrackEntry DO BEGIN IF ("Serial No." = '') AND ("Lot No." = '') THEN EXIT(TRUE); IF CurrentLevel > 50 THEN EXIT(TRUE); IF NOT SpecificTracking("Item No.","Serial No.","Lot No.") THEN EXIT(TRUE); END; EXIT(FALSE); Код: WITH TempTrackEntry DO BEGIN { IF ("Serial No." = '') AND ("Lot No." = '') THEN EXIT(TRUE); }//ctaga IF CurrentLevel > 50 THEN EXIT(TRUE); {IF NOT SpecificTracking("Item No.","Serial No.","Lot No.") THEN EXIT(TRUE);}//ctagaEND; EXIT(FALSE); [attachment=974:cu6520.txt] |
|
12.02.2009, 13:57 | #2 |
Участник
|
Честно говоря не знаю зачем столько кода. Для нахождения исходной операции по товарам достаточно функции из 7 строк:
GetFistItemEntry(ItemEntryNo : Integer) Result : Integer ItemLedgerEntry.GET(ItemEntryNo); IF ItemLedgerEntry."Entry Type" = ItemLedgerEntry."Entry Type" :: Transfer THEN BEGIN ItemAppEntry.RESET; ItemAppEntry.SETRANGE("Item Ledger Entry No.",ItemEntryNo); IF ItemAppEntry.FIND('-') THEN Result := GetFistItemEntry(ItemAppEntry."Transferred-from Entry No."); END ELSE Result := ItemEntryNo; |
|