На тестировании пользователи стали кричать, что нужно в OM в инфотипе 1222 «Общие атрибуты» сделать проверку на значения, если они берутся из справочника. Например, мы прицепили справочник единиц расчета в виде атрибута. Но по стандарту, можно выбрать любое другое значение и система никак не проверит это. Для исправления ситуации есть несколько вариантов решения. Вот одно из них.
В таблице T77OMATTUS для поля CHECK_FB прописываем ФМ, который будет осуществлять проверку в PAI логике инфотипа. У меня это ZHCM_ATTRIBUTES_VALCK. Выглядит он так:
function ZHCM_ATTRIBUTES_VALCK.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(SCENARIO) TYPE OM_ATTRSCN
*" VALUE(ATTRIB) TYPE OM_ATTRIB
*" VALUE(CHECK) TYPE OM_ATTRVAL
*" EXPORTING
*" REFERENCE(MESSAGE) TYPE HRRHAD_MSG
*" EXCEPTIONS
*" VALUE_ERROR
*"----------------------------------------------------------------------
DATA: wa_t77omattr TYPE t77omattr.
FIELD-SYMBOLS: LIKE t77omattr-REFSTRUCT.
FIELD-SYMBOLS: LIKE t77omattr-REFFIELD.
DATA: i type i.
DATA: attrib_value TYPE OM_ATTRVAL.
DATA: where_cond TYPE string.
attrib_value = check.
if attrib_value is initial.
exit.
endif.
SELECT SINGLE * FROM t77omattr INTO wa_t77omattr
WHERE attrib = attrib.
if sy-subrc <> 0.
exit.
endif.
ASSIGN wa_t77omattr-REFSTRUCT TO .
ASSIGN wa_t77omattr-REFFIELD TO .
CONCATENATE ‘ = »’ attrib_value »» into where_cond.
select count( * ) from (wa_t77omattr-REFSTRUCT)
INTO i
WHERE (where_cond).
if sy-subrc <> 0.
message-msgid = ‘ZHCM_OM’.
message-msgty = ‘E’.
message-msgno = ‘001’.
message-msgv1 = attrib.
message id ‘ZHCM_OM’ type ‘E’ number ‘001’ with attrib.
* RAISE value_error.
endif.
endfunction.
Так как я давно не кодил, то написано криво, если кто предложит более элегантное решение, то всегда буду благодарен!
Суть простая — если в таблице t77omattr для атрибута прописана проверочная таблица (не HRT1222-LOW), то мы идем в эту таблицу и ищем значение. Если найдено, то все хорошо, если нет, то выдаем ошибку. Ошибка нарочно выдается внутри этого ФМ, Так как вызывающий эти проверки старший модуль RH_OM_ATTRIBUTE_VALUE_CHECK делает одну гадость.
CALL FUNCTION -check_fb
EXPORTING
scenario = scenario
attrib = attrib
check = value
IMPORTING
message = l_msg
EXCEPTIONS
OTHERS = 4.
IF sy-subrc NE 0.
IF l_msg-msgid IS INITIAL OR
l_msg-msgty IS INITIAL OR
l_msg-msgno IS INITIAL.
l_msg-msgid = ‘5AT’.
l_msg-msgty = ‘W’.
l_msg-msgno = ‘144’.
ENDIF.
Если вы в нашем ФМ ставит тип ошибки ‘E’, то система покажет ее как предупреждение (желтым) и даст сохранить неверное значение. Почему так сделано, я не понял.
Для атрибутов, у которых прописаны домены в качестве проверки, такой ФМ работать не будет. Да и не нужен он там, система сама проверяет значение по домену.
Для еще большей строгости можно написать свое средство поиска для атрибута, а также в BADi обрабатывать результаты перед сохранением.
One Comment
Calm
Спасибо! Это пригодится.