[51000] in SAPr3-news
ABAP Toolprogramme: Beispiel zur Erstellung von Hierarchien (upload)
daemon@ATHENA.MIT.EDU (volker Korrmann)
Tue Aug 10 08:09:44 2004
To: sapr3-news@mit.edu
Date: 10 Aug 2004 05:09:38 -0700
From: volker_korrmann@web.de (volker Korrmann)
Message-ID: <cdd58c09.0408100409.6674e6c3@posting.google.com>
REPORT Z_BSP_HIERARCHIEN .
* Beispiel für die Erstellung eigener Hierarchien.
* Der Upload ins BW kann immer nur mittels Dateien erfolgen.
* Siehe HOW TO Paper: Download von Hierarchien.
* Da es jedoch immer ein wenig kompliziert ist, diese
* Hierarchien zusammenzubauen, habe ich mal hier eine
* einigermaßen allgemeingültige Vorlage erstellt.
* Wichtige Prozeduren:
* perform init. " Bitte einmalig ausführen
* perform DATEN_EINFUEGEN. Hier werden die Daten mit Hilfe von:
* Perform append using 1 "Ebene
* 'Gesamt' "Beschreibung
* '' "von
* '' "bis
* '0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
* 0 "Anzahl
* 'GESAMT'.
* Der Hierarchie hinzugefügt, was jedoch in der richtigen Reihenfolge
* passieren muß. Die angegebene Ebene muß dabei immer entweder
* die gleiche sein, wie beim Letzten Satz.
* ODER genau eine Ebene Tiefer
* ODER beliebig viele Ebenen höher!!!
* perform Endeverarbeitung. "WICHTIG: Bitte einmal aufrufen, nachdem
* alle Einträge zur Hierarchie hinzugefügt
* wurden!!!
* Perform Anzahl_vermerken. "Hier ebenso!!!
* perform pc_ausgabe. " Erstellen einer PC Datei
* Perform SERVER_FILE. " Erstellen einer Datei auf dem Server
* WICHTIGE GLOBALE FELDER UND TABELLEN !!!!!!!!!!!!!!!
DATA: begin of it_hie occurs 0,
NODEID type RSHIENODID,
IOBJNM type RSIOBJNM,
NODENAME type RSNODENAME,
LINK type RSLINK,
PARENTID type RSPARENT,
CHILDID type RSCHILD,
NEXTID type RSNEXT,
DATETO type RSDATETO,
DATEFROM type RSDATEFROM,
LEAFTO type RSLEAFTO,
LEAFFROM type RSLEAFFROM,
LANGU type LANGU,
TXTSH type RSTXTSH,
TXTMD type RSTXTMD,
TXTLG type RSTXTLG,
ANZAHL type i,
end of it_hie.
* Da nicht alle Hierarchien z.B. Intervalle erlauben etc.
* hat die zentrale Tabelle alle Felder (+Anzahl),
* während diese Ausgabestruktur der Hierarchiestruktur des
* Merkmals entsprechen muss.
* Anbei das Beispiel für eine Struktur ohne Intervalle.
DATA: begin of it_f occurs 0,
NODEID type RSHIENODID,
IOBJNM type RSIOBJNM,
NODENAME type RSNODENAME,
LINK type RSLINK,
PARENTID type RSPARENT,
CHILDID type RSCHILD,
NEXTID type RSNEXT,
DATETO type RSDATETO,
DATEFROM type RSDATEFROM,
LANGU type LANGU,
TXTSH type RSTXTSH,
TXTMD type RSTXTMD,
TXTLG type RSTXTLG.
DATA: end of it_f.
DATA: begin of g_info occurs 20.
DATA: Datensatz type i.
DATA: Ebenensumme type i.
DATA: end of g_info.
DATA: G_EBENE type i value 0.
DATA: G_datensatz type i value 0.
DATA: text type RSTXTLG.
DATA: textk type RSNODENAME.
DATA: von type RSLEAFTO.
data: bis type RSLEAFTO.
* WICHTIGE GLOBALE FELDER UND TABELLEN !!!!!!!!!!!!!!!
* -----------------------------------------------------------
* -----------------------------------------------------------
* --------------------- MAIN --------------------------------
* -----------------------------------------------------------
* -----------------------------------------------------------
Start-of-selection.
perform init.
perform DATEN_EINFUEGEN.
perform Endeverarbeitung.
Perform Anzahl_vermerken.
perform pc_ausgabe.
Perform SERVER_FILE.
* perform ALV_ausgabe.
exit.
* -----------------------------------------------------------
* -----------------------------------------------------------
* --------------------- MAIN --------------------------------
* -----------------------------------------------------------
* -----------------------------------------------------------
form SERVER_FILE.
DATA : file(255) type c value 'BSP_HIE.txt'.
delete dataset file.
OPEN DATASET file for output IN TEXT MODE encoding default.
if sy-subrc = 0.
loop at it_hie.
move-corresponding it_hie to it_f.
transfer it_f to file.
endloop.
CLOSE DATASET file.
endif.
endform. "SERVER_FILE
*---------------------------------------------------------------------*
* FORM pc_ausgabe *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form pc_ausgabe.
DATA: datei type string.
loop at it_hie.
move-corresponding it_hie to it_f.
append it_f.
endloop.
DATei = 'C:\temp\BSP_hie.txt'.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
FILENAME = datei
* FILETYPE = 'ASC'
* APPEND = ' '
* WRITE_FIELD_SEPARATOR = ' '
* HEADER = '00'
* TRUNC_TRAILING_BLANKS = ' '
* WRITE_LF = 'X'
* COL_SELECT = ' '
* COL_SELECT_MASK = ' '
* DAT_MODE = ' '
* IMPORTING
* FILELENGTH =
TABLES
DATA_TAB = it_f
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.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
endform. "pc_ausgabe
*---------------------------------------------------------------------*
* FORM Anzahl_Vermerken *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form Anzahl_Vermerken.
loop at it_hie where anzahl <> 0.
concatenate it_hie-TXTLG '(' into it_hie-TXTLG separated by ' '.
write: it_hie-anzahl to text.
shift text left deleting leading space.
if it_hie-NODENAME = ''. it_hie-NODENAME = 'LEER'. endif.
concatenate it_hie-NODENAME '_(' text ')' into it_hie-nodename.
concatenate it_hie-TXTLG text ')' into it_hie-TXTLG.
it_hie-TXTMD = it_hie-TXTLG.
it_hie-TXTsh = it_hie-TXTLG.
modify it_hie.
endloop.
endform. "Anzahl_Vermerken
*---------------------------------------------------------------------*
* FORM Endeverarbeitung *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form Endeverarbeitung.
DATA: l_Ebenensumme type i.
DATA: l_datensatz type numc5.
while g_ebene > 1.
read table g_info index g_ebene.
l_Ebenensumme = g_info-Ebenensumme.
clear g_info.
modify g_info index g_ebene.
g_ebene = g_ebene - 1.
read table g_info index g_ebene.
read table it_hie index g_info-datensatz.
it_hie-anzahl = it_hie-anzahl + l_Ebenensumme.
modify it_hie index g_info-datensatz.
g_info-Ebenensumme = g_info-Ebenensumme + l_Ebenensumme.
g_info-datensatz = g_datensatz.
modify g_info index g_ebene.
endwhile.
endform. "Endeverarbeitung
*---------------------------------------------------------------------*
* FORM append *
*---------------------------------------------------------------------*
* WICHTIG: Die Ebenen beginnen ab EBENE 1.
* Die Daten müssen korrekt sortiert (in der richtigen Reihenfolge)
* übergeben werden.
* Diese Reihenfolge entspricht der Reihenfolge eines komplett
* aufgerissenen Baumes.
form append using ebene type i
beschr type RSTXTLG
von type RSLEAFTO
bis type RSLEAFTO
object type RSIOBJNM
anzahl type i
knoten type RSNODENAME.
DATA: l_ebene type i.
data: l_tabix like sy-tabix.
DATA: l_parent type i.
DATA: l_child type i.
DATA: l_Ebenensumme type i.
DATA: l_datensatz type numc5.
* data: l_name(10).
l_ebene = ebene - 1.
if l_ebene > 0.
g_datensatz = g_datensatz + 1.
* if g_datensatz = 6. break-point.endif.
l_datensatz = g_datensatz.
* concatenate 'ZZ' l_datensatz into l_name.
read table g_info index l_ebene.
l_parent = g_info-datensatz.
if g_ebene = ebene.
* --------------------------------------------------------------------
* Einfügen auf der gleichen EBENE
* --------------------------------------------------------------------
g_info-ebenensumme = g_info-ebenensumme + anzahl.
g_info-datensatz = g_datensatz.
modify g_info index g_ebene.
* --------------------------------------------------------------------
* Neuen Eintrag hinzufügen.
* --------------------------------------------------------------------
it_hie-NODEID = g_datensatz.
it_hie-IOBJNM = object.
it_hie-NODENAME = knoten.
it_hie-LINK = ''.
it_hie-PARENTID = l_parent.
it_hie-CHILDID = ''.
it_hie-NEXTID = ''.
it_hie-DATETO = '99993112'.
it_hie-DATEFROM = '19000101'.
it_hie-LEAFTO = bis.
it_hie-LEAFFROM = von.
it_hie-LANGU = sy-langu.
it_hie-TXTSH = beschr.
it_hie-TXTMD = beschr.
it_hie-TXTLG = beschr.
it_hie-anzahl = anzahl.
append it_hie.
* In den Vorgänger (auf gleicher Ebene) noch den Nachfolger eintragen.
l_tabix = g_datensatz - 1.
read table it_hie index l_tabix.
if it_hie-nextid is initial.
it_hie-nextid = g_datensatz.
endif.
modify it_hie index l_tabix.
elseif g_ebene = l_ebene.
* --------------------------------------------------------------------
* Einfügen eine Ebene Tiefer im Baum (Ebene Rechts rechts bei Explorer
* Darstellung / ein Unterverzeichnis )
* --------------------------------------------------------------------
g_ebene = ebene.
g_info-ebenensumme = anzahl.
g_info-datensatz = g_datensatz.
modify g_info index g_ebene.
* --------------------------------------------------------------------
* Neuen Eintrag hinzufügen.
* --------------------------------------------------------------------
it_hie-NODEID = g_datensatz.
it_hie-IOBJNM = object.
it_hie-NODENAME = knoten.
it_hie-LINK = ''.
it_hie-PARENTID = l_parent.
it_hie-CHILDID = ''.
it_hie-NEXTID = ''.
it_hie-DATETO = '99993112'.
it_hie-DATEFROM = '19000101'.
it_hie-LEAFTO = bis.
it_hie-LEAFFROM = von.
it_hie-LANGU = sy-langu.
it_hie-TXTSH = beschr.
it_hie-TXTMD = beschr.
it_hie-TXTLG = beschr.
it_hie-anzahl = anzahl.
append it_hie.
* In den Vorgänger noch den Nachfolger eintragen.
read table it_hie index l_parent.
it_hie-CHILDID = g_datensatz.
modify it_hie index l_parent.
else.
* --------------------------------------------------------------------
* Es wurde in eine oder mehrere Ebenen höher gewechselt
* --------------------------------------------------------------------
while g_ebene > ebene.
read table g_info index g_ebene.
l_Ebenensumme = g_info-Ebenensumme.
clear g_info.
modify g_info index g_ebene.
g_ebene = g_ebene - 1.
read table g_info index g_ebene.
read table it_hie index g_info-datensatz.
it_hie-anzahl = it_hie-anzahl + l_Ebenensumme.
if g_ebene = ebene and it_hie-nextid = 0.
it_hie-nextid = g_datensatz.
endif.
modify it_hie index g_info-datensatz.
g_info-Ebenensumme = g_info-Ebenensumme + l_Ebenensumme.
g_info-datensatz = g_datensatz.
modify g_info index g_ebene.
endwhile.
* --------------------------------------------------------------------
* Neuen Eintrag hinzufügen.
* --------------------------------------------------------------------
it_hie-NODEID = g_datensatz.
it_hie-IOBJNM = object.
it_hie-NODENAME = knoten.
it_hie-LINK = ''.
it_hie-PARENTID = l_parent.
it_hie-CHILDID = ''.
it_hie-NEXTID = ''.
it_hie-DATETO = '99993112'.
it_hie-DATEFROM = '19000101'.
it_hie-LEAFTO = bis.
it_hie-LEAFFROM = von.
it_hie-LANGU = sy-langu.
it_hie-TXTSH = beschr.
it_hie-TXTMD = beschr.
it_hie-TXTLG = beschr.
it_hie-anzahl = anzahl.
append it_hie.
* In den Vorgänger noch den Nachfolger eintragen.
read table it_hie index l_parent.
if it_hie-childid = ''.
it_hie-CHILDID = g_datensatz.
modify it_hie index l_parent.
endif.
endif.
else.
* Einfügen des ersten Satzes
g_datensatz = g_datensatz + 1.
l_datensatz = g_datensatz.
* concatenate 'ZZ' l_datensatz into l_name.
* --------------------------------------------------------------------
* Neuen Eintrag hinzufügen.
* --------------------------------------------------------------------
it_hie-NODEID = g_datensatz.
it_hie-IOBJNM = object.
it_hie-NODENAME = knoten.
it_hie-LINK = ''.
it_hie-PARENTID = l_parent.
it_hie-CHILDID = ''.
it_hie-NEXTID = ''.
it_hie-DATETO = '99993112'.
it_hie-DATEFROM = '19000101'.
it_hie-LEAFTO = bis.
it_hie-LEAFFROM = von.
it_hie-LANGU = sy-langu.
it_hie-TXTSH = beschr.
it_hie-TXTMD = beschr.
it_hie-TXTLG = beschr.
it_hie-anzahl = anzahl.
append it_hie.
g_ebene = ebene.
g_info-ebenensumme = anzahl.
g_info-datensatz = g_datensatz.
modify g_info index g_ebene.
endif.
endform. "append
*---------------------------------------------------------------------*
* FORM init *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form init.
clear g_info.
DATA: i type i.
i = 30.
while i > 1.
append g_info.
i = i - 1.
endwhile.
clear g_ebene.
clear g_datensatz.
endform. "init
*&--------------------------------------------------------------------*
*& Form DATEN_EINFUEGEN
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
form DATEN_EINFUEGEN.
* DATA: l_it like it.
* refresh it.
*
*
* select caapplk camntrans casubtrans count(*)
* into table it
* from /BIC/AZODS_OFF40
* group by caapplk camntrans casubtrans.
*
*
* loop at it.
* write: / sy-tabix, it-caapplk , it-camntrans , it-casubtrans,
* it-anz.
* endloop.
* FEST Verdrahtete Beispielshierarchie
Perform append using 1 "Ebene
'Gesamt' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
0 "Anzahl
'GESAMT'.
Perform append using 2 "Ebene
'Bereich 2' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
0 "Anzahl
'BEREICH2'.
Perform append using 3 "Ebene
'Gruppe 2.1' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
5 "Anzahl
'GR2.1'.
Perform append using 3 "Ebene
'Gruppe 2.2' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
9 "Anzahl
'GR2.2'.
Perform append using 2 "Ebene
'Bereich 3' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
0 "Anzahl
'BEREICH3'.
Perform append using 3 "Ebene
'Gruppe 3.1' "Beschreibung
'' "von
'' "bis
'0HIER_NODE' "Objekt (0HIER_NODE für Textknoten)
7 "Anzahl
'GR3.1'.
* In diesem Beispiel werden die Daten sortiert nach Hierarchieaufriss
* an die Hierarchie übergeben.
* loop at it.
*
* if l_it-caapplk <> it-caapplk.
* clear l_it.
* textK = it-caapplk.
* clear /BI0/TCAAPPLK.
* select single * from /BI0/TCAAPPLK where caapplk = it-caapplk and
* langu = sy-langu.
* text = /BI0/TCAAPPLK-txtmd.
* if text = ''. text = 'Nicht definiert'. endif.
*
* if textk = ''. TEXTK = '_'. endif.
*
* Perform append using 2 "Ebene
* text "Beschreibung
* '' "von
* '' "bis
* '0CAAPPLK' "Objekt
* 0 "Anzahl
* textk. "knotenname
* endif.
*
*
* if l_it-camntrans <> it-camntrans.
* clear l_it.
* concatenate it-caapplk it-camntrans into textk.
* clear /BI0/TCAMNTRANS.
* select single * from /BI0/TCAMNTRANS
* where caapplk = it-caapplk and
* camntrans = it-camntrans and
* langu = sy-langu.
*
* text = /BI0/TCAMNTRANS-txtlg.
*
* Perform append using 3 "Ebene
* text "Beschreibung
* '' "von
* '' "bis
* '0CAMNTRANS' "Objekt
* 0 "Anzahl
* textk. "knotenname
* endif.
*
*
* if l_it-casubtrans <> it-casubtrans.
* clear l_it.
* concatenate it-camntrans it-caapplk it-casubtrans into textk.
* clear /BI0/TCASUBTRANS.
* select single * from /BI0/TCASUBTRANS
* where camntrans = it-camntrans and
* caapplk = it-caapplk and
* casubtrans = it-casubtrans and
* langu = sy-langu.
*
* text = /BI0/TCASUBTRANS-txtlg.
*
* Perform append using 4 "Ebene
* text "Beschreibung
* '' "von
* '' "bis
* '0CASUBTRANS' "Objekt
* 0 "Anzahl
* textk. "knotenname
* endif.
*
*
* l_it = it.
*
* endloop.
endform. "DATEN_EINFUEGEN