SAP-FTP/SFTP,SXPG_CALL_SYSTEM,OPEN DATASET,CG3Y CG3Z

Function:SXPG_CALL_SYSTEM

通过该功能模块,您可以:
检查用户执行命令的权限
执行命令
为了确定应该在哪个系统上执行命令,功能模块默认使用当前主机系统和用户的当前操作系统类型。由于功能模块支持RFC,因此可以使用RFC接口(远程函数调用接口)在不同的SAP应用程序服务器中运行功能模块。然后,在另一个SAP服务器的主机系统中相应地执行外部命令。
SXPG_CALL_SYSTEM在执行调用之前检查在调用中指定的命令。如果存在与系统字段“SY-OPSYS”中操作系统类型相同的命令,则使用此定义执行该命令。它检查与系统字段sy-opsys中具有相同操作系统类型的命令定义。语法组是一种SAP构造,用于对命令和文件名使用相同语法的操作系统进行分组。如果某个命令的操作系统类型与确定的语法组匹配,则使用该命令的定义。
如果没有为语法组找到匹配的定义,函数模块将搜索操作系统类型为ANYOS(在所有支持的操作系统中可执行)的定义。如果找到这个定义,就使用它。
否则,将触发异常COMMAND_NOT_FOUND。

在这里插入图片描述

在这里插入图片描述

  • 对SAP service的上传和读取文件

T-code: AL11

AL11的user_dir创建

Step 1: 点configure

在这里插入图片描述

step 2,填写相关信息,并且保存

在这里插入图片描述
注:存在在AL11有纪录, 但实际上不存在的目录 ,DIR_ZEROLI2在服务器上其实是不存在的, 当我们双击它, 会有error message抛出,
当我们用open dataset语句去这个目录建一个文件时, 是不会成功的。

在服务器上建文件夹

  • 方法1:用事务码创建 SM69 or SM49

在这里插入图片描述
Step 1: 在SM69建一条命令, 支持dos或unix命令, 先保存再执行, 这里当然是建文件夹的命令, /c代表command

在这里插入图片描述
创建完成后保存,就可以在t-code al11查看结果。

  • 方法2:在代码里创建

用函数调用system command.

DATA: command1(64) TYPE c.
 
DATA:  BEGIN OF tabl OCCURS 0,
        line(200),
       END OF tabl.
 
DATA: lt_string TYPE STANDARD TABLE OF string,
      lv_strin TYPE string.
 
COMMAND1(9)    = 'mkdir -p '.
COMMAND1+9(55) = 'z_*********'.
 
CALL 'SYSTEM' ID 'COMMAND' FIELD COMMAND1
              ID 'TAB'     FIELD TABL-*SYS*.
 
BREAK-POINT ID z_*********.

Open dataset访问共享文件的权限(Windows)

工作组的共享文件

Step 1: 测试环境: A机Laoxiang: XP系统(共享文件夹所在机); B机Lupkid: Win7系统(SAP gui所在机); C机Vmecc: Win2003(装在B机的VMware, 同时C机也是SAP服务器).

保证AB相互ping通, AC相互ping通
Step 2: 测试代码:

TYPE-POOLS: z07tp.
 
DATA: gw_rec TYPE z07tp_rec,
      gt_rec TYPE STANDARD TABLE OF z07tp_rec.
 
CONSTANTS: cn_fname(8) TYPE c VALUE 'CUST07AD'.
 
CONSTANTS: cn_path(20) TYPE c VALUE '\\Laoxiang\zerotest\'.
 
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS: pr_file(40) TYPE c.
SELECTION-SCREEN END OF BLOCK blk1.
 
INITIALIZATION.
  pr_file = cn_fname.
 
