ABAP提供了IMPORT/EXPORT 和 SET/GET PARAMETER語句,可對用戶內存/服務器內存/數據庫進行存儲和訪問。
詳細請參照《數據共享與傳遞.docx》文檔
EXPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 FROM dobj1 p2 FROM dobj2 ...} | (ptab)
TO | { MEMORY ID id }
| { DATABASE dbtab(ar) [FROM wa] [CLIENT cl] ID id }
| { SHARED MEMORY dbtab(ar) [FROM wa] [CLIENT cl] ID id }
| { SHARED BUFFER dbtab(ar) [FROM wa] [CLIENT cl] ID id }
1. {p1 = dobj1 p2 = dobj2 ...}與 {p1 FROM dobj1 p2 FROM dobj2 ...}的意義同樣,只是寫法不同,dobj1、dobj2…變量將會以p1、p2…名稱存儲到內存或數據庫中。p1、p2…名稱隨便取,若是p1、p2…與將要存儲的變量名相同時,只需寫變量名便可,即等號與 FROM 後面能夠省略。p1、p2…這些名稱必須與IMPORT語句中相一致,不然讀取不出
2. (ptab):爲動態指定須要存儲的變量,ptab內表結構要求是這樣的:只須要兩列,列名任意,但類型須要是字符型;第一列存儲如上面的p1、p2…名稱,第二列爲上面的dobj1、dobj2…變量,若是變量與名稱相同,則也能夠像上面同樣,省略第二列的值。兩列的值都必須要大寫,實例以下:
TYPES:BEGIN OF tab_type,
para TYPE string,"列的名稱任意,類型爲字符型
dobj TYPE string,
END OF tab_type.
DATA:text1 TYPE string VALUE `TXT1`,
text2 TYPE string VALUE `TXT2`,
line TYPE tab_type,
itab TYPE STANDARD TABLE OF tab_type.
line-para = 'P1'."值都須要大寫
line-dobj = 'TEXT1'."值都須要大寫
APPEND line TO itab.
line-para = 'P2'.
line-dobj = 'TEXT2'.
APPEND line TO itab.
EXPORT (itab) TO MEMORY ID 'TEXTS'.
IMPORT p1 = text2 p2 = text1 FROM MEMORY ID 'TEXTS'.
WRITE: / text1,text2."TXT2 TXT1
CLEAR: text1,text2.
IMPORT (itab) FROM MEMORY ID 'TEXTS'.
WRITE: / text1,text2."TXT1 TXT2
3. MEMORY ID:將變量存儲到ABAP Memory內存中
4. DATABASE:將變量存儲到數據庫中;dbtab爲簇數據庫表的名稱(如系統提供的標準表INDX);ar的值爲區域ID,它將數據庫表的行分紅若干區域,它必須被直接指定,且值是兩位字符,被存儲到簇數據庫表中的RELID字段中;id 的值會存儲到簇數據表中的RELID字段的下一用戶自定義字段中:
TYPES:BEGIN OF tab_type,
col1 TYPE i,
col2 TYPE i,
END OF tab_type.
DATA:wa_indx TYPE demo_indx_table,
wa_itab TYPE tab_type,
itab TYPE STANDARD TABLE OF tab_type.
WHILE sy-index < 100.
wa_itab-col1 = sy-index.
wa_itab-col2 = sy-index ** 2.
APPEND wa_itab TO itab.
ENDWHILE.
wa_indx-timestamp = sy-datum && sy-uzeit.
wa_indx-userid = sy-uname.
EXPORT tab = itab TO DATABASE demo_indx_table(sq) FROM wa_indx ID 'TABLE'.
實例二:
TABLES: indx.
DATA: BEGIN OF i_tab OCCURS 100,
col1 TYPE i,
col2 TYPE i,
END OF i_tab.
DO 3000 TIMES.
i_tab-col1 = sy-index.
i_tab-col2 = sy-index ** 2.
APPEND i_tab.
ENDDO.
indx-aedat = sy-datum.
indx-usera = sy-uname.
indx-pgmid = sy-repid.
"省略了FROM選項,由於已經使用TABLES indx語句定義了名爲indx的結構變量了
"Export時會自動將表工做區indx變量中的用戶字段存儲到簇數據庫表中
EXPORT i_tab TO DATABASE indx(HK) ID 'Key'.
WRITE: ' SRTF2',AT 20 'AEDAT',AT 35 'USERA',AT 50 'PGMID'.
ULINE.
"注:下面徹底可使用 IMPORT FROM DATABASE TO wa 語句來讀取用戶區字段
SELECT * FROM indx WHERE relid = 'HK'AND srtfd = 'Key'.
WRITE: / indx-srtf2 UNDER 'SRTF2',
indx-aedat UNDER 'AEDAT',
indx-usera UNDER 'USERA',
indx-pgmid UNDER 'PGMID'.
ENDSELECT.
SRTF2 AEDAT USERA PGMID
0 2011.10.12 ZHENGJUN YJZJ_TEST2
1 2011.10.12 ZHENGJUN YJZJ_TEST2
2 2011.10.12 ZHENGJUN YJZJ_TEST2
3 2011.10.12 ZHENGJUN YJZJ_TEST2
4 2011.10.12 ZHENGJUN YJZJ_TEST2
5. SHARED MEMORY/BUFFER :將數據存儲到SAP應用服務器上的SAP Memory中,可共同一服務上的全部程序訪問。兩種的做用是同樣的,最大不一樣是在數據達到最大內存限制時的處理方式不一樣:最大內存限制值分別是經過rsdb/esm/buffersize_kb (SHARED MEMORY)、rsdb/obj/buffersize (SHARED BUFFER)來設置的,當內存佔用快滿時,SHARED MEMORY必須經過DELETE FROM SHARED MEMORY來手動清理,而SHARED BUFFER會自動刪除不多被使用到的數據(固然也能夠經過DELETE FROM SHARED BUFFER手動及時的刪除不用的數據)
6. FROM wa:wa工做區類型能夠參照簇數據庫dbtab類型,也可定義成只含有用戶數據字段的結構,它是用來設置簇數據庫表中SRTF2 與 CLUSTR兩個字段之間的用戶數據字段(參見簇數據表圖中的編號爲5的用戶數據)的值,而後在Export時將相應的字段存儲到SRTF2字段與CLUSTR字段間的相應字段中去。若是使用「TABLES dbtab.」定義語句,能夠省略「[FROM wa]」,也會默認將其存儲到數據庫表中,但若是沒有「TABLES dbtab.」這樣的定義語句,也沒有「[FROM wa]」選項時,將不會有數據存儲到簇數據庫表中的用戶字段中去
7. CLIENT cl:默認爲當前客戶端,存儲到簇數據庫表中的MANDT字段中
IMPORT {p1 = dobj1 p2 = dobj2 ...} | {p1 TO dobj1 p2 TO dobj2 ...} | (ptab)
FROM | { MEMORY ID id }
| { DATABASE dbtab(ar) [TO wa] [CLIENT cl] ID id }
| { SHARED MEMORY dbtab(ar) [TO wa] [CLIENT cl] ID id }
| { SHARED BUFFER dbtab(ar) [TO wa] [CLIENT cl] ID id }
從簇數據表中讀取數據,各項參數與EXPORT是同樣的,請參考EXPORT各項解釋
TYPES:BEGIN OF tab,
col1 TYPE i,
col2 TYPE i,
END OF tab.
DATA:wa_indx TYPE demo_indx_table,
wa_itab TYPE tab,
itab TYPE STANDARD TABLE OF tab.
IMPORT tab = itab FROM DATABASE demo_indx_table(sq) TO wa_indx ID 'TABLE'.
WRITE: wa_indx-timestamp, wa_indx-userid.
ULINE.
LOOP AT itab INTO wa_itab.
WRITE: / wa_itab-col1, wa_itab-col2.
ENDLOOP.
實例二:
TABLES indx.
DATA: BEGIN OF jtab OCCURS 100,
col1 TYPE i,
col2 TYPE i,
END OF jtab.
"注意:i_tab的名稱不能是其餘的,必須與EXPORT語句中的分類
"存儲標籤名同樣。若是i_tab自己又是一個jtab類型的內表,則
"TO後面的jtab能夠省略
IMPORT i_tab TO jtab FROM DATABASE indx(hk) ID 'Key'.
"注:在該程序中並無明顯的爲indx工做區設置值,但因爲使用了
"TABLES indx.語句定義了與indx簇數據庫表同名的結構變量,因此
"上面IMPORT會默認加上使用 TO indx 選項
WRITE: / 'AEDAT:', indx-aedat,
/ 'USERA:', indx-usera,
/ 'PGMID:', indx-pgmid.
SKIP.
WRITE 'JTAB:'.
LOOP AT jtab FROM 1 TO 5.
WRITE: / jtab-col1, jtab-col2.
ENDLOOP.
AEDAT: 2011.10.12
USERA: ZHENGJUN
PGMID: YJZJ_TEST2
JTAB:
1 1
2 4
3 9
4 16
5 25
IMPORT DIRECTORY INTO itab FROM DATABASE dbtab(ar) [TO wa] [CLIENT cl] ID id.
該語句的做用用來讀取存儲到簇數據表中的變量信息,如存儲名是什麼、以什麼樣的類型存儲的、數據長度等(有點相似反射)。itab 爲cdir詞典類型的內表,其結構與各字段做用:
Component |
Type |
Meaning |
NAME |
CHAR(30) |
Name of the parameter under which a data object was saved. |
OTYPE: |
CHAR(1) |
General type of the data object saved. The following values are permitted: "F" for elementary, flat data objects, "G" for strings, "R" for flat structures, "S" for deep structures, "T" for internal tables with flat row type and "C" for tables with a deep row type. |
FTYPE |
CHAR(1) |
More specific type of the data object saved. For elementary data objects and internal tables with a elementary row type, the data or row type is returned in accordance with the table of return values fromDESCRIBE FIELD ... TYPE ("a", "b", "C", "D", "e", "F", "g", "I", "N", "P", "s", "T", "X", "y"). In the case of flat structures and internal tables with flat structured row types, "C" is returned. In the case of deepstructures and internal tables with deep structured row types, "v" is returned. In the case of a table that has an internal table as a row type, "h" is returned. |
TFILL |
INT4 |
Length filled of the saved data object. For strings the length of the content in bytes is returned and for internal tables the number of rows is returned. The value 0 is returned for other data objects. |
FLENG |
INT2 |
Length of saved data object or saved table row in bytes. The value 8 is returned for strings. |
DATA: f1 TYPE decfloat16,
f2 TYPE TABLE OF i,
f3 TYPE spfli.
DATA itab TYPE STANDARD TABLE OF cdir.
DO 10 TIMES.
APPEND sy-index TO f2.
ENDDO.
EXPORT par1 = f1 par2 = f2 par3 = f3 TO DATABASE demo_indx_table(hk) ID 'HK'.
IMPORT DIRECTORY INTO itab FROM DATABASE demo_indx_table(hk) ID 'HK'.
NAME |
OTYPE: |
FTYPE |
TFILL |
FLENG |
"PAR1" |
"F" |
"a" |
0 |
8 |
"PAR2" |
"T" |
"I" |
10 |
4 |
"PAR3" |
"R" |
"C" |
0 |
168 |
DELETE FROM { {MEMORY ID id}
| {DATABASE dbtab(ar) [CLIENT cl] ID id}
| {SHARED MEMORY dbtab(ar) [CLIENT cl] ID id}
| {SHARED BUFFER dbtab(ar) [CLIENT cl] ID id} }.
用來清理EXPORT語句的存儲的數據
其中DELETE FROM MEMORY ID id.與FREE MEMORY ID id.做用同樣
DATA: id TYPE c LENGTH 4 VALUE 'TEXT',
text1 TYPE string VALUE 'Tina',
text2 TYPE string VALUE 'Mike'.
EXPORT p1 = text1 p2 = text2 TO SHARED BUFFER demo_indx_table(xy) ID id.
IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(xy) ID id.
...
DELETE FROM SHARED BUFFER demo_indx_table(xy) ID id.
"此語句會執行後,sy-subrc返回4
IMPORT p1 = text2 p2 = text1 FROM SHARED BUFFER demo_indx_table(xy) ID id.
l 保存數據
EXPORT<f1>[FROM <g1>] <f2> [FROM <g2>] ... TO MEMORY ID <key>.
若是省略了FROM <g1>選項,則被存儲的數據源就來自於程序中與f1自已同名的變量,不然數據源爲g1指定的變量(或者g1自己就是字符常量);key 用來標示ABAP內存。能夠將多個變量存儲在同一個<key>中,它們是經過<fi>來區別的。IMPORT中的<fi>必須與EXPORT中的<fi>名稱相同。
DATA text1(10) VALUE 'Exporting'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
"將 text1 與 text2都存儲到 text ID的名下
EXPORT text1 "數據來源於上面定義的 text1變量,並以text1名分類存儲
text2 FROM 'Literal'"數據直接來源於From後面指定的常量字符串,也以text1名分類存儲
TO MEMORY ID 'text'.
"將前面定義的itab存儲到以table爲ID的內存中,並以itab名分類存儲
EXPORT itab TO MEMORY ID 'table'.
l 讀取數據
IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.
若是忽略選項TO<gi>,則將內存中的數據對象<fi>賦給程序中的同名數據對象;若是使用此選項,則將內存中的數據對象<fi>寫入字段<gi>中。IMPORT中的<fi>必須與EXPORT中的<fi>名稱相同。
沒必要讀取存在特定ID<key>下的全部對象,在讀取時能夠經過指定名稱<fi>中進行有選擇性的讀取。若是內存中不包含指定ID<key>下的對象,則將SY-SUBRC設置爲4,可是若是內存中存在帶此ID的數據簇,不管數據對象<fi>是否也存在,SY-SUBRC之值老是爲0。若是簇中不存在數據對象<fi>,則目標字段保持不變(gi或fi自己)。
DATA text1(10) VALUE 'TEST1'.
DATA itab LIKE sbook OCCURS 10 WITH HEADER LINE.
DO 5 TIMES.
itab-bookid = 100 + sy-index.
APPEND itab.
ENDDO.
EXPORT text1"被存儲的數據來自text1變量
text2 FROM 'Literal'"被存儲的數據直接來自FORM後面字符串常量
"將'TEST1'與'Literal'存儲到ID爲text的ABAP內存中,而且分別以
"text1和text2標籤來分類存儲
TO MEMORY ID 'text'.
EXPORT itab"被存儲的數據來自itab變量所對應的內存
TO MEMORY ID 'table'.
SUBMIT zjzjimpt1 AND RETURN."調用其餘程序並等待返回
REPORT zjzjimpt1.
DATA: text1(10),
text3 LIKE text1.
"從ID爲text的ABAP內存區域讀取分類存儲標籤爲text1
"的內存數據並存儲到text1變量中去
IMPORT text1 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text1.
"從ID爲text的ABAP內存區域讀取分類存儲標籤爲text2
"的內存數據並存儲到text3變量中去
IMPORT text2 TO text3 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text3.
DATA jtab LIKE sbook OCCURS 10 WITH HEADER LINE.
"從ID爲table的ABAP內存區域讀取分類存儲標籤爲itab
"的內存數據並存儲到jtab變量中去
IMPORT itab TO jtab FROM MEMORY ID 'table'.
LOOP AT jtab.
WRITE / jtab-bookid.
ENDLOOP.
* 0 TEST1
* 0 Literal
*00000101
*00000102
*00000103
*00000104
*00000105
l 刪除數據
FREE MEMORY [ID <key>].
與DELETE FROM MEMORY ID id.等效
若是不附加ID<key>,則此語句刪除整個內存,包括此前用EXPORT存儲到ABAP/4內存中的全部數據簇。附加ID<key>以後,該語句只刪除用此名稱命名的數據簇。
用戶登錄後,最多一個系統能夠開6個窗口,這在SAP中稱爲External Mode。而同一個窗口中,運行某程序後,能夠經過CALL TRANSACTION/SUBMIT或其餘代碼跳轉到其餘程序,這個稱爲Internal Mode。Internal Mode的調用棧最多爲9層。那麼ABAP Memory,它是屬於Internal Mode間能夠共享的數據,而External Mode間沒法共享。因此,ABAP Memorcy只能在同一窗體中共享,這與瀏覽器中的Session是同樣的。
更多請參考《數據共享與傳遞.docx》中的SAP Memory語句章節
同一客戶端的不一樣窗體(External Mode)它們之間共享數據必須經過SET/GET PARAMETER語句,再也不是EXPORT/IMPORT的模式。
例子. 建立程序A,輸入:
DATA matnr TYPE matnr.
GET PARAMETER ID 'ytest' FIELD matnr.
WRITE matnr.
建立程序B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000012345'.
SET PARAMETER ID 'YTEST' FIELD matnr.
在窗口1運行程序B並關閉後,在窗口2運行程序A,發現程序A仍然讀到了SAP Memory的值。
說明:
一、 調試時,可經過點擊Goto->System Area->SAP Memory,查看到YTEST及其對應的值。
二、 SET/GET PARAMETER的值與本次登錄有關,當用戶註銷後才失效。在用戶登錄的時候,系統會根據每一個用戶System->User Profile->Own Data->Parameter下的設置,載入到SAP Memory。
三、 在Data Element中能夠看到Further Characteristics下可定義PARAMETER ID,表明該字段做爲屏幕元素時,可讀取該PARAMETER ID做爲默認值。好比VA03會自動顯示剛剛建立的訂單號。
前面介紹的都是用戶內存,那麼不一樣用戶間如何實現數據共享呢?能夠用SHARED MEMORY或SHARED BUFFER,它們是服務器上的某片全部用戶共享的內存。關於SHARED MEMORY和SHARED BUFFER的區別,能夠F1查看幫助。若是EXPORT SHARED BUFFER,則必須IMPORT SHARED BUFFER才能讀到,用IMPORT SHARED MEMORY是讀不到的。反過來也是。
例子. 建立程序A,輸入:
DATA matnr TYPE matnr.
IMPORT matnr FROM SHARED BUFFER indx(aa) ID 'YTEST_MATNR '.
WRITE matnr.
建立程序B,輸入:
DATA: matnr TYPE matnr.
matnr = '000000000000123456'.
EXPORT matnr TO SHARED BUFFER indx(aa) ID 'YTEST_MATNR'.
先在用戶1的電腦上運行程序B,而後在用戶2的電腦上運行程序A,發現用戶2能夠讀取到值。
說明:
一、 既然是服務器上的全部用戶共享空間,那麼該值將保存到服務器關機重啓爲止,除非用戶用DELETE語句清除它。其實這個跟ENQUEUE/DEQUEUE有點類似之處。
二、 數據庫也可共享數據,不過服務器共享確定速度快些。
三、 INDX是系統中存在的符合特定格式要求的表。但這不表明該EXPORT/IMPORT語句將在表INDX中增長記錄,僅僅表明服務器借用了INDX的結構來管理該片共享內存。
刪除:
DELETE FROMSHARED BUFFER dbtab(ar) [CLIENT cl] ID id
DELETE FROMSHARED MEMORY dbtab(ar) [CLIENT cl] ID id
更具體的實例請參考《操做設置.docx》文檔中的「經過程序建立Job」小節實例
在開發smartform的時候能夠經過指針來調用全局自定義的表,而不用在系統中建立一個永久的結構。
【1】:在SmartForm中定義一個結構,這個結構要和程序中使用的結構徹底相同。
【2】:定義報表中全局的表和工做空間,
【3】:定義指針,指向程序中的某個內表,而後獲取該內表。
其實若是也想這樣動態調用某函數裏的全局變量,先找到這個函數所在的函數組,再找到該函數組所對應的主程序名,而後像上面那樣使用便可:
上面說了SHARED BUFFER並不訪問(存儲)數據庫,而要訪問數據庫就應該用DATABASE。
EXPORT DATABASE與普通數據庫操做的不一樣之處是,它適合大數據量的操做,系統自動將其拆分紅多條記錄並存儲到數據庫中,好比圖片或文檔(甚至是程序中的某個內表,請參考後面的實例)。而用IMPORT DATABASE的過程則相反,系統將把這些條相關記錄又自動組合起來成爲一個總體。
若是要自定義INDX這樣的表,須要按如下表結構順序來定義:
1、能夠有也能夠無 MANDT字段
2、除開第一個字段MANDT(若是有的狀況下),下一個字段必須是RELID,類型爲CHAR 2,它是用來存儲area ID,系統會根據用戶在使用EXPORT語句保存數據時指定的area ID來填充它。
3、緊接下一個字段是一個任意長度(根據本身的須要定)的CHAR字段,名字也能夠是隨便取的,該字段用爲主鍵的一部分來使用,該字段的值也是在使用EXPORT語句保存數據時使用ID選項指定的值。
4、下一個字段的名字必須是SRTF2,類型爲INT4,用來存儲數據行號(大數據對象——如圖片、文件、程序中的內表對象等,要分紅多行來存儲)。因爲某個數據可能很大,須要多行來存儲,理念是可能達到2**31行,該字段會自動的由系統填充。
5、在SRTF2字段的後面,你能夠包括任意數量及類型的數據字段,這些字段是用來管理大對象的相應信息(如文件名、文件類型、建立者等),當你在保存數據時系統不會自動的填充這些字段,因此在保存這些字段時,須要經過一個結構傳遞須要存儲的值(即EXPORT語句中的From選項所帶的結構)。
6、倒數第二個字段的名必須爲CLUSTR,類型爲INT2,它存儲了最後一個字段CLUSTD所存儲數據的長度(字節數),在使用EXPORT語句保存數據時系統會自動填充
7、最後一個字段的名必須是CLUSTD,而且數據類型爲LRAW,其長度表示能最大存儲多少個字節的內容,若是大數據對象很大(一行存儲不下時),會分紅多行來存儲,行號就存儲在前面的SRTF2字段中。
注意:上面這個表中的SRTFD實際上沒用上,由於Export時,ID選項的值實質上存儲到了它前面的ZZKEY中了,因此能夠去掉這個字段(通常會留名爲SRTFD字段而去掉ZZKEY字段)。
PARAMETERS: p_file TYPE string OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = '*.*'
def_path = 'c:\'
mask = ',*'
mode = 'O'
title = 'File select'
IMPORTING
filename = p_file.
START-OF-SELECTION.
DATA: il_data LIKE solix OCCURS 0 WITH HEADER LINE,
l_len TYPE i.
**Upload file
REFRESH: il_data.
CLEAR l_len.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_file
filetype = 'BIN'
IMPORTING
filelength = l_len
TABLES
data_tab = il_data."ABAP沒有二進制類型,X類型代替
EXPORT il_data TO DATABASE indx(YY) ID 'ZZZ' .
IF sy-subrc = 0.
MESSAGE 'Success' TYPE 'S'.
ENDIF.
上面是直接將讀取到的文件的二進制數據內表存儲到簇數據庫表中,我也也可經過SCMS_BINARY_TO_XSTRING函數將讀取的二進制數據內表拼接成只有一行的二進制串,而後再存儲這個被轉換後的二進制串也可:
PARAMETERS: p_file TYPE string OBLIGATORY,
p_id LIKE ybc_file-zzkey OBLIGATORY,
p_ftype LIKE ybc_file-mimetype OBLIGATORY,
p_fname LIKE ybc_file-filename OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = '*.*'
def_path = 'c:\'
mask = ',*'
mode = 'O'
title = 'File select'
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
START-OF-SELECTION.
DATA: il_data LIKE solix OCCURS 0 WITH HEADER LINE,
l_len TYPE i.
**Upload file
REFRESH: il_data.
CLEAR l_len.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = p_file
filetype = 'BIN'
IMPORTING
filelength = l_len
TABLES
data_tab = il_data."X類型內表
CHECK il_data[] IS NOT INITIAL.
**Convert data
DATA: l_xstr TYPE xstring.
CLEAR l_xstr.
"將內表以X類型拼接成XString字符串
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = l_len
IMPORTING
buffer = l_xstr
TABLES
binary_tab = il_data
EXCEPTIONS
failed = 1
OTHERS = 2.
**Save data
"wl_file用於填充ybc_file表中非規定字段
DATA: wl_file LIKE ybc_file.
wl_file-uname = sy-uname.
wl_file-aedtm = sy-datum.
wl_file-pgmid = sy-cprog.
wl_file-mimetype = p_ftype.
wl_file-filename = p_fname.
DATA: l_answer TYPE c.
EXPORT l_xstr = l_xstr TO DATABASE ybc_file(bc) FROM wl_file ID p_id .
IF sy-subrc = 0.
MESSAGE 'Success' TYPE 'S'.
ENDIF.
DATA: il_data LIKE solix OCCURS 0.
IMPORT il_data FROM DATABASE indx(YY) ID 'ZZZ'.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
" bin_filesize = l_bytes
filename = 'c:\1.jpg'
filetype = 'BIN'
CHANGING
data_tab = il_data.
與存儲文件同樣,若是存儲的是拼接好的二進制串,則要使用SCMS_XSTRING_TO_BINARY函數來還原後再下載:
PARAMETERS: p_key LIKE ybc_file-zzkey.
DATA: l_xstr TYPE xstring.
IMPORT l_xstr = l_xstr FROM DATABASE ybc_file(bc) ID p_key.
DATA:
l_xstring TYPE xstring,
l_xcnt TYPE i,
l_bytes TYPE i.
TYPES: hex512(512) TYPE x.
DATA: tab_xstring TYPE TABLE OF hex512 WITH HEADER LINE.
"將Xstring以X類型視圖存儲到內表中
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = l_xstr
TABLES
binary_tab = tab_xstring.
DATA: l_ftype LIKE yhr_attach-mimetype,
l_fname LIKE yhr_attach-filename.
"除了二進內容在IMPORT語句中讀取了,但其餘字段還得要
"經過SQL來查詢。注:也可以使用 IMPORT語句的TO選項來直接讀取
SELECT SINGLE mimetype filename
INTO (l_ftype,l_fname) FROM ybc_file
WHERE relid = 'BC' AND zzkey = p_key.
DATA: l_file_name TYPE string.
CONCATENATE 'C:\' l_fname '.' l_ftype INTO l_file_name.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
bin_filesize = l_bytes
filename = l_file_name
filetype = 'BIN'
CHANGING
data_tab = tab_xstring[].