二维码

[基础语法] ABAP 写数据到SAP服务器文件

Twilight发表于 2015-06-01 16:05z3765295 最后回复于 2018-04-20 16:03 [复制链接] 4618 4

  • 在应用服务器中打开文件OPEN  DATASET  <dsn>  [options] 此语句打开文件 <dsn> 。如果不指定任何模式 选项,则文件将按二进 制模式打开。如果系统不能打开文件,则将系统字段 SY-SUBRC 设置为8,否则 SY-SUBRC 返回0
  • 打开文件读取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>].

常用事务代码:
  • AL11,服务器上的文件目录
  • CG3Y 下载文件
  • CG3Z 上传文件


从程序上传数据到服务器文件中(保存内表数据到服务器程序):
  1. TABLES:vbak,vbap.

  2. DATA:BEGIN OF wa_itab ,
  3.      vbeln LIKE vbak-vbeln,
  4.      vkorg LIKE vbak-vkorg,
  5.      erdat LIKE vbak-erdat,
  6.      kunnr LIKE vbak-kunnr,
  7.      posnr LIKE vbap-posnr,
  8.      matnr LIKE vbap-matnr,
  9.      kwmeng LIKE vbap-kwmeng,
  10. END OF wa_itab.
  11. DATA:itab LIKE wa_itab OCCURS 0 WITH HEADER LINE.
  12. DATA:g_file LIKE rlgrap-filename.
  13. DATA:s_file LIKE rlgrap-filename.
  14. DATA:menge(20).
  15. DATA:line(1000) TYPE c.

  16. SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE t1.
  17. SELECT-OPTIONS:s_erdat FOR vbak-erdat,
  18.                s_vbeln FOR vbak-vbeln,
  19.                s_kunnr FOR vbak-kunnr,
  20.                s_vkorg FOR vbak-vkorg.
  21. PARAMETERS:p_client AS CHECKBOX,
  22.            p_dnfile LIKE rlgrap-filename DEFAULT 'D:\',
  23.            p_server AS CHECKBOX,
  24.            p_sefile LIKE rlgrap-filename DEFAULT '/usr/sap/tmp/'.
  25. SELECTION-SCREEN END OF BLOCK bl1 .

  26. INITIALIZATION.
  27.   t1 = '选择条件'.

  28. START-OF-SELECTION.
  29.   PERFORM sub_read_data.

  30. END-OF-SELECTION.
  31.   PERFORM sub_write_data.
  32. *&---------------------------------------------------------------------*
  33. *&      Form  SUB_READ_DATA
  34. *&---------------------------------------------------------------------*
  35. *       text
  36. *----------------------------------------------------------------------*
  37. *  -->  p1        text
  38. *  <--  p2        text
  39. *----------------------------------------------------------------------*
  40. FORM sub_read_data .
  41.   SELECT vbak~vbeln vkorg vbak~erdat kunnr posnr matnr kwmeng
  42.   INTO TABLE itab
  43.   FROM vbak
  44.   JOIN vbap ON vbap~vbeln = vbak~vbeln
  45.   WHERE vbak~vbeln IN s_vbeln
  46.     AND vbak~erdat IN s_erdat
  47.     AND vkorg IN s_vkorg
  48.     AND kunnr IN s_kunnr.
  49. ENDFORM.                    " SUB_READ_DATA
  50. *&---------------------------------------------------------------------*
  51. *&      Form  SUB_WRITE_DATA
  52. *&---------------------------------------------------------------------*
  53. *       text
  54. *----------------------------------------------------------------------*
  55. *  -->  p1        text
  56. *  <--  p2        text
  57. *----------------------------------------------------------------------*
  58. FORM sub_write_data .
  59.   IF p_client = 'X'.
  60.     CONCATENATE p_dnfile 'SD' sy-datum sy-uzeit '.TXT' INTO g_file. "文本格式
  61.     CALL FUNCTION 'WS_DOWNLOAD'
  62.       EXPORTING
  63.         filename = g_file
  64.         filetype = 'DAT'
  65.       TABLES
  66.         data_tab = itab.  "被下载的内表
  67.   ENDIF.
  68.   IF p_server = 'X'.
  69.     CONCATENATE p_sefile 'SD' sy-datum '.txt' INTO s_file. "服务器保存的目录和文件名
  70.     OPEN DATASET s_file FOR OUTPUT IN TEXT MODE  ENCODING DEFAULT .  "打开文件
  71.     IF sy-subrc = 0.
  72.       LOOP AT itab INTO wa_itab.
  73.         menge = wa_itab-kwmeng.
  74.         CONCATENATE wa_itab-vkorg
  75.                     wa_itab-kunnr
  76.                     wa_itab-vbeln
  77.                     wa_itab-erdat
  78.                     wa_itab-posnr
  79.                     wa_itab-matnr
  80.                     menge
  81.         INTO line SEPARATED BY ''.
  82.         TRANSFER line TO s_file .
  83.         IF sy-subrc NE 0 .
  84.           MESSAGE 'ERROR!!' TYPE 'E'.
  85.         ENDIF.
  86.         CLEAR line .
  87.       ENDLOOP.
  88.       CLOSE DATASET s_file.
  89.     ELSE.
  90.       MESSAGE 'OPEN ERROR!!' TYPE 'E'.
  91.     ENDIF.
  92.   ENDIF.
  93. ENDFORM.                    " SUB_WRITE_DATA
复制代码

从服务器下载文件到程序中(读取服务器上的文件):
  1. DATA:p_file LIKE rlgrap-filename VALUE '/usr/sap/tmp/SD20111130.txt'.
  2. DATA:p_line(100).

  3. OPEN DATASET p_file FOR INPUT IN TEXT MODE ENCODING DEFAULT.
  4. IF sy-subrc NE 0.
  5.   MESSAGE '读取文件出错!' TYPE 'E'.
  6. ENDIF.

  7. DO.
  8.   READ DATASET p_file INTO p_line.
  9.   IF sy-subrc NE 0.
  10.     EXIT.
  11.   ELSE.
  12.     WRITE:/ p_line.
  13.   ENDIF.
  14. ENDDO.

  15. CLOSE DATASET p_file.
复制代码
回复

使用道具 举报

z3765295
Twilight 发表于 2018-4-18 21:40
有些操作是要写文件的,比如数据大规模抽取,如果直接抽取DB数据库,很可能耗尽服务器资源,数据以增量的 ...

以我遇见某大型项目为例,也是我现在在做的。BW抽数据,BSEG的。数据差不多有4千万靠上,初始化数据用了大概两天。还是甲骨文的数据库,对日常的用户操作丝毫没有影响。影响主要来源于两类,都可以通过技术规避的。
回复 支持 1 反对 0

使用道具 举报

Anda
如果系统不能打开文件,则将系统字段 SY-SUBRC 设置为 0,否则 SY-SUBRC 返回 8。 这段写反了吧
回复 支持 1 反对 0

使用道具 举报

z3765295
我有一个不成熟的疑问,如果保存在Sap的服务器,和保存在Sap的DB区别很大么
回复 支持 反对

使用道具 举报

Twilight
z3765295 发表于 2018-4-18 16:46
我有一个不成熟的疑问,如果保存在Sap的服务器,和保存在Sap的DB区别很大么 ...

有些操作是要写文件的,比如数据大规模抽取,如果直接抽取DB数据库,很可能耗尽服务器资源,数据以增量的文件形式可以缓解
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表