[51000] in SAPr3-news

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

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

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