abap memory/sap memory/shared buffer/database
abap提供了import/export 和 set/get parameter語句,可對使用者記憶體/伺服器記憶體/資料庫進行儲存和訪問。
不過可能很多人對此還不是很了解,下面我們通過例項來測試它們的區別和聯絡。
1. abap memory
使用者登陸後,最多乙個系統可以開6個視窗,這在sap中稱為external mode。
而同乙個視窗中,執行某程式後,可以通過call transaction/submit或其他**跳轉到其他程式,這個稱為
internal mode。internal mode的呼叫棧最多為9層。
那麼abap memory,它是屬於internal mode間可以共享的資料,而external mode間無法共享。
例子. 建立程式a,輸入:
data matnr type matnr.
import matnr from memory id 'ytest_matnr'.
write matnr.
建立程式b,輸入:
data matnr type matnr.
matnr = '000000000000001234'.
export matnr to memory id 'ytest_matnr'.
submit y_program_a. "呼叫程式a
直接執行b,發現程式a從abap memory讀到了值並輸出到list.
說明:(1)除錯執行b到export語句後面,goto-system area-abap memory,可以檢視到名為ytest_matnr的一片記憶體。
(2)如果b和a執行在不同的視窗,則a將訪問不到資料;當使用者輸入/n退出當前程式時,記憶體值也將被清空。
(3)該語句適用於call transaction/submit過程中的資料共享,也常用於user exit,類似於定義全域性變數的效果。
2. 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的值與本次登陸有關,當使用者登出後才失效。在使用者登陸的時候,系統會根據每個使用者
user profile-own data-parameter下的設定,載入到sap memory。
(3)data element中可以看到further characteristics下可定義parameter id,代表該欄位作為螢幕元素時,可
讀取該parameter id作為預設值。比如va03會自動顯示剛剛建立的訂單號。
3. shared memory/shared buffer
前面介紹的都是使用者記憶體,那麼不同使用者間如何實現資料共享呢?可以用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可以讀取到值。
說明:(1)既然是伺服器上的所有使用者共享空間,那麼該值將儲存到伺服器關機重啟為止,除非使用者用delete語句清除它。
其實這個跟enqueue/dequeue有點相似之處。
(2)資料庫也可共享資料,不過伺服器共享肯定速度快些,理論上適合網路遊戲,呵呵。
(3)indx是系統中存在的符合特定格式要求的表。但這不代表該export/import語句將在表indx中增加記錄,僅僅
代表伺服器借用了indx的結構來管理該片共享記憶體。
4. database
上面說了shared buffer並不訪問資料庫,而要訪問資料庫就應該用database。
建立乙個程式,錄入**:
data: matnr type matnr.
matnr = '000000000000004321'.
export matnr to database indx(aa) id 'ytest_matnr'.
執行程式,然後se16檢視表indx,發現新增了一條relid = aa, srtfd = ytest_matnr的記錄。如果export
的資料量比較大,則新增的將是多條,這些條目的字段值srtf2從0遞增。所以export database與普通資料庫操
作的不同之處是,它適合大資料量的操作,系統自動將其拆分成多條記錄並儲存到資料庫中,比如或文件。而用
import database的過程則相反,系統將把這些條相關記錄又自動組合起來成為乙個整體。
Shell shell啟動的四種方式及區別
shell指令碼啟動有多種方式,各種方式會載入不同的指令碼,直接決定當前shell中的環境變數,具體shell啟動方式如下 1.互動登入shell啟動,或者使用 login引數啟動 登入shell就是在輸入使用者名稱和密碼登入後得到的shell,比如從字元終端登入或者用telnet ssh從遠端登入...
小知識 docker 四種資料儲存方式
預設方式,容器本身管理自己的資料,容器檔案系統實際是一系列唯讀的檔案層和最上層的容器可寫檔案層組成,最上層的容器可寫檔案層保留容器執行過程中產生的所有資料修改,這些層的管理是利用容器的storage drivers實現 預設是overlay2,可以通過docker的dameon.json配置檔案修改...
資料庫中的四種連線方式特點及區別
內連線 inner join 左連線 left join 右連線 right join 交叉連線 cross join 具體的區別讓我用倆張表舉例 現在我們將表1 和表2 實現內連線 select from 表1 inner join 表2 on 表1.id 表2.id 結果如下 以左表的全部為基準...