START-OF-SELECTION.
  CONCATENATE cn_path pr_file INTO pr_file.
  OPEN DATASET pr_file IN TEXT MODE FOR INPUT ENCODING DEFAULT.
  IF sy-subrc <> 0.
    WRITE:/ text-002.
    EXIT.
  ENDIF.
  DO.
    READ DATASET pr_file INTO gw_rec.
    IF sy-subrc <> 0.
      EXIT.
    ENDIF.
    APPEND gw_rec TO gt_rec.
  ENDDO.
 
END-OF-SELECTION.
  CLOSE DATASET pr_file.
  

SFTP文件传输在程序中调使用函数SXPG_COMMAND_LIST_GET来执行外部操作命令,示例代码如下(代码中是弹出选择框让用户选择使用哪个外部命令)

*&---------------------------------------------------------------------*
*& Report  ZTESTJI003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ztestji003.

DATA: BEGIN OF command_list OCCURS 0.

        INCLUDE STRUCTURE sxpgcolist.

DATA: END OF command_list .

DATA: BEGIN OF exec_protocol OCCURS 0.

        INCLUDE STRUCTURE btcxpm.

DATA: END OF exec_protocol.

DATA: status      LIKE btcxp3-exitstat,

      commandname LIKE sxpgcolist-name VALUE '*',

      sel_no      LIKE sy-tabix.

* GET LIST OF EXTERNAL COMMANDS

CALL FUNCTION 'SXPG_COMMAND_LIST_GET'
  EXPORTING
    commandname     = commandname
    operatingsystem = sy-opsys
  TABLES
    command_list    = command_list
  EXCEPTIONS
    OTHERS          = 1.

IF sy-subrc EQ 0.

  CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
    EXPORTING
      endpos_col   = 100
      endpos_row   = 20
      startpos_col = 2
      startpos_row = 2
      titletext    = 'choose a COMMAND TO execute '
    IMPORTING
      choise       = sel_no
    TABLES
      valuetab     = command_list
    EXCEPTIONS
      break_off    = 1
      OTHERS       = 2.

  IF sy-subrc EQ 0.

    READ TABLE command_list INDEX sel_no.

* CHECK AUTHORIZATION

    CALL FUNCTION 'SXPG_COMMAND_CHECK'
      EXPORTING
        commandname                = command_list-name
        operatingsystem            = sy-opsys
      EXCEPTIONS
        no_permission              = 1
        command_not_found          = 2
        parameters_too_long        = 3
        security_risk              = 4
        wrong_check_call_interface = 5
        x_error                    = 6
        too_many_parameters        = 7
        parameter_expected         = 8
        illegal_command            = 9
        communication_failure      = 10
        system_failure             = 11
        OTHERS                     = 12.

    CASE sy-subrc.

      WHEN 0.

        CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
          EXPORTING
            commandname                   = command_list-name
          TABLES
            exec_protocol                 = exec_protocol
          EXCEPTIONS
            no_permission                 = 1
            command_not_found             = 2
            parameters_too_long           = 3
            security_risk                 = 4
            wrong_check_call_interface    = 5
            program_start_error           = 6
            program_termination_error     = 7
            x_error                       = 8
            parameter_expected            = 9
            too_many_parameters           = 10
            illegal_command               = 11
            wrong_asynchronous_parameters = 12
            cant_enq_tbtco_entry          = 13
            jobcount_generation_error     = 14
            OTHERS                        = 15.

        IF sy-subrc EQ 0.

          WRITE:/ command_list-name, 'ran successfully'.

        ELSE.

          WRITE:/ 'error WITH command', command_list-name.

        ENDIF.

      WHEN 1.

        WRITE:/'you are NOT authorized TO run', command_list-name.

      WHEN OTHERS.

        WRITE:/'error with FUNCTION with command', command_list-name.

    ENDCASE.

  ENDIF.
  "popup_with_table_display

ENDIF. "sxpg_command_list_get

新增文件:注:此时需要区分文件是ASC文件还是BIN文件,以及是不是 UTF-8的unicode编码。

OPEN DATASET dname FOR OUTPUT IN TEXT MODE ENCODING UTF-8.

