*---------------------------------------------------------------------*
*                       Z _ B J H _ S T X L                           *
*                                                                     *
*                 Autor: Bernd Haase (BJH Software)                   *
*---------------------------------------------------------------------*
* Fließtexte auswerten und anzeigen können. Diese Texte entsprechen   *
* der VPSS-Struktur SDATXT. Die Texte werden im Cluster angelegt. Die *
* Basis-(Header)-Tabelle ist die STXH. Dort werden die Daten heraus-  *
* selektiert, welche dann durch den Funktionsbaustein anzeigegerecht  *
* aufbereitet werden. Im Beispiel wird der Text im letzten Zeichen    *
* verändert und durch den Gegen-Funktionsbaustein zurückgeschrieben.  *
*                                                                     *
* Diese Art der Fließtextbehandlung wird im gesamten SAP-System       *
* benutzt, deswegen sind mehrere vordefinierte Typen angezeigt und    *
* auch die Möglichkeit frei zu wählen. In diesem Beispiel werden die  *
* einzeln aufbereiteten Zeilen am Bildschirm ausgegeben.              *
*---------------------------------------------------------------------*
* FB 'READ_TEXT' und 'SAVE_DATA', Suchhilfe
*---------------------------------------------------------------------*
* 27.09.2003 BHaa: Programm erstellt mit 'READ_TEXT'                  *
* 11.06.2004 BHaa: um FB 'SAVE_DATA' erweitert                        *
* 05.08.2004 BHaa: mehrere Textarten im Auswahlbildschirm             *
*---------------------------------------------------------------------*
REPORT  z_bjh_stxl .

TABLES:
 stxh.   "STXD SAPscript Text-Datei Header

CONSTANTS:
 gewuenschte_auswahl(1) TYPE c VALUE 'X'.

*---------------------------------------------------------------------*
* Textbasisdaten einlesen Tabellen STXH und STXL
*---------------------------------------------------------------------*
DATA:
 t_thead LIKE thead OCCURS 1 WITH HEADER LINE.

DATA:
* falls der Schlüssel zusammengebaut werden muß
 wa_tdname LIKE stxh-tdname.

*---------------------------------------------------------------------*
* Zwischentabelle für den aufgeteilten Text.
* der Fließtext wird gesplittet und in die Datenelemente
* abgespeichert
*---------------------------------------------------------------------*
DATA: BEGIN OF t_lines OCCURS 0.
       INCLUDE STRUCTURE tline.
DATA: END OF t_lines.

DATA:
* Anzeigestruktur für die Ausgabe
 wa_lines LIKE t_lines,

* Rückgabewert, wie der FB den Text bearbeitet hat
 fb_aktion(1) TYPE c.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Alle Radiobuttons zu einer Gruppe müssen im gleichen Block defi-    *
* niert sein.                                                         *
*---------------------------------------------------------------------*
* Auswahlparameter zum Lesen eines Textes
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
* Vorbelegung zum Lesen eines Textes der Bestellung 4500001034.
PARAMETERS:
* Bestellungen. Vorbelegung ist eine Bestellposition
 pmx_ekko RADIOBUTTON GROUP grp1 DEFAULT 'X',
 pmekobj  LIKE stxh-tdobject DEFAULT 'EKPO',
 pmekname LIKE stxh-tdname   DEFAULT '450000103400010',
* welcher Text (s.a.Customizing)
 pmekid   LIKE stxh-tdid     DEFAULT 'F05'.

SELECTION-SCREEN: ULINE.

PARAMETERS:
* Materialstamm. Vorbelegung ist Materialnummer und Werk
 pmx_mara RADIOBUTTON GROUP grp1,
 pmmaobj  LIKE stxh-tdobject DEFAULT 'MATERIAL'.
SELECT-OPTIONS:
* bei Bezug zu einem Werk => Lücke beachten. Aufbau ist Material(18),
* Trennzeichen(1), Werk(4)
 somaname FOR stxh-tdname.
PARAMETERS:
* welcher Text zum Material
* Feld ist ausgestattet mit F4-Suchhilfe
 pmmaid   LIKE stxh-tdid DEFAULT 'IVER'.

SELECTION-SCREEN: ULINE.

PARAMETERS:
* Pläne (Positionsebene)
 pmx_plpo RADIOBUTTON GROUP grp1,
 pmplnty  LIKE plpo-plnty DEFAULT 'N',
 pmplnnr  LIKE plpo-plnnr DEFAULT '50000023',
 pmplnkn  LIKE plpo-plnkn DEFAULT '00000002',
 pmplzae  LIKE plpo-zaehl DEFAULT '00000002'.

SELECTION-SCREEN: ULINE.
PARAMETERS:
* freier Texte von irgendwo. Freies Format
 pmx_frei RADIOBUTTON GROUP grp1,
 pmxxobj  LIKE stxh-tdobject DEFAULT '?',
