[54130] in SAPr3-news

home help back first fref pref prev next nref lref last post

ABAP Toolprogramme / Strukturanzeige und GUID JOIN

daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Apr 12 10:48:07 2005

To: sapr3-news@mit.edu
Date: 12 Apr 2005 07:47:45 -0700
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0504120647.459190b6@posting.google.com>

Hallo Leute,

ich habe meine Sturkturanzeige noch einmal mächtig getopt.
Über eine beliebige Menge von Tabellen kann man einen FULL GUID JOIN
ausgehend von einer GUID machen. Alle zusammenhänge werden dargestellt
und durch einen Doppelklick auf den Bildschirm erhält man alle Daten
auch noch angezeigt.

Bei den neuen Modulen, die fast nur noch mit GUID´s arbeiten ist das
eine riesen Hilfe.

Bitte in beiden Programmen in den Eigenschaften die UNICODE Prüfung
ausschalten!
Denn ZBRTOO09 und z_TAB arbeiten beide zusammen!


Gruß Volker

*Hallo Leute,
*
*anbei ein nettes Programm von mir zur Anzeige von Strukturen sowie
zur
*Anzeige aller Datenelementdokumentationen!!! *Wenn Ihr also zu einer
*Tabelle nicht nur die Felder + Kurztexte braucht

*sondern auch die F1 Hilfe mit drucken wollt, dann gibt es da unter
4.6c
*nichts. Zumindest habe ich es nicht gefunden.
*Nehmt also einfach diesen Report, gebt hier im ersten Feld eine oder
*auch *mehrere Tabellen bzw. Strukturen ein und wählt die Option:
*DOKU_PRN aus .
*Im zweiten Feld kann man bei Bedarf durch Leerzeichen getrennt
mehrere
*Filter für die auszugebenen Felder eingeben.
*
*Bitte vor dem Aufruf kontrollieren, ob unter
*"System/Benutzervorgaben/eigene *Daten" ein Drucker eingegeben ist.
*Denn sonst kommt ein Dialog, und Ihr
* müßt
*den Drucker zwei mal eingeben. Geht leider nicht anders!!!! Daher
bitte
*einen festen Drucker in den eigenen Daten eintragen. Es wird nichts
*automatisch gedruckt! Dieser Drucker wird nur für die
Dateiaufbereitun
*benötigt.
*Wenn Ihr nun F8 drückt, kommt der Acrobatreader in den Vordergrund
und
*zeigt *Euch alle Felder + zugehöriger F1 Hilfen an.
*
*Im Acrobatreader nun View/Continous auswählen und Strg A und Strg C
*drücken,
*nach Word gehen und Strg V betätigen. (Sonst wird nur eine Seite
*kopiert!)
*Fertig ist die DOKU!!
*Die Kopf und Fußzeilen, die beim kopieren nach Word stören würden,
habe
* ich
*extra dafür aus der OTF Datei entfernt!
*
*Der Code ist zwar nicht so richtig sauber, aber ich hatte den Report
*dringend gebraucht und aus einem andern ganz alten Report von mir
*schnell
*mal eben so zusammengefrickelt. Also nicht zu kritisch reinsehen!
*
*Falls Ihr noch Verbesserungen hierzu habt, immer her damit!
*Auch andere gute Tips und Tricks oder nützliche Reports sind mir
immer
*willkommen.
*
*Gruß Volker
* Show DDIC-Structure
REPORT zbrtoo09 LINE-SIZE 255 NO STANDARD PAGE HEADING.
* (C) Volker Korrmann 10.03.2002


TYPE-POOLS sqlt.

TABLES: trdir,dd02t, ddftx, dd02l, "Tabellen Tabelle
        fupararef, dd40l,
        dd03l, *dd03l. "Datenelementen Tabelle
TABLES: sscrfields. "Hilfetabelle
* parameters:
* parameters:
* tabellen(900),
* felder(900),
* show like dntab-tabname no-display.

* Tabellen für GUID_JOIN

DATA: g_maxguids TYPE i.
DATA: g_last_maxguids TYPE i.
DATA: zeile(1500) TYPE c.


DATA: BEGIN OF it_guid_fields OCCURS 0,
      tabname   TYPE tabname,
      fieldname TYPE fieldname,
      datatype  TYPE datatype_d,
      ddlen     TYPE ddleng,
      maxnr     TYPE i,
      nr        TYPE i,
      END OF it_guid_fields.


DATA: BEGIN OF it_guids OCCURS 0,
      guid16   TYPE sysuuid-x,
      guid32   TYPE sysuuid-c,
      guid22   TYPE sysuuid-c22,
      nr       TYPE i,
      inaktiv  type flag,
      END OF it_guids,

      BEGIN OF it_guid_ref OCCURS 0,
*      ebene  type i,
      father TYPE i,   "Nr der Vorgängerguid
      fatherfield TYPE i, "Nr des LINK Feldes
      feld   TYPE i,   "Nr des Feldes
      guid   TYPE i,   "Nr der Guid
      END OF it_guid_ref.

* temporäre Kopie aller zu verarbeitenden Guids eines Selects
DATA: BEGIN OF it_guids2 OCCURS 0,
      guid16   TYPE sysuuid-x,
      guid32   TYPE sysuuid-c,
      guid22   TYPE sysuuid-c22,
      nr       TYPE i,
      inaktiv  type flag,
      END OF it_guids2.

DATA: BEGIN OF g_tabdata OCCURS 0,
      data(3000) TYPE c,
      table      LIKE dd03l-tabname,
      GUID_NR    type i,
      END OF g_tabdata.

DATA: BEGIN OF g_tabdata2 OCCURS 0,
      data(3000) TYPE c,
      END OF g_tabdata2.






DATA: text(80), rc(1), tabellena(9000).
DATA: rest(200).
DATA: file TYPE string.
DATA: i TYPE i.

RANGES s_element FOR ddftx-rollname OCCURS 0.
RANGES s_tab FOR dd02l-tabclass OCCURS 0.
RANGES t1_element FOR ddftx-rollname OCCURS 0.
RANGES t2_element FOR ddftx-rollname OCCURS 0.
DATA BEGIN OF nametab OCCURS 0.
        INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab.




* Dynpro Selektionsfeld für die Anzeige des SQL-Traces
* Tabelle mit Trace-Sätzen und Haeder-Sätze
DATA: sql_trace_tab    TYPE sqlt_trace_tab,
*      rfc_trace_tab    type SQLT_TRACE_TAB,
      sql_bheader_tab  TYPE sqlt_bheader_tab.

DATA: g_selopttab_tab TYPE sqlt_rtabn OCCURS 3 WITH HEADER LINE.

DATA: BEGIN OF it_tab1 OCCURS 0,
      tabname LIKE dd02l-tabname,
*      len(10) type c,
      END OF it_tab1.



DATA BEGIN OF nametab2 OCCURS 0.
        INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab2.


DATA BEGIN OF it OCCURS 0.
        INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA: doppelt(1).
DATA END OF it.

DATA: BEGIN OF it_el OCCURS 0,
tabname LIKE ddftx-tabname,
zaehler TYPE i,
tabclass LIKE dd02l-tabclass,
END OF it_el.


DATA: BEGIN OF tabs2 OCCURS 0,
show LIKE dntab-tabname,
*anz  type i,
END OF tabs2.

DATA: BEGIN OF tabs OCCURS 0,
show LIKE dntab-tabname,
anz  TYPE i,
END OF tabs.


DATA: BEGIN OF it_fb OCCURS 0,
fb LIKE fupararef-funcname,
END OF it_fb.


DATA: BEGIN OF fields OCCURS 0,
line(200),
END OF fields.
DATA: BEGIN OF rollnames OCCURS 0,
line(30),
END OF rollnames.

DATA:
subrc LIKE sy-subrc,
tab_len LIKE sy-fdpos,
tabname LIKE dntab-tabname,
tabfield(21),
include LIKE sy-repid,
program LIKE sy-repid.

* Eingabe Maske

SELECTION-SCREEN BEGIN OF BLOCK eingabe WITH FRAME
TITLE text-001.
SELECTION-SCREEN SKIP.

PARAMETERS:
tabellen(9000).
SELECT-OPTIONS: s_tab2 FOR dd03l-tabname.
SELECT-OPTIONS: s_fb FOR fupararef-funcname.
PARAMETERS:     p_fbdoku AS CHECKBOX.
PARAMETERS:
felder(9000).

PARAMETERS sqltrace AS CHECKBOX.
PARAMETERS anz_ds AS CHECKBOX .
PARAMETERS tab_only AS CHECKBOX.
PARAMETERS min_data TYPE i.

SELECTION-SCREEN END OF BLOCK eingabe.
SELECTION-SCREEN BEGIN OF BLOCK eingabe2 WITH FRAME
TITLE text-003.
SKIP.
PARAMETERS: elemente(900).
SKIP.
SELECTION-SCREEN END OF BLOCK eingabe2.


PARAMETERS:
feld1 LIKE dd03d-rollname NO-DISPLAY,
feld2 LIKE dd03d-rollname NO-DISPLAY.


PARAMETERS: doku_prn AS CHECKBOX.
PARAMETERS: p_dialog AS CHECKBOX.
PARAMETERS: filename(50) TYPE c DEFAULT
'C:\temp\t1.pdf'.
PARAMETERS: fb_doc(50) TYPE c DEFAULT
'C:\temp\FB.pdf'.

SELECTION-SCREEN SKIP.

PARAMETERS p_guid TYPE guid_16.
Parameters p_maxg type i default 100.
select-options: s_ffeld for dd03l-rollname.


DATA: tanz1(10) TYPE c VALUE 'Tabelle',
tanz2(10) TYPE c VALUE 'Struktur',
tanz3(10) TYPE c VALUE 'Cluster',
tanz4(10) TYPE c VALUE 'POOL',
tanz5(10) TYPE c VALUE 'View',
tanz6(15) TYPE c VALUE 'Append-struktur'.

DATA: info(60).
DATA: info2(200).
DATA: anzahl TYPE p DECIMALS 0.


AT LINE-SELECTION.
  IF sy-lsind = 1.
    NEW-PAGE LINE-SIZE 1500.
    PERFORM guid_join_datenausgabe.

  ENDIF.

START-OF-SELECTION.
  CLEAR it. REFRESH it.
  CLEAR tabs. REFRESH tabs.
  CLEAR tabs2. REFRESH tabs2.
  CLEAR fields. REFRESH fields.
  CLEAR nametab. REFRESH nametab.


  CLEAR it_tab1. REFRESH it_tab1.


  IF sqltrace = 'X'.
    PERFORM get_trace.
  ENDIF.


  PERFORM datenelemente USING elemente CHANGING
  tabellen.



  SPLIT tabellen AT ' ' INTO TABLE tabs2.
  SPLIT felder AT ' ' INTO TABLE fields.

  IF NOT s_tab2[] IS INITIAL.
    SELECT DISTINCT tabname FROM dd02l APPENDING TABLE
    tabs2
    WHERE tabname IN s_tab2.
  ENDIF.


  LOOP AT it_tab1.
    tabs2 = it_tab1.
    APPEND tabs2.
  ENDLOOP.


  REFRESH it_fb.
  IF NOT s_fb[] IS INITIAL.
    WRITE: / 'Funktionsbausteine: '.

    SELECT * FROM fupararef WHERE funcname IN s_fb
         ORDER BY funcname paramtype DESCENDING pposition.

      ON CHANGE OF fupararef-funcname.
        WRITE: / fupararef-funcname.
        it_fb = fupararef-funcname.
        APPEND it_fb.
      ENDON.
      WRITE: / '          ', fupararef-paramtype, fupararef-parameter,
                  fupararef-structure(100).
      CLEAR tabs2.
      SPLIT fupararef-structure AT '-' INTO tabs2 rest.
      IF tabs2 <> ''.
        APPEND tabs2.
      ENDIF.
    ENDSELECT.
    SKIP 2.
    ULINE.
  ENDIF.


  IF p_fbdoku = 'X'.
    PERFORM fbdokus.
  ENDIF.




  SORT tabs2.
  DELETE ADJACENT DUPLICATES FROM tabs2.

* Auch Strukturen von Tabellentypen erfassen!!!

  loop at tabs2.
    clear dd40l.
    select single * from dd40l where typename = tabs2-show.
    if sy-subrc = 0 and dd40l-rowkind = 'S'.
      tabs2-show = dd40l-rowtype. append tabs2.
    endif.
  endloop.
  SORT tabs2.
  DELETE ADJACENT DUPLICATES FROM tabs2.





  IF felder IS INITIAL.
    fields = '*'. APPEND fields.
  ENDIF.
  CONCATENATE fields 'akshjweruhzihnbaskehur' INTO
  fields
  SEPARATED BY ' '.

  LOOP AT tabs2.
    MOVE-CORRESPONDING tabs2 TO tabs.
    APPEND tabs.
  ENDLOOP.
  REFRESH tabs2.

  LOOP AT tabs.
    CLEAR dd02t.
    CLEAR anzahl.
    SELECT SINGLE * FROM dd02t WHERE tabname =  tabs-show
                               AND ddlanguage = 'D'.

    IF anz_ds = 'X' OR tab_only = 'X' OR min_data > 0.

      SELECT * FROM dd02l UP TO 1 ROWS WHERE tabname  = tabs-show
                                         AND tabclass = 'TRANSP'.
      ENDSELECT.
      IF sy-subrc = 0.
        FORMAT COLOR 1 ON.
        IF anz_ds = 'X' OR min_data > 0.
          SELECT COUNT(*) INTO anzahl FROM (tabs-show).
          tabs-anz = anzahl.
          IF anzahl >= min_data.
            MODIFY tabs.
          ELSE.
            DELETE tabs.
            CONTINUE.
          ENDIF.

        ENDIF.
      ELSE.
        IF tab_only = 'X' OR min_data > 0.
          DELETE tabs.
          CONTINUE.
        ENDIF.
      ENDIF.
    ENDIF.
    FORMAT COLOR 1 ON.
    WRITE: / tabs-show, dd02t-ddtext.
    IF anzahl > 0.
      WRITE anzahl.
    ENDIF.
  ENDLOOP.

  SKIP. ULINE. SKIP 2.




  IF  NOT p_guid IS INITIAL.

    PERFORM guid_join.

  ENDIF.



* AB Hier werden die ermittelten Tabellen ausgegeben!!
  LOOP AT tabs.
    CLEAR dd02t.
    SELECT SINGLE * FROM dd02t WHERE tabname =  tabs-show
                               AND ddlanguage = 'D'.
    SKIP 1.
    CONCATENATE tabs-show ':' dd02t-ddtext INTO text
    SEPARATED BY ' '.
    FORMAT COLOR 1 ON.
    WRITE: / text.
    IF tabs-anz <> 0.
      WRITE tabs-anz.
    ENDIF.

    ULINE.
    CLEAR nametab. REFRESH nametab.
    PERFORM load_table USING tabs-show.
    LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
      CLEAR ddftx.
      SELECT SINGLE * FROM ddftx WHERE tabname = tabs-show AND
      fieldname = nametab-fieldname AND
      ddlanguage = 'D'.
      nametab-rollname = ddftx-rollname.
      MODIFY nametab.
      it = nametab. APPEND it.

      rc = 1.
      LOOP AT fields.
        IF NOT fields CA '*'.
          CONCATENATE fields '*' INTO fields.
        ENDIF.
        IF nametab-fieldname CP fields
        OR nametab-keyflag = 'X'.
          rc = 0.
        ENDIF.
      ENDLOOP.
      IF rc = 1. DELETE nametab. ENDIF.
    ENDLOOP.

    PERFORM tabellenausgabe USING tabs-show.

    LOOP AT nametab.
      nametab2 = nametab. APPEND nametab2.
    ENDLOOP.

  ENDLOOP.



  IF doku_prn = 'X'.
    PERFORM dokuausgabe.
  ENDIF.

*---------------------------------------------------------------------*
* FORM DOPPELTE_MARKIEREN *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM doppelte_markieren.
  DATA: rc(1), tabix LIKE sy-tabix.
  DATA: f1 LIKE it-fieldname, r1 LIKE it-rollname.
  f1 = ''. r1 = ''.
  LOOP AT it.
    rc = 1.
    IF f1 = it-fieldname OR r1 = it-rollname.
      rc = 0.
    ENDIF.
    f1 = it-fieldname.
    r1 = it-rollname.
    IF rc = 0. it-doppelt = 'X'. MODIFY it. ENDIF.
    tabix = sy-tabix - 1.
  ENDLOOP.
