最近遇到一个需求需要将外围系统传输,图片放到smartforms上用于打印,外围系统是直接将图片上传到了文件共享盘,通过接口将图片的URL链接发送给sap,并存储在底表中
注:如果16进制数据转化为BMP格式时报错,可能是开发机的sm59中的rfc没有成功链接,到测试机或者正式机看下如果可以链接成功,即可以在测试机使用
如图所示
本文的实现方式:通过HTTP请求访问,获取到图片的16进制数据,然后将图片数据转化为bmp格式,重构sap标准form :IMPORT_BITMAP_BDS为IMPORT_BITMAP_BDS_16将图片上传到se78,并直接指定图片的名称,下次打印时图片即会覆盖,避免了,上传大量图片到sap服务器的缺点.
代码如下:
REPORT ZABAP073. TABLES:ZTMM001. DATA: URL TYPE STRING . DATA: CONTENT TYPE XSTRING. DATA:IN_PICTURE TYPE STRING . DATA : HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT. DATA: GO_IMAGE_PROCESSOR TYPE REF TO CL_FXS_IMAGE_PROCESSOR, G_HANDLE TYPE I. DATA:G_BUFFER_OLD TYPE XSTRING, G_BUFFER_NEW TYPE XSTRING. DATA: L_TYPE TYPE STRING, L_XRES TYPE I, L_YRES TYPE I, L_XDPI TYPE I, L_YDPI TYPE I, L_BITDEPTH TYPE I. DATA: E_TYPE TYPE SY-MSGTY, E_MESSAGE TYPE STRING. DATA: LV_URL TYPE STRING, LT_BINARY TYPE TABLE OF XSTRING, LT_DATA TYPE TABLE OF SOLIX, LV_LENGTH TYPE I. INCLUDE ZABAP073_S01. "屏幕 INCLUDE ZABAP073_F01. *&---------------------------------------------------------------------* *& 包含 ZABAP073_S01 *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-T01. PARAMETERS : * p_URL type string , P_MATNR TYPE ZTMM001-MATNR. SELECTION-SCREEN END OF BLOCK BK1. *&---------------------------------------------------------------------* *& 包含 ZABAP073_F01 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& 包含 ZABAP071_F01 *&---------------------------------------------------------------------* *url = p_url. SELECT SINGLE ZTUPIAN INTO @URL FROM ZTMM001 WHERE MATNR = @P_MATNR. CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL EXPORTING URL = URL IMPORTING CLIENT = HTTP_CLIENT EXCEPTIONS ARGUMENT_NOT_FOUND = 1 PLUGIN_NOT_ACTIVE = 2 INTERNAL_ERROR = 3 OTHERS = 4. IF SY-SUBRC = 0. HTTP_CLIENT->SEND( ). call method cl_http_client=>GET_LAST_ERROR importing message = zmessage. HTTP_CLIENT->RECEIVE( ). call method cl_http_client=>GET_LAST_ERROR importing message = zmessage. CONTENT = HTTP_CLIENT->RESPONSE->GET_DATA( ). call method cl_http_client=>GET_LAST_ERROR importing message = zmessage. HTTP_CLIENT->CLOSE( ). ENDIF. IF CONTENT IS NOT INITIAL. G_BUFFER_OLD = CONTENT. CREATE OBJECT GO_IMAGE_PROCESSOR. "添加到IMAGE_PROCESSOR中 G_HANDLE = GO_IMAGE_PROCESSOR->ADD_IMAGE( IV_DATA = G_BUFFER_OLD IV_IMAGE_NAME = '456' ). "尺寸缩小至100*100 CALL METHOD GO_IMAGE_PROCESSOR->GET_INFO EXPORTING IV_HANDLE = G_HANDLE IMPORTING EV_MIMETYPE = L_TYPE EV_XRES = L_XRES EV_YRES = L_YRES EV_XDPI = L_XDPI EV_YDPI = L_YDPI EV_BITDEPTH = L_BITDEPTH. IF L_XRES > L_YRES. L_YRES = L_YRES / L_XRES / 100. L_XRES = 100. ELSE. L_XRES = L_XRES / L_YRES / 100. L_YRES = 100. ENDIF. "压缩图片 CALL METHOD GO_IMAGE_PROCESSOR->RESIZE EXPORTING IV_HANDLE = G_HANDLE IV_XRES = L_YRES IV_YRES = L_YRES. "转为BMP格式 CALL METHOD GO_IMAGE_PROCESSOR->CONVERT EXPORTING IV_HANDLE = G_HANDLE IV_FORMAT = 'image/x-ms-bmp'. "取压缩后的图片 CALL METHOD GO_IMAGE_PROCESSOR->GET_IMAGE EXPORTING IV_HANDLE = G_HANDLE RECEIVING RV_XSTRING = G_BUFFER_NEW. DATA: BEGIN OF P_BITMAP OCCURS 0, L(64) TYPE X, END OF P_BITMAP. DATA: P_FILENAME TYPE RLGRAP-FILENAME, P_NAME TYPE STXBITMAPS-TDNAME, P_TITLE LIKE BAPISIGNAT-PROP_VALUE, P_DOCID TYPE STXBITMAPS-DOCID, P_RESOLUTION TYPE STXBITMAPS-RESOLUTION, P_BYTECOUNT TYPE I. "上传bmp图片 CLEAR:P_FILENAME,P_NAME,P_DOCID,P_RESOLUTION. P_FILENAME = ''. P_NAME = 'TP'. P_TITLE = '图片'. P_BYTECOUNT = XSTRLEN( G_BUFFER_NEW ). CALL FUNCTION 'SCMS_XSTRING_TO_BINARY' EXPORTING BUFFER = G_BUFFER_NEW * APPEND_TO_TABLE = ' ' * IMPORTING * OUTPUT_LENGTH = TABLES BINARY_TAB = P_BITMAP. PERFORM IMPORT_BITMAP_BDS_16 "IN PROGRAM SAPLSTXBITMAPS USING P_FILENAME "文件路径 P_NAME "p_name "名字 'GRAPHICS'"p_object "对象 固定为 GRAPHIC 'BMAP'"p_id "ID 固定为 BMAP 'BCOL'"'BMON'"p_btype "颜色模式 BMON黑白 BCOL彩色 'BMP'"p_format "BMP 格式 P_TITLE"description "描述 ''"p_resident "依照打印请求驻留在打印机内存中 X 驻留 'X'"p_autoheight "自动高度 'X'"p_bmcomp "是否压缩 P_BYTECOUNT P_BITMAP[] "图片16进制数据 CHANGING P_DOCID "文档ID P_RESOLUTION E_TYPE. "分辨率 IF E_TYPE = 'E'. E_MESSAGE = '图片上传失败!'. ELSE. E_TYPE = 'S'. E_MESSAGE = '成功!'. PERFORM DY_SMARTFORMS. ENDIF. ENDIF. "LSTXBITMAPSTOP *function-pool stxbitmaps message-id td. ***include rstxdata. INCLUDE RSTXBOOL. " Boolean type and constants INCLUDE RSTXDATAITF. " Special characters and strings in ITF INCLUDE RSTXDATATEXTS. " Text administration and text interface INCLUDE RSTXDATABMP. " Bitmap constants INCLUDE RSTXDATAUNITS. " Units INCLUDE RSTXDATAOTF. " OTF-ID's (PrintControl) TABLES: RSTXU, RSSCG, " Screen fields ITCTH, RLGRAP, STXH, PSTXT. " SPA/GPA TABLES: TTXOB, TTXID, TTXGR. "#EC NEEDED TABLES: STXBITMAPS. "BDS bitmaps TYPE-POOLS: SHLP, " for Help functions SBDST. " for BDS functions INCLUDE LSTXBITMAPSSEL. " selection screens ************************************************************* * SAPscript bitmap utility functions ************************************************************* CONSTANTS: C_OTF_RD_OTFBITMA(16) VALUE '4F54466269746D61', C_OTF_RD_FF TYPE X VALUE 'FF', C_OTF_RD_FORMATID_BMON TYPE X VALUE '01', C_OTF_RD_FORMATID_BCOL TYPE X VALUE '02', C_OTF_RD_SUBFORMATID_NONE TYPE X VALUE '00', C_OTF_RD_SUBFORMATID_BDS TYPE X VALUE '01', C_OTF_RD_FORMATPAR1_NONRESI TYPE X VALUE '00', C_OTF_RD_FORMATPAR1_RESI TYPE X VALUE '01', C_OTF_RD_FORMATPAR1_HI_NOCOMP TYPE X VALUE '00', C_OTF_RD_FORMATPAR1_HI_RUNL TYPE X VALUE '10', C_OTF_RD_FORMATPAR2_NONE TYPE X VALUE '00', C_OTF_RD_IMAGEID_LEN TYPE I VALUE 90, C_BM_FORMAT_ITF(3) TYPE C VALUE 'ITF', C_BM_FORMAT_BMP(3) TYPE C VALUE 'BMP', C_BM_FORMAT_BDS(3) TYPE C VALUE 'BDS', C_ITF_TLINE_LEN TYPE I VALUE 132, C_ITF_FORMAT_CMD(2) TYPE C VALUE '/:', C_ITF_FORMAT_CMNT(2) TYPE C VALUE '/*', C_ITF_FORMAT_DATL(2) TYPE C VALUE '/=', C_ITF_HEX_HEX(3) TYPE C VALUE 'HEX', C_ITF_HEX_ENDHEX(6) TYPE C VALUE 'ENDHEX', C_ITF_HEX_HEIGHT(6) TYPE C VALUE 'HEIGHT', C_ITF_HEX_CM(2) TYPE C VALUE 'CM', C_ITF_HEX_MM(2) TYPE C VALUE 'MM', C_ITF_HEX_POINT(2) TYPE C VALUE 'PT', C_ITF_HEX_TWIP(2) TYPE C VALUE 'TW', C_ITF_HEX_TYPE(4) TYPE C VALUE 'TYPE', C_ITF_HEX_BMON(4) TYPE C VALUE 'BMON', C_ITF_HEX_BCOL(4) TYPE C VALUE 'BCOL', C_ITF_HEX_RESI(4) TYPE C VALUE 'RESI', C_BMP_COMPR_RGB TYPE I VALUE 0, C_BMP_COMPR_RLE8 TYPE I VALUE 1, C_BMP_COMPR_RLE4 TYPE I VALUE 2, C_BMP_COMPR_BITFIELDS TYPE I VALUE 3. DATA: BEGIN OF OTF_BMINFO, BMTYPE(4) TYPE C, NEW_RD_FORMAT TYPE TY_BOOLEAN, IS_MONOCHROME TYPE TY_BOOLEAN, IS_RESIDENT TYPE TY_BOOLEAN, W_TW TYPE I, H_TW TYPE I, W_PIX TYPE I, H_PIX TYPE I, DPI TYPE I, BITSPERPIX TYPE I, COLTABSIZE TYPE I, NUMDATABYTES TYPE I, AUTOHEIGHT TYPE TY_BOOLEAN, RES_H_TW TYPE I, BYTES_PER_ROW TYPE I, BYTES_PER_ROW_ACT TYPE I, BYTES_PER_ROW_FULLCOLOR TYPE I, IS_COMPRESSED TYPE TY_BOOLEAN, END OF OTF_BMINFO. CONSTANTS: C_BM_FILE_LINELEN TYPE I VALUE 80. DATA: BM_FILE_LINEOFS TYPE I. DATA: BEGIN OF BM_FILE OCCURS 0, L(80) TYPE X, END OF BM_FILE. CONSTANTS: C_BM_FILE_TMP_LINELEN TYPE I VALUE 80. DATA: BM_FILE_TMP_LINEOFS TYPE I. DATA: BEGIN OF BM_FILE_TMP OCCURS 0, L(80) TYPE X, END OF BM_FILE_TMP. CONSTANTS: C_BM_FILE8BIT_LINELEN TYPE I VALUE 80. DATA: BM_FILE8BIT_LINEOFS TYPE I. DATA: BEGIN OF BM_FILE8BIT OCCURS 0, L(80) TYPE X, END OF BM_FILE8BIT. DATA: BITMAP_FILE_LINEOFS TYPE I, BITMAP_FILE_LINEWIDTH TYPE I, BITMAP_FILE_BYTECOUNT TYPE I. * BMP color table DATA: BEGIN OF BMP_COLOR_TAB OCCURS 256, R TYPE X, G TYPE X, B TYPE X, END OF BMP_COLOR_TAB. * TIFF: global format info DATA: BEGIN OF TIF_INFO, BYTEORDER(1) TYPE C, VERSION TYPE I, FIRSTIFDOFS TYPE I, WIDTH TYPE I, LENGTH TYPE I, BITSPERSAMPLE_1 TYPE I, BITSPERSAMPLE_2 TYPE I, BITSPERSAMPLE_3 TYPE I, BITSPERSAMPLEPLANES TYPE I, COMPRESSION TYPE I, PHOTOMETRIC TYPE I, FILLORDER TYPE I, NUMBER_STRIPS TYPE I, SAMPLESPERPIX TYPE I, ROWSPERSTRIP TYPE I, MINSAMPLE TYPE I, MAXSAMPLE TYPE I, XRES_N TYPE I, XRES_D TYPE I, YRES_N TYPE I, YRES_D TYPE I, RESUNIT TYPE I, COLORMAP_SIZE TYPE I, MAXROW TYPE I, MAXCOL TYPE I, DPI TYPE I, TIFTYPE TYPE C, WIDTH_ORI TYPE I, LENGTH_ORI TYPE I, DPI_ORI TYPE I, END OF TIF_INFO. * TIFF: list of strip offset pointers to image data DATA: BEGIN OF TIF_STRIPOFS_TAB OCCURS 20, OFS TYPE I, COUNT TYPE I, END OF TIF_STRIPOFS_TAB. * TIFF: list of color table entries DATA: BEGIN OF TIF_COLOR_TAB OCCURS 256, R TYPE I, G TYPE I, B TYPE I, END OF TIF_COLOR_TAB. * TIFF constants CONSTANTS: C_BYTEORD_INTEL VALUE 'I', C_BYTEORD_MOTO VALUE 'M', C_DTYPE_BYTE TYPE I VALUE 1, C_DTYPE_ASCII TYPE I VALUE 2, C_DTYPE_SHORT TYPE I VALUE 3, C_DTYPE_LONG TYPE I VALUE 4, C_DTYPE_RATIONAL TYPE I VALUE 5, C_TIFTYPE_NONE VALUE ' ', C_TIFTYPE_BILEVEL VALUE 'B', C_TIFTYPE_GRAYSCALE VALUE 'G', C_TIFTYPE_COLORMAP VALUE 'C', C_TIFTYPE_FULLCOLOR VALUE 'F', C_XCONST_80 TYPE X VALUE '80', C_XCONST_40 TYPE X VALUE '40', C_XCONST_20 TYPE X VALUE '20', C_XCONST_10 TYPE X VALUE '10', C_XCONST_08 TYPE X VALUE '08', C_XCONST_04 TYPE X VALUE '04', C_XCONST_02 TYPE X VALUE '02', C_XCONST_01 TYPE X VALUE '01', C_COMP_UNCOMP TYPE I VALUE 1, C_COMP_HUFFMAN TYPE I VALUE 2, C_COMP_PACKBITS TYPE I VALUE 32773. ************************************************************* * BDS bitmap storage ************************************************************* * BDS bitmaps: buffer that holds info on resident bitmaps DATA BEGIN OF BITMAP_BUFFER_BDS OCCURS 10. INCLUDE STRUCTURE STXBITMAPS. DATA: ACT_W_TW LIKE STXBITMAPS-WIDTHTW, ACT_H_TW LIKE STXBITMAPS-HEIGHTTW, ACT_DPI LIKE STXBITMAPS-RESOLUTION. DATA END OF BITMAP_BUFFER_BDS. DATA: BDSTAB_LINEOFS TYPE I, BDSTAB_LINEWIDTH TYPE I, BDSTAB_BYTECOUNT TYPE I. * BDS handling 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'. * generating command lines DATA: C_CMD_POSITION_WINDOW LIKE TLINE VALUE '/:POSITION WINDOW', C_CMD_POSITION_PAGE LIKE TLINE VALUE '/:POSITION PAGE', C_CMD_POSITION_XY LIKE TLINE VALUE '/:POSITION XORIGIN ''&1'' &2 YORIGIN ''&3'' &4', C_CMD_SIZE_WINDOW LIKE TLINE VALUE '/:SIZE WINDOW', C_CMD_SIZE_PAGE LIKE TLINE VALUE '/:SIZE PAGE', C_CMD_SIZE_DX LIKE TLINE VALUE '/:SIZE WIDTH ''&1'' &2', C_CMD_SIZE_DY LIKE TLINE VALUE '/:SIZE HEIGHT ''&1'' &2', C_CMD_SIZE_DXDY LIKE TLINE VALUE '/:SIZE WIDTH ''&1'' &2 HEIGHT ''&3'' &4', C_CMD_WIDTH LIKE TLINE VALUE 'WIDTH ''&1'' &2', C_CMD_HEIGHT LIKE TLINE VALUE 'HEIGHT ''&1'' &2', C_CMD_BOX LIKE TLINE VALUE '/:BOX', C_CMD_BOX_FRAME LIKE TLINE VALUE 'FRAME ''&1'' &2', C_CMD_BOX_INTENSITY LIKE TLINE VALUE 'INTENSITY &1', C_CMD_BOX_X LIKE TLINE VALUE 'XPOS ''&1'' &2', C_CMD_BOX_Y LIKE TLINE VALUE 'YPOS ''&1'' &2', C_CMD_BOX_XY LIKE TLINE VALUE 'XPOS ''&1'' &2 YPOS ''&3'' &4'. DATA: L_COMMANDS LIKE TLINE OCCURS 1 WITH HEADER LINE. * Globals for screen processing * Screen attributes CONSTANTS: C_SCREEN_ON LIKE SCREEN-ACTIVE VALUE '1', C_SCREEN_OFF LIKE SCREEN-ACTIVE VALUE '0'. DATA: FCODE LIKE SY-UCOMM, FCODE_OLD LIKE SY-UCOMM, F_FOUND(1) TYPE C, F_ACTION_CANCELED(1) TYPE C, F_RESOLUTION_CHANGED(1) TYPE C, F_SHOW_ATTRIBUTES_2001(1) TYPE C, F_SHOW_ATTRIBUTES_2002(1) TYPE C, G_REPID LIKE SY-REPID VALUE 'SAPLSTXBITMAPS'. CONSTANTS: FCODE_OK LIKE SY-UCOMM VALUE 'OK', ** fcode_f3 like sy-ucomm value 'BACK', FCODE_F12 LIKE SY-UCOMM VALUE 'CANC', ** fcode_f15 like sy-ucomm value 'BEEN', FCODE_SEARCH LIKE SY-UCOMM VALUE 'CATA', FCODE_IMPORT LIKE SY-UCOMM VALUE 'UPLD', FCODE_DETAIL LIKE SY-UCOMM VALUE 'DETAIL', FCODE_BTYPE LIKE SY-UCOMM VALUE 'BTYPE', FCODE_GR_ID LIKE SY-UCOMM VALUE 'GRAPHICS_ID', FCODE_TAB_BDS LIKE SY-UCOMM VALUE 'STXBITMAPS', FCODE_TAB_GRTEXT LIKE SY-UCOMM VALUE 'STXHGRAPHICS', FCODE_TAB_STDTEXT LIKE SY-UCOMM VALUE 'STXHTEXT'. * Tabstrips CONTROLS: TABSTRIP_BITMAPS TYPE TABSTRIP. DATA: TABSTRIP_NR LIKE SY-DYNNR. DEFINE TAB_BDS. TABSTRIP_NR = '2001'. TABSTRIP_BITMAPS-ACTIVETAB = 'STXBITMAPS'. END-OF-DEFINITION. DEFINE TAB_STXH_GRAPHICS. TABSTRIP_NR = '2002'. TABSTRIP_BITMAPS-ACTIVETAB = 'STXHGRAPHICS'. END-OF-DEFINITION. * Globals and globals for dynpro fields DATA: G_OBJECTTYPE(20) TYPE C, G_NEW_RESOLUTION LIKE STXBITMAPS-RESOLUTION, G_STXBITMAPS TYPE STXBITMAPS, G_STXH TYPE STXH, G_TECHINFO TYPE RSSCG, T_SIZE(40), BDS_DESCRIPTION LIKE BAPISIGNAT-PROP_VALUE. CONSTANTS: C_OBJECTTYPE_BDS LIKE G_OBJECTTYPE VALUE 'BDS', C_OBJECTTYPE_STDTEXT LIKE G_OBJECTTYPE VALUE 'OBTEXT', C_OBJECTTYPE_GRTEXT LIKE G_OBJECTTYPE VALUE 'OBGRAPHICS'. * Graphic handling 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_SCREEN_GRAPHIC_IMPORT LIKE SY-DYNNR VALUE '4000', C_SCREEN_GRAPHIC_IMPORT_BDS LIKE SY-DYNNR VALUE '4001'. * radio buttons DATA: RB_ORIGIN_PAGE(1) VALUE ' ', RB_ORIGIN_WINDOW(1) VALUE 'X', RB_ORIGIN_ABSOLUTE(1) VALUE ' ', RB_HEIGHT_PAGE(1) VALUE ' ', RB_HEIGHT_WINDOW(1) VALUE ' ', RB_HEIGHT_ABSOLUTE(1) VALUE 'X', RB_WIDTH_PAGE(1) VALUE ' ', RB_WIDTH_WINDOW(1) VALUE ' ', RB_WIDTH_ABSOLUTE(1) VALUE 'X', RB_NO_LINE(1) VALUE ' ', RB_LINE_USER_DEF(1) VALUE 'X', RB_GRAPHIC_BMON(1) VALUE 'X', RB_GRAPHIC_BCOL(1) VALUE ' ', RB_GRAPHIC_GENERAL(1) VALUE ' '. * measures DATA: BOX_LEFT LIKE RSTXU-NEGATIVE, BOX_LEFT_UNIT LIKE RSTXU-UNITH, BOX_TOP LIKE RSTXU-NEGATIVE, BOX_TOP_UNIT LIKE RSTXU-UNITV, BOX_WIDTH LIKE RSTXU-POSITIVE, BOX_WIDTH_UNIT LIKE RSTXU-UNITH, BOX_HEIGHT LIKE RSTXU-POSITIVE, BOX_HEIGHT_UNIT LIKE RSTXU-UNITV, BOX_ORIGIN_LEFT LIKE RSTXU-POSITIVE, BOX_ORIGIN_LEFT_UNIT LIKE RSTXU-UNITH, BOX_ORIGIN_TOP LIKE RSTXU-POSITIVE, BOX_ORIGIN_TOP_UNIT LIKE RSTXU-UNITV, BOX_FRAME LIKE RSTXU-POSITIVE, BOX_FRAME_UNIT LIKE RSTXU-UNIT. FORM IMPORT_BITMAP_BDS_16 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 P_BYTECOUNT TYPE I P_BITMAP "图片的16进制数据 CHANGING P_DOCID TYPE STXBITMAPS-DOCID P_RESOLUTION TYPE STXBITMAPS-RESOLUTION P_TYPE TYPE SY-MSGTY. 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. MOVE-CORRESPONDING P_BITMAP TO L_BITMAP[]. L_BYTECOUNT = P_BYTECOUNT. 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. P_TYPE = 'E'. 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'. P_TYPE = 'E'. 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'. P_TYPE = 'E'. 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'. P_TYPE = 'E'. 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'. P_TYPE = 'E'. ENDIF. ELSEIF SY-SUBRC = 2. PERFORM DEQUEUE_GRAPHIC USING P_OBJECT P_NAME P_ID P_BTYPE. * message e285 with p_name 'BDS'. P_TYPE = 'E'. 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'. P_TYPE = 'E'. 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. *&---------------------------------------------------------------------* *& Form DEQUEUE_GRAPHIC *&---------------------------------------------------------------------* * Dequeue of graphics stored in BDS *----------------------------------------------------------------------* 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 DY_SMARTFORMS *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM DY_SMARTFORMS . DATA: LS_CONTROL_PARAM TYPE SSFCTRLOP, LS_OUTPUT_OPTION TYPE SSFCOMPOP, LV_FMNAME TYPE RS38L_FNAM, LV_TOT TYPE I. DATA:LC_FORMNAME TYPE TDSFNAME VALUE 'ZABAP_001'. " SMARTFORMS CLEAR: LS_CONTROL_PARAM,LS_OUTPUT_OPTION. LS_CONTROL_PARAM-PREVIEW = ABAP_TRUE. LS_CONTROL_PARAM-NO_OPEN = ABAP_TRUE. LS_CONTROL_PARAM-NO_CLOSE = ABAP_TRUE. CALL FUNCTION 'SSF_OPEN' EXPORTING CONTROL_PARAMETERS = LS_CONTROL_PARAM EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. * GET FUNCTION NAME BY SMARTFORM NAME CLEAR LV_FMNAME. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING FORMNAME = LC_FORMNAME IMPORTING FM_NAME = LV_FMNAME EXCEPTIONS NO_FORM = 1 NO_FUNCTION_MODULE = 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. CALL FUNCTION LV_FMNAME EXPORTING * ARCHIVE_INDEX = * ARCHIVE_INDEX_TAB = * ARCHIVE_PARAMETERS = CONTROL_PARAMETERS = LS_CONTROL_PARAM * MAIL_APPL_OBJ = * MAIL_RECIPIENT = * MAIL_SENDER = * OUTPUT_OPTIONS = USER_SETTINGS = 'X' * GS_HEAD = * IMPORTING * DOCUMENT_OUTPUT_INFO = * JOB_OUTPUT_INFO = * JOB_OUTPUT_OPTIONS = * TABLES * GT_ITEM = EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 USER_CANCELED = 4 OTHERS = 5. IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF. CALL FUNCTION 'SSF_CLOSE' EXCEPTIONS FORMATTING_ERROR = 1 INTERNAL_ERROR = 2 SEND_ERROR = 3 OTHERS = 4. 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.
这里是通过SKU号在底表ZTMM001中查询的图片URL然后再转换的,如果是有URL直接转换也可以的不需要用SKU号
SMARFORMS中直接指定图片名称即可
效果如下
此方法虽然实现了想要的效果,但是在实际测试过程中却遇到了一些问题
1.有些图片打印出来会异常的小,大部分均为正常,解决办法:
如果遇到最终打印出来的效果图片因为分辨率不同而大小不一致时,可以在smartforms中直接指定分辨率大小,从而实现固定.
2.上述方式由于系统中只上传服务器一张图片,所以多个人同时打印时会出现数据错乱,解决办法:
进一步的,选择使用上传的图片名称修改为sku号,每次上传后,将此sku号更新到底表中,每次打印前去这个底表查一下sku号是否存在此表,如果存在则不需要再上传图片,直接获取图片到smartforms中即可,同时设置job删除se78上传的图片,每天晚上定时删掉即可
删除图片的程序如下
*&---------------------------------------------------------------------* *& Report ZSE78 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZSE78. PERFORM DELE. FORM DELE. DATA lv_mess TYPE char100. DATA z_matnr TYPE STXBITMAPS-TDNAME. SELECT * FROM ZTSD003_PIC INTO TABLE @DATA(GT_PIC). LOOP AT GT_PIC INTO DATA(GS_PIC). z_matnr = GS_PIC-MATNR. CALL FUNCTION 'SAPSCRIPT_DELETE_GRAPHIC_BDS' EXPORTING i_object = 'GRAPHICS' i_name = z_matnr i_id = 'BMAP' i_btype = 'BCOL' dialog = '' EXCEPTIONS delete_failed = 1 not_found = 2 canceled = 3 OTHERS = 4. CASE sy-subrc. WHEN 0. * WRITE '成功删除'. DELETE FROM ZTSD003_PIC WHERE MATNR = GS_PIC-MATNR. IF SY-SUBRC = 0. ELSE. MESSAGE '数据库表删除失败' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. WHEN OTHERS. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_mess. MESSAGE 'SE78照片删除失败' && lv_mess TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDCASE. ENDLOOP. ENDFORM.
另外根据群友暴雨大姑的提示,可以对每个需要打印的人员分配一个key值,即这个人上传的图片都以这个key值去覆盖,然后针对于离职人员,可以一段时间清理一下即可,这样sap系统中最多也就保存几十张图片,而且还利用到了覆盖,不需要每天清表,这是一种好的方式,有想法的大姑可以试一下