* welche Referenzierung
 pmxxname LIKE stxh-tdname   DEFAULT '?',
 pmxxid   LIKE stxh-tdid     DEFAULT '????'.

SELECTION-SCREEN: END OF BLOCK a1.

* Aktionsrichtung, nur einlesen oder auch zurückschreiben
SELECTION-SCREEN: BEGIN OF BLOCK a2 WITH FRAME TITLE text-902.
PARAMETERS:
* nur einlesen und anzeigen
 pmx_read RADIOBUTTON GROUP grp2 DEFAULT 'X',
* lesen, verändern, speichern
 pmx_save RADIOBUTTON GROUP grp2.
SELECTION-SCREEN: END OF BLOCK a2.

***********************************************************************
*                          S U C H H I L F E                          *
*                                                                     *
* für das Feld Status Identifikation Materialtexte                    *
***********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pmmaid.

 DATA:
* Felder der Anzeige im Pop-Up
   BEGIN OF felder OCCURS 10.
         INCLUDE STRUCTURE help_value.
 DATA:
   END OF felder.

 DATA:
* Werte für die Suchhilfe
   BEGIN OF werte OCCURS 10,
     text(100),
   END OF werte.

 DATA:
   BEGIN OF zurueck,
     obj LIKE stxh-tdobject,
     id  LIKE stxh-tdid,
   END OF zurueck.

* Übergabetabellen für Funktionsbaustein initialisieren
 CLEAR:   felder, werte.

 REFRESH: felder, werte.

* Felder besetzen
* nennen der Tabelle, von woher die Werte kommen sollen
 MOVE 'STXH  '   TO felder-tabname.
* Feld, welches zur Selektion dient (Teil des Pop-Ups)
 MOVE 'TDOBJECT' TO felder-fieldname.
 MOVE ' '        TO felder-selectflag.
 APPEND felder.

 MOVE 'STXH  '   TO felder-tabname.
 MOVE 'TDID'     TO felder-fieldname.
 MOVE 'X'        TO felder-selectflag.
 APPEND felder.

* Weiteres Feld (Kurztext) für das Pop-Up, nur Anzeige
 MOVE 'T77FD' TO felder-tabname.
 MOVE 'FTEXT' TO felder-fieldname.
 MOVE ' ' TO felder-selectflag.
 APPEND felder.

* Suchhilfetabelle auffüllen
 MOVE 'MATERIAL' TO werte-text. APPEND werte.
 MOVE 'BEST'     TO werte-text. APPEND werte.
 MOVE 'Bestelltexte' TO werte-text. APPEND werte.

 MOVE 'MATERIAL' TO werte-text. APPEND werte.
 MOVE 'GRUN'     TO werte-text. APPEND werte.
 MOVE 'Grunddaten' TO werte-text. APPEND werte.

 MOVE 'MATERIAL' TO werte-text. APPEND werte.
 MOVE 'IVER'     TO werte-text. APPEND werte.
 MOVE 'interne Vermerke' TO werte-text. APPEND werte.

 MOVE 'MDTXT   ' TO werte-text. APPEND werte.
 MOVE 'LTXT'     TO werte-text. APPEND werte.
 MOVE 'Materialnotizen' TO werte-text. APPEND werte.

* Pop-Up aufrufen
 CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE'
      EXPORTING
           display      = ' '
           fieldname    = 'TDOBJECT'
           tabname      = 'STXH'
      IMPORTING
           select_value = zurueck
      TABLES
           fields       = felder
           valuetab     = werte
      EXCEPTIONS
           OTHERS       = 4.

* gültige Auswahl. Wert des Pop-Up übernehmen.
 IF sy-subrc = 0.
   MOVE zurueck TO pmmaid.
 ENDIF.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.
*---------------------------------------------------------------------*
* Einlesen des Objektes, welches benötigt wird.
* Hier im Beispiel ein Single-Read auf einen Text in einer Bestellung
* "tdobject": Objektname, hier: EKKO=Einkaufsbelegkopfdaten
* "tdname": Detail, hier: welche Bestellung soll ausgelesen werden
* "tdid" ist in diesem Fall die Kombination
*   1.   Stelle: Belegart (fest programmiert)
*   2-3. Stelle: Fließtextart der Kopfdaten (weil EKKO)
*        Customizing: IMG => Materialwirtschaft => Einkauf =>
*                     Bestellung => Textarten (Kopf oder Pos.)
*   4.   Stelle: unbenutzt
*---------------------------------------------------------------------*
* es werden alle verfügbareb Sprachen eingelesen                      *
*---------------------------------------------------------------------*
 CASE gewuenschte_auswahl.
