dynamic generate shlp dialog (#520)

* dynamic generate shlp dialog 

a first take on dynamic generate shlp dialog

* Update src/z2ui5_cl_xml_view.clas.abap

Co-authored-by: Lars Hvam <larshp@hotmail.com>

* abaplint fixes

* abaplint fixes

---------

Co-authored-by: Lars Hvam <larshp@hotmail.com>
Co-authored-by: oblomov <102328295+oblomov-dev@users.noreply.github.com>
This commit is contained in:
choper725 2023-09-01 10:28:59 +03:00 committed by GitHub
parent 6951a7fe5f
commit 5521615b01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1914,6 +1914,21 @@
RETURNING RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_xml_view. VALUE(result) TYPE REF TO z2ui5_cl_xml_view.
METHODS generate_ddic_shlp
IMPORTING
!irparent TYPE REF TO Z2UI5_CL_XML_VIEW
!resultitabname TYPE clike OPTIONAL
!shlpfieldsstrucname TYPE clike OPTIONAL
!irclient TYPE REF TO z2ui5_if_client OPTIONAL
!resultitabevent TYPE clike OPTIONAL
!closebuttontext TYPE clike OPTIONAL
!searchbuttontext TYPE clike OPTIONAL
!searchevent TYPE clike OPTIONAL
!isshlp TYPE any OPTIONAL
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_xml_view.
PROTECTED SECTION. PROTECTED SECTION.
DATA mv_name TYPE string. DATA mv_name TYPE string.
@ -2822,6 +2837,285 @@ CLASS Z2UI5_CL_XML_VIEW IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD generate_ddic_shlp.
TYPES:
BEGIN OF ty_ddshfprop,
fieldname(30) TYPE c,
shlpinput(1) TYPE c,
shlpoutput(1) TYPE c,
shlpselpos(2) TYPE n,
shlplispos(2) TYPE n,
shlpseldis(1) TYPE c,
defaultval(21) TYPE c,
END OF ty_ddshfprop.
TYPES:
BEGIN OF ty_ddfields,
tabname(30) TYPE c,
fieldname(30) TYPE c,
langu(1) TYPE c,
position(4) TYPE n,
offset(6) TYPE n,
domname(30) TYPE c,
rollname(30) TYPE c,
checktable(30) TYPE c,
leng(6) TYPE n,
intlen(6) TYPE n,
outputlen(6) TYPE n,
decimals(6) TYPE n,
datatype(4) TYPE c,
inttype(1) TYPE c,
reftable(30) TYPE c,
reffield(30) TYPE c,
precfield(30) TYPE c,
authorid(3) TYPE c,
memoryid(20) TYPE c,
logflag(1) TYPE c,
mask(20) TYPE c,
masklen(4) TYPE n,
convexit(5) TYPE c,
headlen(2) TYPE n,
scrlen1(2) TYPE n,
scrlen2(2) TYPE n,
scrlen3(2) TYPE n,
fieldtext(60) TYPE c,
reptext(55) TYPE c,
scrtext_s(10) TYPE c,
scrtext_m(20) TYPE c,
scrtext_l(40) TYPE c,
keyflag(1) TYPE c,
lowercase(1) TYPE c,
mac(1) TYPE c,
genkey(1) TYPE c,
noforkey(1) TYPE c,
valexi(1) TYPE c,
noauthch(1) TYPE c,
sign(1) TYPE c,
dynpfld(1) TYPE c,
f4availabl(1) TYPE c,
comptype(1) TYPE c,
lfieldname(132) TYPE c,
ltrflddis(1) TYPE c,
bidictrlc(1) TYPE c,
outputstyle(2) TYPE n,
nohistory(1) TYPE c,
ampmformat(1) TYPE c,
END OF ty_ddfields.
DATA: lv_grid_form_no TYPE i,
lt_arg TYPE STANDARD TABLE OF string WITH EMPTY KEY,
lv_arg_fieldname TYPE string,
lv_cell_fieldname TYPE string,
lv_path_result_itab TYPE string,
lv_path_shlp_fields TYPE string,
lt_fieldprop_sel TYPE STANDARD TABLE OF ty_ddshfprop WITH EMPTY KEY,
lt_fieldprop_lis TYPE STANDARD TABLE OF ty_ddshfprop WITH EMPTY KEY,
lt_ddffields TYPE STANDARD TABLE OF ty_ddfields WITH EMPTY KEY.
FIELD-SYMBOLS:
<lt_result_itab> TYPE ANY TABLE,
<ls_shlp_fields> TYPE any,
<lv_field> TYPE any.
* ---------- Get result itab reference ------------------------------------------------------------
lv_path_result_itab = 'IRCONTROLLER->' && resultitabname.
ASSIGN (lv_path_result_itab) TO <lt_result_itab>.
* ---------- Get searchhelp input fields structure reference --------------------------------------
lv_path_shlp_fields = 'IRCONTROLLER->' && shlpfieldsstrucname.
ASSIGN (lv_path_shlp_fields) TO <ls_shlp_fields>.
IF <lt_result_itab> IS NOT ASSIGNED OR
<ls_shlp_fields> IS NOT ASSIGNED.
RETURN.
ENDIF.
IF isshlp IS INITIAL.
RETURN.
ELSE.
ASSIGN COMPONENT 'FIELDPROP' OF STRUCTURE isshlp TO FIELD-SYMBOL(<fs_fieldprop>).
IF <fs_fieldprop> IS NOT ASSIGNED.
RETURN.
ENDIF.
ENDIF.
* ---------- Set Selection and List properties ----------------------------------------------------
lt_fieldprop_sel = <fs_fieldprop>.
lt_fieldprop_lis = <fs_fieldprop>.
DELETE lt_fieldprop_sel WHERE shlpselpos IS INITIAL.
DELETE lt_fieldprop_lis WHERE shlplispos IS INITIAL.
SORT lt_fieldprop_sel BY shlpselpos.
SORT lt_fieldprop_lis BY shlplispos.
ASSIGN COMPONENT 'FIELDDESCR' OF STRUCTURE isshlp TO FIELD-SYMBOL(<fs_isshlp_fielddescr>).
IF <fs_isshlp_fielddescr> IS NOT ASSIGNED.
RETURN.
ENDIF.
lt_ddffields = <fs_isshlp_fielddescr>.
* -------------------------------------------------------------------------------------------------
*Searchfield Grid
* -------------------------------------------------------------------------------------------------
DATA(lr_grid_shlp) = irparent->content( )->toolbar( )->toolbar_spacer(
)->button( text = searchbuttontext
type = 'Emphasized'
press = irclient->_event( searchevent ) )->get_parent(
)->grid( 'L3 M3 S3' )->content( 'layout' ).
* ---------- Create 4 forms (grid columns) --------------------------------------------------------
DATA(lr_form_shlp_1) = lr_grid_shlp->simple_form( )->content( 'form' ).
DATA(lr_form_shlp_2) = lr_grid_shlp->simple_form( )->content( 'form' ).
DATA(lr_form_shlp_3) = lr_grid_shlp->simple_form( )->content( 'form' ).
DATA(lr_form_shlp_4) = lr_grid_shlp->simple_form( )->content( 'form' ).
LOOP AT lt_fieldprop_sel ASSIGNING FIELD-SYMBOL(<ls_fieldprop_sel>).
* ---------- Init loop data -----------------------------------------------------------------------
UNASSIGN: <lv_field>.
* ---------- Get corresponding field description --------------------------------------------------
ASSIGN lt_ddffields[ fieldname = <ls_fieldprop_sel>-fieldname ] TO FIELD-SYMBOL(<ls_fielddescr>).
IF <ls_fielddescr> IS NOT ASSIGNED.
CONTINUE.
ENDIF.
* ---------- Get field reference ------------------------------------------------------------------
ASSIGN COMPONENT <ls_fielddescr>-fieldname OF STRUCTURE <ls_shlp_fields> TO <lv_field>.
IF <lv_field> IS NOT ASSIGNED.
CONTINUE.
ENDIF.
* ---------- Determine grid form number -----------------------------------------------------------
IF lv_grid_form_no IS INITIAL.
lv_grid_form_no = 1.
ELSEIF lv_grid_form_no = 4.
lv_grid_form_no = 1.
ELSE.
lv_grid_form_no = lv_grid_form_no + 1.
ENDIF.
CASE lv_grid_form_no.
WHEN 1.
* ---------- Grid 1--------------------------------------------------------------------------------
* ---------- Set field label ----------------------------------------------------------------------
lr_form_shlp_1->label( <ls_fielddescr>-scrtext_l ).
* ---------- Set input field ----------------------------------------------------------------------
CASE <ls_fielddescr>-datatype.
WHEN 'DATS'.
lr_form_shlp_1->date_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN 'TIMS'.
lr_form_shlp_1->time_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN OTHERS.
lr_form_shlp_1->input( value = irclient->_bind_edit( <lv_field> ) ).
ENDCASE.
WHEN 2.
* ---------- Grid 2--------------------------------------------------------------------------------
* ---------- Set field label ----------------------------------------------------------------------
lr_form_shlp_2->label( <ls_fielddescr>-rollname ).
* ---------- Set input field ----------------------------------------------------------------------
CASE <ls_fielddescr>-datatype.
WHEN 'DATS'.
lr_form_shlp_2->date_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN 'TIMS'.
lr_form_shlp_2->time_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN OTHERS.
lr_form_shlp_2->input( value = irclient->_bind_edit( <lv_field> ) ).
ENDCASE.
WHEN 3.
* ---------- Grid 3--------------------------------------------------------------------------------
* ---------- Set field label ----------------------------------------------------------------------
lr_form_shlp_3->label( <ls_fielddescr>-rollname ).
* ---------- Set input field ----------------------------------------------------------------------
CASE <ls_fielddescr>-datatype.
WHEN 'DATS'.
lr_form_shlp_3->date_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN 'TIMS'.
lr_form_shlp_3->time_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN OTHERS.
lr_form_shlp_3->input( value = irclient->_bind_edit( <lv_field> ) ).
ENDCASE.
WHEN 4.
* ---------- Grid 4--------------------------------------------------------------------------------
* ---------- Set field label ----------------------------------------------------------------------
lr_form_shlp_4->label( <ls_fielddescr>-rollname ).
* ---------- Set input field ----------------------------------------------------------------------
CASE <ls_fielddescr>-datatype.
WHEN 'DATS'.
lr_form_shlp_4->date_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN 'TIMS'.
lr_form_shlp_4->time_picker( value = irclient->_bind_edit( <lv_field> ) ).
WHEN OTHERS.
lr_form_shlp_4->input( value = irclient->_bind_edit( <lv_field> ) ).
ENDCASE.
ENDCASE.
UNASSIGN <ls_fielddescr>.
ENDLOOP.
* ---------- Create table -------------------------------------------------------------------------
DATA(lr_table) = irparent->table( items = irclient->_bind_edit( <lt_result_itab> ) ).
* ---------- Create Columns -----------------------------------------------------------------------
DATA(lr_columns) = lr_table->columns( ).
* ---------- Set column ---------------------------------------------------------------------------
LOOP AT lt_fieldprop_lis ASSIGNING FIELD-SYMBOL(<ls_fieldprop_lis>).
* ---------- Init loop data -----------------------------------------------------------------------
UNASSIGN: <ls_fielddescr>.
* ---------- Get corresponding field description --------------------------------------------------
ASSIGN lt_ddffields[ fieldname = <ls_fieldprop_lis>-fieldname ] TO <ls_fielddescr>.
IF <ls_fielddescr> IS NOT ASSIGNED.
CONTINUE.
ENDIF.
lr_columns->column( )->text( <ls_fielddescr>-rollname ).
ENDLOOP.
* ---------- Build export parameter list ----------------------------------------------------------
LOOP AT lt_fieldprop_lis ASSIGNING <ls_fieldprop_lis> WHERE shlpoutput = abap_true.
* ---------- Init loop data -----------------------------------------------------------------------
CLEAR: lv_arg_fieldname.
* ---------- Build parameter name -----------------------------------------------------------------
lv_arg_fieldname = `${` && <ls_fieldprop_lis>-fieldname && `}`.
* ---------- Collect output fields ----------------------------------------------------------------
APPEND lv_arg_fieldname TO lt_arg.
ENDLOOP.
DATA(lr_item) = lr_table->items(
)->column_list_item( type = 'Navigation' press = irclient->_event( val = resultitabevent
t_arg = lt_arg ) ).
* ---------- Set cell content ---------------------------------------------------------------------
LOOP AT lt_fieldprop_lis ASSIGNING <ls_fieldprop_lis>.
* ---------- Init loop data -----------------------------------------------------------------------
CLEAR: lv_cell_fieldname.
* ---------- Build cell name ----------------------------------------------------------------------
lv_cell_fieldname = `{` && <ls_fieldprop_lis>-fieldname && `}`.
lr_item->cells( )->text( lv_cell_fieldname ).
ENDLOOP.
lr_grid_shlp = irparent->buttons( )->button(
text = closebuttontext
press = irclient->_event_client( irclient->cs_event-popup_close ) ).
result = lr_grid_shlp.
ENDMETHOD.
METHOD generic_tag. METHOD generic_tag.
result = _generic( name = `GenericTag` result = _generic( name = `GenericTag`