ENDFORM. "DOPPELTE_MARKIEREN






*---------------------------------------------------------------------*
* FORM TABELLENAUSGABE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM tabellenausgabe USING show.
* Generate SHOWTAB
  FORMAT RESET.
  FORMAT COLOR 2 ON.
  LOOP AT nametab.

    IF nametab-keyflag = 'X'.
      FORMAT INTENSIFIED ON.
    ELSE.
      FORMAT INTENSIFIED OFF.
    ENDIF.
    WRITE: / nametab-fieldname.
    WRITE nametab-keyflag.
    WRITE nametab-rollname.
    WRITE nametab-datatype.
    WRITE nametab-inttype.
    WRITE nametab-intlen.
    WRITE nametab-decimals.
    WRITE nametab-fieldtext.

  ENDLOOP.
ENDFORM. "TABELLENAUSGABE


*---------------------------------------------------------------------*
* FORM LOAD_TABLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SHOW *
*---------------------------------------------------------------------*
FORM load_table USING show.
  subrc = 0.
  tabname = show.
  tab_len = STRLEN( show ).
  IF tab_len = 2.
* Segment
    CASE tabname.
* System
      WHEN 'SY'.
        tabname = 'SYST'.
* Dynpro
      WHEN 'DY'.
        SELECT SINGLE * FROM trdir
        WHERE name = program.
        IF sy-subrc NE 0.
          PERFORM exit.
        ENDIF.
        IF trdir-subc CN '1MF'.
          include = program.
          IF trdir-subc = 'I' AND
          include+5(1) CO 'IOFDU'.
            SHIFT include RIGHT BY 3 PLACES.
            include(3) = 'SAP'.
            program = include.
            SELECT SINGLE * FROM trdir
            WHERE name = program.
            IF sy-subrc NE 0.
              PERFORM exit.
            ENDIF.
          ENDIF.
        ENDIF.
        tabname = '$'.
        tabname+1(2) = trdir-dbna.
        tabname+3(1) = trdir-appl.
* WHEN OTHERS.
* SELECT SINGLE * FROM T032
* WHERE SEGMENT = TABNAME.
* IF SY-SUBRC NE 0.
* PERFORM EXIT.
* ENDIF.
* TABNAME = T032-QMACRO.
    ENDCASE.
  ENDIF.
* Get NAMETAB
  REFRESH nametab.
  IF tabname NE 'SCREEN'.
    CALL FUNCTION 'NAMETAB_GET'
      EXPORTING
        tabname             = tabname
        langu               = sy-langu
      TABLES
        nametab             = nametab
      EXCEPTIONS
        internal_error      = 1
        table_has_no_fields = 2
        table_not_activ     = 3.
  ELSE.
    CLEAR nametab.
    CLEAR nametab.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldname = 'NAME'.
    nametab-intlen = 30.
    nametab-fieldtext = 'Feldname'(101).
    APPEND nametab.
    nametab-fieldname = 'GROUP1'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe1'(102).
    APPEND nametab.
    nametab-fieldname = 'GROUP2'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe2'(103).
    APPEND nametab.
    nametab-fieldname = 'GROUP3'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe3'(104).
    APPEND nametab.
    nametab-fieldname = 'GROUP4'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe4'(105).
    APPEND nametab.
    nametab-fieldname = 'REQUIRED'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Musseingabe'(106).
    APPEND nametab.
    nametab-fieldname = 'INPUT'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld eingabebereit'(107).
    APPEND nametab.
    nametab-fieldname = 'OUTPUT'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld wird angezeigt'(108).
    APPEND nametab.
    nametab-fieldname = 'INTENSIFIED'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld hellleuchtend'(109).
    APPEND nametab.
    nametab-fieldname = 'INVISIBLE'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld unsichtbar'(110).
    APPEND nametab.
    nametab-fieldname = 'LENGTH'.
    nametab-datatype = 'HEX'.
    nametab-inttype = 'X'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Laenge des Feldes'(111).
    APPEND nametab.
    nametab-fieldname = 'ACTIVE'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld aktiv'(112).
    APPEND nametab.
* NEW FIELDS IN SCREEN FOR 3.0
    nametab-fieldname = 'DISPLAY_3D'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld 3-dimensional'(113).
    APPEND nametab.
    nametab-fieldname = 'VALUE_HELP'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld mit Wertehilfe'(114).
    APPEND nametab.
    nametab-fieldname = 'REQUEST'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Eingabe vorhanden (nur PAI)'(115).
    APPEND nametab.
  ENDIF.

  subrc = sy-subrc.
  IF sy-subrc > 3.
    PERFORM exit.
  ENDIF.
ENDFORM. "LOAD_TABLE


*---------------------------------------------------------------------*
* FORM EXIT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM exit.
  STOP.
ENDFORM. "EXIT
*&---------------------------------------------------------------------*
*& Form DATENELEMENTE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ELEMENTE text *
* <--P_TABELLEN text *
*----------------------------------------------------------------------*
FORM datenelemente USING elemente
CHANGING tabellen.

  CLEAR s_element. REFRESH s_element.
  CLEAR rollnames. REFRESH rollnames.
  CLEAR it_el. REFRESH it_el.
  CLEAR s_tab. REFRESH s_tab.

  IF elemente = ' '.

    PERFORM suchen.
  ELSE.
    SPLIT elemente AT ' ' INTO TABLE rollnames.

    LOOP AT rollnames.
      MOVE: 'I' TO s_element-sign,
      'EQ' TO s_element-option.
      s_element-low = rollnames.
      APPEND s_element.
    ENDLOOP.
    SELECT DISTINCT tabname COUNT(*) INTO
    (it_el-tabname, it_el-zaehler)
    FROM dd03l WHERE rollname IN s_element
    GROUP BY tabname.

      APPEND it_el.
    ENDSELECT.


    LOOP AT it_el.
      SELECT SINGLE * FROM dd02l WHERE tabname =
      it_el-tabname.
      MOVE dd02l-tabclass TO it_el-tabclass.
      MODIFY it_el.
    ENDLOOP.

    LOOP AT it_el WHERE tabclass IN s_tab.

      CONCATENATE it_el-tabname tabellen INTO tabellen
      SEPARATED BY ' '
      .
    ENDLOOP.
  ENDIF.

ENDFORM. " DATENELEMENTE
*&---------------------------------------------------------------------*
*& Form SUCHEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM suchen.
ENDFORM. " SUCHEN



*---------------------------------------------------------------------*
* FORM Dokuausgabe
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM dokuausgabe.
  DATA: BEGIN OF it2 OCCURS 0.
          INCLUDE STRUCTURE tline.
  DATA: END OF it2.
  DATA: BEGIN OF it3 OCCURS 0.
          INCLUDE STRUCTURE tline.
  DATA: END OF it3.


  DATA rc.
  TYPES: BEGIN OF t_it4,
  rollname LIKE nametab-rollname,
  text(50) TYPE c,
  END OF t_it4.


  DATA: it4 TYPE SORTED TABLE OF t_it4 WITH UNIQUE KEY
  rollname WITH
  HEADER LINE.


  DATA: object LIKE dokhl-object.
  DATA: header LIKE thead.
  DATA: options LIKE itcpo.
  DATA: bytes TYPE i.

  DATA: it_otf TYPE STANDARD TABLE OF tline WITH
  HEADER LINE.
  DATA: it_pdf TYPE STANDARD TABLE OF tline WITH
  HEADER LINE.
  DATA: it_doc TYPE STANDARD TABLE OF docs WITH HEADER
  LINE.

  options-tdgetotf = 'X'.

  REFRESH nametab.
  nametab[] = nametab2[].


  CALL FUNCTION 'DOCU_PRINT'
  EXPORTING
  dialog = ' '
  form = 'P'
  id = ''
  langu = sy-langu
  new_page = ' '
* object = ' '
  operation = 'O'
  printer = 'X'
  typ = 'E'
  TABLES
  line = it3.

  IF p_fbdoku <> 'X'.
    CALL FUNCTION 'CLOSE_FORM'.
  ENDIF.

  CALL FUNCTION 'OPEN_FORM'
  EXPORTING
* APPLICATION = 'TX'
* ARCHIVE_INDEX =
* ARCHIVE_PARAMS =
* DEVICE = 'PRINTER'
  dialog = p_dialog
  form = 'S_DOCU_PRINT'
* LANGUAGE = SY-LANGU
  options = options
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJECT =
* RAW_DATA_INTERFACE = '*'
* IMPORTING
* LANGUAGE =
* NEW_ARCHIVE_PARAMS =
* RESULT =
  EXCEPTIONS
  canceled = 1
  device = 2
  form = 3
  options = 4
  unclosed = 5
  mail_options = 6
  archive_error = 7
  invalid_fax_number = 8
  more_params_needed_in_batch = 9
  spool_error = 10
  codepage = 11
  OTHERS = 12 .

  IF sy-subrc = 0.


    LOOP AT nametab.




* Prüfen auf Ausgabe doppelter Dokumentationen.
      READ TABLE it4 WITH KEY rollname =
      nametab-rollname.
      IF sy-subrc = 0.

        REFRESH it2.
        it2-tdformat = 'ZH'.
        CONCATENATE: nametab-tabname '-'
        nametab-fieldname INTO
        it2-tdline.

        CONCATENATE: it2-tdline ' (Hilfetext siehe: '
        it4-text ' ) '
        INTO it2-tdline SEPARATED BY ' '.
        APPEND it2.

        CALL FUNCTION 'WRITE_FORM_LINES'
          EXPORTING
            function = 'SET'
            header   = header
          TABLES
            lines    = it2
          EXCEPTIONS
            OTHERS   = 9.
        IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

      ELSE.

        REFRESH it2.
        it2-tdformat = 'ZH'.
        CONCATENATE: nametab-tabname '-'
        nametab-fieldname INTO
        it2-tdline.
        APPEND it2.

        CALL FUNCTION 'WRITE_FORM_LINES'
          EXPORTING
            function = 'SET'
            header   = header
          TABLES
            lines    = it2
          EXCEPTIONS
            OTHERS   = 9.
        IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.



        object = nametab-rollname.
        IF object <> ''.

          REFRESH it_otf. CLEAR it_otf.
          CALL FUNCTION 'DOCU_GET'
          EXPORTING
          id = 'DE'
          langu = sy-langu
          object = object
          typ = 'E'
* IMPORTING
* HEAD = PHEAD
          TABLES
          line = it_otf
          EXCEPTIONS
          ret_code = 1.
          IF sy-subrc = 0.


            CALL FUNCTION 'DOCU_PRINT'
              EXPORTING
                dialog    = ' '
                form      = 'P'
                id        = 'DE'
                langu     = sy-langu
                new_page  = 'X'
                object    = object
                operation = 'C'
                printer   = 'X'
                typ       = 'E'
              TABLES
                line      = it3.

            REFRESH it_otf. CLEAR it_otf.
            CALL FUNCTION 'DOCU_GET'
            EXPORTING
            id = 'DE'
            langu = sy-langu
            object = object
            typ = 'E'
* IMPORTING
* HEAD = PHEAD
            TABLES
            line = it_otf
            EXCEPTIONS
            ret_code.
          ENDIF.
        ENDIF.

        DESCRIBE TABLE it_otf LINES i.
        IF i > 0.

          REFRESH it2. CLEAR it2.
          it2-tdformat = '*'.
          it2-tdline = '.'.
          APPEND it2.
          APPEND it2.
          CALL FUNCTION 'WRITE_FORM_LINES'
            EXPORTING
              function = 'SET'
              header   = header
            TABLES
              lines    = it2
            EXCEPTIONS
              OTHERS   = 9.
          IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
          ENDIF.

* Prüfen auf Ausgabe doppelter Dokumentationen.
          READ TABLE it4 WITH KEY rollname =
          nametab-rollname
          TRANSPORTING NO FIELDS.
          IF sy-subrc <> 0.
            it4-rollname = nametab-rollname.
            CONCATENATE: nametab-tabname '-'
            nametab-fieldname INTO
            it4-text.
            INSERT it4 INTO TABLE it4.
          ENDIF.


        ENDIF.
      ENDIF.


    ENDLOOP.

    CLEAR it_otf. REFRESH it_otf.
    CLEAR it_pdf. REFRESH it_pdf.

    options-tdgetotf = 'X'.

    CALL FUNCTION 'CLOSE_FORM'
* IMPORTING
* RESULT =
* RDI_RESULT =
    TABLES
    otfdata = it_otf
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SEND_ERROR = 3
* SPOOL_ERROR = 4
* CODEPAGE = 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.
    ENDIF.


* Löschen der Kopf und Fußzeilen im OTF Format.

    DATA: ft.

    rc = '0'. ft = 'X'.
    LOOP AT it_otf.

      IF it_otf(2) = 'IN'.rc = '1'.ENDIF.
      IF it_otf = 'IN02MAIN' OR it_otf(2) = '//'.
        rc = '0'. ft = ''.
      ENDIF
      .
      IF rc = '1' AND ft = ''.
        IF it_otf(2) <> 'IN'
        AND it_otf(2) <> 'EP'
        AND it_otf(2) <> 'OP'.
          DELETE it_otf.
        ENDIF.
      ENDIF.
    ENDLOOP.


    DESCRIBE TABLE it_otf LINES i.

    IF i = 0. EXIT. ENDIF.

    CALL FUNCTION 'CONVERT_OTF_2_PDF'
    EXPORTING
    use_otf_mc_cmd = ''
* ARCHIVE_INDEX =
    IMPORTING
    bin_filesize = bytes
    TABLES
    otf = it_otf
    doctab_archive = it_doc
    lines = it_pdf
    EXCEPTIONS
    err_conv_not_possible = 1
    err_otf_mc_noendmarker = 2
    OTHERS = 3 .
    IF sy-subrc = 0.


      file = filename.
      CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
      bin_filesize = bytes
      filename = file
      filetype = 'BIN'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* IMPORTING
* FILELENGTH =
      TABLES
      data_tab = it_pdf
      EXCEPTIONS
      file_write_error = 1
      no_batch = 2
      gui_refuse_filetransfer = 3
      invalid_type = 4
      no_authority = 5
      unknown_error = 6
      header_not_allowed = 7
      separator_not_allowed = 8
      filesize_not_allowed = 9
      header_too_long = 10
      dp_error_create = 11
      dp_error_send = 12
      dp_error_write = 13
      unknown_dp_error = 14
      access_denied = 15
      dp_out_of_memory = 16
      disk_full = 17
      dp_timeout = 18
      file_not_found = 19
      dataprovider_exception = 20
      control_flush_error = 21
      OTHERS = 22
      .
      IF sy-subrc = 0.

        CALL FUNCTION 'WS_EXECUTE'
        EXPORTING
        document = 'X'
* CD = ' '
* COMMANDLINE = ' '
* INFORM = ' '
        program = filename
* STAT = ' '
* WINID = ' '
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
* IMPORTING
* RBUFF =
* EXCEPTIONS
* FRONTEND_ERROR = 1
* NO_BATCH = 2
* PROG_NOT_FOUND = 3
* ILLEGAL_OPTION = 4
* GUI_REFUSE_EXECUTE = 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.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM. "Dokuausgabe





