Werteprüfung von Merkmalen

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Im OSS-Hinweis 1155969 "Funktionsbaustein zur Werteprüfung" ist sehr gut beschrieben, wie man eine Prüfung für ein Klassenmerkmal einrichtet mit drei verschiedenen Funktionen

  • Prüfung auf Existenz eines Merkmalwertes
  • Ändern des dargestellten Merkmalwertes
  • Selektion eines Merkmalwertes über eine F4-Wertehilfe

Transaktion CT04 Merkmalverwaltung

Mit der Transaktion CT04 können die Eigenschaften eines Merkmals verwaltet werden.

Hier heißt das Merkmal Z_SUPP_999_NUMBER, wobei es um die Lieferantennummer geht.

Anforderungen

  • Es sollen als Merkmalswerte alle Lieferanten von der Tabelle LFA1-LIFNR möglich sein. Nach Eingabe einer Lieferantennummer soll diese Nummer auf Vorhandensein geprüft werden
  • Im Feld soll statt der Lieferantennummer die Lieferantenbezeichnung LFA1-NAME1 dargestellt werden. Gespeichert jedoch weiterhin der Wert aus dem Feld LFA1-LIFNR
  • Bei der F4-Wertehilfe sollen alle Lieferanten mit der Kurzbezeichnung dargestellt werden, wo man eine Lieferanten auswählt. Dargestellt soll wieder das Feld LFA1-NAME1

Definition Eigenschaften Merkmal

  • Das Merkmal Lieferant ist zeichenartig
  • umfasst 10 Stellen
  • hat einen eindeutigen Wert.

Klassensystem1.jpg

In der Merkmalverwaltung klickt man nun auf den Reiter "Werte".

Drei Funktionsbausteine Werteprüfungen

Wie man die drei obigen Anforderungen realisiert ist einerseits im OSS-Hinweis beschrieben. Es sind hierzu 3 Funktionsbausteine zu erstellen.

Zunächst klickt man auf "Andere Werteprüfung" und wählt im Popupdialog "Funktionsbaustein" aus.

Klassensystem3.jpg

Nun erscheint ein Feld "Funktion" mit der Überschrift "Werteprüfung über Funktionsbaustein".

Hier wird nun ein Z-Funktionsbausteinname eingetragen. In diesem Fall Z_CHECK_SUPPLIER. Dieser Funktionsbaustein realisiert die Prüfung des eingegebenen Lieferanten.

Klassensystem2.jpg

Setzt man den Cursor in das Feld "Funktion" und öffnet mit F1 die Feldhilfe, so erscheint auch eine Beschreibung, wie man die 3 Funktionsbausteine benennen muß

  • Funktionsbaustein zur Werteprüfung = Z<NAME>
  • Funktionsbaustein zur F4-Wertehilfe = Z<NAME>_F4
  • Funktionsbaustein zur Änderung des dargestellten (oft sprachabhängigen) Merkmalwertes = Z<NAME>_DC

Klassensystem4.jpg

Funktionsbaustein Z_CHECK_SUPPLIER (Werteprüfung)

  • Wird der eingegebene Wert nicht gefunden, so wird die Ausnahme NOT_FOUND ausgelöst. Der eingegebene Merkmalswert VALUE wird im Exportwert VALUE_EX wieder zurückgeben. Ggf. müssen hier führende Nullen ergänzt werden.
FUNCTION Z_CHECK_SUPPLIER.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(CHARACT_NO) TYPE  ATINN
*"     REFERENCE(CHARACT) TYPE  ATNAM
*"     REFERENCE(VALUE) TYPE  ATWRT
*"  EXPORTING
*"     REFERENCE(VALUE_EX) TYPE  ATWRT
*"  EXCEPTIONS
*"      NOT_FOUND
*"----------------------------------------------------------------------

