[ABAP] MASS UPLOAD GRAPHICS

*&---------------------------------------------------------------------*
*& Report  YSE78_MASS                                                  *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*
REPORT  ZSE78_MASS
MESSAGE-ID ZX.

DATA: IT_FILES LIKE RLGRAP-FILENAME OCCURS 0 WITH HEADER LINE.
DATA: BDS_DESCRIPTION  LIKE BAPISIGNAT-PROP_VALUE.
TYPES: SBDST_CLASSNAME LIKE BAPIBDS01-CLASSNAME,
       SBDST_CLASSTYPE LIKE BAPIBDS01-CLASSTYPE,
       SBDST_DOC_VAR_TG LIKE BAPIBDS01-DOC_VAR_TG,
       SBDST_OBJECT_KEY LIKE BAPIBDS01-OBJKEY.
TYPES:
  TY_BOOLEAN(1) TYPE C.

CONSTANTS:
      C_STDTEXT  LIKE THEAD-TDOBJECT VALUE 'TEXT',
      C_GRAPHICS LIKE THEAD-TDOBJECT VALUE 'GRAPHICS',
      C_BMON     LIKE THEAD-TDID     VALUE 'BMON',
      C_BCOL     LIKE THEAD-TDID     VALUE 'BCOL'.
CONSTANTS:
  C_TRUE  TYPE TY_BOOLEAN VALUE 'X',
  C_FALSE TYPE TY_BOOLEAN VALUE SPACE.
CONSTANTS:
  C_BDS_CLASSNAME TYPE SBDST_CLASSNAME VALUE 'DEVC_STXD_BITMAP',
  C_BDS_CLASSTYPE TYPE SBDST_CLASSTYPE VALUE 'OT',          " others
  C_BDS_MIMETYPE  TYPE BDS_MIMETP      VALUE 'application/octet-stream',
  C_BDS_ORIGINAL  TYPE SBDST_DOC_VAR_TG VALUE 'OR'.

*INCLUDE LSTXBITMAPSF05.

PARAMETERS: P_FILE LIKE IBIPPARMS-PATH.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
  DATA: L_LENGTH TYPE I,
        L_POS TYPE I.

  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      FILE_NAME = P_FILE.

  L_LENGTH = STRLEN( P_FILE ).

  DO L_LENGTH TIMES.
    L_POS = L_LENGTH - SY-INDEX.
    IF P_FILE+L_POS(1) = '/'.
      EXIT.
    ENDIF.
  ENDDO.

  ADD 1 TO L_POS.
  L_LENGTH = L_LENGTH - L_POS.
  CLEAR P_FILE+L_POS(L_LENGTH).

START-OF-SELECTION.

  CALL FUNCTION 'KCD_FRONT_END_DIRECTORY_READ'
    EXPORTING
      I_PATH                    = P_FILE
*   IMPORTING
*     E_PURE_PATH               =
    TABLES
      E_DIRECTORY               = IT_FILES
   EXCEPTIONS
     DOWNLOAD                  = 1
     UPLOAD                    = 2
     EXECUTE                   = 3
     DIRECTORY_NOT_EXIST       = 4
     DIRECTORY                 = 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.


  LOOP AT IT_FILES.

    TRANSLATE IT_FILES TO UPPER CASE.

    CHECK it_files cp '*.BMP' or
          it_files cp '*.TIF'.

    PERFORM GRAPHICS_IMPORT_BDS.
  ENDLOOP.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  GRAPHICS_IMPORT_BDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GRAPHICS_IMPORT_BDS .
  FIELD-SYMBOLS <L>.
  DATA: L_EXTENSION TYPE RLGRAP-FILENAME,
        L_LEN       TYPE I,
        L_QUESTION(400),
        L_ANSWER(1),
        L_DOCID     TYPE STXBITMAPS-DOCID.
  DATA: GI_RESOLUTION LIKE STXBITMAPS-RESOLUTION,
        GI_FILENAME(128) TYPE C,
        GI_NAME LIKE STXBITMAPS-TDNAME.

  CONCATENATE P_FILE IT_FILES INTO GI_FILENAME.
  REPLACE '.BMP' IN IT_FILES WITH ''.
  MOVE IT_FILES TO GI_NAME.
  TRANSLATE GI_NAME TO UPPER CASE.