OPEN DATASET filename FOR OUTPUT IN BINARY MODE.

对TEXT文件来说需要区分UTF-8,同时这里的filename需要注意大小写。

  OPEN DATASET LV_PATH FOR OUTPUT IN BINARY MODE.      " 以二进制形式创建
  IF SY-SUBRC <> 0.
    RET_CD  = ''.
    ERR_MSG = '附件创建失败'.
    CLOSE DATASET LV_PATH.
    RETURN.
  ENDIF.
  TRANSFER LV_DATA TO LV_PATH.                       " 写入内容
  CLOSE DATASET LV_PATH.

对二进制文件来说,我先将其转换为RAWSTRING类型,然后transfer,再用loop做的时候我没做好。具体做法其实就是多用了一个function:

bytecount = xstrlen( lv_file ).
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  EXPORTING
    input_length       = bytecount
*   FIRST_LINE         = 0
*   LAST_LINE          = 0
 IMPORTING
   BUFFER             = lv_data
  tables
    binary_tab         = t_rawdata.

这里SCMS_CONV的function group和cl_bcs_convert这个class的功能基本差不多。

对TEXT文本:(直接在loop循环中处理即可)

OPEN DATASET dname FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
  LOOP AT it_ascii .
    TRANSFER it_ascii TO dname.
    TRANSFER cl_abap_char_utilities=>cr_lf TO dname.
  ENDLOOP.
  CLOSE DATASET dname.**

读取文件:

OPEN DATASET filename FOR INPUT IN BINARY MODE.
  READ DATASET filename INTO lv_data.
CLOSE DATASET filename.

删除文件:

  OPEN DATASET LV_PATH FOR OUTPUT IN BINARY MODE.    " 尝试打开文件
  IF SY-SUBRC <> 0.                                  " 不为0时说明文件不存在,直接返回
    CLOSE DATASET LV_PATH.
    RETURN.
  ENDIF.
  DELETE DATASET LV_PATH.                            " 以二进制形式创建
  IF SY-SUBRC <> 0.
    RET_CD  = ''.
    ERR_MSG = '附件删除失败'.
    CLOSE DATASET LV_PATH.
    RETURN.
  ENDIF.
*****************************关闭文件流****************************
  CLOSE DATASET LV_PATH.

除此之外还有:

打开文件追加 :

OPEN DATASET <dsn> FOR APPENDING IN TEXT MODE ENCODING DEFAULT .
      FTP(File transfer protocol)是一种标准的网络协议,可以用于在互联网上传递文件。SAP系统中提供了一些标准函数,放在函数组SFTP中, FTP服务器与SAP之间文件传输,这种方式有很多的实施案例。假设SAP中的数据要放到FTP服务器,可以通过点对点的方式,将数据形成文件放在应用服务器的某一路径下,然后使用标准的FTP函数进行文件传输;也可以通过PI进行数据集成,PI有专门的FTP adapter。也可以通过执行SAP的标准程序RSFTP005,自动创建两个名为SAPFTP何SAPFTPA的TCP/IP的RFC连接。

在这里插入图片描述

这些是FTP相关的一些报表:

RSFTP001 - SAPFTP 版本检查

RSFTP002 - 执行 FTP 命令

RSFTP003 - 测试

RSFTP004 - FTP 复制

RSFTP005 - SAPFTP 检查

RSFTP006 - FTP 命令清单

RSFTP007 - Test FB:FTP_SERVER_TO_r3 / FTP_R3_TO_SERVER 读取FTP数据到R3 / R3数据写入FTP。

RSFTP008 - Test FB:FTP_CLIENT_TO_R3 / FTP_R3_TO_CLIENT 读取FTP数据到…

从FTP复制文件共有两种方式,一种是直接复制文件,另一种方式是先从FTP读取文件数据到内表,拷贝再写入指定位置文件,不过该功能仅支持文本格式文件(.TXT,.DAT),一般不予推荐。

