*---------------------------------------------------------------------*
*                     Z _ B J H _ G R A P H I C S                     *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Import von Grafiken für SmartForms oder SapScript                   *
* Laden von BMP (oder TIF) Grafiken für die Benutzung dieser Grafiken *
* in SmartForms oder SapScript-Formularen (Tabelle STXBITMAPS). Es    *
* könnte zwar auch der Baustein genutzt werden, jedoch bietet sich mit*
* diesem Programm die Möglichkeit, ohne Batch-Input einen Schwung von *
* Grafiken anlegen zu können.                                         *
*---------------------------------------------------------------------*
* (TX) FB Input-Datei, Excel_in                                       *
*---------------------------------------------------------------------*
* 16.02.2005 BHaa: Programm erstellt                                  *
* 18.02.2005 BHaa: Einleseroutine für Excel eingefügt             V1.0*
*---------------------------------------------------------------------*
REPORT  z_bjh_graphics .

INCLUDE .

TABLES:
 stxbitmaps.

DATA:
 anzahl(6) TYPE n,
 anzahl_fehler LIKE anzahl,
 anzahl_geloescht LIKE anzahl,
 anzahl_loeschfehler LIKE anzahl,
 anzahl_nicht_ersetzt LIKE anzahl,
 fb_ftp(1) TYPE c,
 grafik_anlegen(1) TYPE c.

DATA:
 wa_dateiname LIKE rlgrap-filename,
 wa_bild_titel LIKE bapisignat-prop_value,
 wa_stxbitmaps-tdname      LIKE stxbitmaps-tdname,
 wa_stxbitmaps-tdbtype     LIKE stxbitmaps-tdbtype,
 wa_stxbitmaps-resolution  LIKE stxbitmaps-resolution,
 wa_stxbitmaps-resident    LIKE stxbitmaps-resident,
 wa_stxbitmaps-autoheight  LIKE stxbitmaps-autoheight,

 wa_bildweite LIKE stxbitmaps-widthpix,
 wa_bildhoehe LIKE stxbitmaps-heightpix.

DATA:
 BEGIN OF wa_in,
   grafik(30) TYPE c,      "maximal  70 STXBITMAPS-Name
   dateiname(100) TYPE c,  "maximal 128 rlgrap-filename
   titel(60) TYPE c,
 END OF wa_in,

 BEGIN OF ds_in,
   satz LIKE wa_in,
 END OF ds_in,

 dstab_in LIKE TABLE OF ds_in.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Parameter zum Einlesen und Überschreiben der Grafiken
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-920 FOR FIELD pmxexcel.
* Daten einlesen aus Excel-Tabelle (nur bei lokal möglich)
PARAMETERS pmxexcel  TYPE c DEFAULT ' ' AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-922 FOR FIELD pmersetz.
* soll bereits vorhandene Grafik mit gleichen Namen ersetzt werden
* vorhandene Grafik ersetzen
PARAMETERS pmersetz  TYPE c DEFAULT ' ' AS CHECKBOX.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN: END OF BLOCK a1.

* Steuerung, wohin Datei geschrieben werden soll (Plattform und Name)
* B01=V1.0 Datentransfer. Quellsystem und Quelldatei
* S01=WS-Download=X / FTP=blank
* S02=Titelleiste übertragen J/N
* S05=Datei auf AL11 nach FTP löschen
* S06=Meldungen am Bildschirm
INCLUDE zmgl_bjh_ftp_data.

INITIALIZATION.
* Ein-/Ausgabedefinition für FTP-Datentransfer
 MOVE 'EK_STRAT_GET' TO ftp_key.
 MOVE ' '            TO pm_titel.

 IF sy-batch = 'X'.
* Hintergrundprogramm, muß über FTP laufen
   MOVE ' ' TO pm_ftp.
   MOVE 'bmp_grafik.txt' TO pmout.
 ELSE.