*---------------------------------------------------------------------*
* FORM FBDOKUS
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM fbdokus.
  DATA: BEGIN OF it2 OCCURS 0.
          INCLUDE STRUCTURE tline.
  DATA: END OF it2.
  DATA: BEGIN OF it3 OCCURS 0.
          INCLUDE STRUCTURE tline.
  DATA: END OF it3.

  TYPES: BEGIN OF t_it4,
  rollname LIKE nametab-rollname,
  text(50) TYPE c,
  END OF t_it4.


  DATA: it4 TYPE SORTED TABLE OF t_it4 WITH UNIQUE KEY
  rollname WITH
  HEADER LINE.


  DATA: object LIKE dokhl-object.
  DATA: header LIKE thead.
  DATA: options LIKE itcpo.
  DATA: bytes TYPE i.

  DATA: it_otf TYPE STANDARD TABLE OF tline WITH
  HEADER LINE.
  DATA: it_pdf TYPE STANDARD TABLE OF tline WITH
  HEADER LINE.
  DATA: it_doc TYPE STANDARD TABLE OF docs WITH HEADER
  LINE.

  options-tdgetotf = 'X'.

  REFRESH nametab.
  nametab[] = nametab2[].

  object = 'TDREFOBJ'.
  CALL FUNCTION 'DOCU_PRINT'
    EXPORTING
      dialog    = ' '
      form      = 'P'
      id        = ''
      langu     = sy-langu
      new_page  = ' '
      object    = object
      operation = 'O'
      printer   = 'X'
      typ       = 'E'
    TABLES
      line      = it3.

  CALL FUNCTION 'CLOSE_FORM'.


  CALL FUNCTION 'OPEN_FORM'
  EXPORTING
* APPLICATION = 'TX'
* ARCHIVE_INDEX =
* ARCHIVE_PARAMS =
* DEVICE = 'PRINTER'
  dialog = p_dialog
  form = 'S_DOCU_PRINT'
* LANGUAGE = SY-LANGU
  options = options
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJECT =
* RAW_DATA_INTERFACE = '*'
* IMPORTING
* LANGUAGE =
* NEW_ARCHIVE_PARAMS =
* RESULT =
  EXCEPTIONS
  canceled = 1
  device = 2
  form = 3
  options = 4
  unclosed = 5
  mail_options = 6
  archive_error = 7
  invalid_fax_number = 8
  more_params_needed_in_batch = 9
  spool_error = 10
  codepage = 11
  OTHERS = 12 .

  IF sy-subrc = 0.


    LOOP AT it_fb.

      REFRESH it2.
      it2-tdformat = 'ZH'.
      it2-tdline = it_fb.
      APPEND it2.

      CALL FUNCTION 'WRITE_FORM_LINES'
        EXPORTING
          function = 'SET'
          header   = header
        TABLES
          lines    = it2
        EXCEPTIONS
          OTHERS   = 9.


      object = it_fb.
      IF object <> ''.
        CALL FUNCTION 'DOCU_PRINT'
          EXPORTING
            dialog    = ' '
            form      = 'P'
            id        = 'FU'
            langu     = sy-langu
            new_page  = 'X'
            object    = object
            operation = 'C'
            printer   = 'X'
            typ       = 'E'
          TABLES
            line      = it3.

        REFRESH it_otf. CLEAR it_otf.
        CALL FUNCTION 'DOCU_GET'
        EXPORTING
        id = 'DE'
        langu = sy-langu
        object = object
        typ = 'E'
* IMPORTING
* HEAD = PHEAD
        TABLES
        line = it_otf
        EXCEPTIONS
        ret_code.
      ENDIF.

      DESCRIBE TABLE it_otf LINES i.
      IF i > 0.

        REFRESH it2. CLEAR it2.
        it2-tdformat = '*'.
        it2-tdline = '.'.
        APPEND it2.
        APPEND it2.
        CALL FUNCTION 'WRITE_FORM_LINES'
          EXPORTING
            function = 'SET'
            header   = header
          TABLES
            lines    = it2
          EXCEPTIONS
            OTHERS   = 9.
        IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

      ENDIF.


    ENDLOOP.

    CLEAR it_otf. REFRESH it_otf.
    CLEAR it_pdf. REFRESH it_pdf.

    options-tdgetotf = 'X'.

    CALL FUNCTION 'CLOSE_FORM'
* IMPORTING
* RESULT =
* RDI_RESULT =
    TABLES
    otfdata = it_otf
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SEND_ERROR = 3
* SPOOL_ERROR = 4
* CODEPAGE = 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.
    ENDIF.


* Löschen der Kopf und Fußzeilen im OTF Format.

    DATA: rc, ft.

    rc = '0'. ft = 'X'.
    LOOP AT it_otf.

      IF it_otf(2) = 'IN'.rc = '1'.ENDIF.
      IF it_otf = 'IN02MAIN' OR it_otf(2) = '//'.
        rc = '0'. ft = ''.
      ENDIF
      .
      IF rc = '1' AND ft = ''.
        IF it_otf(2) <> 'IN'
        AND it_otf(2) <> 'EP'
        AND it_otf(2) <> 'OP'.
          DELETE it_otf.
        ENDIF.
      ENDIF.
    ENDLOOP.


    DESCRIBE TABLE it_otf LINES i.

    IF i = 0. EXIT. ENDIF.

    CALL FUNCTION 'CONVERT_OTF_2_PDF'
    EXPORTING
    use_otf_mc_cmd = ''
* ARCHIVE_INDEX =
    IMPORTING
    bin_filesize = bytes
    TABLES
    otf = it_otf
    doctab_archive = it_doc
    lines = it_pdf
    EXCEPTIONS
    err_conv_not_possible = 1
    err_otf_mc_noendmarker = 2
    OTHERS = 3 .
    IF sy-subrc = 0.


      file = fb_doc.

      CALL FUNCTION 'GUI_DOWNLOAD'
      EXPORTING
      bin_filesize = bytes
      filename = file
      filetype = 'BIN'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* IMPORTING
* FILELENGTH =
      TABLES
      data_tab = it_pdf
      EXCEPTIONS
      file_write_error = 1
      no_batch = 2
      gui_refuse_filetransfer = 3
      invalid_type = 4
      no_authority = 5
      unknown_error = 6
      header_not_allowed = 7
      separator_not_allowed = 8
      filesize_not_allowed = 9
      header_too_long = 10
      dp_error_create = 11
      dp_error_send = 12
      dp_error_write = 13
      unknown_dp_error = 14
      access_denied = 15
      dp_out_of_memory = 16
      disk_full = 17
      dp_timeout = 18
      file_not_found = 19
      dataprovider_exception = 20
      control_flush_error = 21
      OTHERS = 22
      .
      IF sy-subrc = 0.

        CALL FUNCTION 'WS_EXECUTE'
        EXPORTING
        document = 'X'
* CD = ' '
* COMMANDLINE = ' '
* INFORM = ' '
        program = fb_doc
* STAT = ' '
* WINID = ' '
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
* IMPORTING
* RBUFF =
* EXCEPTIONS
* FRONTEND_ERROR = 1
* NO_BATCH = 2
* PROG_NOT_FOUND = 3
* ILLEGAL_OPTION = 4
* GUI_REFUSE_EXECUTE = 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.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM. "FB Dokus





*---------------------------------------------------------------------*
*       FORM get_trace                                               
*
*---------------------------------------------------------------------*
*       ........                                                     
*
*---------------------------------------------------------------------*
FORM get_trace.
  FIELD-SYMBOLS: <f>.
  DATA: filter_wa TYPE sqlt_filter.
  DATA: trace_filter TYPE sqlt_trace_filter.
  DATA: filename(sqlt_l_filename).

* Initialisieren
  CLEAR: filter_wa, sql_trace_tab, sql_bheader_tab, trace_filter.
  REFRESH: sql_trace_tab, sql_bheader_tab.
  REFRESH: g_selopttab_tab.
  DATA: wa TYPE sqlt_trecord.
* Texte für die Detailanzeige des Enqueue-Traces

  DATA: entry LIKE  rstrentrkl.
  CLEAR entry.


  DATA: tmp1 TYPE sqlt_tab_hier,
        tmp2 TYPE STANDARD TABLE OF  dd03p        WITH HEADER LINE,
        tmp3 TYPE STANDARD TABLE OF  dd12v        WITH HEADER LINE,
        tmp4 TYPE STANDARD TABLE OF  dd26v        WITH HEADER LINE.


  CALL FUNCTION 'SQLT_DDIC_INFO_READ'
    EXPORTING
      name                     = 'TEST'
*   IMPORTING
*     TABLE_EX                 =
    TABLES
      hierarchie               = tmp1[]
      dd03p_all                = tmp2[]
      dd12v_all                = tmp3[]
      dd26v_tab                = tmp4[]
   EXCEPTIONS
     error_no_active          = 1
     error_read_nametab       = 2
     error_read_view          = 3
     error_read_tabl          = 4
     error_read_index         = 5
     error_read_primkey       = 6
     error_read_pool          = 7
     OTHERS                   = 8
            .
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.



**
*  CALL FUNCTION 'SQLT_DECODE_RFC_ENTRY'
*       EXPORTING
*            entry         = entry
**    IMPORTING
**         SEC           =
**         MSEC          =
**         START_TIME    =
**         START_DATE    =
**         TCODE         =
**         LINKNUMBER    =
**         RETCODE       =
**         DURATION      =
**         L_STATEMENT   =
**         OFFSET        =
**         BYTES_SEND    =
**         BYTES_RECEIVE =
**         RFC_TIME      =
**         REC_TYPE      =
*            .
*

*
*CALL FUNCTION 'PERFORMANCE_TRACE_OFF'
*    EXPORTING
*         TRACE_USER    = SY-UNAME
*         SQL_TRACE_OFF = 'X'
*         ENQ_TRACE_OFF = 'X'
*         RFC_TRACE_OFF = 'X'
*         BUF_TRACE_OFF = 'X'          .

* Tracefilenamen lesen
  CALL FUNCTION 'NAME_OF_CURRENT_TRACE_FILE'
    IMPORTING
      pathname = filename.


  ASSIGN ('(SAPLSSQ0)G_Filename') TO <f>.
  <f> = filename.

* Setzen Filter
  CALL FUNCTION 'SQLT_SET_SELECTIONS'
    EXPORTING
      starting_x   = 30
      starting_y   = 1
    IMPORTING
      filter_wa    = filter_wa
      file_name    = filename
      trace_filter = trace_filter
    EXCEPTIONS
      user_cancel  = 1
      OTHERS       = 2.

  IF sy-subrc = 0.

** Auswerten des SQL-Traces
*    CALL FUNCTION 'SQLT_GEN_TRACE_RECORDS'
*         EXPORTING
*              file_name         = filename
*              filter_wa         = filter_wa
*              trace_filter      = trace_filter
**    IMPORTING
*         TABLES
*              sql_trace_tab     =  sql_trace_tab
*         EXCEPTIONS
*              file_not_openable = 1
*              abort             = 3
*              OTHERS            = 4.

* Auswerten des SQL-Traces
    CALL FUNCTION 'SQLT_GEN_TRACE_RECORDS_NEW'
         EXPORTING
*              filename          = filename
              filter_wa         = filter_wa
              trace_filter      = trace_filter
*    IMPORTING
         TABLES
              sql_trace_tab     =  sql_trace_tab
              sql_bheader_tab   =  sql_bheader_tab
         EXCEPTIONS
              file_not_openable = 1
              abort             = 3
              OTHERS            = 4.



  ENDIF.


  LOOP AT sql_trace_tab INTO wa.
    it_tab1-tabname = wa-tabname.
    APPEND it_tab1.
  ENDLOOP.


  SORT it_tab1.
  DELETE ADJACENT DUPLICATES FROM it_tab1.

  LOOP AT it_tab1.
    SELECT * FROM dd02l UP TO 1 ROWS WHERE tabname = it_tab1-tabname
                                       AND tabclass = 'TRANSP'.

    ENDSELECT.
    IF sy-subrc <> 0.
      DELETE it_tab1.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "get_trace







*&--------------------------------------------------------------------*
*&      Form  guid_add
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->GUID       text
*      -->FIELDNR    text
*      -->EBENE      text
*---------------------------------------------------------------------*
FORM guid_add USING value(guid)
                    value(fieldnr)
                    value(vorgaengerguid)
                    value(vorgaengerfeld).
  DATA: i TYPE i.
  DATA: text(200).
  WRITE guid TO text.

  i = STRLEN( text ).
  SHIFT text LEFT DELETING LEADING space.
  CLEAR: it_guids-guid16,it_guids-guid22,it_guids-guid32.
  clear it_guid_ref.
  IF i = 16.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
        iv_guid_x16                  = guid
*    IV_GUID_C22                  =
*    IV_GUID_C32                  =
     IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ELSEIF i = 22.
    it_guids-guid22 = text.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
*    IV_GUID_X16                  = guid
        iv_guid_c22                  =  it_guids-guid22
*    IV_GUID_C32                  =
     IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ELSEIF i = 32.
    it_guids-guid32 = text.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
*    IV_GUID_X16                  = guid
*    IV_GUID_C22                  =
        iv_guid_c32                  = it_guids-guid32
      IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ENDIF.


  text = it_guids-guid32.
  IF text <> ''.
    READ TABLE it_guids WITH KEY guid32 = text TRANSPORTING NO FIELDS.
    IF sy-subrc <> 0.
* Neue Guid wurde gefunden und wird angehangen!!!
      g_maxguids = g_maxguids + 1.
      it_guids-nr = g_maxguids.
      APPEND it_guids.
      it_guid_ref-guid = g_maxguids.
    ELSE.
      it_guid_ref-guid = sy-tabix.
    ENDIF.
  ENDIF.

  text = vorgaengerguid.
  i = STRLEN( text ).
  SHIFT text LEFT DELETING LEADING space.
  CLEAR: it_guids-guid16,it_guids-guid22,it_guids-guid32.
  IF i = 16.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
        iv_guid_x16                  = guid
*    IV_GUID_C22                  =
*    IV_GUID_C32                  =
     IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ELSEIF i = 22.
    it_guids-guid22 = text.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
*    IV_GUID_X16                  = guid
        iv_guid_c22                  =  it_guids-guid22
*    IV_GUID_C32                  =
     IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ELSEIF i = 32.
    it_guids-guid32 = text.
    CALL FUNCTION 'GUID_CONVERT'
      EXPORTING
*    IV_GUID_X16                  = guid
*    IV_GUID_C22                  =
        iv_guid_c32                  = it_guids-guid32
      IMPORTING
       ev_guid_x16                  =  it_guids-guid16
       ev_guid_c22                  =  it_guids-guid22
       ev_guid_c32                  =  it_guids-guid32
     EXCEPTIONS
       no_unicode_support_yet       = 1
       parameters_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.

  ENDIF.

  text = it_guids-guid32.
  IF text <> ''.
    READ TABLE it_guids WITH KEY guid32 = text TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      it_guid_ref-father = sy-tabix.
    ENDIF.
    it_guid_ref-feld   = fieldnr.
    it_guid_ref-fatherfield = vorgaengerfeld.
    APPEND it_guid_ref.
  ENDIF.
ENDFORM.                    "guid_add




*&--------------------------------------------------------------------*
*&      Form  guid_join
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM guid_join.
  DATA: i TYPE i.
  data: l_tabix like sy-tabix.
  i = 0.
  LOOP AT tabs.
    PERFORM load_table USING tabs-show.
    LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder

      CLEAR dd03l.
      SELECT * FROM dd03l UP TO 1 ROWS WHERE tabname   =
nametab-tabname   AND
                                          fieldname =
nametab-fieldname AND
                                                   as4local  = 'A'.
      ENDSELECT.


      IF ( nametab-datatype = 'RAW' AND
           nametab-ddlen    = 16     ) OR
           nametab-datatype = 'CHAR'   AND
         ( nametab-ddlen    = 32       OR
           nametab-ddlen    = 22  )    AND
         ( nametab-fieldname CS 'GUID' OR
           nametab-fieldname CS 'UUID' OR
           dd03l-rollname CS 'GUID'    OR
           dd03l-rollname CS 'UUID' ) .


        CLEAR it_guid_fields.
        MOVE-CORRESPONDING nametab TO it_guid_fields.
        i = i + 1.
        it_guid_fields-nr = i.
        APPEND it_guid_fields.

      elseif not s_ffeld[] is initial and
             nametab-fieldname in s_ffeld.

        CLEAR it_guid_fields.
        MOVE-CORRESPONDING nametab TO it_guid_fields.
        i = i + 1.
        it_guid_fields-nr = i.
        APPEND it_guid_fields.

      ENDIF.

    ENDLOOP.
  ENDLOOP.

