Felder nicht editierbar machen abhängig von anderen Feldern

Getting started ... Alles für einen gelungenen Start.
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von ZF_SAPler (Specialist / 100 / 14 / 2 ) »
Hallo,

Ich habe drei Felder in einem Dynpro (Screen). Felder A, B, C

Wenn eines der Felder ein Wert bekommt, dann sollen die anderen Felder nicht mehr
editierbar sein.
Wie mache ich das besten?

Natürlich könnte ich in einem PBO mit einem LOOP AT SCREEN arbeiten. Geht das etwas eleganter?
Ideen?

Danke

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
nein, mit einem Dynpro geht das leider nicht eleganter.
PAI/PBO ist der einzige Weg in dem LOOP AT SCREEN funktioniert.
In POH/POV kann man zwar auch mit LOOP AT SCREEN arbeiten aber da gibt es gewisse Abstriche an der Funktionalität die teilweise zu unerwarteten Verhalten führen können (nur akt. Tabellenzeile wird durchlaufen, nur akt. Subscreen wird durchlaufen, usw.).

Die einzige Möglichkeit im SAP Umfeld mit der man Felder während der Eingabe sperren kann, ist auf eine der Web-Technologien (WebDynpro, BSP, pure HTML, ...) zu setzen und das per Scripting zu implementieren.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von A6272 (Specialist / 238 / 8 / 36 ) »
ZF_SAPler hat geschrieben:
14.10.2022 06:23
Wenn eines der Felder ein Wert bekommt, dann sollen die anderen Felder nicht mehr
editierbar sein.
Wenn ein User die Werte eingibt, kann er alle 3 Felder befüllen und Du kannst es nicht im PAI/PBO abfangen, da kein Ereignis ausgelöst wird, der einen PAI/PBO Aufruf auslöst. Außer der User drückt "Enter" oder einen Button, aber dann ist es ggf. schon zu Spät.

--> ggf. den User per Radiobutton zwingen vor der Eingabe das Feld freizuschalten, wenn es nicht das erste ist. Ein Radiobutton löst ein Ereignis aus, so dass PAI/PBO durchlaufen wird.

Wenn ein Feld schon vor Aufruf des Dynpros gefüllt ist, dann siehe Kommentar von a-dead-trousers

Re: Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von ewx (Top Expert / 4854 / 313 / 644 ) »
a-dead-trousers hat geschrieben:
14.10.2022 08:19
Die einzige Möglichkeit im SAP Umfeld mit der man Felder während der Eingabe sperren kann, ist auf eine der Web-Technologien (WebDynpro, BSP, pure HTML, ...) zu setzen und das per Scripting zu implementieren.
Es gibt noch eine andere Möglichkeit: Ein editierbares ALV-Grid. Hier kann man steuern, dass beim Fokus auf ein anderes Feld Feldprüfungen durchlaufen werden. Hier kann die Eingabefähigkeit der anderen Felder gesteuert werden.

Optimal ist es aber auch nicht. Ich habe ein Beispiel mit zwei Spalten gebaut. In der ersten Spalte "RESULT" muss ein Prüfergebnis eingetragen werden. Ist das Ergebnis "OK", dann muss in dem Feld "REASON" nichts eingetragen werden. nur, wenn das Ergebnis "NOT OK" ist, soll "REASON" eingabebereit sein.

Das funktioniert beim ersten Mal gut. Wenn jedoch im ersten Feld bereits "OK" eingetragen wurde (REASON ist dementsprechend nicht eingabebereit) und man ändert den Wert von OK auf NOT OK und drückt Tab, dann funktioniert es nicht mehr, weil aufgrund des nicht eingabebereiten Feldes keine Fokusänderung mehr stattfindet.

Möchte man stattdessen eine Listbox für die Eingabe von OK und NOT OK verwenden, dann kann man auf die Wert-Änderung nicht reagieren.

Ansonsten kann man solche Anforderungen in der Regel gut abdecken, in dem man im Dynpro eine Listbox verwendet auf deren Änderung man im Dynpro reagieren kann.

Kniffelig wird es, wenn abhängig von Werten andere Felder obligatorisch werden... 😉

Hier mein Testreport:
SNAG-0199.png

Code: Alles auswählen.

REPORT.

PARAMETERS p.

