ABAP 寫資料到SAP伺服器檔案
一、在應用伺服器中開啟檔案OPEN DATASET <dsn> [options] 此語句開啟檔案 <dsn> 。如果不指定任何模式 選項,則檔案將按二進 制模式開啟。如果系統不能開啟檔案,則將系統欄位 SY-SUBRC 設定為 0,否則 SY-SUBRC 返回 8
二、開啟檔案讀取OPEN DATASET <dsn> FOR INPUT IN TEXT MODE ENCODING DEFAULT .(以TXT檔案開啟)
三、開啟檔案寫入OPEN DATASET <dsn> FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .(以TXT檔案開啟寫入,這種是開啟檔案完全重寫)
四、開啟檔案追加 OPEN DATASET <dsn> FOR APPENDING IN TEXT MODE ENCODING DEFAULT .(以TXT檔案開啟寫入,這種是開啟檔案追加記錄)
五、關閉應用伺服器上的檔案 CLOSE DATASET <dsn>.
六、刪除應用伺服器上的檔案 DELETE DATASET <dsn>.
七、嚮應用伺服器上檔案上寫入資料TRANSFER <f> to <dsn> [LENGTH <len>].
八、嚮應用伺服器上檔案上讀取資料READ DATASET <dsn> INTO <f> [LENGTH <len>].
常用事務程式碼:
1.AL11,伺服器上的檔案
2.CG3Y 下載檔案
3.CG3Z 上傳檔案
從程式上傳資料到伺服器檔案中
*&---------------------------------------------------------------------*
*& Report ZEX10_PYY
*&
*&---------------------------------------------------------------------*
*& CREATE:
*& MODIFY:
*&---------------------------------------------------------------------*
REPORT ZEX10_PYY MESSAGE-ID Z001 NO STANDARD PAGE HEADING LINE-SIZE 100 .
INCLUDE ZEX10_PYY_INCLUDE . " 包含程式——定義的內表和工作區
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001 . " 建立一個帶名稱元素塊
PARAMETER: S_BUKRS LIKE BSIS-BUKRS OBLIGATORY. " 選擇螢幕中的公司程式碼為必輸項
SELECT-OPTIONS: S_GJAHR FOR BSIS-GJAHR . " 選擇螢幕中的會計年度為可選項
SELECTION-SCREEN SKIP 1 . " 空行
PARAMETER P_T AS CHECKBOX . " 選擇框 (如果點中選擇框 P_T = 'X' 不選中選擇框則為SPACE(空))
SELECTION-SCREEN END OF BLOCK B1. " 結束元素塊
AT SELECTION-SCREEN .
PERFORM FRM_CHECK_BUKRS . " 檢查公司程式碼在T001中是否存在
START-OF-SELECTION .
PERFORM FRM_GET_DATA . " 在資料庫表BSIS中取出資料放到'要輸出資料的內表'中(簡稱主內表)
PERFORM FRM_ADD_BLART. " 根據主內表取出的公司程式碼、會計憑證、會計年度在資料庫表BKPF中把憑證型別的資料取出來,並修改主內表中憑證型別欄位
PERFORM FRM_ADD_LTEXT . " 根據主內表的憑證型別在資料庫表T003T中把憑證描述的資料取出來,並修改主內表中憑證描述的欄位
PERFORM FRM_ADD_GJAHR . " 拼接擡頭資料到相應的欄位中
END-OF-SELECTION .
PERFORM FRM_DOWNLOAD . " 把內表中的資料DOWN到伺服器中
PERFORM FRM_LAYOUT. " 顯示畫面
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_BUKRS
*&---------------------------------------------------------------------*
* text 檢查公司程式碼在資料庫表T001表中是否存在
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CHECK_BUKRS .
SELECT SINGLE BUTXT " 根據輸入的公司程式碼在表T001中是夠存在,同時取出公司名稱
FROM T001
INTO L_BUTXT
WHERE BUKRS = S_BUKRS .
IF SY-SUBRC NE 0 . " 如果輸入的公司程式碼不在表T001中,則報個MESSAGE,E表示停止繼續執行程式
MESSAGE E007(Z001) WITH S_BUKRS.
ENDIF.
ENDFORM. " FRM_CHECK_BUKRS
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text 取出主資料
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT BELNR " 會計憑證
MANDT " 客戶端
BUKRS " 公司程式碼
GJAHR " 會計年度
BUZEI " 憑證行專案
MONAT " 會計期間
BUDAT " 過帳日期
BLDAT " 憑證日期
WAERS " 貨幣碼
WRBTR " 金額
FROM BSIS
INTO CORRESPONDING FIELDS OF TABLE T_PENG " 根據查詢條件在資料庫表BSIS中取出資料放到主內表T_PENG中
WHERE BUKRS = S_BUKRS
AND GJAHR IN S_GJAHR .
IF T_PENG IS INITIAL. " 如果主內表中沒有資料(沒有查詢到資料),則報個MESSAGE。
MESSAGE E001(Z001).
ENDIF.
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_ADD_BLART
*&---------------------------------------------------------------------*
* text 新增憑證型別
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_ADD_BLART .
CHECK T_PENG IS NOT INITIAL .
SELECT BUKRS " 公司程式碼
BELNR " 憑證編號
GJAHR " 會計年度
BLART " 憑證型別
FROM BKPF
INTO CORRESPONDING FIELDS OF TABLE T_BKPF " 根據主內表取出的公司程式碼、會計憑證、會計年度在資料庫表BKPF中把憑證型別的資料取出來
FOR ALL ENTRIES IN T_PENG " FOR ALL ENTRIES IN T_PENG就是根據T_PENG中已經存在的資料在表BKPF中找出相應的資料
WHERE BUKRS = T_PENG-BUKRS " (注意,用到FOR ALL ENTRIES IN這個語句,一定要在搜尋前加上一個判斷(CHECK)語句,不然會把表BKPF中的所有資料都會找出來)
AND BELNR = T_PENG-BELNR
AND GJAHR = T_PENG-GJAHR .
SORT T_BKPF BY BUKRS BELNR GJAHR . " 根據BUKRS BELNR GJAHR排序
LOOP AT T_PENG INTO W_PENG . " 迴圈主內表 讀取內表T_PENG的資料到工作區W_PENG中。
READ TABLE T_BKPF INTO W_BKPF WITH KEY BUKRS = W_PENG-BUKRS
BELNR = W_PENG-BELNR
GJAHR = W_PENG-GJAHR BINARY SEARCH . " BINARY SEARCH是二分法搜尋,可以增加執行的效率,但要注意內表T_BKPF一定要根據查詢的條件排序
IF SY-SUBRC = 0.
W_PENG-BLART = W_BKPF-BLART . " 如果找到資料,則把工作區W_BKPF中BLART賦值給工作區W_PENG中BLART欄位。
ENDIF.
MODIFY T_PENG FROM W_PENG . " 根據工作區的資料修改內表中的資料
ENDLOOP.
ENDFORM. " FRM_ADD_BLART
*&---------------------------------------------------------------------*
*& Form FRM_ADD_LTEXT
*&---------------------------------------------------------------------*
* text 新增憑證描述
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_ADD_LTEXT .
CHECK T_PENG IS NOT INITIAL . " 根據主內表的憑證型別在資料庫表T003T中把憑證描述的資料取出來,並修改主內表中憑證描述的欄位
SELECT BLART " 憑證型別 " 跟上面的子程式 FORM FRM_ADD_BLART 類似,這裡不多說
LTEXT " 憑證描述
FROM T003T
INTO CORRESPONDING FIELDS OF TABLE T_T003T
FOR ALL ENTRIES IN T_PENG
WHERE BLART = T_PENG-BLART
AND SPRAS = SY-LANGU .
SORT T_T003T BY BLART .
LOOP AT T_PENG INTO W_PENG .
READ TABLE T_T003T INTO W_T003T WITH KEY BLART = W_PENG-BLART BINARY SEARCH .
IF SY-SUBRC = 0.
W_PENG-LTEXT = W_T003T-LTEXT .
ENDIF.
MODIFY T_PENG FROM W_PENG .
ENDLOOP.
SORT T_PENG BY BELNR GJAHR BUZEI .
ENDFORM. " FRM_ADD_TEXT
*&---------------------------------------------------------------------*
*& Form FRM_ADD_GJAHR
*&---------------------------------------------------------------------*
* text 擡頭資料
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_ADD_GJAHR . " 因為S_GJAHR有兩個輸入框,前面一個框為S_GJAHR-LOW 後面的為S_GJAHR-HIGH
IF S_GJAHR-HIGH IS INITIAL AND S_GJAHR-LOW IS NOT INITIAL. " 如果S_GJAHR-LOW不為空和S_GJAHR-HIGH為空的情況下
CONCATENATE S_GJAHR-LOW '年' INTO L_GJAHR . " 拼接會計年度S_GJAHR-LOW和‘年’字到欄位L_GJAHR 中
ELSEIF S_GJAHR-LOW IS INITIAL AND S_GJAHR-HIGH IS NOT INITIAL. " 如果S_GJAHR-LOW為空和S_GJAHR-HIGH不為空的情況下
CONCATENATE S_GJAHR-HIGH '年' INTO L_GJAHR . " 拼接會計年度S_GJAHR-HIGH和‘年’字到欄位L_GJAHR 中
ELSEIF S_GJAHR-LOW IS NOT INITIAL AND S_GJAHR-HIGH IS NOT INITIAL. " 如果都不為空
CONCATENATE S_GJAHR-LOW '-' S_GJAHR-HIGH '年' INTO L_GJAHR . " 拼接會計年度S_GJAHR-LOW -S_GJAHR-HIGH和‘年’字到欄位L_GJAHR 中
ENDIF.
CONCATENATE SY-DATUM+0(4) '年' SY-DATUM+4(2) '月' SY-DATUM+6(2) '日' INTO L_DATUM. " 拼接當前日期到欄位L_DATUM 中
ENDFORM. " FRM_ADD_GJAHR
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
* text 下載到伺服器
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DOWNLOAD . " 把內表的資料DOWN到伺服器中
CHECK P_T = SPACE . " 如果P_T(‘僅顯示’的選擇框)為空,則執行這個子程式 把內表的資料DOWN到伺服器中
DATA: L_FILEN(60) VALUE '.\ZPENG.TXT' . " 定義一個欄位L_FILEN 預設值為 '.\ZPENG.TXT',也就是檔名
OPEN DATASET L_FILEN FOR OUTPUT IN TEXT MODE ENCODING DEFAULT . " OUTPUT是以TXT方式開啟並完全重寫檔案,APPENDING新增檔案
LOOP AT T_PENG INTO W_PENG . " 迴圈內表T_PENG到工作區W_PENG
L_WRBTR = W_PENG-WRBTR . " 因為內表中的金額這個欄位為數值型,而拼接的時候只能是字串,所以需要把數字型欄位轉換為字元型欄位
CONCATENATE W_PENG-MANDT W_PENG-BUKRS W_PENG-BELNR W_PENG-GJAHR W_PENG-BUZEI W_PENG-LTEXT
W_PENG-MONAT W_PENG-BUDAT W_PENG-BLDAT L_WRBTR W_PENG-WAERS INTO L_DATA SEPARATED BY l_tab. " 連線內表中的資料並用分隔符分開放到字元型欄位L_DATA中
TRANSFER L_DATA TO L_FILEN . " 寫欄位L_DATA到L_FELEN檔案中
IF SY-SUBRC NE 0 . " 如果寫入不成功,則報個MESSAGE
MESSAGE I013(Z001).
ENDIF.
CLEAR L_DATA . " 清空欄位L_DATA
ENDLOOP.
CLOSE DATASET L_FILEN . " 關閉檔案(開啟檔案後,最好都要關閉檔案)
ENDFORM. " FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
* text 輸出顯示
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_LAYOUT .
WRITE TEXT-002 CENTERED . " 擡頭:憑證金額
SKIP 1 .
WRITE: / TEXT-003 ,7 S_BUKRS, 12 L_BUTXT , " 擡頭:公司
60 TEXT-004 , 70 L_GJAHR . " 擡頭:會計年度
SKIP 1 .
ULINE .
WRITE: /1 SY-VLINE ,2 TEXT-005 CENTERED, " 表頭
14 SY-VLINE ,15 TEXT-006 CENTERED,
23 SY-VLINE ,24 TEXT-014 CENTERED,
43 SY-VLINE ,44 TEXT-007 CENTERED,
54 SY-VLINE ,55 TEXT-008 CENTERED,
65 SY-VLINE ,66 TEXT-009 CENTERED,
76 SY-VLINE ,77 TEXT-010 CENTERED,
81 SY-VLINE ,82 TEXT-011 CENTERED, 100 SY-VLINE .
ULINE .
LOOP AT T_PENG INTO W_PENG .
WRITE: /1 SY-VLINE .
AT NEW BELNR .
WRITE 2(12) W_PENG-BELNR CENTERED. " 表資料
ENDAT.
WRITE: 14 SY-VLINE ,15(8) W_PENG-BUZEI CENTERED,
23 SY-VLINE ,24(20) W_PENG-LTEXT LEFT-JUSTIFIED,
43 SY-VLINE ,44(10) W_PENG-BLDAT CENTERED,
54 SY-VLINE ,55(10) W_PENG-BUDAT CENTERED,
65 SY-VLINE ,66(10) W_PENG-MONAT CENTERED,
76 SY-VLINE ,77(5) W_PENG-WAERS CENTERED,
81 SY-VLINE ,82(18) W_PENG-WRBTR RIGHT-JUSTIFIED, 100 SY-VLINE .
ULINE .
W1_PENG-WAERS = W_PENG-WAERS .
W1_PENG-WRBTR = W_PENG-WRBTR .
COLLECT W1_PENG INTO T1_PENG .
ENDLOOP.
LOOP AT T1_PENG INTO W1_PENG .
WRITE: /1 SY-VLINE ,2 '合計', " 表尾
14 SY-VLINE ,
76 SY-VLINE ,77(5) W1_PENG-WAERS CENTERED,
81 SY-VLINE ,82 W1_PENG-WRBTR RIGHT-JUSTIFIED, 100 SY-VLINE .
ULINE.
ENDLOOP.
WRITE: /4 TEXT-012 , 14 SY-UNAME ,
70 TEXT-013 , 76 L_DATUM .
ENDFORM. " FRM_LAYOUT
從伺服器下載檔案到程式中
*&---------------------------------------------------------------------*
*& Report ZEX10_PYY_01
*& 從伺服器上下載檔案到內表輸出
*&---------------------------------------------------------------------*
*& CREATE:
*& MODIFY:
*&---------------------------------------------------------------------*
REPORT ZEX10_PYY_01 MESSAGE-ID Z001 NO STANDARD PAGE HEADING LINE-SIZE 120.
INCLUDE ZEX10_PYY_INCLUDE . " 包含程式——定義的內表、工作區和欄位
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001 .
PARAMETER: P_FILEN(60) LOWER CASE OBLIGATORY . " 選擇螢幕——路徑
SELECTION-SCREEN END OF BLOCK B1 .
START-OF-SELECTION .
PERFORM FRM_GET_DATA. " 讀取檔案中資料到內表中
END-OF-SELECTION .
PERFORM FRM_LAYOUT. " 顯示畫面
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text 讀取檔案中資料到內表中
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
OPEN DATASET P_FILEN FOR INPUT IN TEXT MODE ENCODING DEFAULT . " 開啟檔案讀取
IF SY-SUBRC NE 0 . " 如果不能開啟,就報個MESSAGE
MESSAGE I014 .
ENDIF.
DO . " 迴圈
READ DATASET P_FILEN INTO L_DATA . " 讀取檔案到欄位L_DATA,讀取檔案是一行一行的讀取的
IF SY-SUBRC NE 0 . " 如果讀不到
EXIT . " 退出迴圈
ELSE . " 如果讀到
SPLIT L_DATA AT l_tab INTO W_PENG-MANDT W_PENG-BUKRS W_PENG-BELNR W_PENG-GJAHR W_PENG-BUZEI W_PENG-LTEXT " 根據系統分隔符l_tab把讀出的欄位L_DATA分割開來,
W_PENG-MONAT W_PENG-BUDAT W_PENG-BLDAT L_WRBTR W_PENG-WAERS . " 分別放到工作區的相關欄位
W_PENG-WRBTR = L_WRBTR . " 把字元型金額賦值給數值型金額
APPEND W_PENG TO T_PENG. " 新增工作區中的資料到內表中
ENDIF.
ENDDO.
CLOSE DATASET P_FILEN . " 關閉檔案
ENDFORM. " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
* text 輸出資料
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_LAYOUT .
CONCATENATE SY-DATUM+0(4) '年' SY-DATUM+4(2) '月' SY-DATUM+6(2) '日' INTO L_DATUM. " 合併字串到日期欄位中
WRITE TEXT-002 CENTERED . " 擡頭:憑證金額一覽 中間顯示
SKIP 1 . " 空行
ULINE . " 畫水平線
WRITE: /1 SY-VLINE ,2 TEXT-005 CENTERED, " 表頭 " 憑證編號 文字居中顯示
12 SY-VLINE ,13 TEXT-015 CENTERED, " 會計年度 文字居中顯示
23 SY-VLINE ,24 TEXT-006 CENTERED, " 行專案 文字居中顯示
30 SY-VLINE ,31 TEXT-016 CENTERED, " 公司程式碼 文字居中顯示
41 SY-VLINE ,42 TEXT-014 CENTERED, " 憑證描述 文字居中顯示
61 SY-VLINE ,62 TEXT-007 CENTERED, " 憑證日期 文字居中顯示
72 SY-VLINE ,73 TEXT-008 CENTERED, " 過帳日期 文字居中顯示
83 SY-VLINE ,84 TEXT-009 CENTERED, " 會計期間 文字居中顯示
94 SY-VLINE ,95 TEXT-010 CENTERED, " 貨幣 文字居中顯示
100 SY-VLINE ,101 TEXT-011 CENTERED, 120 SY-VLINE . " 金額 文字居中顯示
ULINE . " 畫水平線
SORT T_PENG BY BELNR BUZEI .
LOOP AT T_PENG INTO W_PENG . " 讀取內表T_PENG中的資料到工作區W_PENG中
WRITE: /1 SY-VLINE .
AT NEW BELNR . " 如果讀到新的BELNR(BELNR必須是內表的第1個欄位),則顯示會計憑證
WRITE 2(10) W_PENG-BELNR CENTERED. " 表資料
ENDAT.
WRITE: 12 SY-VLINE ,13(10) W_PENG-GJAHR CENTERED, " 會計年度 迴圈輸出內表到工作區的資料
23 SY-VLINE ,24(6) W_PENG-BUZEI CENTERED, " 行專案 迴圈輸出內表到工作區的資料
30 SY-VLINE ,31(10) W_PENG-BUKRS CENTERED, " 公司程式碼 迴圈輸出內表到工作區的資料
41 SY-VLINE ,42(20) W_PENG-LTEXT LEFT-JUSTIFIED, " 憑證描述 迴圈輸出內表到工作區的資料
61 SY-VLINE ,62(10) W_PENG-BLDAT CENTERED, " 憑證日期 迴圈輸出內表到工作區的資料
72 SY-VLINE ,73(10) W_PENG-BUDAT CENTERED, " 過帳日期 迴圈輸出內表到工作區的資料
83 SY-VLINE ,84(10) W_PENG-MONAT CENTERED, " 會計期間 迴圈輸出內表到工作區的資料
94 SY-VLINE ,95(5) W_PENG-WAERS CENTERED, " 貨幣 迴圈輸出內表到工作區的資料
100 SY-VLINE ,101(19) W_PENG-WRBTR RIGHT-JUSTIFIED, 120 SY-VLINE . "金額 迴圈輸出內表到工作區的資料
ULINE .
W1_PENG-WAERS = W_PENG-WAERS .
W1_PENG-WRBTR = W_PENG-WRBTR .
COLLECT W1_PENG INTO T1_PENG . " 根據貨幣碼累加金額到內表T1_PENG中
ENDLOOP.
LOOP AT T1_PENG INTO W1_PENG . " 讀取內表T1_PENG中的資料到工作區W1_PENG中
WRITE: /1 SY-VLINE ,2 '合計', " 表尾
12 SY-VLINE ,
94 SY-VLINE ,95(5) W1_PENG-WAERS CENTERED, " 貨幣 迴圈輸出內表到工作區的資料
100 SY-VLINE ,101 W1_PENG-WRBTR LEFT-JUSTIFIED, 120 SY-VLINE . " 金額 迴圈輸出內表到工作區的資料
ULINE.
ENDLOOP.
WRITE: /4 TEXT-012 , 14 SY-UNAME , " 製表人名字:系統的登入名
80 TEXT-013 , 86 L_DATUM . " 系統的當前日期
ENDFORM. " FRM_LAYOUT