[54130] in SAPr3-news
ABAP Toolprogramme / Strukturanzeige und GUID JOIN
daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Apr 12 10:48:07 2005
To: sapr3-news@mit.edu
Date: 12 Apr 2005 07:47:45 -0700
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0504120647.459190b6@posting.google.com>
Hallo Leute,
ich habe meine Sturkturanzeige noch einmal mächtig getopt.
Über eine beliebige Menge von Tabellen kann man einen FULL GUID JOIN
ausgehend von einer GUID machen. Alle zusammenhänge werden dargestellt
und durch einen Doppelklick auf den Bildschirm erhält man alle Daten
auch noch angezeigt.
Bei den neuen Modulen, die fast nur noch mit GUID´s arbeiten ist das
eine riesen Hilfe.
Bitte in beiden Programmen in den Eigenschaften die UNICODE Prüfung
ausschalten!
Denn ZBRTOO09 und z_TAB arbeiten beide zusammen!
Gruß Volker
*Hallo Leute,
*
*anbei ein nettes Programm von mir zur Anzeige von Strukturen sowie
zur
*Anzeige aller Datenelementdokumentationen!!! *Wenn Ihr also zu einer
*Tabelle nicht nur die Felder + Kurztexte braucht
*sondern auch die F1 Hilfe mit drucken wollt, dann gibt es da unter
4.6c
*nichts. Zumindest habe ich es nicht gefunden.
*Nehmt also einfach diesen Report, gebt hier im ersten Feld eine oder
*auch *mehrere Tabellen bzw. Strukturen ein und wählt die Option:
*DOKU_PRN aus .
*Im zweiten Feld kann man bei Bedarf durch Leerzeichen getrennt
mehrere
*Filter für die auszugebenen Felder eingeben.
*
*Bitte vor dem Aufruf kontrollieren, ob unter
*"System/Benutzervorgaben/eigene *Daten" ein Drucker eingegeben ist.
*Denn sonst kommt ein Dialog, und Ihr
* müßt
*den Drucker zwei mal eingeben. Geht leider nicht anders!!!! Daher
bitte
*einen festen Drucker in den eigenen Daten eintragen. Es wird nichts
*automatisch gedruckt! Dieser Drucker wird nur für die
Dateiaufbereitun
*benötigt.
*Wenn Ihr nun F8 drückt, kommt der Acrobatreader in den Vordergrund
und
*zeigt *Euch alle Felder + zugehöriger F1 Hilfen an.
*
*Im Acrobatreader nun View/Continous auswählen und Strg A und Strg C
*drücken,
*nach Word gehen und Strg V betätigen. (Sonst wird nur eine Seite
*kopiert!)
*Fertig ist die DOKU!!
*Die Kopf und Fußzeilen, die beim kopieren nach Word stören würden,
habe
* ich
*extra dafür aus der OTF Datei entfernt!
*
*Der Code ist zwar nicht so richtig sauber, aber ich hatte den Report
*dringend gebraucht und aus einem andern ganz alten Report von mir
*schnell
*mal eben so zusammengefrickelt. Also nicht zu kritisch reinsehen!
*
*Falls Ihr noch Verbesserungen hierzu habt, immer her damit!
*Auch andere gute Tips und Tricks oder nützliche Reports sind mir
immer
*willkommen.
*
*Gruß Volker
* Show DDIC-Structure
REPORT zbrtoo09 LINE-SIZE 255 NO STANDARD PAGE HEADING.
* (C) Volker Korrmann 10.03.2002
TYPE-POOLS sqlt.
TABLES: trdir,dd02t, ddftx, dd02l, "Tabellen Tabelle
fupararef, dd40l,
dd03l, *dd03l. "Datenelementen Tabelle
TABLES: sscrfields. "Hilfetabelle
* parameters:
* parameters:
* tabellen(900),
* felder(900),
* show like dntab-tabname no-display.
* Tabellen für GUID_JOIN
DATA: g_maxguids TYPE i.
DATA: g_last_maxguids TYPE i.
DATA: zeile(1500) TYPE c.
DATA: BEGIN OF it_guid_fields OCCURS 0,
tabname TYPE tabname,
fieldname TYPE fieldname,
datatype TYPE datatype_d,
ddlen TYPE ddleng,
maxnr TYPE i,
nr TYPE i,
END OF it_guid_fields.
DATA: BEGIN OF it_guids OCCURS 0,
guid16 TYPE sysuuid-x,
guid32 TYPE sysuuid-c,
guid22 TYPE sysuuid-c22,
nr TYPE i,
inaktiv type flag,
END OF it_guids,
BEGIN OF it_guid_ref OCCURS 0,
* ebene type i,
father TYPE i, "Nr der Vorgängerguid
fatherfield TYPE i, "Nr des LINK Feldes
feld TYPE i, "Nr des Feldes
guid TYPE i, "Nr der Guid
END OF it_guid_ref.
* temporäre Kopie aller zu verarbeitenden Guids eines Selects
DATA: BEGIN OF it_guids2 OCCURS 0,
guid16 TYPE sysuuid-x,
guid32 TYPE sysuuid-c,
guid22 TYPE sysuuid-c22,
nr TYPE i,
inaktiv type flag,
END OF it_guids2.
DATA: BEGIN OF g_tabdata OCCURS 0,
data(3000) TYPE c,
table LIKE dd03l-tabname,
GUID_NR type i,
END OF g_tabdata.
DATA: BEGIN OF g_tabdata2 OCCURS 0,
data(3000) TYPE c,
END OF g_tabdata2.
DATA: text(80), rc(1), tabellena(9000).
DATA: rest(200).
DATA: file TYPE string.
DATA: i TYPE i.
RANGES s_element FOR ddftx-rollname OCCURS 0.
RANGES s_tab FOR dd02l-tabclass OCCURS 0.
RANGES t1_element FOR ddftx-rollname OCCURS 0.
RANGES t2_element FOR ddftx-rollname OCCURS 0.
DATA BEGIN OF nametab OCCURS 0.
INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab.
* Dynpro Selektionsfeld für die Anzeige des SQL-Traces
* Tabelle mit Trace-Sätzen und Haeder-Sätze
DATA: sql_trace_tab TYPE sqlt_trace_tab,
* rfc_trace_tab type SQLT_TRACE_TAB,
sql_bheader_tab TYPE sqlt_bheader_tab.
DATA: g_selopttab_tab TYPE sqlt_rtabn OCCURS 3 WITH HEADER LINE.
DATA: BEGIN OF it_tab1 OCCURS 0,
tabname LIKE dd02l-tabname,
* len(10) type c,
END OF it_tab1.
DATA BEGIN OF nametab2 OCCURS 0.
INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab2.
DATA BEGIN OF it OCCURS 0.
INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA: doppelt(1).
DATA END OF it.
DATA: BEGIN OF it_el OCCURS 0,
tabname LIKE ddftx-tabname,
zaehler TYPE i,
tabclass LIKE dd02l-tabclass,
END OF it_el.
DATA: BEGIN OF tabs2 OCCURS 0,
show LIKE dntab-tabname,
*anz type i,
END OF tabs2.
DATA: BEGIN OF tabs OCCURS 0,
show LIKE dntab-tabname,
anz TYPE i,
END OF tabs.
DATA: BEGIN OF it_fb OCCURS 0,
fb LIKE fupararef-funcname,
END OF it_fb.
DATA: BEGIN OF fields OCCURS 0,
line(200),
END OF fields.
DATA: BEGIN OF rollnames OCCURS 0,
line(30),
END OF rollnames.
DATA:
subrc LIKE sy-subrc,
tab_len LIKE sy-fdpos,
tabname LIKE dntab-tabname,
tabfield(21),
include LIKE sy-repid,
program LIKE sy-repid.
* Eingabe Maske
SELECTION-SCREEN BEGIN OF BLOCK eingabe WITH FRAME
TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS:
tabellen(9000).
SELECT-OPTIONS: s_tab2 FOR dd03l-tabname.
SELECT-OPTIONS: s_fb FOR fupararef-funcname.
PARAMETERS: p_fbdoku AS CHECKBOX.
PARAMETERS:
felder(9000).
PARAMETERS sqltrace AS CHECKBOX.
PARAMETERS anz_ds AS CHECKBOX .
PARAMETERS tab_only AS CHECKBOX.
PARAMETERS min_data TYPE i.
SELECTION-SCREEN END OF BLOCK eingabe.
SELECTION-SCREEN BEGIN OF BLOCK eingabe2 WITH FRAME
TITLE text-003.
SKIP.
PARAMETERS: elemente(900).
SKIP.
SELECTION-SCREEN END OF BLOCK eingabe2.
PARAMETERS:
feld1 LIKE dd03d-rollname NO-DISPLAY,
feld2 LIKE dd03d-rollname NO-DISPLAY.
PARAMETERS: doku_prn AS CHECKBOX.
PARAMETERS: p_dialog AS CHECKBOX.
PARAMETERS: filename(50) TYPE c DEFAULT
'C:\temp\t1.pdf'.
PARAMETERS: fb_doc(50) TYPE c DEFAULT
'C:\temp\FB.pdf'.
SELECTION-SCREEN SKIP.
PARAMETERS p_guid TYPE guid_16.
Parameters p_maxg type i default 100.
select-options: s_ffeld for dd03l-rollname.
DATA: tanz1(10) TYPE c VALUE 'Tabelle',
tanz2(10) TYPE c VALUE 'Struktur',
tanz3(10) TYPE c VALUE 'Cluster',
tanz4(10) TYPE c VALUE 'POOL',
tanz5(10) TYPE c VALUE 'View',
tanz6(15) TYPE c VALUE 'Append-struktur'.
DATA: info(60).
DATA: info2(200).
DATA: anzahl TYPE p DECIMALS 0.
AT LINE-SELECTION.
IF sy-lsind = 1.
NEW-PAGE LINE-SIZE 1500.
PERFORM guid_join_datenausgabe.
ENDIF.
START-OF-SELECTION.
CLEAR it. REFRESH it.
CLEAR tabs. REFRESH tabs.
CLEAR tabs2. REFRESH tabs2.
CLEAR fields. REFRESH fields.
CLEAR nametab. REFRESH nametab.
CLEAR it_tab1. REFRESH it_tab1.
IF sqltrace = 'X'.
PERFORM get_trace.
ENDIF.
PERFORM datenelemente USING elemente CHANGING
tabellen.
SPLIT tabellen AT ' ' INTO TABLE tabs2.
SPLIT felder AT ' ' INTO TABLE fields.
IF NOT s_tab2[] IS INITIAL.
SELECT DISTINCT tabname FROM dd02l APPENDING TABLE
tabs2
WHERE tabname IN s_tab2.
ENDIF.
LOOP AT it_tab1.
tabs2 = it_tab1.
APPEND tabs2.
ENDLOOP.
REFRESH it_fb.
IF NOT s_fb[] IS INITIAL.
WRITE: / 'Funktionsbausteine: '.
SELECT * FROM fupararef WHERE funcname IN s_fb
ORDER BY funcname paramtype DESCENDING pposition.
ON CHANGE OF fupararef-funcname.
WRITE: / fupararef-funcname.
it_fb = fupararef-funcname.
APPEND it_fb.
ENDON.
WRITE: / ' ', fupararef-paramtype, fupararef-parameter,
fupararef-structure(100).
CLEAR tabs2.
SPLIT fupararef-structure AT '-' INTO tabs2 rest.
IF tabs2 <> ''.
APPEND tabs2.
ENDIF.
ENDSELECT.
SKIP 2.
ULINE.
ENDIF.
IF p_fbdoku = 'X'.
PERFORM fbdokus.
ENDIF.
SORT tabs2.
DELETE ADJACENT DUPLICATES FROM tabs2.
* Auch Strukturen von Tabellentypen erfassen!!!
loop at tabs2.
clear dd40l.
select single * from dd40l where typename = tabs2-show.
if sy-subrc = 0 and dd40l-rowkind = 'S'.
tabs2-show = dd40l-rowtype. append tabs2.
endif.
endloop.
SORT tabs2.
DELETE ADJACENT DUPLICATES FROM tabs2.
IF felder IS INITIAL.
fields = '*'. APPEND fields.
ENDIF.
CONCATENATE fields 'akshjweruhzihnbaskehur' INTO
fields
SEPARATED BY ' '.
LOOP AT tabs2.
MOVE-CORRESPONDING tabs2 TO tabs.
APPEND tabs.
ENDLOOP.
REFRESH tabs2.
LOOP AT tabs.
CLEAR dd02t.
CLEAR anzahl.
SELECT SINGLE * FROM dd02t WHERE tabname = tabs-show
AND ddlanguage = 'D'.
IF anz_ds = 'X' OR tab_only = 'X' OR min_data > 0.
SELECT * FROM dd02l UP TO 1 ROWS WHERE tabname = tabs-show
AND tabclass = 'TRANSP'.
ENDSELECT.
IF sy-subrc = 0.
FORMAT COLOR 1 ON.
IF anz_ds = 'X' OR min_data > 0.
SELECT COUNT(*) INTO anzahl FROM (tabs-show).
tabs-anz = anzahl.
IF anzahl >= min_data.
MODIFY tabs.
ELSE.
DELETE tabs.
CONTINUE.
ENDIF.
ENDIF.
ELSE.
IF tab_only = 'X' OR min_data > 0.
DELETE tabs.
CONTINUE.
ENDIF.
ENDIF.
ENDIF.
FORMAT COLOR 1 ON.
WRITE: / tabs-show, dd02t-ddtext.
IF anzahl > 0.
WRITE anzahl.
ENDIF.
ENDLOOP.
SKIP. ULINE. SKIP 2.
IF NOT p_guid IS INITIAL.
PERFORM guid_join.
ENDIF.
* AB Hier werden die ermittelten Tabellen ausgegeben!!
LOOP AT tabs.
CLEAR dd02t.
SELECT SINGLE * FROM dd02t WHERE tabname = tabs-show
AND ddlanguage = 'D'.
SKIP 1.
CONCATENATE tabs-show ':' dd02t-ddtext INTO text
SEPARATED BY ' '.
FORMAT COLOR 1 ON.
WRITE: / text.
IF tabs-anz <> 0.
WRITE tabs-anz.
ENDIF.
ULINE.
CLEAR nametab. REFRESH nametab.
PERFORM load_table USING tabs-show.
LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
CLEAR ddftx.
SELECT SINGLE * FROM ddftx WHERE tabname = tabs-show AND
fieldname = nametab-fieldname AND
ddlanguage = 'D'.
nametab-rollname = ddftx-rollname.
MODIFY nametab.
it = nametab. APPEND it.
rc = 1.
LOOP AT fields.
IF NOT fields CA '*'.
CONCATENATE fields '*' INTO fields.
ENDIF.
IF nametab-fieldname CP fields
OR nametab-keyflag = 'X'.
rc = 0.
ENDIF.
ENDLOOP.
IF rc = 1. DELETE nametab. ENDIF.
ENDLOOP.
PERFORM tabellenausgabe USING tabs-show.
LOOP AT nametab.
nametab2 = nametab. APPEND nametab2.
ENDLOOP.
ENDLOOP.
IF doku_prn = 'X'.
PERFORM dokuausgabe.
ENDIF.
*---------------------------------------------------------------------*
* FORM DOPPELTE_MARKIEREN *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM doppelte_markieren.
DATA: rc(1), tabix LIKE sy-tabix.
DATA: f1 LIKE it-fieldname, r1 LIKE it-rollname.
f1 = ''. r1 = ''.
LOOP AT it.
rc = 1.
IF f1 = it-fieldname OR r1 = it-rollname.
rc = 0.
ENDIF.
f1 = it-fieldname.
r1 = it-rollname.
IF rc = 0. it-doppelt = 'X'. MODIFY it. ENDIF.
tabix = sy-tabix - 1.
ENDLOOP.
ENDFORM. "DOPPELTE_MARKIEREN
*---------------------------------------------------------------------*
* FORM TABELLENAUSGABE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM tabellenausgabe USING show.
* Generate SHOWTAB
FORMAT RESET.
FORMAT COLOR 2 ON.
LOOP AT nametab.
IF nametab-keyflag = 'X'.
FORMAT INTENSIFIED ON.
ELSE.
FORMAT INTENSIFIED OFF.
ENDIF.
WRITE: / nametab-fieldname.
WRITE nametab-keyflag.
WRITE nametab-rollname.
WRITE nametab-datatype.
WRITE nametab-inttype.
WRITE nametab-intlen.
WRITE nametab-decimals.
WRITE nametab-fieldtext.
ENDLOOP.
ENDFORM. "TABELLENAUSGABE
*---------------------------------------------------------------------*
* FORM LOAD_TABLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SHOW *
*---------------------------------------------------------------------*
FORM load_table USING show.
subrc = 0.
tabname = show.
tab_len = STRLEN( show ).
IF tab_len = 2.
* Segment
CASE tabname.
* System
WHEN 'SY'.
tabname = 'SYST'.
* Dynpro
WHEN 'DY'.
SELECT SINGLE * FROM trdir
WHERE name = program.
IF sy-subrc NE 0.
PERFORM exit.
ENDIF.
IF trdir-subc CN '1MF'.
include = program.
IF trdir-subc = 'I' AND
include+5(1) CO 'IOFDU'.
SHIFT include RIGHT BY 3 PLACES.
include(3) = 'SAP'.
program = include.
SELECT SINGLE * FROM trdir
WHERE name = program.
IF sy-subrc NE 0.
PERFORM exit.
ENDIF.
ENDIF.
ENDIF.
tabname = '$'.
tabname+1(2) = trdir-dbna.
tabname+3(1) = trdir-appl.
* WHEN OTHERS.
* SELECT SINGLE * FROM T032
* WHERE SEGMENT = TABNAME.
* IF SY-SUBRC NE 0.
* PERFORM EXIT.
* ENDIF.
* TABNAME = T032-QMACRO.
ENDCASE.
ENDIF.
* Get NAMETAB
REFRESH nametab.
IF tabname NE 'SCREEN'.
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
tabname = tabname
langu = sy-langu
TABLES
nametab = nametab
EXCEPTIONS
internal_error = 1
table_has_no_fields = 2
table_not_activ = 3.
ELSE.
CLEAR nametab.
CLEAR nametab.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldname = 'NAME'.
nametab-intlen = 30.
nametab-fieldtext = 'Feldname'(101).
APPEND nametab.
nametab-fieldname = 'GROUP1'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe1'(102).
APPEND nametab.
nametab-fieldname = 'GROUP2'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe2'(103).
APPEND nametab.
nametab-fieldname = 'GROUP3'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe3'(104).
APPEND nametab.
nametab-fieldname = 'GROUP4'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe4'(105).
APPEND nametab.
nametab-fieldname = 'REQUIRED'.
nametab-intlen = 1.
nametab-fieldtext = 'Musseingabe'(106).
APPEND nametab.
nametab-fieldname = 'INPUT'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld eingabebereit'(107).
APPEND nametab.
nametab-fieldname = 'OUTPUT'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld wird angezeigt'(108).
APPEND nametab.
nametab-fieldname = 'INTENSIFIED'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld hellleuchtend'(109).
APPEND nametab.
nametab-fieldname = 'INVISIBLE'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld unsichtbar'(110).
APPEND nametab.
nametab-fieldname = 'LENGTH'.
nametab-datatype = 'HEX'.
nametab-inttype = 'X'.
nametab-intlen = 1.
nametab-fieldtext = 'Laenge des Feldes'(111).
APPEND nametab.
nametab-fieldname = 'ACTIVE'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld aktiv'(112).
APPEND nametab.
* NEW FIELDS IN SCREEN FOR 3.0
nametab-fieldname = 'DISPLAY_3D'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld 3-dimensional'(113).
APPEND nametab.
nametab-fieldname = 'VALUE_HELP'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld mit Wertehilfe'(114).
APPEND nametab.
nametab-fieldname = 'REQUEST'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Eingabe vorhanden (nur PAI)'(115).
APPEND nametab.
ENDIF.
subrc = sy-subrc.
IF sy-subrc > 3.
PERFORM exit.
ENDIF.
ENDFORM. "LOAD_TABLE
*---------------------------------------------------------------------*
* FORM EXIT *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM exit.
STOP.
ENDFORM. "EXIT
*&---------------------------------------------------------------------*
*& Form DATENELEMENTE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ELEMENTE text *
* <--P_TABELLEN text *
*----------------------------------------------------------------------*
FORM datenelemente USING elemente
CHANGING tabellen.
CLEAR s_element. REFRESH s_element.
CLEAR rollnames. REFRESH rollnames.
CLEAR it_el. REFRESH it_el.
CLEAR s_tab. REFRESH s_tab.
IF elemente = ' '.
PERFORM suchen.
ELSE.
SPLIT elemente AT ' ' INTO TABLE rollnames.
LOOP AT rollnames.
MOVE: 'I' TO s_element-sign,
'EQ' TO s_element-option.
s_element-low = rollnames.
APPEND s_element.
ENDLOOP.
SELECT DISTINCT tabname COUNT(*) INTO
(it_el-tabname, it_el-zaehler)
FROM dd03l WHERE rollname IN s_element
GROUP BY tabname.
APPEND it_el.
ENDSELECT.
LOOP AT it_el.
SELECT SINGLE * FROM dd02l WHERE tabname =
it_el-tabname.
MOVE dd02l-tabclass TO it_el-tabclass.
MODIFY it_el.
ENDLOOP.
LOOP AT it_el WHERE tabclass IN s_tab.
CONCATENATE it_el-tabname tabellen INTO tabellen
SEPARATED BY ' '
.
ENDLOOP.
ENDIF.
ENDFORM. " DATENELEMENTE
*&---------------------------------------------------------------------*
*& Form SUCHEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM suchen.
ENDFORM. " SUCHEN
*---------------------------------------------------------------------*
* FORM Dokuausgabe
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM dokuausgabe.
DATA: BEGIN OF it2 OCCURS 0.
INCLUDE STRUCTURE tline.
DATA: END OF it2.
DATA: BEGIN OF it3 OCCURS 0.
INCLUDE STRUCTURE tline.
DATA: END OF it3.
DATA rc.
TYPES: BEGIN OF t_it4,
rollname LIKE nametab-rollname,
text(50) TYPE c,
END OF t_it4.
DATA: it4 TYPE SORTED TABLE OF t_it4 WITH UNIQUE KEY
rollname WITH
HEADER LINE.
DATA: object LIKE dokhl-object.
DATA: header LIKE thead.
DATA: options LIKE itcpo.
DATA: bytes TYPE i.
DATA: it_otf TYPE STANDARD TABLE OF tline WITH
HEADER LINE.
DATA: it_pdf TYPE STANDARD TABLE OF tline WITH
HEADER LINE.
DATA: it_doc TYPE STANDARD TABLE OF docs WITH HEADER
LINE.
options-tdgetotf = 'X'.
REFRESH nametab.
nametab[] = nametab2[].
CALL FUNCTION 'DOCU_PRINT'
EXPORTING
dialog = ' '
form = 'P'
id = ''
langu = sy-langu
new_page = ' '
* object = ' '
operation = 'O'
printer = 'X'
typ = 'E'
TABLES
line = it3.
IF p_fbdoku <> 'X'.
CALL FUNCTION 'CLOSE_FORM'.
ENDIF.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
* APPLICATION = 'TX'
* ARCHIVE_INDEX =
* ARCHIVE_PARAMS =
* DEVICE = 'PRINTER'
dialog = p_dialog
form = 'S_DOCU_PRINT'
* LANGUAGE = SY-LANGU
options = options
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJECT =
* RAW_DATA_INTERFACE = '*'
* IMPORTING
* LANGUAGE =
* NEW_ARCHIVE_PARAMS =
* RESULT =
EXCEPTIONS
canceled = 1
device = 2
form = 3
options = 4
unclosed = 5
mail_options = 6
archive_error = 7
invalid_fax_number = 8
more_params_needed_in_batch = 9
spool_error = 10
codepage = 11
OTHERS = 12 .
IF sy-subrc = 0.
LOOP AT nametab.
* Prüfen auf Ausgabe doppelter Dokumentationen.
READ TABLE it4 WITH KEY rollname =
nametab-rollname.
IF sy-subrc = 0.
REFRESH it2.
it2-tdformat = 'ZH'.
CONCATENATE: nametab-tabname '-'
nametab-fieldname INTO
it2-tdline.
CONCATENATE: it2-tdline ' (Hilfetext siehe: '
it4-text ' ) '
INTO it2-tdline SEPARATED BY ' '.
APPEND it2.
CALL FUNCTION 'WRITE_FORM_LINES'
EXPORTING
function = 'SET'
header = header
TABLES
lines = it2
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
REFRESH it2.
it2-tdformat = 'ZH'.
CONCATENATE: nametab-tabname '-'
nametab-fieldname INTO
it2-tdline.
APPEND it2.
CALL FUNCTION 'WRITE_FORM_LINES'
EXPORTING
function = 'SET'
header = header
TABLES
lines = it2
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
object = nametab-rollname.
IF object <> ''.
REFRESH it_otf. CLEAR it_otf.
CALL FUNCTION 'DOCU_GET'
EXPORTING
id = 'DE'
langu = sy-langu
object = object
typ = 'E'
* IMPORTING
* HEAD = PHEAD
TABLES
line = it_otf
EXCEPTIONS
ret_code = 1.
IF sy-subrc = 0.
CALL FUNCTION 'DOCU_PRINT'
EXPORTING
dialog = ' '
form = 'P'
id = 'DE'
langu = sy-langu
new_page = 'X'
object = object
operation = 'C'
printer = 'X'
typ = 'E'
TABLES
line = it3.
REFRESH it_otf. CLEAR it_otf.
CALL FUNCTION 'DOCU_GET'
EXPORTING
id = 'DE'
langu = sy-langu
object = object
typ = 'E'
* IMPORTING
* HEAD = PHEAD
TABLES
line = it_otf
EXCEPTIONS
ret_code.
ENDIF.
ENDIF.
DESCRIBE TABLE it_otf LINES i.
IF i > 0.
REFRESH it2. CLEAR it2.
it2-tdformat = '*'.
it2-tdline = '.'.
APPEND it2.
APPEND it2.
CALL FUNCTION 'WRITE_FORM_LINES'
EXPORTING
function = 'SET'
header = header
TABLES
lines = it2
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Prüfen auf Ausgabe doppelter Dokumentationen.
READ TABLE it4 WITH KEY rollname =
nametab-rollname
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
it4-rollname = nametab-rollname.
CONCATENATE: nametab-tabname '-'
nametab-fieldname INTO
it4-text.
INSERT it4 INTO TABLE it4.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR it_otf. REFRESH it_otf.
CLEAR it_pdf. REFRESH it_pdf.
options-tdgetotf = 'X'.
CALL FUNCTION 'CLOSE_FORM'
* IMPORTING
* RESULT =
* RDI_RESULT =
TABLES
otfdata = it_otf
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SEND_ERROR = 3
* SPOOL_ERROR = 4
* CODEPAGE = 5
* OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER
sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Löschen der Kopf und Fußzeilen im OTF Format.
DATA: ft.
rc = '0'. ft = 'X'.
LOOP AT it_otf.
IF it_otf(2) = 'IN'.rc = '1'.ENDIF.
IF it_otf = 'IN02MAIN' OR it_otf(2) = '//'.
rc = '0'. ft = ''.
ENDIF
.
IF rc = '1' AND ft = ''.
IF it_otf(2) <> 'IN'
AND it_otf(2) <> 'EP'
AND it_otf(2) <> 'OP'.
DELETE it_otf.
ENDIF.
ENDIF.
ENDLOOP.
DESCRIBE TABLE it_otf LINES i.
IF i = 0. EXIT. ENDIF.
CALL FUNCTION 'CONVERT_OTF_2_PDF'
EXPORTING
use_otf_mc_cmd = ''
* ARCHIVE_INDEX =
IMPORTING
bin_filesize = bytes
TABLES
otf = it_otf
doctab_archive = it_doc
lines = it_pdf
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2
OTHERS = 3 .
IF sy-subrc = 0.
file = filename.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = bytes
filename = file
filetype = 'BIN'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* IMPORTING
* FILELENGTH =
TABLES
data_tab = it_pdf
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22
.
IF sy-subrc = 0.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
document = 'X'
* CD = ' '
* COMMANDLINE = ' '
* INFORM = ' '
program = filename
* STAT = ' '
* WINID = ' '
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
* IMPORTING
* RBUFF =
* EXCEPTIONS
* FRONTEND_ERROR = 1
* NO_BATCH = 2
* PROG_NOT_FOUND = 3
* ILLEGAL_OPTION = 4
* GUI_REFUSE_EXECUTE = 5
* OTHERS = 6
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "Dokuausgabe
*---------------------------------------------------------------------*
* FORM FBDOKUS
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
FORM fbdokus.
DATA: BEGIN OF it2 OCCURS 0.
INCLUDE STRUCTURE tline.
DATA: END OF it2.
DATA: BEGIN OF it3 OCCURS 0.
INCLUDE STRUCTURE tline.
DATA: END OF it3.
TYPES: BEGIN OF t_it4,
rollname LIKE nametab-rollname,
text(50) TYPE c,
END OF t_it4.
DATA: it4 TYPE SORTED TABLE OF t_it4 WITH UNIQUE KEY
rollname WITH
HEADER LINE.
DATA: object LIKE dokhl-object.
DATA: header LIKE thead.
DATA: options LIKE itcpo.
DATA: bytes TYPE i.
DATA: it_otf TYPE STANDARD TABLE OF tline WITH
HEADER LINE.
DATA: it_pdf TYPE STANDARD TABLE OF tline WITH
HEADER LINE.
DATA: it_doc TYPE STANDARD TABLE OF docs WITH HEADER
LINE.
options-tdgetotf = 'X'.
REFRESH nametab.
nametab[] = nametab2[].
object = 'TDREFOBJ'.
CALL FUNCTION 'DOCU_PRINT'
EXPORTING
dialog = ' '
form = 'P'
id = ''
langu = sy-langu
new_page = ' '
object = object
operation = 'O'
printer = 'X'
typ = 'E'
TABLES
line = it3.
CALL FUNCTION 'CLOSE_FORM'.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
* APPLICATION = 'TX'
* ARCHIVE_INDEX =
* ARCHIVE_PARAMS =
* DEVICE = 'PRINTER'
dialog = p_dialog
form = 'S_DOCU_PRINT'
* LANGUAGE = SY-LANGU
options = options
* MAIL_SENDER =
* MAIL_RECIPIENT =
* MAIL_APPL_OBJECT =
* RAW_DATA_INTERFACE = '*'
* IMPORTING
* LANGUAGE =
* NEW_ARCHIVE_PARAMS =
* RESULT =
EXCEPTIONS
canceled = 1
device = 2
form = 3
options = 4
unclosed = 5
mail_options = 6
archive_error = 7
invalid_fax_number = 8
more_params_needed_in_batch = 9
spool_error = 10
codepage = 11
OTHERS = 12 .
IF sy-subrc = 0.
LOOP AT it_fb.
REFRESH it2.
it2-tdformat = 'ZH'.
it2-tdline = it_fb.
APPEND it2.
CALL FUNCTION 'WRITE_FORM_LINES'
EXPORTING
function = 'SET'
header = header
TABLES
lines = it2
EXCEPTIONS
OTHERS = 9.
object = it_fb.
IF object <> ''.
CALL FUNCTION 'DOCU_PRINT'
EXPORTING
dialog = ' '
form = 'P'
id = 'FU'
langu = sy-langu
new_page = 'X'
object = object
operation = 'C'
printer = 'X'
typ = 'E'
TABLES
line = it3.
REFRESH it_otf. CLEAR it_otf.
CALL FUNCTION 'DOCU_GET'
EXPORTING
id = 'DE'
langu = sy-langu
object = object
typ = 'E'
* IMPORTING
* HEAD = PHEAD
TABLES
line = it_otf
EXCEPTIONS
ret_code.
ENDIF.
DESCRIBE TABLE it_otf LINES i.
IF i > 0.
REFRESH it2. CLEAR it2.
it2-tdformat = '*'.
it2-tdline = '.'.
APPEND it2.
APPEND it2.
CALL FUNCTION 'WRITE_FORM_LINES'
EXPORTING
function = 'SET'
header = header
TABLES
lines = it2
EXCEPTIONS
OTHERS = 9.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR it_otf. REFRESH it_otf.
CLEAR it_pdf. REFRESH it_pdf.
options-tdgetotf = 'X'.
CALL FUNCTION 'CLOSE_FORM'
* IMPORTING
* RESULT =
* RDI_RESULT =
TABLES
otfdata = it_otf
* EXCEPTIONS
* UNOPENED = 1
* BAD_PAGEFORMAT_FOR_PRINT = 2
* SEND_ERROR = 3
* SPOOL_ERROR = 4
* CODEPAGE = 5
* OTHERS = 6
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER
sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
* Löschen der Kopf und Fußzeilen im OTF Format.
DATA: rc, ft.
rc = '0'. ft = 'X'.
LOOP AT it_otf.
IF it_otf(2) = 'IN'.rc = '1'.ENDIF.
IF it_otf = 'IN02MAIN' OR it_otf(2) = '//'.
rc = '0'. ft = ''.
ENDIF
.
IF rc = '1' AND ft = ''.
IF it_otf(2) <> 'IN'
AND it_otf(2) <> 'EP'
AND it_otf(2) <> 'OP'.
DELETE it_otf.
ENDIF.
ENDIF.
ENDLOOP.
DESCRIBE TABLE it_otf LINES i.
IF i = 0. EXIT. ENDIF.
CALL FUNCTION 'CONVERT_OTF_2_PDF'
EXPORTING
use_otf_mc_cmd = ''
* ARCHIVE_INDEX =
IMPORTING
bin_filesize = bytes
TABLES
otf = it_otf
doctab_archive = it_doc
lines = it_pdf
EXCEPTIONS
err_conv_not_possible = 1
err_otf_mc_noendmarker = 2
OTHERS = 3 .
IF sy-subrc = 0.
file = fb_doc.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = bytes
filename = file
filetype = 'BIN'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* IMPORTING
* FILELENGTH =
TABLES
data_tab = it_pdf
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22
.
IF sy-subrc = 0.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
document = 'X'
* CD = ' '
* COMMANDLINE = ' '
* INFORM = ' '
program = fb_doc
* STAT = ' '
* WINID = ' '
* OSMAC_SCRIPT = ' '
* OSMAC_CREATOR = ' '
* WIN16_EXT = ' '
* EXEC_RC = ' '
* IMPORTING
* RBUFF =
* EXCEPTIONS
* FRONTEND_ERROR = 1
* NO_BATCH = 2
* PROG_NOT_FOUND = 3
* ILLEGAL_OPTION = 4
* GUI_REFUSE_EXECUTE = 5
* OTHERS = 6
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM. "FB Dokus
*---------------------------------------------------------------------*
* FORM get_trace
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM get_trace.
FIELD-SYMBOLS: <f>.
DATA: filter_wa TYPE sqlt_filter.
DATA: trace_filter TYPE sqlt_trace_filter.
DATA: filename(sqlt_l_filename).
* Initialisieren
CLEAR: filter_wa, sql_trace_tab, sql_bheader_tab, trace_filter.
REFRESH: sql_trace_tab, sql_bheader_tab.
REFRESH: g_selopttab_tab.
DATA: wa TYPE sqlt_trecord.
* Texte für die Detailanzeige des Enqueue-Traces
DATA: entry LIKE rstrentrkl.
CLEAR entry.
DATA: tmp1 TYPE sqlt_tab_hier,
tmp2 TYPE STANDARD TABLE OF dd03p WITH HEADER LINE,
tmp3 TYPE STANDARD TABLE OF dd12v WITH HEADER LINE,
tmp4 TYPE STANDARD TABLE OF dd26v WITH HEADER LINE.
CALL FUNCTION 'SQLT_DDIC_INFO_READ'
EXPORTING
name = 'TEST'
* IMPORTING
* TABLE_EX =
TABLES
hierarchie = tmp1[]
dd03p_all = tmp2[]
dd12v_all = tmp3[]
dd26v_tab = tmp4[]
EXCEPTIONS
error_no_active = 1
error_read_nametab = 2
error_read_view = 3
error_read_tabl = 4
error_read_index = 5
error_read_primkey = 6
error_read_pool = 7
OTHERS = 8
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
**
* CALL FUNCTION 'SQLT_DECODE_RFC_ENTRY'
* EXPORTING
* entry = entry
** IMPORTING
** SEC =
** MSEC =
** START_TIME =
** START_DATE =
** TCODE =
** LINKNUMBER =
** RETCODE =
** DURATION =
** L_STATEMENT =
** OFFSET =
** BYTES_SEND =
** BYTES_RECEIVE =
** RFC_TIME =
** REC_TYPE =
* .
*
*
*CALL FUNCTION 'PERFORMANCE_TRACE_OFF'
* EXPORTING
* TRACE_USER = SY-UNAME
* SQL_TRACE_OFF = 'X'
* ENQ_TRACE_OFF = 'X'
* RFC_TRACE_OFF = 'X'
* BUF_TRACE_OFF = 'X' .
* Tracefilenamen lesen
CALL FUNCTION 'NAME_OF_CURRENT_TRACE_FILE'
IMPORTING
pathname = filename.
ASSIGN ('(SAPLSSQ0)G_Filename') TO <f>.
<f> = filename.
* Setzen Filter
CALL FUNCTION 'SQLT_SET_SELECTIONS'
EXPORTING
starting_x = 30
starting_y = 1
IMPORTING
filter_wa = filter_wa
file_name = filename
trace_filter = trace_filter
EXCEPTIONS
user_cancel = 1
OTHERS = 2.
IF sy-subrc = 0.
** Auswerten des SQL-Traces
* CALL FUNCTION 'SQLT_GEN_TRACE_RECORDS'
* EXPORTING
* file_name = filename
* filter_wa = filter_wa
* trace_filter = trace_filter
** IMPORTING
* TABLES
* sql_trace_tab = sql_trace_tab
* EXCEPTIONS
* file_not_openable = 1
* abort = 3
* OTHERS = 4.
* Auswerten des SQL-Traces
CALL FUNCTION 'SQLT_GEN_TRACE_RECORDS_NEW'
EXPORTING
* filename = filename
filter_wa = filter_wa
trace_filter = trace_filter
* IMPORTING
TABLES
sql_trace_tab = sql_trace_tab
sql_bheader_tab = sql_bheader_tab
EXCEPTIONS
file_not_openable = 1
abort = 3
OTHERS = 4.
ENDIF.
LOOP AT sql_trace_tab INTO wa.
it_tab1-tabname = wa-tabname.
APPEND it_tab1.
ENDLOOP.
SORT it_tab1.
DELETE ADJACENT DUPLICATES FROM it_tab1.
LOOP AT it_tab1.
SELECT * FROM dd02l UP TO 1 ROWS WHERE tabname = it_tab1-tabname
AND tabclass = 'TRANSP'.
ENDSELECT.
IF sy-subrc <> 0.
DELETE it_tab1.
ENDIF.
ENDLOOP.
ENDFORM. "get_trace
*&--------------------------------------------------------------------*
*& Form guid_add
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->GUID text
* -->FIELDNR text
* -->EBENE text
*---------------------------------------------------------------------*
FORM guid_add USING value(guid)
value(fieldnr)
value(vorgaengerguid)
value(vorgaengerfeld).
DATA: i TYPE i.
DATA: text(200).
WRITE guid TO text.
i = STRLEN( text ).
SHIFT text LEFT DELETING LEADING space.
CLEAR: it_guids-guid16,it_guids-guid22,it_guids-guid32.
clear it_guid_ref.
IF i = 16.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
iv_guid_x16 = guid
* IV_GUID_C22 =
* IV_GUID_C32 =
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF i = 22.
it_guids-guid22 = text.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
* IV_GUID_X16 = guid
iv_guid_c22 = it_guids-guid22
* IV_GUID_C32 =
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF i = 32.
it_guids-guid32 = text.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
* IV_GUID_X16 = guid
* IV_GUID_C22 =
iv_guid_c32 = it_guids-guid32
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
text = it_guids-guid32.
IF text <> ''.
READ TABLE it_guids WITH KEY guid32 = text TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
* Neue Guid wurde gefunden und wird angehangen!!!
g_maxguids = g_maxguids + 1.
it_guids-nr = g_maxguids.
APPEND it_guids.
it_guid_ref-guid = g_maxguids.
ELSE.
it_guid_ref-guid = sy-tabix.
ENDIF.
ENDIF.
text = vorgaengerguid.
i = STRLEN( text ).
SHIFT text LEFT DELETING LEADING space.
CLEAR: it_guids-guid16,it_guids-guid22,it_guids-guid32.
IF i = 16.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
iv_guid_x16 = guid
* IV_GUID_C22 =
* IV_GUID_C32 =
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF i = 22.
it_guids-guid22 = text.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
* IV_GUID_X16 = guid
iv_guid_c22 = it_guids-guid22
* IV_GUID_C32 =
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF i = 32.
it_guids-guid32 = text.
CALL FUNCTION 'GUID_CONVERT'
EXPORTING
* IV_GUID_X16 = guid
* IV_GUID_C22 =
iv_guid_c32 = it_guids-guid32
IMPORTING
ev_guid_x16 = it_guids-guid16
ev_guid_c22 = it_guids-guid22
ev_guid_c32 = it_guids-guid32
EXCEPTIONS
no_unicode_support_yet = 1
parameters_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
text = it_guids-guid32.
IF text <> ''.
READ TABLE it_guids WITH KEY guid32 = text TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
it_guid_ref-father = sy-tabix.
ENDIF.
it_guid_ref-feld = fieldnr.
it_guid_ref-fatherfield = vorgaengerfeld.
APPEND it_guid_ref.
ENDIF.
ENDFORM. "guid_add
*&--------------------------------------------------------------------*
*& Form guid_join
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM guid_join.
DATA: i TYPE i.
data: l_tabix like sy-tabix.
i = 0.
LOOP AT tabs.
PERFORM load_table USING tabs-show.
LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
CLEAR dd03l.
SELECT * FROM dd03l UP TO 1 ROWS WHERE tabname =
nametab-tabname AND
fieldname =
nametab-fieldname AND
as4local = 'A'.
ENDSELECT.
IF ( nametab-datatype = 'RAW' AND
nametab-ddlen = 16 ) OR
nametab-datatype = 'CHAR' AND
( nametab-ddlen = 32 OR
nametab-ddlen = 22 ) AND
( nametab-fieldname CS 'GUID' OR
nametab-fieldname CS 'UUID' OR
dd03l-rollname CS 'GUID' OR
dd03l-rollname CS 'UUID' ) .
CLEAR it_guid_fields.
MOVE-CORRESPONDING nametab TO it_guid_fields.
i = i + 1.
it_guid_fields-nr = i.
APPEND it_guid_fields.
elseif not s_ffeld[] is initial and
nametab-fieldname in s_ffeld.
CLEAR it_guid_fields.
MOVE-CORRESPONDING nametab TO it_guid_fields.
i = i + 1.
it_guid_fields-nr = i.
APPEND it_guid_fields.
ENDIF.
ENDLOOP.
ENDLOOP.
* Es wurde alle GUID Felder und Tabellen ermittelt
if not p_guid is initial.
PERFORM guid_add USING p_guid 0 0 0.
endif.
WHILE g_maxguids > g_last_maxguids AND g_maxguids < 1500.
REFRESH it_guids2.
LOOP AT it_guids FROM g_last_maxguids TO g_maxguids.
it_guids2 = it_guids. APPEND it_guids2.
ENDLOOP.
g_last_maxguids = g_maxguids.
* it_guid2 enthält jetzt alle neu zu untersuchenden GUIDS!!!
LOOP AT it_guid_fields.
PERFORM guid_search USING it_guid_fields-tabname
it_guid_fields-fieldname
it_guid_fields-ddlen
it_guid_fields-nr.
ENDLOOP.
ENDWHILE.
* Löschen der Inaktivierten Guid-Beziehungen
loop at it_guids where inaktiv = 'X'.
l_tabix = sy-tabix.
delete it_guid_ref where father = l_tabix.
delete g_tabdata where guid_nr = l_tabix.
endloop.
PERFORM guid_join_ausgabe.
ENDFORM. "guid_join
*&--------------------------------------------------------------------*
*& Form guid_search
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->TABLE text
* -->FIELD text
* -->LAENGE text
*---------------------------------------------------------------------*
FORM guid_search USING value(table) value(field) value(laenge)
value(nr).
FIELD-SYMBOLS: <fs_wa> TYPE ANY.
FIELD-SYMBOLS: <fs_wa2> TYPE ANY.
FIELD-SYMBOLS: <fs2> TYPE ANY.
DATA: l_data(3000) TYPE c.
DATA: dref TYPE REF TO data.
DATA: BEGIN OF it_guid_fields2 OCCURS 0,
tabname TYPE tabname,
fieldname TYPE fieldname,
datatype TYPE datatype_d,
ddlen TYPE ddleng,
maxnr TYPE i,
nr TYPE i,
rc ,
END OF it_guid_fields2.
DATA: g_bed(255).
DATA: fname(200).
DATA: i TYPE i.
data: l_tabix like sy-tabix.
DATA: l_maxcounter type i.
DATA: text(200).
DATA: text2(200).
DATA: dref2 TYPE REF TO data.
CREATE DATA dref2 TYPE (table).
ASSIGN dref2->* TO <fs_wa>.
DATA: dref6 TYPE REF TO data.
CREATE DATA dref6 TYPE (table).
ASSIGN dref6->* TO <fs_wa2>.
REFRESH it_guid_fields2.
LOOP AT it_guid_fields WHERE tabname = table AND
fieldname <> field.
it_guid_fields2 = it_guid_fields.
APPEND it_guid_fields2.
ENDLOOP.
LOOP AT it_guids2 where inaktiv = ''.
l_tabix = sy-tabix.
CLEAR g_bed.
IF laenge = 16.
text = it_guids2-guid16.
if it_guids2-guid16 is initial. clear text. endif.
CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
CONCATENATE g_bed text '''' INTO g_bed.
ELSEIF laenge = 22.
text = it_guids2-guid22.
if it_guids2-guid22 is initial. clear text. endif.
CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
CONCATENATE g_bed it_guids2-guid22 '''' INTO g_bed.
ELSEIF laenge = 32.
text = it_guids2-guid32.
if it_guids2-guid32 is initial. clear text. endif.
CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
CONCATENATE g_bed it_guids2-guid32 '''' INTO g_bed.
else.
text = it_guids2-guid16.
if it_guids2-guid16 is initial. clear text. endif.
CONCATENATE field '= ''' INTO g_bed SEPARATED BY ' '.
CONCATENATE g_bed text '''' INTO g_bed.
ENDIF.
if text <> ''.
l_maxcounter = 0.
SELECT * FROM (table) INTO l_data UP TO p_maxg ROWS
WHERE (g_bed).
l_maxcounter = l_maxcounter + 1.
if l_maxcounter = p_maxg.
* Es wurde zu einer Guid, die maximale Anzahl einträge gefunden.
* Daher wird vermutet, daß es sich um eine irreführende Beziehung
* handelt. Es soll somit diese Guid inaktiviert werden!!!.
* Beispiel: Ein Konto verweist auf einen typischen Limitbetrag (SAP
AM)
* über eine GUID beziehung.
* Viele 1000 andere Konten verweisen auf den gleichen
Limitbetrag.
* Daher würde über eine solche GUID die vielen 1000 anderen
Konten
* plötzlich vom Join mitselektiert werden.
it_guids2-inaktiv = 'X'. modify it_guids2.
read table it_guids with key guid16 = it_guids2-guid16
guid22 = it_guids2-guid22
guid32 = it_guids2-guid32.
if sy-subrc = 0.
it_guids-inaktiv = 'X'. modify it_guids index sy-tabix.
endif.
endif.
<fs_wa> = l_data.
CLEAR rc.
LOOP AT g_tabdata WHERE TABLE = TABLE.
<fs_wa2> = g_tabdata-data.
IF <fs_wa> = <fs_wa2>.
rc = 'X'.
EXIT.
ENDIF.
ENDLOOP.
IF rc = ' '.
g_tabdata-table = table.
g_tabdata-data = l_data.
g_tabdata-guid_nr = l_tabix.
APPEND g_tabdata.
ENDIF.
* Alle anderen GUID Felder dieser Struktur abarbeiten
fname = '<FS_WA>-'.
CLEAR: text, text2.
fname+8 = field.
ASSIGN (fname) TO <fs2>.
IF sy-subrc = 0.
text2 = <fs2>.
ENDIF.
* aktuelle GUID bestimmen
CLEAR rc.
LOOP AT it_guid_fields2.
fname+8 = it_guid_fields2-fieldname.
ASSIGN (fname) TO <fs2>.
IF sy-subrc = 0.
text = <fs2>.
IF text <> text2 AND NOT <fs2> IS INITIAL.
* if g_maxguids = 1.
* read table it_guid_ref index 1.
* it_guid_ref-feld = nr.
* modify it_guid_ref index 1.
* endif.
rc = 'X'.
PERFORM guid_add USING text it_guid_fields2-nr text2 nr.
ENDIF.
ENDIF.
ENDLOOP.
IF rc = ''.
* Diese Tabelle hat keine weitern GUID Fremdschlüsselfelder
PERFORM guid_add USING '' 0 text2 nr.
ENDIF.
ENDSELECT.
endif.
ENDLOOP.
ENDFORM. "guid_search
*&--------------------------------------------------------------------*
*& Form guid_join_ausgabe
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM guid_join_ausgabe.
DATA: l_f LIKE it_guid_fields.
DATA: l_g TYPE guid_16.
DATA: f1(40), f2(40).
* Filtern von doppelten Einträgen
* DELETE it_guid_ref INDEX 1.
SORT it_guid_ref BY feld guid father fatherfield.
DELETE ADJACENT DUPLICATES FROM it_guid_ref
COMPARING feld guid fatherfield.
."father fatherfield.
* DATA: l_g like it_guid_ref.
* DATA: l_g2 like it_guid_ref.
* loop at it_guid_ref.
* clear it_guid_ref-father.
* if l_g2 = it_guid_ref.
* delete it_guid_ref.
* endif.
* l_g2 = l_g.
*l_g = it_guid_ref."alle doppelten ab dem dritten löschen (guid,
feld)
* endloop.
SORT it_guid_ref BY father feld guid.
LOOP AT it_guid_ref.
READ TABLE it_guid_ref WITH KEY father = it_guid_ref-guid
guid = it_guid_ref-father
fatherfield = it_guid_ref-feld
feld =
it_guid_ref-fatherfield
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
DELETE it_guid_ref INDEX sy-tabix.
ENDIF.
ENDLOOP.
* clear it_guid_ref-father.
* if l_g2 = it_guid_ref.
* delete it_guid_ref.
* endif.
* l_g2 = l_g.
*l_g = it_guid_ref."alle doppelten ab dem dritten löschen (guid,
feld)
* endloop.
WRITE: / 'Felder'.
ULINE.
LOOP AT it_guid_fields FROM 1.
WRITE: /
it_guid_fields-nr,
it_guid_fields-tabname,
it_guid_fields-fieldname.
ENDLOOP.
SKIP 2.
WRITE: / 'Guids'.
ULINE.
LOOP AT it_guids.
WRITE: /
it_guids-nr,
it_guids-guid16.
ENDLOOP.
SKIP 2.
FORMAT RESET.
WRITE: /50 ' Anzeig der GUID Verknüpfungen'.
ULINE.
WRITE:
/ 'Gef.GUID | In Feld |',
' Fremdschlüsselfeld |',
' FremdschlüsselGUID |',
'Langtext der Gefundenen GUID '.
ULINE.
LOOP AT it_guid_ref.
IF it_guid_ref-feld = 0. CLEAR it_guid_ref-guid. ENDIF.
CLEAR it_guid_fields.
IF it_guid_ref-feld > 0.
READ TABLE it_guid_fields INDEX it_guid_ref-feld.
l_f = it_guid_fields.
CONCATENATE l_f-tabname '-' l_f-fieldname INTO f1.
ENDIF.
CLEAR it_guid_fields.
IF it_guid_ref-fatherfield > 0.
READ TABLE it_guid_fields INDEX it_guid_ref-fatherfield.
l_f = it_guid_fields.
CONCATENATE l_f-tabname '-' l_f-fieldname INTO f2.
ENDIF.
CLEAR it_guids.
READ TABLE it_guids INDEX it_guid_ref-guid.
l_g = it_guids-guid16.
CLEAR it_guids.
READ TABLE it_guids INDEX it_guid_ref-father.
WRITE:
/5(3) it_guid_ref-father,' |',
(3) it_guid_ref-fatherfield,f2,'|',
(3) it_guid_ref-feld,f1,'|',
(3) it_guid_ref-guid,l_g,'|',
it_guid_ref-father, it_guids-guid16.
ENDLOOP.
ULINE.
SKIP 2.
ENDFORM. "guid_join_ausgabe
*&--------------------------------------------------------------------*
*& Form guid_join_datenausgabe
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
FORM guid_join_datenausgabe.
DATA: fields2(1500) TYPE c.
SKIP 2.
LOOP AT tabs.
READ TABLE g_tabdata WITH KEY table = tabs-show.
IF sy-subrc = 0.
* Daten dieser Tabelle in eine andere temporäre übertragen
REFRESH g_tabdata2.
LOOP AT g_tabdata WHERE TABLE = TABS-SHOW.
MOVE-CORRESPONDING g_tabdata TO g_tabdata2.
APPEND g_tabdata2.
ENDLOOP.
* sort g_tabdata2.
* DELETE ADJACENT DUPLICATES FROM g_tabdata2 COMPARING data.
* PERFORM load_table USING tabs-show.
* CLEAR fields2.
* LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
* CONCATENATE fields2 nametab-fieldname INTO fields2 SEPARATED BY ' '.
* ENDLOOP.
* SHIFT fields2 LEFT DELETING LEADING space.
SKIP 2.
WRITE: / ' Tabelle: ',tabs-show.
* PERFORM init(z_tab)
* USING tabs-show
* '' " fields2
* ' '
* ' ' " Hides
* ' ' " Referenzen
* ' ' " Checkboxen
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
*
* PERFORM print_tab(z_tab) TABLES g_tabdata2[].
NEW-PAGE LINE-SIZE 1250.
PERFORM print_wide_table(z_tab) TABLES g_tabdata2[]
USING 850
tabs-show
' '
' ' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
SKIP.
ENDIF.
ENDLOOP.
ENDFORM. "guid_join_ausgabe
---------------------------------------------------------------------
REPORT z_tab NO STANDARD PAGE HEADING LINE-SIZE 255.
* Öffentliche Prozeduren:
* INIT "INIT für die Nachfolgende Prozeduren
* INIT muß immer als erstes für jede neue Struktur
* aufgerufen werden!
* print_tab "Ausgabe einer ganzen Tabelle auf dem Bildschirm
* kopfausgabe "Ausgabe eines Tabellenkopfes
* PRINT_LINE "Ausgabe nur einer einzelnen Strukturzeile
* PRINT_LINE2 "Ausgabe der Struckurzeile in ein Textfeld
* PRINT_ULINE "Ausgabe eines Unterstrichs in Tabellenlänge
* XLS_start "Ausgabe der Tabelle als EXCEL Datei + Start von excel
* XLS_MAIL "Ausgabe der Tabelle per SAPMAIL (XLS Datei)
(Batchfähig)
* Die Prozeduren können aus anderen Programmen genau wie in den
* nachfolgenden Beispielen aufgerufen werden.
* Beim Aufruf aus einem anderen Programm aber bitte immer
* den Reportnamen in Klammern hinten anfügen. Beispiel:
* Perform Init(Z_TAB) USING ....
TABLES: t001, trdir.
FIELD-SYMBOLS:
<fs_wa> TYPE ANY,
<fs_field> TYPE ANY,
<fs_field2> TYPE ANY.
DATA: BEGIN OF g_transl,
t(1) TYPE c VALUE '|',
x(1) TYPE x VALUE '09',
END OF g_transl.
DATA: l_tab_dfies TYPE STANDARD TABLE OF dfies.
DATA: text255(1950).
DATA: tabix LIKE sy-tabix.
FIELD-SYMBOLS: <l_wrk_dfies> TYPE dfies.
FIELD-SYMBOLS: <l_wrk_dfies2> TYPE dfies.
DATA:
subrc LIKE sy-subrc,
tab_len LIKE sy-fdpos,
tabname LIKE dntab-tabname,
tabfield(21),
include LIKE sy-repid,
program LIKE sy-repid.
DATA BEGIN OF nametab OCCURS 0.
INCLUDE STRUCTURE dntab.
DATA: rollname LIKE ddftx-rollname.
DATA END OF nametab.
DATA: BEGIN OF l_f OCCURS 0,
name(40) TYPE c,
END OF l_f.
DATA: BEGIN OF it_fields OCCURS 0,
name(40) TYPE c,
text(40) TYPE c,
laenge TYPE i,
case TYPE c,
reffield LIKE dfies-reffield,
datatype LIKE dfies-datatype,
position LIKE dfies-position,
position2 LIKE dfies-position,
offset TYPE i,
END OF it_fields.
DATA: BEGIN OF it_fields2 OCCURS 0,
name(40) TYPE c,
text(40) TYPE c,
laenge TYPE i,
case TYPE c,
reffield LIKE dfies-reffield,
datatype LIKE dfies-datatype,
position LIKE dfies-position,
position2 LIKE dfies-position,
offset TYPE i,
END OF it_fields2.
DATA: BEGIN OF it_names OCCURS 0,
name(40) TYPE c,
END OF it_names.
DATA: BEGIN OF it_hides OCCURS 0,
name(40) TYPE c,
END OF it_hides.
DATA: BEGIN OF it_check OCCURS 0,
name(40) TYPE c,
END OF it_check.
DATA: BEGIN OF it_ref OCCURS 0,
name(40) TYPE c,
END OF it_ref.
DATA: BEGIN OF it_sum OCCURS 0,
name(40) TYPE c,
position LIKE dfies-position,
position2 LIKE dfies-position,
typ(1),
END OF it_sum.
DATA: BEGIN OF it_group OCCURS 0,
gruppe TYPE i,
position LIKE dfies-position,
END OF it_group.
* TABELLEN INTERNE VERWENDUNG
DATA: BEGIN OF it_sum_einh OCCURS 0,
typ, " 1 = Normal, 2 = T100 Bezug
position2 LIKE dfies-position,
END OF it_sum_einh.
TYPES: BEGIN OF t_sum_erg,
gruppe TYPE i,
einheiten(250),
position LIKE dfies-position,
einheit(5) TYPE c,
wert TYPE p DECIMALS 4,
END OF t_sum_erg.
DATA: it_sum_erg TYPE SORTED TABLE OF t_sum_erg WITH HEADER LINE
WITH NON-UNIQUE KEY gruppe einheiten position.
DATA: BEGIN OF it_group_last OCCURS 0,
text(500) TYPE c,
l_dummy(1950) TYPE c,
END OF it_group_last.
* MAIL Verarbeitung -----------------------------------
DATA: docdata LIKE sodocchgi1 OCCURS 0 WITH HEADER LINE.
DATA: reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE.
DATA: it_text LIKE solisti1 OCCURS 0 WITH HEADER LINE.
DATA: objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE.
DATA: objhead LIKE solisti1 OCCURS 0 WITH HEADER LINE.
DATA: sent LIKE sonv-flag OCCURS 0 WITH HEADER LINE.
DATA: new_object_id LIKE sofolenti1-object_id OCCURS 0 WITH HEADER
LINE.
DATA: tab_lines LIKE sy-tabix.
* MAIL Verarbeitung -----------------------------------
DATA: text(1950).
DATA: zeile(1950).
DATA: laenge TYPE i.
DATA: g_initline(1950).
DATA: gsort(900).
DATA: gstr(90) TYPE c. " Name der Sturkutr im globalen Gedächtnis
DATA: g_max_groups TYPE i.
DATA: g_sum.
PARAMETERS: xlsstart AS CHECKBOX.
PARAMETERS: e_mail AS CHECKBOX.
START-OF-SELECTION.
* BEISPIEL 1
* --------------------------------------------------------------------
DATA: i TYPE i.
DATA: BEGIN OF it_dummy1 OCCURS 0.
INCLUDE STRUCTURE e070.
DATA: END OF it_dummy1.
it_dummy1-as4user = 'TEST'.
APPEND it_dummy1.
WRITE: / 'Beispiel 1'.
NEW-LINE.
PERFORM init
USING 'E070'
'trkorr trstatus as4user'
'- Status'
'trkorr' " Hides
' ' " Referenzen
' ' " Checkboxen
' ' " SORT
' ' " SUM
' ' . " group
PERFORM print_tab TABLES it_dummy1[].
SKIP 1.
* Beispiel 2
* --------------------------------------------------------------------
* Ausgabe der zweiten Beispieltabelle in Einzelzeilen
* DATA: BEGIN OF it_dummy2 OCCURS 0.
* INCLUDE STRUCTURE mara.
* DATA: END OF it_dummy2.
*
* it_dummy2-matnr = '000003999'.
* it_dummy2-entar = 'X'.
* it_dummy2-brgew = 1250.
* it_dummy2-ersda = '20010101'.
* it_dummy2-gewei = 'KG'.
* it_dummy2-wesch = 100.
* it_dummy2-meins = 'ST'.
*
* APPEND it_dummy2.
* APPEND it_dummy2.
* it_dummy2-entar = ''.
* it_dummy2-brgew = 12500.
* it_dummy2-wesch = 100.
* it_dummy2-meins = 'L'.
*
* APPEND it_dummy2.
*
* it_dummy2-brgew = 1250.
* it_dummy2-wesch = 300.
* it_dummy2-meins = 'L'.
*
* APPEND it_dummy2.
* APPEND it_dummy2.
*
* it_dummy2-ersda = '20010601'.
* APPEND it_dummy2.
* APPEND it_dummy2.
* APPEND it_dummy2.
* it_dummy2-matnr = '000004711'.
* APPEND it_dummy2.
* APPEND it_dummy2.
*
*
*
*
*
* WRITE: / 'Beispiel 2'.
* NEW-LINE.
* PERFORM init
* USING 'MARA'
* 'entar Matnr ersda aenam meins BRGEW(10) gewei'
* 'Mark - Datum - Einheit'
* 'Matnr brgew gewei' "HIDES
* 'test/test brgew/gewei xxx' "Referenzen
* 'entar' "Checkbox
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
* PERFORM kopfausgabe USING 'X' ' ' CHANGING zeile.
* LOOP AT it_dummy2.
* PERFORM print_line USING it_dummy2.
* ENDLOOP.
* NEW-LINE.
* PERFORM print_uline.
*
*
*
** Beispiel 3
** --------------------------------------------------------------------
** Tabelle mit Endsumme und Summen für Gruppenstufen
** --------------------------------------------------------------------
*
*
* WRITE: / 'Beispiel 3'.
* NEW-LINE.
*
* PERFORM init
* USING 'MARA'
* 'entar Matnr ersda aenam BRGEW(10) gewei WESCH meins'
* 'M - Datum - Einh.'
* 'Matnr brgew gewei' "HIDES
* 'test/test brgew/gewei xxx' "Referenzen
* 'entar' "Checkbox
* 'matnr ersda ' " SORT
* 'brgew wesch ' " SUM
* 'matnr matnr/ersda ' " group
* .
*
* PERFORM print_tab TABLES it_dummy2[].
* SKIP 1.
*
*
*
*
** Beispiel 4
** --------------------------------------------------------------------
** Ausgabe der zweiten Beispieltabelle in Einzelzeilen
** Diese jedoch über ein Rückgabefeld
*
* SKIP 1.
* WRITE: / 'Beispiel 4'.
* NEW-LINE.
* PERFORM init
* USING 'MARA'
* 'entar Matnr ersda aenam meins BRGEW(10) gewei'
* 'Mark - Datum - Einheit'
* 'Matnr brgew gewei' "HIDES
* 'test/test brgew/gewei xxx' "Referenzen
* 'entar' "Checkbox
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
* PERFORM kopfausgabe USING 'X' '' CHANGING zeile.
* LOOP AT it_dummy2.
* PERFORM print_line2 USING it_dummy2
* CHANGING zeile.
** condense zeile no-gaps.
** TRANSLATE zeile USING '|;'.
* WRITE: / zeile.
* ENDLOOP.
* NEW-LINE.
* PERFORM print_uline.
*
*
*
** Beispiel 5
** --------------------------------------------------------------------
** Download der zweiten Beispieltabelle als XLS Datei + XLS Start
*
* PERFORM init
* USING 'MARA'
* 'entar Matnr ersda aenam meins BRGEW(10) gewei'
* 'Mark - Datum - Einheit'
* 'Matnr brgew gewei' "HIDES
* 'test/test brgew/gewei xxx' "Referenzen
* 'entar' "Checkbox
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
* IF xlsstart = 'X'.
* PERFORM xls_start TABLES it_dummy2
* USING 'c:\temp\t1.xls' 'X' 'X'.
*
* ENDIF.
*
*
** Beispiel 6
** --------------------------------------------------------------------
** Da im Batch kein PC Download möglich ist, soll eine solche Datei im
** XLS Format per SAP Mail an einen oder mehrere User versendet
werden.
*
* PERFORM init
* USING 'MARA'
* 'entar Matnr ersda aenam meins BRGEW(10) gewei'
* 'Mark - Datum - Einheit'
* 'Matnr brgew gewei' "HIDES
* 'test/test brgew/gewei xxx' "Referenzen
* 'entar' "Checkbox
* ' ' " SORT
* ' ' " SUM
* ' ' . " group
*
* IF e_mail = 'X'.
* PERFORM xls_mail TABLES it_dummy2
* USING 'Testmail vom mini ALV' " titel
* sy-uname " empfaenger
* '' " mailtyp (SAPMAIL =
Default)
* 'X' " Express
* 'X'. " header (Kopfzeile
ausgeben)
.
*
*
* ENDIF.
*
* EXIT.
*
*---------------------------------------------------------------------*
* FORM Kopfausgabe
*---------------------------------------------------------------------*
* Print: = 'X' ---> Bildschirmausgabe.
* Sonst wird nur die Kopfzeile im Textfeld zurückgegeben.
FORM kopfausgabe USING print
full_size
CHANGING line.
DATA: l_dummy_string(1950).
DATA: l_tmp_string(1950).
DATA: i TYPE i.
DATA: l2 TYPE i.
l_dummy_string = '|'.
laenge = 1.
LOOP AT it_fields.
IF it_fields-text = '-'.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0.
WRITE <l_wrk_dfies>-fieldname TO l_tmp_string.
i = <l_wrk_dfies>-outputlen.
IF it_fields-laenge <> 0.
i = it_fields-laenge.
ENDIF.
IF i > 100. i = 100. ENDIF.
IF full_size = 'X'. i = STRLEN( l_tmp_string ). ENDIF.
TRANSLATE l_tmp_string USING ' #'.
CONCATENATE l_dummy_string l_tmp_string(i) '|'
INTO l_dummy_string.
laenge = laenge + i + 1.
ENDIF.
ELSE.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0.
WRITE it_fields-text TO l_tmp_string.
i = <l_wrk_dfies>-outputlen.
IF it_fields-laenge <> 0.
i = it_fields-laenge.
ENDIF.
IF full_size = 'X'. i = STRLEN( l_tmp_string ). ENDIF.
IF i > 100. i = 100. ENDIF.
TRANSLATE l_tmp_string USING ' #'.
CONCATENATE l_dummy_string l_tmp_string(i) '|'
INTO l_dummy_string.
laenge = laenge + i + 1.
ENDIF.
ENDIF.
ENDLOOP.
TRANSLATE l_dummy_string USING '# '.
line = l_dummy_string.
l2 = laenge.
IF print = 'X'.
ULINE AT 0(laenge).
PERFORM write_long USING line 1.
* IF laenge > 250.
* WRITE: / l_dummy_string(250) COLOR 1 NO-GAP.
* laenge = laenge - 250.
* l_dummy_string = l_dummy_string+250.
* IF laenge > 250.
* WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
* laenge = laenge - 250.
* l_dummy_string = l_dummy_string+250.
* ENDIF.
* IF laenge > 250.
* WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
* laenge = laenge - 250.
* l_dummy_string = l_dummy_string+250.
* ENDIF.
* IF laenge > 250.
* WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
* laenge = laenge - 250.
* l_dummy_string = l_dummy_string+250.
* ELSE.
* WRITE: l_dummy_string(laenge) COLOR 1 NO-GAP.
* ENDIF.
*
*
* ELSE.
* WRITE: / l_dummy_string(laenge) COLOR 1.
* ENDIF.
NEW-LINE.
ULINE AT 0(l2).
ENDIF.
ENDFORM. "Kopfausgabe
*---------------------------------------------------------------------*
* FORM print_line
*
*---------------------------------------------------------------------*
* Es erfolgt eine Bildschirmausgabe.
FORM print_line USING u_str.
DATA: fields2(1950) TYPE c.
DATA: i TYPE i.
DATA: offset TYPE i.
DATA: i2 TYPE i.
DATA: rc TYPE i.
DATA: dref TYPE REF TO data.
CREATE DATA dref TYPE (gstr).
ASSIGN dref->* TO <fs_wa>.
ASSIGN u_str TO <fs_wa>.
offset = 2.
WRITE: / g_initline(laenge).
LOOP AT it_fields.
ASSIGN COMPONENT it_fields-position
OF STRUCTURE <fs_wa> TO <fs_field>.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
CASE it_fields-case.
WHEN '1'.
WRITE AT offset <fs_field>(1) AS CHECKBOX.
offset = offset + 2.
WHEN '2'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE: AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '3'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
WHEN '4'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge)
.
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '5'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
offset = offset + it_fields-laenge + 1.
WHEN '6'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '7'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> UNIT <fs_field2>.
offset = offset + it_fields-laenge + 1.
WHEN '8'.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '9'.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
WHEN OTHERS.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
* WRITE: / 'FEHLER !!!'.
ENDCASE.
ENDLOOP.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
ENDFORM. "print_line
*---------------------------------------------------------------------*
* FORM print_line2
*---------------------------------------------------------------------*
* Anstelle der Prozedur Print_line gibt diese keine Informationen auf
* dem Bildschirm aus, sondern diese in einem Textfeld zurück.
FORM print_line2 USING u_str
CHANGING line.
DATA: fields2(3200) TYPE c.
DATA: i TYPE i.
DATA: i2 TYPE i.
DATA: offset TYPE i.
DATA: ausgabe(3200) TYPE c.
DATA: rueck(3200) TYPE c.
DATA: rc TYPE i.
DATA: dref TYPE REF TO data.
DATA: dref3 TYPE REF TO data.
CREATE DATA dref3 TYPE (gstr).
ASSIGN dref3->* TO <fs_wa>.
DATA: dummystr(3200).
dummystr = u_str.
<fs_wa> = dummystr.
CLEAR t001.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
offset = 1.
rueck = g_initline.
LOOP AT it_fields.
ASSIGN COMPONENT it_fields-position
OF STRUCTURE <fs_wa> TO <fs_field>.
CASE it_fields-case.
WHEN '1'.
rueck+offset(1) = <fs_field>(1). offset = offset + 2.
WHEN '2'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: <fs_field> TO text(it_fields-laenge).
rueck+offset(it_fields-laenge) = text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '3'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: <fs_field> TO text.
rueck+offset(it_fields-laenge) = text.
offset = offset + it_fields-laenge + 1.
WHEN '4'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge)
.
rueck+offset(it_fields-laenge) = text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '5'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> CURRENCY <fs_field2> TO text left-justified.
rueck+offset(it_fields-laenge) = text.
offset = offset + it_fields-laenge + 1.
WHEN '6'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields-laenge).
rueck+offset(it_fields-laenge) = text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '7'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> UNIT <fs_field2> TO text.
rueck+offset(it_fields-laenge) = text.
offset = offset + it_fields-laenge + 1.
WHEN '8'.
WRITE: <fs_field> TO text(it_fields-laenge).
rueck+offset(it_fields-laenge) = text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '9'.
WRITE: <fs_field> TO text.
rueck+offset(it_fields-laenge) = text.
offset = offset + it_fields-laenge + 1.
WHEN OTHERS.
WRITE: <fs_field> TO text.
rueck+offset(it_fields-laenge) = text.
offset = offset + it_fields-laenge + 1.
* WRITE: / 'FEHLER !!!'.
ENDCASE.
ENDLOOP.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
line = rueck.
ENDFORM. "print_line2
*---------------------------------------------------------------------*
* FORM print_uline
*
*---------------------------------------------------------------------*
FORM print_uline.
ULINE AT 0(laenge).
ENDFORM. "print_uline
*---------------------------------------------------------------------*
* FORM init
*
*---------------------------------------------------------------------*
* Initialisieren der Ausgabe, lesen der Strukturen,
* Vorverarbeiten der Parameter.
*
* SIEHE: PRINT_TAB
*
*
FORM init USING str "Name der Struktur
pfields "Anzuzeigende Felder
names "Benennung der Felder in der Kopfzeile
hides "Per Hide zu hinterlegende Felder
ref "UNIT oder
checkbox "Als Checkbox anzuzeigende Felder.
sort2 "Sortierreihenfolge
sum "Felder die zu summieren sind
group. "Gruppenstufen
DATA: fields(3000).
fields = pfields.
* STR: Name der übergebenen Struktur (muß im DDIC existieren)
* Fields: Auszugebenede Felder der Struktur. Die einzelnen Felder
* werden durch Leerzeichen getrennt.
* Ist am Ende des Feldes eine Längenbegrenzung angegeben
* z.B. BRGEW(10) so wird das Feld maximal 10 Stellig
* ausgegeben.
* Es wird in diesem Beispiel folgendes Write prozessiert:
* WRITE BRGEW into TEXT(10). Dieser Text wird dann
* ausgegeben. Bitte keine Konstrukte wie
* BRGEW+3(10) verwenden!
*
* Names: Namen der Felder für die Kopfzeile
* Soll der Feldname ausgegeben werden, einfach ein "-"
* Minuszeichen für dieses Feld eintragen. Die einzelnen
* Feldnamen bitte durch Leerzeichen getrennt eingeben.
* Für nicht näher benannte Felder wird der Feldname
* in der Kopfzeile ausgegeben.
* HIDES: Die hier durch Leerzeichen getrennt eigegebenen Felder
* werden per HIDE Befehl auf dem Bildschirm abgelegt.
* (Nur Print_tab)
* ref: Für Referenzen (CURR/QUAN), die nicht auf ein Feld
* innerhalb der eigenen Struktur verweisen, muß der
Verweis
* umgesetzt werden. Dazu bitte per Leerzeichen getrennt
* immer Feld/neueReferenz eingeben.
* CHECKBOX: Die hier eingegebenen Felder werden als Checkbox
* ausgegeben. (Nur print_tab)
* SORT: Sortierungsausdruck Beispiel:
* "Feld1 Feld2 descending Feld3"
* Funktioniert nur in Verbindung mit der Tabellenausgabe
* (Print_TAB)
* SUM: Die nachfolgend durch Leerzeichen getrennten Felder
* sind zu summieren. Es werden nur QUAN, CURR, DEC, INT
und
* P Felder betrachtet!
* Die Parameter von SUM und GROUP werdeb nur bei
* der Prozedur PRINT_TAB beachtet!!!
* GROUP: Bei Summierungen werden folgende Gruppenstufen
* (Gruppierungen) betrachtet.
* Die einzelnen Felder einer Gruppierung werden durch
* einen Slash / getrennt. Die einzelnen Gruppenstufen
* durch ein Leerzeichen
* Beispiel:
* BUKRS BUKRS/MATKL BUKRS/MATKL/MATNR
DATA: BEGIN OF it_tmp OCCURS 0,
name(40) TYPE c,
END OF it_tmp.
DATA: BEGIN OF it_tmp2 OCCURS 0,
name(40) TYPE c,
END OF it_tmp2.
* Wenn keine Felder übergeben, alle Felder nehmen!!!
IF fields = ''.
PERFORM load_table USING str.
CLEAR fields.
LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
CONCATENATE fields nametab-fieldname INTO fields SEPARATED BY '
'.
ENDLOOP.
SHIFT fields LEFT DELETING LEADING space.
ENDIF.
DATA: stname TYPE ddobjname.
DATA: fields2(1950) TYPE c.
DATA: t1(50), t2(50), t3(1950).
DATA: i TYPE i.
DATA: i2 TYPE i.
gstr = str.
stname = gstr.
gsort = sort2.
TRANSLATE gsort TO UPPER CASE.
REFRESH l_tab_dfies.
CLEAR l_tab_dfies.
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = stname
all_types = 'X'
TABLES
dfies_tab = l_tab_dfies
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
SORT l_tab_dfies BY fieldname.
* Parameter in Tabellen übertragen
REFRESH:
it_fields, it_names, it_hides, it_ref, it_check, it_sum, it_group.
CLEAR:
it_fields, it_names, it_hides, it_ref, it_check, it_sum, it_group.
fields2 = fields.
TRANSLATE fields2 TO UPPER CASE.
REFRESH l_f.
SPLIT fields2 AT ' ' INTO TABLE l_f.
LOOP AT l_f.
it_fields-name = l_f-name.
APPEND it_fields.
ENDLOOP.
REFRESH l_f.
SPLIT names AT ' ' INTO TABLE l_f.
LOOP AT l_f.
it_names-name = l_f-name.
APPEND it_names.
ENDLOOP.
fields2 = hides.
TRANSLATE fields2 TO UPPER CASE.
SPLIT fields2 AT ' ' INTO TABLE it_hides.
SORT it_hides.
fields2 = checkbox.
TRANSLATE fields2 TO UPPER CASE.
SPLIT fields2 AT ' ' INTO TABLE it_check.
SORT it_check.
fields2 = ref.
TRANSLATE fields2 TO UPPER CASE.
SPLIT fields2 AT ' ' INTO TABLE it_ref.
SORT it_ref.
fields2 = sum.
TRANSLATE fields2 TO UPPER CASE.
SPLIT fields2 AT ' ' INTO TABLE it_sum.
SORT it_sum.
CLEAR it_tmp. REFRESH it_tmp.
fields2 = group.
TRANSLATE fields2 TO UPPER CASE.
SPLIT fields2 AT ' ' INTO TABLE it_tmp.
LOOP AT it_tmp.
it_group-gruppe = sy-tabix.
g_max_groups = sy-tabix.
REFRESH it_tmp2. CLEAR it_tmp2.
SPLIT it_tmp-name AT '/' INTO TABLE it_tmp2.
LOOP AT it_tmp2.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
WITH KEY fieldname = it_tmp2-name
BINARY SEARCH.
IF sy-subrc = 0.
it_fields-position2 = <l_wrk_dfies2>-position.
it_group-position = <l_wrk_dfies2>-position.
APPEND it_group.
ENDIF.
ENDLOOP.
ENDLOOP.
SORT it_group BY gruppe DESCENDING position.
* Gruppenwechsel LAST Tabelle vorinitialisieren.
i = g_max_groups.
REFRESH it_group_last.
CLEAR it_group_last.
WHILE i >= 0.
APPEND it_group_last.
i = i - 1.
ENDWHILE.
DESCRIBE TABLE it_fields LINES i.
DESCRIBE TABLE it_names LINES i2.
* Kopfnamen nachkontrollieren
WHILE i2 < i.
i2 = i2 + 1.
it_names = '-'. APPEND it_names.
ENDWHILE.
LOOP AT it_fields.
READ TABLE it_names INDEX sy-tabix.
it_fields-text = it_names-name.
SPLIT it_fields-name AT '(' INTO it_fields-name t1.
SPLIT t1 AT ')' INTO t1 t2.
it_fields-laenge = t1.
MODIFY it_fields.
ENDLOOP.
* Referenzen umsetzen.
LOOP AT it_ref.
SPLIT it_ref-name AT '/' INTO t1 t2 t3.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = t1
BINARY SEARCH.
IF sy-subrc = 0.
tabix = sy-tabix.
<l_wrk_dfies>-reffield = t2.
MODIFY l_tab_dfies FROM <l_wrk_dfies> INDEX tabix.
ENDIF.
ENDLOOP.
* Referenzen kontrollieren
LOOP AT it_fields.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0 AND <l_wrk_dfies>-reffield <> ''.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = <l_wrk_dfies>-reffield
BINARY SEARCH.
IF sy-subrc <> 0 .
CONCATENATE 'WARNUNG: Das Feld' it_fields-name
'Referenziert auf ein Feld, welches nicht in der Struktur:'
gstr 'vorhanden ist' INTO t3 SEPARATED BY ' '.
WRITE: / t3.
<l_wrk_dfies>-reftable = ''.
<l_wrk_dfies>-reffield = ''.
ENDIF.
ENDIF.
ENDLOOP.
* --------------------------------------------------------------------
* Leere Strukturzeile generieren und
* it_fields mit Fallunterscheidungen füllen
* --------------------------------------------------------------------
DATA: offset TYPE i.
DATA: offset_old TYPE i.
DATA: ausgabe(3200) TYPE c.
DATA: rueck(3200) TYPE c.
DATA: rc TYPE i.
offset = 1.
rueck = '|'.
LOOP AT it_fields.
it_fields-datatype = ''.
it_fields-case = ''.
it_fields-reffield = ''.
it_fields-position = 0.
it_fields-position2 = 0.
it_fields-offset = offset.
offset_old = offset.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies>
WITH KEY fieldname = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0.
it_fields-reffield = <l_wrk_dfies>-reffield.
it_fields-datatype = <l_wrk_dfies>-datatype.
READ TABLE it_check WITH KEY name = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0.
* Als Checkbox ausgeben (FALL = 1)
it_fields-case = '1'.
rueck+offset(2) = ' |'. offset = offset + 2.
it_fields-laenge = 1.
ELSE.
* Normale Feldausgabe
IF <l_wrk_dfies>-datatype = 'CURR' OR
<l_wrk_dfies>-datatype = 'QUAN'.
rc = 0.
* Betrachtung von CURR und QUAN Feldern
IF <l_wrk_dfies>-reftable = 'T001'.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
WITH KEY fieldname = 'BUKRS'
BINARY SEARCH.
IF sy-subrc = 0.
it_fields-position2 = <l_wrk_dfies2>-position.
* ASSIGN COMPONENT <l_wrk_dfies2>-position
* OF STRUCTURE <fs_wa> TO <fs_field2>.
IF sy-subrc = 0.
rc = 1.
* Ausgabe wie ein normales Feld, da jetzt Referenzstruktur gefüllt
IF it_fields-laenge <> 0.
* FALL = 2 --> T001 bezug mit veränderter Länge
* --> Normale Ausgabe mit veränderter Länge
it_fields-case = '2'.
offset = offset + it_fields-laenge.
rueck+offset(1) = '|'. offset = offset + 1.
ELSE.
* FALL = 3 --> T001 bezug mit veränderter Länge
* --> Normale Ausgabe mit dfies Standardlänge
it_fields-case = '3'.
offset = offset + <l_wrk_dfies>-outputlen.
rueck+offset(1) = '|'. offset = offset + 1.
it_fields-laenge = <l_wrk_dfies>-outputlen.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF rc = 0.
* Keine Curr Felder in Bezug auf T001 !!
* Jetzt normalen CURR und QUAN Bezug abarbeiten.
READ TABLE l_tab_dfies ASSIGNING <l_wrk_dfies2>
WITH KEY fieldname = <l_wrk_dfies>-reffield
BINARY SEARCH.
IF sy-subrc = 0.
it_fields-position2 = <l_wrk_dfies2>-position.
* ASSIGN COMPONENT <l_wrk_dfies2>-position
* OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <l_wrk_dfies>-datatype = 'CURR'.
IF it_fields-laenge <> 0.
* FALL = 4 --> CURR Feld Ausgabe mit veränderter Länge
it_fields-case = '4'.
offset = offset + it_fields-laenge.
rueck+offset(1) = '|'. offset = offset + 1.
ELSE.
* FALL = 5 --> CURR Feld Ausgabe mit dfies Standardlänge
it_fields-case = '5'.
offset = offset + <l_wrk_dfies>-outputlen.
rueck+offset(1) = '|'. offset = offset + 1.
it_fields-laenge = <l_wrk_dfies>-outputlen.
ENDIF.
ELSE.
IF it_fields-laenge <> 0.
* FALL = 6 --> QUAN Feld Ausgabe mit veränderter Länge
it_fields-case = '6'.
offset = offset + it_fields-laenge.
rueck+offset(1) = '|'. offset = offset + 1.
ELSE.
* FALL = 7 --> QUAN Feld Ausgabe mit dfies Standardlänge
it_fields-case = '7'.
offset = offset + <l_wrk_dfies>-outputlen.
rueck+offset(1) = '|'. offset = offset + 1.
it_fields-laenge = <l_wrk_dfies>-outputlen.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE.
* Betrachtung von normalen Ausgabefeldern
IF it_fields-laenge <> 0.
* FALL = 8 --> Normale Ausgabe mit veränderter Länge
it_fields-case = '8'.
offset = offset + it_fields-laenge.
rueck+offset(1) = '|'. offset = offset + 1.
ELSE.
* FALL = 9 --> Normale Ausgabe mit dfies Standardlänge
it_fields-case = '9'.
offset = offset + <l_wrk_dfies>-outputlen.
rueck+offset(1) = '|'. offset = offset + 1.
it_fields-laenge = <l_wrk_dfies>-outputlen.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF offset_old = offset.
offset = offset + <l_wrk_dfies>-outputlen.
rueck+offset(1) = '|'. offset = offset + 1.
it_fields-laenge = <l_wrk_dfies>-outputlen.
ENDIF.
it_fields-position = <l_wrk_dfies>-position.
MODIFY it_fields.
ENDLOOP.
g_initline = rueck.
g_sum = ''.
LOOP AT it_sum.
g_sum = 'X'.
READ TABLE it_fields WITH KEY name = it_sum-name.
IF it_fields-case = 2 OR it_fields-case = 3.
it_sum_einh-typ = '2'.
it_sum-typ = '2'.
ELSE.
it_sum_einh-typ = '1'.
it_sum-typ = '1'.
ENDIF.
it_sum-position = it_fields-position.
it_sum-position2 = it_fields-position2.
MODIFY it_sum.
it_sum_einh-position2 = it_fields-position2.
APPEND it_sum_einh.
ENDLOOP.
SORT it_sum BY position.
SORT it_sum_einh.
DELETE ADJACENT DUPLICATES FROM it_sum_einh.
it_fields2[] = it_fields[].
SORT it_fields2 BY position.
ENDFORM. "INIT
*&--------------------------------------------------------------------*
*& Form print_wide_table
*&--------------------------------------------------------------------*
FORM print_wide_table TABLES it
USING breite "maximale Ausgabebreite
str "Name der Struktur
names "Benennung der Felder in der Kopfzeile
hides "Per Hide zu hinterlegende Felder
ref "UNIT oder
checkbox "Als Checkbox anzuzeigende Felder.
sort2 "Sortierreihenfolge
sum "Felder die zu summieren sind
group. "Gruppenstufen
DATA: fields(3000).
DATA: i TYPE i.
DATA: BEGIN OF it_fields OCCURS 0,
fields(3000),
END OF it_fields.
DESCRIBE TABLE it LINES i.
IF i = 0. EXIT. ENDIF.
* Wenn keine Felder übergeben, alle Felder nehmen!!!
PERFORM load_table USING str.
CLEAR fields.
LOOP AT nametab. " Löschen der nicht in Frage kommenden Felder
i = i + nametab-ddlen + 2.
IF i > breite.
IF fields <> ''.
SHIFT fields LEFT DELETING LEADING space.
it_fields-fields = fields. APPEND it_fields.
ENDIF.
CLEAR fields.
i = nametab-ddlen + 2.
ENDIF.
CONCATENATE fields nametab-fieldname INTO fields SEPARATED BY ' '.
IF i > breite.
IF fields <> ''.
SHIFT fields LEFT DELETING LEADING space.
it_fields-fields = fields. APPEND it_fields.
CLEAR fields.
ENDIF.
i = 0.
ENDIF.
ENDLOOP.
SHIFT fields LEFT DELETING LEADING space.
it_fields-fields = fields. APPEND it_fields.
CLEAR fields.
LOOP AT it_fields.
PERFORM init
USING str "Name der Struktur
it_fields-fields "Anzuzeigende Felder
names "Benennung der Felder in der Kopfzeile
hides "Per Hide zu hinterlegende Felder
ref "UNIT oder
checkbox "Als Checkbox anzuzeigende Felder.
sort2 "Sortierreihenfolge
sum "Felder die zu summieren sind
group. "Gruppenstufen
PERFORM print_tab TABLES it.
SKIP 2.
ENDLOOP.
ENDFORM. "print_wide_table
*---------------------------------------------------------------------*
* FORM print_tab
*
*---------------------------------------------------------------------*
FORM print_tab TABLES it.
DATA: fields2(1950) TYPE c.
DATA: l_dummy(1950).
DATA: text(500).
DATA: tabix LIKE sy-tabix.
DATA: i TYPE i.
DATA: offset TYPE i.
DATA: i3 TYPE i.
DATA: i2 TYPE i.
DATA: rc TYPE i.
DATA: l_act_einh_wechsel(1950).
DATA: t1(50),
t2(50),
t3(50),
t4(50),
t5(50),
t6(50),
t7(50),
t8(50),
t9(50),
t10(50),
t11(50),
t12(50),
t13(50),
t14(50),
t15(50).
DATA: dref TYPE REF TO data.
CREATE DATA dref TYPE (gstr).
ASSIGN dref->* TO <fs_wa>.
DATA: wa(1950).
* NEW-PAGE LINE-SIZE 1250.
IF gsort <> ''.
SPLIT gsort AT ' ' INTO t1 t2 t3 t4 t5 t6 t7 t8 t9 t10
t11 t12 t13 t14 t15.
SORT it BY (t1) (t2) (t3) (t4) (t5) (t6) (t7) (t8) (t9)
(t10) (t11) (t12) (t13) (t14) (t15).
ENDIF.
* Kopf ausgeben.
PERFORM kopfausgabe USING 'X' '' CHANGING zeile.
* Tabelle ausgeben
LOOP AT it INTO wa.
<fs_wa> = wa.
tabix = sy-tabix.
i = sy-tabix MOD 2.
IF i = 1.
FORMAT COLOR 2 INTENSIFIED ON.
ELSE.
FORMAT COLOR 2 INTENSIFIED OFF.
ENDIF.
* Erkennen eines Einheitengruppenwechsels
IF g_sum = 'X'.
l_act_einh_wechsel = ''.
LOOP AT it_sum_einh.
ASSIGN COMPONENT it_sum_einh-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF it_sum_einh-typ = '1'.
CONCATENATE l_act_einh_wechsel '|' <fs_field2> INTO
l_act_einh_wechsel.
ELSE.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
CONCATENATE l_act_einh_wechsel '|' t001-waers INTO
l_act_einh_wechsel.
ENDIF.
ENDLOOP.
ENDIF.
* Erkennen eines Gruppenwechsels
IF g_max_groups > 0.
CLEAR l_dummy.
LOOP AT it_group.
ASSIGN COMPONENT it_group-position
OF STRUCTURE <fs_wa> TO <fs_field>.
WRITE: <fs_field> TO text.
CONCATENATE l_dummy '|' text INTO l_dummy.
AT END OF gruppe.
READ TABLE it_group_last INDEX it_group-gruppe.
IF it_group_last-text <> l_dummy.
IF it_group_last-text = ''.
it_group_last-text = l_dummy.
MODIFY it_group_last INDEX it_group-gruppe.
ELSE.
it_group_last-text = l_dummy.
MODIFY it_group_last INDEX it_group-gruppe.
* Gruppenwechsel ausgeben!
NEW-LINE.
ULINE AT 0(laenge).
FORMAT RESET.
PERFORM summenausgabe USING it_group-gruppe.
ENDIF.
ENDIF.
CLEAR l_dummy.
ENDAT.
ENDLOOP.
LOOP AT it_group_last.
it_group_last-l_dummy = <fs_wa>.
MODIFY it_group_last.
ENDLOOP.
ENDIF. " Erkennen eines Gruppenwechsels
offset = 2.
PERFORM write_long USING g_initline 0.
* WRITE: / g_initline(laenge).
HIDE sy-tabix.
CLEAR text255.
LOOP AT it_fields.
ASSIGN COMPONENT it_fields-position
OF STRUCTURE <fs_wa> TO <fs_field>.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
READ TABLE it_hides WITH KEY name = it_fields-name
BINARY SEARCH.
IF sy-subrc = 0.
text = <fs_field>.
CONCATENATE text255 text '|' INTO text255.
* HIDE text255.
ENDIF.
CASE it_fields-case.
WHEN '1'.
WRITE AT offset <fs_field>(1) AS CHECKBOX.
offset = offset + 2.
WHEN '2'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE: AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '3'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
WHEN '4'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '5'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
offset = offset + it_fields-laenge + 1.
WHEN '6'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> UNIT <fs_field2> TO
text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '7'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> UNIT <fs_field2>.
offset = offset + it_fields-laenge + 1.
WHEN '8'.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
offset = offset + it_fields-laenge + 1.
WHEN '9'.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
WHEN OTHERS.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: AT offset <fs_field>.
offset = offset + it_fields-laenge + 1.
* WRITE: / 'FEHLER !!!'.
ENDCASE.
* ----------------------------------------------------------------------
* Die Werte zu den Gesamtsummen hinzurechnen.
* Jede Gruppierung (0 = Gesamt) hat ihre eigenen Summen
IF g_sum = 'X'.
READ TABLE it_sum WITH KEY position = it_fields-position
BINARY SEARCH.
IF sy-subrc = 0.
i3 = 0.
* Für jede Gruppe die Addition durchführen.
WHILE i3 <= g_max_groups.
READ TABLE it_sum_erg WITH KEY gruppe = i3
einheiten =
l_act_einh_wechsel
position =
it_fields-position.
IF sy-subrc = 0.
tabix = sy-tabix.
it_sum_erg-wert = it_sum_erg-wert + <fs_field>.
IF it_sum-typ = '1'.
it_sum_erg-einheit = <fs_field2>.
ELSE.
it_sum_erg-einheit = t001-waers.
ENDIF.
MODIFY it_sum_erg INDEX sy-tabix.
ELSE.
CLEAR it_sum_erg.
it_sum_erg-gruppe = i3.
it_sum_erg-position = it_fields-position.
it_sum_erg-einheiten = l_act_einh_wechsel.
IF it_sum-typ = '1'.
it_sum_erg-einheit = <fs_field2>.
ELSE.
it_sum_erg-einheit = t001-waers.
ENDIF.
it_sum_erg-wert = <fs_field>.
INSERT it_sum_erg INTO TABLE it_sum_erg.
ENDIF.
i3 = i3 + 1.
ENDWHILE.
ENDIF.
ENDIF.
ENDLOOP.
IF text255 <> ''.
HIDE text255.
ENDIF.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
ENDLOOP.
NEW-LINE.
ULINE AT 0(laenge).
FORMAT RESET.
* Gesamtsumme ausgeben!!!
IF g_sum = 'X'.
i3 = g_max_groups.
WHILE i3 >= 0.
PERFORM summenausgabe USING i3.
i3 = i3 - 1.
NEW-LINE.
ULINE AT 0(laenge).
ENDWHILE.
ENDIF.
ENDFORM. "print_tab
*---------------------------------------------------------------------*
* FORM Summenausgabe
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
* --> U_GRUPPE
*
*---------------------------------------------------------------------*
FORM summenausgabe USING u_gruppe.
DATA: l_dummy(1950).
DATA: offset TYPE i.
DATA: i3 TYPE i.
DATA: i2 TYPE i.
DATA: rc TYPE i.
DATA: nl TYPE i.
DATA: ltext(1).
l_dummy = <fs_wa>.
rc = 0.
nl = 0.
FORMAT COLOR 3 INTENSIFIED ON.
CLEAR <fs_wa>.
LOOP AT it_sum_erg WHERE gruppe = u_gruppe.
AT NEW einheiten.
WRITE: / g_initline(laenge).
nl = 0.
CLEAR <fs_wa>.
IF u_gruppe = 0.
IF rc = 0.
WRITE: AT 2 'Gesamt:'.
rc = 1.
ELSE.
WRITE: AT 2 ' '.
ENDIF.
ELSE.
WRITE u_gruppe TO ltext.
WRITE: AT 2 ltext.
ENDIF.
ENDAT.
READ TABLE it_sum WITH KEY position = it_sum_erg-position
BINARY SEARCH.
READ TABLE it_fields2 WITH KEY position = it_sum_erg-position
BINARY SEARCH.
ASSIGN COMPONENT it_sum-position
OF STRUCTURE <fs_wa> TO <fs_field>.
ASSIGN COMPONENT it_sum-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF it_sum-typ = '2'.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
ELSE.
<fs_field2> = it_sum_erg-einheit.
ENDIF.
<fs_field> = it_sum_erg-wert.
offset = it_fields2-offset + 1.
CASE it_fields2-case.
WHEN '2'.
WRITE: <fs_field> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
WHEN '3'.
WRITE: <fs_field> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
WHEN '4'.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields2-laenge).
WRITE AT offset text(it_fields2-laenge).
WHEN '5'.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields2-laenge).
WRITE AT offset text(it_fields2-laenge).
WHEN '6'.
WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields2-laenge).
WRITE AT offset text(it_fields2-laenge).
WHEN '7'.
WRITE: <fs_field> UNIT <fs_field2> TO text(it_fields2-laenge).
WRITE AT offset text(it_fields2-laenge).
WHEN '8'.
WRITE: <fs_field> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
WHEN '9'.
WRITE: <fs_field> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
WHEN OTHERS.
WRITE: <fs_field> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
* WRITE: / 'FEHLER !!!'.
ENDCASE.
IF it_sum-typ = '1'.
READ TABLE it_fields2 WITH KEY position = it_sum-position2
BINARY SEARCH.
offset = it_fields2-offset + 1.
WRITE: <fs_field2> TO text(it_fields2-laenge).
WRITE: AT offset text(it_fields2-laenge).
ENDIF.
IF nl = 0.
READ TABLE it_group_last INDEX it_group-gruppe.
<fs_wa> = it_group_last-l_dummy.
PERFORM gruppenstufenfelder USING u_gruppe.
nl = 1.
ENDIF.
ENDLOOP.
DELETE it_sum_erg WHERE gruppe = u_gruppe.
FORMAT RESET.
<fs_wa> = l_dummy.
ENDFORM. "summenausgabe
*---------------------------------------------------------------------*
* FORM gruppenstufenfelder
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
* --> U_GRUPPE
*
*---------------------------------------------------------------------*
FORM gruppenstufenfelder USING u_gruppe.
DATA: offset TYPE i.
DATA: i3 TYPE i.
DATA: i2 TYPE i.
DATA: rc TYPE i.
IF u_gruppe <> 0.
* Ausgabe der Gruppenstufenfelder
LOOP AT it_group WHERE gruppe = u_gruppe.
READ TABLE it_fields WITH KEY position = it_group-position.
ASSIGN COMPONENT it_fields-position
OF STRUCTURE <fs_wa> TO <fs_field>.
offset = it_fields-offset + 1.
* --------------------------------------------------------------------
* Zeile ausgeben.
* --------------------------------------------------------------------
CASE it_fields-case.
WHEN '1'.
WRITE AT offset <fs_field>(1) AS CHECKBOX.
WHEN '2'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE: AT offset text(it_fields-laenge).
WHEN '3'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
IF <fs_field2> <> t001-bukrs.
CLEAR t001.
SELECT SINGLE * FROM t001 WHERE bukrs = <fs_field2>.
ENDIF.
WRITE: AT offset <fs_field>.
WHEN '4'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> CURRENCY <fs_field2> TO
text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
WHEN '5'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> CURRENCY <fs_field2>.
WHEN '6'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: <fs_field> UNIT <fs_field2> TO
text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
WHEN '7'.
ASSIGN COMPONENT it_fields-position2
OF STRUCTURE <fs_wa> TO <fs_field2>.
WRITE: AT offset <fs_field> UNIT <fs_field2>.
WHEN '8'.
WRITE: <fs_field> TO text(it_fields-laenge).
WRITE AT offset text(it_fields-laenge).
WHEN '9'.
WRITE: AT offset <fs_field>.
WHEN OTHERS.
WRITE: AT offset <fs_field>.
* WRITE: / 'FEHLER !!!'.
ENDCASE.
ENDLOOP.
ENDIF.
ENDFORM. "gruppenstufenfelder
*&---------------------------------------------------------------------*
*& Form SEND_EMAIL_AS_ATTACHMENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM send_email_as_attachment USING titel empfaenger mailtyp express.
DATA: l_t1(100).
* Filling in the text table
CLEAR reclist.
SPLIT empfaenger AT ' ' INTO TABLE reclist.
LOOP AT reclist.
l_t1 = reclist-receiver.
CLEAR reclist.
reclist-receiver = l_t1.
IF mailtyp = ' '.
reclist-rec_type = 'B'. "SAP Mail!!
ELSE.
reclist-rec_type = mailtyp.
ENDIF.
reclist-express = express.
MODIFY reclist.
ENDLOOP.
CLEAR it_text.
* Creation of the document to be sent
docdata-obj_descr = titel.
docdata-obj_name = 'SAP1'.
docdata-obj_langu = 'D'.
APPEND docdata.
DESCRIBE TABLE it_text LINES tab_lines.
* Creation of the packing list
objpack-transf_bin = 'X'.
objpack-head_start = 1.
objpack-head_num = 1.
objpack-body_start = 1.
objpack-body_num = tab_lines.
objpack-doc_type = 'XLS'.
objpack-obj_name = 'SAP1.XLS'.
objpack-doc_size = tab_lines * 255.
APPEND objpack.
* Creation of the Header
objhead-line = 'MAIL.txt'.
APPEND objhead.
* Completing the recipient list
CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = docdata
put_in_outbox = 'X'
IMPORTING
sent_to_all = sent
new_object_id = new_object_id
TABLES
packing_list = objpack
object_header = objhead
contents_bin = it_text
receivers = reclist
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
CASE sy-subrc.
WHEN 0.
WRITE: / 'Result of the send process:'.
SKIP.
LOOP AT reclist.
WRITE: / 'The document was sent to:', reclist-receiver.
ENDLOOP.
WHEN 1.
WRITE: /
'No authorization for sending to the specified number of
Recipients'.
WHEN 2.
WRITE: / 'Document could not be sent to any recipient'.
WHEN 4.
WRITE: / 'No send authorization'.
WHEN OTHERS.
WRITE: / 'Error occured while sending'.
ENDCASE.
ENDFORM. " SEND_EMAIL_AS_ATTACHMENT
*---------------------------------------------------------------------*
* FORM XLS_MAIL *
*---------------------------------------------------------------------*
* Die Tabelle wird mit den ausgewählten Feldern als XLS Datei
* aufbereitet und per E-Mail verschickt.
* Felder:
* titel: Beschreibungstext der E-Mail (Titel)
* Empfaenger: Empfängerliste durch Leerzeichen getrennt (SAP
USERNAME).
* Mailtyp: B = SAP Mail
* Express: X = Expressmail!
* header: X = Kopfzeile mit ausgeben!
*---------------------------------------------------------------------*
FORM xls_mail TABLES it
USING titel
empfaenger
mailtyp
express
header.
FIELD-SYMBOLS:
<fs_wa2> TYPE ANY.
DATA: file LIKE rlgrap-filename.
DATA: BEGIN OF it_file OCCURS 0,
zeile(1950),
END OF it_file.
CLEAR: docdata, it_text, reclist, objpack, objhead.
REFRESH: docdata, it_text, reclist, objpack, objhead.
DATA: dref TYPE REF TO data.
CREATE DATA dref TYPE (gstr).
ASSIGN dref->* TO <fs_wa2>.
CLEAR it_file.
REFRESH it_file.
* Kopf ausgeben.
IF header = 'X'.
PERFORM kopfausgabe USING ' ' 'X' CHANGING it_file-zeile.
it_file-zeile = it_file-zeile+1.
CONDENSE it_file-zeile NO-GAPS.
TRANSLATE it_file-zeile USING g_transl.
APPEND it_file.
ENDIF.
* Tabelle ausgeben
LOOP AT it ASSIGNING <fs_wa2>.
PERFORM print_line2 USING <fs_wa2>
CHANGING it_file-zeile.
it_file-zeile = it_file-zeile+1.
CONDENSE it_file-zeile NO-GAPS.
TRANSLATE it_file-zeile USING g_transl.
APPEND it_file.
ENDLOOP.
* Datei in das Binary Format übertragen.
file = 'tmp_'.
file+4 = sy-uname.
CONCATENATE file sy-uzeit INTO file.
TRANSLATE file USING ':_'.
OPEN DATASET file FOR OUTPUT IN TEXT MODE.
IF sy-subrc EQ 0.
LOOP AT it_file.
TRANSFER it_file TO file.
ENDLOOP.
ENDIF.
CLOSE DATASET file.
OPEN DATASET file FOR INPUT IN BINARY MODE.
DO.
CLEAR it_text.
READ DATASET file INTO it_text.
APPEND it_text.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET file.
PERFORM send_email_as_attachment
USING titel
empfaenger
mailtyp
express.
DELETE DATASET file.
ENDFORM. "xls_mail
*---------------------------------------------------------------------*
* FORM LOAD_TABLE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> SHOW *
*---------------------------------------------------------------------*
FORM load_table USING show.
tabname = show.
tab_len = STRLEN( show ).
IF tab_len = 2.
* Segment
CASE tabname.
* System
WHEN 'SY'.
tabname = 'SYST'.
* Dynpro
WHEN 'DY'.
SELECT SINGLE * FROM trdir
WHERE name = program.
IF sy-subrc NE 0.
EXIT.
ENDIF.
IF trdir-subc CN '1MF'.
include = program.
IF trdir-subc = 'I' AND
include+5(1) CO 'IOFDU'.
SHIFT include RIGHT BY 3 PLACES.
include(3) = 'SAP'.
program = include.
SELECT SINGLE * FROM trdir
WHERE name = program.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDIF.
ENDIF.
tabname = '$'.
tabname+1(2) = trdir-dbna.
tabname+3(1) = trdir-appl.
* WHEN OTHERS.
* SELECT SINGLE * FROM T032
* WHERE SEGMENT = TABNAME.
* IF SY-SUBRC NE 0.
* PERFORM EXIT.
* ENDIF.
* TABNAME = T032-QMACRO.
ENDCASE.
ENDIF.
* Get NAMETAB
REFRESH nametab.
IF tabname NE 'SCREEN'.
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
tabname = tabname
langu = sy-langu
TABLES
nametab = nametab
EXCEPTIONS
internal_error = 1
table_has_no_fields = 2
table_not_activ = 3.
ELSE.
CLEAR nametab.
CLEAR nametab.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldname = 'NAME'.
nametab-intlen = 30.
nametab-fieldtext = 'Feldname'(101).
APPEND nametab.
nametab-fieldname = 'GROUP1'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe1'(102).
APPEND nametab.
nametab-fieldname = 'GROUP2'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe2'(103).
APPEND nametab.
nametab-fieldname = 'GROUP3'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe3'(104).
APPEND nametab.
nametab-fieldname = 'GROUP4'.
nametab-intlen = 3.
nametab-fieldtext = 'Bewertung der Modif.gruppe4'(105).
APPEND nametab.
nametab-fieldname = 'REQUIRED'.
nametab-intlen = 1.
nametab-fieldtext = 'Musseingabe'(106).
APPEND nametab.
nametab-fieldname = 'INPUT'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld eingabebereit'(107).
APPEND nametab.
nametab-fieldname = 'OUTPUT'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld wird angezeigt'(108).
APPEND nametab.
nametab-fieldname = 'INTENSIFIED'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld hellleuchtend'(109).
APPEND nametab.
nametab-fieldname = 'INVISIBLE'.
nametab-intlen = 1.
nametab-fieldtext = 'Feld unsichtbar'(110).
APPEND nametab.
nametab-fieldname = 'LENGTH'.
nametab-datatype = 'HEX'.
nametab-inttype = 'X'.
nametab-intlen = 1.
nametab-fieldtext = 'Laenge des Feldes'(111).
APPEND nametab.
nametab-fieldname = 'ACTIVE'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld aktiv'(112).
APPEND nametab.
* NEW FIELDS IN SCREEN FOR 3.0
nametab-fieldname = 'DISPLAY_3D'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld 3-dimensional'(113).
APPEND nametab.
nametab-fieldname = 'VALUE_HELP'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Feld mit Wertehilfe'(114).
APPEND nametab.
nametab-fieldname = 'REQUEST'.
nametab-intlen = 1.
nametab-datatype = 'CHAR'.
nametab-inttype = 'C'.
nametab-fieldtext = 'Eingabe vorhanden (nur PAI)'(115).
APPEND nametab.
ENDIF.
subrc = sy-subrc.
IF sy-subrc > 3.
EXIT.
ENDIF.
ENDFORM. "LOAD_TABLE
*&--------------------------------------------------------------------*
*& Form write_long
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
* -->ZEILE text
* -->CO text
*---------------------------------------------------------------------*
FORM write_long USING zeile co TYPE i.
DATA: l_dummy_string(1950).
DATA: laenge TYPE i.
l_dummy_string = zeile.
laenge = STRLEN( zeile ).
IF co = 1.
IF laenge > 250.
WRITE: / l_dummy_string(250) COLOR 1 NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
IF laenge > 250.
WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) COLOR 1 NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ELSE.
WRITE: l_dummy_string(laenge) COLOR 1 NO-GAP.
ENDIF.
ELSE.
WRITE: / l_dummy_string(laenge) COLOR 1.
ENDIF.
ELSEIF co = 0.
IF laenge > 250.
WRITE: / l_dummy_string(250) NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
IF laenge > 250.
WRITE: l_dummy_string(250) NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ENDIF.
IF laenge > 250.
WRITE: l_dummy_string(250) NO-GAP.
laenge = laenge - 250.
l_dummy_string = l_dummy_string+250.
ELSE.
WRITE: l_dummy_string(laenge) NO-GAP.
ENDIF.
ELSE.
WRITE: / l_dummy_string(laenge) .
ENDIF.
ENDIF.
ENDFORM. "write_long
*---------------------------------------------------------------------*
* FORM XLS_start
*
*---------------------------------------------------------------------*
* Wenn START = 'X' erfolgt nicht nur ein Download, sondern
* die Datei wird auch noch mit excel geöffnet.
* Wenn header = 'X', dann enthält die Downloaddatei auch die
* Kopfzeile
* Wenn append = 'X', dann werden die Daten an die Datei angehangen.
*---------------------------------------------------------------------*
FORM xls_start TABLES it
USING datei
start
header
append
strukturname.
FIELD-SYMBOLS:
<fs_wa2> TYPE ANY.
DATA: dref88 TYPE REF TO data.
CREATE DATA dref88 TYPE (gstr).
ASSIGN dref88->* TO <fs_wa2>.
DATA: file TYPE string.
DATA: BEGIN OF it_file OCCURS 0,
zeile(3200),
END OF it_file.
file = datei.
CLEAR it_file.
REFRESH it_file.
* Kopf ausgeben.
IF header = 'X'.
CLEAR it_file. APPEND it_file.
CLEAR it_file. APPEND it_file.
CLEAR it_file. APPEND it_file.
CLEAR it_file. APPEND it_file.
it_file = 'Strukturname: '.
CONCATENATE it_file strukturname INTO it_file SEPARATED BY ' '.
APPEND it_file.
CLEAR it_file. APPEND it_file.
PERFORM kopfausgabe USING ' ' 'X' CHANGING it_file-zeile.
it_file-zeile = it_file-zeile+1.
CONDENSE it_file-zeile NO-GAPS.
TRANSLATE it_file-zeile USING g_transl.
APPEND it_file.
IF NOT it_file-zeile IS INITIAL.
TRANSLATE it_file-zeile TO UPPER CASE.
TRANSLATE it_file-zeile USING
'A_B_C_D_E_F_G_H_I_J_K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_'.
TRANSLATE it_file-zeile USING
'1_2_3_4_5_6_7_8_9_0_'.
APPEND it_file.
ENDIF.
ENDIF.
* Tabelle ausgeben
LOOP AT it ASSIGNING <fs_wa2>.
PERFORM print_line2 USING <fs_wa2>
CHANGING it_file-zeile.
it_file-zeile = it_file-zeile+1.
CONDENSE it_file-zeile NO-GAPS.
TRANSLATE it_file-zeile USING g_transl.
APPEND it_file.
ENDLOOP.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename = file
* FILETYPE = 'ASC'
append = append
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* CONFIRM_OVERWRITE = ' '
* NO_AUTH_CHECK = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* WRITE_BOM = ' '
* TRUNC_TRAILING_BLANKS_EOL = 'X'
* IMPORTING
* FILELENGTH =
TABLES
data_tab = it_file
* FIELDNAMES =
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22
.
IF sy-subrc = 0.
IF start = 'X'.
CALL FUNCTION 'WS_EXECUTE'
EXPORTING
program = 'EXCEL.EXE'
commandline = datei
inform = ''
EXCEPTIONS
prog_not_found.
ENDIF.
ENDIF.
ENDFORM. "xls_start