*  Es wurde alle GUID Felder und Tabellen ermittelt
  if not p_guid is initial.
    PERFORM guid_add USING p_guid 0 0 0.
  endif.

  WHILE g_maxguids > g_last_maxguids AND g_maxguids < 1500.
    REFRESH it_guids2.
    LOOP AT it_guids FROM g_last_maxguids TO g_maxguids.
      it_guids2 = it_guids. APPEND it_guids2.
    ENDLOOP.
    g_last_maxguids = g_maxguids.
* it_guid2 enthält jetzt alle neu zu untersuchenden GUIDS!!!

    LOOP AT it_guid_fields.
      PERFORM guid_search USING it_guid_fields-tabname
                                it_guid_fields-fieldname
                                 it_guid_fields-ddlen
                                 it_guid_fields-nr.
    ENDLOOP.



  ENDWHILE.

* Löschen der Inaktivierten Guid-Beziehungen
  loop at it_guids where inaktiv = 'X'.
    l_tabix = sy-tabix.
    delete it_guid_ref where father = l_tabix.
    delete g_tabdata   where guid_nr = l_tabix.
  endloop.


  PERFORM guid_join_ausgabe.

ENDFORM.                    "guid_join




*&--------------------------------------------------------------------*
*&      Form  guid_search
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->TABLE      text
*      -->FIELD      text
*      -->LAENGE     text
*---------------------------------------------------------------------*
FORM guid_search USING value(table) value(field) value(laenge)
                       value(nr).
  FIELD-SYMBOLS: <fs_wa> TYPE ANY.
  FIELD-SYMBOLS: <fs_wa2> TYPE ANY.
  FIELD-SYMBOLS: <fs2>   TYPE ANY.


  DATA: l_data(3000) TYPE c.


  DATA: dref TYPE REF TO data.
  DATA: BEGIN OF it_guid_fields2 OCCURS 0,
       tabname   TYPE tabname,
       fieldname TYPE fieldname,
       datatype  TYPE datatype_d,
       ddlen     TYPE ddleng,
       maxnr     TYPE i,
       nr        TYPE i,
       rc              ,
       END OF it_guid_fields2.

  DATA: g_bed(255).
  DATA: fname(200).
  DATA: i TYPE i.
  data: l_tabix like sy-tabix.
  DATA: l_maxcounter type i.
  DATA: text(200).
  DATA: text2(200).



  DATA: dref2 TYPE REF TO data.
  CREATE DATA dref2 TYPE (table).
  ASSIGN dref2->* TO <fs_wa>.

  DATA: dref6 TYPE REF TO data.
  CREATE DATA dref6 TYPE (table).
  ASSIGN dref6->* TO <fs_wa2>.


  REFRESH it_guid_fields2.
  LOOP AT it_guid_fields WHERE tabname = table AND
                               fieldname <> field.
    it_guid_fields2 = it_guid_fields.
    APPEND it_guid_fields2.
  ENDLOOP.


  LOOP AT it_guids2 where inaktiv = ''.
    l_tabix = sy-tabix.
    CLEAR g_bed.
    IF laenge = 16.
      text = it_guids2-guid16.
      if it_guids2-guid16 is initial. clear text. endif.
      CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
      CONCATENATE g_bed text '''' INTO g_bed.
    ELSEIF laenge = 22.
      text = it_guids2-guid22.
      if it_guids2-guid22 is initial. clear text. endif.
      CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
      CONCATENATE g_bed it_guids2-guid22 '''' INTO g_bed.
    ELSEIF laenge = 32.
      text = it_guids2-guid32.
      if it_guids2-guid32 is initial. clear text. endif.
      CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
      CONCATENATE g_bed it_guids2-guid32 '''' INTO g_bed.
    else.
      text = it_guids2-guid16.
      if it_guids2-guid16 is initial. clear text. endif.
      CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
      CONCATENATE g_bed text '''' INTO g_bed.
    ENDIF.

    if text <> ''.
      l_maxcounter = 0.
      SELECT * FROM (table) INTO l_data UP TO p_maxg ROWS
               WHERE (g_bed).
        l_maxcounter = l_maxcounter + 1.
        if l_maxcounter = p_maxg.
* Es wurde zu einer Guid, die maximale Anzahl einträge gefunden.
* Daher wird vermutet, daß es sich um eine irreführende Beziehung
* handelt. Es soll somit diese Guid inaktiviert werden!!!.

* Beispiel: Ein Konto verweist auf einen typischen Limitbetrag (SAP
AM)
*           über eine GUID beziehung.
*           Viele 1000 andere Konten verweisen auf den gleichen
Limitbetrag.
*           Daher würde über eine solche GUID die vielen 1000 anderen
Konten
*           plötzlich vom Join mitselektiert werden.

          it_guids2-inaktiv = 'X'. modify it_guids2.
          read table it_guids with key guid16 = it_guids2-guid16
                                       guid22 = it_guids2-guid22
                                       guid32 = it_guids2-guid32.
          if sy-subrc = 0.
            it_guids-inaktiv = 'X'. modify it_guids index sy-tabix.
          endif.
        endif.

        <fs_wa> = l_data.
        CLEAR rc.
        LOOP AT g_tabdata WHERE TABLE = TABLE.
          <fs_wa2> = g_tabdata-data.
          IF <fs_wa> = <fs_wa2>.
            rc = 'X'.
            EXIT.
          ENDIF.
        ENDLOOP.
        IF rc = ' '.

          g_tabdata-table = table.
          g_tabdata-data  = l_data.
          g_tabdata-guid_nr = l_tabix.
          APPEND g_tabdata.
        ENDIF.


* Alle anderen GUID Felder dieser Struktur abarbeiten
        fname = '<FS_WA>-'.
        CLEAR: text, text2.
        fname+8 = field.
        ASSIGN (fname) TO <fs2>.
        IF sy-subrc = 0.
          text2 = <fs2>.
        ENDIF.
* aktuelle GUID bestimmen
        CLEAR rc.
        LOOP AT it_guid_fields2.
          fname+8 = it_guid_fields2-fieldname.
          ASSIGN (fname) TO <fs2>.
          IF sy-subrc = 0.
            text = <fs2>.
            IF text <> text2 AND NOT <fs2> IS INITIAL.


*            if g_maxguids = 1.
*              read table it_guid_ref index 1.
*              it_guid_ref-feld = nr.
*              modify it_guid_ref index 1.
*            endif.

              rc = 'X'.
              PERFORM guid_add USING text it_guid_fields2-nr text2 nr.

            ENDIF.
          ENDIF.
        ENDLOOP.
        IF rc = ''.
* Diese Tabelle hat keine weitern GUID Fremdschlüsselfelder
          PERFORM guid_add USING '' 0 text2 nr.
        ENDIF.

      ENDSELECT.
    endif.
  ENDLOOP.

ENDFORM.                    "guid_search


*&--------------------------------------------------------------------*
*&      Form  guid_join_ausgabe
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM guid_join_ausgabe.


  DATA: l_f LIKE it_guid_fields.
  DATA: l_g TYPE guid_16.
  DATA: f1(40), f2(40).

* Filtern von doppelten Einträgen

*  DELETE it_guid_ref INDEX 1.
  SORT it_guid_ref BY feld guid father fatherfield.
  DELETE ADJACENT DUPLICATES FROM it_guid_ref
                  COMPARING feld guid fatherfield.

  ."father fatherfield.

*  DATA: l_g  like it_guid_ref.
*  DATA: l_g2 like it_guid_ref.
*  loop at it_guid_ref.
*    clear it_guid_ref-father.
*    if l_g2 = it_guid_ref.
*      delete it_guid_ref.
*    endif.
*    l_g2 = l_g.
*l_g  = it_guid_ref."alle doppelten ab dem dritten löschen (guid,
feld)
*  endloop.

  SORT it_guid_ref BY father feld guid.


  LOOP AT it_guid_ref.

    READ TABLE it_guid_ref WITH KEY father      = it_guid_ref-guid
                                    guid        = it_guid_ref-father
                                    fatherfield = it_guid_ref-feld
                                  feld        =
it_guid_ref-fatherfield
                                    TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
      DELETE it_guid_ref INDEX sy-tabix.
    ENDIF.
  ENDLOOP.
*    clear it_guid_ref-father.
*    if l_g2 = it_guid_ref.
*      delete it_guid_ref.
*    endif.
*    l_g2 = l_g.
*l_g  = it_guid_ref."alle doppelten ab dem dritten löschen (guid,
feld)
*  endloop.







  WRITE: / 'Felder'.
  ULINE.

  LOOP AT it_guid_fields FROM 1.
    WRITE: /
             it_guid_fields-nr,
             it_guid_fields-tabname,
             it_guid_fields-fieldname.
  ENDLOOP.

  SKIP 2.

  WRITE: / 'Guids'.
  ULINE.

  LOOP AT it_guids.
    WRITE: /
             it_guids-nr,
             it_guids-guid16.
  ENDLOOP.

  SKIP 2.
  FORMAT RESET.
  WRITE: /50 '  Anzeig der GUID Verknüpfungen'.
  ULINE.
  WRITE:
  / 'Gef.GUID | In Feld                                      |',
  ' Fremdschlüsselfeld                          |',
  ' FremdschlüsselGUID                  |',
  'Langtext der Gefundenen GUID   '.
  ULINE.

  LOOP AT it_guid_ref.
    IF it_guid_ref-feld = 0. CLEAR it_guid_ref-guid. ENDIF.
    CLEAR it_guid_fields.
    IF it_guid_ref-feld > 0.
      READ TABLE it_guid_fields INDEX it_guid_ref-feld.
      l_f = it_guid_fields.
      CONCATENATE l_f-tabname '-' l_f-fieldname INTO f1.
    ENDIF.

    CLEAR it_guid_fields.
    IF it_guid_ref-fatherfield > 0.
      READ TABLE it_guid_fields INDEX it_guid_ref-fatherfield.
      l_f = it_guid_fields.
      CONCATENATE l_f-tabname '-' l_f-fieldname INTO f2.
    ENDIF.

    CLEAR it_guids.
    READ TABLE it_guids INDEX it_guid_ref-guid.
    l_g = it_guids-guid16.

    CLEAR it_guids.
    READ TABLE it_guids INDEX it_guid_ref-father.




    WRITE:
           /5(3)  it_guid_ref-father,' |',
            (3) it_guid_ref-fatherfield,f2,'|',
            (3) it_guid_ref-feld,f1,'|',
            (3) it_guid_ref-guid,l_g,'|',
            it_guid_ref-father, it_guids-guid16.

  ENDLOOP.

  ULINE.
  SKIP 2.

ENDFORM.                    "guid_join_ausgabe


*&--------------------------------------------------------------------*
*&      Form  guid_join_datenausgabe
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM guid_join_datenausgabe.

  DATA: fields2(1500) TYPE c.
  SKIP 2.

  LOOP AT tabs.
    READ TABLE g_tabdata WITH KEY table = tabs-show.
    IF sy-subrc = 0.

* Daten dieser Tabelle in eine andere temporäre übertragen
      REFRESH g_tabdata2.
      LOOP AT g_tabdata WHERE TABLE = TABS-SHOW.
        MOVE-CORRESPONDING g_tabdata TO g_tabdata2.
        APPEND g_tabdata2.
      ENDLOOP.

*      sort g_tabdata2.
*      DELETE ADJACENT DUPLICATES FROM g_tabdata2 COMPARING data.

*      PERFORM load_table USING tabs-show.
*      CLEAR fields2.
*      LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
* CONCATENATE fields2 nametab-fieldname INTO fields2 SEPARATED BY ' '.
*      ENDLOOP.
*      SHIFT fields2 LEFT DELETING LEADING space.

      SKIP 2.
      WRITE: / ' Tabelle: ',tabs-show.

*      PERFORM init(z_tab)
*                         USING  tabs-show
* ''  "                                fields2
*                                ' '
*                                ' '         " Hides
*                                ' '              " Referenzen
*                                ' '              " Checkboxen
*                                ' '              " SORT
*                                ' '              " SUM
*                                ' '           .  " group
*
*
*      PERFORM  print_tab(z_tab) TABLES g_tabdata2[].

      NEW-PAGE LINE-SIZE 1250.


      PERFORM  print_wide_table(z_tab) TABLES g_tabdata2[]
                         USING        850
                                      tabs-show
                                ' '
                                ' '         " Hides
                                ' '              " Referenzen
                                ' '              " Checkboxen
                                ' '              " SORT
                                ' '              " SUM
                                ' '           .  " group


      SKIP.

    ENDIF.
  ENDLOOP.




ENDFORM.                    "guid_join_ausgabe

---------------------------------------------------------------------


REPORT z_tab NO STANDARD PAGE HEADING LINE-SIZE 255.


* Öffentliche Prozeduren:

* INIT          "INIT für die Nachfolgende Prozeduren
*                INIT muß immer als erstes für jede neue Struktur
*                aufgerufen werden!

* print_tab     "Ausgabe einer ganzen Tabelle auf dem Bildschirm
* kopfausgabe   "Ausgabe eines Tabellenkopfes
* PRINT_LINE    "Ausgabe nur einer einzelnen Strukturzeile
* PRINT_LINE2   "Ausgabe der Struckurzeile in ein Textfeld
* PRINT_ULINE   "Ausgabe eines Unterstrichs in Tabellenlänge
* XLS_start     "Ausgabe der Tabelle als EXCEL Datei + Start von excel
* XLS_MAIL     "Ausgabe der Tabelle per SAPMAIL (XLS Datei)
(Batchfähig)

* Die Prozeduren können aus anderen Programmen genau wie in den
* nachfolgenden Beispielen aufgerufen werden.
* Beim Aufruf aus einem anderen Programm aber bitte immer
* den Reportnamen in Klammern hinten anfügen. Beispiel:

* Perform Init(Z_TAB) USING ....



TABLES: t001, trdir.

FIELD-SYMBOLS:
               <fs_wa>     TYPE ANY,
               <fs_field>  TYPE ANY,
               <fs_field2> TYPE ANY.

DATA: BEGIN OF g_transl,
      t(1) TYPE c VALUE '|',
       x(1) TYPE x VALUE '09',
      END OF g_transl.

DATA: l_tab_dfies TYPE STANDARD TABLE OF dfies.
DATA: text255(1950).
DATA: tabix LIKE sy-tabix.
FIELD-SYMBOLS: <l_wrk_dfies> TYPE dfies.
FIELD-SYMBOLS: <l_wrk_dfies2> TYPE dfies.




DATA:
subrc LIKE sy-subrc,
tab_len LIKE sy-fdpos,
tabname LIKE dntab-tabname,
tabfield(21),
include LIKE sy-repid,
program LIKE sy-repid.


DATA BEGIN OF nametab OCCURS 0.
        INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab.


DATA: BEGIN OF l_f OCCURS 0,
      name(40) TYPE c,
      END OF l_f.

DATA: BEGIN OF it_fields OCCURS 0,
      name(40) TYPE c,
      text(40) TYPE c,
      laenge   TYPE i,
      case     TYPE c,
      reffield LIKE dfies-reffield,
      datatype LIKE dfies-datatype,
      position LIKE dfies-position,
      position2 LIKE dfies-position,
      offset   TYPE i,
      END OF it_fields.

DATA: BEGIN OF it_fields2 OCCURS 0,
      name(40) TYPE c,
      text(40) TYPE c,
      laenge   TYPE i,
      case     TYPE c,
      reffield LIKE dfies-reffield,
      datatype LIKE dfies-datatype,
      position LIKE dfies-position,
      position2 LIKE dfies-position,
      offset    TYPE i,
      END OF it_fields2.


DATA: BEGIN OF it_names OCCURS 0,
      name(40) TYPE c,
      END OF it_names.

DATA: BEGIN OF it_hides OCCURS 0,
      name(40) TYPE c,
      END OF it_hides.

DATA: BEGIN OF it_check OCCURS 0,
      name(40) TYPE c,
      END OF it_check.

DATA: BEGIN OF it_ref OCCURS 0,
      name(40) TYPE c,
      END OF it_ref.

DATA: BEGIN OF it_sum OCCURS 0,
      name(40) TYPE c,
      position LIKE dfies-position,
      position2 LIKE dfies-position,
      typ(1),
      END OF it_sum.

DATA: BEGIN OF it_group OCCURS 0,
      gruppe   TYPE i,
      position LIKE dfies-position,
      END OF it_group.



