[54112] in SAPr3-news

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

=?ISO-8859-1?Q?ABAP_Toolprogramme_/_Anzeigen,_kopiere?=

daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Apr 12 03:03:20 2005

To: sapr3-news@mit.edu
Date: 12 Apr 2005 00:00:29 -0700
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0504112300.2aa42e14@posting.google.com>

Hallo Leute,

anbei mal wieder ein nettes kleines Tool für die SAP Script Entwicklung.


Viel Erfolg und alles Gute


Volker Korrmann





*&---------------------------------------------------------------------*
*& Report  ZBRTOO_SCRIPT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

*
*Hallo Leute,
*
*anbei ein kleiner Report um SAP Script Formulare zu kopieren,
*zu löschen und vor allen Dingen mal richtig anzuzeigen.
*
*Bitte dafür den Report zbrtoo_SCRIPT und den Report z_TAB
*auf dem Rechner anlegen. Beim Report z_tab muß zudem
*in den Eigenschaften die UNICODE Prüfung ausgeschaltet werden.
*(Report editieren, Menü Springen / Eigenschaften)
*
*Gruß Volker Korrmann






REPORT  ZBRTOO_SCRIPT line-size 255.

field-symbols: <f>.
DATA: feld(200).

DATA:
  FORM_LINES type standard table of  TLINE with header line,
  PAGES type standard table of  ITCTG with header line,
  PAGE_WINDOWS type standard table of  ITCTH with header line,
  PARAGRAPHS type standard table of  ITCDP with header line,
  STRINGS type standard table of  ITCDS with header line,
  TABS type standard table of  ITCDQ with header line,
   WINDOWS type standard table of  ITCTW with header line.

DATA: FORM_HEADER LIKE  ITCTA.

Parameters: FORM  LIKE ITCTA-TDFORM,
            LANGU LIKE SY-LANGU DEFAULT sy-langu.

Parameters: p_read as checkbox default 'X'.
parameters: p_copy as checkbox.

Parameters: ZU_FORM  LIKE ITCTA-TDFORM,
            ZU_LANGU LIKE SY-LANGU DEFAULT sy-langu.

Parameters: p_del as checkbox.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR form.
  submit RSTXFCAT via selection-screen and return.


start-of-selection.

  refresh:
     FORM_LINES,
     PAGES,
     PAGE_WINDOWS,
     PARAGRAPHS,
     STRINGS,
     TABS,
     WINDOWS.


  if p_copy = 'X' and ( langu <> zu_langu or form <> zu_form ).

    CALL FUNCTION 'READ_FORM'
      EXPORTING
       CLIENT                 = SY-MANDT
       FORM                   = form
       LANGUAGE               = LANGU
       OLANGUAGE              = ' '
       OSTATUS                = ' '
       STATUS                 = ' '
       THROUGHCLIENT          = ' '
       READ_ONLY_HEADER       = ' '
       THROUGHLANGUAGE        = ' '
  IMPORTING
    FORM_HEADER            = form_header
*   FOUND                  =
*   HEADER                 =
*   OLANGUAGE              =
     TABLES
       FORM_LINES             = form_lines
       PAGES                  = pages
       PAGE_WINDOWS           = page_windows
       PARAGRAPHS             = paragraphs
       STRINGS                = strings
       TABS                   = tabs
       WINDOWS                = windows
              .

    form_header-TDFORM  = zu_form.
    form_header-TDspras = zu_langu.


    CALL FUNCTION 'SAVE_FORM'
      EXPORTING
        FORM_HEADER            = form_header
* IMPORTING
*   SAVE_FORM_HEADER       =
      TABLES
        FORM_LINES             = form_lines
        PAGES                  = pages
        PAGE_WINDOWS           = page_windows
        PARAGRAPHS             = paragraphs
        STRINGS                = strings
        TABS                   = tabs
        WINDOWS                = windows
              .

    CALL FUNCTION 'ACTIVATE_FORM'
      EXPORTING
        FORM            = zu_form
        OLANGUAGE       = zu_langu
*   STATUS          = ' '
* IMPORTING
*   RESULT          =
              .

    write: / 'Formular kopiert'.


  endif.


  if p_Read = 'X'.

    CALL FUNCTION 'READ_FORM'
      EXPORTING
       CLIENT                 = SY-MANDT
       FORM                   = form
       LANGUAGE               = LANGU
       OLANGUAGE              = ' '
       OSTATUS                = ' '
       STATUS                 = ' '
       THROUGHCLIENT          = ' '
       READ_ONLY_HEADER       = ' '
       THROUGHLANGUAGE        = ' '
* IMPORTING
*   FORM_HEADER            =
*   FOUND                  =
*   HEADER                 =
*   OLANGUAGE              =
     TABLES
       FORM_LINES             = form_lines
       PAGES                  = pages
       PAGE_WINDOWS           = page_windows
       PARAGRAPHS             = paragraphs
       STRINGS                = strings
       TABS                   = tabs
       WINDOWS                = windows
              .


    perform Ausgabe tables form_lines  using 'TLINE'.
    perform Ausgabe tables pages  using 'itctg'.
    perform Ausgabe tables page_windows  using 'itcth'.
    perform Ausgabe tables paragraphs  using 'itcdp'.
    perform Ausgabe tables strings  using 'itcds'.
    perform Ausgabe tables tabs  using 'itcdq'.
    perform Ausgabe tables windows  using 'itctw'.

  endif.



  if p_del = 'X' and zu_form = '' and zu_langu = '' and p_read = '' and p_copy = ''.
    CALL FUNCTION 'DELETE_FORM'
      EXPORTING
*   CLIENT         = SY-MANDT
        FORM           = form
        LANGUAGE       = LANGU
* IMPORTING
*   FOUND          =
              .
    write: / 'Formular gelöscht:', form, langu.

  endif.








*&--------------------------------------------------------------------*
*&      Form  Ausgabe
*&--------------------------------------------------------------------*
form Ausgabe tables tab
             using name .

  DATA: name2(60).
  name2 = name.
  translate name2 to upper case.
  if not tab[] is initial.
    write: / name.
    skip.
    PERFORM  print_wide_table(z_tab) TABLES tab
                     USING        220
                                  name2
                            ' '
                            ' '         " Hides
                            ' '              " Referenzen
                            ' '              " Checkboxen
                            ' '              " SORT
                            ' '              " SUM
                            ' '           .  " group


    SKIP.
  endif.
endform.                    "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