当前位置: 首页 > article >正文

ABAP OPEN DATASET

屏幕加个文本控件,勾选回应双击作为上传触发操作
在这里插入图片描述
分配功能键DCLICK
在这里插入图片描述

再加俩按钮上传和下载
在这里插入图片描述

*&---------------------------------------------------------------------*
*& Report YDEMO2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ydemo2.

TYPES: BEGIN OF ty_file,
         file_type   TYPE string, " 屏幕文件类型
         source_path TYPE string, " 来源本地路径
         target_path TYPE string, " 目标服务器路径
       END OF ty_file.

" 屏幕字段
DATA: gv_file TYPE string.

" 文件上传变量
DATA: gt_file TYPE TABLE OF ty_file,
      gs_file TYPE ty_file.

CALL SCREEN 9001.

*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.

  SET PF-STATUS 'STATUS_9001'.

ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.

  DATA: lv_name  TYPE char20,
        lv_subrc TYPE i.

  "获取光标焦点
  GET CURSOR FIELD lv_name.

  " 双击上传文件事件
  IF sy-ucomm = 'DCLICK'.
    PERFORM frm_select_file USING lv_name.
  ENDIF.

  CASE sy-ucomm.
    WHEN 'UPD'. " 上传
      PERFORM frm_upload_file CHANGING lv_subrc.
      IF lv_subrc <> 0.
        EXIT.
      ELSE.
        " 更新屏幕为服务器路径
        LOOP AT gt_file INTO gs_file.
          CASE gs_file-file_type.
            WHEN 'GV_FILE'.
              gv_file = gs_file-target_path.
            WHEN OTHERS.
          ENDCASE.
        ENDLOOP.
        CLEAR gt_file[].
      ENDIF.

    WHEN 'DLD'. " 下载
      PERFORM frm_download_file USING lv_name.
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.

*&---------------------------------------------------------------------*
*& Form frm_select_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_NAME
*&---------------------------------------------------------------------*
FORM frm_select_file USING pv_name TYPE char20.

  DATA: lt_file      TYPE filetable,
        lv_rc        TYPE i,
        lv_filename  TYPE string,
        lv_filedname TYPE string.

  FIELD-SYMBOLS: <fs_field> TYPE any.

  " 选择文件
  cl_gui_frontend_services=>file_open_dialog(
    CHANGING
      file_table = lt_file
      rc         = lv_rc ).

  READ TABLE lt_file INTO DATA(ls_file) INDEX 1.
  IF sy-subrc EQ 0.
    gs_file-file_type = pv_name.
    gs_file-source_path = ls_file-filename. " 本地路径
    gs_file-target_path = |/mnt/smbshare/{ sy-sysid }/GTS/%ZAPP_NO%_|. " 服务器路径
    CASE pv_name.
      WHEN 'GV_FILE'.
        lv_filename = TEXT-t02. " XX文件名
      WHEN OTHERS.
    ENDCASE.

    SPLIT gs_file-source_path AT '/' INTO TABLE DATA(lt_split).
    DATA(lv_line) = lines( lt_split ).
    READ TABLE lt_split INTO DATA(ls_split) INDEX lv_line.
    IF sy-subrc = 0.
      REPLACE ALL OCCURRENCES OF REGEX '.+\.' IN ls_split WITH ''.  " 正则删除文件名,取后缀
    ENDIF.

    lv_filename = lv_filename && sy-datum && sy-uzeit.
    gs_file-target_path = gs_file-target_path && lv_filename && '.' && ls_split.

    " 只保留一个单据地址
    READ TABLE gt_file ASSIGNING FIELD-SYMBOL(<fs_file>) WITH KEY file_type = pv_name.
    IF sy-subrc = 0.
      MOVE-CORRESPONDING gs_file TO <fs_file>.
    ELSE.
      APPEND gs_file TO gt_file.
    ENDIF.

    " 更新屏幕为本地路径
    ASSIGN (pv_name) TO <fs_field>.
    IF <fs_field> IS ASSIGNED.
      <fs_field> = gs_file-source_path.
    ENDIF.

  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_SOR_PATH
*&      --> LV_TAR_PATH
*&---------------------------------------------------------------------*
FORM frm_upload_file CHANGING pv_subrc TYPE sy-subrc.

  DATA: lv_len       TYPE i,
        lv_length    TYPE i,
        lt_file_data TYPE solix_tab,
        lv_content   TYPE xstring,
        lv_fieldname TYPE string.

  FIELD-SYMBOLS: <fs_field> TYPE any.

  IF gt_file IS INITIAL.
    RETURN.
  ENDIF.

  LOOP AT gt_file INTO gs_file.

    REPLACE FIRST OCCURRENCE OF '%ZAPP_NO%' IN gs_file-target_path WITH '100001'.
    MODIFY gt_file FROM gs_file.

    "上传文件
    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        filename   = gs_file-source_path
        filetype   = 'BIN'
      IMPORTING
        filelength = lv_len
      TABLES
        data_tab   = lt_file_data[].
    CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
      EXPORTING
        input_length = lv_len
      IMPORTING
        buffer       = lv_content
      TABLES
        binary_tab   = lt_file_data[]
      EXCEPTIONS
        failed       = 1
        OTHERS       = 2.

    " 打开文件以写入数据
    OPEN DATASET gs_file-target_path FOR OUTPUT IN BINARY MODE.
    IF sy-subrc = 0.
      " 将数据写入文件
      LOOP AT lt_file_data INTO DATA(ls_file_data).

        DESCRIBE FIELD ls_file_data-line LENGTH lv_length IN BYTE MODE.
        IF lv_length > lv_len.
          lv_length = lv_len.
        ELSE.
          lv_len = lv_len - lv_length.
        ENDIF.
        TRANSFER ls_file_data-line TO gs_file-target_path LENGTH lv_length.

      ENDLOOP.
      " 关闭文件
      CLOSE DATASET gs_file-target_path.

      ASSIGN (gs_file-file_type) TO <fs_field>.
      IF <fs_field> IS ASSIGNED.
        <fs_field> = gs_file-target_path.
      ENDIF.

      CLOSE DATASET gs_file-target_path.

      "文件已成功写入