* TABELLEN INTERNE VERWENDUNG

DATA: BEGIN OF it_sum_einh OCCURS 0,
      typ,      " 1 = Normal,  2 = T100 Bezug
      position2 LIKE dfies-position,
      END OF it_sum_einh.

TYPES: BEGIN OF t_sum_erg,
      gruppe TYPE i,
      einheiten(250),
      position LIKE dfies-position,
      einheit(5) TYPE c,
      wert   TYPE p DECIMALS 4,
      END OF t_sum_erg.

DATA: it_sum_erg TYPE SORTED TABLE OF t_sum_erg WITH HEADER LINE
      WITH NON-UNIQUE KEY gruppe einheiten position.


DATA: BEGIN OF it_group_last OCCURS 0,
      text(500) TYPE c,
      l_dummy(1950) TYPE c,
      END OF it_group_last.



* MAIL Verarbeitung  -----------------------------------

DATA: docdata LIKE sodocchgi1 OCCURS 0 WITH HEADER LINE.
DATA: reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE.
DATA: it_text LIKE solisti1 OCCURS 0 WITH HEADER LINE.

DATA: objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE.
DATA: objhead LIKE solisti1 OCCURS 0 WITH HEADER LINE.
DATA: sent LIKE sonv-flag OCCURS 0 WITH HEADER LINE.
DATA: new_object_id LIKE sofolenti1-object_id OCCURS 0 WITH HEADER
LINE.
DATA: tab_lines LIKE sy-tabix.



* MAIL Verarbeitung  -----------------------------------




DATA: text(1950).
DATA: zeile(1950).
DATA: laenge TYPE i.
DATA: g_initline(1950).
DATA: gsort(900).
DATA: gstr(90) TYPE c.     " Name der Sturkutr im globalen Gedächtnis
DATA: g_max_groups TYPE i.
DATA: g_sum.



PARAMETERS: xlsstart AS CHECKBOX.
PARAMETERS: e_mail AS CHECKBOX.


START-OF-SELECTION.

* BEISPIEL 1
* --------------------------------------------------------------------
  DATA: i TYPE i.
  DATA: BEGIN OF it_dummy1 OCCURS 0.
          INCLUDE STRUCTURE e070.
  DATA: END OF it_dummy1.

  it_dummy1-as4user = 'TEST'.

  APPEND it_dummy1.

  WRITE: / 'Beispiel 1'.
  NEW-LINE.

  PERFORM init
                     USING  'E070'
                            'trkorr trstatus as4user'
                            '- Status'
                            'trkorr'         " Hides
                            ' '              " Referenzen
                            ' '              " Checkboxen
                            ' '              " SORT
                            ' '              " SUM
                            ' '           .  " group


  PERFORM  print_tab TABLES it_dummy1[].

  SKIP 1.




* Beispiel 2
* --------------------------------------------------------------------
* Ausgabe der zweiten Beispieltabelle in Einzelzeilen


*  DATA: BEGIN OF it_dummy2 OCCURS 0.
*          INCLUDE STRUCTURE mara.
*  DATA: END OF it_dummy2.
*
*  it_dummy2-matnr = '000003999'.
*  it_dummy2-entar = 'X'.
*  it_dummy2-brgew = 1250.
*  it_dummy2-ersda = '20010101'.
*  it_dummy2-gewei = 'KG'.
*  it_dummy2-wesch = 100.
*  it_dummy2-meins = 'ST'.
*
*  APPEND it_dummy2.
*  APPEND it_dummy2.
*  it_dummy2-entar = ''.
*  it_dummy2-brgew = 12500.
*  it_dummy2-wesch = 100.
*  it_dummy2-meins = 'L'.
*
*  APPEND it_dummy2.
*
*  it_dummy2-brgew = 1250.
*  it_dummy2-wesch = 300.
*  it_dummy2-meins = 'L'.
*
*  APPEND it_dummy2.
*  APPEND it_dummy2.
*
*  it_dummy2-ersda = '20010601'.
*  APPEND it_dummy2.
*  APPEND it_dummy2.
*  APPEND it_dummy2.
*  it_dummy2-matnr = '000004711'.
*  APPEND it_dummy2.
*  APPEND it_dummy2.
*
*
*
*
*
*  WRITE: / 'Beispiel 2'.
*  NEW-LINE.
*  PERFORM  init
*  USING  'MARA'
*         'entar Matnr ersda aenam meins BRGEW(10) gewei'
*          'Mark - Datum - Einheit'
*          'Matnr brgew gewei'                   "HIDES
*          'test/test brgew/gewei xxx'           "Referenzen
*          'entar'                               "Checkbox
*          ' '                                   " SORT
*          ' '                                   " SUM
*          ' '  .                                " group
*
*  PERFORM kopfausgabe USING 'X' ' ' CHANGING zeile.
*  LOOP AT it_dummy2.
*    PERFORM print_line USING it_dummy2.
*  ENDLOOP.
*  NEW-LINE.
*  PERFORM print_uline.
*
*
*
** Beispiel 3
** --------------------------------------------------------------------
** Tabelle mit Endsumme und Summen für Gruppenstufen
** --------------------------------------------------------------------
*
*
*  WRITE: / 'Beispiel 3'.
*  NEW-LINE.
*
*  PERFORM init
*  USING  'MARA'
*         'entar Matnr ersda aenam BRGEW(10) gewei WESCH meins'
*          'M - Datum - Einh.'
*          'Matnr brgew gewei'                   "HIDES
*          'test/test brgew/gewei xxx'           "Referenzen
*          'entar'                               "Checkbox
*          'matnr ersda '                        " SORT
*          'brgew wesch '                        " SUM
*          'matnr matnr/ersda '                  " group
*          .
*
*  PERFORM  print_tab TABLES it_dummy2[].
*  SKIP 1.
*
*
*
*
** Beispiel 4
** --------------------------------------------------------------------
** Ausgabe der zweiten Beispieltabelle in Einzelzeilen
** Diese jedoch über ein Rückgabefeld
*
*  SKIP 1.
*  WRITE: / 'Beispiel 4'.
*  NEW-LINE.
*  PERFORM  init
*  USING  'MARA'
*         'entar Matnr ersda aenam meins BRGEW(10) gewei'
*          'Mark - Datum - Einheit'
*          'Matnr brgew gewei'                   "HIDES
*          'test/test brgew/gewei xxx'           "Referenzen
*          'entar'                               "Checkbox
*          ' '                                   " SORT
*          ' '                                   " SUM
*          ' '  .                                " group
*
*  PERFORM kopfausgabe USING 'X' '' CHANGING zeile.
*  LOOP AT it_dummy2.
*    PERFORM print_line2 USING it_dummy2
*                        CHANGING zeile.
**    condense zeile no-gaps.
**    TRANSLATE zeile USING '|;'.
*    WRITE: / zeile.
*  ENDLOOP.
*  NEW-LINE.
*  PERFORM print_uline.
*
*
*
** Beispiel 5
** --------------------------------------------------------------------
** Download der zweiten Beispieltabelle als XLS Datei + XLS Start
*
*  PERFORM  init
*  USING  'MARA'
*         'entar Matnr ersda aenam meins BRGEW(10) gewei'
*          'Mark - Datum - Einheit'
*          'Matnr brgew gewei'                   "HIDES
*          'test/test brgew/gewei xxx'           "Referenzen
*          'entar'                               "Checkbox
*          ' '                                   " SORT
*          ' '                                   " SUM
*          ' '  .                                " group
*
*  IF xlsstart = 'X'.
*    PERFORM xls_start TABLES it_dummy2
*                      USING 'c:\temp\t1.xls' 'X' 'X'.
*
*  ENDIF.
*
*
** Beispiel 6
** --------------------------------------------------------------------
** Da im Batch kein PC Download möglich ist, soll eine solche Datei im
** XLS Format per SAP Mail an einen oder mehrere User versendet
werden.
*
*  PERFORM  init
*  USING  'MARA'
*         'entar Matnr ersda aenam meins BRGEW(10) gewei'
*          'Mark - Datum - Einheit'
*          'Matnr brgew gewei'                   "HIDES
*          'test/test brgew/gewei xxx'           "Referenzen
*          'entar'                               "Checkbox
*          ' '                                   " SORT
*          ' '                                   " SUM
*          ' '  .                                " group
*
*  IF e_mail = 'X'.
*    PERFORM xls_mail TABLES it_dummy2
*             USING 'Testmail vom mini ALV'      " titel
*                    sy-uname              " empfaenger
*                    ''                    " mailtyp (SAPMAIL =
Default)
*                    'X'                   " Express
*                    'X'.                  " header (Kopfzeile
ausgeben)
  .
*
*
*  ENDIF.
*
*  EXIT.
*

*---------------------------------------------------------------------*
*  FORM Kopfausgabe
*---------------------------------------------------------------------*
* Print: = 'X' ---> Bildschirmausgabe.
* Sonst wird nur die Kopfzeile im Textfeld zurückgegeben.
FORM kopfausgabe USING print
                       full_size
                 CHANGING line.
  DATA: l_dummy_string(1950).
  DATA: l_tmp_string(1950).
  DATA: i TYPE i.
  DATA: l2 TYPE i.


  l_dummy_string = '|'.
  laenge = 1.


  LOOP AT it_fields.

    IF it_fields-text = '-'.
      READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                             WITH KEY fieldname = it_fields-name
                             BINARY SEARCH.
      IF sy-subrc = 0.
        WRITE <l_wrk_dfies>-fieldname TO l_tmp_string.
        i = <l_wrk_dfies>-outputlen.
        IF it_fields-laenge <> 0.
          i = it_fields-laenge.
        ENDIF.
        IF i > 100. i = 100. ENDIF.
        IF full_size = 'X'. i = STRLEN( l_tmp_string ). ENDIF.
        TRANSLATE l_tmp_string USING ' #'.
        CONCATENATE l_dummy_string l_tmp_string(i) '|'
                    INTO l_dummy_string.
        laenge = laenge + i + 1.
      ENDIF.
    ELSE.
      READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                             WITH KEY fieldname = it_fields-name
                             BINARY SEARCH.
      IF sy-subrc = 0.
        WRITE it_fields-text TO l_tmp_string.
        i = <l_wrk_dfies>-outputlen.
        IF it_fields-laenge <> 0.
          i = it_fields-laenge.
        ENDIF.
        IF full_size = 'X'. i = STRLEN( l_tmp_string ). ENDIF.
        IF i > 100. i = 100. ENDIF.
        TRANSLATE l_tmp_string USING ' #'.
        CONCATENATE l_dummy_string l_tmp_string(i) '|'
                    INTO l_dummy_string.
        laenge = laenge + i + 1.
      ENDIF.
    ENDIF.
  ENDLOOP.
  TRANSLATE l_dummy_string USING '# '.
  line = l_dummy_string.
  l2 = laenge.
  IF print = 'X'.
    ULINE AT 0(laenge).

    PERFORM write_long USING line 1.

*    IF laenge > 250.
*      WRITE: / l_dummy_string(250) COLOR 1 NO-GAP.
*      laenge = laenge - 250.
*      l_dummy_string = l_dummy_string+250.
*      IF laenge > 250.
*        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
*        laenge = laenge - 250.
*        l_dummy_string = l_dummy_string+250.
*      ENDIF.
*      IF laenge > 250.
*        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
*        laenge = laenge - 250.
*        l_dummy_string = l_dummy_string+250.
*      ENDIF.
*      IF laenge > 250.
*        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
*        laenge = laenge - 250.
*        l_dummy_string = l_dummy_string+250.
*      ELSE.
*        WRITE:  l_dummy_string(laenge) COLOR 1 NO-GAP.
*      ENDIF.
*
*
*    ELSE.
*      WRITE: / l_dummy_string(laenge) COLOR 1.
*    ENDIF.
    NEW-LINE.
    ULINE AT 0(l2).
  ENDIF.
ENDFORM.                    "Kopfausgabe







*---------------------------------------------------------------------*
*       FORM print_line                                              
*
*---------------------------------------------------------------------*
* Es erfolgt eine Bildschirmausgabe.

FORM print_line USING u_str.

  DATA: fields2(1950) TYPE c.
  DATA: i  TYPE i.
  DATA: offset TYPE i.
  DATA: i2 TYPE i.
  DATA: rc TYPE i.
  DATA: dref TYPE REF TO data.
  CREATE DATA dref TYPE (gstr).
  ASSIGN dref->* TO <fs_wa>.

  ASSIGN u_str TO <fs_wa>.

  offset = 2.
  WRITE: / g_initline(laenge).

  LOOP AT it_fields.
    ASSIGN COMPONENT it_fields-position
    OF STRUCTURE <fs_wa> TO <fs_field>.

* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
    CASE it_fields-case.
      WHEN '1'.
        WRITE AT offset <fs_field>(1) AS CHECKBOX.
        offset = offset + 2.
      WHEN '2'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        IF <fs_field2> <> t001-bukrs.
          CLEAR t001.
          SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
        ENDIF.
        WRITE: <fs_field> TO text(it_fields-laenge).
        WRITE: AT offset text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '3'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        IF <fs_field2> <> t001-bukrs.
          CLEAR t001.
          SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
        ENDIF.
        WRITE: AT offset <fs_field>.
        offset = offset + it_fields-laenge + 1.

      WHEN '4'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
       WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge)
.
        WRITE AT offset text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '5'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
        offset = offset + it_fields-laenge + 1.

      WHEN '6'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields-laenge).
        WRITE AT offset text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.
      WHEN '7'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: AT offset <fs_field> UNIT <fs_field2>.
        offset = offset + it_fields-laenge + 1.
      WHEN '8'.
        WRITE: <fs_field> TO text(it_fields-laenge).
        WRITE AT offset text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '9'.
        WRITE: AT offset <fs_field>.
        offset = offset + it_fields-laenge + 1.

      WHEN OTHERS.
        WRITE: AT offset <fs_field>.
        offset = offset + it_fields-laenge + 1.
*        WRITE: / 'FEHLER !!!'.
    ENDCASE.

  ENDLOOP.



* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------


ENDFORM.                    "print_line





*---------------------------------------------------------------------*
*       FORM print_line2
*---------------------------------------------------------------------*
* Anstelle der Prozedur Print_line gibt diese keine Informationen auf
* dem Bildschirm aus, sondern diese in einem Textfeld zurück.
FORM print_line2 USING u_str
                CHANGING line.

  DATA: fields2(3200) TYPE c.
  DATA: i  TYPE i.
  DATA: i2 TYPE i.
  DATA: offset TYPE i.
  DATA: ausgabe(3200) TYPE c.
  DATA: rueck(3200) TYPE c.
  DATA: rc TYPE i.
  DATA: dref TYPE REF TO data.


  DATA: dref3 TYPE REF TO data.
  CREATE DATA dref3 TYPE (gstr).
  ASSIGN dref3->* TO <fs_wa>.
  DATA: dummystr(3200).
  dummystr = u_str.
  <fs_wa> = dummystr.

  CLEAR t001.

* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
  offset = 1.
  rueck = g_initline.

  LOOP AT it_fields.
    ASSIGN COMPONENT it_fields-position
    OF STRUCTURE <fs_wa> TO <fs_field>.

    CASE it_fields-case.
      WHEN '1'.
        rueck+offset(1) = <fs_field>(1). offset = offset + 2.
      WHEN '2'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        IF <fs_field2> <> t001-bukrs.
          CLEAR t001.
          SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
        ENDIF.
        WRITE: <fs_field> TO text(it_fields-laenge).
        rueck+offset(it_fields-laenge) = text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '3'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        IF <fs_field2> <> t001-bukrs.
          CLEAR t001.
          SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
        ENDIF.
        WRITE: <fs_field> TO text.
        rueck+offset(it_fields-laenge) = text.
        offset = offset + it_fields-laenge + 1.

      WHEN '4'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
       WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge)
