Auftragserfassung: Automatische (Positions-) Texte
In der Auftragserfassung (Modulpool SAPMV45A) sollen bei Auftragsanlage oder -änderung kundenindividuelle Texte definiert werden.
Standard-Textfindung
Im Standard lässt sich bereits eine umfangreiche Textfindung einstellen. Hier geht es jedoch darum, Texte aus anderen Objekten (Vorgängerbelegen, Kunden, Materialien, …) zu finden und zu übernehmen.
Ausgangspunkt ist die Transaktion VOFM, Menü Kopierbedingungen • Texte oder Datenübernahme • Texte. Hier kannst du Bedingungen programmieren und zuordnen, die den gewünschten Text ermitteln.
Textverwaltung in SAP
In diesem Artikel geht es darum, individuelle Texte in eine Auftragsposition zu bekommen. Um das zu realisieren, muss man wissen, wie die Textverwaltung im SAP funktioniert. Darum hier ein kurzer Abriss zu den SAP-Langtexten.
Standardlangtexte können in der Transaktion SO10 erstellt und bearbeitet werden. Zur Bearbeitung hast die Auswahl zwischen dem uralten Zeilen-Editor und dem PC-Editor, der zwischenzeitlich durch Microsoft Word abgelöst wurde.
Absatzformate
Ein SAP-Langtext oder auch SAP-Script- oder ITF-Text, besteht aus einem Absatzformat und einer Zeile. Absatzformate können in Stilen definiert und zugeordnet werden (Transaktion SE72).
Das Sternchen * ist das Standardabsatzformat. Steht das * in der Spalte Absatzformat, dann erfolgt auf jeden Fall ein Zeilenumbruch. Bei einem Fließtext ist das Absatzformat leer.
Felder
Um einen Text eindeutig zu identifizieren, sind die folgenden Felder notwendig:
Feldname | Beschreibung | Infos |
---|---|---|
TDOBJECT | Textobjekt | Definiert den Anwendungsbereich. Standardtexte haben das Textobjekt TEXT, Auftragskopftexte VBBK und Auftragspositionstexte VBBP, Materialstamm hat MATERIAL und MVKE. Textobjekte werden mit Hilfe der Transaktion SE75 definiert. Für eigene Anwendungen können im Kundennamensraum eigene Objekte definiert werden. |
TDNAME | Textname | Der Textname besteht bei Texten zu Anwendungsobjekten (Aufträge, Kunden, Materialien, etc.) aus den Schlüsselfeldern der zugehörigen Tabelle. Beispiel: Vertriebstext Material (MVKE): <matnr><vkorg><vtweg> |
TDID | Text-ID | Die Id definiert Texte innerhalb eines Text-Objektes. Sie muss im Customizing definiert werden (Transaktion SE75). |
TDSPRAS | Sprache | Sprache des Textes. |
Speicherort
Die Texte werden in den Tabellen STXH (Kopfdaten) und STXL (Textzeilen) gespeichert. Die Tabelle STXH kann man in der Tabellenanzeige (Transaktion SE16n) einsehen. In der STXL werden die Textzeilen jedoch komprimiert gespeichert und können nicht angesehen werden.
Texte lesen
Um Texte einzulesen, solltest du den Funktionsbaustein READ_TEXT verwenden. Um Texte zu suchen, kannst du direkt die Tabelle STXH durchsuchen oder du verwendest den Funktionsbaustein SELECT_TEXT.
Speichern von Texten
Die Speicherung von Texten erfolgt mit Hilfe des Funktionsbausteins SAVE_TEXT. Diesem Baustein müssen die Schlüsselfelder übergeben werden. Wenn man weiß, dass der Text noch nicht existiert, dann sollte aus Performancegründen der Parameter INSERT = X
gesetzt werden. Möchte man den Text in einer eigenen Anwendung sofort sichern, so kann der Parameter SAVEMODE_DIRECT = X
gesetzt werden. Beim Speichern von mehreren Texten sollte der Funktionsbaustein COMMIT_TEXT verwendet werden.
Mit dem Funktionsbaustein INIT_TEXT können Texte angelegt werden.
Funktionsbaustein DELETE_TEXT löscht vorhandene Texte.
Zentrales Textmemory
Die Textverwaltung hat ein zentrales Memory. Aus diesem Grund sollte immer mit den entsprechenden Funktionsbausteinen auf die Texte zugegriffen werden. Der READ_TEXT liest den Text aus dem Textmemory, sofern vorhanden.
Textverwaltung SAPMV45A
Kommen wir nun endlich zum Ausgangsthema zurück: Programmatische Bearbeitung von Texten in der Auftragsbearbeitung (Modulpool SAPMV45A). Du solltest wegen des zentralen Textmemories zur Bearbeitung immer die oben beschriebenen Funktionsbausteine verwenden. So kannst du in der Transaktion den Baustein READ_TEXT verwenden, um zu prüfen, ob bereits ein Auftragskopftext zu einer bestimmten ID oder zu einer Position schon ein Text angelegt wurde, auch wenn diese noch nicht auf der Datenbank gespeichert wurde.
Eine separate Speicherung ist nicht notwendig bzw. sogar verboten -, denn die Speicherung erfolgt zentral durch die Applikation. Wird die Transaktion abgebrochen, dann werden die Texte auch nicht gespeichert.
Auf keinen Fall darfst du im Baustein SAVE_TEXT den Parameter SAVEMODE_DIRECT setzen, den Baustein COMMIT_TEXT oder COMMIT WORK verwenden! Das wird von der Applikation SAPMV45A beim Sichern gemacht!
Verwendest du doch einen COMMIT in den Exits, dann riskierst du einen Datenschiefstand und Fehlfunktionen von BAPIs.
Codebeispiel
In folgendem Code-Beispiel wird der Text zu einem neu eingegebenen Material aus dem Literal “ARKTX:” und dem aktuellen Artikeltext erstellt.
FORM userexit_move_field_to_vbap. DATA ls_header TYPE thead. DATA lt_lines TYPE STANDARD TABLE OF tline. IF vbap-vbeln IS INITIAL. ls_header-tdname = 'XXXXXXXXXX' && vbap-posnr. ELSE. ls_header-tdname = vbap-vbeln && vbap-posnr. ENDIF. ls_header-tdobject = 'VBBP'. ls_header-tdid = '0001'. ls_header-tdspras = sy-langu. CALL FUNCTION 'READ_TEXT' EXPORTING id = ls_header-tdid language = ls_header-tdspras name = ls_header-tdname object = ls_header-tdobject local_cat = space IMPORTING header = ls_header TABLES lines = lt_lines EXCEPTIONS OTHERS = 8. IF sy-subrc <> 0. lt_lines = VALUE #( ( tdformat = '*' tdline = |test { vbap-arktx }| ) ). CALL FUNCTION 'SAVE_TEXT' EXPORTING header = ls_header insert = abap_true savemode_direct = space local_cat = space TABLES lines = lt_lines EXCEPTIONS OTHERS = 5. ENDIF. ENDFORM.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024