*      MESSAGE s062(zpp001) WITH lv_full_path.

    ELSE.
      "无法打开文件 &1
      pv_subrc = 1.
      MESSAGE s063(zpp001) WITH gs_file-target_path DISPLAY LIKE 'E'.
      RETURN.
    ENDIF.
  ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_download_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_NAME
*&---------------------------------------------------------------------*
FORM frm_download_file USING pv_name TYPE char20.

  DATA: lv_error     TYPE c VALUE 'X',
        lv_name      TYPE string,
        lv_path      TYPE string,
        lv_fullpath  TYPE string,
        lv_extension TYPE string,
        lv_filename  TYPE string,
        lt_result    TYPE match_result_tab,
        ls_result    TYPE match_result.

  DATA: lt_solix         TYPE solix_tab,
        ls_solix         TYPE solix,
        lv_file_length   TYPE i,
        lv_content       TYPE xstring,
        lv_max_length    TYPE i VALUE 255,
        lv_actual_length TYPE i.

  FIELD-SYMBOLS: <fs_server_path> TYPE any.

*  lv_name = 'ZGTST001-' && pv_name.
  lv_name = 'GV_FILE'.
  ASSIGN (lv_name) TO <fs_server_path>.
  IF <fs_server_path> IS ASSIGNED AND <fs_server_path> IS NOT INITIAL.

    " 文件名提取
    FIND ALL OCCURRENCES OF REGEX '[^/\\]+[/\\]*$' IN <fs_server_path> RESULTS lt_result.
    IF sy-subrc = 0.
      READ TABLE lt_result INTO ls_result INDEX 1.
      lv_filename  = <fs_server_path>+ls_result-offset(ls_result-length).
      lv_extension = lv_filename.
      REPLACE ALL OCCURRENCES OF REGEX '\.\w*' IN lv_filename  WITH ''.  " 正则删除后缀,取文件名
      REPLACE ALL OCCURRENCES OF REGEX '.+\.'  IN lv_extension WITH ''.  " 正则删除文件名,取后缀

      " 选择文件保存路径
      cl_gui_frontend_services=>file_save_dialog(
        EXPORTING
          default_extension = lv_extension
          default_file_name = lv_filename
        CHANGING
          filename          = lv_filename
          path              = lv_path
          fullpath          = lv_fullpath
        EXCEPTIONS
          OTHERS            = 1 ).
      IF sy-subrc <> 0 OR lv_fullpath IS INITIAL.
        MESSAGE s028(zgts001) DISPLAY LIKE 'E'. " 未选择文件保存路径
        RETURN.
      ENDIF.

      " 下载文件
      OPEN DATASET <fs_server_path> FOR INPUT IN BINARY MODE.
      IF sy-subrc = 0.

        DO.
          CLEAR: ls_solix, lv_actual_length.
          READ DATASET <fs_server_path> INTO ls_solix-line MAXIMUM LENGTH lv_max_length ACTUAL LENGTH lv_actual_length.
          IF lv_actual_length IS INITIAL.
            EXIT.
          ELSE.
            APPEND ls_solix TO lt_solix.
            lv_file_length += lv_actual_length.
          ENDIF.

        ENDDO.

        CLOSE DATASET <fs_server_path>.

        " 转换二进制
        IF lt_solix IS NOT INITIAL.

          " 下载本地
          CALL FUNCTION 'GUI_DOWNLOAD'
            EXPORTING
              filename = lv_fullpath
              filetype = 'BIN'
            TABLES
              data_tab = lt_solix.
          IF sy-subrc = 0.
            CLEAR lv_error.
          ENDIF.

        ENDIF.

      ENDIF.

    ENDIF.

  ENDIF.

  IF lv_error = 'X'.
    MESSAGE s027(zgts001) DISPLAY LIKE 'E'. " 根据屏幕路径下载服务器文件失败
    RETURN.
  ENDIF.

ENDFORM.

上述代码测试可成功上传下载服务器文件

原文地址:https://blog.csdn.net/qq_44826887/article/details/146316396
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589426.html

相关文章:

  • nginx处理跨域问题以及隐藏第三方地址
  • 适配iOS 18:检测并移除三方库中的 bitcode 部分
  • CentOS高性能数据处理优化指南
  • 微服务存在的问题及解决方案
  • 设计模式之外观模式:原理、实现与应用
  • C++ primer plus 使用类上
  • 【Agent】OpenManus-Flow-PlanningFlow设计分析
  • golang-方法
  • 创建表空间和表
  • 优选算法的匠心之艺:二分查找专题(二)
  • C++洛谷基础练习题及解答
  • TCP简单链接的编程实现
  • 关于Redis的集群(上)
  • 高主频GPU+RTX4090:AI生图性能优化超150%
  • Netty基础—7.Netty实现消息推送服务一
  • llama.cpp 和 LLM(大语言模型)
  • 图 最 短 路
  • 【嵌入式学习】计算机组成原理-二进制存储基础
  • 【从零开始】Air780EPM的LuatOS二次开发——OneWire协议调试注意事项!
  • 【Linux】深入理解进程和文件及内存管理