* Sichtprogramm, Speichern standardmäßig auf PC
   MOVE 'X' TO pm_ftp.
   CASE sy-uname.
     WHEN 'RRENAE'.
       MOVE 'd:\haase\sap\daten\bmp_grafik.txt' TO pmout.
     WHEN OTHERS.
       MOVE 'd:\bmp_grafik.txt' TO pmout.
   ENDCASE.
 ENDIF.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.

 CLEAR: anzahl_nicht_ersetzt, anzahl_loeschfehler.

* Daten einlesen aus einer txt-Tabelle oder einer Excel-Datei
 IF pmxexcel = 'X'.
   PERFORM upro-excel_einlesen.
 ELSE.
   PERFORM upro-ftp_datei_in
           TABLES dstab_in
           USING  ds_in.
 ENDIF.

* konnten Daten eingelesen werden
 DESCRIBE TABLE dstab_in LINES anzahl.
 IF anzahl < 1.
   WRITE: / icon_red_light, 'Keine Datensätze eingelesen.'.
 ELSE.
   WRITE: / icon_green_light,
            anzahl, 'Datensätze eingelesen.'.

   MOVE 'X' TO wa_stxbitmaps-autoheight.

   CLEAR: anzahl, anzahl_fehler, anzahl_geloescht,
          anzahl_nicht_ersetzt, anzahl_loeschfehler.

   LOOP AT dstab_in INTO ds_in.
* Bild generell in Großbuchstaben ablegen
     TRANSLATE ds_in-satz-grafik TO UPPER CASE.
* um Typenkonflikte zu vermeiden
     MOVE ds_in-satz-grafik    TO wa_stxbitmaps-tdname.
     MOVE ds_in-satz-dateiname TO wa_dateiname.
     MOVE ds_in-satz-titel     TO wa_bild_titel.
* prüfen, ob Datei bereits angelegt ist
     SELECT SINGLE widthpix heightpix FROM stxbitmaps
     INTO (wa_bildweite, wa_bildhoehe)
     WHERE tdobject = 'GRAPHICS'
     AND   tdname   = wa_stxbitmaps-tdname
     AND   tdid     = 'BMAP'
     AND   tdbtype  = 'BCOL'.                  "Grafik ist farbig
     IF sy-subrc = 0.
* Grafik bereits vorhanden
       IF pmersetz = 'X'.
* Grafik kann ersetzt werden, diese dazu vorher löschen
         DELETE FROM stxbitmaps
         WHERE tdobject = 'GRAPHICS'
         AND   tdname   = wa_stxbitmaps-tdname
         AND   tdid     = 'BMAP'
         AND   tdbtype  = 'BCOL'.
         IF sy-subrc = 0.
* Grafik erfolgreich gelöscht, erneutes Anlegen erlaubt
           MOVE 'X' TO grafik_anlegen.
           ADD 1 TO anzahl_geloescht.
         ELSE.
* Grafik konnte nicht gelöscht werden, dieses sich merken
           MOVE 'F' TO grafik_anlegen.
           ADD 1 TO anzahl_loeschfehler.
         ENDIF.
       ELSE.
* Grafiken sollen nicht überschrieben werden
         MOVE ' ' TO grafik_anlegen.
         ADD 1 TO anzahl_nicht_ersetzt.
       ENDIF.
     ELSE.
* Grafik ist noch nicht angelegt, Anlegen ohne Probleme möglich
       MOVE 'X' TO grafik_anlegen.
     ENDIF.

     IF grafik_anlegen = 'X'.
* neue Grafik einfügen oder vorhandene Grafik überschreiben.
* nicht den Funktionsbaustein nutzen, da dort die Eingabe eines
* Dateinamen von außen her nicht steuerbar ist. Die Einleseroutine ist
* jedoch ein Unterprogramm in diesem Funktionsbaustein
       PERFORM graphic_import_bds(saplstxbitmaps)
               USING    wa_dateiname
                        wa_stxbitmaps-tdname
                        'GRAPHICS'
                        'BMAP'
                        'BCOL'
                        wa_bild_titel
                        wa_stxbitmaps-resident
                        wa_stxbitmaps-autoheight
               CHANGING wa_stxbitmaps-resolution.