.
        rueck+offset(it_fields-laenge) = text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '5'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: <fs_field> CURRENCY <fs_field2> TO text left-justified.
        rueck+offset(it_fields-laenge) = text.
        offset = offset + it_fields-laenge + 1.

      WHEN '6'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields-laenge).
        rueck+offset(it_fields-laenge) = text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.
      WHEN '7'.
        ASSIGN COMPONENT it_fields-position2
             OF STRUCTURE <fs_wa> TO <fs_field2>.
        WRITE: <fs_field> UNIT <fs_field2> TO text.
        rueck+offset(it_fields-laenge) = text.
        offset = offset + it_fields-laenge + 1.
      WHEN '8'.
        WRITE: <fs_field> TO text(it_fields-laenge).
        rueck+offset(it_fields-laenge) = text(it_fields-laenge).
        offset = offset + it_fields-laenge + 1.

      WHEN '9'.
        WRITE: <fs_field> TO text.
        rueck+offset(it_fields-laenge) = text.
        offset = offset + it_fields-laenge + 1.

      WHEN OTHERS.
        WRITE: <fs_field> TO text.
        rueck+offset(it_fields-laenge) = text.
        offset = offset + it_fields-laenge + 1.
*        WRITE: / 'FEHLER !!!'.
    ENDCASE.

  ENDLOOP.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
  line = rueck.
ENDFORM.                    "print_line2



*---------------------------------------------------------------------*
*       FORM print_uline                                             
*
*---------------------------------------------------------------------*
FORM print_uline.
  ULINE AT 0(laenge).
ENDFORM.                    "print_uline







*---------------------------------------------------------------------*
*       FORM init                                                    
*
*---------------------------------------------------------------------*
* Initialisieren der Ausgabe, lesen der Strukturen,
* Vorverarbeiten der Parameter.
*
* SIEHE:  PRINT_TAB
*
*
FORM init  USING     str       "Name der Struktur
                     pfields   "Anzuzeigende Felder
                     names     "Benennung der Felder in der Kopfzeile
                     hides     "Per Hide zu hinterlegende Felder
                     ref       "UNIT oder
                     checkbox  "Als Checkbox anzuzeigende Felder.
                     sort2     "Sortierreihenfolge
                     sum       "Felder die zu summieren sind
                     group.    "Gruppenstufen

  DATA: fields(3000).
  fields = pfields.

* STR:        Name der übergebenen Struktur (muß im DDIC existieren)
* Fields:     Auszugebenede Felder der Struktur. Die einzelnen Felder
*             werden durch Leerzeichen getrennt.
*             Ist am Ende des Feldes eine Längenbegrenzung angegeben
*             z.B. BRGEW(10) so wird das Feld maximal 10 Stellig
*             ausgegeben.
*             Es wird in diesem Beispiel folgendes Write prozessiert:
*             WRITE BRGEW into TEXT(10). Dieser Text wird dann
*             ausgegeben. Bitte keine Konstrukte wie
*             BRGEW+3(10) verwenden!
*
* Names:      Namen der Felder für die Kopfzeile
*             Soll der Feldname ausgegeben werden, einfach ein "-"
*             Minuszeichen für dieses Feld eintragen. Die einzelnen
*             Feldnamen bitte durch Leerzeichen getrennt eingeben.
*             Für nicht näher benannte Felder wird der Feldname
*             in der Kopfzeile ausgegeben.
* HIDES:      Die hier durch Leerzeichen getrennt eigegebenen Felder
*             werden per HIDE Befehl auf dem Bildschirm abgelegt.
*             (Nur Print_tab)
*  ref:       Für Referenzen (CURR/QUAN), die nicht auf ein Feld
*             innerhalb der eigenen Struktur verweisen, muß der
Verweis
*             umgesetzt werden. Dazu bitte per Leerzeichen getrennt
*             immer Feld/neueReferenz eingeben.
* CHECKBOX:   Die hier eingegebenen Felder werden als Checkbox
*             ausgegeben.  (Nur print_tab)
* SORT:       Sortierungsausdruck Beispiel:
*             "Feld1 Feld2 descending Feld3"
*             Funktioniert nur in Verbindung mit der Tabellenausgabe
*             (Print_TAB)
* SUM:        Die nachfolgend durch Leerzeichen getrennten Felder
*             sind zu summieren. Es werden nur QUAN, CURR, DEC, INT
und
*             P Felder betrachtet!
*             Die Parameter von SUM und GROUP werdeb nur bei
*             der Prozedur PRINT_TAB beachtet!!!
* GROUP:      Bei Summierungen werden folgende Gruppenstufen
*             (Gruppierungen) betrachtet.
*             Die einzelnen Felder einer Gruppierung werden durch
*             einen Slash / getrennt. Die einzelnen Gruppenstufen
*             durch ein Leerzeichen
*             Beispiel:
*             BUKRS BUKRS/MATKL BUKRS/MATKL/MATNR




  DATA: BEGIN OF it_tmp OCCURS 0,
        name(40) TYPE c,
        END OF it_tmp.
  DATA: BEGIN OF it_tmp2 OCCURS 0,
        name(40) TYPE c,
        END OF it_tmp2.


* Wenn keine Felder übergeben, alle Felder nehmen!!!
  IF fields = ''.
    PERFORM load_table USING str.
    CLEAR fields.
    LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
      CONCATENATE fields nametab-fieldname INTO fields SEPARATED BY '
'.
    ENDLOOP.
    SHIFT fields LEFT DELETING LEADING space.
  ENDIF.


  DATA: stname TYPE ddobjname.
  DATA: fields2(1950) TYPE c.
  DATA: t1(50), t2(50), t3(1950).
  DATA: i  TYPE i.
  DATA: i2 TYPE i.

  gstr   = str.
  stname = gstr.
  gsort  = sort2.
  TRANSLATE gsort TO UPPER CASE.

  REFRESH l_tab_dfies.
  CLEAR   l_tab_dfies.

  CALL FUNCTION 'DDIF_NAMETAB_GET'
    EXPORTING
      tabname   = stname
      all_types = 'X'
    TABLES
      dfies_tab = l_tab_dfies
    EXCEPTIONS
      not_found = 1
      OTHERS    = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  SORT l_tab_dfies BY fieldname.

* Parameter in Tabellen übertragen
  REFRESH:
  it_fields, it_names, it_hides, it_ref, it_check, it_sum, it_group.
  CLEAR:
  it_fields, it_names, it_hides, it_ref, it_check, it_sum, it_group.
  fields2 = fields.
  TRANSLATE fields2 TO UPPER CASE.
  REFRESH l_f.
  SPLIT fields2   AT ' ' INTO TABLE l_f.
  LOOP AT l_f.
    it_fields-name = l_f-name.
    APPEND it_fields.
  ENDLOOP.

  REFRESH l_f.
  SPLIT names     AT ' ' INTO TABLE l_f.
  LOOP AT l_f.
    it_names-name = l_f-name.
    APPEND it_names.
  ENDLOOP.


  fields2 = hides.
  TRANSLATE fields2 TO UPPER CASE.
  SPLIT fields2   AT ' ' INTO TABLE it_hides.
  SORT it_hides.

  fields2 = checkbox.
  TRANSLATE fields2 TO UPPER CASE.
  SPLIT fields2  AT ' ' INTO TABLE it_check.
  SORT it_check.

  fields2 = ref.
  TRANSLATE fields2 TO UPPER CASE.
  SPLIT fields2  AT ' ' INTO TABLE it_ref.
  SORT it_ref.

  fields2 = sum.
  TRANSLATE fields2 TO UPPER CASE.
  SPLIT fields2  AT ' ' INTO TABLE it_sum.
  SORT it_sum.

  CLEAR it_tmp. REFRESH it_tmp.
  fields2 = group.
  TRANSLATE fields2 TO UPPER CASE.
  SPLIT fields2  AT ' ' INTO TABLE it_tmp.

  LOOP AT it_tmp.
    it_group-gruppe = sy-tabix.
    g_max_groups = sy-tabix.
    REFRESH it_tmp2. CLEAR it_tmp2.
    SPLIT it_tmp-name AT '/' INTO TABLE it_tmp2.
    LOOP AT it_tmp2.

      READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
                             WITH KEY fieldname = it_tmp2-name
                             BINARY SEARCH.
      IF sy-subrc = 0.
        it_fields-position2 = <l_wrk_dfies2>-position.
        it_group-position = <l_wrk_dfies2>-position.
        APPEND it_group.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  SORT it_group BY gruppe DESCENDING position.
* Gruppenwechsel LAST Tabelle vorinitialisieren.
  i = g_max_groups.
  REFRESH it_group_last.
  CLEAR it_group_last.
  WHILE i >= 0.
    APPEND it_group_last.
    i = i - 1.
  ENDWHILE.


  DESCRIBE TABLE it_fields LINES i.
  DESCRIBE TABLE it_names  LINES i2.

* Kopfnamen nachkontrollieren
  WHILE i2 < i.
    i2 = i2 + 1.
    it_names = '-'. APPEND it_names.
  ENDWHILE.

  LOOP AT it_fields.
    READ TABLE it_names INDEX sy-tabix.
    it_fields-text = it_names-name.
    SPLIT it_fields-name AT '(' INTO it_fields-name t1.
    SPLIT t1 AT ')' INTO t1 t2.
    it_fields-laenge = t1.
    MODIFY it_fields.
  ENDLOOP.

* Referenzen umsetzen.
  LOOP AT it_ref.
    SPLIT it_ref-name AT '/' INTO t1 t2 t3.
    READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                         WITH KEY fieldname = t1
                         BINARY SEARCH.
    IF sy-subrc = 0.
      tabix = sy-tabix.
      <l_wrk_dfies>-reffield = t2.
      MODIFY l_tab_dfies FROM <l_wrk_dfies> INDEX tabix.
    ENDIF.
  ENDLOOP.


* Referenzen kontrollieren

  LOOP AT it_fields.
    READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                         WITH KEY fieldname = it_fields-name
                         BINARY SEARCH.
    IF sy-subrc = 0 AND <l_wrk_dfies>-reffield <> ''.

      READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                           WITH KEY fieldname = <l_wrk_dfies>-reffield
                           BINARY SEARCH.
      IF sy-subrc <> 0 .
        CONCATENATE 'WARNUNG: Das Feld' it_fields-name
      'Referenziert auf ein Feld, welches nicht in der Struktur:'
      gstr 'vorhanden ist' INTO t3 SEPARATED BY ' '.
        WRITE: / t3.
        <l_wrk_dfies>-reftable = ''.
        <l_wrk_dfies>-reffield = ''.


      ENDIF.
    ENDIF.
  ENDLOOP.


* --------------------------------------------------------------------
* Leere Strukturzeile generieren und
* it_fields mit Fallunterscheidungen füllen
* --------------------------------------------------------------------

  DATA: offset TYPE i.
  DATA: offset_old TYPE i.
  DATA: ausgabe(3200) TYPE c.
  DATA: rueck(3200) TYPE c.
  DATA: rc TYPE i.

  offset = 1.
  rueck = '|'.

  LOOP AT it_fields.
    it_fields-datatype = ''.
    it_fields-case = ''.
    it_fields-reffield = ''.
    it_fields-position = 0.
    it_fields-position2 = 0.
    it_fields-offset = offset.

    offset_old = offset.

    READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
                           WITH KEY fieldname = it_fields-name
                           BINARY SEARCH.
    IF sy-subrc = 0.
      it_fields-reffield = <l_wrk_dfies>-reffield.
      it_fields-datatype = <l_wrk_dfies>-datatype.

      READ TABLE it_check WITH KEY name = it_fields-name
                          BINARY SEARCH.
      IF sy-subrc = 0.
* Als Checkbox ausgeben (FALL = 1)
        it_fields-case = '1'.
        rueck+offset(2) = ' |'. offset = offset + 2.
        it_fields-laenge = 1.
      ELSE.
* Normale Feldausgabe

        IF <l_wrk_dfies>-datatype = 'CURR' OR
           <l_wrk_dfies>-datatype = 'QUAN'.
          rc = 0.
* Betrachtung von CURR und QUAN Feldern
          IF <l_wrk_dfies>-reftable = 'T001'.
            READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
                                   WITH KEY fieldname = 'BUKRS'
                                   BINARY SEARCH.
            IF sy-subrc = 0.
              it_fields-position2 = <l_wrk_dfies2>-position.
*              ASSIGN COMPONENT <l_wrk_dfies2>-position
*               OF STRUCTURE <fs_wa> TO <fs_field2>.
              IF sy-subrc = 0.
                rc = 1.
* Ausgabe wie ein normales Feld, da jetzt Referenzstruktur gefüllt
                IF it_fields-laenge <> 0.
* FALL = 2 --> T001 bezug mit veränderter Länge
* --> Normale Ausgabe mit veränderter Länge
                  it_fields-case = '2'.
                  offset = offset + it_fields-laenge.
                  rueck+offset(1) = '|'. offset = offset + 1.
                ELSE.
* FALL = 3 --> T001 bezug mit veränderter Länge
* --> Normale Ausgabe mit dfies Standardlänge
                  it_fields-case = '3'.
                  offset = offset + <l_wrk_dfies>-outputlen.
                  rueck+offset(1) = '|'. offset = offset + 1.
                  it_fields-laenge = <l_wrk_dfies>-outputlen.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
          IF rc = 0.
* Keine Curr Felder in Bezug auf T001 !!
* Jetzt normalen CURR und QUAN Bezug abarbeiten.
            READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
                        WITH KEY fieldname = <l_wrk_dfies>-reffield
                        BINARY SEARCH.
            IF sy-subrc = 0.
              it_fields-position2 = <l_wrk_dfies2>-position.
*              ASSIGN COMPONENT <l_wrk_dfies2>-position
*              OF STRUCTURE <fs_wa> TO <fs_field2>.

              IF <l_wrk_dfies>-datatype = 'CURR'.
                IF it_fields-laenge <> 0.
* FALL = 4 --> CURR Feld Ausgabe mit veränderter Länge
                  it_fields-case = '4'.
                  offset = offset + it_fields-laenge.
                  rueck+offset(1) = '|'. offset = offset + 1.
                ELSE.
* FALL = 5 --> CURR Feld Ausgabe mit dfies Standardlänge
                  it_fields-case = '5'.
                  offset = offset + <l_wrk_dfies>-outputlen.
                  rueck+offset(1) = '|'. offset = offset + 1.
                  it_fields-laenge = <l_wrk_dfies>-outputlen.
                ENDIF.
              ELSE.
                IF it_fields-laenge <> 0.
* FALL = 6 --> QUAN Feld Ausgabe mit veränderter Länge
                  it_fields-case = '6'.
                  offset = offset + it_fields-laenge.
                  rueck+offset(1) = '|'. offset = offset + 1.

                ELSE.
* FALL = 7 --> QUAN Feld Ausgabe mit dfies Standardlänge
                  it_fields-case = '7'.
                  offset = offset + <l_wrk_dfies>-outputlen.
                  rueck+offset(1) = '|'. offset = offset + 1.
                  it_fields-laenge = <l_wrk_dfies>-outputlen.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
        ELSE.
* Betrachtung von normalen Ausgabefeldern
          IF it_fields-laenge <> 0.
* FALL = 8 -->  Normale Ausgabe mit veränderter Länge
            it_fields-case = '8'.
            offset = offset + it_fields-laenge.
            rueck+offset(1) = '|'. offset = offset + 1.
          ELSE.
* FALL = 9 -->  Normale Ausgabe mit dfies Standardlänge
            it_fields-case = '9'.
            offset = offset + <l_wrk_dfies>-outputlen.
            rueck+offset(1) = '|'. offset = offset + 1.
            it_fields-laenge = <l_wrk_dfies>-outputlen.

          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
    IF offset_old = offset.
      offset = offset + <l_wrk_dfies>-outputlen.
      rueck+offset(1) = '|'. offset = offset + 1.
      it_fields-laenge = <l_wrk_dfies>-outputlen.
    ENDIF.
    it_fields-position = <l_wrk_dfies>-position.
    MODIFY it_fields.
  ENDLOOP.

  g_initline = rueck.


  g_sum = ''.
  LOOP AT it_sum.
    g_sum = 'X'.
    READ TABLE it_fields WITH KEY name = it_sum-name.

    IF it_fields-case = 2 OR it_fields-case = 3.
      it_sum_einh-typ = '2'.
      it_sum-typ      = '2'.

    ELSE.
      it_sum_einh-typ = '1'.
      it_sum-typ      = '1'.

    ENDIF.
    it_sum-position  = it_fields-position.
    it_sum-position2 = it_fields-position2.
    MODIFY it_sum.
    it_sum_einh-position2 = it_fields-position2.
    APPEND it_sum_einh.
  ENDLOOP.

  SORT it_sum BY position.
  SORT it_sum_einh.
  DELETE ADJACENT DUPLICATES FROM it_sum_einh.


  it_fields2[] = it_fields[].
  SORT it_fields2 BY position.

