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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2009, 15:52   #1  
Константин! is offline
Константин!
Участник
 
180 / 10 (1) +
Регистрация: 13.04.2005
Адрес: Казань
В версии 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=973:cu6520.fob]
[attachment=974:cu6520.txt]
Вложения
Тип файла: fob cu6520.fob (68.0 Кб, 384 просмотров)
Тип файла: txt cu6520.txt (39.0 Кб, 505 просмотров)
Старый 12.02.2009, 13:57   #2  
romtex_imported is offline
romtex_imported
Участник
 
66 / 10 (1) +
Регистрация: 06.12.2005
Честно говоря не знаю зачем столько кода. Для нахождения исходной операции по товарам достаточно функции из 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;
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:06.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.