相关函数:

1)FTP_CONNECT:通过账号连接FTP。

2)FTP_COMMAND:执行FTP操作命令(注意,程序中所有命令必须为小写)。

1cd:指定本地文件夹路径;

cd:指定FTP文件夹路径;

put :上传文件;

get :下载文件;

3)FTP_SERVER_TO_R3:将FTP上的指定文本文件数据读取到内表。

4)FTP_DISCONNECT:关闭FTP连接。

​
REPORT ZR_EXAMPLE_07 .  
DATA: KEY TYPE I VALUE 26101957,  
    TRFCDEST   LIKE RFCDES-RFCDEST,  
    THANDLE    TYPE I.  
 
INCLUDE:<ICON>.  
*定义输入界面  
SELECTION-SCREEN:BEGIN OF BLOCK FTPLOGIN WITH FRAME TITLE TEXT-001.  
PARAMETERS: P_USER(45) LOWER CASE OBLIGATORY MEMORY ID USR,  
           P_PWD(45) MODIF ID PWD LOWER CASE OBLIGATORY MEMORY ID PWD,  
           P_HOST(15) MEMORY ID HOS OBLIGATORY,  
           FTP_PATH(30) MEMORY ID FPOS OBLIGATORY.  
SELECTION-SCREEN:END OF BLOCK FTPLOGIN.  
 
SELECTION-SCREEN:BEGIN OF BLOCK UPLOAD WITH FRAME TITLE TEXT-002.  
PARAMETERS: P_UPPATH(45),  
         P_FILE(20) .  
SELECTION-SCREEN: BEGIN OF LINE.  
SELECTION-SCREEN: PUSHBUTTON 1(20) PUBU USER-COMMAND UPLOAD.  
SELECTION-SCREEN: END OF LINE.  
SELECTION-SCREEN:END OF BLOCK UPLOAD.  
 
SELECTION-SCREEN:BEGIN OF BLOCK DOWNLOAD WITH FRAME TITLE TEXT-003.  
PARAMETERS: DL_PATH(45),  
           DL_FILE(20) .  
SELECTION-SCREEN: BEGIN OF LINE.  
SELECTION-SCREEN: PUSHBUTTON 1(20) GEBU USER-COMMAND DOWNLOAD.  
SELECTION-SCREEN: PUSHBUTTON 24(30) SHBU USER-COMMAND ITAB_DL.  
SELECTION-SCREEN: END OF LINE.  
SELECTION-SCREEN:END OF BLOCK DOWNLOAD.  
 
AT SELECTION-SCREEN OUTPUT.  
* 对密码输入栏进行加密处理  
  PERFORM MASK_PWD.  
 
* 给各按钮加入文本及图标  
  WRITE ICON_OUTGOING_OBJECT  AS ICON TO PUBU.  
  CONCATENATE PUBU 'Upload FTP' INTO PUBU SEPARATED BY SPACE.  
 
  WRITE ICON_INCOMING_OBJECT  AS ICON TO GEBU.  
  CONCATENATE GEBU 'FTP download' INTO GEBU SEPARATED BY SPACE.  
 
  WRITE ICON_WRITE_FILE  AS ICON TO SHBU.  
  CONCATENATE SHBU 'Internal table download' INTO SHBU SEPARATED BY  
SPACE.  
 
AT SELECTION-SCREEN.  
  PERFORM FTPCONNECT.  
  IF SY-SUBRC <> 0.  
 MESSAGE I001(00) WITH 'Can''t connect to FTP!'.  
 EXIT.  
  ENDIF.  
 
  MESSAGE S001(00) WITH 'FTP connect OK!'.  
  CASE SY-UCOMM.  
 WHEN 'ONLI'.  
   PERFORM FTPDISCONNECT.  
   EXIT.  
  ENDCASE.
*执行FTP功能  
  PERFORM FTP_EXECUTE.  
*关闭FTP连接  
  PERFORM FTPDISCONNECT.  
