LOOP AT SCREEN, работа с экраном — новая идея

Устав от простыней в стиле:

я решил обкатать новый подход.

Первым делом декларативное определение, например:

Применение на практике сводится к следующему:

Пробую пока покатать-проверить, насколько такой подход применим в условиях, приближенным к боевым. Нужно больше мест применения, чтобы определить какой подход даст лучшую читаемость, компактность и проверяемость. И потихотньку можно добавить мяса.

 

Comment (1)

  1. Довольно интересный подход

    Подумал, что в дополнение

    Кроме задания маски с * для SCREEN-NAME хотелось бы использовать REGEX
    Указывать SCREEN-GROUP1
    Задавать непоредственно флаги SCREEN

    Код может выглядить вот так

     

    METHOD pbo.

    DATA(lv_for_f641)     = COND #( WHEN p_rtype = mc_r_type-f641 THEN ‘1’ ELSE ‘0’ ).
    DATA(lv_not_for_f641) = COND #( WHEN p_rtype = mc_r_type-f641 THEN ‘0’ ELSE ‘1’ ).

    » Change ready for input flag
    process_screen( VALUE t_screen_group(
    » Enabled and required for 641 GROUP
    group1   = ‘641’
    input    = lv_for_f641
    required = lv_for_f641 )

    » Reporting Period (always = ‘I’ other)
    ( name     = ‘PNPTIMED’
    input    = ‘0’ )

    » Payroll area
    *      ( name     = ‘PNPABKRS-LOW’ required = ‘1’ )

    » pn-begda & pn-endda enabled if NOT F641
    ( name   = ‘\bPNPBEGDA|\bPNPENDDA’
    input  = lv_not_for_f641 )
    ) ).

    ENDMETHOD.

     

     

    process_screen
    IMPORTING
    it_screen TYPE t_screen_group.

     

    METHOD process_screen.
    » Check fields of SCREEN with type CHAR1 (Flags as INPUT, ACTIVE …)
    DATA(lt_screen_fieldVALUE tttext255(
    FOR ls_comp IN CAST cl_abap_structdescrcl_abap_typedescr=>describe_by_name‘SCREEN’ )->components
    WHERE type_kind cl_abap_typedescr=>typekind_char AND length » <- char1
    ls_compname ).

    LOOP AT SCREEN INTO DATA(ls_scr_dest).
    » Have rule or not
    DATA(lv_changedCONV abap_boolabap_false ).

    LOOP AT it_screen ASSIGNING FIELDSYMBOL(<ls_screen_src>).
    » Name by mask
    IF <ls_screen_src>name IS NOT INITIAL.
    FIND REGEX ls_scr_destname IN <ls_screen_src>name.
    CHECK sysubrc 0.
    lv_changed lv_changed.

    » Check group1
    ELSEIF <ls_screen_src>group1 IS NOT INITIAL.
     CHECK ls_scr_destgroup1 <ls_screen_src>group1.

    » Specify NAME or GROUP1
    ELSE.
    CONTINUE.
    ENDIF.

    » Copy fields from source to dest
    LOOP AT lt_screen_field ASSIGNING FIELDSYMBOL(<lv_field>).
    ASSIGN COMPONENT <lv_field> OF STRUCTURE:
    <ls_screen_src> TO FIELDSYMBOL(<lv_src>),
    ls_scr_dest     TO FIELDSYMBOL(<lv_dest>).

    » ‘0’ Or ‘1’
    CHECK sysubrc AND <lv_src> IS NOT INITIAL.

    <lv_dest>  <lv_src>.
    lv_changed abap_true.
    ENDLOOP.
    ENDLOOP.

    » And change screen
    CHECK lv_changed abap_true.
    MODIFY SCREEN FROM ls_scr_dest.
    ENDLOOP.
    ENDMETHOD.

     

     

    Спасибо за блог!

Добавить комментарий

Ваш адрес email не будет опубликован.