ENDFORM.  "INIT




*&--------------------------------------------------------------------*
*&      Form  print_wide_table
*&--------------------------------------------------------------------*
FORM print_wide_table TABLES it
           USING     breite    "maximale Ausgabebreite
                     str       "Name der Struktur
                     names     "Benennung der Felder in der Kopfzeile
                     hides     "Per Hide zu hinterlegende Felder
                     ref       "UNIT oder
                     checkbox  "Als Checkbox anzuzeigende Felder.
                     sort2     "Sortierreihenfolge
                     sum       "Felder die zu summieren sind
                     group.    "Gruppenstufen

  DATA: fields(3000).
  DATA: i TYPE i.

  DATA: BEGIN OF it_fields OCCURS 0,
        fields(3000),
        END OF it_fields.

  DESCRIBE TABLE it LINES i.

  IF i = 0. EXIT. ENDIF.

* Wenn keine Felder übergeben, alle Felder nehmen!!!
  PERFORM load_table USING str.
  CLEAR fields.
  LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
    i = i + nametab-ddlen + 2.
    IF i > breite.
      IF fields <> ''.
        SHIFT fields LEFT DELETING LEADING space.
        it_fields-fields = fields. APPEND it_fields.
      ENDIF.
      CLEAR fields.
      i = nametab-ddlen + 2.
    ENDIF.
    CONCATENATE fields nametab-fieldname INTO fields SEPARATED BY ' '.
    IF i > breite.
      IF fields <> ''.
        SHIFT fields LEFT DELETING LEADING space.
        it_fields-fields = fields. APPEND it_fields.
        CLEAR fields.
      ENDIF.
      i = 0.
    ENDIF.

  ENDLOOP.
  SHIFT fields LEFT DELETING LEADING space.
  it_fields-fields = fields. APPEND it_fields.
  CLEAR fields.



  LOOP AT it_fields.
    PERFORM init
            USING     str                "Name der Struktur
                      it_fields-fields   "Anzuzeigende Felder
                      names     "Benennung der Felder in der Kopfzeile
                      hides     "Per Hide zu hinterlegende Felder
                      ref       "UNIT oder
                      checkbox  "Als Checkbox anzuzeigende Felder.
                      sort2     "Sortierreihenfolge
                      sum       "Felder die zu summieren sind
                      group.    "Gruppenstufen

    PERFORM print_tab TABLES it.

    SKIP 2.

  ENDLOOP.


ENDFORM.                    "print_wide_table



*---------------------------------------------------------------------*
*       FORM print_tab                                               
*
*---------------------------------------------------------------------*
FORM print_tab TABLES it.

  DATA: fields2(1950) TYPE c.
  DATA: l_dummy(1950).
  DATA: text(500).
  DATA: tabix LIKE sy-tabix.
  DATA: i  TYPE i.
  DATA: offset TYPE i.
  DATA: i3 TYPE i.
  DATA: i2 TYPE i.
  DATA: rc TYPE i.
  DATA: l_act_einh_wechsel(1950).
  DATA: t1(50),
        t2(50),
        t3(50),
        t4(50),
        t5(50),
        t6(50),
        t7(50),
        t8(50),
        t9(50),
        t10(50),
        t11(50),
        t12(50),
        t13(50),
        t14(50),
        t15(50).

  DATA: dref TYPE REF TO data.
  CREATE DATA dref TYPE (gstr).
  ASSIGN dref->* TO <fs_wa>.
  DATA: wa(1950).


*  NEW-PAGE LINE-SIZE 1250.

  IF gsort <> ''.
    SPLIT gsort AT ' ' INTO t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
                            t11 t12 t13 t14 t15.

    SORT it BY (t1) (t2) (t3) (t4) (t5) (t6) (t7) (t8) (t9)
               (t10) (t11) (t12) (t13) (t14) (t15).

  ENDIF.

* Kopf ausgeben.
  PERFORM kopfausgabe USING 'X' '' CHANGING zeile.



* Tabelle ausgeben
  LOOP AT it INTO wa.
    <fs_wa> = wa.
    tabix = sy-tabix.
    i = sy-tabix MOD 2.
    IF i = 1.
      FORMAT COLOR 2 INTENSIFIED ON.
    ELSE.
      FORMAT COLOR 2 INTENSIFIED OFF.
    ENDIF.



* Erkennen eines Einheitengruppenwechsels

    IF g_sum = 'X'.
      l_act_einh_wechsel = ''.
      LOOP AT it_sum_einh.
        ASSIGN COMPONENT it_sum_einh-position2
         OF STRUCTURE <fs_wa> TO <fs_field2>.
        IF it_sum_einh-typ = '1'.
          CONCATENATE l_act_einh_wechsel '|' <fs_field2> INTO
l_act_einh_wechsel.
        ELSE.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          CONCATENATE l_act_einh_wechsel '|' t001-waers INTO
l_act_einh_wechsel.
        ENDIF.
      ENDLOOP.
    ENDIF.



* Erkennen eines Gruppenwechsels
    IF g_max_groups > 0.

      CLEAR l_dummy.
      LOOP AT it_group.
        ASSIGN COMPONENT it_group-position
         OF STRUCTURE <fs_wa> TO <fs_field>.
        WRITE: <fs_field> TO text.
        CONCATENATE l_dummy '|' text INTO l_dummy.

        AT END OF gruppe.
          READ TABLE it_group_last INDEX it_group-gruppe.
          IF it_group_last-text <> l_dummy.
            IF it_group_last-text = ''.
              it_group_last-text = l_dummy.
              MODIFY it_group_last INDEX  it_group-gruppe.
            ELSE.
              it_group_last-text = l_dummy.
              MODIFY it_group_last INDEX  it_group-gruppe.

* Gruppenwechsel ausgeben!

              NEW-LINE.
              ULINE AT 0(laenge).
              FORMAT RESET.
              PERFORM summenausgabe USING it_group-gruppe.
            ENDIF.
          ENDIF.
          CLEAR l_dummy.
        ENDAT.
      ENDLOOP.

      LOOP AT it_group_last.
        it_group_last-l_dummy = <fs_wa>.
        MODIFY it_group_last.
      ENDLOOP.


    ENDIF. " Erkennen eines Gruppenwechsels





    offset = 2.
    PERFORM write_long USING g_initline 0.
*    WRITE: / g_initline(laenge).
    HIDE sy-tabix.

    CLEAR text255.
    LOOP AT it_fields.
      ASSIGN COMPONENT it_fields-position
      OF STRUCTURE <fs_wa> TO <fs_field>.

* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------

      READ TABLE it_hides WITH KEY name = it_fields-name
                      BINARY SEARCH.
      IF sy-subrc = 0.
        text = <fs_field>.
        CONCATENATE text255 text '|' INTO text255.
*        HIDE text255.
      ENDIF.



      CASE it_fields-case.
        WHEN '1'.
          WRITE AT offset <fs_field>(1) AS CHECKBOX.
          offset = offset + 2.
        WHEN '2'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          WRITE: <fs_field> TO text(it_fields-laenge).
          WRITE: AT offset text(it_fields-laenge).
          offset = offset + it_fields-laenge + 1.

        WHEN '3'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          WRITE: AT offset <fs_field>.
          offset = offset + it_fields-laenge + 1.

        WHEN '4'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).
          offset = offset + it_fields-laenge + 1.

        WHEN '5'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
          offset = offset + it_fields-laenge + 1.

        WHEN '6'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: <fs_field> UNIT <fs_field2> TO
text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).
          offset = offset + it_fields-laenge + 1.
        WHEN '7'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: AT offset <fs_field> UNIT <fs_field2>.
          offset = offset + it_fields-laenge + 1.
        WHEN '8'.
          WRITE: <fs_field> TO text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).
          offset = offset + it_fields-laenge + 1.

        WHEN '9'.
          WRITE: AT offset <fs_field>.
          offset = offset + it_fields-laenge + 1.

        WHEN OTHERS.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          WRITE: AT offset <fs_field>.
          offset = offset + it_fields-laenge + 1.
*          WRITE: / 'FEHLER !!!'.
      ENDCASE.


* ----------------------------------------------------------------------
* Die Werte zu den Gesamtsummen hinzurechnen.
* Jede Gruppierung (0 = Gesamt) hat ihre eigenen Summen
      IF g_sum = 'X'.
        READ TABLE it_sum WITH KEY position = it_fields-position
             BINARY SEARCH.
        IF sy-subrc = 0.
          i3 = 0.
* Für jede Gruppe die Addition durchführen.
          WHILE i3 <= g_max_groups.
            READ TABLE it_sum_erg WITH KEY gruppe     = i3
                                         einheiten =
l_act_einh_wechsel
                                         position  =
it_fields-position.

            IF sy-subrc = 0.
              tabix = sy-tabix.
              it_sum_erg-wert = it_sum_erg-wert + <fs_field>.
              IF it_sum-typ = '1'.
                it_sum_erg-einheit = <fs_field2>.
              ELSE.
                it_sum_erg-einheit = t001-waers.
              ENDIF.
              MODIFY it_sum_erg INDEX sy-tabix.
            ELSE.
              CLEAR it_sum_erg.
              it_sum_erg-gruppe    = i3.
              it_sum_erg-position  = it_fields-position.
              it_sum_erg-einheiten = l_act_einh_wechsel.
              IF it_sum-typ = '1'.
                it_sum_erg-einheit = <fs_field2>.
              ELSE.
                it_sum_erg-einheit = t001-waers.
              ENDIF.
              it_sum_erg-wert = <fs_field>.
              INSERT it_sum_erg INTO TABLE it_sum_erg.
            ENDIF.

            i3 = i3 + 1.
          ENDWHILE.
        ENDIF.
      ENDIF.

    ENDLOOP.
    IF text255 <> ''.
      HIDE text255.
    ENDIF.


* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------




  ENDLOOP.
  NEW-LINE.
  ULINE AT 0(laenge).
  FORMAT RESET.

* Gesamtsumme ausgeben!!!
  IF g_sum = 'X'.
    i3 = g_max_groups.

    WHILE i3 >= 0.
      PERFORM summenausgabe USING i3.
      i3 = i3 - 1.
      NEW-LINE.
      ULINE AT 0(laenge).
    ENDWHILE.
  ENDIF.



ENDFORM.                    "print_tab


*---------------------------------------------------------------------*
*       FORM Summenausgabe                                           
*
*---------------------------------------------------------------------*
*       ........                                                     
*
*---------------------------------------------------------------------*
*  -->  U_GRUPPE                                                     
*
*---------------------------------------------------------------------*
FORM summenausgabe USING u_gruppe.
  DATA: l_dummy(1950).
  DATA: offset TYPE i.
  DATA: i3 TYPE i.
  DATA: i2 TYPE i.
  DATA: rc TYPE i.
  DATA: nl TYPE i.
  DATA: ltext(1).

  l_dummy = <fs_wa>.
  rc = 0.
  nl = 0.
  FORMAT COLOR 3 INTENSIFIED ON.
  CLEAR <fs_wa>.


  LOOP AT it_sum_erg WHERE gruppe = u_gruppe.
    AT NEW einheiten.
      WRITE: / g_initline(laenge).
      nl = 0.
      CLEAR <fs_wa>.
      IF u_gruppe = 0.
        IF rc = 0.
          WRITE: AT 2 'Gesamt:'.
          rc = 1.
        ELSE.
          WRITE: AT 2 '       '.
        ENDIF.
      ELSE.
        WRITE u_gruppe TO ltext.
        WRITE: AT 2 ltext.
      ENDIF.
    ENDAT.
    READ TABLE it_sum WITH KEY position = it_sum_erg-position
         BINARY SEARCH.
    READ TABLE it_fields2 WITH KEY position = it_sum_erg-position
         BINARY SEARCH.

    ASSIGN COMPONENT it_sum-position
         OF STRUCTURE <fs_wa> TO <fs_field>.
    ASSIGN COMPONENT it_sum-position2
         OF STRUCTURE <fs_wa> TO <fs_field2>.

    IF it_sum-typ = '2'.
      IF <fs_field2> <> t001-bukrs.
        CLEAR t001.
        SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
      ENDIF.
    ELSE.
      <fs_field2> = it_sum_erg-einheit.
    ENDIF.

    <fs_field> = it_sum_erg-wert.

    offset = it_fields2-offset + 1.
    CASE it_fields2-case.
      WHEN '2'.
        WRITE: <fs_field> TO text(it_fields2-laenge).
        WRITE: AT offset text(it_fields2-laenge).
      WHEN '3'.
        WRITE: <fs_field> TO text(it_fields2-laenge).
        WRITE: AT offset text(it_fields2-laenge).

      WHEN '4'.
        WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields2-laenge).
        WRITE AT offset text(it_fields2-laenge).

      WHEN '5'.
        WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields2-laenge).
        WRITE AT offset text(it_fields2-laenge).

      WHEN '6'.
        WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields2-laenge).
        WRITE AT offset text(it_fields2-laenge).
      WHEN '7'.
        WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields2-laenge).
        WRITE AT offset text(it_fields2-laenge).
      WHEN '8'.
        WRITE: <fs_field> TO text(it_fields2-laenge).
        WRITE: AT offset text(it_fields2-laenge).
      WHEN '9'.
        WRITE: <fs_field> TO text(it_fields2-laenge).
        WRITE: AT offset text(it_fields2-laenge).
      WHEN OTHERS.
        WRITE: <fs_field> TO text(it_fields2-laenge).
        WRITE: AT offset text(it_fields2-laenge).
*        WRITE: / 'FEHLER !!!'.
    ENDCASE.

    IF it_sum-typ = '1'.
      READ TABLE it_fields2 WITH KEY position = it_sum-position2
           BINARY SEARCH.
      offset = it_fields2-offset + 1.
      WRITE: <fs_field2> TO text(it_fields2-laenge).
      WRITE: AT offset text(it_fields2-laenge).

    ENDIF.

    IF nl = 0.
      READ TABLE it_group_last INDEX it_group-gruppe.
      <fs_wa> = it_group_last-l_dummy.
      PERFORM gruppenstufenfelder USING u_gruppe.
      nl = 1.
    ENDIF.

  ENDLOOP.
  DELETE it_sum_erg WHERE gruppe = u_gruppe.


  FORMAT RESET.
  <fs_wa> = l_dummy.
ENDFORM.                    "summenausgabe


*---------------------------------------------------------------------*
*       FORM gruppenstufenfelder                                     
*
*---------------------------------------------------------------------*
*       ........                                                     
*
*---------------------------------------------------------------------*
*  -->  U_GRUPPE                                                     
*
*---------------------------------------------------------------------*
FORM gruppenstufenfelder USING u_gruppe.
  DATA: offset TYPE i.
  DATA: i3 TYPE i.
  DATA: i2 TYPE i.
  DATA: rc TYPE i.


  IF u_gruppe <> 0.
* Ausgabe der Gruppenstufenfelder
    LOOP AT it_group WHERE gruppe = u_gruppe.


      READ TABLE it_fields WITH KEY position = it_group-position.
      ASSIGN COMPONENT it_fields-position
      OF STRUCTURE <fs_wa> TO <fs_field>.
      offset = it_fields-offset + 1.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
      CASE it_fields-case.
        WHEN '1'.
          WRITE AT offset <fs_field>(1) AS CHECKBOX.
        WHEN '2'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          WRITE: <fs_field> TO text(it_fields-laenge).
          WRITE: AT offset text(it_fields-laenge).
        WHEN '3'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          IF <fs_field2> <> t001-bukrs.
            CLEAR t001.
            SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
          ENDIF.
          WRITE: AT offset <fs_field>.
        WHEN '4'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).
        WHEN '5'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
        WHEN '6'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: <fs_field> UNIT <fs_field2> TO