*  PERFORM IMPORT_BITMAP_BDS(LSTXBITMAPSF05)
*                            USING    GI_FILENAME
*                                     GI_NAME
*                                     'GRAPHICS'
*                                     'BMAP'
*                                     'BCOL'
*                                     'BMP'
*                                     ''
*                                     ''
*                                     'X'
*                                     'X'
*                            CHANGING L_DOCID
*                                     GI_RESOLUTION.

  PERFORM IMPORT_BITMAP_BDS
                            USING    GI_FILENAME
                                     GI_NAME
                                     'GRAPHICS'
                                     'BMAP'
                                     'BCOL'
                                     'BMP'
                                     ''
                                     ''
                                     'X'
                                     'X'
                            CHANGING L_DOCID
                                     GI_RESOLUTION.

ENDFORM.                    " GRAPHICS_IMPORT_BDS
*&---------------------------------------------------------------------*
*&      Form  IMPORT_BITMAP_BDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM IMPORT_BITMAP_BDS
        USING    P_FILENAME       TYPE RLGRAP-FILENAME
                 P_NAME           TYPE STXBITMAPS-TDNAME
                 P_OBJECT         TYPE STXBITMAPS-TDOBJECT
                 P_ID             TYPE STXBITMAPS-TDID
                 P_BTYPE          TYPE STXBITMAPS-TDBTYPE
                 P_FORMAT         TYPE C
                 P_TITLE          LIKE BDS_DESCRIPTION
                 P_RESIDENT       TYPE STXBITMAPS-RESIDENT
                 P_AUTOHEIGHT     TYPE STXBITMAPS-AUTOHEIGHT
                 P_BMCOMP         TYPE STXBITMAPS-BMCOMP
        CHANGING P_DOCID          TYPE STXBITMAPS-DOCID
                 P_RESOLUTION     TYPE STXBITMAPS-RESOLUTION.

  DATA: L_OBJECT_KEY TYPE SBDST_OBJECT_KEY.
  DATA: L_TAB        TYPE DDOBJNAME.
  DATA: BEGIN OF L_BITMAP OCCURS 0,
          L(64) TYPE X,
        END OF L_BITMAP.
  DATA: L_FILENAME        TYPE STRING,
        L_BYTECOUNT       TYPE I,
        L_BDS_BYTECOUNT   TYPE I.
  DATA: L_COLOR(1)        TYPE C,
        L_WIDTH_TW        TYPE STXBITMAPS-WIDTHTW,
        L_HEIGHT_TW       TYPE STXBITMAPS-HEIGHTTW,
        L_WIDTH_PIX       TYPE STXBITMAPS-WIDTHPIX,
        L_HEIGHT_PIX      TYPE STXBITMAPS-HEIGHTPIX.
  DATA: L_BDS_OBJECT      TYPE REF TO CL_BDS_DOCUMENT_SET,
        L_BDS_CONTENT     TYPE SBDST_CONTENT,
        L_BDS_COMPONENTS  TYPE SBDST_COMPONENTS,
        WA_BDS_COMPONENTS TYPE LINE OF SBDST_COMPONENTS,
        L_BDS_SIGNATURE   TYPE SBDST_SIGNATURE,
        WA_BDS_SIGNATURE  TYPE LINE OF SBDST_SIGNATURE,
        L_BDS_PROPERTIES  TYPE SBDST_PROPERTIES,
        WA_BDS_PROPERTIES TYPE LINE OF SBDST_PROPERTIES.
  DATA  WA_STXBITMAPS TYPE STXBITMAPS.

* Enqueue
  PERFORM ENQUEUE_GRAPHIC USING P_OBJECT
                                P_NAME
                                P_ID
                                P_BTYPE.

