Hallo Zusammen!
Ich bin im Rahmen eines SAP-Einführungsprojekts in meiner Firma u.A. damit betraut mich ein wenig in die ABAP-Welt einzuarbeiten, da ich auf eine lange Programmiervergangenheit zurückblicken kann. In ABAP habe ich bisher viele kleine Codings für die Datenübernahme in der LSMW gebastelt und für mich selbst ein wenig DynPro experimente, namentlich eine kleine, eigenständige Applikation mit 3 DynPro-Bildern und komplett eigenen Tabellen im Dictionary, keinerlei Interferenzen mit bestehenden Tabellen.
Nun habe ich die Aufgabe für unseren Produktkonfigurator, dessen Mechanik von einem anderen Mitarbeiter aus dem Altsystem in SAP-Technik übersetzt wurde, einen Funktionsbaustein zu schreiben der in etwa folgendes tut:
Es existiert eine Variantentabelle, die sämtliche Merkmale des Konfigurationsprofils/der Konfigurationsklasse enthält. Es existiert ein (CHAR-)Merkmal das als zugelassene Werte einen aus ein paar dominanten Merkmalen und einer Zählnummer generierten Ordercode enthält, dieser existiert ebenfalls als Feld in der Konfiguration und kann zum Abkürzen des Konfigurationsvorgangs benutzt werden wenn der Kunde ein von Ihm konfiguriertes Gerät mehrfach bestellt (kommt bei uns häufig vor). Dazu muss ich die Konfiguration gegen einen Eintrag in der Variantentabelle prüfen, sollte das Gerät schonmal konfiguriert worden sein dessen Ordercode anziehen, wenn nicht einen Eintrag in der Variantentabelle mit neuem Ordercode erzeugen und das Merkmal Ordercode um diesen generierten Eintrag erweitern..
Nun dachte ich das direkter Tabellenzugriff auf CABN, CUVTAB und Konsorten schreibend nicht der Hit ist und sich auch lesen der Variantentabelle, die ja notgedrungen relativ aufwändig verbaut ist in SAP über Funktionsbausteine wohl eleganter/sicherer ist. Also habe ich mich auf die Suche gemacht und ein paar potentiell hilfreiche Kandidaten für das Projekt rausgesucht, leider scheitern schon die einfachsten Dinge an extrem schlechter Dokumentation der Bausteine oder einem massiven Verständnisproblem von mir.
Langer Rede kurzer Sinn, ich habe eine Testreport für 2 Funktionsbausteine geschrieben die meiner Meinung nach das tun was ich möchte, aber die Ergebnisse sind ernüchternd
Kandidat 1 ist der Versuch ein Textmerkmal zu verändern, bzw. dessen Liste zulässiger Werte zu erweitern, dazu habe ich per CT04 ein Merkmal 'FUBAU_TESTMERKMAL' angelegt und auf dieses folgendes Coding mit dem eigentlich gar nicht Dokumentierten API (Was bedeutet das bei SAP eigentlich, sonst Application Programming Interface, aber so gesehen sind eigentlich so ziemlich alle FuBaus API, oder?) FuBau 'CTMV_CHARACT_CHANGE'losgelassen:
****************************************************************
* Test I: ein Merkmal um zugelassene Merkmalwerte zu erweitern
****************************************************************
DATA: it_cv TYPE TABLE OF char_vals WITH HEADER LINE,
it_ct TYPE TABLE OF chv_descr WITH HEADER LINE,
it_cdescr TYPE TABLE OF char_descr WITH HEADER LINE.
*it_cdescr-charact = 'FUBAU_TESTMERKMAL'.
*it_cdescr-language = 'D'.
*it_cdescr-language_iso = 'DE'.
*it_cdescr-chdescr = 'Blah'.
*APPEND it_cdescr.
it_cv-charact = 'FUBAU_MERKMAL'.
*i_cv-value_bef = 'INIT'.
it_cv-value = 'MOOP'.
it_cv-value_high = 'MOOP'.
APPEND it_cv.
it_ct-charact = 'DIT_FUBAU_TESTMERKMAL'.
it_ct-value = 'MOOP'.
it_ct-language = 'D'.
it_ct-language_iso = 'DE'.
it_ct-valdescr = 'Über FuBau generiert'.
APPEND it_ct.
* Sicherheitshalber initialisieren, keine Ahnung ob das muss, wo stünde das wenn?
CALL FUNCTION 'CTMV_CHARACT_INIT'.
* Versuch ein Merkmal zu ändern, er bekommt das richtige Merkmal zu fassen, im
* Debugger ist zu erkennen das er die richtige Nummer aus CABN anzieht, danach
* wird es allerdings zu wirr wenn man das ganze Programm durchsteppt, macht
* viel in temporären Tabellen, aber es kommt auch nirgends ein UPDATE. Einzig
* wenn man selber das Merkmal bearbeitet zu dem Zeitpunkt meckert es auch das
* der Zugriff nicht möglich ist..
CALL FUNCTION 'CTMV_CHARACT_CHANGE'
EXPORTING
* CHANGE_NUMBER =
charact = 'FUBAU_TESTMERKMAL'
key_date = sy-datum
TABLES
* CHARACTERISTIC_DATA =
* characteristic_texts = it_cdescr
* CLASS_TYPE =
* TABLEFIELDS =
characteristic_values = it_cv
characteristic_values_texts = it_ct
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.
* Explizites Speichern des Merkmals mit diesem Baustein ändert auch nix..
CALL FUNCTION 'CTMV_CHARACT_SAVE'
* EXPORTING
* PF_DEP_CHANGED = ' '
EXCEPTIONS
not_changed = 1
error = 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.
Ergebnis ist das das Dingen fehlerfrei durchläuft aber nicht im Mindesten irgendetwas an einem Merkmal ändert.. Ich habs ein wenig im Debugger verfolgt, er findet das richtige Merkmal, solange ich die Exceptions zulasse mosert er auch wenn ich in dem Merkmal manuell drinstehe, macht aber keine Anstalten irgendwas zu verändert, was kann hier der Fehler sein? (Sieht so aus als ob er das alles in temporären Tabellen macht, aber auch ein CTMV_CHARACT_SAVE danach sorgt für keine Veränderung, warum hat das im übrigen keine Parameter? Auch sehr ulkig ist das dieser Funktionsbaustein wenn ich nen Verwendungsnachweis fahre irgendwie nur in einem Include verbaut zu sein scheint.. Wenn ich nach ner Alternative suche finde ich noch nen CAMA_CHARACT_CHANGE oder so, aber der ist obsolet wie es scheint..)
Der andere probierte FuBau 'CUTS_TABLE_SELECT' soll einen SELECT auf eine Variantentabelle fahren, nach viel suchen habe ich rausgefunden das er überhaupt nur etwas tut wenn ich in der Query-Tabelle die ich übergebe in dem Merkmal was ich beschreibe ein 'O' für 'Output' setze, was ich in dem Datenelement überhaupt setzen kann habe ich nur nach viel gründeln im Netz gefunden.. Allerdings selektiert er bei mir Grundsätzlich den gesamten Inhalt der Tabelle, unabhäbgig was für einen Vergleichsoperator ich setze, der mir im übrigen eh spanisch vorkommt, solange nur ein 'O' in dem Betreffenden Datenelement 'query-atcio' vorkommt und das Merkmal überhaupt existiert in der Tabelle.. Bei nem 'I' findet er gar nix.. Vielleicht habe ich den query/match mechanismus nicht verstanden, aber so wie ich das interpretiere übergebe ich ne Tabelle mit Anfrageinformationen und bekomme ne Tabelle in match mit dem Ergebnis.. das Ding lässt sich auch über SE37 ganz gut testen, aber ich steig nicht dahinter, wo finde ich denn Dokumentation zu dem query/match Szenario, das es ja noch in andere FuBaus gibt?
Achja, Release ist das neueste ECC 6.0 mit nem 7.20 oder so Frontend, was aber keine Rolle spielen sollte..
************************************************************
* Test II: FuBau SELECT auf einen Variantentabelleneintrag
************************************************************
DATA: it_query TYPE TABLE OF cusl_05,
it_match TYPE TABLE OF cusl_06,
i_num_entries TYPE i.
DATA: i_query LIKE cusl_05.
*i_query-atinn = '0000000401'.
i_query-atinn = 'FUBAU_TESTTABELLE'.
i_query-atfor = 'CHAR'.
i_query-atwrt = 'TEST'.
i_query-atcod = '1'. " Hier irgendwas anderes als 1 für EQ zu nehmen ändert nichts..
i_query-atcio = 'O'. " Warum nun ausgerechnet O und nicht I und woher weiss ich das?
INSERT i_query INTO TABLE it_query.
CALL FUNCTION 'CUTS_TABLE_SELECT'
EXPORTING
table = '0000000133' " Hier mal zum testen manuell gesetzt aus CUVTAB..
date = sy-datum
IMPORTING
ENTRIES_FOUND = i_num_entries
tables
query = it_query
match = it_match
EXCEPTIONS
NOT_FOUND = 1
NO_CHARACTERISTICS = 2
NO_QUERY = 3
NO_ENTRY_FOUND = 4
INTERNAL_ERROR = 5
OTHERS = 6
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
WRITE: 'Fehler! (', SY-MSGNO, ')'.
ENDIF.
WRITE: 'Gefundene Einträge: ', i_num_entries.
Ich bin für jede Form von Antwort, Tipps und Kritik dankbar, da ziemlich aufgeschmissener Neuling im SAP Umfeld..
Gruß,
Olli