SAP Jobsuche bei DV-Treff


Suchen
Andrew1+
  • Andrew1+
  • SAP Forum - User Thema Starter
vor 6 Jahre
Hallo,

ich habe ein Problem mit dem Beziehungswissen...

Beispiel:

Ich habe 3 Merkmale

Merkmal1

Merkmal2

Merkmal3

alle Datentyp Char

Ich möchte das Merkmal3 den Textwert verkettet aus Merkmal1 und Merkmal2 wenn Merkmal2 = '01' ist.

Geht mein Vorhaben?

So leider nicht....

$Self.Merkmal3=Merkmal1+Merkmal2 if Merkmal2 eq '01'

Gruß

Andrew

Förderer

mas
  • mas
  • SAP Forum - Guru
vor 6 Jahre
Hallo Andrew,

hier ein Beispiel aus der SAP Doku

mit + bekommst du eine Summe von 2 Merkmalswerten.

$SELF.CHAR_A = FLOOR ($SELF.CHAR_B + $SELF.CHAR_C + 0.5)

Die Summe der Merkmale B und C wird berechnet und das Ergebnis auf eine ganze Zahl gerundet.

Das was du willst - Textverkettung - je nachdem wie viele Werte deine Merkmale aufweisen:

Relativ aufwändiges explicites herleiten

$SELF.CHAR_C = 'AABB' IF $SELF.CHAR_A = 'AA' and $SELF.CHAR_B = 'BB'.

$SELF.CHAR_C = 'ABAB' IF $SELF.CAHR_A = 'AB' and $SELF.CHAR_B = 'AB'.

etc.

Eleganter, wenn du die eine benutzerdefinierte Funktion programmierst.

https://help.sap.com/saphelp_erp60_sp/helpdata/de/1a/40b953495bb44ce10000000a174cb4/frameset.htm 

mas

Andrew1+
  • Andrew1+
  • SAP Forum - User Thema Starter
vor 6 Jahre
Hallo Mas,

danke für deine Antwort.

Die erste Variante fällt wegen fast unendlich vielen If Abfragen weg

Bei der zweiten fehlen mir die Berechtigungen und Kenntnisse um in Abap einen Funktionbausteine zu definieren.

Danke

Gruß

Andrew

mas
  • mas
  • SAP Forum - Guru
vor 6 Jahre
Hallo Andrew,

dann gehe halt mal zu deinen Basisleuten und erkläre ihnen, was du benötigst.

Der zugehörige Funktionsbaustein ist jetzt technisch nicht die allergrösste Herausforderung.

mas

surakim
vor 6 Jahre
Folgenden Funktionsbaustein anlegen und in eine Userfunction packen.

Dafür werden 4 Merkmale benötigt:

  • ALC_UFUNC_SOURCE (String 1)

  • ALC_UFUNC_SOURCE_2 (String 2)

  • ALC_UFUNC_RETURN (verketteter String)

  • ALC_UFUNC_ADD_SPACING (leerstelle zwischen den beiden Strings)


