A method that checks values against the fixed values or value table of a data element.
method check_if_value_fits_to_domval.
types: begin of ty_buffer,
rollname type rollname,
value type string,
valid type abap_bool,
end of ty_buffer,
tty_buffer type hashed table of ty_buffer with unique key rollname value.
statics: st_buffer type tty_buffer.
data: ls_dom type dd01v,
lv_field_value type char10 ##needed.
field-symbols: <ls_buffer> like line of st_buffer.
try.
r_does_fit = st_buffer[ rollname = rollname
value = value ]-valid.
\"we can exit the method if the combination was found in the buffer.
return.
catch cx_sy_itab_line_not_found.
\"create new buffer entry.
insert value #( rollname = rollname
value = value ) into table st_buffer assigning <ls_buffer>.
\"and we assume the value is valid.
<ls_buffer>-valid = abap_true.
endtry.
try.
data(lr_elem) = cast cl_abap_elemdescr( cl_abap_typedescr=>describe_by_name( rollname ) ).
data(lt_fixed_values) = lr_elem->get_ddic_fixed_values( ).
\"check against fixed values of the domain.
if lt_fixed_values is not initial and not line_exists( lt_fixed_values[ low = value ] ).
<ls_buffer>-valid = abap_false.
r_does_fit = <ls_buffer>-valid.
return.
endif.
data(l_dfies) = lr_elem->get_ddic_field( ).
call function 'DDIF_DOMA_GET'
exporting
name = l_dfies-domname
* STATE = 'A'
* LANGU = ' '
importing
* GOTSTATE =
dd01v_wa = ls_dom
* TABLES
* DD07V_TAB =
exceptions
illegal_input = 1
others = 2.
if sy-subrc <> 0.
endif.
\"there is a value table in the domain.
if ls_dom-entitytab is not initial.
data(lr_struc) = cast cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( ls_dom-entitytab ) ).
data(lt_fields) = lr_struc->get_ddic_field_list( ).
\"determine key field
loop at lt_fields into data(ls_key_field)
where keyflag = abap_true
and datatype <> 'CLNT'.
exit.
endloop.
\"if we didn't find anything the table may have just the client as key.
if sy-subrc <> 0.
loop at lt_fields into ls_key_field
where keyflag = abap_true.
exit.
endloop.
endif.
\"key fields determined
if ls_key_field is not initial.
\"create the WHERE clause
data(l_where) = |{ ls_key_field-fieldname } = '{ value }'|.
\"and select from the DB.
try.
select single (ls_key_field-fieldname) into lv_field_value
from (ls_dom-entitytab)
where (l_where).
\"if we didn't find anything
\"set the valid flag and exit.
if sy-subrc <> 0.
<ls_buffer>-valid = abap_false.
r_does_fit = <ls_buffer>-valid.
return.
endif.
catch cx_sy_dynamic_osql_error ##no_handler.
endtry.
endif.
endif.
catch cx_sy_move_cast_error ##no_handler.
endtry.
r_does_fit = <ls_buffer>-valid.
endmethod.