*&---------------------------------------------------------------------*
*& Eberstein Consulting
*& René Eberstein
*& Paket = ZRD, Funktionsgruppe = ZRD1
*& siehe auch OSS-Hinweis 1155969 - Funktionsbaustein zur Werteprüfung
*& Werteprüfung zur Lieferantennummer in der Transaktion CT04 = Merkmalverwaltung
*& (Merkmal = Z_SUPP_999_NUMBER)
*& Im Reiter "Werte" steht ein Feld "Funktion". Hier wird der Funktionsbaustein
*& Z_CHECK_SUPPLIER eingetragen. Nach dem Funktionsbaustein Z_CHECK_SUPPLIER
*& wird der implizit der Funktionsbaustein Z_CHECK_SUPPLIER_DC aufgerufen
*& (durch das "_DC" am Ende. Hier wird der Name des Lieferanten zurückgegeben
*& (im Exportparameter DESCRIPTION)
*& Dieser Name wird angezeigt als Merkmalswert. Fortgeschrieben wird weiterhin
*& die Lieferantennummer.
*& Wenn die Wertehilfe aufgerufen wird, wird der Funktionsbaustein Z_CHECK_SUPPLIER_F4
*& aufgerufen. Im SAP-UI erscheint ein Popup, wo der Lieferant gewählt wird und
*& in das Merkmalsfeld zurückgeschrieben wird.
*&---------------------------------------------------------------------*

  DATA: lv_value TYPE atwrt.
  Data: lv_lifnr type lfa1-lifnr.

  lv_lifnr = value.
  shift lv_lifnr RIGHT DELETING TRAILING space.
  overlay lv_lifnr with '0000000000'.

* Prüfe Lieferantennummer in Returnparameter, sonst Ausnahme
  Select single
    lifnr
    into VALUE_EX
    from lfa1
    where lifnr = lv_lifnr.

  IF NOT sy-subrc IS INITIAL.
    RAISE not_found.
  ENDIF.

ENDFUNCTION.

Funktionsbaustein Z_CHECK_SUPPLIER_F4 (F4-Wertehilfe)

  • Eine Tabellen mit den möglichen Merkmalswerten wird zurückgeliefert in der internen Tabelle VALUES.
FUNCTION Z_CHECK_SUPPLIER_F4.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(CHARACT_NO) TYPE  ATINN
*"     REFERENCE(CHARACT) TYPE  ATNAM
*"     REFERENCE(DISPLAY) TYPE  C
*"     REFERENCE(ADDITIONAL_VALUES) TYPE  ATSON
*"     REFERENCE(MULTIPLE_VALUES) TYPE  ATLIS
*"     REFERENCE(LANGUAGE) TYPE  SY-LANGU
*"     REFERENCE(DISPLAY_WITH_LANGUAGE) TYPE  C
*"  EXPORTING
*"     REFERENCE(VALUE_EX) TYPE  ATWRT
*"  TABLES
*"      VALUES STRUCTURE  RCTVALUES
*"  EXCEPTIONS
*"      CANCELLED_BY_USER
*"----------------------------------------------------------------------

*&---------------------------------------------------------------------*
*& Eberstein Consulting
*& René Eberstein
*& Paket = ZRD, Funktionsgruppe ZRD1
*&---------------------------------------------------------------------*
 
  DATA: lt_values     TYPE TABLE OF rctvalues,
        wa_values     TYPE rctvalues,
        lt_return_tab TYPE TABLE OF ddshretval,
        wa_return_tab TYPE ddshretval.

  DATA: lt_mark_tab  TYPE  ddshmarks.
  DATA: lv_mark      LIKE LINE OF lt_mark_tab.

* Read Suppliers with description
  Select lifnr
         name1
  into table lt_values
  from lfa1.

*======================================================================
* Web UI
* In WebDynpro / Web UI it is currently not possible to have an own
* Popup/Dnypro/Window, instead a table with the allowed values needs
* to be returned. So the logic is completly different and very limited.
* The popup to select values will be created by classification WDC
* after returning from this function module
*======================================================================
  IF cl_web_dynpro=>is_active = 'X'.
    values[] = lt_values[].
    RETURN.
  ENDIF.

*======================================================================
* ABAP UI
* In we create a list of valid values and use basis function module
* to create popup. We return the selected value(s), not a list of valid
* values like in WebDynpro
*======================================================================
  IF multiple_values EQ 'X'.
    LOOP AT values INTO wa_values.
      READ TABLE lt_values WITH KEY value = wa_values-value
                          TRANSPORTING NO FIELDS.
      IF sy-subrc IS INITIAL.
        lv_mark = sy-tabix.
        APPEND lv_mark TO lt_mark_tab.
      ENDIF.
    ENDLOOP.
  ENDIF.

* display the selected values for the input help in an appropriate
* format
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      ddic_structure   = 'RCTVALUES'   "structure of value_tab
      retfield         = 'VALUE'       "name of return field
*     pvalkey          = ' '
*     dynpprog         = ' '
*     dynpnr           = ' '
*     dynprofield      = ' '
*     stepl            = 0
      window_title     = 'Please choose a value' "name of list
*     value            = ' '
      value_org        = 'S'           "type of value delivery
      multiple_choice  = multiple_values
      display          = display
*     callback_program = ' '
*     callback_form    = ' '
      mark_tab         = lt_mark_tab
    TABLES
      value_tab        = lt_values    "table with selected values
*     field_tab        =
      return_tab       = lt_return_tab "table with chosen value
*     dynpfld_mapping  =
    EXCEPTIONS
      parameter_error  = 1
      no_values_found  = 2
      OTHERS           = 3.

* raise an error message if the operation was not successfull
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
* check if a value was chosen
    IF NOT lt_return_tab IS INITIAL.
* write the chosen value into the output table
      LOOP AT lt_return_tab INTO wa_return_tab.
        wa_values-value = wa_return_tab-fieldval.
* define a correct status for the chosen value
        wa_values-status = 'I'.
        APPEND wa_values TO values.
      ENDLOOP.
* asume all values that are not inserted should be deleted
      LOOP AT values WHERE status IS INITIAL.
        values-status = 'D'.
        MODIFY values.
      ENDLOOP.
    ENDIF.
  ENDIF.

ENDFUNCTION.

Funktionsbaustein Z_CHECK_SUPPLIER_DC (Änderung Beschreibung)

  • Das Feld "DESCRIPTION" wird gefüllt. Der eigentliche Merkmalswert VALUE (die Lieferantennummer) bleibt erhalten.
FUNCTION Z_CHECK_SUPPLIER_DC.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(CHARACT_NO) TYPE  ATINN
*"     REFERENCE(CHARACT) TYPE  ATNAM
*"     REFERENCE(VALUE) TYPE  ATWRT
*"     REFERENCE(LANGUAGE) TYPE  SY-LANGU
*"  EXPORTING
*"     REFERENCE(DESCRIPTION) TYPE  ATWTB
*"  EXCEPTIONS
*"      NOT_FOUND
*"----------------------------------------------------------------------

*&---------------------------------------------------------------------*
*& Eberstein Consulting
*& René Eberstein
*& Paket = ZRD, Funktionsgruppe = ZRD1
*& siehe auch OSS-Hinweis 1155969 - Funktionsbaustein zur Werteprüfung
*& Werteprüfung zur Lieferantennummer in der Transaktion CT04 = Merkmalverwaltung
*& (Merkmal = Z_SUPP_999_NUMBER)
*&---------------------------------------------------------------------*

* define a local import variable for the function module
* 'CTHE_CHECK_TABLE_VALUE_EXISTS'

  DATA: lv_value TYPE atwrt.

  Select single
    name1
    into description
    from lfa1
    where lifnr = value.

** convert the value of the assigned character via an appropriate check
** table into a standardized format
*  CALL FUNCTION 'CTHE_CHECK_TABLE_VALUE_EXISTS'
*    EXPORTING
*      check_table    = 'MAKT'          "name of check table
*      value          = value           "assigned character value
*    IMPORTING
*      value_exp      = lv_value        "converted character value
*    EXCEPTIONS
*      value_not_found = 1
*      OTHERS          = 2.
*
** get the language dependent description of the assigned character
** value via the assigned language key
*  SELECT SINGLE maktx FROM makt INTO description
*    WHERE matnr = lv_value AND spras = language.
*
** raise an error message if no language dependent description exists
*  IF NOT sy-subrc IS INITIAL.
*    RAISE not_found.
*  ENDIF.

ENDFUNCTION.

Web-Links