* File transfer
  L_FILENAME = P_FILENAME.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      FILENAME                = L_FILENAME
      FILETYPE                = 'BIN'
    IMPORTING
      FILELENGTH              = L_BYTECOUNT
    TABLES
      DATA_TAB                = L_BITMAP
    EXCEPTIONS
      FILE_OPEN_ERROR         = 2
      FILE_READ_ERROR         = 3
      NO_BATCH                = 1
      GUI_REFUSE_FILETRANSFER = 4
      INVALID_TYPE            = 5
      NO_AUTHORITY            = 6
      UNKNOWN_ERROR           = 7
      BAD_DATA_FORMAT         = 8
      HEADER_NOT_ALLOWED      = 9
      SEPARATOR_NOT_ALLOWED   = 10
      HEADER_TOO_LONG         = 11
      UNKNOWN_DP_ERROR        = 12
      ACCESS_DENIED           = 13
      DP_OUT_OF_MEMORY        = 14
      DISK_FULL               = 15
      DP_TIMEOUT              = 16
      OTHERS                  = 17.
  CASE SY-SUBRC.
    WHEN 0.
    WHEN 2.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E811 WITH P_FILENAME.
    WHEN 3.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E812 WITH P_FILENAME.
    WHEN OTHERS.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E813 WITH P_FILENAME.
  ENDCASE.

  IF P_BTYPE = C_BMON.
    L_COLOR = C_FALSE.
  ELSE.
    L_COLOR = C_TRUE.
  ENDIF.

* Bitmap conversion
  CALL FUNCTION 'SAPSCRIPT_CONVERT_BITMAP_BDS'
    EXPORTING
      COLOR                    = L_COLOR
      FORMAT                   = P_FORMAT
      RESIDENT                 = P_RESIDENT
      BITMAP_BYTECOUNT         = L_BYTECOUNT
      COMPRESS_BITMAP          = P_BMCOMP
    IMPORTING
      WIDTH_TW                 = L_WIDTH_TW
      HEIGHT_TW                = L_HEIGHT_TW
      WIDTH_PIX                = L_WIDTH_PIX
      HEIGHT_PIX               = L_HEIGHT_PIX
      DPI                      = P_RESOLUTION
      BDS_BYTECOUNT            = L_BDS_BYTECOUNT
    TABLES
      BITMAP_FILE              = L_BITMAP
      BITMAP_FILE_BDS          = L_BDS_CONTENT
    EXCEPTIONS
      FORMAT_NOT_SUPPORTED     = 1
      NO_BMP_FILE              = 2
      BMPERR_INVALID_FORMAT    = 3
      BMPERR_NO_COLORTABLE     = 4
      BMPERR_UNSUP_COMPRESSION = 5
      BMPERR_CORRUPT_RLE_DATA  = 6
      OTHERS                   = 7.
  IF SY-SUBRC <> 0.
    PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                  P_NAME
                                  P_ID
                                  P_BTYPE.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
    RAISING CONVERSION_FAILED.
  ENDIF.

* Save bitmap in BDS
  CREATE OBJECT L_BDS_OBJECT.

  WA_BDS_COMPONENTS-DOC_COUNT  = '1'.
  WA_BDS_COMPONENTS-COMP_COUNT = '1'.
  WA_BDS_COMPONENTS-MIMETYPE   = C_BDS_MIMETYPE.
  WA_BDS_COMPONENTS-COMP_SIZE  = L_BDS_BYTECOUNT.
  APPEND WA_BDS_COMPONENTS TO L_BDS_COMPONENTS.

  IF P_DOCID IS INITIAL.          " graphic is new

    WA_BDS_SIGNATURE-DOC_COUNT = '1'.
    APPEND WA_BDS_SIGNATURE TO L_BDS_SIGNATURE.

    CALL METHOD L_BDS_OBJECT->CREATE_WITH_TABLE
      EXPORTING
        CLASSNAME  = C_BDS_CLASSNAME
        CLASSTYPE  = C_BDS_CLASSTYPE
        COMPONENTS = L_BDS_COMPONENTS
        CONTENT    = L_BDS_CONTENT
      CHANGING
        SIGNATURE  = L_BDS_SIGNATURE
        OBJECT_KEY = L_OBJECT_KEY
      EXCEPTIONS
        OTHERS     = 1.
    IF SY-SUBRC <> 0.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E285 WITH P_NAME  'BDS'.
    ENDIF.
    READ TABLE L_BDS_SIGNATURE INDEX 1 INTO WA_BDS_SIGNATURE
    TRANSPORTING DOC_ID.
    IF SY-SUBRC = 0.
      P_DOCID = WA_BDS_SIGNATURE-DOC_ID.
    ELSE.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E285 WITH P_NAME 'BDS'.
    ENDIF.

  ELSE.                " graphic already exists