FUNCTION z_vc_concat_string.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     REFERENCE(GLOBALS) TYPE  CUOV_00
*"  TABLES
*"      QUERY STRUCTURE  CUOV_01
*"      MATCH STRUCTURE  CUOV_01
*"  EXCEPTIONS
*"      FAIL
*"      INTERNAL_ERROR
*"----------------------------------------------------------------------
**********************************************************************

  DATA: lf_string1 TYPE char30.
  DATA: lf_string2 TYPE char30.
  DATA: lf_ja TYPE char30.        "J oder N

  CALL FUNCTION 'CUOV_GET_FUNCTION_ARGUMENT'
    EXPORTING
      argument      = 'ALC_UFUNC_SOURCE'
    IMPORTING
      sym_val       = lf_string1
    TABLES
      query         = query
    EXCEPTIONS
      arg_not_found = 01.
  IF sy-subrc <> 0.
    RAISE internal_error.
  ENDIF.

  LOOP AT query ASSIGNING FIELD-SYMBOL(<lfs_query>) WHERE varnam =  'ALC_UFUNC_SOURCE'.
    lf_string1 = <lfs_query>-atwrt.
  ENDLOOP.

  LOOP AT query ASSIGNING              <lfs_query>  WHERE varnam =  'ALC_UFUNC_SOURCE_2'.
    lf_string2 = <lfs_query>-atwrt.
  ENDLOOP.

  LOOP AT query ASSIGNING              <lfs_query>  WHERE varnam =  'ALC_UFUNC_ADD_SPACING'.
    lf_ja      = <lfs_query>-atwrt.
  ENDLOOP.


  DATA: lf_string_out TYPE char30.
  IF lf_ja = 'J'.
    CONCATENATE lf_string1
                lf_string2
           INTO lf_string_out SEPARATED BY space.
  ELSE.
    CONCATENATE lf_string1
                lf_string2
           INTO lf_string_out.
  ENDIF.

  CALL FUNCTION 'CUOV_SET_FUNCTION_ARGUMENT'
    EXPORTING
      argument                = 'ALC_UFUNC_RETURN'
      vtype                   = 'CHAR'
      sym_val                 = lf_string_out
    TABLES
      match                   = match
    EXCEPTIONS
      existing_value_replaced = 01.
  IF sy-subrc <> 0.
    RAISE internal_error.
  ENDIF.

ENDFUNCTION.

Aufruf des Codes dann in einer Prozedur folgendermassen:


* Wert an Merkmal FRC_PRODABMESS_01 anhängen
PFUNCTION Z_VC_CONCAT_STRING (
   ALC_UFUNC_SOURCE      = $self.FRC_PRODABMESS_01,
   ALC_UFUNC_SOURCE_2    = $self.ALC_TEMP_01,
   ALC_UFUNC_ADD_SPACING = 'J',
   ALC_UFUNC_RETURN      = $self.FRC_PRODABMESS_01
)
,
surakim
vor 6 Jahre
Zitat von: Andrew1+ 

Hallo,

ich habe ein Problem mit dem Beziehungswissen...

Beispiel:

Ich habe 3 Merkmale

Merkmal1

Merkmal2

Merkmal3

alle Datentyp Char

Ich möchte das Merkmal3 den Textwert verkettet aus Merkmal1 und Merkmal2 wenn Merkmal2 = '01' ist.

Geht mein Vorhaben?

So leider nicht....

$Self.Merkmal3=Merkmal1+Merkmal2 if Merkmal2 eq '01'

Gruß

Andrew

Und jetzt noch einfacher, ganz ohne Benutzerfunktionen (quasi im Standard):


* MERKMAL_1 = 'Hallo'
* MERKMAL_2 = 'Welt'
* MERKMAL_3 = 'JA'

$self.MERKMAL_12 = $root.MERKMAL_1 || $root.MERKMAL_2
  if $root.MERKMAL_3 = 'JA'

* MERKMAL_12 = 'HalloWelt' 

Leider führt der Verketten-Operator || ein TRIM aus (leerstellen vorher und nachher entfernen)

WOKE_Wolfgang
vor 3 Jahre
Wenn du Trennzeichen einfügen möchtest, dann kannst du diese ebenfalls über || einbinden. Leerzeichen werden aber weiterhin entfernt.

Um beim Beispiel von surakim zu bleiben:


* MERKMAL_1 = 'Hallo'
* MERKMAL_2 = 'Welt'
* MERKMAL_3 = 'JA'
* Trennzeichen soll '-' sein

$self.MERKMAL_12 = $root.MERKMAL_1 || '-' || $root.MERKMAL_2
  if $root.MERKMAL_3 = 'JA'

* MERKMAL_12 = 'Hallo-Welt' 

Vielen Dank an surakim 👍

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Hallo zusammen,

Ich stehe erst am Anfang meines Abenteuers mit Beziehungswissen :)

Ich habe ein ähnliches Problem wie das obige, aber noch trivialer, aber ich weiß nicht, warum mein Code als Validierung funktioniert, aber nicht die Summe im Attribut anzeigt

Wir haben 3 Merkmale:

WSK_1 - (Numerisch)

WSK_2 - (Numerisch)

WSK_SUMME - (Numerisch)

mein Code in 'Merkmal_SUMME'

$SELF.WSK_SUMME = $SELF.WSK_1 + $SELF.WSK_2

Dieses Ergebnis wird nicht in der Klasse/Merkmal (WSK_SUMME) angezeigt, sondern funktioniert als Validierung z.B:

meine Eingaben:

WSK_1 : 3

WSK_2 : 2

Wenn

WSK_SUMME : leer! aber wenn ich 3 eingebe dann ist 'Inkonsistenz' aber wenn ich in der Merkmal WSK_SUMME 5 eingebe dann die Inkonsistenz Knopf ist weg..

was muss ich schreiben in der Beziehungswissen das die Ergebnis (in der Fall '5') GEZEIGT wird?

Bitte um Support

WOKE_Wolfgang
vor 2 Jahre
Hi sim86,

an welchem deiner Merkmale hast du das Beziehungswissen angehängt?

Wenn ich deinen Code richtig interpretiere, dann hängt es am Merkmal WSK_SUMME richtig?

Daher wird der Code erst aktiv sobald du etwas in WSK_SUMME einträgst.

Du musst das Beziehungswissen an eines der beiden Merkmale anhängen, die du befüllst. Also entweder an WSK_1 oder an WSK_2.

Das sollte funktionieren wenn der Code an WSK_1 gehängt wird.


** Z_SUM_WSK
*  WSK_1 und WSK_2 zu WSK_SUMME addieren, wenn WSK_1 angegeben ist

$SELF.WSK_SUMME = $SELF.WSK_1 + $SELF.WSK_2 IF SPECIFIED WSK_1

Bitte kurze Rückmeldung, wenn es geklappt hat.

Gruß Wolfgang

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Hi Wolfgang,

Es hat geklappt ! 😁

Vielen Dank für Ihre Hilfe, obwohl ich ehrlich gesagt nicht verstehe, warum ich die Formel in WSK_1 einfügen musste und nicht in WSK_SUMME, wo die Operationen tatsächlich durchgeführt werden und wo das Ergebnis zurückgegeben werden sollte.

LG Sylwester

WOKE_Wolfgang
vor 2 Jahre
Hi,

es ist leider so, dass das Beziehungswissen "getriggert" werden muss.

Das passiert erst wenn mit dem Merkmal an dem es hängt etwas passiert, also eine Eingabe erfolgt.

Da dein WSK_SUMME ein passiver Wert ist, der nicht manuell gefüllt werden soll wird der Code dahinter nie aktiviert.

Ich hänge daher alles Beziehungswissen in einer Klasse immer an ein Merkmal, das immer befüllt wird.

Das hilft auch die Übersicht aller Bedingungen und Prozeduren in einer Klasse zu behalten.

Gruß Wolfgang

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Hi Wolfgang ! :)

Wenn ich Dir noch eine Frage stellen darf.

Wie kann ich das folgende Beispiel durchführen

wenn meine Merkmal WSK_SUMME

- weniger als 10, dann ist die Merkmal WSK_INFO gleich "klein".

- gleich 10, dann ist das WSK_INFO gleich "mittel".

- größer als 10, dann ist die Merkmal WSK_INFO gleich "groß".

Wo kann ich etwas über diese Logik bezüglich "Beziehungswissen" lesen?

LG Silvester

WOKE_Wolfgang
vor 2 Jahre
Hi Silvester,

das müsste ebenfalls ganz einfach funktionieren.

Du musst an das Merkmal WSK_SUMME ein Beziehungswissen hängen:

** WSK_INFO anhand von WSK_SUMME füllen

$SELF.WSK_INFO = 'klein' IF $SELF.WSK_SUMME < 10,
$SELF.WSK_INFO = 'mittel' IF $SELF.WSK_SUMME = 10,
$SELF.WSK_INFO = 'groß' IF $SELF.WSK_SUMME > 10.