text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).
        WHEN '7'.
          ASSIGN COMPONENT it_fields-position2
               OF STRUCTURE <fs_wa> TO <fs_field2>.
          WRITE: AT offset <fs_field> UNIT <fs_field2>.
        WHEN '8'.
          WRITE: <fs_field> TO text(it_fields-laenge).
          WRITE AT offset text(it_fields-laenge).

        WHEN '9'.
          WRITE: AT offset <fs_field>.

        WHEN OTHERS.
          WRITE: AT offset <fs_field>.
*          WRITE: / 'FEHLER !!!'.
      ENDCASE.

    ENDLOOP.

  ENDIF.

ENDFORM.                    "gruppenstufenfelder








*&---------------------------------------------------------------------*
*& Form SEND_EMAIL_AS_ATTACHMENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM send_email_as_attachment USING titel empfaenger mailtyp express.
  DATA: l_t1(100).

* Filling in the text table

  CLEAR reclist.
  SPLIT empfaenger AT ' ' INTO TABLE reclist.

  LOOP AT reclist.
    l_t1 = reclist-receiver.
    CLEAR reclist.
    reclist-receiver = l_t1.

    IF mailtyp = ' '.
      reclist-rec_type = 'B'. "SAP Mail!!
    ELSE.
      reclist-rec_type = mailtyp.
    ENDIF.
    reclist-express = express.
    MODIFY reclist.
  ENDLOOP.



  CLEAR it_text.

* Creation of the document to be sent
  docdata-obj_descr = titel.
  docdata-obj_name = 'SAP1'.
  docdata-obj_langu = 'D'.
  APPEND docdata.

  DESCRIBE TABLE it_text LINES tab_lines.
* Creation of the packing list
  objpack-transf_bin = 'X'.
  objpack-head_start = 1.
  objpack-head_num = 1.
  objpack-body_start = 1.
  objpack-body_num = tab_lines.
  objpack-doc_type = 'XLS'.
  objpack-obj_name = 'SAP1.XLS'.
  objpack-doc_size = tab_lines * 255.
  APPEND objpack.

* Creation of the Header
  objhead-line = 'MAIL.txt'.
  APPEND objhead.

* Completing the recipient list

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              = docdata
      put_in_outbox              = 'X'
    IMPORTING
      sent_to_all                = sent
      new_object_id              = new_object_id
    TABLES
      packing_list               = objpack
      object_header              = objhead
      contents_bin               = it_text
      receivers                  = reclist
    EXCEPTIONS
      too_many_receivers         = 1
      document_not_sent          = 2
      document_type_not_exist    = 3
      operation_no_authorization = 4
      parameter_error            = 5
      x_error                    = 6
      enqueue_error              = 7
      OTHERS                     = 8.

  CASE sy-subrc.
    WHEN 0.
      WRITE: / 'Result of the send process:'.
      SKIP.
      LOOP AT reclist.
        WRITE: / 'The document was sent to:', reclist-receiver.
      ENDLOOP.
    WHEN 1.
      WRITE: /
   'No authorization for sending to the specified number of
Recipients'.
    WHEN 2.
      WRITE: / 'Document could not be sent to any recipient'.
    WHEN 4.
      WRITE: / 'No send authorization'.
    WHEN OTHERS.
      WRITE: / 'Error occured while sending'.
  ENDCASE.

ENDFORM.                               " SEND_EMAIL_AS_ATTACHMENT





*---------------------------------------------------------------------*
*       FORM XLS_MAIL                                                *
*---------------------------------------------------------------------*
* Die Tabelle wird mit den ausgewählten Feldern als XLS Datei
* aufbereitet und per E-Mail verschickt.

* Felder:
* titel: Beschreibungstext der E-Mail (Titel)
* Empfaenger: Empfängerliste durch Leerzeichen getrennt (SAP
USERNAME).
* Mailtyp: B = SAP Mail
* Express: X = Expressmail!
* header:  X = Kopfzeile mit ausgeben!
*---------------------------------------------------------------------*
FORM xls_mail TABLES it
              USING titel
                    empfaenger
                    mailtyp
                    express
                    header.

  FIELD-SYMBOLS:
                <fs_wa2>     TYPE ANY.


  DATA: file  LIKE  rlgrap-filename.

  DATA: BEGIN OF it_file OCCURS 0,
        zeile(1950),
        END OF it_file.


  CLEAR: docdata, it_text, reclist, objpack, objhead.
  REFRESH: docdata, it_text, reclist, objpack, objhead.



  DATA: dref TYPE REF TO data.
  CREATE DATA dref TYPE (gstr).
  ASSIGN dref->* TO <fs_wa2>.


  CLEAR it_file.
  REFRESH it_file.


* Kopf ausgeben.
  IF header = 'X'.
    PERFORM kopfausgabe USING ' ' 'X' CHANGING it_file-zeile.
    it_file-zeile = it_file-zeile+1.
    CONDENSE it_file-zeile NO-GAPS.
    TRANSLATE it_file-zeile USING g_transl.
    APPEND it_file.
  ENDIF.

* Tabelle ausgeben
  LOOP AT it ASSIGNING <fs_wa2>.
    PERFORM print_line2 USING <fs_wa2>
                        CHANGING it_file-zeile.
    it_file-zeile = it_file-zeile+1.
    CONDENSE it_file-zeile NO-GAPS.
    TRANSLATE it_file-zeile USING g_transl.
    APPEND it_file.
  ENDLOOP.



* Datei in das Binary Format übertragen.
  file = 'tmp_'.
  file+4 = sy-uname.
  CONCATENATE file sy-uzeit INTO file.
  TRANSLATE file USING ':_'.

  OPEN DATASET file FOR OUTPUT IN TEXT MODE.
  IF sy-subrc EQ 0.
    LOOP AT it_file.
      TRANSFER it_file TO file.
    ENDLOOP.
  ENDIF.
  CLOSE DATASET file.


  OPEN DATASET file FOR INPUT IN BINARY MODE.
  DO.
    CLEAR it_text.
    READ DATASET file INTO it_text.
    APPEND it_text.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
  ENDDO.
  CLOSE DATASET file.

  PERFORM send_email_as_attachment
                USING titel
                    empfaenger
                    mailtyp
                    express.


  DELETE DATASET file.
ENDFORM.                    "xls_mail




*---------------------------------------------------------------------*
* FORM LOAD_TABLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SHOW *
*---------------------------------------------------------------------*
FORM load_table USING show.
  tabname = show.
  tab_len = STRLEN( show ).
  IF tab_len = 2.
* Segment
    CASE tabname.
* System
      WHEN 'SY'.
        tabname = 'SYST'.
* Dynpro
      WHEN 'DY'.
        SELECT SINGLE * FROM trdir
        WHERE name = program.
        IF sy-subrc NE 0.
          EXIT.
        ENDIF.
        IF trdir-subc CN '1MF'.
          include = program.
          IF trdir-subc = 'I' AND
          include+5(1) CO 'IOFDU'.
            SHIFT include RIGHT BY 3 PLACES.
            include(3) = 'SAP'.
            program = include.
            SELECT SINGLE * FROM trdir
            WHERE name = program.
            IF sy-subrc NE 0.
              EXIT.
            ENDIF.
          ENDIF.
        ENDIF.
        tabname = '$'.
        tabname+1(2) = trdir-dbna.
        tabname+3(1) = trdir-appl.
* WHEN OTHERS.
* SELECT SINGLE * FROM T032
* WHERE SEGMENT = TABNAME.
* IF SY-SUBRC NE 0.
* PERFORM EXIT.
* ENDIF.
* TABNAME = T032-QMACRO.
    ENDCASE.
  ENDIF.
* Get NAMETAB
  REFRESH nametab.
  IF tabname NE 'SCREEN'.
    CALL FUNCTION 'NAMETAB_GET'
      EXPORTING
        tabname             = tabname
        langu               = sy-langu
      TABLES
        nametab             = nametab
      EXCEPTIONS
        internal_error      = 1
        table_has_no_fields = 2
        table_not_activ     = 3.
  ELSE.
    CLEAR nametab.
    CLEAR nametab.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldname = 'NAME'.
    nametab-intlen = 30.
    nametab-fieldtext = 'Feldname'(101).
    APPEND nametab.
    nametab-fieldname = 'GROUP1'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe1'(102).
    APPEND nametab.
    nametab-fieldname = 'GROUP2'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe2'(103).
    APPEND nametab.
    nametab-fieldname = 'GROUP3'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe3'(104).
    APPEND nametab.
    nametab-fieldname = 'GROUP4'.
    nametab-intlen = 3.
    nametab-fieldtext = 'Bewertung der Modif.gruppe4'(105).
    APPEND nametab.
    nametab-fieldname = 'REQUIRED'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Musseingabe'(106).
    APPEND nametab.
    nametab-fieldname = 'INPUT'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld eingabebereit'(107).
    APPEND nametab.
    nametab-fieldname = 'OUTPUT'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld wird angezeigt'(108).
    APPEND nametab.
    nametab-fieldname = 'INTENSIFIED'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld hellleuchtend'(109).
    APPEND nametab.
    nametab-fieldname = 'INVISIBLE'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Feld unsichtbar'(110).
    APPEND nametab.
    nametab-fieldname = 'LENGTH'.
    nametab-datatype = 'HEX'.
    nametab-inttype = 'X'.
    nametab-intlen = 1.
    nametab-fieldtext = 'Laenge des Feldes'(111).
    APPEND nametab.
    nametab-fieldname = 'ACTIVE'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld aktiv'(112).
    APPEND nametab.
* NEW FIELDS IN SCREEN FOR 3.0
    nametab-fieldname = 'DISPLAY_3D'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld 3-dimensional'(113).
    APPEND nametab.
    nametab-fieldname = 'VALUE_HELP'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Feld mit Wertehilfe'(114).
    APPEND nametab.
    nametab-fieldname = 'REQUEST'.
    nametab-intlen = 1.
    nametab-datatype = 'CHAR'.
    nametab-inttype = 'C'.
    nametab-fieldtext = 'Eingabe vorhanden (nur PAI)'(115).
    APPEND nametab.
  ENDIF.

  subrc = sy-subrc.
  IF sy-subrc > 3.
    EXIT.
  ENDIF.
ENDFORM. "LOAD_TABLE



*&--------------------------------------------------------------------*
*&      Form  write_long
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->ZEILE      text
*      -->CO         text
*---------------------------------------------------------------------*
FORM write_long USING zeile co TYPE i.
  DATA: l_dummy_string(1950).
  DATA: laenge TYPE i.

  l_dummy_string = zeile.
  laenge = STRLEN( zeile ).

  IF co = 1.
    IF laenge > 250.
      WRITE: / l_dummy_string(250) COLOR 1 NO-GAP.
      laenge = laenge - 250.
      l_dummy_string = l_dummy_string+250.
      IF laenge > 250.
        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250) COLOR 1 NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ELSE.
        WRITE:  l_dummy_string(laenge) COLOR 1 NO-GAP.
      ENDIF.
    ELSE.
      WRITE: / l_dummy_string(laenge) COLOR 1.
    ENDIF.
  ELSEIF co = 0.

    IF laenge > 250.
      WRITE: / l_dummy_string(250)  NO-GAP.
      laenge = laenge - 250.
      l_dummy_string = l_dummy_string+250.
      IF laenge > 250.
        WRITE:  l_dummy_string(250)  NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250)  NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250)  NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ENDIF.
      IF laenge > 250.
        WRITE:  l_dummy_string(250)  NO-GAP.
        laenge = laenge - 250.
        l_dummy_string = l_dummy_string+250.
      ELSE.
        WRITE:  l_dummy_string(laenge)  NO-GAP.
      ENDIF.
    ELSE.
      WRITE: / l_dummy_string(laenge) .
    ENDIF.

  ENDIF.

ENDFORM.                    "write_long





*---------------------------------------------------------------------*
*       FORM XLS_start                                               
*
*---------------------------------------------------------------------*
* Wenn START = 'X' erfolgt nicht nur ein Download, sondern
* die Datei wird auch noch mit excel geöffnet.

* Wenn header = 'X', dann enthält die Downloaddatei auch die
* Kopfzeile

* Wenn append = 'X', dann werden die Daten an die Datei angehangen.
*---------------------------------------------------------------------*
FORM xls_start TABLES it
              USING datei
                    start
                    header
                    append
                    strukturname.



  FIELD-SYMBOLS:
                <fs_wa2>     TYPE ANY.

  DATA: dref88 TYPE REF TO data.
  CREATE DATA dref88 TYPE (gstr).
  ASSIGN dref88->* TO <fs_wa2>.


  DATA: file  TYPE string.

  DATA: BEGIN OF it_file OCCURS 0,
        zeile(3200),
        END OF it_file.


  file = datei.
  CLEAR it_file.
  REFRESH it_file.


* Kopf ausgeben.
  IF header = 'X'.
    CLEAR it_file. APPEND it_file.
    CLEAR it_file. APPEND it_file.
    CLEAR it_file. APPEND it_file.
    CLEAR it_file. APPEND it_file.
    it_file = 'Strukturname: '.
    CONCATENATE it_file strukturname INTO it_file SEPARATED BY ' '.
    APPEND it_file.
    CLEAR it_file. APPEND it_file.


    PERFORM kopfausgabe USING ' ' 'X' CHANGING it_file-zeile.
    it_file-zeile = it_file-zeile+1.
    CONDENSE it_file-zeile NO-GAPS.
    TRANSLATE it_file-zeile USING g_transl.
    APPEND it_file.

    IF NOT it_file-zeile IS INITIAL.
      TRANSLATE it_file-zeile TO UPPER CASE.
      TRANSLATE it_file-zeile USING
  'A_B_C_D_E_F_G_H_I_J_K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_'.
      TRANSLATE it_file-zeile USING
   '1_2_3_4_5_6_7_8_9_0_'.
      APPEND it_file.
    ENDIF.

  ENDIF.

* Tabelle ausgeben
  LOOP AT it ASSIGNING <fs_wa2>.
    PERFORM print_line2 USING <fs_wa2>
                        CHANGING it_file-zeile.
    it_file-zeile = it_file-zeile+1.
    CONDENSE it_file-zeile NO-GAPS.
    TRANSLATE it_file-zeile USING g_transl.
    APPEND it_file.
  ENDLOOP.


  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
*     BIN_FILESIZE                    =
      filename                        = file
*     FILETYPE                        = 'ASC'
      append                          = append
*     WRITE_FIELD_SEPARATOR           = ' '
*     HEADER                          = '00'
*     TRUNC_TRAILING_BLANKS           = ' '
*     WRITE_LF                        = 'X'
*     COL_SELECT                      = ' '
*     COL_SELECT_MASK                 = ' '
*     DAT_MODE                        = ' '
*     CONFIRM_OVERWRITE               = ' '
*     NO_AUTH_CHECK                   = ' '
*     CODEPAGE                        = ' '
*     IGNORE_CERR                     = ABAP_TRUE
*     REPLACEMENT                     = '#'
*     WRITE_BOM                       = ' '
*     TRUNC_TRAILING_BLANKS_EOL       = 'X'
*   IMPORTING
*     FILELENGTH                      =
    TABLES
      data_tab                        = it_file
*     FIELDNAMES                      =
   EXCEPTIONS
     file_write_error                = 1
     no_batch                        = 2
     gui_refuse_filetransfer         = 3
     invalid_type                    = 4
     no_authority                    = 5
     unknown_error                   = 6
     header_not_allowed              = 7
     separator_not_allowed           = 8
     filesize_not_allowed            = 9
     header_too_long                 = 10
     dp_error_create                 = 11
     dp_error_send                   = 12
     dp_error_write                  = 13
     unknown_dp_error                = 14
     access_denied                   = 15
     dp_out_of_memory                = 16
     disk_full                       = 17
     dp_timeout                      = 18
     file_not_found                  = 19
     dataprovider_exception          = 20
     control_flush_error             = 21
     OTHERS                          = 22
            .
  IF sy-subrc = 0.
    IF start = 'X'.

      CALL FUNCTION 'WS_EXECUTE'
         EXPORTING
              program       = 'EXCEL.EXE'
              commandline   = datei
              inform        = ''
         EXCEPTIONS
              prog_not_found.


    ENDIF.
  ENDIF.


ENDFORM.                    "xls_start

home help back first fref pref prev next nref lref last post