*-----------------------------------------------------------------------------*  
*       改变密码输入框显示属性,实现密码保护        *  
*-----------------------------------------------------------------------------*  
FORM MASK_PWD.  
  LOOP AT SCREEN .  
 IF SCREEN-NAME = 'P_PWD'.  
   SCREEN-INVISIBLE = '1'.  
   MODIFY SCREEN .  
   CONTINUE.  
 ENDIF.  
  ENDLOOP.  
ENDFORM.                    "  
 
*-----------------------------------------------------------------------------*  
*       通过IP、用户名、密码连接FTP服务器         *  
*-----------------------------------------------------------------------------*  
FORM FTPCONNECT.  
  DATA: THOSTS(45),TUSERS(45),TPWORD(45).  
  THOSTS = P_HOST.  
  TUSERS = P_USER.  
  TPWORD = P_PWD.  
* 对密码数值进行加密解析处理  
  CALL 'AB_RFC_X_SCRAMBLE_STRING'     " System Function  
 ID 'SOURCE'      FIELD TPWORD  
 ID 'KEY'         FIELD KEY  
 ID 'SCR'         FIELD 'X'  
 ID 'DESTINATION' FIELD TPWORD  
 ID 'DSTLEN'      FIELD 64.  
 
* 定义RFC连接目标,前后台执行时不同  
  IF SY-BATCH = 'X'.  
 TRFCDEST = 'SAPFTPA'.  
  ELSE.  
 TRFCDEST = 'SAPFTP'.  
  ENDIF.  
 
*该函数可以定义有网关时账户密码,一般公司内部访问时无此设置  
  CALL FUNCTION 'FTP_CONNECT'  
 EXPORTING  
   USER                 = TUSERS 
   PASSWORD             = TPWORD 
   HOST                 = THOSTS 
   RFC_DESTINATION      = TRFCDEST 
IMPORTING  
  HANDLE                = THANDLE 
EXCEPTIONS  
  NOT_CONNECTED     = 1 
  OTHERS                = 2.  
ENDFORM.                " FTPCONNECT  
*&---------------------------------------------------------------------  
*&     设置结束时关闭SAP  
*&---------------------------------------------------------------------  
FORM FTPDISCONNECT.  
  CALL FUNCTION 'FTP_DISCONNECT'  
    EXPORTING  
         HANDLE = THANDLE.  
ENDFORM.                    " FTPDISCONNECT  
*&---------------------------------------------------------------------*  
*&      通过SAP执行命令上传或下载FTP文件  
*&---------------------------------------------------------------------*  
FORM FTP_EXECUTE.  
  DATA:TSUBRC LIKE SY-SUBRC.  
  DATA:BEGIN OF COM OCCURS 0,  
      CMD(100) TYPE C,  
    END OF COM.  
  DATA:BEGIN OF RES OCCURS 0,  
      LINE(100) TYPE C,  
    END OF RES.  
 
*指定FTP文件夹路径  
  IF NOT FTP_PATH IS INITIAL.  
 CONCATENATE 'cd' FTP_PATH INTO COM-CMD SEPARATED BY ' '.  
 APPEND COM.  
  ENDIF.  
 
  CASE SY-UCOMM.  
 WHEN 'UPLOAD'.  
*指定上传文件夹路径及上传文件命令  
   CONCATENATE 'lcd' P_UPPATH INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
   CONCATENATE 'put' P_FILE INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
 
 WHEN 'DOWNLOAD'.  
*指定下载文件夹路径及下载文件命令  
   CONCATENATE 'lcd' DL_PATH INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
   CONCATENATE 'get' DL_FILE INTO COM-CMD SEPARATED BY ' '.  
   APPEND COM.  
  ENDCASE.  
 
  LOOP AT COM FROM 1.  
 IF COM-CMD <> ''.  
