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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值