程序間數據共享與傳遞:EXPORT/IMPORT、SAP/ABAP Memory


ABAP提供了IMPORT/EXPORT  SET/GET PARAMETER語句,可對用戶內存/服務器內存/數據庫進行存儲和訪問。

 

詳細請參照《數據共享與傳遞.docx》文檔

EXPORT 語句

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 ...}的意義一樣,只是寫法不一樣,dobj1dobj2…變量將會以p1p2…名稱存儲到內存或數據庫中。p1p2…名稱隨便取,如果p1p2…與將要存儲的變量名相同時,只需寫變量名即可,即等號與 FROM 后面可以省略。p1p2…這些名稱必須與IMPORT語句中相一致,否則讀取不出

2.       (ptab):為動態指定需要存儲的變量,ptab內表結構要求是這樣的:只需要兩列,列名任意,但類型需要是字符型;第一列存儲如上面的p1p2…名稱,第二列為上面的dobj1dobj2…變量,如果變量與名稱相同,則也可以像上面一樣,省略第二列的值。兩列的值都必需要大寫,實例如下:

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'.

image288

image289

 

實例二:

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 wawa工作區類型可以參照簇數據庫dbtab類型,也可定義成只含有用戶數據字段的結構,它是用來設置簇數據庫表中SRTF2  CLUSTR兩個字段之間的用戶數據字段參見簇數據表圖中的編號為5的用戶數據的值,然后在Export時將相應的字段存儲到SRTF2字段與CLUSTR字段間的相應字段中去。如果使用TABLES dbtab.”定義語句,可以省略[FROM wa],也會默認將其存儲到數據庫表中,但如果沒有“TABLES dbtab.”這樣的定義語句,也沒有“[FROM wa]”選項時,將不會有數據存儲到簇數據庫表中的用戶字段中去

7.       CLIENT cl:默認為當前客戶端,存儲到簇數據庫表中的MANDT字段中

IMPORT語句

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語句

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語句

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.

ABAP Memory(同一用戶的同一窗口Session

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存儲到以tableID的內存中,並以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>,則目標字段保持不變(gifi本身)。

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'存儲到IDtextABAP內存中,並且分別以
      
"text1text2標簽來分類存儲
      
TO MEMORY ID 'text'.
EXPORT itab"被存儲的數據來自itab變量所對應的內存
       
TO MEMORY ID 'table'.
SUBMIT zjzjimpt1 AND RETURN."
調用其他程序並等待返回

 

REPORT  zjzjimpt1.
DATA: text1(10),
      text3
LIKE text1.

"IDtextABAP內存區域讀取分類存儲標簽為text1
"的內存數據並存儲到text1變量中去
IMPORT text1 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text1.
"IDtextABAP內存區域讀取分類存儲標簽為text2
"的內存數據並存儲到text3變量中去
IMPORT text2 TO text3 FROM MEMORY ID 'text'.
WRITE: / sy-subrc, text3.

DATA jtab LIKE sbook OCCURS 10 WITH HEADER LINE.
"IDtableABAP內存區域讀取分類存儲標簽為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 ModeInternal Mode的調用棧最多為9層。那么ABAP Memory,它是屬於Internal Mode間可以共享的數據,而External Mode間無法共享。所以,ABAP Memorcy只能在同一窗體中共享,這與瀏覽器中的Session是一樣的。

 

SAP Memory(同一用戶的不同窗口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的值。

 

說明:

1、  調試時,可通過點擊Goto->System Area->SAP Memory,查看到YTEST及其對應的值。

2、  SET/GET PARAMETER的值與本次登陸有關,當用戶注銷后才失效。在用戶登陸的時候,系統會根據每個用戶System->User Profile->Own Data->Parameter下的設置,載入到SAP Memory

3、  Data Element中可以看到Further Characteristics下可定義PARAMETER ID,代表該字段作為屏幕元素時,可讀取該PARAMETER ID作為默認值。比如VA03會自動顯示剛剛創建的訂單號。

 

SHARED MEMORY/SHARED BUFFER不同ClientJob

前面介紹的都是用戶內存,那么不同用戶間如何實現數據共享呢?可以用SHARED MEMORYSHARED BUFFER,它們是服務器上的某片所有用戶共享的內存。關於SHARED MEMORYSHARED 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可以讀取到值。

 

說明:

1、  既然是服務器上的所有用戶共享空間,那么該值將保存到服務器關機重啟為止,除非用戶用DELETE語句清除它。其實這個跟ENQUEUE/DEQUEUE有點相似之處。

2、  數據庫也可共享數據,不過服務器共享肯定速度快些。

3、  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中使用全局自定義表

在開發smartform的時候可以通過指針來調用全局自定義的表而不用在系統中創建一個永久的結構。

【1】:在SmartForm中定義一個結構,這個結構要和程序中使用的結構完全相同。

image290

【2】:定義報表中全局的表和工作空間,

image291

【3】:定義指針,指向程序中的某個內表,然后獲取該內表。

image292

 

其實如果也想這樣動態調用某函數里的全局變量,先找到這個函數所在的函數組,再找到該函數組所對應的主程序名,然后像上面那樣使用即可:

image293

動態訪問主調程序中的全局變量

請參考這里

DATABASE

上面說了SHARED BUFFER並不訪問(存儲)數據庫,而要訪問數據庫就應該用DATABASE

 

EXPORT DATABASE與普通數據庫操作的不同之處是,它適合大數據量的操作,系統自動將其拆分成多條記錄並存儲到數據庫中,比如圖片或文檔(甚至是程序中的某個內表,請參考后面的實例)。而用IMPORT DATABASE的過程則相反,系統將把這些條相關記錄又自動組合起來成為一個整體。

 

image294

 

如果要自定義INDX這樣的表,需要按以下表結構順序來定義:

image295

1、可以有也可以無 MANDT字段

2、除開第一個字段MANDT(如果有的情況下),下一個字段必須是RELID,類型為CHAR 2,它是用來存儲area ID,系統會根據用戶在使用EXPORT語句保存數據時指定的area ID來填充它。

3、緊接下一個字段是一個任意長度(根據自己的需要定)的CHAR字段,名字也可以是隨便取的,該字段用為主鍵的一部分來使用,該字段的值也是在使用EXPORT語句保存數據時使用ID選項指定的值。image296

4、下一個字段的名字必須是SRTF2,類型為INT4,用來存儲數據行號(大數據對象——如圖片、文件、程序中的內表對象等,要分成多行來存儲)。由於某個數據可能很大,需要多行來存儲,理念是可能達到2**31行,該字段會自動的由系統填充。

5、在SRTF2字段的后面,你可以包括任意數量及類型的數據字段,這些字段是用來管理大對象的相應信息(如文件名、文件類型、創建者等),當你在保存數據時系統不會自動的填充這些字段,所以在保存這些字段時,需要通過一個結構傳遞需要存儲的值(即EXPORT語句中的From選項所帶的結構)。

6、倒數第二個字段的名必須為CLUSTR,類型為INT2,它存儲了最后一個字段CLUSTD所存儲數據的長度(字節數),在使用EXPORT語句保存數據時系統會自動填充

7、最后一個字段的名必須是CLUSTD,並且數據類型為LRAW,其長度表示能最大存儲多少個字節的內容,如果大數據對象很大(一行存儲不下時),會分成多行來存儲,行號就存儲在前面的SRTF2字段中。

將文件存入表中

image297

注意:上面這個表中的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.

image298

上面是直接將讀取到的文件的二進制數據內表存儲到簇數據庫表中,我也也可通過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.

"XstringX類型視圖存儲到內表中
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[].


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM