Code: Alles auswählen.
REPORT z_trda_ber.
*&---------------------------------------------------------------------*
*& Selektion auf die Materialnummern
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
PARAMETERS pa_matnr TYPE matnr.
*&---------------------------------------------------------------------*
*& Deklarierung der Tabellen
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
DATA: lt_object_ident LIKE api_ob_key OCCURS 0,
ls_object_ident LIKE LINE OF lt_object_ident,
lt_charact_values like api_val_r occurs 0,
ls_charact_values like line of lt_charact_values,
lv_charact_value(100),
lt_charact_values_cond like api_val_r occurs 0,
pvi_matnr LIKE mara-matnr.
CLEAR lt_object_ident.
ls_object_ident-field = 'MATNR'.
ls_object_ident-value = pa_matnr.
APPEND ls_object_ident TO lt_object_ident.
*&---------------------------------------------------------------------*
*& Aufruf des FuBa
*&
*&---------------------------------------------------------------------*
*& Der FuBa sollte funktionieren, die daten liegen nach dem Funktionsbaustein in der Tabelle lt_charact_values
*&
*&---------------------------------------------------------------------*
CALL FUNCTION 'CACL_OBJECT_READ_VALIDATION'
EXPORTING
* OBJECT =
object_type = 'MARA'
class_type = '001'
class = 'Z_TRDA'
* WITH_UNASSIGNED_CHARACTS = 'X'
* WITH_INHERITED_CHARACTS = 'X'
* DATE =
* LANGUAGE = SYST-LANGU
* I_OBJ_NOT_CHK = ' '
* I_AENNR =
* I_EXECUTE_DEP = ' '
TABLES
object_identification = lt_object_ident
charact_values = lt_charact_values
EXCEPTIONS
error = 1
warning = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Code: Alles auswählen.
LOOP AT lt_charact_values INTO ls_charact_values.
"aus der ls_charact_values können die Werte woanders kopiert werden
ENDLOOP.
Code: Alles auswählen.
it_min = ls_charact_values-Z_TRDA_0980 * ls_charact_values-Z_TRDA_1065 *
'1,02' * lt_charact_values-Z_TRDA_0005 * lt_charact_values-Z_TRDA_0005 * PI / '4' *
lt_charact_values-Z_TRDA_0090 / ( lt_charact_values-Z_TRDA_0005 * lt_charact_values-Z_TRDA_0005 * PI )
/ '4' * lt_charact_values-Z_TRDA_0090 + lt_charact_values-Z_TRDA_0015 * lt_charact_values-Z_TRDA_0015 * PI /
( '4' * lt_charact_values-Z_TRDA_0095 ) .
Code: Alles auswählen.
LOOP AT lt_charact_values INTO ls_charact_values.
it_min = ls_charact_values-Z_TRDA_0980 * ls_charact_values-Z_TRDA_1065 *
'1,02' * ls_charact_values-Z_TRDA_0005 * ls_charact_values-Z_TRDA_0005 * PI / '4' *
ls_charact_values-Z_TRDA_0090 / ( ls_charact_values-Z_TRDA_0005 * ls_charact_values-Z_TRDA_0005 * PI )
/ '4' * ls_charact_values-Z_TRDA_0090 + ls_charact_values-Z_TRDA_0015 * ls_charact_values-Z_TRDA_0015 * PI /
( '4' * ls_charact_values-Z_TRDA_0095 ) .
it_max = ....
write: pa_matnr, it_min, it_max.
ENDLOOP.
Code: Alles auswählen.
ls_charact_values-Z_TRDA_0015 * ls_charact_values-Z_TRDA_0015
Code: Alles auswählen.
ls_charact_values-Z_TRDA_0015 ** 2
Code: Alles auswählen.
CALL FUNCTION 'CACL_OBJECT_READ_VALIDATION'
EXPORTING
* OBJECT =
object_type = 'MARA'
class_type = '001'
class = 'Z_TRDA'
* WITH_UNASSIGNED_CHARACTS = 'X'
* WITH_INHERITED_CHARACTS = 'X'
* DATE =
* LANGUAGE = SYST-LANGU
* I_OBJ_NOT_CHK = ' '
* I_AENNR =
* I_EXECUTE_DEP = ' '
TABLES
object_identification = lt_object_ident
charact_values = lt_charact_values
EXCEPTIONS
error = 1
warning = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*&---------------------------------------------------------------------*
*& Ab hier entsteht nun die Berechnung
*&
*&---------------------------------------------------------------------*
*& Die Daten liegen in lt_charact_values; ev. kann ich direkt die Felder aus dieser für die Berechnung ziehen
*& ev. eine interne Tabelle anlegen welche mit den Min. und Max. Daten befüllt werden und dann zur ausgabe
*& gebracht werden;; eventuell kann ich die Fehlermeldung mit einem loop von der lt_ in die ls_ lösen
*&---------------------------------------------------------------------*
Data: it_min type p LENGTH 5 DECIMALS 2,
it_max type p LENGTH 5 DECIMALS 2.
data: lt_charact like lt_charact_values[].
LOOP AT lt_charact_values INTO ls_charact_values.
ENDLOOP.
* it_min = ls_charact_values-Z_TRDA_0980 * ls_charact_values-Z_TRDA_1065 *
*'1,02' * ls_charact_values-Z_TRDA_0005 * ls_charact_values-Z_TRDA_0005 * PI / '4' *
*ls_charact_values-Z_TRDA_0090 / ( ls_charact_values-Z_TRDA_0005 * ls_charact_values-Z_TRDA_0005 * PI )
*/ '4' * ls_charact_values-Z_TRDA_0090 + ls_charact_values-Z_TRDA_0015 * ls_charact_values-Z_TRDA_0015 * PI /
*( '4' * ls_charact_values-Z_TRDA_0095 ) .
*
write: pa_matnr, it_min, it_max.
Was bist du denn dann?commolus hat geschrieben:, da ich weder mathematiker noch techniker bin.
Code: Alles auswählen.
* Struktur mit allen Merkmalen definier, BITTE den Datentyp auf deine Bedürfnisse ändern
TYPES: BEGIN OF ts_merkmale,
Z_TRDA_0980 TYPE i,
Z_TRDA_1065 TYPE i,
Z_TRDA_0005 TYPE i,
..... "für jedes Merkmal aus der Formel ein Feld einfügen!
END OF ts_merkmlae.
DATA: ls_merkmale TYPE ts_merkmale
CALL FUNCTION 'CACL_OBJECT_READ_VALIDATION'
....
EXCEPTIONS
error = 1
warning = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* Hie gehört ein vernüpftiges Fehlerhandling hin!
ENDIF.
*&---------------------------------------------------------------------*
*& Ab hier entsteht nun die Berechnung
*&
*&---------------------------------------------------------------------*
*& Die Daten liegen in lt_charact_values;
*&---------------------------------------------------------------------*
CLEAR: ls_merkmale.
LOOP AT lt_charact_values INTO ls_charact_values.
* Merkmale aus der ITAB in die Strucktur übernehmen:
CASE ls_charact_values-charact.
WHEN 'Z_TRDA_0980'.
ls_merkmal-Z_TRDA_0980 = ls_charact_values-value.
WHEN 'Z_TRDA_1065'.
ls_merkmal-Z_TRDA_1065 = ls_charact_values-value.
WHEN ... "für jedes Merkmal in der Formel müssen die Werte übernommen werden.
WHEN OTHERS.
CONTINUE. "dieses Merkmal interessiert uns nicht!
ENDCASE.
ENDLOOP.
* Jetzt rechnen mit den Werten der einzelnen Merkmalen aus der Struktur:
it_min = ls_merkmal-Z_TRDA_0980 * ls_merkmal-Z_TRDA_1065 * .......
write: pa_matnr, it_min, it_max.
Ich würde diese Einstellung überdenken. Die Formel kommt von jemand anders, aber es fällt dir auf die Füsse, denn es ist in deinem Programm verbaut! Wenn du das Programm so gestalten möchtest, dass du es später nicht so oft anfassen musst (oder leichter warten kannst), so solltest du dich schon im Vorfeld damit auseinander setzen. Dazu gehört zum Beispiel der Versuch die Lesbarkeit der Formel zu verbessern, für den Fall, dass du in 1-2 Jahren das Programm verändern möchtest und nicht mehr weisst was hier eigentlich passiert. Dazu gehört auch der Versuch potentiell mögliche Fehler zu erkennen wie Division durch Null oder Feldüberlauf, wenn das Ergebnis der Formel zu gross ist, um in die Zielvariable geschrieben zu werden.commolus hat geschrieben: ...es geht jetzt nicht um die Richtigkeit der Formel, die ist mir jetzt egal, da ich weder mathematiker noch techniker bin. Für die Richtigkeit der Formel müssen andere in der Firma sorge tragen...
Schreiben Sie Ihren Code so, als wäre der Typ, der Ihren Code warten muss, ein pathologischer Amokläufer, der Ihre Adresse kennt
Mittels SPLIT beim SPACE in zwei Teile zerlegen. Benötigt wird nur der erste Teil, wobei da dann noch das Komma durch einen Punkt ersetzt werden muss.commolus hat geschrieben:Was haltet ihr von dem Ansatz diese letzten Zeichen mit "replace regex 'D\s*$' in" zu entfernen.
Das hört sich jetzt vielleicht blöd an - aber versuch mal beim Aufbau der Tabelle mittels des FuBa CACL_OBJECT_READ_VALIDATION den Importparameter LANGUAGE mit einer bei euch nicht installierten Sprache ( z.B. trad. Chinesisch = M oder arabisch = A ) aufzurufen und schau dir dann an, was in der Tabelle zurückgegeben wird.commolus hat geschrieben:Was haltet ihr von dem Ansatz diese letzten Zeichen mit "replace regex 'D\s*$' in" zu entfernen. Funktioniert nur leider nicht so wie ich das wollte.
Hat jemand dazu Erfahrung?
Geht leider nicht. Das Ergebnis bleibt das Gleicheblack_adept hat geschrieben:Das hört sich jetzt vielleicht blöd an - aber versuch mal beim Aufbau der Tabelle mittels des FuBa CACL_OBJECT_READ_VALIDATION den Importparameter LANGUAGE mit einer bei euch nicht installierten Sprache ( z.B. trad. Chinesisch = M oder arabisch = A ) aufzurufen und schau dir dann an, was in der Tabelle zurückgegeben wird.commolus hat geschrieben:Was haltet ihr von dem Ansatz diese letzten Zeichen mit "replace regex 'D\s*$' in" zu entfernen. Funktioniert nur leider nicht so wie ich das wollte.
Hat jemand dazu Erfahrung?