1. 程式人生 > >ABAP 寫資料到SAP伺服器檔案

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