Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Январь 20, 2008, 10:25:55 pm
-
Полезная штука, если материалы ведутся в различных величинах и приходится их туда сюда перекидывать, можно конечно и самому это дело пересчитать, но можно и воспользоваться стандартной функциональностью. Интересной особенностью данного модуля является такой прикол, что смоделировать его работу, воспользовавшись в SE37 кнопкой F8 - Тестировать/Выполнить, у меня не получилось ни в 4.6, 4.7, ни в 6.0 выдает типа не правильный ввод. Вообще я так понимаю проблема в том поля количеств объявлены как:
REFERENCE(PI_QUANTITY_SRC) DEFAULT 0
и
VALUE(PE_QUANTITY_DST)
без указания типов, вот тестирование и не прокатывает. А так вообще конечно работает. Для примера пришлось накидать типа программки:
report yuukrul_test.
data: l_matnr like mseg-matnr,
l_quantity_dst like mseg-menge,
l_quantity_src like mseg-menge.
catch system-exceptions conversion_errors = 1.
l_matnr = 'KXXX00000000000001'.
l_quantity_src = '415'. "1 PAL = 315 ST
call function 'MATERIAL_CONVERT_QUANTITY'
exporting
pi_material_src = l_matnr
pi_meinh_src = 'ST'
pi_quantity_src = l_quantity_src
pi_material_dst = l_matnr
pi_meinh_dst = 'PAL'
importing
pe_quantity_dst = l_quantity_dst
exceptions
wrong_call = 1
material_not_found = 2
no_conversion = 3
others = 4.
endcatch.
write: / l_quantity_dst.
pi_material_src - Код исходного материала для пересчета
pi_meinh_src - Единицы измерения исходные
pi_quantity_src - Количество исходного материала
pi_material_dst - Код материала в который выполняется пересчет
pi_meinh_dst - Единицы измерения материала пересчета
pe_quantity_dst - Пересчитанное количество
В общем виде модуль позволяет пересчитывать количества материала 1 в материал 2 например, но если материал 1 = материал 2, то получается пересчет для одного материала, например из базовых величин в закупаемые и т.д. Особенностью является то, что коды единиц измерения надо задавать в том как они объявлены в системе, например ШТ, это вообще-то ST. Где это можно посмотреть, ну есть табличка T006 - Единицы измерения. Вот там и смотрим, ну это если вы с экрана читаете значения, а если из таблиц, то там уже самое собой никаких штук нет, там и будут наши ST.
-
Однако пришлось тут ускорять кое какие процессы, чтобы работали шустрее, а поэтому пришлось заменить вызов функции пересчета единиц измерения на свою небольшую процедурку. В общем виде конечно, это не полный аналог пересчета одних единиц измерения материала в другие. Это скажем так пересчет из базовых единиц измерения в заданные. Само собой коэффициенты пересчета должны быть заданы в описании ОЗМ.
В принципе если нужно, то можно дожать до пересчета из одних альтернативных единиц измерения в другие альтернативные. Мне было пока не надо, но думаю дописать это будет не сложно.
*&---------------------------------------------------------------------*
*& Form CONVERT_BASE_QUANTITY
*&---------------------------------------------------------------------*
* Пересчет единиц измерения материала
*----------------------------------------------------------------------*
* -->P_MATNR - Код материала для пересчета
* -->P_NISTM - Количество в базовых ЕдИзм
* -->P_MEINS_2 - Единица измерения пересчетная
* <--P_QUANT_DST - Пересчитанное количество в P_MEINS_2
* <--P_QUANT_ODDS_DST - Остаток от пересчитанного количества в базе
*----------------------------------------------------------------------*
FORM convert_base_quantity USING p_matnr
p_nistm
p_meins_dst
CHANGING p_quant_dst
p_quant_odds_dst.
DATA: l_marm_dst LIKE marm,
lt_marm LIKE marm OCCURS 1.
SELECT * INTO TABLE lt_marm
FROM marm WHERE matnr = p_matnr.
READ TABLE lt_marm INTO l_marm_dst WITH KEY meinh = p_meins_dst.
l_marm_dst-umrez = l_marm_dst-umrez / l_marm_dst-umren.
* Пересчитать единицы измерения запаса
p_quant_dst = p_nistm DIV l_marm_dst-umrez.
p_quant_odds_dst = p_nistm MOD l_marm_dst-umrez.
ENDFORM. " CONVERT_BASE_QUANTITY
PS: В оригинале вот этот кусок вообще-то был вынесен за процедуру, чтобы уменьшить повторные четения БД:
SELECT * INTO TABLE lt_marm
FROM marm WHERE matnr = p_matnr.
Ну и само собой чтение внутренней таблички было сделано по ключу чуток другому
READ TABLE lt_marm INTO l_marm_dst
WITH KEY matnr = p_matnr
meinh = p_meins_dst.
-
p_quant_odds_dst - Это неделимый остаток в базовых единицах измерения... ну мне по ходу задачи оно было надо тоже ;)
-
что бы не казалась тема как бы немножко не законченной, я "дожал" до пересчета из одних единиц в другие
form z_convert_quantity USING p_matnr
p_quant_src
p_meins_src "пересчитываемая ед. изм
p_meins_dst "в которую пересчитывать
CHANGING p_quant_dst
p_quant_odds_dst.
DATA: l_marm_dst LIKE marm,
l_marm_src LIKE marm,
zumrez TYPE marm-umrez,
zumren TYPE marm-umren,
lt_marm LIKE marm OCCURS 1.
SELECT * INTO TABLE lt_marm
FROM marm WHERE matnr = p_matnr.
READ TABLE lt_marm INTO l_marm_src WITH KEY meinh = p_meins_src.
READ TABLE lt_marm INTO l_marm_dst WITH KEY meinh = p_meins_dst.
zumrez = l_marm_src-umrez * l_marm_dst-umren.
zumren = l_marm_dst-umrez * l_marm_src-umren.
* Пересчитать единицы измерения запаса
p_quant_dst = zumrez DIV zumren.
p_quant_odds_dst = zumrez MOD zumren.
endform. " z_convert_quantity
-
СПАСИБО! Очень пригодилось!