* Bestellung einlesen. Kopfdaten oder Positionsdaten
   WHEN pmx_ekko.
     SELECT tdobject tdname tdid tdspras FROM stxh
     INTO CORRESPONDING FIELDS OF TABLE t_thead
     WHERE tdobject = pmekobj
     AND   tdname   = pmekname
     AND   tdid     = pmekid.
* Materialen
   WHEN pmx_mara.
     SELECT tdobject tdname tdid tdspras FROM stxh
     INTO CORRESPONDING FIELDS OF TABLE t_thead
     WHERE tdobject = pmmaobj
     AND   tdname  IN somaname
     AND   tdid     = pmmaid.

* Zusammenbauen des Schlüsses bei Plänen
   WHEN pmx_plpo.
     MOVE sy-mandt TO wa_tdname.
     MOVE pmplnty  TO wa_tdname+3(1).
     MOVE pmplnnr  TO wa_tdname+4(8).
     MOVE pmplnkn  TO wa_tdname+12(8).
     MOVE pmplzae  TO wa_tdname+20(8).

     SELECT tdobject tdname tdid tdspras FROM stxh
     INTO CORRESPONDING FIELDS OF TABLE t_thead
     WHERE tdobject = 'ROUTING   '
     AND   tdname   = wa_tdname
     AND   tdid     = 'PLPO'.

* freier Text. Offener Zugriff auf alles mögliche, da Schlüssel und
* Objekte frei vergeben werden können. Allerdings muß auf die stellen-
* gerechte Eingabe geachtet werden, da dieser Part nichts zusammenbaut
   WHEN pmx_frei.
     SELECT tdobject tdname tdid tdspras FROM stxh
     INTO CORRESPONDING FIELDS OF TABLE t_thead
     WHERE tdobject = pmxxobj
     AND   tdname   = pmxxname
     AND   tdid     = pmxxid.
 ENDCASE.

*---------------------------------------------------------------------*
* Zwischentabelle für textbaustein jagen, um den Text
* splitten zu lassen und somit ausgabefreundlich zu gestalten
*---------------------------------------------------------------------*
 IF sy-subrc <> 0.
   CLEAR: t_lines.
 ELSE.
   LOOP AT t_thead.
* Überschriftszeile
     FORMAT COLOR 3 ON INTENSIFIED OFF.
     WRITE AT: /3 'Objekt   :', 14 t_thead-tdobject, 84 '.'.
     WRITE AT: /3 'Schlüssel:', 14 t_thead-tdname, 84 '.'.
     WRITE AT: /3 'Ident    :', 14 t_thead-tdid, 84 '.'.
     WRITE AT: /3 'Sprache  :', 14 t_thead-tdspras, 84 '.'.
     FORMAT COLOR 3 OFF INTENSIFIED ON.

     CALL FUNCTION 'READ_TEXT'
          EXPORTING
               id       = t_thead-tdid
               language = t_thead-tdspras
               name     = t_thead-tdname
               object   = t_thead-tdobject
          TABLES
               lines    = t_lines.

*---------------------------------------------------------------------*
* Text ist gesplittet vorhanden, die einzelnen Textzeilen verarbeiten
* in diesem Fall einfach am Bildschirm ausgeben
*---------------------------------------------------------------------*
     CLEAR wa_lines.
     LOOP AT t_lines INTO wa_lines.
* 132. Teichen verändern, um das Updaten in SAP sichtbar zu machen
       CASE wa_lines-tdline+131(1).
         WHEN 'A'.
           MOVE 'B' TO wa_lines-tdline+131(1).
         WHEN 'B'.
           MOVE 'C' TO wa_lines-tdline+131(1).
         WHEN 'C'.
           MOVE 'D' TO wa_lines-tdline+131(1).
         WHEN OTHERS.
           MOVE 'A' TO wa_lines-tdline+131(1).
       ENDCASE.

       MODIFY t_lines FROM wa_lines INDEX sy-tabix.

       WRITE: / wa_lines-tdline.
     ENDLOOP.

     SKIP 1.
*---------------------------------------------------------------------*
* Änderung oder Neuanlage-Funktionsbaustein aufrufen
* gleiche Daten, gleiche Kopfdateninformationen wie beim Einlesen
*---------------------------------------------------------------------*
     IF pmx_save = 'X'.
       CALL FUNCTION 'SAVE_TEXT'
            EXPORTING
*                 CLIENT          = SY-MANDT
                 header          = t_thead
                 insert          = ' '
                 savemode_direct = 'X'
*                 OWNER_SPECIFIED = ' '
*                 LOCAL_CAT       = ' '
            IMPORTING
                 function        = fb_aktion
*                 NEWHEADER       =
            TABLES
                 lines           = t_lines
            EXCEPTIONS
                 id              = 1
                 language        = 2
                 name            = 3
                 object          = 4
                 OTHERS          = 5.
     ENDIF.
   ENDLOOP.
 ENDIF.

 IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
 ENDIF.

*****  E n d e *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005