[52930] in SAPr3-news
ABAP Toolprogramme / Customizingabgleich gegen anderen Mandanten
daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Jan 11 10:53:06 2005
To: sapr3-news@mit.edu
Date: 11 Jan 2005 07:52:46 -0800
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0501110752.3a14eba0@posting.google.com>
*&---------------------------------------------------------------------*
*& Report ZBRTOO00ABGL *
*& *
*&---------------------------------------------------------------------*
*Hallo Leute!
*
*Anbei der folgende kleine Report zum Abgleich des Customizings gegen
*einen anderen Mandanten.
*Hintergrund der Aktion war, daß es beim Releasewechsel (CMS 3.0)
*bei uns große Probleme mit den Viewclusterpflegen gab.
*Das von der SAP ausgelieferte "Customzing" wurde vom Servicepack
*nur im Mandanten 000 eingespielt. Obwohl wir die Einträge des
*Servicepacks auch in einen Kopietransportauftrag kopiert und auf
*Mandanten 000 nochmals freigegeben hatten, konnten wir das
*wichtige neue Customizing nicht in unseren Mandanten
*transportieren. Die Viewclusterpflegen waren so intelligent das
*abzulehnen. Empfehlung der SAP war hier, den Mandanten aus dem 000
*ganz neu aufzubauen. Aber ein wenig was gemacht hatten wir ja
*auch schon!
*Das ebenfalls von der SAP empfohlene Abgleichtool
*(Transaktion SCU0) hat leider gerade bei den Viewclustern ein
*paar Macken. Unter anderem werden da Differenzen angezeigt, die
*gar nicht existieren.
*
*Daher dieser Report:
*
*Bedienungsanleitung
*Man selektiere alle relevanten Tabellen (z.B. (*TCMS*))
*sowie alle relevanten Views (*TCMS*).
*Bei den Views werden die beteiligten JOIN Tabellen ermittelt,
*so daß auch diverse TB* Tabellen mit beim Abgleich berücksichtigt
*werden.
*Bei der Auslieferungsklasse könnte man auch zusätzlich noch
*auf Customizingtabellen (C, G, E, S, W) einschränken, was
*bei einem Vergleich mit dem Mandanten 000 aber nicht unbedingt
*notwendig ist.
*
*Es ist der Vergleichsmandant auswählbar (000).
*Über die Optionen kann die Detailanzeige ausgewählt werden.
*So können die Einträge angezeigt werden, die nur im
*Mandanten 000, aber nicht im aktuellen Mandanten enthalten
*sind.
*Weiterhin lassen sich die Einträge mit Differenzen
*ausgeben. Es werden beide Datensätze komplett untereinander
*dargestellt. Ist die Tabelle zu breit, findet sich unter der
*Tabelle eine weitere Tabelle mit den restlichen Feldern.
*
*Weiterhin gibt es eine Übersichtsanzeige. Nur in
*dieser Übersichtsanzeige stehen die Checkboxen zur
*Verfügung. Wenn man eine oder mehrere Tabellen per Checkbox
*auswählt, und den kleinen Transportbutton betätigt
*(Funktionscode: TRANS), wird ein Customizingtransport
*im aktuellen Mandanten angelegt. Dieser
*Customizingtransport enthält nur die "NEUEN"
*Einträge aus dem Mandanten 000.
*Diesen Transport kann man dann im aktuellen Mandanten
*freigeben. Dabei wird ein "Löschtransport" erstellt.
*Diesen Auftrag kann man sich jetzt beiseite legen.
*Mit Hilfe dieses Auftrages kann man später die
*eingespielten Einträge auch wieder löschen!!!!
*
*Nun muß man sich im Mandanten 000 anmelden und
*in der Transaktion SE10 sich einen neuen Auftrag
*anlegen und über die rechte Maustaste die
*Objekte des anderen Auftrags übernehmen!!!
*Freigeben, einspielen, fertig!!!
*
*Viele Grüße, Viel Erfolg, und meldet Euch mal,
*ob Euch das Tool geholfen hat.
*
*
*Volker_korrmann@web.de
*
*
*
*
*
*Einbauanleitung
*
*Leider ist der Report nicht so ganz einfach zu installieren.
*Zum einen müssen zwei Reports angelegt werden (ZBRTOO00ABGL
*und Z_TAB). Der Z_TAB muß wirklich unter diesem Namen angelegt
*werden, weil er sonst vom Abgleichprogramm nicht aufgerufen
*werden kann. Den Z_TAB Report habe ich einfach hinten angehangen!!!
*
*WICHTIG:
*Bei beiden Reports muß in den Eigenschaften (im Report: Menü
*Springen / Eigenschaften) die UNICODEPRÜFUNG ausgeschaltet
*werden.
*
*
*Weiterhin sind die folgenden Textelemente anzulegen:
*ANDERS Abweichungen anzeigen
*CONTFLAG Auslieferungsklasse
*NEU Nur in 000 enthaltene Einträge
*P_MANDT Vergeichsmandant
*S_TAB Tabelle
*S_VIEW Viewname
*UEBERS Übersichtsanzeige
*
*Und es muß ein PF-Status MAIN angelegt werden, mit
*einem Transportbutton (TRANS) und die üblichen
*Normen sind einzumischen:
*Weiterhin für die Systemfunktionsleiste die folgenden
*Standardcodes begonnen bei der BACK Taste:
* BACK %EX RW %PRI %SC
* %SC+ P P- P+ P++
*
*
*Dann sollte alles laufen!
*
REPORT zbrtoo00abgl LINE-SIZE 255 NO STANDARD PAGE HEADING.
* (C) 2005 Volker Korrmann
TABLES: dd02l, trdir, tadir, dd02t, dd26s.
FIELD-SYMBOLS:
<fs_wa> TYPE ANY,
<fs_field> TYPE ANY,
<fs_field2> TYPE ANY.
DATA: glt1(60000).
DATA: glt2(60000).
DATA: BEGIN OF it1 OCCURS 0,
line(1000),
END OF it1.
DATA: BEGIN OF it2 OCCURS 0,
line(1000),
END OF it2.
DATA: it3 LIKE it2.
DATA: BEGIN OF it_tab OCCURS 0,
tabname LIKE dd02l-tabname,
END OF it_tab.
DATA BEGIN OF nametab OCCURS 0.
INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab.
DATA: g_order LIKE e070-trkorr.
DATA: it_e071 TYPE STANDARD TABLE OF ko200 WITH HEADER LINE.
DATA: it_e071k TYPE STANDARD TABLE OF e071k WITH HEADER LINE.
DATA: g_tab(200).
DATA:
subrc LIKE sy-subrc,
tab_len LIKE sy-fdpos,
include LIKE sy-repid,
program LIKE sy-repid,
i1 TYPE i,
i2 TYPE i,
i3 TYPE i,
mark,
tabname LIKE dntab-tabname.
SELECT-OPTIONS: s_tab FOR dd02l-tabname DEFAULT 'TCMS'.
SELECT-OPTIONS: s_view FOR dd26s-viewname.
SELECT-OPTIONS: contflag FOR dd02l-contflag.
PARAMETERS: p_mandt LIKE sy-mandt DEFAULT '000'.
PARAMETERS: neu AS CHECKBOX DEFAULT 'X'.
PARAMETERS: anders AS CHECKBOX DEFAULT 'X'.
PARAMETERS: uebers AS CHECKBOX DEFAULT 'X'.
*----------------------------------------------------------------------*
* Benutzerkommandos *
*----------------------------------------------------------------------*
AT USER-COMMAND.
IF sy-ucomm = 'TRANS'.
PERFORM trans.
ENDIF.
START-OF-SELECTION.
SET PF-STATUS 'MAIN'.
SELECT tabname INTO TABLE it_tab FROM dd02l
WHERE tabname IN s_tab AND
contflag IN contflag AND
tabclass = 'TRANSP'.
IF NOT s_view[] IS INITIAL.
SELECT tabname APPENDING TABLE it_tab FROM dd26s
WHERE viewname IN s_view.
SORT it_tab.
DELETE ADJACENT DUPLICATES FROM it_tab COMPARING tabname.
LOOP AT it_tab.
SELECT SINGLE * FROM dd02l WHERE tabname = it_tab-tabname AND
tabclass = 'TRANSP' AND
contflag IN contflag.
IF sy-subrc <> 0. DELETE it_tab. ENDIF.
ENDLOOP.
ENDIF.
LOOP AT it_tab.
PERFORM load_table USING it_tab-tabname.
LOOP AT nametab WHERE fieldname = 'MANDT'.
EXIT.
ENDLOOP.
IF sy-subrc <> 0.
DELETE it_tab.
CONTINUE.
ENDIF.
READ TABLE nametab WITH KEY datatype = 'STRG'.
IF sy-subrc = 0.
DELETE it_tab.
CONTINUE.
ENDIF.
PERFORM vergleich USING it_tab-tabname.
PERFORM ausgabe USING it_tab-tabname.
ENDLOOP.
*---------------------------------------------------------------------*
* 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 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.
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.
ENDFORM. "LOAD_TABLE
*&--------------------------------------------------------------------*
*& Form Vergleich
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->TAB text
*---------------------------------------------------------------------*
FORM vergleich USING tab.
DATA: i TYPE i.
DATA: text(9000) TYPE c.
DATA: t2(550).
DATA: t3(550).
DATA: dref TYPE REF TO data.
CREATE DATA dref TYPE (tab).
ASSIGN dref->* TO <fs_wa>.
REFRESH: it1, it2.
SELECT * FROM (tab) CLIENT SPECIFIED
INTO glt1
WHERE mandt = p_mandt.
it1 = glt1. APPEND it1.
clear glt1.
ENDSELECT.
IF sy-dbcnt > 0.
* WRITE: / 'Kontrolle der Tabelle:', tab.
LOOP AT it1.
<fs_wa> = it1.
CLEAR text.
LOOP AT nametab.
IF nametab-position <> 1 AND
nametab-keyflag = 'X'.
IF NOT text IS INITIAL.
CONCATENATE text 'AND' INTO text SEPARATED BY ' '.
ENDIF.
t2 = nametab-fieldname.
CONCATENATE t2 '= ''' INTO t2 SEPARATED BY ' '.
ASSIGN COMPONENT nametab-position
OF STRUCTURE <fs_wa> TO <fs_field2>.
t3 = <fs_field2>.
IF t3 CS ''''. CLEAR text. EXIT. ENDIF.
SHIFT t3 LEFT DELETING LEADING space.
IF <fs_field2> IS INITIAL.
CONCATENATE t2 '''' INTO t2.
ELSE.
CONCATENATE t2 t3 '''' INTO t2.
ENDIF.
CONCATENATE text t2 INTO text SEPARATED BY ' '.
ELSEIF nametab-position > 3.
EXIT.
ENDIF.
ENDLOOP.
IF NOT text IS INITIAL.
CLEAR: it2, glt2.
SELECT SINGLE * FROM (tab) INTO glt2 WHERE (text).
it2 = glt2.
IF sy-subrc <> 0.
* WRITE: / 'Nicht gefunden: ', text(200).
ELSE.
it3 = it2.
it2(3) = it1(3).
IF it1 <> it2.
it2 = it1. APPEND it2.
it2 = it3. APPEND it2.
DELETE it1.
* WRITE: / 'Daten ungleich: ', text(200).
ELSE.
DELETE it1.
ENDIF.
ENDIF.
ELSE.
DELETE it1.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. "Vergleich
*&--------------------------------------------------------------------*
*& Form ausgabe
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM ausgabe USING tab.
CLEAR: i1, i2.
DESCRIBE TABLE it2 LINES i2. i2 = i2 / 2.
DESCRIBE TABLE it1 LINES i1.
IF uebers = 'X' AND ( i1 > 0 OR i2 > 0 ).
CLEAR dd02t.
SELECT SINGLE * FROM dd02t WHERE tabname = tab
AND ddlanguage = sy-langu.
SELECT COUNT( * ) FROM (tab) INTO i3.
WRITE: / mark AS CHECKBOX, tab, 'NEU:', i1, 'ABW:',i2, 'ANZ:', i3,
dd02t-ddtext.
g_tab = tab.
HIDE g_tab.
ENDIF.
IF i1 > 0 AND neu = 'X'.
CLEAR dd02t.
SELECT SINGLE * FROM dd02t WHERE tabname = tab
AND ddlanguage = sy-langu.
WRITE: / 'Einträge, die nur im Vergleichsmandanten vorhanden sind.',
'Tabelle : ' , tab, dd02t-ddtext.
SKIP.
PERFORM print_wide_table(z_tab) TABLES it1[]
USING 240
tab
' '
' ' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
ENDIF.
IF i2 > 0 AND anders = 'X'.
CLEAR dd02t.
SELECT SINGLE * FROM dd02t WHERE tabname = tab
AND ddlanguage = sy-langu.
WRITE: / 'Einträge, die im Vergleichsmandanten anders definiert',
'sind sind. Tabelle: ' , tab, dd02t-ddtext.
SKIP.
PERFORM print_wide_table(z_tab) TABLES it2[]
USING 240
tab
' '
' ' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
ENDIF.
ENDFORM. "ausgabe
*&--------------------------------------------------------------------*
*& Form tr_send
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM tr_send.
DATA: we_task LIKE e070-trkorr.
CALL FUNCTION 'TR_EDIT_CHECK_OBJECTS_KEYS'
EXPORTING
* WI_ORDER = ' '
wi_with_dialog = 'R'
* WI_OBJ_CATEGOGY_MIX = 'X'
* WI_SEND_MESSAGE = 'X'
* IV_NO_SHOW_OPTION = ' '
* IV_NO_STANDARD_EDITOR = ' '
* IV_EXTERNALPS = ' '
* IV_EXTERNALID = ' '
* IV_NO_PS = ' '
* IV_READ_ACTIVITY_FROM_MEMORY = 'X'
* IV_APPEND_TO_ORDER = ' '
* IMPORTING
* WE_ORDER =
* WE_TASK =
* WE_OBJECTS_APPENDABLE =
* EV_ERRNUM =
* EV_OBJECT_UNLOCKED =
TABLES
wt_e071 = it_e071
wt_e071k = it_e071k
* WT_TADIR =
EXCEPTIONS
cancel_edit_append_error_keys = 1
cancel_edit_append_error_objct = 2
cancel_edit_append_error_order = 3
cancel_edit_but_se01 = 4
cancel_edit_no_header_object = 5
cancel_edit_no_order_selected = 6
cancel_edit_repaired_object = 7
cancel_edit_system_error = 8
cancel_edit_tadir_missing = 9
cancel_edit_tadir_update_error = 10
cancel_edit_unknown_devclass = 11
cancel_edit_unknown_objecttype = 12
show_only_closed_system = 13
show_only_consolidation_level = 14
show_only_ddic_in_customer_sys = 15
show_only_delivery_system = 16
show_only_different_ordertypes = 17
show_only_different_tasktypes = 18
show_only_enqueue_failed = 19
show_only_generated_object = 20
show_only_ill_lock = 21
show_only_lock_enqueue_failed = 22
show_only_mixed_orders = 23
show_only_mix_local_transp_obj = 24
show_only_no_shared_repair = 25
show_only_object_locked = 26
show_only_repaired_object = 27
show_only_show_client = 28
show_only_tadir_missing = 29
show_only_unknown_devclass = 30
cancel_edit_no_check_call = 31
cancel_edit_category_mixture = 32
show_only_closed_client = 33
show_only_closed_ale_object = 34
show_only_unallowed_superuser = 35
cancel_edit_custom_obj_at_sap = 36
cancel_edit_access_denied = 37
show_only_no_repair_system = 38
show_only_no_license = 39
show_only_central_basis = 40
show_only_user_after_error = 41
cancel_edit_user_after_error = 42
show_only_object_not_patchable = 43
OTHERS = 44
.
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 'TR_EDIT_CHECK_OBJECTS_KEYS'
EXPORTING
* WI_ORDER = ' '
wi_with_dialog = 'X'
* WI_OBJ_CATEGOGY_MIX = 'X'
* WI_SEND_MESSAGE = 'X'
* IV_NO_SHOW_OPTION = ' '
* IV_NO_STANDARD_EDITOR = ' '
* IV_EXTERNALPS = ' '
* IV_EXTERNALID = ' '
* IV_NO_PS = ' '
* IV_READ_ACTIVITY_FROM_MEMORY = 'X'
* IV_APPEND_TO_ORDER = ' '
IMPORTING
we_order = g_order
we_task = we_task
* WE_OBJECTS_APPENDABLE =
* EV_ERRNUM =
* EV_OBJECT_UNLOCKED =
TABLES
wt_e071 = it_e071
wt_e071k = it_e071k
* WT_TADIR =
EXCEPTIONS
cancel_edit_append_error_keys = 1
cancel_edit_append_error_objct = 2
cancel_edit_append_error_order = 3
cancel_edit_but_se01 = 4
cancel_edit_no_header_object = 5
cancel_edit_no_order_selected = 6
cancel_edit_repaired_object = 7
cancel_edit_system_error = 8
cancel_edit_tadir_missing = 9
cancel_edit_tadir_update_error = 10
cancel_edit_unknown_devclass = 11
cancel_edit_unknown_objecttype = 12
show_only_closed_system = 13
show_only_consolidation_level = 14
show_only_ddic_in_customer_sys = 15
show_only_delivery_system = 16
show_only_different_ordertypes = 17
show_only_different_tasktypes = 18
show_only_enqueue_failed = 19
show_only_generated_object = 20
show_only_ill_lock = 21
show_only_lock_enqueue_failed = 22
show_only_mixed_orders = 23
show_only_mix_local_transp_obj = 24
show_only_no_shared_repair = 25
show_only_object_locked = 26
show_only_repaired_object = 27
show_only_show_client = 28
show_only_tadir_missing = 29
show_only_unknown_devclass = 30
cancel_edit_no_check_call = 31
cancel_edit_category_mixture = 32
show_only_closed_client = 33
show_only_closed_ale_object = 34
show_only_unallowed_superuser = 35
cancel_edit_custom_obj_at_sap = 36
cancel_edit_access_denied = 37
show_only_no_repair_system = 38
show_only_no_license = 39
show_only_central_basis = 40
show_only_user_after_error = 41
cancel_edit_user_after_error = 42
show_only_object_not_patchable = 43
OTHERS = 44
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
REFRESH: it_e071, it_e071k.
COMMIT WORK.
CALL FUNCTION 'TR_SORT_AND_COMPRESS_COMM'
EXPORTING
iv_trkorr = we_task
* IV_DIALOG = ' '
* IMPORTING
* ES_REQUEST =
EXCEPTIONS
trkorr_not_found = 1
order_released = 2
error_while_modifying_obj_list = 3
tr_enqueue_failed = 4
no_authorization = 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.
ENDFORM. "TRANSPORT_ERSTELLEN
*&--------------------------------------------------------------------*
*& Form trans
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM trans.
REFRESH: it_e071, it_e071k.
CLEAR: it_e071, it_e071k.
WRITE: / 'Die nachfolgenden Tabellen wurden an den Transportauftrag',
'angehangen:'.
SKIP.
DO.
clear mark.
" aktuelle Zeile mit Checkbox auslesen
READ LINE sy-index FIELD VALUE mark.
IF sy-subrc <> 0. " Zeile existiert nicht ?
EXIT.
ENDIF.
IF mark = 'X'.
PERFORM trans2 USING g_tab.
ENDIF.
ENDDO.
PERFORM tr_send .
ENDFORM. " GET_SELECTION
*&--------------------------------------------------------------------*
*& Form trans2
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->TAB text
*---------------------------------------------------------------------*
FORM trans2 USING tab.
DATA: l1 TYPE i.
WRITE: / tab.
PERFORM load_table USING tab.
PERFORM vergleich USING tab.
DESCRIBE TABLE it1 LINES i1.
IF i1 > 0.
it_e071-pgmid = 'R3TR'.
it_e071-object = 'TABU'.
it_e071-obj_name = tab.
it_e071-objfunc = 'K'.
it_e071-as4pos = it_e071-as4pos + 1.
APPEND it_e071.
CLEAR l1.
LOOP AT nametab WHERE keyflag = 'X'.
l1 = l1 + nametab-ddlen.
ENDLOOP.
it_e071k-pgmid = 'R3TR'.
it_e071k-object = 'TABU'.
it_e071k-objname = tab.
it_e071k-mastertype = 'TABU'.
it_e071k-mastername = tab.
it_e071k-sortflag = '2'.
LOOP AT it1.
it_e071k-tabkey = it1(l1).
it_e071k-tabkey(3) = sy-mandt.
it_e071k-as4pos = it_e071-as4pos .
APPEND it_e071k.
ENDLOOP.
ENDIF.
ENDFORM. "trans2
---------------------------------------------------------------------------------
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(1250).
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(1250) 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(1250).
DATA: zeile(1250).
DATA: laenge TYPE i.
DATA: g_initline(1250).
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(1250).
DATA: l_tmp_string(1250).
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(1250) 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(1250) TYPE c.
DATA: t1(50), t2(50), t3(1250).
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(1250) TYPE c.
DATA: l_dummy(1250).
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(1250).
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(1250).
* 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(1250).
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(1250),
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(1250).
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