[53210] in SAPr3-news
=?ISO-8859-1?Q?ABAP_Toolprogramme_/_Auswertung_=FCber_Transpo?=
daemon@ATHENA.MIT.EDU (volker Korrmann)
Wed Feb 2 10:18:22 2005
To: sapr3-news@mit.edu
Date: 2 Feb 2005 07:18:08 -0800
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0502020718.6cc9430f@posting.google.com>
*Hallo Leute,
*
*anbei ein Report, mit dem man prüfen kann, ob in das K oder P System
alle
*Objekte korrekt eingespielt wurden, oder ob irgendwo ein alter
Auftrag
*noch einmal reingelaufen ist.
*
*Steht also mal das Prod schief und läuft nicht mehr, kann man mit
diesem
*Report glänzen.
*
*
*Gruß Volker
*
* P.s. Vorsicht, es wird auch der Report z_TAB benötigt!!!
*
*
*Bedienungsanleitung
*-------------------
*
*In der Selektionsmaske sollte man die folgenden Einstellungen
vornehmen:
*
*Auftrag : z.B. CMEK* (Alles aus der Entwicklung)
*Dadurch wird das Quellsystem eindeutig identifiziert. Es können immer
nur
*Aufträge eines Quellsystems in ein Zielsystem sinnvoll geprüft
werden.
*
*Status = R Nur freigegebene Aufträge werden geprüft
*
*Systemname = z.B. CMK Konsolidierungssystem
*
*
*
*
*Die Auswertung zeigt dann alle Importe an. Die Zeit des Exports und
des
*Imports werden direkt aus den Transportprotokollen gelesen.
*Durch die Spalte (K)onflikte sieht man die Transporte, die alten
*Schotter in das System eingespielt haben (*), und welche neueren
*Aufträge damit potentiell überschrieben wurden.
*
*Die Objektlisten werden hierzu ausgewertet, und es wird geprüft,
*ob die alten Objekte ganz oder teilweise von späteren Importen
*wieder geradegezogen wurden.
*
*In der Liste der Transportfehler werden dann alle noch
*veralteten Objekte aufgeführt. Weiterhin kann es dabei
*noch eine Ausnahmenliste geben, wenn z.B. nur ein Include
*der veralteten Funktionsgruppe schon wieder auf den aktuellen
*Stand gebracht wurde.
*
*WICHTIG: Nicht blind einfach Objekte nachziehen, denn
*teilweise wurden gewisse Arbeitsstände absichtlich
*wieder auf den alten Stand gebracht.
*Nicht immer ist das neuste auch das Beste oder ist überhaupt
*funktionstüchtig.
*
*
*
*
*
*
*Einbauanleitung
*---------------
*
*Es ist eine Struktur Ze070 nach folgendem Muster anzulegen:
*
*TRKORR TRKORR
*TRFUNCTION TRFUNCTION
*TRSTATUS TRSTATUS
*TARSYSTEM TR_TARGET
*AS4USER TR_AS4USER
*AS4DATE AS4DATE
*AS4TIME AS4TIME
*STRKORR STRKORR
*LANGU DDLANGUAGE
*AS4TEXT AS4TEXT
*CLIENT TRCLIENT
*C1 TRTARSYS
*D1 AS4DATE
*T1 AS4TIME
*C2 TRTARSYS
*D2 AS4DATE
*T2 AS4TIME
*KONFLIKT CHAR1
*
*
*Der Report ztr1 und ZTAB ist anzulegen. In den Eigenschaften der
*Reports (Springen / Eigenschaften) muß die Unicodeprüfung
*abgeschaltet werden.
*
*Die folgenden Selektionstexte sind anzulegen:
*
*P_ALL Alles
*P_DETAIL Detail
*P_IMP Nur TP´s mit Konflikten zeigen
*P_OBJ2 Transportfehler ermitteln
*P_OBLIST Objektliste
*P_SORT1 Sortierung nach Exportdatum
*P_SORT2 Sortierung nach Importdatum
*P_TAR Systemname
*S_DATE Datum
*S_FUNC Typ des Auftrags/Aufgabe
*S_KORR Auftrag/Aufgabe
*S_STAT Status
*S_TEXT Kurzbeschreibung
*S_USER Inhaber
*
*Wo möglich kann dabei die DDIC Vorbelegung übernommen werden.
*
*
*Fertig!
*
REPORT ztr01 NO STANDARD PAGE HEADING LINE-SIZE 255.
* (C) 2005 Volker Korrmann
* Report für Transportauswertungen
* Es werden alle Transporte eines Systems ermittelt, welche nicht
* erfolgreich in ein anzugebendes Zielsystem eingeflossen sind.
TABLES: e070v.
TYPE-POOLS ctslg .
TYPE-POOLS: trwbo.
FIELD-SYMBOLS: <f>.
DATA: it TYPE STANDARD TABLE OF ze070 WITH HEADER LINE.
DATA: it3 TYPE STANDARD TABLE OF ze070 WITH HEADER LINE.
DATA: status TYPE i.
DATA: wt_e071 TYPE STANDARD TABLE OF e071 WITH HEADER LINE.
DATA: it_check TYPE STANDARD TABLE OF e071 WITH HEADER LINE.
DATA: it_konf TYPE STANDARD TABLE OF e071 WITH HEADER LINE.
DATA: it_all TYPE STANDARD TABLE OF e071 WITH HEADER LINE.
DATA: g_abgl TYPE trwbo_request.
DATA: lt_v1 TYPE trwbo_request.
DATA: lt_v2 TYPE trwbo_request.
DATA: lt_v3 TYPE trwbo_request.
DATA: lt_vtmp TYPE trwbo_request.
DATA: lt_v_ausn TYPE trwbo_request.
DATA: BEGIN OF lt_fehler OCCURS 0.
INCLUDE STRUCTURE ze070.
DATA: objects TYPE trwbo_t_e071,
keys TYPE trwbo_t_e071k,
END OF lt_fehler.
DATA: wa_obj LIKE LINE OF lt_v1-objects.
DATA: wa_keys LIKE LINE OF lt_v1-keys.
DATA: wa_obj2 LIKE LINE OF lt_v1-objects.
DATA: wa_keys2 LIKE LINE OF lt_v1-keys.
TYPES: BEGIN OF tt_tpdata,
trkorr LIKE e070v-trkorr,
objects TYPE trwbo_t_e071,
keys TYPE trwbo_t_e071k,
END OF tt_tpdata.
DATA lts_tpdata TYPE SORTED TABLE OF tt_tpdata
WITH UNIQUE KEY trkorr
WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK sel WITH FRAME TITLE text-002.
SELECT-OPTIONS:
s_korr FOR e070v-trkorr,
s_func FOR e070v-trfunction,
s_stat FOR e070v-trstatus DEFAULT 'R',
* s_tar for e070-tarsystem default sy-SYSID,
s_user FOR e070v-as4user DEFAULT 'TEST', " sy-uname,
s_date FOR e070v-as4date,
s_text FOR e070v-as4text.
SELECTION-SCREEN END OF BLOCK sel.
SELECTION-SCREEN BEGIN OF BLOCK sel2 WITH FRAME TITLE text-003.
PARAMETERS:
p_all RADIOBUTTON GROUP g1,
p_imp RADIOBUTTON GROUP g1,
p_tar LIKE trtarget-tarsystem DEFAULT 'S80' OBLIGATORY,
* p_detail AS CHECKBOX DEFAULT 'X',
p_oblist AS CHECKBOX DEFAULT '',
p_obj2 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN BEGIN OF BLOCK sort WITH FRAME TITLE text-001.
PARAMETERS: p_sort1 RADIOBUTTON GROUP g2.
PARAMETERS: p_sort2 RADIOBUTTON GROUP g2 DEFAULT 'X'. SELECTION-SCREEN
END OF BLOCK sort.
SELECTION-SCREEN END OF BLOCK sel2.
AT LINE-SELECTION.
* assign ('(Z_TAB)TEXT255') to <f>.
* write: sy-tabix, <f>(50).
IF sy-tabix <> 0 AND sy-lsind = 1.
READ TABLE it INDEX sy-tabix.
SUBMIT rddprott
WITH pv_korr = it-trkorr
AND RETURN.
CLEAR it.
sy-tabix = 0.
ENDIF.
DATA: d22 LIKE it-d2.
DATA: t22 LIKE it-t2.
START-OF-SELECTION.
REFRESH it_all.
status = 1.
SELECT * FROM e070v
INTO TABLE it
WHERE trkorr IN s_korr
AND trfunction IN s_func
AND trstatus IN s_stat
AND as4user IN s_user
AND as4date IN s_date
AND as4text IN s_text.
* Zeiten ermitteln
CLEAR d22.
CLEAR t22.
LOOP AT it.
PERFORM get_dates USING it-trkorr
CHANGING it-c1 it-d1 it-t1 it-c2 it-d2 it-t2.
* IF d22 = it-d2 AND
* t22 = it-t2 .
* it-t2 = it-t2 + 1.
* ENDIF.
* d22 = it-d2.
* t22 = it-t2.
MODIFY it.
IF it-d2 IS INITIAL.
DELETE it.
ENDIF.
ENDLOOP.
SORT it BY c1 d1 t1 trkorr.
* Konflikte ermitteln
DATA: it2 LIKE LINE OF it.
DATA: header(200).
CLEAR it2.
LOOP AT it.
IF NOT it2 IS INITIAL AND
( it2-d2 > it-d2 OR
( it2-d2 = it-d2 AND
it2-t2 > it-t2 ) ) .
it-konflikt = 'X'.
MODIFY it.
* Nun noch den it mal schnell wieder vergessen und mit dem Vorgänger
* weiterarbeiten, damit auch noch weitere Konflikte aufgedeckt werden
* können !!
it = it2.
ENDIF.
it2 = it.
ENDLOOP.
* Konfliktbeteiligte ermitteln.
SORT it BY c1 d2 t2 trkorr DESCENDING.
CLEAR it2.
LOOP AT it.
IF it-konflikt = 'X'.
it2 = it.
ENDIF.
IF NOT it2 IS INITIAL AND it <> it2 AND
( it2-d1 > it-d1 OR
( it2-d1 = it-d1 AND
it2-t1 > it-t1 ) ) .
it-konflikt = '*'.
MODIFY it.
ENDIF.
ENDLOOP.
IF p_obj2 = 'X'.
PERFORM objektlistencheck.
ENDIF.
* Konfliktfreie Aufträge löschen, wenn gefordert
it3[] = it[].
IF p_imp = 'X'.
LOOP AT it WHERE konflikt = ''.
DELETE it.
ENDLOOP.
ENDIF.
* Ausgabe der allgemeinen Auftragsliste + Konflikte
FORMAT COLOR 1 INTENSIFIED ON.
WRITE: / 'Liste der Transportaufträge'.
FORMAT RESET.
SKIP.
IF p_sort1 = 'X'.
SORT it BY c1 d1 t1 trkorr.
WRITE: / 'Sortiert nach SOLL Einspielreihenfolge'.
ELSE.
SORT it BY c1 d2 t2 trkorr.
WRITE: / 'Sortiert nach der aktuellen Einspielreihenfolge'.
ENDIF.
SKIP 2.
WRITE: /
'Legende: Spalte K(onflikte) = * --> Einspielung alter Aufträge;',
'X --> Von alten Aufträgen mögl. betroffener Auftrag'.
SKIP.
CONCATENATE
'Auftrag Source ExpDate ExpTime Konflikt Dest ImpDate ImpTime User'
'Beschreibung'
INTO header SEPARATED BY ' '.
PERFORM init(z_tab)
USING 'ZE070'
'trkorr(11) c1(4) d1 t1 konflikt c2(4) d2 t2 as4user as4text' header
'trkorr as4user' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES it[].
** ------------------------------ DETAILAUSWERTUNG
------------------
* IF p_detail = 'X'.
* SORT it3 BY c1 d2 t2 trkorr.
* DATA: rc.
* DATA: status2.
*
* CLEAR it_konf.
* REFRESH: it_konf, it_all.
* rc = 0.
* status2 = 'X'.
* LOOP AT it3.
* IF it3-konflikt <> ''. rc = 1. ENDIF.
* IF rc = 1.
* CLEAR wt_e071. REFRESH wt_e071.
* PERFORM get_objectlist TABLES wt_e071
* USING it3-trkorr.
* IF status2 = 'X' AND it3-konflikt = 'X'.
** Er werden gerade möglicherweise überschriebene Transportaufträge
** betrachtet. Daher merken wir uns von diesen ersteinmal alle
** Transporteinträge.
* PERFORM reset_konf TABLES wt_e071.
* INSERT LINES OF wt_e071 INTO TABLE it_check.
* ELSEIF ( status2 = '*' OR status2 = ' ' ) AND it3-konflikt =
'X'.
** Es findet ein Wechsel zu einem neuen Paket mit möglichen Konflikten
* REFRESH it_check.
* CLEAR it_check.
* PERFORM reset_konf TABLES wt_e071.
* INSERT LINES OF wt_e071 INTO TABLE it_check.
* ELSEIF it3-konflikt = ' '.
** Konfliktfreies Paket, kann alte Konflikte wieder ausbügeln.
* PERFORM reset_konf TABLES wt_e071.
* ELSEIF status2 = 'X' AND it3-konflikt = '*'.
* SORT it_check BY pgmid object obj_name.
* PERFORM reset_konf TABLES wt_e071.
* PERFORM find_konf.
* ELSEIF status2 <> 'X' AND it3-konflikt = '*'.
* SORT it_check BY pgmid object obj_name.
* PERFORM reset_konf TABLES wt_e071.
* PERFORM find_konf.
* ENDIF.
* ENDIF.
* status2 = it3-konflikt.
* ENDLOOP.
*
** ------------------------------ DETAILAUSWERTUNG
------------------
*
* IF NOT it_konf[] IS INITIAL.
* SKIP 3.
* FORMAT COLOR 1 INTENSIFIED ON.
* WRITE: / 'Detail Konfliktauswertung'.
* FORMAT RESET.
* SKIP.
* WRITE: /
* 'Die nachfolgenden Auswertungsergebnisse erheben keinen Anspruch
auf',
* / 'Vollständigkeit. Es kann hier durchaus durch übergeordnete
Objekte'
*,
* / 'zu unausgewiesenen Konfliktobjekten kommen.'.
* SKIP.
* SORT it_konf.
*
*
* PERFORM init(z_tab)
* USING 'E071'
*'TRKORR(11) PGMID OBJECT OBJ_NAME(30) ACTIVITY'
*'Auftrag ID Object Objektname Aktivität'
* 'trkorr' " Hides
* ' ' " Referenzen
* ' ' " Checkboxen
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
* PERFORM print_tab(z_tab) TABLES it_konf[].
*
*
*
* ENDIF.
*
* ENDIF.
* ------------------------------ Transportfehler ------------------
IF p_obj2 = 'X'.
SKIP 3.
CLEAR lt_v1.
LOOP AT lt_fehler WHERE d1 <= it-d1.
LOOP AT lt_fehler-objects INTO wa_obj.
wa_obj-trkorr = lt_fehler-trkorr.
INSERT wa_obj INTO TABLE lt_v1-objects.
ENDLOOP.
LOOP AT lt_fehler-keys INTO wa_keys.
wa_keys-trkorr = lt_fehler-trkorr.
INSERT wa_keys INTO TABLE lt_v1-keys.
ENDLOOP.
ENDLOOP.
CALL FUNCTION 'TR_SORT_OBJECT_AND_KEY_LIST'
CHANGING
ct_objects = lt_v1-objects
ct_keys = lt_v1-keys.
FORMAT COLOR 1 INTENSIFIED ON.
SORT it_all.
WRITE: / 'Liste der Transportfehler'.
FORMAT RESET.
SKIP.
PERFORM init(z_tab)
USING 'E071'
'TRKORR(11) PGMID OBJECT OBJ_NAME(40) '
'Auftrag ID Object Objektname '
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES lt_v1-objects.
* ------------------------------ Transportfehler KEYS
------------------
IF NOT lt_v1-keys IS INITIAL.
FORMAT COLOR 1 INTENSIFIED ON.
SORT it_all.
WRITE: / 'Liste der Transportfehler (Customizing)'.
FORMAT RESET.
SKIP.
PERFORM init(z_tab)
USING 'E071K'
'TRKORR(11) PGMID OBJECT OBJ_NAME(30) VIEWNAME(30) TABKEY'
'Auftrag ID Object Objektname Viewname Tabellenkey '
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES lt_v1-keys.
ENDIF.
ENDIF.
* ------------------------------ transportfehler ausnahmen
------------------
IF p_obj2 = 'X'.
SKIP 3.
CLEAR lt_v1.
LOOP AT lt_v_ausn-objects INTO wa_obj.
INSERT wa_obj INTO TABLE lt_v1-objects.
ENDLOOP.
LOOP AT lt_v_ausn-keys INTO wa_keys.
INSERT wa_keys INTO TABLE lt_v1-keys.
ENDLOOP.
CALL FUNCTION 'TR_SORT_OBJECT_AND_KEY_LIST'
CHANGING
ct_objects = lt_v1-objects
ct_keys = lt_v1-keys.
IF NOT lt_v1-objects IS INITIAL
AND NOT lt_v1-keys IS INITIAL.
FORMAT COLOR 1 INTENSIFIED ON.
SORT it_all.
WRITE: /
'Liste der Ausnahmen bei den Transportfehlern (korrigierte
Teilobjekte)'.
FORMAT RESET.
SKIP.
PERFORM init(z_tab)
USING 'E071'
'TRKORR(11) PGMID OBJECT OBJ_NAME(40) '
'Auftrag ID Object Objektname '
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES lt_v1-objects.
ENDIF.
* ------------------------------ Transportfehler KEYS
------------------
IF NOT lt_v1-keys IS INITIAL.
FORMAT COLOR 1 INTENSIFIED ON.
SORT it_all.
WRITE: / 'Liste der Transportfehlerausnahmen im Customizing'.
FORMAT RESET.
SKIP.
PERFORM init(z_tab)
USING 'E071K'
'TRKORR(11) PGMID OBJECT OBJ_NAME(30) VIEWNAME(30) TABKEY'
'Auftrag ID Object Objektname Viewname Tabellenkey '
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES lt_v1-keys.
ENDIF.
ENDIF.
* ------------------------------ Ojektelisten Anzeige --------------
IF p_oblist = 'X'.
CLEAR lt_v1.
LOOP AT lts_tpdata.
LOOP AT lts_tpdata-objects INTO wa_obj.
wa_obj-trkorr = lts_tpdata-trkorr.
INSERT wa_obj INTO TABLE lt_v1-objects.
ENDLOOP.
LOOP AT lts_tpdata-keys INTO wa_keys.
wa_keys-trkorr = lts_tpdata-trkorr.
INSERT wa_keys INTO TABLE lt_v1-keys.
ENDLOOP.
ENDLOOP.
SKIP 3.
FORMAT COLOR 1 INTENSIFIED ON.
SORT it_all.
WRITE: / 'Objektlisten'.
FORMAT RESET.
SKIP.
PERFORM init(z_tab)
USING 'E071'
'TRKORR(11) PGMID OBJECT OBJ_NAME(40) '
'Auftrag ID Object Objektname '
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab(z_tab) TABLES lt_v1-objects.
ENDIF.
* ------------------------------ Ojektelisten Anzeige --------------
sy-tabix = 0.
EXIT.
*---------------------------------------------------------------------*
* FORM get_objectlist
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
* --> TRKORR
*
*---------------------------------------------------------------------*
FORM get_objectlist TABLES wt_e071 STRUCTURE e071
USING trkorr.
CALL FUNCTION 'TR_READ_COMM'
EXPORTING
wi_trkorr = trkorr
* WI_DIALOG = 'X'
* WI_LANGU = SY-LANGU
* WI_SEL_E070 = ' '
wi_sel_e071 = 'X'
* WI_SEL_E071K = ' '
* IV_SEL_E071KF = ' '
* WI_SEL_E07T = ' '
* WI_SEL_E070C = ' '
* IV_SEL_E070M = ' '
* IV_SEL_E070A = ' '
* IMPORTING
* WE_E070 =
* WE_E07T =
* WE_E070C =
* ES_E070M =
* WE_E07T_DOESNT_EXIST =
* WE_E070C_DOESNT_EXIST =
* EV_E070M_DOESNT_EXIST =
TABLES
wt_e071 = wt_e071
* WT_E071K =
* ET_E071KF =
* ET_E070A =
EXCEPTIONS
not_exist_e070 = 1
no_authorization = 2
OTHERS = 3
.
INSERT LINES OF wt_e071 INTO TABLE it_all.
CLEAR wt_e071.
wt_e071-trkorr = trkorr.
INSERT wt_e071 INTO TABLE it_all.
* PERFORM init(z_tab)
* USING 'E071'
* 'PGMID OBJECT OBJ_NAME(40)'
* '- '
* ' ' " Hides
* ' ' " Referenzen
* ' ' " Checkboxen
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
*
* PERFORM print_tab(z_tab) TABLES wt_e071[].
ENDFORM. "get_objectlist
***************************************************************
FORM get_dates USING trkorr
CHANGING c1 d1 t1 c2 d2 t2.
DATA: cofiles TYPE ctslg_cofile.
DATA: settings TYPE ctslg_settings.
CLEAR settings.
settings-point_to_missing_steps = 'X'.
settings-detailed_depiction = 'X'.
DATA: systems LIKE LINE OF cofiles-systems.
DATA: steps LIKE LINE OF systems-steps.
DATA: actions LIKE LINE OF steps-actions.
CALL FUNCTION 'TR_READ_GLOBAL_INFO_OF_REQUEST'
EXPORTING
iv_trkorr = trkorr
* IV_DIR_TYPE = 'T'
is_settings = settings
* IV_SUPPRESS_DELETED_STEPS = ' '
* IT_COMM_SYSTEMS =
IMPORTING
es_cofile = cofiles
* EV_USER =
* EV_PROJECT =
.
CLEAR: d1, d2, t1, t2.
LOOP AT cofiles-systems INTO systems.
LOOP AT systems-steps INTO steps.
IF steps-rc <= 4 AND
steps-stepid = 'E'.
CLEAR actions.
LOOP AT steps-actions INTO actions WHERE rc <= 4.
ENDLOOP.
c1 = systems-systemid.
d1 = actions-date.
t1 = actions-time.
ENDIF.
IF systems-systemid = p_tar.
IF steps-rc <= 4 AND
( steps-stepid = 'A' OR
steps-stepid = 'G' OR
steps-stepid = 'B' OR
steps-stepid = 'I' OR
steps-stepid = 'J' ) .
CLEAR actions.
LOOP AT steps-actions INTO actions WHERE rc <= 4.
ENDLOOP.
IF d2 <= actions-date.
c2 = systems-systemid.
d2 = actions-date.
t2 = actions-time.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM. "get_dates
*&---------------------------------------------------------------------*
*& Form find_konf
*&---------------------------------------------------------------------*
FORM find_konf.
DATA: rc TYPE i.
rc = 0.
LOOP AT wt_e071.
READ TABLE it_check WITH KEY pgmid = wt_e071-pgmid
object = wt_e071-object
obj_name = wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
it_konf = it_check. APPEND it_konf. rc = 1.
ENDIF.
IF wt_e071-pgmid = 'R3TR' AND
wt_e071-object = 'PROG'.
READ TABLE it_check WITH KEY pgmid = 'LIMU'
object = 'REPS'
obj_name = wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
it_konf = it_check. APPEND it_konf. rc = 1.
ENDIF.
ELSEIF wt_e071-pgmid = 'LIMU' AND
wt_e071-object = 'REPS'.
READ TABLE it_check WITH KEY pgmid = 'R3TR'
object = 'PROG'
obj_name = wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
it_konf = it_check. APPEND it_konf. rc = 1.
ENDIF.
ENDIF.
ENDLOOP.
* Sortieren wenn nötig.
IF rc = 1.
SORT it_konf BY pgmid object obj_name.
ENDIF.
ENDFORM. " find_konf
*&---------------------------------------------------------------------*
*& Form Reset_konf
*&---------------------------------------------------------------------*
FORM reset_konf TABLES p_wt_e071 STRUCTURE e071.
DATA: tabix LIKE sy-tabix.
LOOP AT p_wt_e071.
READ TABLE it_konf WITH KEY pgmid = p_wt_e071-pgmid
object = p_wt_e071-object
obj_name = p_wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
DELETE it_konf INDEX sy-tabix.
* Behandlung von doppelten Einträgen
READ TABLE it_konf WITH KEY pgmid = p_wt_e071-pgmid
object = p_wt_e071-object
obj_name = p_wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
DELETE it_konf INDEX sy-tabix.
ENDIF.
ENDIF.
* Ein ganzes Programm, kann auch einen einzelnen Report Quellcode
* Konflikt zurücksetzen.
IF p_wt_e071-pgmid = 'R3TR' AND p_wt_e071-object = 'PROG'.
READ TABLE it_konf WITH KEY pgmid = 'LIMU'
object = 'REPS'
obj_name = p_wt_e071-obj_name
BINARY SEARCH.
IF sy-subrc = 0.
DELETE it_konf INDEX sy-tabix.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " Reset_konf
*&--------------------------------------------------------------------*
*& Form Objektlistencheck
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM objektlistencheck.
DATA: tabix2 LIKE sy-tabix.
CLEAR lt_v_ausn.
SORT it BY c2 d2 t2 c1 d1 t1.
it3[] = it[].
* Alle Transportlisten lesen!!!
LOOP AT it.
CLEAR: lt_v1.
CALL FUNCTION 'TR_READ_REQUEST'
EXPORTING
iv_read_e070 = 'X'
iv_read_e07t = 'X'
iv_read_e070c = 'X'
iv_read_e070m = 'X'
iv_read_objs_keys = 'X'
iv_read_attributes = ' '
iv_trkorr = it-trkorr
CHANGING
cs_request = lt_v1
EXCEPTIONS
OTHERS = 1.
CALL FUNCTION 'TR_SORT_OBJECT_AND_KEY_LIST'
CHANGING
ct_objects = lt_v1-objects
ct_keys = lt_v1-keys.
DELETE lt_v1-objects WHERE pgmid = 'CORR' AND
object = 'RELE'.
lts_tpdata-trkorr = it-trkorr.
lts_tpdata-objects = lt_v1-objects.
lts_tpdata-keys = lt_v1-keys.
INSERT lts_tpdata INTO TABLE lts_tpdata.
ENDLOOP.
* Vergleich in Bubblesort manier der Objektlisten im Konfliktfall.
LOOP AT it.
tabix2 = sy-tabix.
CLEAR lt_v1.
READ TABLE lts_tpdata WITH KEY trkorr = it-trkorr.
lt_v1-objects = lts_tpdata-objects.
lt_v1-keys = lts_tpdata-keys.
LOOP AT it3 FROM tabix2.
IF ( it3-d1 < it-d1 OR
( it3-d1 = it-d1 AND
it3-t1 < it-t1 ) ) .
* Vergleich nur dann durchführen, wenn ein TP Konflikt (falsche
Einspielreihenfolge) vorliegt.
CLEAR: lt_v2, lt_v3.
READ TABLE lts_tpdata WITH KEY trkorr = it3-trkorr.
lt_v2-objects = lts_tpdata-objects.
lt_v2-keys = lts_tpdata-keys.
PERFORM tp_vergleich USING lt_v1 lt_v2
CHANGING lt_v3.
IF NOT lt_v3 IS INITIAL.
CLEAR lt_fehler.
MOVE-CORRESPONDING it TO lt_fehler.
lt_fehler-trkorr = it3-trkorr. " Datum von neuem
Auftrag, TP Nr vom alten Schotter!!!
lt_fehler-objects = lt_v3-objects.
lt_fehler-keys = lt_v3-keys.
INSERT lt_fehler INTO TABLE lt_fehler.
ENDIF.
ENDIF.
ENDLOOP.
* Anschließend die Fehlerlisten mit Hilfe des aktuellen Auftrages noch
reduzieren, wenn vom Datum her möglich.
LOOP AT lt_fehler WHERE d1 <= it-d1.
IF lt_fehler-d1 = it-d1 AND
lt_fehler-t1 >= it-t1.
CONTINUE.
ENDIF.
* Nur solche Fehler um die Objektlisten Reduzieren, die wirklich zu
einem späteren Zeitpunkt freigegeben wurden.
* Vergleich durchführen
CLEAR: lt_v2, lt_v3.
lt_v2-objects = lt_fehler-objects.
lt_v2-keys = lt_fehler-keys.
PERFORM tp_vergleich USING lt_v1 lt_v2
CHANGING lt_v3.
* Fehlerliste reduzieren
* Die übriggebliebenen doppelten Einträge sind korrekturen des
eingespielten alten Schotters.
* Die Fehlerliste ist somit um diese gefundenen Einträge zu
reduzieren.
* Alle nicht aussortierbaren Einträge sind nur geradegezogene
Teilobjekte der TP Konflikte.
* Diese kommen in die lt_v_ausn Ausnahmeliste und werden ganz zum
Schluß noch einmal verdichtet.
SORT lt_v3-objects BY pgmid object obj_name.
SORT lt_v3-keys BY pgmid object objname tabkey.
LOOP AT lt_fehler-objects INTO wa_obj.
READ TABLE lt_v3-objects WITH KEY pgmid = wa_obj-pgmid
object = wa_obj-object
obj_name = wa_obj-obj_name
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v3-objects INDEX sy-tabix.
DELETE lt_fehler-objects.
ENDIF.
ENDLOOP.
LOOP AT lt_fehler-keys INTO wa_keys.
READ TABLE lt_v3-keys WITH KEY pgmid = wa_keys-pgmid
object = wa_keys-object
objname = wa_keys-objname
tabkey = wa_keys-tabkey
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v3-keys INDEX sy-tabix.
DELETE lt_fehler-keys.
ENDIF.
ENDLOOP.
INSERT LINES OF lt_v3-objects INTO TABLE lt_v_ausn-objects.
INSERT LINES OF lt_v3-keys INTO TABLE lt_v_ausn-keys.
* leere Fehlerlisten entfernen
IF lt_fehler-keys[] IS INITIAL AND
lt_fehler-objects[] IS INITIAL.
DELETE lt_fehler.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM. "Objektlistencheck
*&--------------------------------------------------------------------*
*& Form tp_vergleich
*&--------------------------------------------------------------------*
FORM tp_vergleich USING value(lt_v1) TYPE trwbo_request
value(lt_v2) TYPE trwbo_request
CHANGING
lt_v3 TYPE trwbo_request.
lt_v3 = lt_v2.
INSERT LINES OF lt_v1-objects INTO TABLE lt_v3-objects.
INSERT LINES OF lt_v1-keys INTO TABLE lt_v3-keys.
CALL FUNCTION 'TR_SORT_OBJECT_AND_KEY_LIST'
CHANGING
ct_objects = lt_v3-objects
ct_keys = lt_v3-keys.
* Aus der Verdichteten Gesamtliste sind alle Objekte der "veralteten"
* Transporte zu entfernen.
SORT lt_v3-objects BY pgmid object obj_name.
SORT lt_v3-keys BY pgmid object objname tabkey.
LOOP AT lt_v2-objects INTO wa_obj.
READ TABLE lt_v3-objects WITH KEY pgmid = wa_obj-pgmid
object = wa_obj-object
obj_name = wa_obj-obj_name
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v3-objects INDEX sy-tabix.
DELETE lt_v2-objects.
ENDIF.
ENDLOOP.
LOOP AT lt_v2-keys INTO wa_keys.
READ TABLE lt_v3-keys WITH KEY pgmid = wa_keys-pgmid
object = wa_keys-object
objname = wa_keys-objname
tabkey = wa_keys-tabkey
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v3-keys INDEX sy-tabix.
DELETE lt_v2-keys.
ENDIF.
ENDLOOP.
LOOP AT lt_v1-objects INTO wa_obj.
READ TABLE lt_v3-objects WITH KEY pgmid = wa_obj-pgmid
object = wa_obj-object
obj_name = wa_obj-obj_name
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v1-objects.
ENDIF.
ENDLOOP.
LOOP AT lt_v1-keys INTO wa_keys.
READ TABLE lt_v3-keys WITH KEY pgmid = wa_keys-pgmid
object = wa_keys-object
objname = wa_keys-objname
tabkey = wa_keys-tabkey
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE lt_v1-keys.
ENDIF.
ENDLOOP.
lt_v3 = lt_v2.
INSERT LINES OF lt_v1-objects INTO TABLE lt_v3-objects.
INSERT LINES OF lt_v1-keys INTO TABLE lt_v3-keys.
* Alle Objekte, die nicht mehr aus dem neuen TP in der Gesamtliste
* gefunden werden können, sind kritische (doppelte) evtl.
überschriebene Objekte.
* Diese werden in der Tabelle lt_v3 zurückgegeben.
ENDFORM. "tp_vergleich
----------------------------------------------------------------------------------------------------------
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.