CLASS main1 DEFINITION.
  PUBLIC SECTION.
    METHODS set_container IMPORTING cont TYPE REF TO cl_gui_container.
    METHODS display.
  PRIVATE SECTION.
    DATA grid TYPE REF TO cl_gui_alv_grid.
    DATA cont TYPE REF TO cl_gui_container.
    TYPES: BEGIN OF _qr_line,
             result TYPE c LENGTH 3,
             reason TYPE c LENGTH 40,
           END OF _qr_line,
           _qr_data TYPE STANDARD TABLE OF _qr_line WITH DEFAULT KEY.
    DATA data TYPE _qr_data.

    METHODS on_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed.
    METHODS get_fcat RETURNING VALUE(fcat) TYPE lvc_t_fcat.
ENDCLASS.

CLASS main1 IMPLEMENTATION.
  METHOD set_container.
    me->cont = cont.
  ENDMETHOD.

  METHOD on_data_changed.
    LOOP AT er_data_changed->mt_good_cells INTO DATA(good_cell).
      CASE good_cell-fieldname.
        WHEN 'RESULT'.
          CASE good_cell-value.
            WHEN 'OK'.
              DATA(field_reason_edit) = abap_false.
            WHEN OTHERS.
              field_reason_edit = abap_true.
          ENDCASE.
      ENDCASE.
    ENDLOOP.
    grid->get_frontend_fieldcatalog(
      IMPORTING
        et_fieldcatalog = DATA(fcat) ).
    IF NOT fcat[ fieldname = 'REASON' ]-edit = field_reason_edit.
      fcat[ fieldname = 'REASON' ]-edit = field_reason_edit.
      grid->set_frontend_fieldcatalog( fcat ).
      grid->refresh_table_display( ).
    ENDIF.

  ENDMETHOD.

  METHOD display.


    IF grid IS BOUND.
      grid->refresh_table_display( ).
    ELSE.

      DATA(fcat) = get_fcat( ).

      grid = NEW #( i_parent = cont ).
      APPEND INITIAL LINE TO data.

      DATA(dropdown) = VALUE lvc_t_dral( handle = 1
           ( value = 'Not Okay' int_value = 'NOK' )
           ( value = 'Okay'     int_value = 'OK' ) ).

      grid->set_drop_down_table( it_drop_down_alias = dropdown ).
      grid->set_table_for_first_display(
        EXPORTING
          is_layout                     = VALUE #( edit_mode = 'X' no_toolbar = abap_true no_rowmark = abap_true )
        CHANGING
          it_outtab                     = data
          it_fieldcatalog               = fcat
        EXCEPTIONS
          OTHERS                        = 4  ).
      IF sy-subrc = 0.
        grid->register_edit_event( cl_gui_alv_grid=>mc_evt_modified ).
        grid->set_ready_for_input( 1 ).
        SET HANDLER on_data_changed FOR grid.

        cl_gui_container=>set_focus( grid ).
      ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD get_fcat.
    fcat = VALUE #(
     ( fieldname = 'RESULT' outputlen = 10 rollname = 'CHAR03' edit = 'X' coltext = 'Result' drdn_hndl = 1 drdn_alias = abap_true )
     ( fieldname = 'REASON' outputlen = 40 rollname = 'CHAR40' edit = 'X' coltext = 'Reason' ) ).

  ENDMETHOD.

ENDCLASS.
CLASS main2 DEFINITION.
  PUBLIC SECTION.
    METHODS set_container IMPORTING cont TYPE REF TO cl_gui_container.
    METHODS display.
  PRIVATE SECTION.
    DATA grid TYPE REF TO cl_gui_alv_grid.
    DATA cont TYPE REF TO cl_gui_container.
    TYPES: BEGIN OF _qr_line,
             result TYPE c LENGTH 3,
             reason TYPE c LENGTH 40,
           END OF _qr_line,
           _qr_data TYPE STANDARD TABLE OF _qr_line WITH DEFAULT KEY.
    DATA data TYPE _qr_data.

    METHODS on_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed.
    METHODS get_fcat RETURNING VALUE(fcat) TYPE lvc_t_fcat.
ENDCLASS.