********* read object_key for faster access *****
    CLEAR L_OBJECT_KEY.
    SELECT SINGLE * FROM STXBITMAPS INTO WA_STXBITMAPS
        WHERE TDOBJECT = P_OBJECT
          AND TDID     = P_ID
          AND TDNAME   = P_NAME
          AND TDBTYPE  = P_BTYPE.
    SELECT SINGLE TABNAME FROM BDS_LOCL INTO L_TAB
       WHERE CLASSNAME = C_BDS_CLASSNAME
          AND CLASSTYPE = C_BDS_CLASSTYPE.
    IF SY-SUBRC = 0.
      SELECT SINGLE OBJECT_KEY FROM (L_TAB) INTO L_OBJECT_KEY
        WHERE LOIO_ID = WA_STXBITMAPS-DOCID+10(32)
          AND CLASSNAME = C_BDS_CLASSNAME
            AND CLASSTYPE = C_BDS_CLASSTYPE.
    ENDIF.
******** read object_key end ********************

    CALL METHOD L_BDS_OBJECT->UPDATE_WITH_TABLE
      EXPORTING
        CLASSNAME     = C_BDS_CLASSNAME
        CLASSTYPE     = C_BDS_CLASSTYPE
        OBJECT_KEY    = L_OBJECT_KEY
        DOC_ID        = P_DOCID
        DOC_VER_NO    = '1'
        DOC_VAR_ID    = '1'
      CHANGING
        COMPONENTS    = L_BDS_COMPONENTS
        CONTENT       = L_BDS_CONTENT
      EXCEPTIONS
        NOTHING_FOUND = 1
        OTHERS        = 2.
    IF SY-SUBRC = 1.   " inconsistency STXBITMAPS - BDS; repeat check in
      WA_BDS_SIGNATURE-DOC_COUNT = '1'.
      APPEND WA_BDS_SIGNATURE TO L_BDS_SIGNATURE.

      CALL METHOD L_BDS_OBJECT->CREATE_WITH_TABLE
        EXPORTING
          CLASSNAME  = C_BDS_CLASSNAME
          CLASSTYPE  = C_BDS_CLASSTYPE
          COMPONENTS = L_BDS_COMPONENTS
          CONTENT    = L_BDS_CONTENT
        CHANGING
          SIGNATURE  = L_BDS_SIGNATURE
          OBJECT_KEY = L_OBJECT_KEY
        EXCEPTIONS
          OTHERS     = 1.
      IF SY-SUBRC <> 0.
        PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                      P_NAME
                                      P_ID
                                      P_BTYPE.
        MESSAGE E285 WITH P_NAME 'BDS'.
      ENDIF.
      READ TABLE L_BDS_SIGNATURE INDEX 1 INTO WA_BDS_SIGNATURE
      TRANSPORTING DOC_ID.
      IF SY-SUBRC = 0.
        P_DOCID = WA_BDS_SIGNATURE-DOC_ID.
      ELSE.
        PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                      P_NAME
                                      P_ID
                                      P_BTYPE.
        MESSAGE E285 WITH P_NAME 'BDS'.
      ENDIF.

    ELSEIF SY-SUBRC = 2.
      PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                    P_NAME
                                    P_ID
                                    P_BTYPE.
      MESSAGE E285 WITH P_NAME 'BDS'.
    ENDIF.

  ENDIF.