*CALL FUNCTION 'SAPSCRIPT_IMPORT_GRAPHIC_BDS'
*     EXPORTING
*          i_object          = 'GRAPHICS'
*          i_name            = wa_stxbitmaps-tdname
*          i_id              = 'BMAP'
*          i_btype           = 'BCOL'
*          i_resident        = ' '
*          i_autoheight      = 'X'
*     IMPORTING
*          e_name            = wa_stxbitmaps-tdname
*          e_btype           = wa_stxbitmaps-tdbtype
*          e_resolution      = wa_stxbitmaps-resolution
*          e_resident        = wa_stxbitmaps-resident
*          e_autoheight      = wa_stxbitmaps-autoheight
*     EXCEPTIONS
*          invalid_object    = 1
*          invalid_id        = 2
*          invalid_btype     = 3
*          conversion_failed = 4
*          enqueue_failed    = 5
*          canceled          = 6
*          OTHERS            = 7.

       IF sy-subrc = 0.
         ADD 1 TO anzahl.
       ELSE.
         ADD 1 TO anzahl_fehler.
       ENDIF.
     ENDIF.
   ENDLOOP.
 ENDIF.

* statistische Übersicht
 IF pmmeld = 'X'.
   IF anzahl_geloescht > 0
   OR anzahl_loeschfehler > 0.
* Probleme beim Löschen aufgetreten
     IF anzahl_loeschfehler > 0.
       WRITE: / icon_red_light, anzahl_loeschfehler,
                'Grafiken konnten nicht gelöscht werden'.
     ELSE.
       WRITE: / icon_green_light,
                'Alle Grafiken ohne Probleme gelöscht'.
     ENDIF.
* wieviele Bilder konnten gelöscht werden. Waren alle Löschungen
* erfolgreich ohne Probleme, grüne Ampel, sonst gelb
     IF anzahl_geloescht > 0.
       IF anzahl_loeschfehler = 0.
         WRITE: / icon_green_light.
       ELSE.
         WRITE: / icon_yellow_light.
       ENDIF.
       WRITE: anzahl_geloescht, 'Grafiken sind gelöscht worden'.
     ELSE.
       WRITE: / icon_red_light,
                'Es wurden keine Grafiken gelöscht !'.
     ENDIF.
   ENDIF.

* sollen vorhandene Grafiken nicht ersetzt / überschrieben werden
   IF pmersetz = ' '.
     IF anzahl_nicht_ersetzt = 0.
       WRITE : / icon_green_light,
                 'Alle Grafiken sind neue Bilder'.
     ELSE.
       WRITE : / icon_yellow_light,
                anzahl_nicht_ersetzt, 'Grafiken sind schon vorhanden.'.
     ENDIF.
   ENDIF.

* Statistik über das Anlegen von Grafiken
   IF anzahl < 1.
     WRITE: / icon_yellow_light,
              'Es wurden keine Grafiken angelegt'.
   ELSE.
     IF anzahl_fehler = 0.
       WRITE: / icon_green_light.
     ELSE.
       WRITE: / icon_yellow_light.
     ENDIF.
     WRITE: anzahl, 'Grafiken wurden angelegt'.
     IF anzahl_fehler = 0.
       WRITE: / icon_green_light,
                'Alle Grafiken ohne Probleme angelegt'.
     ELSE.
       WRITE: / icon_red_light, anzahl_fehler,
                'Grafiken konnten nicht angelegt werden'.
     ENDIF.
   ENDIF.
 ENDIF.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                     E X C E L _ E I N L E S E N                     *
