Die nachfolgende Seite beschreibt wie kundenindividuelle Vergleichslogiken implementiert werden können.

Programmierbeispiel

In diesem Beispiel sollen die Tests von 2 verschiedenen Qualitäten verglichen werden.

Beschreibung des Objekts Qualität

Das Objekt ist von der Vorschriftenart QUALITY, das in diesem Fall verschiedene Tests für Materialien beschreibt. Diese Tests, wie beispielsweise chemische Analyse, Kerbschlagbiegeversuch (Notched Impact Bending Test) und Zugversuch (Tensile Test), sind alle vom Postitionstyp TESTING. Jedes dieser untergeordneten Test-Knoten enthält spezifische Sollwerte und Prüfparameter, die für die Qualitätssicherung relevant sind.

image-20250226-111542.png
Qualitätsvorschrift

Eine Qualität kann mehrere Knoten vom Typ TESTING haben. Jeder dieser Knoten hat ein Konditionsobjekttyp zugeordnet. Der Konditionsobjekttyp legt fest unter welchen Bedingungen die Sollwerte definiert werden. Die Sollwerte definieren die erwarteten Eigenschaften eines Tests. Sie geben beispielsweise vor, welche chemische Zusammensetzung ein Material haben muss oder welche Mindest- und Höchstwerte für Tests gelten.

Jeder Konditionsobjekttyp hat verschiedene Elemente, die den Prüfkontext näher beschreiben. Das Element INSPECTION gibt an, um welche Art von Test es sich handelt. Das Element ORIENTATION beschreibt die Probenlage. Das Element TEMPERATURE spielt bei mechanischen Tests eine Rolle, da sich das Materialverhalten mit der Temperatur ändert. Bei Abweichungen dieser Parameter könnten die Sollwerte sich verändern.

Die Kombination aus Positionstyp und Konditionsobjekttyp ermöglicht es, verschiedene Arten von Tests strukturiert zu verwalten und auszuwerten. Somit können mehrere Test-Knoten von der gleichen Art und verschiedenen Kontitionen in der Qualität existieren.

image-20250226-111512.png
Positionstyp TESTING

Technisch gesehen ist es möglich alle Tests direkt miteinander zu vergleichen, da sie alle unter dem übergeordneten Qualitätsobjekt geführt werden und den gleichen Positionstyp haben. Fachlich ergibt das jedoch wenig Sinn, da beispielsweise eine chemische Analyse nicht direkt mit einem Zugversuch vergleichbar ist. Hier kommt die Vergleichslogik ins Spiel. Sie stellt sicher, dass nur sinnvolle Vergleiche durchgeführt werden, indem sie prüft, ob zwei Knoten inhaltlich zusammengehören. Dadurch wird vermieden, dass Testwerte ohne fachlichen Zusammenhang miteinander verglichen werden.

Diese Logik muss in der Methode /SCT/QP_IF_COMP_OBJTYP~IS_BASE_MATCHING implementiert werden. Da nur die Tests von zwei verschiedenen Qualitäten verglichen werden sollen, wird in unserem Fall zunächst geprüft, ob sie die gleiche OGUID besitzen oder unterschiedliche Positionstypen haben. Trifft eines davon zu, wird die Methode ohne Treffer beendet. Zusätzlich werden die Elemente INSPECTION, TEMPERATURE und ORIENTATION verglichen. Stimmen die Werte überein, so wurden Objekte gefunden, die vergleichbar sind. Anschließend werden die Objekte im Vorschriftenvergleich angezeigt und verglichen.

Diese Logik ermöglicht eine gezielte Gegenüberstellung relevanter Objekte und kann bei Bedarf um weitere Vergleichskriterien erweitert werden.

  1. Es muss eine neue Klasse in Kundennamensraum angelegt werden.

    1. Die Klasse muss von der Klasse /SCT/QP_CL_COMP_OBJTYP erben.

  2. Die Methode /SCT/QP_IF_COMP_OBJTYP~IS_BASE_MATCHING ist die einzige Methode, die vom Kunden redefiniert werden sollte.

  3. Diese Klasse muss im Customizing unter Vergleichsobjekte hinzugefügt werden.

Das folgende Coding kann verwendet werden, um die oben genannten Anforderungen zu erfüllen.

Methode /SCT/QP_IF_COMP_OBJTYP~IS_BASE_MATCHING

METHOD /sct/qp_if_comp_objtyp~is_base_matching.
CLEAR ev_matching.
" vom selben VTYP
IF ir_base_target->instance->ms_node_data-oguid = ir_base_source->instance->ms_node_data-oguid
OR ir_base_target->instance->ms_node_data-vtyp <> ir_base_source->instance->ms_node_data-vtyp.
RETURN.
ENDIF.
 
IF ir_base_target->vart_instance->get_value( iv_element = 'INSPECTION'
is_hint = VALUE #( instance = ir_base_target->instance ) ) =
ir_base_source->vart_instance->get_value( iv_element = 'INSPECTION'
is_hint = VALUE #( instance = ir_base_source->instance ) )
AND ir_base_target->vart_instance->get_value( iv_element = 'TEMPERATURE'
is_hint = VALUE #( instance = ir_base_target->instance ) ) =
ir_base_source->vart_instance->get_value( iv_element = 'TEMPERATURE'
is_hint = VALUE #( instance = ir_base_source->instance ) )
AND ir_base_target->vart_instance->get_value( iv_element = 'ORIENTATION'
is_hint = VALUE #( instance = ir_base_target->instance ) ) =
ir_base_source->vart_instance->get_value( iv_element = 'ORIENTATION'
is_hint = VALUE #( instance = ir_base_source->instance ) ).
ev_matching = abap_true.
RETURN.
ENDIF.
ENDMETHOD.
SC_DOC_CODE_1.png

So sieht der Vorschriftenvergleich aus dem Beispiel aus:

image-20250225-113149.png