* Save bitmap header in STXBITPMAPS
  WA_STXBITMAPS-TDNAME     = P_NAME.
  WA_STXBITMAPS-TDOBJECT   = P_OBJECT.
  WA_STXBITMAPS-TDID       = P_ID.
  WA_STXBITMAPS-TDBTYPE    = P_BTYPE.
  WA_STXBITMAPS-DOCID      = P_DOCID.
  WA_STXBITMAPS-WIDTHPIX   = L_WIDTH_PIX.
  WA_STXBITMAPS-HEIGHTPIX  = L_HEIGHT_PIX.
  WA_STXBITMAPS-WIDTHTW    = L_WIDTH_TW.
  WA_STXBITMAPS-HEIGHTTW   = L_HEIGHT_TW.
  WA_STXBITMAPS-RESOLUTION = P_RESOLUTION.
  WA_STXBITMAPS-RESIDENT   = P_RESIDENT.
  WA_STXBITMAPS-AUTOHEIGHT = P_AUTOHEIGHT.
  WA_STXBITMAPS-BMCOMP     = P_BMCOMP.
  INSERT INTO STXBITMAPS VALUES WA_STXBITMAPS.
  IF SY-SUBRC <> 0.
    UPDATE STXBITMAPS FROM WA_STXBITMAPS.
    IF SY-SUBRC <> 0.
      MESSAGE E285 WITH P_NAME 'STXBITMAPS'.
    ENDIF.
  ENDIF.

* Set description in BDS attributes
  WA_BDS_PROPERTIES-PROP_NAME  = 'DESCRIPTION'.
  WA_BDS_PROPERTIES-PROP_VALUE = P_TITLE.
  APPEND WA_BDS_PROPERTIES TO L_BDS_PROPERTIES.

  CALL METHOD L_BDS_OBJECT->CHANGE_PROPERTIES
    EXPORTING
      CLASSNAME  = C_BDS_CLASSNAME
      CLASSTYPE  = C_BDS_CLASSTYPE
      OBJECT_KEY = L_OBJECT_KEY
      DOC_ID     = P_DOCID
      DOC_VER_NO = '1'
      DOC_VAR_ID = '1'
    CHANGING
      PROPERTIES = L_BDS_PROPERTIES
    EXCEPTIONS
      OTHERS     = 1.

  PERFORM DEQUEUE_GRAPHIC USING P_OBJECT
                                P_NAME
                                P_ID
                                P_BTYPE.

ENDFORM.                    "IMPORT_BITMAP_BDS
*&---------------------------------------------------------------------*
*&      Form  DEQUEUE_GRAPHIC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_OBJECT  text
*      -->P_P_NAME  text
*      -->P_P_ID  text
*      -->P_P_BTYPE  text
*----------------------------------------------------------------------*
FORM DEQUEUE_GRAPHIC  USING    P_OBJECT
                               P_NAME
                               P_ID
                               P_BTYPE.
  CALL FUNCTION 'DEQUEUE_ESSGRABDS'
       EXPORTING
*           MODE_STXBITMAPS = 'E'
*           X_TDOBJECT      = ' '
*           X_TDNAME        = ' '
*           X_TDID          = ' '
*           X_TDBTYPE       = ' '
*           _SCOPE          = '3'
*           _SYNCHRON       = ' '
*           _COLLECT        = ' '
            TDOBJECT        = P_OBJECT
            TDNAME          = P_NAME
            TDID            = P_ID
            TDBTYPE         = P_BTYPE.
ENDFORM.                    " DEQUEUE_GRAPHIC
*&---------------------------------------------------------------------*
*&      Form  ENQUEUE_GRAPHIC
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_P_OBJECT  text
*      -->P_P_NAME  text
*      -->P_P_ID  text
*      -->P_P_BTYPE  text
*----------------------------------------------------------------------*
FORM ENQUEUE_GRAPHIC  USING    P_OBJECT
                               P_NAME
                               P_ID
                               P_BTYPE.
  CALL FUNCTION 'ENQUEUE_ESSGRABDS'
       EXPORTING
*           MODE_STXBITMAPS = 'E'
            TDOBJECT        = P_OBJECT
            TDNAME          = P_NAME
            TDID            = P_ID
            TDBTYPE         = P_BTYPE
*           X_TDOBJECT      = ' '
*           X_TDNAME        = ' '
*           X_TDID          = ' '
*           X_TDBTYPE       = ' '
*           _SCOPE          = '2'
*           _WAIT           = ' '
*           _COLLECT        = ' '
       EXCEPTIONS
            FOREIGN_LOCK    = 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
    RAISING ENQUEUE_FAILED.
  ENDIF.

ENDFORM.                    " ENQUEUE_GRAPHIC
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值