CLASS main2 IMPLEMENTATION.
  METHOD set_container.
    me->cont = cont.
  ENDMETHOD.

  METHOD on_data_changed.
    LOOP AT er_data_changed->mt_good_cells INTO DATA(good_cell).
      CASE good_cell-fieldname.
        WHEN 'RESULT'.
          CASE to_upper( good_cell-value ).
            WHEN 'OK'.
              DATA(field_reason_edit) = abap_false.
            WHEN OTHERS.
              field_reason_edit = abap_true.
          ENDCASE.
      ENDCASE.
    ENDLOOP.
    grid->get_frontend_fieldcatalog(
      IMPORTING
        et_fieldcatalog = DATA(fcat) ).
    IF NOT fcat[ fieldname = 'REASON' ]-edit = field_reason_edit.
      fcat[ fieldname = 'REASON' ]-edit = field_reason_edit.
      grid->set_frontend_fieldcatalog( fcat ).
      grid->refresh_table_display( ).
    ENDIF.

  ENDMETHOD.

  METHOD display.


    IF grid IS BOUND.
      grid->refresh_table_display( ).
    ELSE.

      DATA(fcat) = get_fcat( ).

      grid = NEW #( i_parent = cont ).
      APPEND INITIAL LINE TO data.

      grid->set_table_for_first_display(
        EXPORTING
          is_layout                     = VALUE #( edit_mode = 'X' no_toolbar = abap_true no_rowmark = abap_true )
        CHANGING
          it_outtab                     = data
          it_fieldcatalog               = fcat
        EXCEPTIONS
          OTHERS                        = 4  ).
      IF sy-subrc = 0.
        grid->register_edit_event( cl_gui_alv_grid=>mc_evt_modified ).
        grid->set_ready_for_input( 1 ).
        SET HANDLER on_data_changed FOR grid.

        cl_gui_container=>set_focus( grid ).
      ELSE.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD get_fcat.
    fcat = VALUE #(
     ( fieldname = 'RESULT' outputlen = 10 rollname = 'CHAR03' edit = 'X' coltext = 'Result' )
     ( fieldname = 'REASON' outputlen = 40 rollname = 'CHAR40' edit = 'X' coltext = 'Reason' ) ).

  ENDMETHOD.

ENDCLASS.

INITIALIZATION.
  DATA(docker2) = NEW cl_gui_docking_container( ratio = 80 side = cl_gui_docking_container=>dock_at_bottom ).
  DATA(docker1) = NEW cl_gui_docking_container( ratio = 10 side = cl_gui_docking_container=>dock_at_bottom ).

  DATA(app1) = NEW main1( ).
  app1->set_container( docker1 ).
  app1->display( ).

  DATA(app2) = NEW main2( ).
  app2->set_container( docker2 ).
  app2->display( ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
a-dead-trousers


Re: Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
Zum Thema ALV-Grid gäbe es noch die CL_WDY_WB_PROPERTY_BOX die basierend auf CL_GUI_ALV_GRID_BASE eine "Parameter & Wert" Eingabemöglichkeit mit Ein- und Ausblenden von abhängigen Feldern anbietet.

Im Kontext von AdobeForms (und natürlich auch WebDynpro) kann man diese Form der Eingabemöglichkeit in Aktion erleben.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ewx

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Felder nicht editierbar machen abhängig von anderen Feldern

Beitrag von ewx (Top Expert / 4854 / 313 / 644 ) »
a-dead-trousers hat geschrieben:
14.10.2022 12:57
Zum Thema ALV-Grid gäbe es noch die CL_WDY_WB_PROPERTY_BOX die basierend auf CL_GUI_ALV_GRID_BASE eine "Parameter & Wert" Eingabemöglichkeit mit Ein- und Ausblenden von abhängigen Feldern anbietet.

Im Kontext von AdobeForms (und natürlich auch WebDynpro) kann man diese Form der Eingabemöglichkeit in Aktion erleben.
Cool! Danke!

Report TEST_PROPERTY_BOX
SNAG-0200.png

Seite 1 von 1

Vergleichbare Themen

8
Antw.
4493
Views
Mussfeld abhängig von anderen Eingaben / Feldern definieren
von Rebecca » 28.04.2021 09:17 • Verfasst in ABAP® für Anfänger
0
Antw.
1116
Views
Mitarbeiter abhängig von VKORG
von gs3rr4 » 15.07.2014 12:18 • Verfasst in ABAP® für Anfänger
1
Antw.
2564
Views
Abstimmkonten für Kreditoren abhängig
von Margarete » 27.03.2017 11:18 • Verfasst in Financials
0
Antw.
1592
Views
Lieferant abhängig von Einkaufsorganisation
von said1980 » 26.02.2006 10:28 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.