*执行FTP指令  
   CALL FUNCTION 'FTP_COMMAND'  
        EXPORTING  
             HANDLE        = THANDLE 
             COMCOMMAND       = COM-CMD  
        TABLES  
             DATA          = RES 
        EXCEPTIONS  
             TCPIP_ERROR   = 1 
             COMMAND_ERROR = 2 
             DATA_ERROR    = 3 
             OTHERS        = 4.  
 
*当执行失败时回执数据并退出  
   IF SY-SUBRC <> 0.  
     CASE SY-UCOMM.  
       WHEN 'UPLOAD'.  
         MESSAGE E001(00) WITH 'FTP UPLOAD FAIL!'.  
       WHEN 'DOWNLOAD'.  
         MESSAGE E001(00) WITH 'FTP DOWNLOAD FAIL!'.  
     ENDCASE.  
     EXIT.  
   ELSE.  
 
*根据不同按钮的功能码判断程序执行逻辑及回执信息,当选择从内表下载功能时转入子程序  
     CASE SY-UCOMM.  
       WHEN 'UPLOAD'.  
         MESSAGE S001(00) WITH 'FTP UPLOAD SUCCESS!'.  
       WHEN 'DOWNLOAD'.  
         MESSAGE S001(00) WITH 'FTP DOWNLOAD SUCCESS!'.  
       WHEN 'ITAB_DL'.  
         PERFORM DL_ITAB USING THANDLE DL_PATH DL_FILE.  
     ENDCASE.  
   ENDIF.  
 ENDIF.  
  ENDLOOP.  
 
  CLEAR:COM,RES,TSUBRC.  
  REFRESH:COM,RES.  
ENDFORM.                    " FTPPUTFILE 

​
*---------------------------------------------------------------------*  
*      将FTP文本类型文件数据读取到内表       *  
*---------------------------------------------------------------------*  
FORM DL_ITAB USING THANDLE  TYPE I  
                VALUE(FILEPATH) TYPE C  
                FILENAME TYPE C.  
  DATA: BEGIN OF BLOB OCCURS 0,  
       LINE(255) TYPE C,  
     END OF BLOB.  
*连接字符串定义本地文件具体路径  
CONCATENATE FILEPATH FILENAME INTO FILEPATH.  
 
*将FTP文本类型文件数据读取到内表  
*若所读FTP文件为非文本文件(*.txt,*.dat)时将出现错误  
  CALL FUNCTION 'FTP_SERVER_TO_R3'  
    EXPORTING  
         HANDLE = THANDLE 
         FNAME  = FILENAME 
    TABLES  
         BLOBBLOB   = BLOB.  
 
*读取文件失败时退出程序并回执错误  
  IF SY-SUBRC <> 0.  
 MESSAGE E001(00) WITH 'Read FTP File FAIL!'.  
 EXIT.  
  ENDIF.  
 
*将内表数据下载到本地文件  
  CALL FUNCTION 'WS_DOWNLOAD'  
    EXPORTING  
         FILENAME            = FILEPATH 
         FILETYPE            = 'DAT' 
    TABLES  
         DATA_TAB            = BLOB 
    EXCEPTIONS  
         FILE_OPEN_ERROR     = 1 
         FILE_WRITE_ERROR    = 2 
         INVALID_FILESIZE    = 3 
         INVALID_TABLE_WIDTH = 4 
         INVALID_TYPE        = 5.  
 
*将数据写入本地文件失败时回执错误  
  IF SY-SUBRC <> 0.  
 MESSAGE E001(00) WITH 'FTP Download By Internal table FAIL!'.  
  ELSE.  
 MESSAGE S001(00) WITH 'FTP Download By Internal table SUCCESS!'.  
  ENDIF.  
ENDFORM.

CG3Y CG3Z
普通的上传下载功能

事务码: CG3Y
例如要把上面的文件下载到本地
在这里插入图片描述
三、上传文件
事务码 CG3Z
按照操作完成即可。

CG3Y/CG3Z程序迁移

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值