На тестировании пользователи стали кричать, что нужно в 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 обрабатывать результаты перед сохранением.