*---------------------------------------------------------------------*
* einlesen der Excel-Tabelle. Da diese Aktion nicht so häufig ist,    *
* wird der Standarddateiname verwendet, der im Einstiegsbild vorgege- *
* ben wird. Nur die Extension wird gegen xls abgetauscht.             *
*---------------------------------------------------------------------*
* ]=> dstab_in: Tabelle mit eingelesenen Daten.                       *
*---------------------------------------------------------------------*
FORM upro-excel_einlesen.

 DATA:
   quelldatei LIKE rlgrap-filename,

   zw_row LIKE alsmex_tabline-row,
   wa_excel LIKE alsmex_tabline,
   BEGIN OF itab_excel OCCURS 0.
         INCLUDE STRUCTURE alsmex_tabline.
 DATA:
   END OF itab_excel.

 MOVE pmout TO quelldatei.
 REPLACE '.txt' WITH '.xls' INTO quelldatei.

 CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
           filename                = quelldatei
           i_begin_col             = 1
           i_begin_row             = 1
           i_end_col               = 11
           i_end_row               = 50000
      TABLES
           intern                  = itab_excel
*      EXCEPTIONS
*           INCONSISTENT_PARAMETERS = 1
*           UPLOAD_OLE              = 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.

 SORT itab_excel BY row col.

 CLEAR: dstab_in, ds_in, zw_row. REFRESH: dstab_in.

* Excel-Datei hat festes Format, dieses mit dem Aufbau hier abgleichen
 LOOP AT itab_excel INTO wa_excel.
   IF wa_excel-row <> zw_row.
     IF  NOT zw_row            IS INITIAL
     AND NOT ds_in-satz-grafik IS INITIAL.
* nur Sätze anlegen, wo der Iata-Flughafencode gefüllt ist
       APPEND ds_in TO dstab_in.
     ENDIF.
     MOVE wa_excel-row TO zw_row.
     CLEAR ds_in-satz.
   ENDIF.

   CASE wa_excel-col.
     WHEN 1.
       MOVE wa_excel-value TO ds_in-satz-dateiname.
     WHEN 2.
       MOVE wa_excel-value TO ds_in-satz-grafik.
     WHEN 3.
       MOVE wa_excel-value TO ds_in-satz-titel.
   ENDCASE.
 ENDLOOP.

 IF NOT zw_row IS INITIAL.
* es wurde mindestens 1 Datensatz gefunden, nun noch die Tabelle für
* die Anzeige um Grafiken ergänzen
   APPEND ds_in TO dstab_in.
 ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*                     F T P _ D A T E I _ I N                         *
*---------------------------------------------------------------------*
* Datei einlesen                                                      *
*---------------------------------------------------------------------*
* ]=> ptab_in: Tabelle mit den eingelesenen Daten                     *
* =>] wa_in: Struktur für die Tabelle (wird bei Unix benötigt)        *
*---------------------------------------------------------------------*
FORM upro-ftp_datei_in
    TABLES ptab_in
    USING  wa_in.

* gedrehte Logik für das Schreiben auf FTP. Schreiben auf Unix nicht
* über Oberflächensteuerung möglich
 IF pm_ftp = 'X'.
   MOVE ' ' TO fb_ftp.
 ELSE.
   MOVE 'X' TO fb_ftp.
 ENDIF.

 CALL FUNCTION 'Z_F_DATEI_IN'
      EXPORTING
           ds_in           = wa_in
           p_ftp_transfer  = fb_ftp
           p_ftp_key       = ftp_key
           p_dateiname     = pmout
           p_datei_ext     = pmdattyp
*           P_DATEI_ERSETZ  =
*           P_TITEL         = ' '
           p_meld          = pmmeld
           p_al11_del      = i_ad_del
*      IMPORTING
           p_anzahl        = anzahl
           p_anzahl_fehler = anzahl_fehler
*           UEB_IN          =
      TABLES
           dstab_in        = ptab_in.

ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 21.5.2005