Dein Merkmal WSK_SUMME müsste ja bereits numerisch sein, da du es mit dem Ergebnis einer Summer befüllst.

Die besten Infos zu Beziehungswissen findest du wenn du in Google nach "SAP Beziehungswissen Syntax" suchst.

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Hi Wolfgang,

Mein SYNTAX von gestern und Deines von heute funktionieren, aber es gibt ein "Problem"

WSK_SUMME generiert (berechnet sich) automatisch (sofort), aber um die Merkmal WSK_INFO zu aktualisieren, muss ich zusätzlich irgendwo doppelklicken, um sie zu aktualisieren. Weißt Du, wo das Problem liegen könnte?

LG Silvester

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Problem gelöst,

Ich habe den gesamten SYNTAX in WSK_1

Ich danke Dir nochmals für Deine Zeit und Deine Hilfe.

Mit freundlichen Grüßen Sylwester

sim86
  • sim86
  • SAP Forum - Neuling
vor 2 Jahre
Hallo Wolfgang :)

Ich muss jedoch fragen:

Meine zuvor erwähnten Merkmale gehören zur Klasse "A".

Ich habe auch Klasse "B" und darin 1 Merkmal "WSK_B".

Wie baue ich einen SYNTAX, weil meiner nicht funktioniert und ich nicht weiß, wie ich mich auf die Klasse "B" beziehen soll?

Meine Syntax in Merkmal WSK_1 (Klasse "A"):

$SELF.WSK_SUMME = $SELF.WSK_1 + $SELF.WSK_2 IF SPECIFIED WSK_1
$SELF.WSK_INFO = 'klein' IF $SELF.WSK_SUMME < 10,
$SELF.WSK_INFO = 'mittel' IF $SELF.WSK_SUMME = 10,
$SELF.WSK_INFO = 'groß' IF $SELF.WSK_SUMME > 10,
*WSK_SUMME_2 - Ich habe neue Merkmal in der Klasse "A" hinzugefügt

$SELF.WSK_SUMME_2 = $PARENT.WSK_B + $SELF.WSK_1.

Hier weiß ich nicht, wie ich diesen $PARENT mit der Klasse "B" in Verbindung bringen soll.

Natürlich werden beide Klassen dem Material hinzugefügt.

Grüße Silvester

Schluchti
vor ein Jahr
Hi!

Ich grabe das mal wieder aus, da ich mir gerade an etwas hier dazupassendem die Zähne ausbeisse :(

Ich möchte, ähnlich wie der TE, einfach mehrere Merkmale in einem weiteren Merkmal mit ihren Werten verketten.

Das funktioniert auch ansich gut.

Mein Problem:

Ich sitze hier vor ca. 10 Merkmalen, welche in 20 Klassen vorkommen - allerdings in unterschiedlicher Anzahl - Also manchmal alle 10 Merkmale, dann wieder nur 8, usw....

Wenn nun ein Merkmal in einer dieser Klassen nicht vor kommt (oder nicht befüllt ist - das könnte ich aber durch Pflichteingabe umgehen), soll "00" genommen werden dafür.

(Zur Info: EIN Merkmal davon kommt überall vor, dort hänge ich auch das Beziehungswissen (Prozedur) drann)

Was funktioniert (wie hier oben im Thread):

Klasse A -

Merkmal A - AA

Merkmal B - BB

Merkmal C - CC

Berechnetes Merkmal D - AABBCC

Woran ich scheitere:

Klasse B

Merkmal A - AA

Merkmal B - Kommt in der Klasse nicht vor

Merkmal C - CC

Berechnetes Merkmal D AA00CC

Habs mit IF, SPECIFIED, NOT SPECIFIED versucht - Aber immer einen Syntaxfehler erhalten, woraus ich nicht schlau wurde... Vermute, dass ich lediglich irgendwo einen Tippfehler habe, daher würde ich mich freuen, wenn ihr mir bei dem Problem helfen könntet :)

Danke schon vorab wie immer

LG

Schluchti :)